From 092e75bb07553ccccedd82fc5cb04ca17296eb77 Mon Sep 17 00:00:00 2001 From: 987123879113 <63495610+987123879113@users.noreply.github.com> Date: Tue, 2 Apr 2024 21:21:00 +0900 Subject: [PATCH 001/109] machine/icd2061a: Fix out of bounds array access (#12207) * machine/icd2061a: Fix out of bounds array access. Add error messages for unimplemented clock settings --- src/devices/machine/icd2061a.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/devices/machine/icd2061a.cpp b/src/devices/machine/icd2061a.cpp index 62c90f72055d8..1dfe44a1e06f0 100644 --- a/src/devices/machine/icd2061a.cpp +++ b/src/devices/machine/icd2061a.cpp @@ -24,11 +24,15 @@ #define LOG_PINS (1 << 1) #define LOG_STATE (1 << 2) +#define LOG_TODO (1 << 3) -// #define VERBOSE (LOG_GENERAL | LOG_PINS | LOG_STATE) +// #define VERBOSE (LOG_GENERAL | LOG_PINS | LOG_STATE | LOG_TODO) +#define VERBOSE (LOG_TODO) #include "logmacro.h" +#define LOGTODO(...) LOGMASKED(LOG_TODO, __VA_ARGS__) + DEFINE_DEVICE_TYPE(ICD2061A, icd2061a_device, "icd2061a", "IC Designs 2061A Dual Programmable Graphics Clock Generator") @@ -168,6 +172,8 @@ TIMER_CALLBACK_MEMBER( icd2061a_device::update_clock_callback ) const int m = BIT(m_regs[MREG], 7, 3); // post-vco divisor const int q = BIT(m_regs[MREG], 0, 7) + 2; // q counter value m_reg_clocks[MREG] = (clock() * m_prescale[a] * (p / double(q))) / (1 << m); + } else { + LOGTODO("unimplemented mclkout selected %d\n", m_mclkout_select); } if (m_reg_clocks[MREG] != m_mclkout_clock) { @@ -189,18 +195,23 @@ TIMER_CALLBACK_MEMBER( icd2061a_device::update_clock_callback ) else if (m_outdis == 1 && m_pwrdwn == 1 && m_sel1 == 1 && (m_intclk == 1 || m_sel0 == 1)) m_vclkout_select = VCLKOUT_REG2; + uint32_t vclkout_clock = m_vclkout_clock; if (m_vclkout_select == VCLKOUT_FEATCLK) { - m_reg_clocks[m_vclkout_select] = m_featclock; + vclkout_clock = m_featclock; } else if (m_vclkout_select >= VCLKOUT_REG0 && m_vclkout_select <= VCLKOUT_REG2) { const int a = BIT(m_regs[m_vclkout_select], 21, 2); // register addr const int p = BIT(m_regs[m_vclkout_select], 10, 7) + 3; // p counter value const int m = BIT(m_regs[m_vclkout_select], 7, 3); // post-vco divisor const int q = BIT(m_regs[m_vclkout_select], 0, 7) + 2; // q counter value - m_reg_clocks[m_vclkout_select] = (clock() * m_prescale[a] * (p / double(q))) / (1 << m); + vclkout_clock = m_reg_clocks[m_vclkout_select] = (clock() * m_prescale[a] * (p / double(q))) / (1 << m); + } else { + LOGTODO("unimplemented vclkout selected %d\n", m_vclkout_select); } - m_vclkout_changed_cb(m_reg_clocks[m_vclkout_select]); - m_vclkout_clock = m_reg_clocks[m_vclkout_select]; + if (vclkout_clock != m_vclkout_clock) { + m_vclkout_clock = vclkout_clock; + m_vclkout_changed_cb(vclkout_clock); + } } void icd2061a_device::update_clock() From bdab8601bcba2c1b979c0d31099ce4b0dad29f41 Mon Sep 17 00:00:00 2001 From: simzy39 <45438677+simzy39@users.noreply.github.com> Date: Tue, 2 Apr 2024 11:53:36 -0500 Subject: [PATCH 002/109] namco/namcos12.cpp: Edit notes on wanted games (#12208) Removed Um Jammer Lammy from the list of wanted games --- src/mame/namco/namcos12.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/mame/namco/namcos12.cpp b/src/mame/namco/namcos12.cpp index 290ea9ce7c11e..644042a503ffe 100644 --- a/src/mame/namco/namcos12.cpp +++ b/src/mame/namco/namcos12.cpp @@ -97,10 +97,6 @@ It was shown only at an amusement show. Possibly a prototype still exists. Possi Tekno Werk (C) Namco, 1999 Some kind of music game similar to Konami's Keyboard Mania series -Um Jammer Lammy (C) Namco, 1999 -http://www.wailee.com/sys/lpic/UM_Jammer_Lammy.jpg -https://www.youtube.com/watch?v=Jrwj4lUzKgU - The Namco System 12 system comprises 3 mandatory PCB's.... MOTHER PCB - This is the main PCB. It holds all sound circuitry, sound ROMs, program ROMs, shared RAM, bank-switching logic, controller/input logic (including sound CPU) and some video output circuitry. From e534420ffe5e10c18db58de13963260e4a9e000b Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Wed, 3 Apr 2024 18:05:58 +0200 Subject: [PATCH 003/109] New working clones ------------------ Galaxy Games StarPak 4 [Bill D., Brian Troha, The Dumping Union] --- src/mame/ces/galgames.cpp | 169 ++++++++++++++++++++++++-------------- src/mame/mame.lst | 1 + 2 files changed, 110 insertions(+), 60 deletions(-) diff --git a/src/mame/ces/galgames.cpp b/src/mame/ces/galgames.cpp index 62be16621e376..3e1dc6e64aaf4 100644 --- a/src/mame/ces/galgames.cpp +++ b/src/mame/ces/galgames.cpp @@ -28,7 +28,7 @@ To Do: Star Pak 3: Centipede, Great Wall, Ker-Chunk, Diamond Derby, Word Sleuth, Pull!, Astro Blast & Sweeper Star Pak 4: Berzerk, Neon Nightmare, Battle Checkers, Orbit, Deep Sea Shadow, Star Tiger & Orbit Freefall -- Allegedly there is a hard lock that SP1 and the PAC-MAN games (on SP2) cannot play together. Was a licensing issue with Namco. +- There is a hard lock that SP1 and the PAC-MAN games (on SP2) cannot play together. Was a licensing issue with Namco. The system checks for cartridges on power up by querying the PIC parts. If the system sees SP1 & SP2 it disables SP2. - Early flyers show "Star Pak 1" titled as Cardmania! @@ -1101,28 +1101,28 @@ Copyright notice in rom states: Creative Electronics & Software Written by Keith ***************************************************************************/ -#define ROM_LOAD16_BYTE_BIOS(bios,name,offset,length,hash) \ - ROMX_LOAD(name, offset, length, hash, ROM_SKIP(1) | ROM_BIOS(bios)) +#define ROM_LOAD16_BYTE_BIOS( bios, name, offset, length, hash ) \ + ROMX_LOAD( name, offset, length, hash, ROM_SKIP(1) | ROM_BIOS(bios) ) #define GALGAMES_BIOS_ROMS \ - ROM_SYSTEM_BIOS(0, "1.90", "v1.90 12/01/98") \ - ROM_LOAD16_BYTE_BIOS(0, "galaxy_u2__v1.90_12-01-98.u2", 0x000000, 0x100000, CRC(e51ff184) SHA1(aaa795f2c15ec29b3ceeb5c917b643db0dbb7083)) \ - ROM_LOAD16_BYTE_BIOS(0, "galaxy_u1__v1.90_12-01-98.u1", 0x000001, 0x100000, CRC(c6d7bc6d) SHA1(93c032f9aa38cbbdda59a8a25ff9f38f7ad9c760)) \ + ROM_SYSTEM_BIOS( 0, "1.90", "v1.90 12/01/98" ) \ + ROM_LOAD16_BYTE_BIOS( 0, "galaxy_u2__v1.90_12-01-98.u2", 0x000000, 0x100000, CRC(e51ff184) SHA1(aaa795f2c15ec29b3ceeb5c917b643db0dbb7083) ) \ + ROM_LOAD16_BYTE_BIOS( 0, "galaxy_u1__v1.90_12-01-98.u1", 0x000001, 0x100000, CRC(c6d7bc6d) SHA1(93c032f9aa38cbbdda59a8a25ff9f38f7ad9c760) ) \ \ - ROM_SYSTEM_BIOS(1, "1.80", "v1.80 10/05/98") \ - ROM_LOAD16_BYTE_BIOS(1, "galaxy_u2__v1.80_10-15-98.u2", 0x000000, 0x100000, CRC(73cff284) SHA1(e6f7d92999cdb478c21c3b65a04eade84299ac12)) \ - ROM_LOAD16_BYTE_BIOS(1, "galaxy_u1__v1.80_10-15-98.u1", 0x000001, 0x100000, CRC(e3ae423c) SHA1(66d1964845a99a5ed4b19b4135b55cde6b5fe295)) + ROM_SYSTEM_BIOS( 1, "1.80", "v1.80 10/05/98" ) \ + ROM_LOAD16_BYTE_BIOS( 1, "galaxy_u2__v1.80_10-15-98.u2", 0x000000, 0x100000, CRC(73cff284) SHA1(e6f7d92999cdb478c21c3b65a04eade84299ac12) ) \ + ROM_LOAD16_BYTE_BIOS( 1, "galaxy_u1__v1.80_10-15-98.u1", 0x000001, 0x100000, CRC(e3ae423c) SHA1(66d1964845a99a5ed4b19b4135b55cde6b5fe295) ) #define GALGAMES_MB_PALS \ - ROM_REGION(0xa00, "pals", 0) \ - ROM_LOAD("16v8h-blue.u24", 0x000, 0x117, NO_DUMP) \ - ROM_LOAD("16v8h-yellow.u25", 0x200, 0x117, NO_DUMP) \ - ROM_LOAD("16v8h-magenta.u26", 0x400, 0x117, NO_DUMP) \ - ROM_LOAD("16v8h-green.u27", 0x600, 0x117, NO_DUMP) \ - ROM_LOAD("16v8h-red.u45", 0x800, 0x117, NO_DUMP) - -ROM_START(galgbios) - ROM_REGION16_BE(0x200000, "cart0", 0) + ROM_REGION( 0xa00, "pals", 0 ) \ + ROM_LOAD( "16v8h-blue.u24", 0x000, 0x117, NO_DUMP) \ + ROM_LOAD( "16v8h-yellow.u25", 0x200, 0x117, NO_DUMP) \ + ROM_LOAD( "16v8h-magenta.u26", 0x400, 0x117, NO_DUMP) \ + ROM_LOAD( "16v8h-green.u27", 0x600, 0x117, NO_DUMP) \ + ROM_LOAD( "16v8h-red.u45", 0x800, 0x117, NO_DUMP) + +ROM_START( galgbios ) + ROM_REGION16_BE( 0x200000, "cart0", 0 ) GALGAMES_BIOS_ROMS ROM_REGION(0x200000, "cart1", ROMREGION_ERASEFF) @@ -1137,7 +1137,9 @@ ROM_END Galaxy Games StarPak 2 -NAMCO 307 Cartridge, has surface mount Flash chips in it: +Cartridge with 7 games, including Namco licensed Pac-Man & Ms. Pac-Man. + +AKA NAMCO 307 Cartridge .U1 AM29F800BB .U2 AM29F800BB @@ -1150,20 +1152,20 @@ Board silkscreened 237-0209-00 ***************************************************************************/ -ROM_START(galgame2) - ROM_REGION16_BE(0x200000, "cart0", 0) +ROM_START( galgame2 ) + ROM_REGION16_BE( 0x200000, "cart0", 0 ) GALGAMES_BIOS_ROMS - ROM_REGION(0x200000, "cart1", 0) - ROM_LOAD16_BYTE("am29f800bb.u2", 0x000000, 0x100000, CRC(f43c0c54) SHA1(4a13946c3d173b0e4ab25b01849574fa3302b417)) - ROM_LOAD16_BYTE("am29f800bb.u1", 0x000001, 0x100000, CRC(b8c34a8b) SHA1(40d3b35f573d2bd2ae1c7d876c55fc436864fa3f)) + ROM_REGION( 0x200000, "cart1", 0 ) + ROM_LOAD16_BYTE( "am29f800bb.u2", 0x000000, 0x100000, CRC(f43c0c54) SHA1(4a13946c3d173b0e4ab25b01849574fa3302b417) ) // MAY 29, 1998 + ROM_LOAD16_BYTE( "am29f800bb.u1", 0x000001, 0x100000, CRC(b8c34a8b) SHA1(40d3b35f573d2bd2ae1c7d876c55fc436864fa3f) ) // "" - ROM_REGION(0x2000, "cart1:pic", 0) - ROM_LOAD("pic12c508.u4", 0x0000, 0x2000, CRC(bb253913) SHA1(eace069344da6dda7c05673e422876d130ed5d48)) // includes config word at fff, hence size is 2*1000 + ROM_REGION( 0x2000, "cart1:pic", 0 ) + ROM_LOAD( "pic12c508.u4", 0x0000, 0x2000, CRC(bb253913) SHA1(eace069344da6dda7c05673e422876d130ed5d48) ) // includes config word at fff, hence size is 2*1000 - ROM_REGION(0x200000, "cart2", ROMREGION_ERASEFF) - ROM_REGION(0x200000, "cart3", ROMREGION_ERASEFF) - ROM_REGION(0x200000, "cart4", ROMREGION_ERASEFF) + ROM_REGION( 0x200000, "cart2", ROMREGION_ERASEFF ) + ROM_REGION( 0x200000, "cart3", ROMREGION_ERASEFF ) + ROM_REGION( 0x200000, "cart4", ROMREGION_ERASEFF ) GALGAMES_MB_PALS ROM_END @@ -1185,20 +1187,20 @@ Board silkscreened 237-0228-00 ***************************************************************************/ -ROM_START(galgame3) - ROM_REGION16_BE(0x200000, "cart0", 0) +ROM_START( galgame3 ) + ROM_REGION16_BE( 0x200000, "cart0", 0 ) GALGAMES_BIOS_ROMS - ROM_REGION(0x800000, "cart1", 0) - ROM_LOAD16_BYTE("am29f032b.u2", 0x000000, 0x400000, CRC(a4ffc70a) SHA1(328c6ceef025af7ff5b7998df59a10d90c654d53)) - ROM_LOAD16_BYTE("am29f032b.u1", 0x000001, 0x400000, CRC(b0876751) SHA1(487f052989e4b2df2df2293b283e8e03ffc3ddf4)) + ROM_REGION( 0x800000, "cart1", 0 ) + ROM_LOAD16_BYTE( "am29f032b.u2", 0x000000, 0x400000, CRC(a4ffc70a) SHA1(328c6ceef025af7ff5b7998df59a10d90c654d53) ) + ROM_LOAD16_BYTE( "am29f032b.u1", 0x000001, 0x400000, CRC(b0876751) SHA1(487f052989e4b2df2df2293b283e8e03ffc3ddf4) ) - ROM_REGION(0x800, "cart1:pic", 0) - ROM_LOAD("pic16c56.u6", 0x000, 0x800, CRC(cf901ed8) SHA1(ebb2da0f50ba82a038f315aab7e6b20b9a1af3a1)) + ROM_REGION( 0x800, "cart1:pic", 0 ) + ROM_LOAD( "pic16c56.u6", 0x000, 0x800, CRC(cf901ed8) SHA1(ebb2da0f50ba82a038f315aab7e6b20b9a1af3a1) ) - ROM_REGION(0x200000, "cart2", ROMREGION_ERASEFF) - ROM_REGION(0x200000, "cart3", ROMREGION_ERASEFF) - ROM_REGION(0x200000, "cart4", ROMREGION_ERASEFF) + ROM_REGION( 0x200000, "cart2", ROMREGION_ERASEFF ) + ROM_REGION( 0x200000, "cart3", ROMREGION_ERASEFF ) + ROM_REGION( 0x200000, "cart4", ROMREGION_ERASEFF ) GALGAMES_MB_PALS ROM_END @@ -1206,30 +1208,76 @@ ROM_END /*************************************************************************** Galaxy Games StarPak 4 -(Cartridge not dumped, but files from a dev board provided by the developer) + +Cartridge with 7 games, including Berzerk. + +.U1 AM29F032B +.U2 AM29F032B +.U5 93AA76/SN +.U6 PIC 16C56-XT/P +.L1 Led + +Board silkscreened 237-0228-00 + REV.-B + +NOTE: Unlike previous cartridges, there is no licensing information shown for + Berzerk as was done for Pac-Man / Ms. Pac-Man in StarPak 2 and Centipede + in StarPak 3 ***************************************************************************/ -ROM_START(galgame4) - ROM_REGION16_BE(0x200000, "cart0", 0) +ROM_START( galgame4 ) + ROM_REGION16_BE( 0x200000, "cart0", 0 ) GALGAMES_BIOS_ROMS - ROM_REGION(0x800000, "cart1", 0) - ROM_LOAD16_BYTE("sp4.u2", 0x000000, 0x100000, CRC(e51bc5e1) SHA1(dacf6cefd792713b34382b827952b66e2cb5c2b4)) // JANUARY 12, 1998 - ROM_LOAD16_BYTE("sp4.u1", 0x000001, 0x100000, CRC(695ab775) SHA1(e88d5f982df19e70be6124e6fdf20830475641e0)) // "" - ROM_LOAD16_BYTE("sp4.u6", 0x200000, 0x100000, CRC(7716895d) SHA1(8f86ffe2d94d3e756a3b7661d480e3a8c53cf178)) - ROM_LOAD16_BYTE("sp4.u5", 0x200001, 0x100000, CRC(6c699ba3) SHA1(f675997e1b808758f79a21b883161526242990b4)) - ROM_LOAD16_BYTE("sp4.u8", 0x400000, 0x100000, CRC(cdf45446) SHA1(da4e1667c7c47239e770018a7d3b8c1e4e2f4a63)) - ROM_LOAD16_BYTE("sp4.u7", 0x400001, 0x100000, CRC(813c46c8) SHA1(3fd4192ec7e8d5e6bfbc2a37d9b4bbebe6132b99)) - ROM_LOAD16_BYTE("sp4.u10", 0x600000, 0x100000, CRC(52dbf088) SHA1(da7c37366e884f40f1dea243d4aea0b2d2b314db)) - ROM_LOAD16_BYTE("sp4.u9", 0x600001, 0x100000, CRC(9ded1dc2) SHA1(5319edfccf47d02dfd3664cb3782cc2281c769c4)) + ROM_REGION( 0x800000, "cart1", 0 ) + ROM_LOAD16_BYTE( "am29f032b.u2", 0x000000, 0x400000, CRC(60f14d02) SHA1(581511898338246476ac8359a7427ffed26e233e) ) // JANUARY 12, 1998 + ROM_LOAD16_BYTE( "am29f032b.u1", 0x000001, 0x400000, CRC(9dc6c588) SHA1(a242de749a563cb26fce6901f202d5fc4ae1beb0) ) // "" - ROM_REGION(0x2000, "cart1:pic", 0) - ROM_LOAD("sp4.pic", 0x000, 0x2000, CRC(008ef1ba) SHA1(4065fcf00922de3e629084f4f4815355f271c954)) + ROM_REGION( 0x2000, "cart1:pic", 0 ) + ROM_LOAD( "pic16c56.u6", 0x000, 0x2000, CRC(ea994ab7) SHA1(4d59355f11e86f43e6a553140fb89aebbd8981a6) ) // unprotected - ROM_REGION(0x200000, "cart2", ROMREGION_ERASEFF) - ROM_REGION(0x200000, "cart3", ROMREGION_ERASEFF) - ROM_REGION(0x200000, "cart4", ROMREGION_ERASEFF) + ROM_REGION( 0x200000, "cart2", ROMREGION_ERASEFF ) + ROM_REGION( 0x200000, "cart3", ROMREGION_ERASEFF ) + ROM_REGION( 0x200000, "cart4", ROMREGION_ERASEFF ) + + GALGAMES_MB_PALS +ROM_END + +/*************************************************************************** + +Galaxy Games StarPak 4 (prototype) + +Files from a dev board provided by the developer. + +NOTE: The graphics tiles are misaligned for the games Star Tiger and Battle + Checkers for this prototype set. This isn't an issue with the release + version above. + +NOTE: PIC images are NOT interchangable between release and prototype sets. + +***************************************************************************/ + +ROM_START( galgame4p ) + ROM_REGION16_BE( 0x200000, "cart0", 0 ) + GALGAMES_BIOS_ROMS + + ROM_REGION( 0x800000, "cart1", 0 ) + ROM_LOAD16_BYTE( "sp4.u2", 0x000000, 0x100000, CRC(e51bc5e1) SHA1(dacf6cefd792713b34382b827952b66e2cb5c2b4) ) // JANUARY 12, 1998 + ROM_LOAD16_BYTE( "sp4.u1", 0x000001, 0x100000, CRC(695ab775) SHA1(e88d5f982df19e70be6124e6fdf20830475641e0) ) // "" + ROM_LOAD16_BYTE( "sp4.u6", 0x200000, 0x100000, CRC(7716895d) SHA1(8f86ffe2d94d3e756a3b7661d480e3a8c53cf178) ) + ROM_LOAD16_BYTE( "sp4.u5", 0x200001, 0x100000, CRC(6c699ba3) SHA1(f675997e1b808758f79a21b883161526242990b4) ) + ROM_LOAD16_BYTE( "sp4.u8", 0x400000, 0x100000, CRC(cdf45446) SHA1(da4e1667c7c47239e770018a7d3b8c1e4e2f4a63) ) + ROM_LOAD16_BYTE( "sp4.u7", 0x400001, 0x100000, CRC(813c46c8) SHA1(3fd4192ec7e8d5e6bfbc2a37d9b4bbebe6132b99) ) + ROM_LOAD16_BYTE( "sp4.u10", 0x600000, 0x100000, CRC(52dbf088) SHA1(da7c37366e884f40f1dea243d4aea0b2d2b314db) ) + ROM_LOAD16_BYTE( "sp4.u9", 0x600001, 0x100000, CRC(9ded1dc2) SHA1(5319edfccf47d02dfd3664cb3782cc2281c769c4) ) + + ROM_REGION( 0x2000, "cart1:pic", 0 ) + ROM_LOAD( "sp4.pic", 0x000, 0x2000, CRC(008ef1ba) SHA1(4065fcf00922de3e629084f4f4815355f271c954) ) + + ROM_REGION( 0x200000, "cart2", ROMREGION_ERASEFF ) + ROM_REGION( 0x200000, "cart3", ROMREGION_ERASEFF ) + ROM_REGION( 0x200000, "cart4", ROMREGION_ERASEFF ) GALGAMES_MB_PALS ROM_END @@ -1237,7 +1285,8 @@ ROM_END } // anonymous namespace -GAME(1998, galgbios, 0, galgbios, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software", "Galaxy Games BIOS", MACHINE_IS_BIOS_ROOT) -GAME(1998, galgame2, galgbios, galgame2, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software / Namco", "Galaxy Games StarPak 2", 0) -GAME(1998, galgame3, galgbios, galgame3, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software / Atari", "Galaxy Games StarPak 3", 0) -GAME(1998, galgame4, galgbios, galgame3, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software", "Galaxy Games StarPak 4 (prototype)", MACHINE_IMPERFECT_GRAPHICS) +GAME(1998, galgbios, 0, galgbios, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software", "Galaxy Games BIOS", MACHINE_IS_BIOS_ROOT) +GAME(1998, galgame2, galgbios, galgame2, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software / Namco", "Galaxy Games StarPak 2", 0) +GAME(1998, galgame3, galgbios, galgame3, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software / Atari", "Galaxy Games StarPak 3", 0) +GAME(1998, galgame4, galgbios, galgame3, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software", "Galaxy Games StarPak 4", 0) +GAME(1998, galgame4p, galgame4, galgame3, galgames, galgames_state, empty_init, ROT0, "Creative Electronics & Software", "Galaxy Games StarPak 4 (prototype)", MACHINE_IMPERFECT_GRAPHICS) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 7a9ffd21892d8..37099310a91f7 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -16103,6 +16103,7 @@ tsclass // galgame2 // (c) 1998 Creative Electronics & Software (CES) / Namco galgame3 // (c) 1998 Creative Electronics & Software (CES) / Atari galgame4 // (c) 1998 Creative Electronics & Software (CES) +galgame4p // (c) 1998 Creative Electronics & Software (CES) galgbios // (c) 1998 Creative Electronics & Software (CES) @source:chess/ave_arb.cpp From 745b8c71b128c541c09b7666d35f55e6e8f74f15 Mon Sep 17 00:00:00 2001 From: holub Date: Wed, 3 Apr 2024 14:25:03 -0400 Subject: [PATCH 004/109] machine/spi_sdcard.cpp: Report status for requests of CMD58 (READ_OCR) (#12212) --- src/devices/machine/spi_sdcard.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/devices/machine/spi_sdcard.cpp b/src/devices/machine/spi_sdcard.cpp index 23296a94b339d..4fc97be27736c 100644 --- a/src/devices/machine/spi_sdcard.cpp +++ b/src/devices/machine/spi_sdcard.cpp @@ -430,14 +430,8 @@ void spi_sdcard_device::do_command() case 58: // CMD58 - READ_OCR m_data[0] = 0; - if (m_type == SD_TYPE_HC) - { - m_data[1] = 0x40; // indicate SDHC support - } - else - { - m_data[1] = 0; - } + m_data[1] = 0x80; // Busy Status: 1b - Initialization Complete + m_data[1] |= (m_type == SD_TYPE_V2) ? 0 : 0x40; // Card Capacity Status: 0b - SDCS, 1b SDHC, SDXC m_data[2] = 0; m_data[3] = 0; m_data[4] = 0; From 7aa360be85335d92ee9b00861eb0241452e7e3bc Mon Sep 17 00:00:00 2001 From: Sergio G Date: Wed, 3 Apr 2024 20:25:25 +0200 Subject: [PATCH 005/109] seta/srmp2.cpp: Added PCB ref. numbers for all games (#12211) --- src/mame/seta/srmp2.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/mame/seta/srmp2.cpp b/src/mame/seta/srmp2.cpp index d2e7e6868c6ef..226bdc89419be 100644 --- a/src/mame/seta/srmp2.cpp +++ b/src/mame/seta/srmp2.cpp @@ -16,13 +16,14 @@ driver by Yochizo and Takahiro Nogi Supported games : ================== - Super Real Mahjong Part1 (C) 1987 Seta - Super Real Mahjong Part2 (C) 1987 Seta - Super Real Mahjong Part3 (C) 1988 Seta - Mahjong Yuugi (set 1) (C) 1990 Visco - Mahjong Yuugi (set 2) (C) 1990 Visco - Mahjong Pon Chin Kan (set 1) (C) 1991 Visco - Mahjong Pon Chin Kan (set 2) (C) 1991 Visco + Super Real Mahjong Part1 (C) 1987 Seta P0-023 + Super Real Mahjong Part2 (C) 1987 Seta P0-023 + Super Real Mahjong Part3 (C) 1988 Seta P0-037A + Real Mahjong Gold Yumehai (C) 1988 Seta P0-064A + Mahjong Yuugi (set 1) (C) 1990 Visco P0-049A + Mahjong Yuugi (set 2) (C) 1990 Visco P0-049A + Mahjong Pon Chin Kan (set 1) (C) 1991 Visco P0-049A + Mahjong Pon Chin Kan (set 2) (C) 1991 Visco P0-049A System specs : @@ -1491,7 +1492,7 @@ ROM_START( srmp1 ) ROM_LOAD( "ub2.13", 0x400, 0x200, CRC(7e7d25f7) SHA1(e5bf5071567f95c3bb70347f0b86a9703f9f2e6c) ) ROM_END -ROM_START( srmp2 ) +ROM_START( srmp2 ) // PCB: P0-023 ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "uco-2.17", 0x000000, 0x020000, CRC(0d6c131f) SHA1(be85f2578b0ae2a072565605b7dbeb970e5e3851) ) ROM_LOAD16_BYTE( "uco-3.18", 0x000001, 0x020000, CRC(e9fdf5f8) SHA1(aa1f8cc3f1d0ed942403c0473605775bc1537cbf) ) @@ -1520,7 +1521,7 @@ ROM_START( srmp2 ) ROM_LOAD( "uc-2o.13", 0x000400, 0x000400, CRC(50a33b96) SHA1(cfb6d3cb6b73d1bf484014fb340c28bc1774137d) ) ROM_END -ROM_START( srmp3 ) +ROM_START( srmp3 ) // PCB: P0-037A ROM_REGION( 0x020000, "maincpu", 0 ) /* Z80 Code */ ROM_LOAD( "za0-10.bin", 0x000000, 0x020000, CRC(939d126f) SHA1(7a5c7f7fbee8de11a08194d3c8f10a20f8dc2f0a) ) @@ -1630,7 +1631,7 @@ ROM_START( rmgoldyh ) ROM_LOAD( "zf0-13.u59", 0x000200, 0x000200, CRC(4ea3d2fe) SHA1(c7d18b9c1331e08faadf33e52033c658bf2b16fc) ) ROM_END -ROM_START( mjyuugi ) +ROM_START( mjyuugi ) // PCB: P0-049A ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "um001.001", 0x000000, 0x020000, CRC(28d5340f) SHA1(683d89987b8b794695fdb6104d8e6ff5204afafb) ) ROM_LOAD16_BYTE( "um001.003", 0x000001, 0x020000, CRC(275197de) SHA1(2f8efa112f23f172eaef9bb732b2a253307dd896) ) @@ -1658,7 +1659,7 @@ ROM_START( mjyuugi ) ROM_LOAD( "maj-001.02", 0x080000, 0x080000, CRC(eb28e641) SHA1(67e1d89c9b40e4a83a3783d4343d7a8121668091) ) ROM_END -ROM_START( mjyuugia ) +ROM_START( mjyuugia ) // PCB: P0-049A ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "um_001.001", 0x000000, 0x020000, CRC(76dc0594) SHA1(4bd81616769cdc59eaf6f7921e404e166500f67f) ) ROM_LOAD16_BYTE( "um001.003", 0x000001, 0x020000, CRC(275197de) SHA1(2f8efa112f23f172eaef9bb732b2a253307dd896) ) @@ -1686,7 +1687,7 @@ ROM_START( mjyuugia ) ROM_LOAD( "maj-001.02", 0x080000, 0x080000, CRC(eb28e641) SHA1(67e1d89c9b40e4a83a3783d4343d7a8121668091) ) ROM_END -ROM_START( ponchin ) +ROM_START( ponchin ) // PCB: P0-049A ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "um2_1_1.u22", 0x000000, 0x020000, CRC(cf88efbb) SHA1(7bd2304d365524fc5bcf3fb30752f5efec73a9f5) ) ROM_LOAD16_BYTE( "um2_1_3.u42", 0x000001, 0x020000, CRC(e053458f) SHA1(db4a34589a08d0252d700144a6260a0f6c4e8e30) ) @@ -1711,7 +1712,7 @@ ROM_START( ponchin ) ROM_LOAD( "um2_1_10.u63", 0x080000, 0x080000, CRC(53e643e9) SHA1(3b221217e8f846ae96a9a47149037cea19d97549) ) ROM_END -ROM_START( ponchina ) +ROM_START( ponchina ) // PCB: P0-049A ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "u22.bin", 0x000000, 0x020000, CRC(9181de20) SHA1(03fdb289d862ff2d87249d35991bd60784e172d9) ) ROM_LOAD16_BYTE( "um2_1_3.u42", 0x000001, 0x020000, CRC(e053458f) SHA1(db4a34589a08d0252d700144a6260a0f6c4e8e30) ) From 4cf391508c9a3da009f9556240066ed3a00508f3 Mon Sep 17 00:00:00 2001 From: barbudreadmon Date: Wed, 3 Apr 2024 20:31:23 +0200 Subject: [PATCH 006/109] igs/pgm.cpp: Fixed readings for Chinese titles of Oriental Legend games. (#12206) --- src/mame/igs/pgm.cpp | 50 ++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/mame/igs/pgm.cpp b/src/mame/igs/pgm.cpp index 57cb4d873cb41..407347cd4af56 100644 --- a/src/mame/igs/pgm.cpp +++ b/src/mame/igs/pgm.cpp @@ -5423,18 +5423,18 @@ GAME( 1997, pgm, 0, pgm, pgm, pgm_state Working (at least one set of the game is fully working) -----------------------------------------------------------------------------------------------------------------------*/ -//西游释厄传/Xīyóu shì è chuán (China; Simplified Chinese) -//西遊釋厄傳/Xīyóu shì è chuán (Taiwan; Traditional Chinese) +//西游释厄传/Xīyóu shì è zhuàn (China; Simplified Chinese) +//西遊釋厄傳/Xīyóu shì è zhuàn (Taiwan; Traditional Chinese) // the version numbering on these is a mess... date strings from ROM (and in some cases even those are missing..) -GAME( 1997, orlegend, pgm, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Chuan (ver. 126)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 01/14/98 18:16:38 - runs as World -GAME( 1997, orlegende, orlegend, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Chuan (ver. 112)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 07/14/97 11:19:45 - runs as World -GAME( 1997, orlegendc, orlegend, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Chuan (ver. 112, Chinese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 05/05/97 10:08:21 - runs as World, Korea, China -GAME( 1997, orlegendca, orlegend, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Chuan (ver. ???, Chinese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 04/02/97 13:35:43 - runs as HongKong, China, China -GAME( 1997, orlegend111c, orlegend, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Chuan (ver. 111, Chinese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 no date! - runs as HongKong, China, China -GAME( 1997, orlegend111t, orlegend, pgm_asic3, orlegendt, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Chuan (ver. 111, Taiwanese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )// V0001 no date! - needs a different protection sequence -GAME( 1997, orlegend111k, orlegend, pgm_asic3, orlegendk, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Chuan (ver. 111, Korean Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // not checked -GAME( 1997, orlegend105t, orlegend, pgm_asic3, orlegendt, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Chuan (ver. 105, Taiwanese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )// V0000 no date! - needs a different protection sequence -GAME( 1997, orlegend105k, orlegend, pgm_asic3, orlegendk, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Chuan (ver. 105, Korean Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0000 no date! - runs as Korea +GAME( 1997, orlegend, pgm, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Zhuan (ver. 126)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 01/14/98 18:16:38 - runs as World +GAME( 1997, orlegende, orlegend, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Zhuan (ver. 112)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 07/14/97 11:19:45 - runs as World +GAME( 1997, orlegendc, orlegend, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Zhuan (ver. 112, Chinese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 05/05/97 10:08:21 - runs as World, Korea, China +GAME( 1997, orlegendca, orlegend, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Zhuan (ver. ???, Chinese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 04/02/97 13:35:43 - runs as HongKong, China, China +GAME( 1997, orlegend111c, orlegend, pgm_asic3, orlegend, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Zhuan (ver. 111, Chinese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0001 no date! - runs as HongKong, China, China +GAME( 1997, orlegend111t, orlegend, pgm_asic3, orlegendt, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Zhuan (ver. 111, Taiwanese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )// V0001 no date! - needs a different protection sequence +GAME( 1997, orlegend111k, orlegend, pgm_asic3, orlegendk, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Zhuan (ver. 111, Korean Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // not checked +GAME( 1997, orlegend105t, orlegend, pgm_asic3, orlegendt, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Zhuan (ver. 105, Taiwanese Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )// V0000 no date! - needs a different protection sequence +GAME( 1997, orlegend105k, orlegend, pgm_asic3, orlegendk, pgm_asic3_state, init_orlegend, ROT0, "IGS", "Oriental Legend / Xiyou Shi E Zhuan (ver. 105, Korean Board)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // V0000 no date! - runs as Korea //Dragon World II //中國龍II/Zhōngguó lóng II (China, Taiwan, Japan; Traditional Chinese only in title screen) @@ -5648,13 +5648,13 @@ GAME( 2000, py2k2100, py2k2, pgm_arm_type1_sim, py2k2, pgm_arm_ Partially Working, playable, but some imperfections -----------------------------------------------------------------------------------------------------------------------*/ -//西游释厄传Super/Xīyóu shì è chuán Super (China; Simplified Chinese) -//西遊釋厄傳Super/Xīyóu shì è chuán Super (Taiwan; Traditional Chinese) -GAME( 1998, olds, pgm, pgm_028_025_ol, olds, pgm_028_025_state, init_olds, ROT0, "IGS", "Oriental Legend Super / Xiyou Shi E Chuan Super (ver. 101, Korean Board)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device */ -GAME( 1998, olds100, olds, pgm_028_025_ol, olds, pgm_028_025_state, init_olds, ROT0, "IGS", "Oriental Legend Special / Xiyou Shi E Chuan Super (ver. 100, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device */ -GAME( 1998, olds100a, olds, pgm_028_025_ol, olds, pgm_028_025_state, init_olds, ROT0, "IGS", "Oriental Legend Special / Xiyou Shi E Chuan Super (ver. 100, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device; OPCODE 1111 error at startup */ +//西游释厄传Super/Xīyóu shì è zhuàn Super (China; Simplified Chinese) +//西遊釋厄傳Super/Xīyóu shì è zhuàn Super (Taiwan; Traditional Chinese) +GAME( 1998, olds, pgm, pgm_028_025_ol, olds, pgm_028_025_state, init_olds, ROT0, "IGS", "Oriental Legend Super / Xiyou Shi E Zhuan Super (ver. 101, Korean Board)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device */ +GAME( 1998, olds100, olds, pgm_028_025_ol, olds, pgm_028_025_state, init_olds, ROT0, "IGS", "Oriental Legend Special / Xiyou Shi E Zhuan Super (ver. 100, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device */ +GAME( 1998, olds100a, olds, pgm_028_025_ol, olds, pgm_028_025_state, init_olds, ROT0, "IGS", "Oriental Legend Special / Xiyou Shi E Zhuan Super (ver. 100, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* region provided by protection device; OPCODE 1111 error at startup */ // This version was specially made for a Chinese online gaming company. While it may not be entirely suitable for MAME, it can give some insight into how protection should work. -GAME( 1998, olds103t, olds, pgm, pgm, pgm_state, init_pgm, ROT0, "bootleg", "Xiyou Shi E Chuan Super (ver. 103, China, Tencent) (unprotected)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // without overseas region +GAME( 1998, olds103t, olds, pgm, pgm, pgm_state, init_pgm, ROT0, "bootleg", "Xiyou Shi E Zhuan Super (ver. 103, China, Tencent) (unprotected)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // without overseas region //三国战纪/Sānguó zhàn jì (China, Hong Kong; Simplified Chinese) //三國戰紀/Sānguó zhàn jì (Taiwan, Japan; Traditional Chinese) @@ -5669,11 +5669,11 @@ GAME( 1999, kov111, kov, pgm_arm_type1_sim, sango, pgm_arm_ GAME( 1999, kovplus, pgm, pgm_arm_type1_sim, sango, pgm_arm_type1_state, init_kov, ROT0, "IGS", "Knights of Valour Plus / Sanguo Zhan Ji Zhengzong Plus / Sangoku Senki Masamune Plus (ver. 119, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ GAME( 1999, kovplusa, kovplus, pgm_arm_type1_sim, sango, pgm_arm_type1_state, init_kov, ROT0, "IGS", "Knights of Valour Plus / Sanguo Zhan Ji Zhengzong Plus / Sangoku Senki Masamune Plus (ver. 119, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -//三國群英传正宗Plus/Sānguó qúnyīng chuán Zhèngzōng Plus (Mixed Simplified and Traditional Chinese in title screen) +//三國群英传正宗Plus/Sānguó qúnyīng zhuàn Zhèngzōng Plus (Mixed Simplified and Traditional Chinese in title screen) // modified title screen is only visible for china region, so use that by default. Character select portraits don't seem quite right (different protection?) -GAME( 1999, kovsgqyz, kovplus, pgm_arm_type1_sim, sango_ch, pgm_arm_type1_state, init_kovboot, ROT0, "bootleg", "Sanguo Qunying Chuan Zhengzong Plus (bootleg of Knights of Valour Plus, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -GAME( 1999, kovsgqyza, kovplus, pgm_arm_type1_sim, sango_ch, pgm_arm_type1_state, init_kovboot, ROT0, "bootleg", "Sanguo Qunying Chuan Zhengzong Plus (bootleg of Knights of Valour Plus, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -GAME( 1999, kovsgqyzb, kovplus, pgm_arm_type1_sim, sango_ch, pgm_arm_type1_state, init_kovboot, ROT0, "bootleg", "Sanguo Qunying Chuan Zhengzong Plus (bootleg of Knights of Valour Plus, set 3)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 1999, kovsgqyz, kovplus, pgm_arm_type1_sim, sango_ch, pgm_arm_type1_state, init_kovboot, ROT0, "bootleg", "Sanguo Qunying Zhuan Zhengzong Plus (bootleg of Knights of Valour Plus, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 1999, kovsgqyza, kovplus, pgm_arm_type1_sim, sango_ch, pgm_arm_type1_state, init_kovboot, ROT0, "bootleg", "Sanguo Qunying Zhuan Zhengzong Plus (bootleg of Knights of Valour Plus, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 1999, kovsgqyzb, kovplus, pgm_arm_type1_sim, sango_ch, pgm_arm_type1_state, init_kovboot, ROT0, "bootleg", "Sanguo Qunying Zhuan Zhengzong Plus (bootleg of Knights of Valour Plus, set 3)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ /* ----------------------------------------------------------------------------------------------------------------------- @@ -5692,12 +5692,12 @@ GAME( 2004, pgm3in1c100, pgm3in1, pgm_arm_type1_sim, pgm3in1, pgm_arm_ /* Games below this point are known to have an 'execute only' internal ROM area covering an area at the start of the internal ROM. This can't be read when running code from either internal or external ROM space. */ -//西游释厄传群魔乱舞/Xīyóu shì è chuán Qúnmóluànwǔ (China, Japan; Simplified Chinese) -//西遊釋厄傳群魔亂舞/Xīyóu shì è chuán Qúnmóluànwǔ (Hong Kong, World, Taiwan; Traditional Chinese) +//西游释厄传群魔乱舞/Xīyóu shì è zhuàn Qúnmóluànwǔ (China, Japan; Simplified Chinese) +//西遊釋厄傳群魔亂舞/Xīyóu shì è zhuàn Qúnmóluànwǔ (Hong Kong, World, Taiwan; Traditional Chinese) //Oriental Legend 2/손오공 2/Son Ogong 2 (Korea) // Simulation doesn't seem 100% so marked as NOT WORKING. Probably wasn't released in all specified regions (protection device internal ROM supplies the region) "Oriental Ex" is the identifier string used in test mode. -GAME( 2004, oldsplus, pgm, pgm_arm_type1_sim, oldsplus, pgm_arm_type1_state, init_oldsplus, ROT0, "IGS", "Oriental Legend 2 (Korea) / Xiyou Shi E Chuan Qunmoluanwu (World, China, Japan, Hong Kong, Taiwan) (ver. 205) [Oriental Ex]", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -GAME( 2004, oldsplus203, oldsplus, pgm_arm_type1_sim, oldsplus, pgm_arm_type1_state, init_oldsplus, ROT0, "IGS", "Oriental Legend 2 (Korea) / Xiyou Shi E Chuan Qunmoluanwu (World, China, Japan, Hong Kong, Taiwan) (ver. 203) [Oriental Ex]", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 2004, oldsplus, pgm, pgm_arm_type1_sim, oldsplus, pgm_arm_type1_state, init_oldsplus, ROT0, "IGS", "Oriental Legend 2 (Korea) / Xiyou Shi E Zhuan Qunmoluanwu (World, China, Japan, Hong Kong, Taiwan) (ver. 205) [Oriental Ex]", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 2004, oldsplus203, oldsplus, pgm_arm_type1_sim, oldsplus, pgm_arm_type1_state, init_oldsplus, ROT0, "IGS", "Oriental Legend 2 (Korea) / Xiyou Shi E Zhuan Qunmoluanwu (World, China, Japan, Hong Kong, Taiwan) (ver. 203) [Oriental Ex]", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // we use the kovsh ARM rom for this, intercepting commands and changing them to match it, doesn't seem 100% correct tho so I'm leaving it as NOT WORKING; for example the ARM rom supplies addresses of Z80 music data sections, which have moved causing incorrect music, some damage rates could be different too. // the game logo remains stuck on the screen during gameplay, but videos of the original board suggest this happens on real hardware as well From c3ef577347068352cf12a982299cd8dc4e5f74d1 Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 3 Apr 2024 23:36:59 +0200 Subject: [PATCH 007/109] pgm2: change orleg2 title from chuan to zhuan too --- src/mame/igs/pgm2.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mame/igs/pgm2.cpp b/src/mame/igs/pgm2.cpp index c252e8fa0ea52..d9b84cccc4d8a 100644 --- a/src/mame/igs/pgm2.cpp +++ b/src/mame/igs/pgm2.cpp @@ -1513,15 +1513,15 @@ void pgm2_state::init_bubucar() //Same company but they changed name. // Oriental Legend 2 - should be a V102 and V100 too -//西游释厄传2/Xīyóu shì è chuán 2 (China; Simplified Chinese) +//西游释厄传2/Xīyóu shì è zhuàn 2 (China; Simplified Chinese) //西遊釋厄傳2/Saiyū Shakuyakuden 2 (Japan; Traditional Chinese - Taiwan(undumped) too?) GAME( 2007, orleg2, 0, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS", "Oriental Legend 2 (V104, Oversea)", MACHINE_SUPPORTS_SAVE ) // Overseas sets of OL2 do not use the card reader GAME( 2007, orleg2_103, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS", "Oriental Legend 2 (V103, Oversea)", MACHINE_SUPPORTS_SAVE ) GAME( 2007, orleg2_101, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS", "Oriental Legend 2 (V101, Oversea)", MACHINE_SUPPORTS_SAVE ) -GAME( 2007, orleg2_104cn, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS (Huatong license)", "Xiyou Shi E Chuan 2 (V104, China)", MACHINE_SUPPORTS_SAVE ) -GAME( 2007, orleg2_103cn, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS (Huatong license)", "Xiyou Shi E Chuan 2 (V103, China)", MACHINE_SUPPORTS_SAVE ) -GAME( 2007, orleg2_101cn, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS (Huatong license)", "Xiyou Shi E Chuan 2 (V101, China)", MACHINE_SUPPORTS_SAVE ) +GAME( 2007, orleg2_104cn, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS (Huatong license)", "Xiyou Shi E Zhuan 2 (V104, China)", MACHINE_SUPPORTS_SAVE ) +GAME( 2007, orleg2_103cn, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS (Huatong license)", "Xiyou Shi E Zhuan 2 (V103, China)", MACHINE_SUPPORTS_SAVE ) +GAME( 2007, orleg2_101cn, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS (Huatong license)", "Xiyou Shi E Zhuan 2 (V101, China)", MACHINE_SUPPORTS_SAVE ) GAME( 2007, orleg2_104jp, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS (Alta license)", "Saiyuu Shakuyakuden 2 (V104, Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 2007, orleg2_103jp, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS (Alta license)", "Saiyuu Shakuyakuden 2 (V103, Japan)", MACHINE_SUPPORTS_SAVE ) From f434b2a5235fe7836440e230a6c875b0c3341a62 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Thu, 4 Apr 2024 03:19:32 +0200 Subject: [PATCH 008/109] New clones marked not working ----------------------------- Poker Ladies (Uncensored bootleg, encrypted) [f205v, Roberto Fresca] --- src/mame/capcom/mitchell.cpp | 37 +++++++++++++++++++++++++++++++++++- src/mame/mame.lst | 1 + 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/mame/capcom/mitchell.cpp b/src/mame/capcom/mitchell.cpp index 2f1eaf0877a2f..5ca9dc2bde8bd 100644 --- a/src/mame/capcom/mitchell.cpp +++ b/src/mame/capcom/mitchell.cpp @@ -2191,6 +2191,40 @@ ROM_START( pkladiesbl ) ROM_LOAD("3.ic127", 0x000000, 0x20000, CRC(16b79788) SHA1(6b796119d3c57229ba3d613ce8832c94e9616f76) ) ROM_END +ROM_START( pkladiesblu ) // uncensored encrypted bootleg. ROMs 1, 2, 3, 16 & 17 are identical to set pkladiesbl + ROM_REGION( 0x50000*2, "maincpu", 0 ) + // only pklbu1.bin is encrypted (only opcodes). Encryption scheme seems to involve XORs and bitswaps, based on addresses. + ROM_LOAD( "pklbu1.bin", 0x50000, 0x08000, CRC(ca4cfaf9) SHA1(97ad3c526e4494f347db45c986ba23aff07e6321) ) + ROM_CONTINUE(0x00000,0x08000) + ROM_LOAD( "pklbu2.bin", 0x60000, 0x10000, CRC(5c73e9b6) SHA1(5fbfb4c79e2df8e1edd3f29ac63f9961dd3724b1) ) + ROM_CONTINUE(0x10000,0x10000) + + ROM_REGION( 0x240000, "chars", ROMREGION_INVERT ) + ROM_LOAD32_BYTE("pklbu20.bin", 0x000000, 0x20000, CRC(1f537087) SHA1(87ea5bee67bb2a1f8bbe191ed3e8a83491a3cd0f) ) + ROM_LOAD32_BYTE("pklbu14.bin", 0x000001, 0x20000, CRC(3fd2684d) SHA1(0f14cce27551af64ccc607fa14689cfceb0bb367) ) + ROM_LOAD32_BYTE("pklbu10.bin", 0x000002, 0x20000, CRC(97424238) SHA1(9c3ef3d5524133ba79929318288010ec5a15641a) ) + ROM_LOAD32_BYTE("pklbu6.bin", 0x000003, 0x20000, CRC(96c7eed0) SHA1(d435e6785cc447bee538dc89c1cbbe84071301d8) ) + ROM_LOAD32_BYTE("pklbu21.bin", 0x080000, 0x20000, CRC(6c18df0d) SHA1(eef87c710bbb2f643a7ea8ba2b2f609fb663b579) ) + ROM_LOAD32_BYTE("pklbu15.bin", 0x080001, 0x20000, CRC(0a52206a) SHA1(68f2aa9cda53fb9d545fd5ec29ac7e1ccf0faac7) ) + ROM_LOAD32_BYTE("pklbu11.bin", 0x080002, 0x20000, CRC(7f995c59) SHA1(cb533d524dd35d1058cb319e8f7b60c9d675c858) ) + ROM_LOAD32_BYTE("pklbu7.bin", 0x080003, 0x20000, CRC(d6a7a95b) SHA1(2a4b4ed65dbca88d38f5977f49b6800f8adc519b) ) + ROM_LOAD32_BYTE("pklbu18.bin", 0x100000, 0x20000, CRC(1280a069) SHA1(e2622f528d08eb05dd178fda003b4648828eaf06) ) + ROM_LOAD32_BYTE("pklbu12.bin", 0x100001, 0x20000, CRC(09aa3215) SHA1(d8bfd9eeba33e5b965b6f10421cfee675c44cd61) ) + ROM_LOAD32_BYTE("pklbu8.bin", 0x100002, 0x20000, CRC(2132c239) SHA1(fd770fc212476d32e08e2fae3af3fa42bce5abe2) ) + ROM_LOAD32_BYTE("pklbu4.bin", 0x100003, 0x20000, CRC(b798d926) SHA1(de21e5efff32ef421f68545ccbddfb18db54436b) ) + ROM_LOAD32_BYTE("pklbu19.bin", 0x180000, 0x20000, CRC(95d838cf) SHA1(179634dc6628f858e3f099070604599257aafbe9) ) + ROM_LOAD32_BYTE("pklbu13.bin", 0x180001, 0x20000, CRC(10be806b) SHA1(36cc07a93412be2a0e90bcc133b52febfed8bd90) ) + ROM_LOAD32_BYTE("pklbu9.bin", 0x180002, 0x20000, CRC(9059d383) SHA1(5e8a5a6079838b51363c3a763475b9ca4326d598) ) + ROM_LOAD32_BYTE("pklbu5.bin", 0x180003, 0x20000, CRC(8819affb) SHA1(095d951fa77ae09c4a68c4d971f532c517cb295a) ) + + ROM_REGION( 0x040000, "sprites", ROMREGION_INVERT ) + ROM_LOAD("pklbu16.bin", 0x020000, 0x20000, CRC(c6decb5e) SHA1(3d35cef348deb16a62a066acdfbabebcf11fa997) ) + ROM_LOAD("pklbu17.bin", 0x000000, 0x20000, CRC(5a6efdcc) SHA1(04120dd4da0ff8df514f98a44d7eee7100e4c033) ) + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD("pklbu13.bin", 0x000000, 0x20000, CRC(16b79788) SHA1(6b796119d3c57229ba3d613ce8832c94e9616f76) ) +ROM_END + ROM_START( pkladiesbl2 ) // same as the above but without the z80 block, only 1.ic112 differs ROM_REGION( 0x50000*2, "maincpu", 0 ) ROM_LOAD( "1.ic112", 0x50000, 0x08000, CRC(cadb9925) SHA1(d88353501a29ff855335f9c8822e095ef5196246) ) //sldh @@ -3264,7 +3298,8 @@ GAME( 1989, mgakuen2, 0, marukin, marukin, mitchell_state, ini GAME( 1989, pkladies, 0, marukin, pkladies, mitchell_state, init_pkladies, ROT0, "Mitchell", "Poker Ladies", MACHINE_SUPPORTS_SAVE ) GAME( 1989, pkladiesl, pkladies, marukin, pkladies, mitchell_state, init_pkladies, ROT0, "Leprechaun", "Poker Ladies (Leprechaun ver. 510)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, pkladiesla, pkladies, marukin, pkladies, mitchell_state, init_pkladies, ROT0, "Leprechaun", "Poker Ladies (Leprechaun ver. 401)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, pkladiesbl, pkladies, pkladiesbl, pkladiesbl, pkladiesbl_state, init_pkladiesbl, ROT0, "bootleg", "Poker Ladies (Censored bootleg, encrypted)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // by Playmark? need to figure out CPU 'decryption' / ordering +GAME( 1989, pkladiesbl, pkladies, pkladiesbl, pkladiesbl, pkladiesbl_state, init_pkladiesbl, ROT0, "bootleg", "Poker Ladies (Censored bootleg, encrypted)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // by Playmark? need to figure out CPU 'decryption' / ordering +GAME( 1989, pkladiesblu, pkladies, pkladiesbl, pkladiesbl, pkladiesbl_state, init_pkladiesbl, ROT0, "bootleg", "Poker Ladies (Uncensored bootleg, encrypted)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // by Playmark? need to figure out CPU 'decryption' / ordering GAME( 1989, pkladiesbl2, pkladies, pkladiesbl, pkladiesbl, pkladiesbl_state, init_pkladiesbl, ROT0, "bootleg", "Poker Ladies (Censored bootleg, not encrypted)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // by Playmark? needs inputs, EEPROM (?), MSM5205 hook up, GFX fixes GAME( 1989, dokaben, 0, pang, pang, mitchell_state, init_dokaben, ROT0, "Capcom", "Dokaben (Japan)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 37099310a91f7..ffe861bf97175 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -15897,6 +15897,7 @@ pangbp // bootleg pkladies // (c) 1989 Mitchell pkladiesbl // bootleg pkladiesbl2 // bootleg +pkladiesblu // bootleg pkladiesl // (c) 1989 Leprechaun pkladiesla // (c) 1989 Leprechaun pompingw // (c) 1989 Mitchell (Japan) From 97bb58abdb6186c17f11941af139a5b7c5bd2ea9 Mon Sep 17 00:00:00 2001 From: Alexander Poyanco Date: Wed, 3 Apr 2024 23:10:03 -0300 Subject: [PATCH 009/109] namco/namcops2.cpp: correct notes with regards of THE IDOLM@STER & V300 I/O boards (#11581) --- src/mame/namco/namcops2.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/mame/namco/namcops2.cpp b/src/mame/namco/namcops2.cpp index 5efc2280a99a4..eeb05427bda91 100644 --- a/src/mame/namco/namcops2.cpp +++ b/src/mame/namco/namcops2.cpp @@ -36,18 +36,21 @@ Capcom Fighting Jam/Capcom Fighting Evolution... XXXX56X JAM1 DVD0 D Cobra The Arcade................................ XXXX56X CBR1-HA HDD (40GB) NM00021 CBR1 Ver.B Namco 2004 Requires RAYS I/O PCB and IR guns and IR sensors. HDD: Maxtor DiamondMax Plus 8 40GB 6E040L0 Dragon Chronicles (satellite)................... ------X *DCO31-TS CD0 *CD NM00020 DC001 Ver.A Namco 2002 \ Dragon Chronicles Legend of the Master Ark (sat) ------X *DGC11 CD0 *CD *NM00014 *DGC11 Ver.A1 Namco 200? | server is a custom PC -Druaga Online The Story Of Aon (satellite)...... XXXX56X DOL160-1-ST-DVD0-H DVD NM00028 DOL165-1-ST-I Ver1.65 Namco 2004 | +Druaga Online The Story Of Aon (satellite)...... XXXX56X DOL160-1-ST-DVD0-H DVD NM00028 DOL165-1-ST-I Ver1.65 Namco 2004 | Uses the V290 or V300 I/O Boards. " ...... XXXX56X DOL150-1-ST-DVD0-G DVD NM00028 *? Namco 2004 | " ...... XXXX56X DOL140-1-ST-DVD0-F DVD NM00028 *? Namco 2004 | " ...... XXXX56X DOL120-1-ST-DVD0-D DVD NM00028 *? Namco 2004 | " ...... XXXX56X DOL110-1-ST-DVD0-C DVD NM00028 *? Namco 2004 / Fate / Unlimited Codes.......................... X23456X FUD-HDD0-A HDD (80GB) NM00048 FUD1 Ver.A Capcom/Type-Moon/Cavia/8ing 2008 HDD: Western Digital WD800BB Gundam vs Gundam Next........................... XXXX56X GNX100-1-NA-HDD0-A HDD (80GB) NM00052 GNX1001-NA-A Bandai/Capcom 2009 HDD: Western Digital WD800BB -Idol Master..................................... ------X *IDM1-HA *HDD *NM00022 *IDMS1 Ver.A Namco 2004 +THE IDOLM@STER (Station)........................ XXX45-X IDM1-HA HDD (40GB) NM00022 IDMS1 Ver.D Namco 2004 Uses the V290 or V300 I/O Boards. +THE IDOLM@STER (Tower).......................... XXX45-X IDM1-HA HDD (40GB) NM00022 IDMT1 Ver.D Namco 2004 Uses the V290 or V300 I/O Boards. Can be a Local server for Station units. Kinnikuman Muscle Grand Prix.................... XXXX56X KN1-B DVD NM00029 KN1 Ver.A Banpresto 2006 # Kinnikuman Muscle Grand Prix 2.................. XXXX56X KN2 DVD NM00040 KN2 Ver.A Banpresto 2007 # -Minna de Kitaeru Zenno Training................. ------X *ZNT100-1-NA-DVD0 *DVD NM00036 ZNT100-1-ST-A Namco 2006 -Minna de Kitaeru Zenno Training.(Ver. 1.50)..... ------X ZNT100-1-NA-DVD0-B DVD NM00036 ZNT100-1-ST-A Namco 2007 +Minna de Kitaeru Zenno Training................. ----56X ZNT100-1-NA-DVD0-A DVD NM00036 ZNT100-1-ST-A Namco 2006 +Minna de Kitaeru Zenno Training.(Ver. 1.50)..... ----56X ZNT150-1-NA-DVD0-A DVD NM00036 ZNT100-1-ST-A Namco 2007 +Minna de Kitaeru Zenno Training.(Ver. 1.50)..... ----56X ZNT150-1-NA-DVD0-B DVD NM00036 ZNT100-1-ST-A Namco 2007 +Minna de Kitaeru Zenno Training.(Ver. 1.60)..... ----56X ZNT150-1-NA-DVD0-A DVD NM00036 ZNT100-1-ST-A Namco 2007 Mobile Suit Gundam - Gundam vs Gundam........... XXXX56X GVS1 DVD0B DVD NM00043 GVS1 Ver.A Bandai/Capcom 2008 Mobile Suit Gundam SEED O.M.N.I. vs Z.A.F.T..... 123456X SED1 DVD0 DVD NM00024 SED1 Ver.A Banpresto 2005 % # M.S. Gundam SEED Destiny O.M.N.I. vs Z.A.F.T. II 123456X GSD1 DVD0 DVD NM00034 GSD1 Ver.A Banpresto 2006 % # @@ -615,11 +618,17 @@ V290 FCB PCB V290 FCB PCB is almost identical to FCA PCB. The main differences are changed internal MCU code & PIC code, some extra/different connectors, less D1017 driver transistors and an added RS-232 IC. -The V290 FCB PCB is used with touchscreen games such as Dragon Chronicles, Druaga Online, Idol Master etc. +The V290 FCB PCB is used with touchscreen games such as Dragon Chronicles, Druaga Online, THE IDOLM@STER etc. It supports a serial touchscreen interface, card readers and buttons. The additional devices are supported via J108 which connects to another PCB 'XOU020-A' which contains a Texas Instruments TMS32VC540x DSP, TSOP32 flash ROM and other components. +V300 FCB PCB +2606960100 (2582960101) + +Notes: V300 FCB PCB is almost identical to the V290 FCB PCB. The main differences are changed internal MCU +code & PIC code, more output transistors and an traded the RS-232 for a RS-232C IC. +[to-do] System246 JAMMA(B) PCB 8908962701 (8908972701) From 141b19568a2dc2e9a294b0be4c9d807aa63c6761 Mon Sep 17 00:00:00 2001 From: ClawGrip Date: Thu, 4 Apr 2024 04:10:29 +0200 Subject: [PATCH 010/109] konamim2.cpp: Redumped CD for 'heatof11' [Victor Fernandez (City Game), Arcade Planet] (#10139) --- src/mame/konami/konamim2.cpp | 59 +++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/src/mame/konami/konamim2.cpp b/src/mame/konami/konamim2.cpp index 1a3ba2fea8cc7..64eecd17820f5 100644 --- a/src/mame/konami/konamim2.cpp +++ b/src/mame/konami/konamim2.cpp @@ -1106,7 +1106,7 @@ void konamim2_state::konamim2(machine_config &config) SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_screen_update("bda:vdu", FUNC(m2_vdu_device::screen_update)); - /* Sound hardware */ + // Sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -1222,7 +1222,7 @@ ROM_START( polystar ) ROM_REGION64_BE( 0x200000, "boot", 0 ) ROM_LOAD16_WORD( "623b01.8q", 0x000000, 0x200000, CRC(bd879f93) SHA1(e2d63bfbd2b15260a2664082652442eadea3eab6) ) - ROM_REGION16_BE( 0x80, "eeprom", 0 ) /* EEPROM default contents */ + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // EEPROM default contents ROM_LOAD( "93c46.7k", 0x000000, 0x000080, CRC(fab5a203) SHA1(153e22aa8cfce80b77ba200957685f796fc99b1c) ) DISK_REGION( "ata:0:cr589" ) // Has 1s of silence near the start of the first audio track @@ -1236,7 +1236,7 @@ ROM_START( btltryst ) ROM_REGION16_BE( 0x80, "eeprom", 0 ) ROM_LOAD( "93c46.7k", 0x000000, 0x000080, CRC(cc2c5640) SHA1(694cf2b3700f52ed80252b013052c90020e58ce6) ) - ROM_REGION( 0x2000, "m48t58", 0 ) /* timekeeper SRAM */ + ROM_REGION( 0x2000, "m48t58", 0 ) // timekeeper SRAM ROM_LOAD( "m48t58", 0x000000, 0x002000, CRC(71ee073b) SHA1(cc8002d7ee8d1695aebbbb2a3a1e97a7e16948c1) ) DISK_REGION( "ata:0:cr589" ) @@ -1248,7 +1248,7 @@ ROM_START( btltrysta ) ROM_REGION64_BE( 0x200000, "boot", 0 ) ROM_LOAD16_WORD( "636a01.8q", 0x000000, 0x200000, CRC(7b1dc738) SHA1(32ae8e7ddd38fcc70b4410275a2cc5e9a0d7d33b) ) - ROM_REGION( 0x2000, "m48t58", 0 ) /* timekeeper SRAM */ + ROM_REGION( 0x2000, "m48t58", 0 ) // timekeeper SRAM ROM_LOAD( "m48t58y", 0x000000, 0x002000, CRC(8611ff09) SHA1(6410236947d99c552c4a1f7dd5fd8c7a5ae4cba1) ) DISK_REGION( "ata:0:cr589" ) @@ -1257,30 +1257,33 @@ ROM_END #endif ROM_START( heatof11 ) - ROM_REGION64_BE( 0x200000, "boot", 0 ) /* boot rom */ + ROM_REGION64_BE( 0x200000, "boot", 0 ) // boot ROM ROM_LOAD16_WORD( "636a01.8q", 0x000000, 0x200000, CRC(7b1dc738) SHA1(32ae8e7ddd38fcc70b4410275a2cc5e9a0d7d33b) ) - ROM_REGION16_BE( 0x80, "eeprom", 0 ) /* EEPROM default contents */ + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // EEPROM default contents ROM_LOAD( "93c46.7k", 0x000000, 0x000080, CRC(e7029938) SHA1(ae41340dbcb600debe246629dc36fb371d1a5b05) ) - ROM_REGION( 0x2000, "m48t58", 0 ) /* timekeeper SRAM */ + ROM_REGION( 0x2000, "m48t58", 0 ) // timekeeper SRAM ROM_LOAD( "dallas.5e", 0x000000, 0x002000, CRC(5b74eafd) SHA1(afbf5f1f5a27407fd6f17c764bbb7fae4ab779f5) ) DISK_REGION( "ata:0:cr589" ) - DISK_IMAGE_READONLY( "heatof11", 0, BAD_DUMP SHA1(5a0a2782cd8676d3f6dfad4e0f805b309e230d8b) ) + /* Ring codes found on the disc: + 703EAA02 PN.0000046809 1 + + + + + IFPI L251 + IFPI 42MO */ + DISK_IMAGE_READONLY( "703eaa02", 0, SHA1(f8a87eacfdbbd22659f39c7a72e3895f0a7697b7) ) ROM_END ROM_START( evilngt ) ROM_REGION64_BE( 0x200000, "boot", 0 ) ROM_LOAD16_WORD( "636a01.8q", 0x000000, 0x200000, CRC(7b1dc738) SHA1(32ae8e7ddd38fcc70b4410275a2cc5e9a0d7d33b) ) - ROM_REGION16_BE( 0x80, "eeprom", 0 ) /* EEPROM default contents */ + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // EEPROM default contents ROM_LOAD( "93c46.7k", 0x000000, 0x000080, CRC(60ae825e) SHA1(fd61db9667c53dd12700a0fe202fcd1e3d35d206) ) - ROM_REGION( 0x2000, "m48t58", 0 ) /* timekeeper SRAM */ + ROM_REGION( 0x2000, "m48t58", 0 ) // timekeeper SRAM ROM_LOAD( "m48t58y.9n", 0x000000, 0x002000, CRC(e887ca1f) SHA1(54205f01b1ceba1d5f4d979fc30be1add8116e90) ) - ROM_REGION( 0x400000, "ymz", 0 ) /* YMZ280B sound rom on sub board */ + ROM_REGION( 0x400000, "ymz", 0 ) // YMZ280B sound ROM on sub board ROM_LOAD( "810a03.16h", 0x000000, 0x400000, CRC(05112d3a) SHA1(0df2a167b7bc08a32d983b71614d59834efbfb59) ) DISK_REGION( "ata:0:cr589" ) @@ -1291,13 +1294,13 @@ ROM_START( hellngt ) ROM_REGION64_BE( 0x200000, "boot", 0 ) ROM_LOAD16_WORD( "636a01.8q", 0x000000, 0x200000, CRC(7b1dc738) SHA1(32ae8e7ddd38fcc70b4410275a2cc5e9a0d7d33b) ) - ROM_REGION16_BE( 0x80, "eeprom", 0 ) /* EEPROM default contents */ + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // EEPROM default contents ROM_LOAD( "93c46.7k", 0x000000, 0x000080, CRC(53b41f68) SHA1(f75f59808a5b04b1e49f2cca0592a2466b82f019) ) ROM_REGION( 0x2000, "m48t58", 0 ) ROM_LOAD( "m48t58y.9n", 0x000000, 0x002000, CRC(ff8e78a1) SHA1(02e56f55264dd0bf3a08808726a6366e9cb6031e) ) - ROM_REGION( 0x400000, "ymz", 0 ) /* YMZ280B sound rom on sub board */ + ROM_REGION( 0x400000, "ymz", 0 ) // YMZ280B sound ROM on sub board ROM_LOAD( "810a03.16h", 0x000000, 0x400000, CRC(05112d3a) SHA1(0df2a167b7bc08a32d983b71614d59834efbfb59) ) DISK_REGION( "ata:0:cr589" ) @@ -1311,7 +1314,7 @@ ROM_START( totlvice ) ROM_REGION16_BE( 0x80, "eeprom", 0 ) ROM_LOAD( "93c46.7k", 0x000000, 0x000080, CRC(25aa0bd1) SHA1(cc461e0629ff71c3a868882f1f67af0e19135c1a) ) - ROM_REGION( 0x100000, "ymz", 0 ) /* YMZ280B sound rom on sub board */ + ROM_REGION( 0x100000, "ymz", 0 ) // YMZ280B sound rom on sub board ROM_LOAD( "639jaa02.bin", 0x000000, 0x100000, CRC(c6163818) SHA1(b6f8f2d808b98610becc0a5be5443ece3908df0b) ) DISK_REGION( "ata:0:cr589" ) @@ -1324,7 +1327,7 @@ ROM_START( totlvicd ) ROM_REGION64_BE( 0x200000, "boot", 0 ) ROM_LOAD16_WORD( "623b01.8q", 0x000000, 0x200000, CRC(bd879f93) SHA1(e2d63bfbd2b15260a2664082652442eadea3eab6) ) - ROM_REGION( 0x100000, "ymz", 0 ) /* YMZ280B sound rom on sub board */ + ROM_REGION( 0x100000, "ymz", 0 ) // YMZ280B sound rom on sub board ROM_LOAD( "639jaa02.bin", 0x000000, 0x100000, CRC(c6163818) SHA1(b6f8f2d808b98610becc0a5be5443ece3908df0b) ) DISK_REGION( "ata:0:cr589" ) @@ -1336,7 +1339,7 @@ ROM_START( totlvicu ) ROM_REGION64_BE( 0x200000, "boot", 0 ) ROM_LOAD16_WORD( "623b01.8q", 0x000000, 0x200000, CRC(bd879f93) SHA1(e2d63bfbd2b15260a2664082652442eadea3eab6) ) - ROM_REGION( 0x100000, "ymz", 0 ) /* YMZ280B sound rom on sub board */ + ROM_REGION( 0x100000, "ymz", 0 ) // YMZ280B sound rom on sub board ROM_LOAD( "639jaa02.bin", 0x000000, 0x100000, CRC(c6163818) SHA1(b6f8f2d808b98610becc0a5be5443ece3908df0b) ) DISK_REGION( "ata:0:cr589" ) @@ -1347,7 +1350,7 @@ ROM_START( totlvica ) ROM_REGION64_BE( 0x200000, "boot", 0 ) ROM_LOAD16_WORD( "623b01.8q", 0x000000, 0x200000, CRC(bd879f93) SHA1(e2d63bfbd2b15260a2664082652442eadea3eab6) ) - ROM_REGION( 0x100000, "ymz", 0 ) /* YMZ280B sound rom on sub board */ + ROM_REGION( 0x100000, "ymz", 0 ) // YMZ280B sound rom on sub board ROM_LOAD( "639jaa02.bin", 0x000000, 0x100000, CRC(c6163818) SHA1(b6f8f2d808b98610becc0a5be5443ece3908df0b) ) DISK_REGION( "ata:0:cr589" ) @@ -1358,7 +1361,7 @@ ROM_START( totlvicj ) ROM_REGION64_BE( 0x200000, "boot", 0 ) ROM_LOAD16_WORD( "623b01.8q", 0x000000, 0x200000, CRC(bd879f93) SHA1(e2d63bfbd2b15260a2664082652442eadea3eab6) ) - ROM_REGION( 0x100000, "ymz", 0 ) /* YMZ280B sound rom on sub board */ + ROM_REGION( 0x100000, "ymz", 0 ) // YMZ280B sound rom on sub board ROM_LOAD( "639jaa02.bin", 0x000000, 0x100000, CRC(c6163818) SHA1(b6f8f2d808b98610becc0a5be5443ece3908df0b) ) DISK_REGION( "ata:0:cr589" ) // Need a re-image @@ -1455,21 +1458,21 @@ void konamim2_state::dump_task_command(const std::vector ¶ struct ItemNode { - m2ptr pn_Next; /* pointer to next in list */ // 0 - m2ptr pn_Prev; /* pointer to previous in list */ // 4 + m2ptr pn_Next; /* pointer to next in list */ // 0 + m2ptr pn_Prev; /* pointer to previous in list */ // 4 uint8_t n_SubsysType; /* what component manages this node */ // 8 uint8_t n_Type; /* what type of node for the component */ // 9 uint8_t n_Priority; /* queueing priority */ // A uint8_t n_Flags; /* misc flags, see below */ // B int32_t n_Size; /* total size of node including hdr */ // C - m2ptr pn_Name; /* name of item, or NULL */ // 10 + m2ptr pn_Name; /* name of item, or NULL */ // 10 uint8_t n_Version; /* version of of this Item */ // 14 uint8_t n_Revision; /* revision of this Item */ // 15 uint8_t n_Reserved0; /* reserved for future use */ // 16 uint8_t n_ItemFlags; /* additional system item flags */ // 17 - Item n_Item; /* Item number representing this struct */ //18 - Item n_Owner; /* creator, present owner, disposer */ // 1C - m2ptr pn_Reserved1; /* reserved for future use */ // 20 + Item n_Item; /* Item number representing this struct */ //18 + Item n_Owner; /* creator, present owner, disposer */ // 1C + m2ptr pn_Reserved1; /* reserved for future use */ // 20 }; struct Task @@ -1479,7 +1482,7 @@ void konamim2_state::dump_task_command(const std::vector ¶ uint32_t t_WaitBits; /* signals being waited for */ uint32_t t_SigBits; /* signals received */ uint32_t t_AllocatedSigs; /* signals allocated */ - m2ptr pt_StackBase; /* base of stack */ + m2ptr pt_StackBase; /* base of stack */ int32_t t_StackSize; /* size of stack */ uint32_t t_MaxUSecs; /* quantum length in usecs */ TimerTicks t_ElapsedTime; /* time spent running this task */ @@ -1487,7 +1490,7 @@ void konamim2_state::dump_task_command(const std::vector ¶ uint32_t t_Flags; /* task flags */ Item t_Module; /* the module we live within */ Item t_DefaultMsgPort; /* default task msgport */ - m2ptr pt_UserData; /* user-private data */ + m2ptr pt_UserData; /* user-private data */ }; debugger_console &con = machine().debugger().console(); @@ -1556,7 +1559,7 @@ void konamim2_state::dump_task_command(const std::vector ¶ // uint32_t t_WaitBits; /* signals being waited for */ // uint32_t t_SigBits; /* signals received */ // uint32_t t_AllocatedSigs; /* signals allocated */ -// m2ptr pt_StackBase; /* base of stack */ +// m2ptr pt_StackBase; /* base of stack */ // int32_t t_StackSize; /* size of stack */ // uint32_t t_MaxUSecs; /* quantum length in usecs */ // TimerTicks t_ElapsedTime; /* time spent running this task */ @@ -1564,7 +1567,7 @@ void konamim2_state::dump_task_command(const std::vector ¶ // uint32_t t_Flags; /* task flags */ // Item t_Module; /* the module we live within */ // Item t_DefaultMsgPort; /* default task msgport */ -// m2ptr pt_UserData; /* user-private data */ +// m2ptr pt_UserData; /* user-private data */ con.printf("**** Task Info @ %08X ****\n", address); con.printf("Next: %08X\n", task.t.pn_Next); From c283d68064deb079de89bb1a9e2a58e10e8aaefe Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Thu, 4 Apr 2024 17:30:45 +0700 Subject: [PATCH 011/109] palm: add program level output --- src/devices/cpu/palm/palm.cpp | 18 +++++++++--------- src/devices/cpu/palm/palm.h | 2 ++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/devices/cpu/palm/palm.cpp b/src/devices/cpu/palm/palm.cpp index 0febe5b379367..28ae003eff296 100644 --- a/src/devices/cpu/palm/palm.cpp +++ b/src/devices/cpu/palm/palm.cpp @@ -42,6 +42,7 @@ palm_device::palm_device(machine_config const &mconfig, char const *tag, device_ , m_iod_config("iod", ENDIANNESS_BIG, 8, 4) , m_getb_bus(*this) , m_select_ros(*this) + , m_program_level(*this) , m_icount(0) , m_r{} { @@ -89,6 +90,7 @@ void palm_device::device_reset() // select instruction source m_ff = FF_IPL | FF_MSS; m_select_ros((m_ff & FF_MSS) && !(m_ff & FF_IPL)); + m_program_level(0); // read initial PC from ROS m_il = 0; @@ -110,6 +112,7 @@ void palm_device::execute_run() if ((m_ff & FF_IE) && m_il != il) { m_il = il; + m_program_level(m_il > 0); // notify the debugger if (m_il && (machine().debug_flags & DEBUG_FLAG_ENABLED)) @@ -209,8 +212,6 @@ void palm_device::execute_run() } else { - m_getb_bus(DA, Ry); - if (MOD < 0xc) { // get byte @@ -218,8 +219,12 @@ void palm_device::execute_run() Ry += modifier(MOD); } else + { + m_getb_bus(DA, Ry); + // get register byte Ry = (Ry & 0xff00U) | m_ioc.read_byte(DA); + } } break; case 0xf: Rx -= IMM + 1; break; // subtract immediate @@ -305,7 +310,7 @@ void palm_device::control(u8 data) { LOG("control 0x%02x (%s)\n", data, machine().describe_context()); - // 0 reset controller errors + // 0: reset controller errors // 1: 0=disable interrupts // 2: 0=enable interrupts @@ -314,10 +319,7 @@ void palm_device::control(u8 data) else if (!IBIT(data, 2)) m_ff |= FF_IE; - // TODO: 3 not used? - // 4 not used (0:display & select frame on) - - // 5 state transition + // 5: state transition if (!IBIT(data, 5)) { m_ff &= ~FF_IPL; @@ -325,6 +327,4 @@ void palm_device::control(u8 data) m_select_ros((m_ff & FF_MSS) && !(m_ff & FF_IPL)); } - - // TODO: 6..7 not used (frame bit #1,2?) } diff --git a/src/devices/cpu/palm/palm.h b/src/devices/cpu/palm/palm.h index bd1a1c159748f..0e218e8ff837d 100644 --- a/src/devices/cpu/palm/palm.h +++ b/src/devices/cpu/palm/palm.h @@ -22,6 +22,7 @@ class palm_device : public cpu_device auto getb_bus() { return m_getb_bus.bind(); } auto select_ros() { return m_select_ros.bind(); } + auto program_level() { return m_program_level.bind(); } palm_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); @@ -62,6 +63,7 @@ class palm_device : public cpu_device devcb_write8 m_getb_bus; devcb_write_line m_select_ros; + devcb_write_line m_program_level; // mame state int m_icount; From 37755dde5fad4d0e0a470a3b159589fbcb135b88 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Thu, 4 Apr 2024 17:31:07 +0700 Subject: [PATCH 012/109] ibm5100: add 5110 keyboard --- src/mame/ibm/ibm5100_kbd.cpp | 61 +++++++++++++++++++++++------------- src/mame/ibm/ibm5100_kbd.h | 15 ++++++++- 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/mame/ibm/ibm5100_kbd.cpp b/src/mame/ibm/ibm5100_kbd.cpp index c20386b1495f1..90285cf67336b 100644 --- a/src/mame/ibm/ibm5100_kbd.cpp +++ b/src/mame/ibm/ibm5100_kbd.cpp @@ -27,6 +27,8 @@ * This scheme disallows modifier combinations, with shift taking priority over * command. Bits 5 and 6 of the scan code are swapped when output. * + * IBM 5110 keyboard scan codes are bitwise inverted and reversed. + * * Regular alpha, numeric and keypad keys are easily mapped 1:1 with a standard * modern keyboard. Additional keys are mapped by default as follows: * @@ -57,6 +59,7 @@ #include "logmacro.h" DEFINE_DEVICE_TYPE(IBM5100_KEYBOARD, ibm5100_keyboard_device, "ibm5100_keyboard", "IBM 5100 Keyboard") +DEFINE_DEVICE_TYPE(IBM5110_KEYBOARD, ibm5110_keyboard_device, "ibm5110_keyboard", "IBM 5110 Keyboard") INPUT_PORTS_START(ibm5100_keyboard) PORT_START("modifiers") @@ -184,8 +187,8 @@ static const std::pairtypamatic_keys[] = std::make_pair(17, 1), // cursor left }; -ibm5100_keyboard_device::ibm5100_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) - : device_t(mconfig, IBM5100_KEYBOARD, tag, owner, clock) +ibm5100_keyboard_device::ibm5100_keyboard_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) , device_matrix_keyboard_interface(mconfig, *this , "col.0", "col.1", "col.2", "col.3", "col.4", "col.5", "col.6", "col.7" , "col.8", "col.9", "col.a", "col.b", "col.c", "col.d", "col.e", "col.f" @@ -196,6 +199,16 @@ ibm5100_keyboard_device::ibm5100_keyboard_device(machine_config const &mconfig, { } +ibm5100_keyboard_device::ibm5100_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : ibm5100_keyboard_device(mconfig, IBM5100_KEYBOARD, tag, owner, clock) +{ +} + +ibm5110_keyboard_device::ibm5110_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : ibm5100_keyboard_device(mconfig, IBM5110_KEYBOARD, tag, owner, clock) +{ +} + void ibm5100_keyboard_device::device_start() { save_item(NAME(m_scan)); @@ -219,7 +232,7 @@ void ibm5100_keyboard_device::key_make(u8 row, u8 column) if (m_lock) return; - m_scan = translate(row, column); + m_scan = translate(row, column, m_modifiers->read()); LOG("key_make row %d column %d scan 0x%02x\n", row, column, m_scan); @@ -243,20 +256,33 @@ void ibm5100_keyboard_device::key_repeat(u8 row, u8 column) { if (m_typamatic) { - m_scan = translate(row, column); + m_scan = translate(row, column, m_modifiers->read()); m_strobe(0); m_strobe(1); } } -// column and row are swapped with respect device_matrix_keyboard_interface arguments -u8 ibm5100_keyboard_device::translate(u8 column, u8 row) +void ibm5100_keyboard_device::typamatic_w(int state) { - // compute basic scan code with bits 5 and 6 swapped - u8 data = bitswap<8>(row << 5 | column, 7, 5, 6, 4, 3, 2, 1, 0); + m_typamatic = state; +} - u8 const modifiers = m_modifiers->read(); +void ibm5100_keyboard_device::lock_w(int state) +{ + // FIXME: not connected? + //m_lock = !state; +} + +ioport_constructor ibm5100_keyboard_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(ibm5100_keyboard); +} + +// column and row are swapped with respect device_matrix_keyboard_interface arguments +u8 ibm5100_keyboard_device::translate(u8 column, u8 row, u8 modifiers) const +{ + u8 data = bitswap<8>(row << 5 | column, 4, 5, 6, 4, 3, 2, 1, 0); // modifiers are applied differently for columns > 15 if (column < 16) @@ -270,7 +296,7 @@ u8 ibm5100_keyboard_device::translate(u8 column, u8 row) } else { - data |= 0x82; + data |= 0x02; // S is active low if (BIT(modifiers, 0)) // shift @@ -283,17 +309,8 @@ u8 ibm5100_keyboard_device::translate(u8 column, u8 row) return data; } -void ibm5100_keyboard_device::typamatic_w(int state) +u8 ibm5110_keyboard_device::translate(u8 column, u8 row, u8 modifiers) const { - m_typamatic = state; -} - -void ibm5100_keyboard_device::lock_w(int state) -{ - m_lock = !state; -} - -ioport_constructor ibm5100_keyboard_device::device_input_ports() const -{ - return INPUT_PORTS_NAME(ibm5100_keyboard); + // 5110 scan codes are bitwise inverted and reversed + return bitswap<8>(~ibm5100_keyboard_device::translate(column, row, modifiers), 0, 1, 2, 3, 4, 5, 6, 7); } diff --git a/src/mame/ibm/ibm5100_kbd.h b/src/mame/ibm/ibm5100_kbd.h index 799bb3551ef32..51f0040f5ab79 100644 --- a/src/mame/ibm/ibm5100_kbd.h +++ b/src/mame/ibm/ibm5100_kbd.h @@ -22,6 +22,8 @@ class ibm5100_keyboard_device void lock_w(int state); protected: + ibm5100_keyboard_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock); + // device_t implementation virtual ioport_constructor device_input_ports() const override; virtual void device_start() override; @@ -32,7 +34,7 @@ class ibm5100_keyboard_device virtual void key_break(u8 row, u8 column) override; virtual void key_repeat(u8 row, u8 column) override; - u8 translate(u8 column, u8 row); + virtual u8 translate(u8 column, u8 row, u8 modifiers) const; private: devcb_write_line m_strobe; @@ -44,6 +46,17 @@ class ibm5100_keyboard_device bool m_lock; }; +class ibm5110_keyboard_device + : public ibm5100_keyboard_device +{ +public: + ibm5110_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0); + +protected: + virtual u8 translate(u8 column, u8 row, u8 modifiers) const override; +}; + DECLARE_DEVICE_TYPE(IBM5100_KEYBOARD, ibm5100_keyboard_device) +DECLARE_DEVICE_TYPE(IBM5110_KEYBOARD, ibm5110_keyboard_device) #endif // MAME_IBM_IBM5100_KBD_H From 2c56d783e9f814d9303d38b50b16e82229938e12 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Thu, 4 Apr 2024 17:31:36 +0700 Subject: [PATCH 013/109] New working systems ------------------- IBM 5110 [Christian Corti, Tom Stepleton] --- src/mame/ibm/ibm5100.cpp | 483 +++++++++++++++++++++++++++++++-------- src/mame/mame.lst | 1 + 2 files changed, 395 insertions(+), 89 deletions(-) diff --git a/src/mame/ibm/ibm5100.cpp b/src/mame/ibm/ibm5100.cpp index 35be65063d4be..533cfd814871c 100644 --- a/src/mame/ibm/ibm5100.cpp +++ b/src/mame/ibm/ibm5100.cpp @@ -11,10 +11,11 @@ * - display registers * - device address f * - tape controller + * - disk controller * - printer * - communications cards * - expansion feature - * - later models (5110, 5120, 5130) + * - feature ROS (K4) */ #include "emu.h" @@ -22,8 +23,11 @@ #include "ibm5100_kbd.h" #include "cpu/palm/palm.h" +#include "sound/beep.h" +#include "emupal.h" #include "screen.h" +#include "speaker.h" //#define VERBOSE (LOG_GENERAL) #include "logmacro.h" @@ -38,12 +42,12 @@ class ibm5100_state : public driver_device , m_cpu(*this, "cpu") , m_screen(*this, "screen") , m_kbd(*this, "kbd") - , m_nxr(*this, { "apl", "basic" }) - , m_j2(*this, "j2") + , m_nxr(*this, { "common", "basic", "apl" }) + , m_cgr(*this, "cgr") + , m_ros(*this, "ros") , m_conf(*this, "CONF") , m_disp(*this, "DISP") , m_lang(*this, "LANG") - , m_ros(*this, "ros") { } @@ -54,59 +58,110 @@ class ibm5100_state : public driver_device virtual void machine_start() override; virtual void machine_reset() override; - void cpu_ros_map(address_map &map); - void cpu_rws_map(address_map &map); - void cpu_ioc_map(address_map &map); - void cpu_iod_map(address_map &map); + virtual void cpu_ros_map(address_map &map); + virtual void cpu_rws_map(address_map &map); + virtual void cpu_ioc_map(address_map &map); + virtual void cpu_iod_map(address_map &map); u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, rectangle const &cliprect); - // e2 - ros control card - u8 e2_sts_r(); - void e2_ctl_w(u8 data); - u8 e2_r(); - void e2_w(u8 data); + virtual void da0_ctl_w(u8 data); + + // non-executable ROS control + u8 nxr_sts_r(); + void nxr_ctl_w(u8 data); + virtual u8 nxr_r(); + virtual void nxr_w(u8 data); + + // keyboard + u8 kbd_sts_r(); + void kbd_ctl_w(u8 data); - // f2 - base i/o card - u8 f2_kbd_sts_r(); - void f2_kbd_ctl_w(u8 data); - void da0_ctl_w(u8 data); void daf_ctl_w(u8 data); -private: required_device m_cpu; required_device m_screen; required_device m_kbd; - required_region_ptr_array m_nxr; - required_region_ptr m_j2; + required_region_ptr_array m_nxr; + required_region_ptr m_cgr; // character generator ROS + + memory_view m_ros; required_ioport m_conf; required_ioport m_disp; required_ioport m_lang; - memory_view m_ros; - u8 m_getb_bus; - u8 m_e2_ff; // e2 card flip-flops - u8 m_f2_ff; // f2 card flip-flops - u16 m_e2_address; + u8 m_nxr_ff; // non-executable ROS control flip-flops + u8 m_bio_ff; // base I/O card flip-flops + u16 m_nxr_address; std::unique_ptr m_rws; }; -enum e2_ff_mask : u8 +class ibm5110_state : public ibm5100_state { - E2_RS = 0x01, // ROS select (0=APL, 1=BASIC/common) - E2_PS = 0x02, // put strobe - E2_B0 = 0x04, // data address bit 0 +public: + ibm5110_state(machine_config const &mconfig, device_type type, char const *tag) + : ibm5100_state(mconfig, type, tag) + , m_alarm(*this, "alarm") + , m_exr(*this, "exr") + , m_jmp(*this, { "L2_1", "L2_2", "K4" }) + { + } + + void ibm5110(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + virtual void cpu_ros_map(address_map &map) override; + virtual void cpu_ioc_map(address_map &map) override; + + virtual void da0_ctl_w(u8 data) override; + + // executable ROS control + u8 exr_sts_r(); + void exr_ctl_w(u8 data); + + // non-executable ROS control + virtual u8 nxr_r() override; + virtual void nxr_w(u8 data) override; + +private: + required_device m_alarm; + + memory_view m_exr; + + required_ioport_array<3> m_jmp; + + u8 m_exr_ff; // executable ROS flip-flops }; -enum f2_ff_mask : u8 +enum nxr_ff_mask : u8 { - F2_KIE = 0x01, // keyboard interrupt enable - F2_DO = 0x10, // display off + NXR_RS = 0x03, // ROS select + NXR_PS = 0x04, // put strobe + NXR_B0 = 0x08, // data address bit 0 + + NXR_COMMON = 0x00, + NXR_BASIC = 0x01, + NXR_APL = 0x02, +}; + +enum bio_ff_mask : u8 +{ + BIO_KIE = 0x01, // keyboard interrupt enable + BIO_KI = 0x08, // keyboard interrupt active + BIO_DO = 0x10, // display off +}; + +enum exr_ff_mask : u8 +{ + EXR_ROS2 = 0x01, // ROS2 enable }; void ibm5100_state::machine_start() @@ -116,19 +171,26 @@ void ibm5100_state::machine_start() save_item(NAME(m_getb_bus)); - save_item(NAME(m_e2_ff)); - save_item(NAME(m_f2_ff)); - save_item(NAME(m_e2_address)); + save_item(NAME(m_nxr_ff)); + save_item(NAME(m_bio_ff)); + save_item(NAME(m_nxr_address)); save_pointer(NAME(m_rws), 0x8000); } +void ibm5110_state::machine_start() +{ + ibm5100_state::machine_start(); + + save_item(NAME(m_exr_ff)); +} + void ibm5100_state::machine_reset() { - m_e2_ff = 0; - m_f2_ff = 0; + m_nxr_ff = 0; + m_bio_ff = 0; - m_e2_address = 0; + m_nxr_address = 0; // install configured rws unsigned const rws_cards = (m_conf->read() & 3) + 1; @@ -136,12 +198,29 @@ void ibm5100_state::machine_reset() m_ros[1].install_ram(0x80, 0x4000 * rws_cards - 1, &m_rws[0x40]); } +void ibm5110_state::machine_reset() +{ + ibm5100_state::machine_reset(); + + m_exr.disable(); + m_exr_ff = 0; +} + void ibm5100_state::cpu_ros_map(address_map &map) { map(0x0000, 0xffff).view(m_ros); m_ros[0](0x0000, 0xffff).rom().region("ros", 0); } +void ibm5110_state::cpu_ros_map(address_map &map) +{ + map(0x0000, 0xffff).view(m_ros); + m_ros[0](0x0000, 0x7fff).rom().region("l2_1", 0); + m_ros[0](0x0000, 0x7fff).view(m_exr); + m_exr[0](0x0000, 0x7fff).rom().region("l2_2a", 0); + m_exr[1](0x0000, 0x7fff).rom().region("l2_2b", 0); +} + void ibm5100_state::cpu_rws_map(address_map &map) { map.unmap_value_high(); @@ -150,9 +229,9 @@ void ibm5100_state::cpu_rws_map(address_map &map) void ibm5100_state::cpu_ioc_map(address_map &map) { map(0x0, 0x0).w(FUNC(ibm5100_state::da0_ctl_w)); - map(0x1, 0x1).rw(FUNC(ibm5100_state::e2_sts_r), FUNC(ibm5100_state::e2_ctl_w)); + map(0x1, 0x1).rw(FUNC(ibm5100_state::nxr_sts_r), FUNC(ibm5100_state::nxr_ctl_w)); map(0x2, 0x3).noprw(); - map(0x4, 0x4).rw(FUNC(ibm5100_state::f2_kbd_sts_r), FUNC(ibm5100_state::f2_kbd_ctl_w)); + map(0x4, 0x4).rw(FUNC(ibm5100_state::kbd_sts_r), FUNC(ibm5100_state::kbd_ctl_w)); // 5 printer r:not used w:control map(0x6, 0x7).noprw(); // 8 expansion r:status w:control @@ -161,14 +240,21 @@ void ibm5100_state::cpu_ioc_map(address_map &map) map(0xf, 0xf).nopr().w(FUNC(ibm5100_state::daf_ctl_w)); } +void ibm5110_state::cpu_ioc_map(address_map &map) +{ + ibm5100_state::cpu_ioc_map(map); + + map(0x2, 0x2).rw(FUNC(ibm5110_state::exr_sts_r), FUNC(ibm5110_state::exr_ctl_w)); +} + void ibm5100_state::cpu_iod_map(address_map &map) { map.unmap_value_high(); map(0x0, 0x0).noprw(); - map(0x1, 0x1).rw(FUNC(ibm5100_state::e2_r), FUNC(ibm5100_state::e2_w)); + map(0x1, 0x1).rw(FUNC(ibm5100_state::nxr_r), FUNC(ibm5100_state::nxr_w)); map(0x2, 0x3).noprw(); - map(0x4, 0x4).r(m_kbd, FUNC(ibm5100_keyboard_device::read)).nopw(); + map(0x4, 0x4).r(m_kbd, FUNC(ibm5100_keyboard_device::read)); // 5 r:printer w:print data map(0x6, 0x7).noprw(); // 8 expansion r:not used w:data @@ -193,18 +279,66 @@ void ibm5100_state::ibm5100(machine_config &config) * pixels of each character cell line and every other scan line are blank. */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_raw(15'091'200, 64*10, 0, 64*10, 16*12*2, 0, 16*12*2); + m_screen->set_raw(15'091'200, 64*10+15, 0, 64*10, 16*12*2, 0, 16*12*2); m_screen->set_screen_update(FUNC(ibm5100_state::screen_update)); IBM5100_KEYBOARD(config, m_kbd); m_kbd->strobe().set( [this](int state) { - if ((m_f2_ff & F2_KIE) && !state) + if ((m_bio_ff & BIO_KIE) && !state) m_cpu->set_input_line(palm_device::IRPT_REQ3, 0); }); } +void ibm5110_state::ibm5110(machine_config &config) +{ + ibm5100_state::ibm5100(config); + + m_cpu->program_level().set( + [this](int state) + { + if (state || !(m_exr_ff & EXR_ROS2)) + m_exr.disable(); + else + m_exr.select(BIT(m_lang->read(), 6)); + }); + + IBM5110_KEYBOARD(config.replace(), m_kbd); + m_kbd->strobe().set( + [this](int state) + { + if (!state) + { + m_bio_ff |= BIO_KI; + + if (m_bio_ff & BIO_KIE) + m_cpu->set_input_line(palm_device::IRPT_REQ3, 0); + } + }); + + SPEAKER(config, "mono").front_center(); + BEEP(config, m_alarm, 3'885); // FIXME: frequency + m_alarm->add_route(ALL_OUTPUTS, "mono", 0.25); + + // gfxdecode is only used to show the font data in the tile viewer + static const gfx_layout g2_layout = + { + 8, 12, 256, 1, + { 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0 * 8, 1 * 8, 2 * 8, 3 * 8, 4 * 8, 5 * 8, 6 * 8, 7 * 8, 8 * 8, 9 * 8, 10 * 8, 11 * 8 }, + 8 * 16 + }; + + static GFXDECODE_START(g2) + GFXDECODE_ENTRY("cgr", 0, g2_layout, 0, 1) + GFXDECODE_END + + PALETTE(config, "palette", palette_device::MONOCHROME); + GFXDECODE(config, "gfx", "palette", g2); +} + u32 ibm5100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, rectangle const &cliprect) { static rgb_t const c[] = { rgb_t::white(), rgb_t::black() }; @@ -219,11 +353,14 @@ u32 ibm5100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, re // start with a blank screen bitmap.fill(c[reverse]); - // then generate characters + if (m_bio_ff & BIO_DO) + return 0; + + // generate characters auto const rws = util::big_endian_cast(m_rws.get()); for (unsigned char_y = 0; char_y < 16; char_y++) { - // every other scan line is blank + // every alternate scan line is blank int const y = screen.visible_area().min_y + char_y * 12 * 2; // compute offset into rws for each row @@ -233,17 +370,31 @@ u32 ibm5100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, re { int const x = screen.visible_area().min_x + char_x * 10; - // read next character if display is on and normal mode or even column + // read next character if normal mode or even column u8 char_data = 0; - if (!(m_f2_ff & F2_DO) && (n64 || !(char_x & 1))) + if (n64 || !(char_x & 1)) char_data = rws[offset++]; // draw 8x12 character cell for (unsigned cell_y = 0; cell_y < 12; cell_y++) { - // index into character font data - unsigned const underline = ((cell_y > 7) && BIT(char_data, 7)) ? 4 : 0; - u8 const cell_data = m_j2[(char_data & 0x7f) * 16 + cell_y + underline]; + u8 cell_data = 0; + + /* + * The J2 (5100) display adapter has 2KiB of character ROS used + * to produce 128 unique characters with normal and underlined + * variants. The G2 (5110) has 4KiB with 256 unique character + * patterns, with only selected characters having underlined + * variations. + */ + if (m_cgr.bytes() < 4096) + { + unsigned const underline = ((cell_y > 7) && BIT(char_data, 7)) ? 4 : 0; + + cell_data = m_cgr[(char_data & 0x7f) * 16 + cell_y + underline]; + } + else + cell_data = m_cgr[char_data * 16 + cell_y]; bitmap.pix(y + cell_y * 2, x + 0) = c[BIT(cell_data, 7) ^ reverse]; bitmap.pix(y + cell_y * 2, x + 1) = c[BIT(cell_data, 6) ^ reverse]; @@ -265,49 +416,94 @@ void ibm5100_state::da0_ctl_w(u8 data) LOG("da0_ctl_w 0x%02x (%s)\n", data, machine().describe_context()); // bit 4: 0=display off + // bit 3: 0=display on if (!BIT(data, 4)) - m_f2_ff |= F2_DO; - else - m_f2_ff &= ~F2_DO; + m_bio_ff |= BIO_DO; + else if (!BIT(data, 3)) + m_bio_ff &= ~BIO_DO; +} + +void ibm5110_state::da0_ctl_w(u8 data) +{ + ibm5100_state::da0_ctl_w(data); + + // bit 0: 0=alarm on + // bit 1: 0=alarm off + if (!BIT(data, 0)) + m_alarm->set_state(1); + else if (!BIT(data, 1)) + m_alarm->set_state(0); +} + +u8 ibm5110_state::exr_sts_r() +{ + LOG("exr_sts_r 0x%02x (%s)\n", m_getb_bus, machine().describe_context()); + + switch (m_getb_bus) + { + case 0x80: return m_jmp[0]->read(); + case 0x40: return m_jmp[1]->read(); + case 0x20: return m_jmp[2]->read(); + default: + return 0; + } +} + +void ibm5110_state::exr_ctl_w(u8 data) +{ + LOG("exr_ctl_w 0x%02x (%s)\n", data, machine().describe_context()); + + if (BIT(data, 7)) + { + m_exr.select(BIT(m_lang->read(), 6)); + m_exr_ff |= EXR_ROS2; + } + else if (BIT(data, 6)) + { + m_exr.disable(); + m_exr_ff &= ~EXR_ROS2; + } } -u8 ibm5100_state::e2_sts_r() +u8 ibm5100_state::nxr_sts_r() { u8 data = 0xff; if (!machine().side_effects_disabled()) { - data = (m_e2_ff & E2_PS) ? u8(m_e2_address) : (m_e2_address >> 8); + data = (m_nxr_ff & NXR_PS) ? u8(m_nxr_address) : (m_nxr_address >> 8); - m_e2_ff ^= E2_PS; + m_nxr_ff ^= NXR_PS; } return data; } -void ibm5100_state::e2_ctl_w(u8 data) +void ibm5100_state::nxr_ctl_w(u8 data) { - LOG("e2_ctl_w 0x%02x (%s)\n", data, machine().describe_context()); + LOG("nxr_ctl_w 0x%02x (%s)\n", data, machine().describe_context()); - if (!BIT(data, 3)) - m_e2_ff &= ~E2_RS; - else if (!BIT(data, 2)) - m_e2_ff |= E2_RS; + m_nxr_ff &= ~(NXR_B0 | NXR_PS | NXR_RS); - m_e2_ff &= ~(E2_B0 | E2_PS); - m_e2_address = 0; + if (BIT(data, 3)) + m_nxr_ff |= NXR_BASIC; + else if (BIT(data, 2)) + m_nxr_ff |= NXR_APL; + + m_nxr_address = 0; } -u8 ibm5100_state::e2_r() +u8 ibm5100_state::nxr_r() { u8 data = 0xff; if (!machine().side_effects_disabled()) { - bool const basic = m_e2_ff & E2_RS; + unsigned const rs = m_nxr_ff & NXR_RS; + bool const basic = !(rs & NXR_APL); // check model has selected ROS (all models have common) - if (BIT(m_conf->read(), 2 + basic) || (basic && m_e2_address >= 0x9000)) + if (BIT(m_conf->read(), 2 + basic) || (basic && m_nxr_address >= 0x9000)) { /* * APL non-executable ROS is addressed with an unshifted 16-bit @@ -315,41 +511,79 @@ u8 ibm5100_state::e2_r() * giving 64KiB. Even and odd bytes are selected by a flip-flop * which is toggled with each read. */ - data = BIT(m_nxr[basic][m_e2_address >> basic], (m_e2_ff & E2_B0) ? 0 : 8, 8); + data = BIT(m_nxr[rs][m_nxr_address >> basic], (m_nxr_ff & NXR_B0) ? 0 : 8, 8); } // always increment address for BASIC, only on odd bytes for APL - if (basic || (m_e2_ff & E2_B0)) - m_e2_address++; + if (basic || (m_nxr_ff & NXR_B0)) + m_nxr_address++; // toggle even/odd byte flip-flop - m_e2_ff ^= E2_B0; + m_nxr_ff ^= NXR_B0; } return data; } -void ibm5100_state::e2_w(u8 data) +u8 ibm5110_state::nxr_r() { - m_e2_address = (m_e2_address << 8) | data; + u8 data = 0xff; - if (m_e2_ff & E2_PS) + if (!machine().side_effects_disabled()) { - LOG("e2_address 0x%04x (%s)\n", m_e2_address, machine().describe_context()); + unsigned const rs = m_nxr_ff & NXR_RS; + + // check model has selected ROS (all models have common) + if (!(rs & NXR_APL) || BIT(m_conf->read(), 2)) + data = BIT(m_nxr[rs][m_nxr_address], (m_nxr_ff & NXR_B0) ? 0 : 8, 8); + + // increment after odd bytes + if (m_nxr_ff & NXR_B0) + m_nxr_address++; + + // toggle even/odd byte flip-flop + m_nxr_ff ^= NXR_B0; + } + + return data; +} + +void ibm5100_state::nxr_w(u8 data) +{ + m_nxr_address = (m_nxr_address << 8) | data; + + if (m_nxr_ff & NXR_PS) + { + LOG("nxr_address 0x%04x (%s)\n", m_nxr_address, machine().describe_context()); // data byte even/odd flip-flop is cleared except when BASIC is // selected and the address is odd - if ((m_e2_ff & E2_RS) && (m_e2_address & 1)) - m_e2_ff |= E2_B0; + if (!(m_nxr_ff & NXR_APL) && (m_nxr_address & 1)) + m_nxr_ff |= NXR_B0; else - m_e2_ff &= ~E2_B0; + m_nxr_ff &= ~NXR_B0; + } + + // toggle put strobe flip-flop + m_nxr_ff ^= NXR_PS; +} + +void ibm5110_state::nxr_w(u8 data) +{ + m_nxr_address = (m_nxr_address << 8) | data; + + if (m_nxr_ff & NXR_PS) + { + LOG("nxr_address 0x%04x (%s)\n", m_nxr_address, machine().describe_context()); + + m_nxr_ff &= ~NXR_B0; } // toggle put strobe flip-flop - m_e2_ff ^= E2_PS; + m_nxr_ff ^= NXR_PS; } -u8 ibm5100_state::f2_kbd_sts_r() +u8 ibm5100_state::kbd_sts_r() { if (!machine().side_effects_disabled()) { @@ -357,12 +591,13 @@ u8 ibm5100_state::f2_kbd_sts_r() { case 0x40: // keyboard data gate + m_bio_ff &= ~BIO_KI; return m_kbd->read(); case 0x80: // keyboard status gate - return m_lang->read(); + return m_lang->read() | (m_bio_ff & BIO_KI); default: - LOG("f2_kbd_sts_r: unknown 0x%02x (%s)\n", m_getb_bus, machine().describe_context()); + LOG("kbd_sts_r: unknown 0x%02x (%s)\n", m_getb_bus, machine().describe_context()); break; } } @@ -370,14 +605,14 @@ u8 ibm5100_state::f2_kbd_sts_r() return 0xff; } -void ibm5100_state::f2_kbd_ctl_w(u8 data) +void ibm5100_state::kbd_ctl_w(u8 data) { - LOG("f2_kbd_ctl_w 0x%02x (%s)\n", data, machine().describe_context()); + LOG("kbd_ctl_w 0x%02x (%s)\n", data, machine().describe_context()); // bit 6: 0=reset and disable keyboard interrupts if (!BIT(data, 6)) { - m_f2_ff &= ~F2_KIE; + m_bio_ff &= ~BIO_KIE; m_cpu->set_input_line(palm_device::IRPT_REQ3, 1); } @@ -391,9 +626,9 @@ void ibm5100_state::f2_kbd_ctl_w(u8 data) // bit 0: 0=enable keyboard interrupt if (!BIT(data, 0)) - m_f2_ff |= F2_KIE; + m_bio_ff |= BIO_KIE; else - m_f2_ff &= ~F2_KIE; + m_bio_ff &= ~BIO_KIE; } void ibm5100_state::daf_ctl_w(u8 data) @@ -404,8 +639,15 @@ void ibm5100_state::daf_ctl_w(u8 data) // 7 expansion da=8 // 6 tape da=e // 5 keyboard da=4 + if (BIT(data, 5)) + { + m_bio_ff &= ~(BIO_KI | BIO_KIE); + m_cpu->set_input_line(palm_device::IRPT_REQ3, 1); + } // 4 printer da=5 // 3 enable cycle steal + if (BIT(data, 3)) + m_bio_ff &= ~BIO_DO; // 2 reset da=b // 1 reset da=c // 0 reset da=d @@ -423,6 +665,11 @@ ROM_START(ibm5100) * BASIC card, however it is selected together with the BASIC ROS and * logically appended to the address space. */ + ROM_REGION16_BE(0x10000, "common", 0) + ROM_LOAD("c4.ros", 0x0000, 0x9000, CRC(b1abeb4a) SHA1(e0151fefe63c43c8912599615ddfb7c06f111c72)) + ROM_LOAD("e2.ros", 0x9000, 0x4800, CRC(be4289c3) SHA1(008ea7bb25fda94540bf5e02eff5a59bb1c86aac)) + ROM_FILL(0xd800, 0x2800, 0xff) + ROM_REGION16_BE(0x10000, "basic", 0) ROM_LOAD("c4.ros", 0x0000, 0x9000, CRC(b1abeb4a) SHA1(e0151fefe63c43c8912599615ddfb7c06f111c72)) ROM_LOAD("e2.ros", 0x9000, 0x4800, CRC(be4289c3) SHA1(008ea7bb25fda94540bf5e02eff5a59bb1c86aac)) @@ -442,10 +689,49 @@ ROM_START(ibm5100) * 8x8 cell, then 2x4 byte entries contain the normal and underlined lower * 4 rows of the total 8x12 cell respectively. */ - ROM_REGION(0x800, "j2", 0) + ROM_REGION(0x800, "cgr", 0) ROM_LOAD("j2.ros", 0x000, 0x800, CRC(428e5b66) SHA1(9def68eed9dc2b8f08581387f8b74b49b3faf7e7) BAD_DUMP) ROM_END +ROM_START(ibm5110) + // Executable ROS + ROM_REGION16_BE(0x8000, "l2_1", 0) + ROM_LOAD("l2_1.ros", 0x0000, 0x8000, CRC(0355894f) SHA1(c76a91cbbec226feb942ccde93ecb1637c88a01b)) + + // APL Executable ROS + ROM_REGION16_BE(0x8000, "l2_2a", 0) + ROM_LOAD("l2_2a.ros", 0x0000, 0x5000, CRC(46918be9) SHA1(bf45a44f77104c55f2ccfa462af06944e6bffe1a)) + ROM_FILL(0x5000, 0x3000, 0xff) + + // BASIC Executable ROS + ROM_REGION16_BE(0x8000, "l2_2b", 0) + ROM_LOAD("l2_2b.ros", 0x0000, 0x4000, CRC(a69dd0c1) SHA1(ecdc1363e25b72b695c517af145c50a069b6e8dc)) + ROM_FILL(0x4000, 0x3000, 0xff) + + // Common and Language non-executable ROS + ROM_REGION16_BE(0x20000, "common", 0) + ROM_LOAD("f2_c.ros", 0x0000, 0x4000, CRC(83beafb2) SHA1(80ad07a2a83ff395d918b69d5c81a6e94ac7af37)) + ROM_FILL(0x4000, 0x1c000, 0xff) + + // BASIC non-executable ROS + ROM_REGION16_BE(0x20000, "basic", 0) + ROM_LOAD("f2_b.ros", 0x0000, 0x12000, CRC(3ffb79b6) SHA1(254f5a7ae739b7bf6a800e8380cf3b6686ee9768)) + ROM_FILL(0x12000, 0x8000, 0xff) + + // APL non-executable ROS + ROM_REGION16_BE(0x20000, "apl", 0) + ROM_LOAD("e4.ros", 0x00000, 0x20000, CRC(1e28db20) SHA1(cf12893bb76c44756a9554828d42299b169e560a)) + + // Display Adapter ROS + /* + * This data was hand-made based on the character map in the documentation. + * It was assumed that the first 12 bytes of each character store the 8x12 + * cell, followed by 8x4 empty bytes. + */ + ROM_REGION(0x1000, "cgr", 0) + ROM_LOAD("g2.ros", 0x000, 0x1000, CRC(1f55161c) SHA1(eb22f3177060bd7cb4ba8facaa293147ffeceabc) BAD_DUMP) +ROM_END + static INPUT_PORTS_START(ibm5100) PORT_START("CONF") PORT_CONFNAME(0x0f, 0x0f, "Model") @@ -482,7 +768,26 @@ static INPUT_PORTS_START(ibm5100) PORT_CONFSETTING(0x40, "BASIC") PORT_CONDITION("CONF", 0x08, EQUALS, 0x08) INPUT_PORTS_END +static INPUT_PORTS_START(ibm5110) + PORT_INCLUDE(ibm5100) + + PORT_START("L2_1") + PORT_DIPNAME(0xf0, 0xf0, "Model") PORT_DIPLOCATION("L2_1:4,3,2,1") + PORT_DIPSETTING(0xf0, "5110-X1X") + PORT_DIPSETTING(0xe0, "5110-X2X") + + PORT_START("L2_2") + PORT_DIPNAME(0xf0, 0xc0, "L2_2") PORT_DIPLOCATION("L2_2:4,3,2,1") + PORT_DIPSETTING(0xc0, DEF_STR(Unknown)) + + PORT_START("K4") + PORT_DIPNAME(0x80, 0x80, "Feature ROS") PORT_DIPLOCATION("K4:1") + PORT_DIPSETTING(0x80, "Absent") + PORT_DIPSETTING(0x00, "Present") +INPUT_PORTS_END + } // anonymous namespace /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ COMP(1975, ibm5100, 0, 0, ibm5100, ibm5100, ibm5100_state, empty_init, "International Business Machines", "IBM 5100", MACHINE_NO_SOUND_HW) +COMP(1978, ibm5110, 0, 0, ibm5110, ibm5110, ibm5110_state, empty_init, "International Business Machines", "IBM 5110", 0) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index ffe861bf97175..ca3126bd15c8b 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -19805,6 +19805,7 @@ ibm3153 // @source:ibm/ibm5100.cpp ibm5100 +ibm5110 @source:ibm/ibm5550.cpp ibm5550 // From 257138175bb4c2f6b2e049e5d636c387bb9909ca Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Thu, 4 Apr 2024 14:07:19 +0100 Subject: [PATCH 014/109] msx2_flop.xml: Added 77 items (64 working), and replaced three items with better dumps. (#12214) Replaced Veldslag (Netherlands), Zeeslag (Netherlands), and Zoo (Europe) wiht better dumps. [file-hunter] New working software list items (msx2_flop.xml) ------------------------------- Mitsubishi ML-G30 [file-hunter] Atlas / Encyclopedie (Belgium) [file-hunter] Belasting Diskette 1989 (Netherlands) [file-hunter] Brainstorm (Netherlands) [file-hunter] Cheat Master (Netherlands) [file-hunter] Compass - Finally Free Edition (v1.2.09) [turbor] Copy Aid Tenka Muteki (Japan, v2.32+) [file-hunter] Copy Aid Tenka Muteki (Japan, v2.32) [file-hunter] Copy Aid Tenka Muteki (Japan, v2.30) [file-hunter] Copy Aid Tenka Muteki (Japan, v2.20) [file-hunter] Copy Aid Tenka Muteki (Japan, v2.12) [file-hunter] DemoKit Deluxe (Netherlands) [file-hunter] Disk Album 42 - MSX-C Nyuumon Jougekan (Japan) [file-hunter] DupeDisk (Netherlands, v1.02) [file-hunter] DupeDisk (Netherlands, v1.02) [file-hunter] F1 Tool Disk (Japan) [file-hunter] F1 Tool Disk II (Japan) [file-hunter] FAC Soundtracker (Netherlands, v2.0) [file-hunter] FAC Soundtracker Pro (Netherlands, v1.03) [file-hunter] FAC Soundtracker Pro (Netherlands, 1992) [file-hunter] MSX2 Disk Backup Tool - Focus (Japan, v2.0) [file-hunter] Home Office - MSX Designer (Italy) [file-hunter] Home Office 2 (Italy) [file-hunter] Image Maker & Poster 8 (Netherlands) [file-hunter] Melbrains Note (Japan?) [file-hunter] MIDI Saurus (Japan) [file-hunter] MoonBlaster (Netherlands, v1.4) [file-hunter] MoonBlaster Music #2 (Netherlands) [file-hunter] MSX BASIC Kun (Netherlands) [file-hunter] MSX Technical Guidebook - The Fourth Edition (Japan) [file-hunter] Music Editor Onchi-kun (Japan) [file-hunter] Nihongo Waupuro Bunsho Sakuzaemon (Japan) [file-hunter] Palet 2 (Netherlands) [file-hunter] PictureKit Deluxe (Netherlands) [file-hunter] Print Shop II (Japan, cracked) [file-hunter] Private School (Japan) [file-hunter] PSG Tracker (Netherlands) [file-hunter] Superscreendumper (Netherlands) [file-hunter] Synth Saurus Ver2.0 (Japan, v2.03) [file-hunter] T/Maker IV [file-hunter] De T.V. Krant (Netherlands) [file-hunter] Troubles in Town (Netherlands) [file-hunter] Turbowipe (Netherlands) [file-hunter] Ultra BASIC (Netherlands) [file-hunter] Workmate (Europe) [file-hunter] Animecha (Japan, v2.00) [tempest] Copy CAT (Japan, v2.00) [file-hunter] Developer II (Netherlands) [file-hunter] DMK Creator (v6.3) [cbsfox] DSKPRO (v11.6) [cbsfox] DSKPRO (v9.01) [cbsfox] DSKPRO (v6.51) [cbsfox] DSKPRO Light (v1.4) [cbsfox] EPROM - Extra Products ROM (Netherlands) [file-hunter] The Magical Editor (German) [file-hunter] MSX Utility Disk (Netherlands) [file-hunter] Pro-tracker (Netherlands) [file-hunter] Sampbox 2 Deluxe (Netherlands) [file-hunter] Sampbox 3 Deluxe (Netherlands) [file-hunter] Sampbox 4 Macro (Netherlands) [file-hunter] Studio FM (Netherlands) [file-hunter] Super-X (Japan, v1.2) [file-hunter] Synchro Copy [file-hunter] TwinCopy (Japan) [file-hunter] New software list items marked not working (msx2_flop.xml) ------------------------------------------ Easy Telopper II (Japan) [file-hunter] NMS 1170 (Netherlands) [file-hunter] MSX Data Communications (Netherlands, v1.7) [file-hunter] Panasonic FS-IFA1 (Japan) [file-hunter] Amimoto-san (Japan) [file-hunter] Amimoto-san 2 (Japan) [itochi] GFX9000 Toolbox [file-hunter] Graph Saurus Ver.2.1 Interlace Mode Plus (Japan) [file-hunter] Multi-Barcode (Netherlands) [file-hunter] Barad (Netherlands) [file-hunter] Philips NMS 8280 Digitiser Disk (Netherlands) [file-hunter] Print Shop II (Japan) [file-hunter] TraxPlayer [file-hunter] --- hash/msx2_flop.xml | 1087 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1071 insertions(+), 16 deletions(-) diff --git a/hash/msx2_flop.xml b/hash/msx2_flop.xml index 5040413f76d4f..d381fca53871b 100644 --- a/hash/msx2_flop.xml +++ b/hash/msx2_flop.xml @@ -22,6 +22,18 @@ The following floppies came with the machines. + + Mitsubishi ML-G30 + 1985 + Mitsubishi + + + + + + + + National FS-4600 1986 @@ -50,7 +62,7 @@ The following floppies came with the machines. - iNational FS-5000 + National FS-5000 1986 National @@ -333,6 +345,39 @@ The following floppies came with the machines. + + Easy Telopper II (Japan) + 1987 + Sony + When running on a HB-F900, a 192KB ramdisk is supposed to be created on boot. Cartridge not fully dumped? + + + + + + + + + + + + + + + + + + + + + + + + + + + + HalNote (Japan) @@ -367,6 +412,61 @@ The following floppies came with the machines. + + NMS 1170 (Netherlands) + 1986 + Philips + Included with NMS 1170 Barcode reader. NMS 1170 is not supported. + + + + + + + + + MSX Data Communications (Netherlands, v1.7) + 1987 + Philips + Included with NMS 1255 Modem package. NMS 1255 is not supported. + + + + + + + + + + Panasonic FS-IFA1 (Japan) + 1988 + Panasonic + The interface cartridge, and supported printers are not emulated. + + + + + + + + + + + + + + + + + + + + + + + + + Snatcher (Japan) 1988 @@ -963,6 +1063,34 @@ The following floppies came with the machines. + + Amimoto-san (Japan) + 1988 + MSX Magazine + Modems are not supported yet. + + + + + + + + + + + Amimoto-san 2 (Japan) + 1989 + MSX Magazine + Modems are not supported yet. + + + + + + + + + Angelus (Japan) 1988 @@ -1321,6 +1449,17 @@ The following floppies came with the machines. + + Atlas / Encyclopedie (Belgium) + 1987 + DAInamic + + + + + + + Aura Battler Dunbine (Japan) 1991 @@ -1638,6 +1777,18 @@ The following floppies came with the machines. + + Belasting Diskette 1989 (Netherlands) + 1989 + Elsevier + + + + + + + + Birdy World (Japan) 1992 @@ -1733,6 +1884,17 @@ The following floppies came with the machines. + + Brainstorm (Netherlands) + 1993 + MSX Club Gouda + + + + + + + Breaker (Netherlands) @@ -2210,6 +2372,17 @@ The following floppies came with the machines. + + Cheat Master (Netherlands) + 1992 + MSX Engiine + + + + + + + @@ -2413,6 +2586,18 @@ The following floppies came with the machines. + + Compass - Finally Free Edition (v1.2.09) + 2021 + Compjoetania + + + + + + + + Construction Tool Meizu-kun (Japan) 1989 @@ -2459,6 +2644,73 @@ The following floppies came with the machines. + + Copy Aid Tenka Muteki (Japan, v2.32+) + 1993 + SOFTPAL + + + + + + + + + + + Copy Aid Tenka Muteki (Japan, v2.32) + 1993 + SOFTPAL + + + + + + + + + + + Copy Aid Tenka Muteki (Japan, v2.30) + 1991 + SOFTPAL + + + + + + + + + + + Copy Aid Tenka Muteki (Japan, v2.20) + 1989 + SOFTPAL + + + + + + + + + + + + Copy Aid Tenka Muteki (Japan, v2.12) + 1989 + SOFTPAL + + + + + + + + + + Cosmic Psycho (Japan) 1991 @@ -3218,6 +3470,18 @@ The following floppies came with the machines. + + DemoKit Deluxe (Netherlands) + 1990 + NewVision + + + + + + + + Dennou Gakuen 1 - Cybernetic Hi-School (Japan) 1990 @@ -4648,6 +4912,19 @@ The following floppies came with the machines. + + Disk Album 42 - MSX-C Nyuumon Jougekan (Japan) + 1991 + ASCII + + + + + + + + + Disk Mystery #4 - The Man I Love (Japan) 1988 @@ -5601,6 +5878,17 @@ The following floppies came with the machines. + + DupeDisk (Netherlands, v1.02) + 1992 + U.M.F. + + + + + + + Dynamic Publisher (Spain) 1988 @@ -6183,6 +6471,70 @@ The following floppies came with the machines. + + F1 Tool Disk (Japan) + 1988 + Sony + This software came with Sony HB-F1XD, HBD-F1, and HBD-20W machines in early 1988. + + + + + + + + + + + F1 Tool Disk II (Japan) + 1989 + Sony + This software came with Sony HB-F1XDJ computer or HBP-F1C printer in early 1989. + + + + + + + + + + + FAC Soundtracker (Netherlands, v2.0) + 1991 + MSX-Club West-Friesland + + + + + + + + + + FAC Soundtracker Pro (Netherlands, v1.03) + 1994 + MSX-Club West-Friesland + + + + + + + + + + FAC Soundtracker Pro (Netherlands, 1992) + 1992 + MK Public Domain + + + + + + + + Fahrenheit 451 (Spain, cracked) 1986 @@ -6558,6 +6910,19 @@ The following floppies came with the machines. + + MSX2 Disk Backup Tool - Focus (Japan, v2.0) + 1988 + I.C.C. + + + + + + + + + For The Day II (Korea) 1990 @@ -7067,6 +7432,43 @@ The following floppies came with the machines. + + GFX9000 Toolbox + 2003 + Sunrise for MSX + GFX9000 is not emulated. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Giddy Runner (Japan) 1990 @@ -7464,10 +7866,10 @@ The following floppies came with the machines. - Graph Saurus v1.0 (Japan) + Graph Saurus Ver1.0 (Japan) 1989 Bit² - + @@ -7478,10 +7880,10 @@ The following floppies came with the machines. - Graph Saurus v2.0 (Japan) + Graph Saurus Ver2.0 (Japan) 1991 Bit² - + @@ -7567,6 +7969,23 @@ The following floppies came with the machines. + + Graph Saurus Ver.2.1 Interlace Mode Plus (Japan) + 1993 + Bit² + + + + + + + + + + + + + Greatest Driver (Japan) 1988 @@ -8120,6 +8539,28 @@ The following floppies came with the machines. + + Home Office - MSX Designer (Italy) + 1986 + Philips + + + + + + + + + Home Office 2 (Italy) + 1986 + Philips + + + + + + + Hot Milk (Japan) 1989 @@ -8324,6 +8765,17 @@ The following floppies came with the machines. + + Image Maker & Poster 8 (Netherlands) + 1990 + MSX Gids + + + + + + + Inindou - Datou Nobunaga (Japan) 1991 @@ -10196,6 +10648,18 @@ The following floppies came with the machines. + + + Melbrains Note (Japan?) + 1986 + Mel Software + + + + + + + Membership Golf (Japan) 1989 @@ -10376,6 +10840,31 @@ The following floppies came with the machines. + + MIDI Saurus (Japan) + 1990 + Bit² + Before starting the software the system will be rebooted automatically. + + + + + + + + + + + + + + + + + + + + Might and Magic II - Gates to Another World (Japan) 1989 @@ -10553,6 +11042,56 @@ The following floppies came with the machines. + + MoonBlaster (Netherlands, v1.4) + 1992 + Stichting Sunrise + + + + + + + + + + + + + + + + + + + + + + + MoonBlaster Music #2 (Netherlands) + 1993 + Stichting Sunrise + + + + + + + + + + + + MSX BASIC Kun (Netherlands) + 1988 + Sparrowsoft + + + + + + + MSX-FAN Fandom Library 4 (Japan) 1988 @@ -10784,6 +11323,19 @@ The following floppies came with the machines. + + MSX Technical Guidebook - The Fourth Edition (Japan) + 1991 + ASCAT + + + + + + + + + MSX Train (Japan) 1993 @@ -10839,6 +11391,42 @@ The following floppies came with the machines. + + Multi-Barcode (Netherlands) + 1991 + Club van Zes + Barcode reader/pen is not supported. + + + + + + + + + Barad (Netherlands) + 1991 + Club van Zes + Barcode reader/pen is not supported. + + + + + + + + + Music Editor Onchi-kun (Japan) + 1988 + Winky Soft + + + + + + + + Naoko no Daihitsu (Japan) 1988 @@ -10928,6 +11516,28 @@ The following floppies came with the machines. + + Nihongo Waupuro Bunsho Sakuzaemon (Japan) + 1988 + Sony + + + + + + + + + + + + + + + + + + Nike (Japan) 1991 @@ -11417,6 +12027,18 @@ The following floppies came with the machines. + + Palet 2 (Netherlands) + 1987 + Sparrowsoft + + + + + + + + Pana Amusement Collection Disc (Japan) 1988 @@ -11818,6 +12440,18 @@ The following floppies came with the machines. + + Philips NMS 8280 Digitiser Disk (Netherlands) + 1995 + MSX-Club West-Friesland + Digitising is not supported. + + + + + + + PIAS - Hikisakareta Seishun (Japan) 1991 @@ -11837,6 +12471,18 @@ The following floppies came with the machines. + + PictureKit Deluxe (Netherlands) + 1990 + NewVision + + + + + + + + Pink Sox 1 (Japan, hacked) @@ -12456,7 +13102,7 @@ The following floppies came with the machines. - + @@ -12490,6 +13136,51 @@ The following floppies came with the machines. + + Print Shop II (Japan) + 1989 + Sony + Seems to be protected. Title screen loads over and over. + + + + + + + + + + + + + + + + + + + + Print Shop II (Japan, cracked) + 1989 + Sony + + + + + + + + + + + + + + + + + + Pro Yakyu Fan (Japan) 1988 @@ -12502,6 +13193,17 @@ The following floppies came with the machines. + + PSG Tracker (Netherlands) + 1992 + Flying Bytes + + + + + + + Psychic War - Cosmic Soldier 2 (Japan) 1987 @@ -15138,6 +15840,18 @@ The following floppies came with the machines. + + Superscreendumper (Netherlands) + 1988 + Sparrowsoft + + + + + + + + Jong Borg Suzume (Japan) 1990 @@ -15172,11 +15886,27 @@ The following floppies came with the machines. - - Synth Saurus v2.0 (Japan) + + + Synth Saurus Ver2.0 (Japan, v2.03) + 1989 + Bit² + + + + + + + + + + + + + Synth Saurus Ver2.0 (Japan) 1989 Bit² - + @@ -15198,6 +15928,38 @@ The following floppies came with the machines. + + T/Maker IV + 1985 + Sony + + + + + + + + + + + + + + + + + + De T.V. Krant (Netherlands) + 1987 + Oasis + + + + + + + + TNT (France) @@ -15876,6 +16638,17 @@ The following floppies came with the machines. + + Troubles in Town (Netherlands) + 1991 + MK Public Domain + + + + + + + Toushin Toshi (Japan) 1990 @@ -16101,6 +16874,17 @@ The following floppies came with the machines. + + Turbowipe (Netherlands) + 1991 + NewVision + + + + + + + Twinkle Star - Hoshi no Mahou Tsukai (Japan) 1990 @@ -16185,6 +16969,18 @@ The following floppies came with the machines. + + Ultra BASIC (Netherlands) + 1988 + MSX Gids + + + + + + + + Undead Line (Japan) 1989 @@ -16806,6 +17602,17 @@ The following floppies came with the machines. + + Workmate (Europe) + 1989 + Checkmark + + + + + + + @@ -18005,14 +18812,13 @@ The following floppies came with the machines. - Zoo (Europe) 1989 Radarsoft - - + + @@ -18241,6 +19047,19 @@ HOMEBREW + + Animecha (Japan, v2.00) + 1995 + Tempest + + + + + + + + + Anma's Amusement Disk (Netherlands) 1992 @@ -18967,6 +19786,18 @@ HOMEBREW + + Copy CAT (Japan, v2.00) + 1991 + TAC + + + + + + + + Coral 2 (Netherlands, demo) 2004 @@ -19159,6 +19990,18 @@ HOMEBREW + + Developer II (Netherlands) + 1989 + MSX Gids + + + + + + + + Dimies 1991 @@ -19242,6 +20085,17 @@ HOMEBREW + + DMK Creator (v6.3) + 2017 + Pirates do Caribe + + + + + + + Dominon X 2017 @@ -19346,6 +20200,54 @@ HOMEBREW + + DSKPRO (v11.6) + 2017 + Pirates do Caribe + Does not start on all systems. + + + + + + + + + DSKPRO (v9.01) + 2015 + Pirates do Caribe + + + + + + + + + + DSKPRO (v6.51) + 2014 + Pirates do Caribe + + + + + + + + + + DSKPRO Light (v1.4) + 2021 + Pirates do Caribe + + + + + + + + DuckTales (English) 1994 @@ -19438,6 +20340,17 @@ HOMEBREW + + EPROM - Extra Products ROM (Netherlands) + 1996 + UMF Noord-Holland + + + + + + + Erotic Pac #1 (France) 1989 @@ -20642,6 +21555,17 @@ HOMEBREW + + The Magical Editor (German) + 1992 + Sven Paschukat, Daniel Simon, Wolfgang Friedrich + + + + + + + Magical Labyrinth Remix (Japan, download) 2020 @@ -21103,6 +22027,17 @@ HOMEBREW + + MSX Utility Disk (Netherlands) + 1989 + MSX Gids + + + + + + + MSX-Debugger (Netherlands, v1.30) 1990 @@ -21733,6 +22668,17 @@ HOMEBREW + + Pro-tracker (Netherlands) + 1991 + Tyfoon Software + + + + + + + Psycho Ball (Netherlands) 1993 @@ -22243,6 +23189,42 @@ HOMEBREW + + Sampbox 2 Deluxe (Netherlands) + 199? + Z800 + + + + + + + + + + Sampbox 3 Deluxe (Netherlands) + 199? + Z800 + + + + + + + + + + Sampbox 4 Macro (Netherlands) + 1994 + N.O.P. + + + + + + + + Sanriku Ouja #0 (Japan) 1997 @@ -22701,6 +23683,17 @@ HOMEBREW + + Studio FM (Netherlands) + 1991 + MSX-Engine + + + + + + + Sum the Missile Human (Japan) 1989 @@ -22725,6 +23718,29 @@ HOMEBREW + + Super-X (Japan, v1.2) + 1994 + Romi + + + + + + + + + + Synchro Copy + 1993 + E.I Soft + + + + + + + Tamanegitori Game (Japan) 19?? @@ -22911,6 +23927,33 @@ HOMEBREW + + TraxPlayer + 1994 + N.O.P. + Loading from example disks results in errors. + + + + + + + + + + + + + + + + + + + + + + Trojka (Netherlands) 1992 @@ -23016,6 +24059,18 @@ HOMEBREW + + TwinCopy (Japan) + 1991 + P.T.O. + + + + + + + + The UHF Painter (Italy) 1992 @@ -23033,8 +24088,8 @@ HOMEBREW MSX Club West Friesland Requires two MSX computers to be connected through joystick ports using a joynet cable. - - + + @@ -23232,8 +24287,8 @@ HOMEBREW MSX Club West Friesland Requires two MSX computers to be connected through joystick ports using a joynet cable. - - + + From bd398c51a367c948b2c236ec29056dd739c080b6 Mon Sep 17 00:00:00 2001 From: ArcadeShadow Date: Thu, 4 Apr 2024 15:40:31 +0100 Subject: [PATCH 015/109] saturn.xml: Added language info elements, and corrected parent/clone relationships for Rayman games. (#12091) --- hash/saturn.xml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/hash/saturn.xml b/hash/saturn.xml index a12d384d6170c..7da53e7df1304 100644 --- a/hash/saturn.xml +++ b/hash/saturn.xml @@ -2594,6 +2594,7 @@ Olympic Soccer (Fra) T-7904H-09 Alien Trilogy (Japan) 1996 Acclaim Japan + @@ -9675,6 +9676,7 @@ Sega logo animation draws offset [VDP2] Alien Trilogy (Japan, alt) 1996 Acclaim Japan + @@ -14946,6 +14948,7 @@ Sega logo animation draws offset [VDP2] Alien Trilogy (Japan, alt 2) 1996 Acclaim Japan + @@ -30198,6 +30201,7 @@ Sega logo animation draws offset [VDP2] Alien Trilogy (Europe) 1996 Acclaim Entertainment + @@ -30212,6 +30216,7 @@ Sega logo animation draws offset [VDP2] Alien Trilogy (Germany) 1996 Acclaim Entertainment + @@ -34286,7 +34291,7 @@ Sega logo animation draws offset [VDP2] - CrimeWave Playable Demonstration Disk (Europe) + CrimeWave Playable Demonstration Disk - Not For Resale (Europe) 1997 Eidos @@ -34716,6 +34721,7 @@ Sega logo animation draws offset [VDP2] Alien Trilogy (USA) 1996 Acclaim Entertainment + @@ -37208,7 +37214,7 @@ Sega logo animation draws offset [VDP2] - + Rayman (USA) 1995 Ubi Soft @@ -39099,7 +39105,7 @@ Sega logo animation draws offset [VDP2] - + Rayman (prototype 19950720) 1995 Ubi Soft From 346051aef7041a4b3c41e93c53891538bd009631 Mon Sep 17 00:00:00 2001 From: ICEknigh7 <47050710+ICEknigh7@users.noreply.github.com> Date: Thu, 4 Apr 2024 17:59:09 +0200 Subject: [PATCH 016/109] megadriv.xml: Added and corrected info on the Sega Game Toshokan games. (#12172) * Added a list of missing Sega Game Toshokan games to the header comment. * Updated years to match Sega's web site. * Use Hepburn romaji for "Game Kanzume" and clarified which release games are ripped from. --- hash/megadriv.xml | 99 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 74 insertions(+), 25 deletions(-) diff --git a/hash/megadriv.xml b/hash/megadriv.xml index d5be28f6e4f90..25cfcfc456218 100644 --- a/hash/megadriv.xml +++ b/hash/megadriv.xml @@ -61,6 +61,54 @@ Known undumped pirates * Shizen Mahjong / Competition Mahjong (by Sachen, apparently dumped but hoarded) * Magic 7 Block - 百変七巧板 +Sega Game Toshokan games could be downloaded via the Mega Modem while a +subscription was active. The existing dumps were either extracted from +Sega's B-Club! game rental service or ripped from the Game no Kanzume +compilations released on the Mega-CD. + +Known missing entries from the Sega Game Toshokan service + + * Columns (1991) + * Flicky (1990) + * Kinetic Connection ① Nei Sword (1991) + * Kinetic Connection ② Ohana Batake (1991) + * Kinetic Connection ③ Shirogane wa Warau yo (1991) + * Kinetic Connection ④ Mogura no Oasobi (1991) + * Kinetic Connection ⑤ Lightning Nei (1991) + * Phantasy Star II - Nei's Adventure (2008) (Sega Ages 2500 Series Vol. 32) + * Pyramid Magic Editor (1991) + * Pyramid Magic Editor (1991) + * Pyramid Magic Soushuuhen (1992) + * Pyramid Magic Yokokuhen (1990) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 8-gatsu Vol. 2 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 8-gatsu Vol. 3 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 8-gatsu Vol. 4 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 8-gatsu Vol. 5 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 9-gatsu Vol. 1 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 9-gatsu Vol. 2 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 10-gatsu Vol. 1 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 10-gatsu Vol. 2 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 11-gatsu Vol. 1 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 11-gatsu Vol. 2 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 12-gatsu Vol. 1 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 12-gatsu Vol. 2 (1991) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 1-gatsu Vol. 1 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 1-gatsu Vol. 2 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 2-gatsu Vol. 1 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 2-gatsu Vol. 2 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 3-gatsu Vol. 1 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 3-gatsu Vol. 2 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 4-gatsu Vol. 1 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 4-gatsu Vol. 2 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 5-gatsu Vol. 1 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 5-gatsu Vol. 2 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 6-gatsu Vol. 1 (1992) + * Riddle Wired - Quiz Dokusen Kigyou no Houkai 6-gatsu Vol. 2 (1992) + * Sega Music Collection Phantasy Star III (1991) + * Sega Music Collection Bonanza Brothers (1991) + * Sega Music Collection Sonic The Hedgehog (1991) + * Taiketsu! Columns (1991) + TODO: - Phantasy Star (serial G-4534, pstarjmd) is actually a SMS cart in MD shell, which works in the MD thanks to VDP compatibility mode. @@ -10128,8 +10176,8 @@ but dumps still have to be confirmed. - 16t (Japan, Game no Kandume MegaCD rip) - 1991 + 16t (Japan, ripped from Game no Kanzume Vol. 2) + 1994 Sega @@ -15589,7 +15637,7 @@ https://bootleggames.fandom.com/wiki/Chaoji_Dafuweng Ikazuse! Koi no Doki Doki Penguin Land MD (Japan, Sega Game Toshokan) - 1991 + 1992 Sega @@ -15599,8 +15647,8 @@ https://bootleggames.fandom.com/wiki/Chaoji_Dafuweng - Ikazuse! Koi no Doki Doki Penguin Land MD (Japan, Game no Kandume MegaCD rip) - 1991 + Ikazuse! Koi no Doki Doki Penguin Land MD (Japan, ripped from Game no Kanzume Vol. 2) + 1994 Sega @@ -17042,7 +17090,7 @@ https://segaretro.org/Elitserien_96 Shi no Meikyuu - Labyrinth of Death (Japan, Sega Game Toshokan) - 1991 + 1990 Sega @@ -17052,8 +17100,8 @@ https://segaretro.org/Elitserien_96 - Shi no Meikyuu - Labyrinth of Death (Japan, Game no Kandume MegaCD rip) - 1991 + Shi no Meikyuu - Labyrinth of Death (Japan, ripped from Game no Kanzume Vol. 2) + 1994 Sega @@ -17678,12 +17726,12 @@ https://segaretro.org/Feng_Shen_Ying_Jie_Chuan - Game no Kandume Otokuyou (Japan) + Game no Kanzume Otokuyou (Japan, Sega Channel) 1995 - <unknown> + Sega - + @@ -18557,8 +18605,8 @@ Unemulated [Sega Mega Modem] features - Hyper Marbles (Japan, Game no Kandume MegaCD rip) - 1991 + Hyper Marbles (Japan, ripped from Game no Kanzume Vol. 1) + 1994 Sega @@ -23781,8 +23829,8 @@ Black screen at intro - Paddle Fighter (Japan, Game no Kandume MegaCD rip) - 1991 + Paddle Fighter (Japan, ripped from Game no Kanzume Vol. 1) + 1994 Sega @@ -24114,7 +24162,7 @@ Black screen at intro Phantasy Star II - Amia's Adventure (Japan, Sega Game Toshokan) - 1991 + 1990 Sega @@ -24147,7 +24195,7 @@ Black screen at intro Phantasy Star II - Kinds's Adventure (Japan, Sega Game Toshokan) - 1991 + 1990 Sega @@ -24180,7 +24228,7 @@ Black screen at intro Phantasy Star II - Shilka's Adventure (Japan, Sega Game Toshokan) - 1991 + 1990 Sega @@ -25065,7 +25113,7 @@ Black screen Putter Golf (Japan, Sega Game Toshokan) - 1991 + 1990 Sega @@ -25075,8 +25123,8 @@ Black screen - Putter Golf (Japan, Game no Kandume MegaCD rip) - 1991 + Putter Golf (Japan, ripped from Game no Kanzume Vol. 2) + 1994 Sega @@ -25181,8 +25229,8 @@ Black screen - Pyramid Magic (Japan, Game no Kandume MegaCD rip) - 1991 + Pyramid Magic (Japan, ripped from Game no Kanzume Vol. 1) + 1994 Sega @@ -25787,10 +25835,11 @@ Red screen - - Riddle Wired (Japan, Sega Game Toshokan) + + Riddle Wired - Quiz Dokusen Kigyou no Houkai 8-gatsu Vol. 1 (Japan, Sega Game Toshokan) 1991 Sega + From b43b6fc1178c2d206517d4b69dea579f32b8b641 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Fri, 5 Apr 2024 12:14:39 +0700 Subject: [PATCH 017/109] ibm5100: avoid config.replace() --- src/mame/ibm/ibm5100.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/mame/ibm/ibm5100.cpp b/src/mame/ibm/ibm5100.cpp index 533cfd814871c..0d4adb5675708 100644 --- a/src/mame/ibm/ibm5100.cpp +++ b/src/mame/ibm/ibm5100.cpp @@ -51,6 +51,7 @@ class ibm5100_state : public driver_device { } + void common(machine_config &config); void ibm5100(machine_config &config); protected: @@ -263,7 +264,7 @@ void ibm5100_state::cpu_iod_map(address_map &map) map(0xf, 0xf).noprw(); } -void ibm5100_state::ibm5100(machine_config &config) +void ibm5100_state::common(machine_config &config) { PALM(config, m_cpu, 15'091'200); m_cpu->set_addrmap(palm_device::AS_ROS, &ibm5100_state::cpu_ros_map); @@ -281,6 +282,11 @@ void ibm5100_state::ibm5100(machine_config &config) SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_raw(15'091'200, 64*10+15, 0, 64*10, 16*12*2, 0, 16*12*2); m_screen->set_screen_update(FUNC(ibm5100_state::screen_update)); +} + +void ibm5100_state::ibm5100(machine_config &config) +{ + ibm5100_state::common(config); IBM5100_KEYBOARD(config, m_kbd); m_kbd->strobe().set( @@ -293,7 +299,7 @@ void ibm5100_state::ibm5100(machine_config &config) void ibm5110_state::ibm5110(machine_config &config) { - ibm5100_state::ibm5100(config); + ibm5100_state::common(config); m_cpu->program_level().set( [this](int state) @@ -304,7 +310,7 @@ void ibm5110_state::ibm5110(machine_config &config) m_exr.select(BIT(m_lang->read(), 6)); }); - IBM5110_KEYBOARD(config.replace(), m_kbd); + IBM5110_KEYBOARD(config, m_kbd); m_kbd->strobe().set( [this](int state) { From ca7daca08f78d85deb5c0b1af974f208063265df Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Fri, 5 Apr 2024 12:18:05 +0700 Subject: [PATCH 018/109] mips1: avoid sgi 4d1-3b panic * bump r2000 processor revision to avoid emulating a tlb bug --- src/devices/cpu/mips/mips1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/cpu/mips/mips1.cpp b/src/devices/cpu/mips/mips1.cpp index dafef5bea3fa6..8ba1509b9d317 100644 --- a/src/devices/cpu/mips/mips1.cpp +++ b/src/devices/cpu/mips/mips1.cpp @@ -237,7 +237,7 @@ mips1_device_base::mips1_device_base(machine_config const &mconfig, device_type } r2000_device::r2000_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock, size_t icache_size, size_t dcache_size) - : mips1_device_base(mconfig, R2000, tag, owner, clock, 0x0100, icache_size, dcache_size, false) + : mips1_device_base(mconfig, R2000, tag, owner, clock, 0x0120, icache_size, dcache_size, false) { } From f77ddc55bd024b3c45cf5b7508f2fe4c99156440 Mon Sep 17 00:00:00 2001 From: ClawGrip Date: Fri, 5 Apr 2024 15:31:10 +0200 Subject: [PATCH 019/109] midway/astrocde.cpp: Added a version of Gorf licensed to Irecsa for Spanish distributio. (#12220) New working clone --------------------- Gorf (Spain, Irecsa license) [Recreativas.org] --- src/mame/mame.lst | 1 + src/mame/midway/astrocde.cpp | 55 ++++++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index ca3126bd15c8b..e0a9308706558 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -27384,6 +27384,7 @@ rotaryf // demndrgn // (c) 1982 Bally Midway ebases // (c) 1980 gorf // (c) 1981 +gorfirec // (c) 1981 gorfpgm1 // (c) 1981 gorfpgm1f // (c) 1981 gorfpgm1g // (c) 1981 diff --git a/src/mame/midway/astrocde.cpp b/src/mame/midway/astrocde.cpp index 3067d15bd571d..7c8e1ed800d7a 100644 --- a/src/mame/midway/astrocde.cpp +++ b/src/mame/midway/astrocde.cpp @@ -965,6 +965,15 @@ static INPUT_PORTS_START( gorfpgm1g ) PORT_DIPSETTING( 0x00, "Foreign (German ROM)" ) INPUT_PORTS_END +static INPUT_PORTS_START( gorfirec ) + PORT_INCLUDE(gorf) + + PORT_MODIFY("P4HANDLE") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Language ) ) PORT_DIPLOCATION("S1:4") + PORT_DIPSETTING( 0x08, DEF_STR( Spanish ) ) + PORT_DIPSETTING( 0x00, "Foreign (NEED ROM)" ) // "Requires A082-91374-A000" +INPUT_PORTS_END + static INPUT_PORTS_START( robby ) PORT_START("P1HANDLE") @@ -1647,6 +1656,20 @@ ROM_START( gorfpgm1g ) ROM_LOAD( "german.x11", 0xc000, 0x1000, CRC(3a3dbdcb) SHA1(e20895d41d66d1a23cc445e4ae4628b16ebf83f2) ) ROM_END +/* PCB engraved as "MIDWAY MFC A IRECSA". + ROM test fails in test mode, it seems Irecsa didn't bother to change the checksums. */ +ROM_START( gorfirec ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "a.bin", 0x0000, 0x1000, CRC(97cb4a6a) SHA1(efdae9a437c665fb861665a38c6cb13fd848ad91) ) + ROM_LOAD( "b.bin", 0x1000, 0x1000, CRC(e35701c0) SHA1(30794aa97e1ec1c949f74e20a830224e1b5ae8b8) ) + ROM_LOAD( "c.bin", 0x2000, 0x1000, CRC(16b0638b) SHA1(65e1e2e4df80140976915e0982ce3219b14beece) ) + ROM_LOAD( "d.bin", 0x3000, 0x1000, CRC(0dccdfc4) SHA1(f55217e98169df41b8906f880ac78a2d0d56f68a) ) + ROM_LOAD( "e.bin", 0x8000, 0x1000, CRC(8e82804b) SHA1(24250edb30efa63c80514629c86c9372b7ca3020) ) + ROM_LOAD( "f.bin", 0x9000, 0x1000, CRC(715fb4d9) SHA1(c9f33162093e6ed7e3cb6bb716419e5bc43c0381) ) + ROM_LOAD( "g.bin", 0xa000, 0x1000, CRC(fb5b7131) SHA1(865ec4f912418f08ff08910ddd61ac7ebd7b30d5) ) + ROM_LOAD( "h.bin", 0xb000, 0x1000, CRC(578ade88) SHA1(78a27e08aeef7acb648ab9db62a3e87720792aff) ) +ROM_END + ROM_START( robby ) ROM_REGION( 0x10000, "maincpu", 0 ) @@ -1844,31 +1867,33 @@ void astrocde_state::init_tenpindx() * *************************************/ -/* 90002 CPU board + 90700 game board + 91312 "characterization card" */ +// 90002 CPU board + 90700 game board + 91312 "characterization card" GAMEL( 1978, seawolf2, 0, seawolf2, seawolf2, seawolf2_state, init_seawolf2, ROT0, "Dave Nutting Associates / Midway", "Sea Wolf II", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_seawolf2 ) -/* 91354 CPU board + 90700 game board + 91356 RAM board */ +// 91354 CPU board + 90700 game board + 91356 RAM board GAMEL( 1980, ebases, 0, ebases, ebases, ebases_state, init_ebases, ROT0, "Dave Nutting Associates / Midway", "Extra Bases", MACHINE_SUPPORTS_SAVE, layout_spacezap ) -/* 91354 CPU board + 90706 game board + 91356 RAM board + 91355 pattern board */ +// 91354 CPU board + 90706 game board + 91356 RAM board + 91355 pattern board GAMEL( 1980, spacezap, 0, spacezap, spacezap, astrocde_state, init_spacezap, ROT0, "Midway", "Space Zap (Midway)", MACHINE_SUPPORTS_SAVE, layout_spacezap ) // there's also an older version by Game-A-Tron on different hardware -/* 91354 CPU board + 90708 game board + 91356 RAM board + 91355 pattern board + 91397 memory board */ -GAME( 1980, wow, 0, wow, wow, astrocde_state, init_wow, ROT0, "Dave Nutting Associates / Midway", "Wizard of Wor", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1980, wowg, wow, wow, wowg, astrocde_state, init_wow, ROT0, "Dave Nutting Associates / Midway", "Wizard of Wor (with German Language ROM)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +// 91354 CPU board + 90708 game board + 91356 RAM board + 91355 pattern board + 91397 memory board +GAME( 1980, wow, 0, wow, wow, astrocde_state, init_wow, ROT0, "Dave Nutting Associates / Midway", "Wizard of Wor", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1980, wowg, wow, wow, wowg, astrocde_state, init_wow, ROT0, "Dave Nutting Associates / Midway", "Wizard of Wor (with German language ROM)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) + +// 91354 CPU board + 90708 game board + 91356 RAM board + 91355 pattern board + 91364 ROM/RAM board +GAMEL( 1981, gorf, 0, gorf, gorf, astrocde_state, init_gorf, ROT270, "Dave Nutting Associates / Midway", "Gorf", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gorf ) +GAMEL( 1981, gorfpgm1, gorf, gorf, gorf, astrocde_state, init_gorf, ROT270, "Dave Nutting Associates / Midway", "Gorf (program 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gorf ) +GAMEL( 1981, gorfpgm1f, gorf, gorf, gorfpgm1f, astrocde_state, init_gorf, ROT270, "Dave Nutting Associates / Midway", "Gorf (program 1, with French language ROM)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gorf ) +GAMEL( 1981, gorfpgm1g, gorf, gorf, gorfpgm1g, astrocde_state, init_gorf, ROT270, "Dave Nutting Associates / Midway", "Gorf (program 1, with German language ROM)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gorf ) +GAMEL( 1981, gorfirec, gorf, gorf, gorfirec, astrocde_state, init_gorf, ROT270, "Dave Nutting Associates / Midway (Irecsa license)", "Gorf (Spain, Irecsa license)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gorf ) -/* 91354 CPU board + 90708 game board + 91356 RAM board + 91355 pattern board + 91364 ROM/RAM board */ -GAMEL( 1981, gorf, 0, gorf, gorf, astrocde_state, init_gorf, ROT270, "Dave Nutting Associates / Midway", "Gorf", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gorf ) -GAMEL( 1981, gorfpgm1, gorf, gorf, gorf, astrocde_state, init_gorf, ROT270, "Dave Nutting Associates / Midway", "Gorf (program 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gorf ) -GAMEL( 1981, gorfpgm1f, gorf, gorf, gorfpgm1f, astrocde_state, init_gorf, ROT270, "Dave Nutting Associates / Midway", "Gorf (program 1, with French Language ROM)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gorf ) -GAMEL( 1981, gorfpgm1g, gorf, gorf, gorfpgm1g, astrocde_state, init_gorf, ROT270, "Dave Nutting Associates / Midway", "Gorf (program 1, with German Language ROM)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_gorf ) -/* 91354 CPU board + 90708 game board + 91356 RAM board + 91355 pattern board + 91423 memory board */ +// 91354 CPU board + 90708 game board + 91356 RAM board + 91355 pattern board + 91423 memory board GAME( 1981, robby, 0, robby, robby, astrocde_state, init_robby, ROT0, "Dave Nutting Associates / Bally Midway", "The Adventures of Robby Roto!", MACHINE_SUPPORTS_SAVE ) -/* 91465 CPU board + 91469 game board + 91466 RAM board + 91488 pattern board + 91467 memory board + 91846 EPROM board */ +// 91465 CPU board + 91469 game board + 91466 RAM board + 91488 pattern board + 91467 memory board + 91846 EPROM board GAME( 1983, profpac, 0, profpac, profpac, astrocde_state, init_profpac, ROT0, "Dave Nutting Associates / Bally Midway", "Professor Pac-Man", MACHINE_SUPPORTS_SAVE ) -/* 91465 CPU board + 91699 game board + 91466 RAM board + 91488 pattern board + 91467 memory board */ +// 91465 CPU board + 91699 game board + 91466 RAM board + 91488 pattern board + 91467 memory board GAME( 1982, demndrgn, 0, demndrgn, demndrgn, demndrgn_state, init_demndrgn, ROT0, "Dave Nutting Associates / Bally Midway", "Demons & Dragons (prototype)", MACHINE_IS_INCOMPLETE | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) -GAMEL( 1983, tenpindx, 0, tenpindx, tenpindx, tenpindx_state, init_tenpindx, ROT0, "Dave Nutting Associates / Bally Midway", "Ten Pin Deluxe", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL, layout_tenpindx ) +GAMEL( 1983, tenpindx, 0, tenpindx, tenpindx, tenpindx_state, init_tenpindx, ROT0, "Dave Nutting Associates / Bally Midway", "Ten Pin Deluxe", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL, layout_tenpindx ) From dc77e03d7f5286b6a69237141fd3c3ba6ac1b8be Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Fri, 5 Apr 2024 19:58:21 +0200 Subject: [PATCH 020/109] New systems marked not working ------------------------------ Hammer Champ (Japan) [Hammy] --- src/emu/xtal.cpp | 1 + src/mame/mame.lst | 5 +- src/mame/pinball/mrgame.cpp | 16 +- src/mame/seta/namcoeva.cpp | 378 ++++++++++++++++++++++++++++++++++++ src/mame/seta/seta2.cpp | 1 + src/mame/seta/seta2.h | 2 - 6 files changed, 392 insertions(+), 11 deletions(-) create mode 100644 src/mame/seta/namcoeva.cpp diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp index 2569c4a617deb..592cb52275659 100644 --- a/src/emu/xtal.cpp +++ b/src/emu/xtal.cpp @@ -380,6 +380,7 @@ const double XTAL::known_xtals[] = { 26'601'712, /* 26.601712_MHz_XTAL Astro Corp.'s Show Hand, PAL Vtech/Yeno Socrates (6x PAL subcarrier) */ 26'666'000, /* 26.666_MHz_XTAL Imagetek I4220/I4300 */ 26'666'666, /* 26.666666_MHz_XTAL Irem M92 but most use 27MHz */ + 26'670'000, /* 26.670_MHz_XTAL Namco EVA */ 26'686'000, /* 26.686_MHz_XTAL Typically used on 90's Taito PCBs to drive the custom chips */ 26'824'000, /* 26.824_MHz_XTAL Astro Corp.'s Zoo */ 26'880'000, /* 26.88_MHz_XTAL Roland RF5C36/SA-16 clock (30000 * 896) */ diff --git a/src/mame/mame.lst b/src/mame/mame.lst index e0a9308706558..7e15116fc0d6b 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -41028,6 +41028,9 @@ macsbios // yujan // (C) 1999 Yubis yuka // (c) 1999 Yubis +@source:seta/namcoeva.cpp +hammerch // + @source:seta/seta.cpp atehate // (C) 1993 Athena blandia // (c) 1992 Allumer @@ -41119,11 +41122,11 @@ gundamex // (c) 1994 Banpresto mj4simai // (c) 1996 Maboroshi Ware myangel // (c) 1996 Namco myangel2 // (c) 1997 Namco -staraudi // (c) 1997 Namco namcostr // (c) 2000 Namco penbros // (c) 2000 Subsino pzlbowl // (c) 1999 Nihon System / Moss reelquak // (c) 1997 +staraudi // (c) 1997 Namco telpacfl // (c) 1996 Sunsoft trophyh // (c) 2002 Sammy USA Corporation trophyht // (c) 2002 Sammy USA Corporation diff --git a/src/mame/pinball/mrgame.cpp b/src/mame/pinball/mrgame.cpp index aff5a7c020094..8efd90dd314f3 100644 --- a/src/mame/pinball/mrgame.cpp +++ b/src/mame/pinball/mrgame.cpp @@ -856,7 +856,7 @@ ROM_START(motrshowb) ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97)) ROM_REGION(0x10000, "chargen", 0) - ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db)) + ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db)) // a PCB has been found with this ROM edited to blank the Zaccaria copyright ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(1664ec8d) SHA1(e7b15acdac7dfc51b668e908ca95f02a2b569737)) ROM_REGION(0x0020, "proms", 0) @@ -974,10 +974,10 @@ ROM_END } // anonymous namespace -GAME(1988, dakar, 0, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Dakar", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) -GAME(1989, fasttrack, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Fast Track", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) -GAME(1989, motrshow, 0, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Motor Show (set 1)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) -GAME(1989, motrshowa, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Motor Show (set 2)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) -GAME(1989, motrshowb, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Motor Show (set 3)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) -GAME(1990, macattck, 0, macattck, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Mac Attack", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) -GAME(1990, wcup90, 0, wcup90, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "World Cup 90", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1988, dakar, 0, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Dakar", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1989, fasttrack, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Fast Track", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1989, motrshow, 0, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Zaccaria / Mr Game", "Motor Show (set 1)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1989, motrshowa, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Zaccaria / Mr Game", "Motor Show (set 2)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1989, motrshowb, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Zaccaria / Mr Game", "Motor Show (set 3)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1990, macattck, 0, macattck, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Mac Attack", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1990, wcup90, 0, wcup90, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "World Cup 90", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/seta/namcoeva.cpp b/src/mame/seta/namcoeva.cpp new file mode 100644 index 0000000000000..cf958992350cb --- /dev/null +++ b/src/mame/seta/namcoeva.cpp @@ -0,0 +1,378 @@ +// license:BSD-3-Clause +// copyright-holders: + +/* +Hammer Champ +Namco 1997 +https://www.youtube.com/watch?v=gs1pAe5S0gY + +main board: +NAMCO EVA PCB 8826960100 - P0-135B +with +- TMP68301AF-16 (main) +- 3x NEC DX-102 +- Hitachi H8/3002 (sound) +- Namco C352 +- Namco C416 +- MACH111 PLD (KC026) +- 2x banks of 8 DIP switches +- 50 MHz XTAL +- 26.670 MHz XTAL + +I/O board: +NAMCO M136 I/O PCB - hi-pric P41 B - 1423961101 (1423971101) +with +Motorola MC68HC11K1 +Fuji MB8422 DPRAM +8 MHz XTAL + +The game runs without IO board to test mode but will not go in game (error 07) + + +TODO: +- currently starts with 9 credits inserted. After entering and exiting test mode, the game shows 0 + coins and can be coined up normally; +- implement proper controls. The game has a peculiar input setup (see video link above); +- complete sound hook up (missing IRQ?). Puts same string as namco/namcod1.cpp in H8 RAM ("Quattro Ver.1.2.H8"); +- after coining up there's a GFX bug that maybe points to some unimplemented feature in seta2_v.cpp; +- once the video emulation in seta/seta2_v.cpp has been devicified, remove derivation from + seta/seta2.h and possibly move to namco/ folder. +*/ + + +#include "emu.h" + +#include "seta2.h" + +#include "cpu/mc68hc11/mc68hc11.h" +#include "cpu/h8/h83002.h" +#include "machine/mb8421.h" +#include "machine/watchdog.h" +#include "sound/c352.h" + +#include "speaker.h" + + +// configurable logging +#define LOG_MAINCPU (1U << 1) +#define LOG_IOCPU (1U << 2) +#define LOG_SUBCPU (1U << 3) + +#define VERBOSE (2) + +#include "logmacro.h" + +#define LOGMAINCPU(...) LOGMASKED(LOG_MAINCPU, __VA_ARGS__) +#define LOGIOCPU(...) LOGMASKED(LOG_IOCPU, __VA_ARGS__) +#define LOGSUBCPU(...) LOGMASKED(LOG_SUBCPU, __VA_ARGS__) + + +namespace { + +class namcoeva_state : public seta2_state +{ +public: + namcoeva_state(const machine_config &mconfig, device_type type, const char *tag) : + seta2_state(mconfig, type, tag), + m_subcpu(*this, "subcpu"), + m_iocpu(*this, "iocpu") + { } + + void hammerch(machine_config &config) ATTR_COLD; + +private: + required_device m_subcpu; + required_device m_iocpu; + + void maincpu_map(address_map &map) ATTR_COLD; + void subcpu_map(address_map &map) ATTR_COLD; + void iocpu_map(address_map &map) ATTR_COLD; +}; + + +void namcoeva_state::maincpu_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); + map(0x200000, 0x20ffff).ram(); + map(0x210000, 0x21002f).ram(); // ?? + map(0x300000, 0x3001ff).ram(); // ?? + //map(0x400000, 0x40ffff).ram().share("sharedram"); // writes here, but if mapped code loops (probably some missing IRQ). Sound test shows these are audio-related comms. + map(0x600000, 0x600001).portr("IN0"); // TODO: inputs aren't tested yet + map(0x600002, 0x600003).portr("IN1"); + map(0x600004, 0x600005).portr("IN2"); + map(0x600006, 0x600007).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); + map(0x600200, 0x600201).nopw(); // lamps? + map(0x600300, 0x600301).portr("DSW1"); + map(0x600302, 0x600303).portr("DSW2"); + map(0x800000, 0x800fff).rw("dpram", FUNC(mb8421_device::left_r), FUNC(mb8421_device::left_w)).umask16(0x00ff); // EXT IO CHECK: NG if unmapped + map(0xa00000, 0xa3ffff).ram().share("spriteram"); + map(0xa40000, 0xa4ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); + map(0xa60000, 0xa6003f).ram().w(FUNC(namcoeva_state::vregs_w)).share("vregs"); + map(0xc3ff00, 0xc3ffff).ram(); // keycus? +} + +void namcoeva_state::subcpu_map(address_map &map) +{ + map(0x000000, 0x01ffff).rom(); + map(0x200000, 0x20ffff).ram().share("sharedram"); + map(0xa00000, 0xa07fff).rw("c352", FUNC(c352_device::read), FUNC(c352_device::write)); +} + +void namcoeva_state::iocpu_map(address_map &map) +{ + map(0x1000, 0x17ff).rw("dpram", FUNC(mb8421_device::right_r), FUNC(mb8421_device::right_w)); + map(0x8000, 0xffff).rom(); +} + + +static INPUT_PORTS_START( hammerch ) + PORT_START("IN0") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON4 ) // Photo Sensor - High (Game) in test mode + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON3 ) // " + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) // " + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) // " + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN1") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON8 ) // Photo Sensor - Low (Game) in test mode (also used to move and select in test mode) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON7 ) // " + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON6 ) // " + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON5 ) // " + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN2") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(5) // Coin Switch 1 in test mode + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(5) // Coin Switch 2 in test mode, doesn't have any effect in game + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) // Service Switch in test mode + PORT_SERVICE_NO_TOGGLE( 0x0008, IP_ACTIVE_LOW ) // Test Switch in test mode + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW1") + PORT_SERVICE_DIPLOC( 0x0001, IP_ACTIVE_LOW, "SW1:1" ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, "Freeze Screen" ) PORT_DIPLOCATION("SW1:8") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IO_IN0") // TODO: Photo Sensor - Low (I/O) and High (I/O) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + + +static const gfx_layout tile_layout = +{ + 8,8, + RGN_FRAC(1,1), + 8, + { STEP8(7*8, -8) }, + { STEP8(0, 1) }, + { STEP8(0, 8*8) }, + 8*8*8 +}; + + +/* Tiles are 8bpp, but the hardware is additionally able to discard + some bitplanes and use the low 4 bits only, or the high 4 bits only */ +static GFXDECODE_START( gfx_dx_10x ) + GFXDECODE_ENTRY( "sprites", 0, tile_layout, 0, 0x8000/16 ) // 8bpp, but 4bpp color granularity +GFXDECODE_END + + +void namcoeva_state::hammerch(machine_config &config) +{ + tmp68301_device &maincpu(TMP68301(config, m_maincpu, 50_MHz_XTAL / 4)); // TODO: divider not verified + maincpu.set_addrmap(AS_PROGRAM, &namcoeva_state::maincpu_map); + maincpu.parallel_r_cb().set([this] () { LOGMAINCPU("%s: P4 read\n", machine().describe_context()); return uint16_t(0); }); + maincpu.parallel_w_cb().set([this] (uint8_t data) { LOGMAINCPU("%s: P4 write %04x\n", machine().describe_context(), data); }); + maincpu.tx0_handler().set([this] (int state) { LOGMAINCPU("%s: tx0 line write %d\n", machine().describe_context(), state); }); + maincpu.tx1_handler().set([this] (int state) { LOGMAINCPU("%s: tx1 line write %d\n", machine().describe_context(), state); }); + maincpu.tx2_handler().set([this] (int state) { LOGMAINCPU("%s: tx2 line write %d\n", machine().describe_context(), state); }); + + WATCHDOG_TIMER(config, "watchdog"); + + H83002(config, m_subcpu, 26.670_MHz_XTAL / 2); // TODO: divider not verified + m_subcpu->set_addrmap(AS_PROGRAM, &namcoeva_state::subcpu_map); + // seems to only use P4 read at start up + m_subcpu->read_port4().set([this] () { LOGSUBCPU("%s: P4 read\n", machine().describe_context()); return u8(0); }); + m_subcpu->write_port4().set([this] (u8 data) { LOGSUBCPU("%s: P4 write %02x\n", machine().describe_context(), data); }); + m_subcpu->read_port6().set([this] () { LOGSUBCPU("%s: P6 read\n", machine().describe_context()); return u8(0); }); + m_subcpu->write_port6().set([this] (u8 data) { LOGSUBCPU("%s: P6 write %02x\n", machine().describe_context(), data); }); + m_subcpu->read_port7().set([this] () { LOGSUBCPU("%s: P7 read\n", machine().describe_context()); return u8(0); }); + m_subcpu->read_port8().set([this] () { LOGSUBCPU("%s: P8 read\n", machine().describe_context()); return u8(0); }); + m_subcpu->write_port8().set([this] (u8 data) { LOGSUBCPU("%s: P8 write %02x\n", machine().describe_context(), data); }); + m_subcpu->read_port9().set([this] () { LOGSUBCPU("%s: P9 read\n", machine().describe_context()); return u8(0); }); + m_subcpu->write_port9().set([this] (u8 data) { LOGSUBCPU("%s: P9 write %02x\n", machine().describe_context(), data); }); + m_subcpu->read_porta().set([this] () { LOGSUBCPU("%s: PA read\n", machine().describe_context()); return u8(0); }); + m_subcpu->write_porta().set([this] (u8 data) { LOGSUBCPU("%s: PA write %02x\n", machine().describe_context(), data); }); + m_subcpu->read_portb().set([this] () { LOGSUBCPU("%s: PB read\n", machine().describe_context()); return u8(0); }); + m_subcpu->write_portb().set([this] (u8 data) { LOGSUBCPU("%s: PB write %02x\n", machine().describe_context(), data); }); + m_subcpu->tend0().set([this] (int state) { LOGSUBCPU("%s: tend0 line write %d\n", machine().describe_context(), state); }); + m_subcpu->tend1().set([this] (int state) { LOGSUBCPU("%s: tend1 line write %d\n", machine().describe_context(), state); }); + + MC68HC11K1(config, m_iocpu, 8_MHz_XTAL); + m_iocpu->set_addrmap(AS_PROGRAM, &namcoeva_state::iocpu_map); + m_iocpu->in_pa_callback().set([this] () { LOGIOCPU("%s: PA read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_pb_callback().set([this] () { LOGIOCPU("%s: PB read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_pc_callback().set([this] () { LOGIOCPU("%s: PC read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_pd_callback().set([this] () { LOGIOCPU("%s: PD read\n", machine().describe_context()); return u8(0); }); // read often + m_iocpu->in_pe_callback().set([this] () { LOGIOCPU("%s: PE read\n", machine().describe_context()); return u8(0); }); // read often, Photo Sensor - Low (I/O) and High (I/O) in test mode react from here, but not correctly right now + m_iocpu->in_pf_callback().set([this] () { LOGIOCPU("%s: PF read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_pg_callback().set([this] () { LOGIOCPU("%s: PG read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_ph_callback().set([this] () { LOGIOCPU("%s: PH read\n", machine().describe_context()); return u8(0); }); // read often + m_iocpu->out_pa_callback().set([this] (u8 data) { LOGIOCPU("%s: PA write %02x\n", machine().describe_context(), data); }); + m_iocpu->out_pb_callback().set([this] (u8 data) { LOGIOCPU("%s: PB write %02x\n", machine().describe_context(), data); }); + m_iocpu->out_pc_callback().set([this] (u8 data) { LOGIOCPU("%s: PC write %02x\n", machine().describe_context(), data); }); + m_iocpu->out_pd_callback().set([this] (u8 data) { LOGIOCPU("%s: PD write %02x\n", machine().describe_context(), data); }); // very rarely written (bit 2) + m_iocpu->out_pe_callback().set([this] (u8 data) { LOGIOCPU("%s: PE write %02x\n", machine().describe_context(), data); }); + m_iocpu->out_pf_callback().set([this] (u8 data) { LOGIOCPU("%s: PF write %02x\n", machine().describe_context(), data); }); + m_iocpu->out_pg_callback().set([this] (u8 data) { LOGIOCPU("%s: PG write %02x\n", machine().describe_context(), data); }); // bits 0, 4, 5 and 6 written often + m_iocpu->out_ph_callback().set([this] (u8 data) { LOGIOCPU("%s: PH write %02x\n", machine().describe_context(), data); }); // writes 0xa0 at start up + m_iocpu->in_an0_callback().set([this] () { LOGIOCPU("%s: AN0 read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_an1_callback().set([this] () { LOGIOCPU("%s: AN1 read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_an2_callback().set([this] () { LOGIOCPU("%s: AN2 read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_an3_callback().set([this] () { LOGIOCPU("%s: AN3 read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_an4_callback().set([this] () { LOGIOCPU("%s: AN4 read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_an5_callback().set([this] () { LOGIOCPU("%s: AN5 read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_an6_callback().set([this] () { LOGIOCPU("%s: AN6 read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_an7_callback().set([this] () { LOGIOCPU("%s: AN7 read\n", machine().describe_context()); return u8(0); }); + m_iocpu->in_spi2_data_callback().set([this] () { LOGIOCPU("%s: SPI2 data read\n", machine().describe_context()); return u8(0); }); + m_iocpu->out_spi2_data_callback().set([this] (u8 data) { LOGIOCPU("%s: SPI2 data write %02x\n", machine().describe_context(), data); }); + + MB8421(config, "dpram"); // actually MB8422 + + // video hardware + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_size(0x200, 0x100); + m_screen->set_visarea(0x00, 0x140-1, 0x00, 0xe0-1); + m_screen->set_screen_update(FUNC(namcoeva_state::screen_update)); + m_screen->screen_vblank().set(FUNC(namcoeva_state::screen_vblank)); + m_screen->screen_vblank().append_inputline(m_maincpu, 0); + m_screen->set_palette(m_palette); + //m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE); + + GFXDECODE(config, m_gfxdecode, m_palette, gfx_dx_10x); + PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x8000+0xf0); // extra 0xf0 because we might draw 256-color object with 16-color granularity + + // sound hardware + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); + + c352_device &c352(C352(config, "c352", 50_MHz_XTAL / 3, 288)); // TODO: divider not verified + c352.add_route(0, "lspeaker", 1.00); + c352.add_route(1, "rspeaker", 1.00); + c352.add_route(2, "lspeaker", 1.00); + c352.add_route(3, "rspeaker", 1.00); +} + + +ROM_START( hammerch ) + ROM_REGION( 0x200000, "maincpu", 0 ) // TMP68301 + ROM_LOAD16_WORD( "hc1_main0.u02", 0x00000, 0x80000, CRC(150164bb) SHA1(c99f03718fd1002386bfbf8695b7010ec5dad168) ) + + ROM_REGION( 0x80000, "subcpu", 0 ) // H8/3007 + ROM_LOAD( "hc1_sub0.u47", 0x00000, 0x80000, CRC(4762451a) SHA1(b46bf1eaeac317264eb80c2e3f50d2821791569f) ) // 11xxxxxxxxxxxxxxxxx = 0xFF + + ROM_REGION( 0x10000, "iocpu", 0 ) // MC68HC11K1 + ROM_LOAD( "hc1prg0_ioboard.ic2", 0x00000, 0x10000, CRC(606fad7e) SHA1(cf975e09038f84eb75d30130bfaf31f4c74986b2) ) + + ROM_REGION( 0x1000000, "sprites", 0 ) + ROM_LOAD64_WORD( "hc1_cg3.u29", 0x000000, 0x400000, CRC(d9cc519b) SHA1(43670b357fadc5faf5ee229176ae97e8c29b6874) ) + ROM_LOAD64_WORD( "hc1_cg1.u28", 0x000002, 0x400000, CRC(386c129e) SHA1(21325b44d96b184df09118cd0c68733afde6db03) ) + ROM_LOAD64_WORD( "hc1_cg2.u31", 0x000004, 0x400000, CRC(3aea6bf0) SHA1(a8e7a7fae0ab83b08b80ff28461c9e97afe85cf7) ) + ROM_LOAD64_WORD( "hc1_cg0.u30", 0x000006, 0x400000, CRC(f1685224) SHA1(94f491d92e91cc0040b67a82849f2832629459b0) ) + + ROM_REGION( 0x1000000, "c352", ROMREGION_ERASE00 ) + ROM_LOAD( "hc1_wave0.u51", 0x000000, 0x400000, BAD_DUMP CRC(8d532360) SHA1(d303767706b3437953e0cfacf28cd12c0e3b948e) ) // FIXED BITS (xxxxxxxx11111111) +ROM_END + +} // anonymous namespace + + +GAME( 1997, hammerch, 0, hammerch, hammerch, namcoeva_state, empty_init, ROT0, "Namco", "Hammer Champ (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) diff --git a/src/mame/seta/seta2.cpp b/src/mame/seta/seta2.cpp index 6141d08778f26..72b6c20012366 100644 --- a/src/mame/seta/seta2.cpp +++ b/src/mame/seta/seta2.cpp @@ -55,6 +55,7 @@ P0-145-1 2002 Trophy Hunting - Bear & Moose (test) Sammy - I added a kludge involving a -0x10 yoffset, this fixes the lifeline in myangel. I didn't find a better way to do it without breaking pzlbowl's title screen. - Background color is not verified +- Device-fy video chip and split according to hardware (i.e. NamcoEVA2 and 3). gundamex: - slowdowns, music tempo is incorrect diff --git a/src/mame/seta/seta2.h b/src/mame/seta/seta2.h index 60ede6f027adf..de2671787d678 100644 --- a/src/mame/seta/seta2.h +++ b/src/mame/seta/seta2.h @@ -36,7 +36,6 @@ class seta2_state : public driver_device m_x1_bank(*this, "x1_bank_%u", 1U), m_spriteram(*this, "spriteram", 0x40000, ENDIANNESS_BIG), - m_tileram(*this, "tileram"), m_vregs(*this, "vregs", 0x40, ENDIANNESS_BIG), m_leds(*this, "led%u", 0U), m_lamps(*this, "lamp%u", 0U) @@ -127,7 +126,6 @@ class seta2_state : public driver_device optional_memory_bank_array<8> m_x1_bank; memory_share_creator m_spriteram; - optional_shared_ptr m_tileram; memory_share_creator m_vregs; output_finder<7> m_leds; output_finder<11> m_lamps; From 489fc8efa6deff1e041388830af8c54ffb7dafb7 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Sat, 6 Apr 2024 02:49:28 +0200 Subject: [PATCH 021/109] New working systems ------------------- CEI 60.04 (CEI 906-III Poker) [Roberto Fresca] --- src/mame/mame.lst | 1 + src/mame/misc/calomega.cpp | 41 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 7e15116fc0d6b..108b270a46ad6 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -28954,6 +28954,7 @@ comg272a // (c) 1985 Cal Omega Inc. comg272b // (c) 1985 Cal Omega Inc. comg5107 // (c) 1988 Casino Electronics Inc. comg5108 // (c) 1988 Casino Electronics Inc. +comg6004 // (c) 1989 Casino Electronics Inc. comg903d // (c) 198? Cal Omega Inc. comg905d // (c) 198? Cal Omega Inc. elgrande // (c) 1982 Tuni Electro Service / E.T. Marketing diff --git a/src/mame/misc/calomega.cpp b/src/mame/misc/calomega.cpp index 3a9fdcd14a668..65e06865d3152 100644 --- a/src/mame/misc/calomega.cpp +++ b/src/mame/misc/calomega.cpp @@ -5649,8 +5649,8 @@ ROM_START( comg272b ) // Cal Omega v27.2 (Keno (gaming)) ROM_LOAD( "903kstec.0", 0x0000, 0x0800, CRC(c1636ab5) SHA1(5a3ad24918751ca6a6640807e421e80f6b4cc844) ) ROM_END -/* +/* CEI Video Poker Jacks or Better V 51.08 @@ -5659,7 +5659,6 @@ ROM_END PROMS 2764 */ - ROM_START( comg5108 ) // Cal Omega v51.08 (Poker) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "epr1.u28", 0x6000, 0x2000, CRC(3d6abca9) SHA1(54a802f89bd64380abf269a2b507513c8db5319b) ) // schedule eprom 05F. checked in offset $8034 @@ -5694,6 +5693,43 @@ ROM_START( comg5107 ) // Cal Omega v51.07 (Poker) ROM_LOAD( "bprom.u16", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) ROM_END +/* + CEI 906III POKER + V60.04 1989 906III board + + Jumper 8,9 + EPR 1-5 2764 + CG's 2764 + Labeled UCMC + + EPR1 075B E3185D4F3848ECE90BFBE6B0AAC95E62C8B39FAF + EPR2 442A 474B6B2CC592518836C1D3804FE77CAE505FCC97 + EPR3 E8E9 AE259FCFA34B20F0C9C71CA48275426F2E9CFFBE + EPR4 65A3 B8A16A8B8BA245901D4F347250E0DCB7E6D36E0A + EPR5 3D40 53D33F3B251D27F6EC40E3E3B059EA7BA8A2EFE0 + + CG2A 961D 68472E7271F835656197109620BB3988FC52308A + CG2B B319 B2BCE60E24DD61977F7BF6EE4705CA7D104AB388 + CG2C DF06 3AF5F568DE3F2AF1A6BBB00D673BDBFF16C87A40 + Color 076A CBFF2CB60137462DC0B7C7719A64574218D96C62 + +*/ +ROM_START( comg6004 ) // Cal Omega v60.04 (Poker) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "60.00_epr1.bin", 0x6000, 0x2000, CRC(6eccf229) SHA1(e3185d4f3848ece90bfbe6b0aac95e62c8b39faf) ) // schedule eprom + ROM_LOAD( "60.01_epr2.bin", 0x8000, 0x2000, CRC(9f5af552) SHA1(474b6b2cc592518836c1d3804fe77cae505fcc97) ) + ROM_LOAD( "60.02_epr3.bin", 0xa000, 0x2000, CRC(98799fa0) SHA1(ae259fcfa34b20f0c9c71ca48275426f2e9cffbe) ) + ROM_LOAD( "60.03_epr4.bin", 0xc000, 0x2000, CRC(eff6fbb3) SHA1(b8a16a8b8ba245901d4f347250e0dcb7e6d36e0a) ) + ROM_LOAD( "60.04_epr5.bin", 0xe000, 0x2000, CRC(fc4b7c2f) SHA1(53d33f3b251d27f6ec40e3e3b059ea7ba8a2efe0) ) + + ROM_REGION( 0x6000, "gfx1", 0 ) + ROM_LOAD( "cg2c.bin", 0x0000, 0x2000, CRC(dc77a6db) SHA1(3af5f568de3f2af1a6bbb00d673bdbff16c87a40) ) + ROM_LOAD( "cg2b.bin", 0x2000, 0x2000, CRC(1f79f76d) SHA1(b2bce60e24dd61977f7bf6ee4705ca7d104ab388) ) + ROM_LOAD( "cg2a.bin", 0x4000, 0x2000, CRC(d5fd9fc2) SHA1(68472e7271f835656197109620bb3988fc52308a) ) + + ROM_REGION( 0x200, "proms", 0 ) // second half is empty + ROM_LOAD( "bprom.bin", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) +ROM_END /*********************** Diagnostic PROMs ***********************/ @@ -6185,6 +6221,7 @@ GAME( 198?, comg905d, 0, sys905, stand905, calomega_state, empty_init, //************* 906-III games ************** GAME( 1988, comg5107, 0, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 51.07 (CEI 906-III Poker)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, comg5108, 0, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 51.08 (CEI 906-III Poker)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, comg6004, 0, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 60.04 (CEI 906-III Poker)", MACHINE_SUPPORTS_SAVE ) //****** Unofficial 903/904/905 3rd party games ******* GAME( 1982, elgrande, 0, s903mod, elgrande, calomega_state, empty_init, ROT0, "Tuni Electro Service", "El Grande - 5 Card Draw (New)", MACHINE_SUPPORTS_SAVE ) From dd63756cae1bffd432c0b7b8c403f9768dbf60b9 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Sat, 6 Apr 2024 03:14:18 +0200 Subject: [PATCH 022/109] misc/calomega.cpp: Added docs for CEI 60.04 (CEI 906-III Poker) --- src/mame/misc/calomega.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mame/misc/calomega.cpp b/src/mame/misc/calomega.cpp index 65e06865d3152..809b82212b59c 100644 --- a/src/mame/misc/calomega.cpp +++ b/src/mame/misc/calomega.cpp @@ -261,6 +261,7 @@ | | | | | | | | | | | 51.07| Poker (906-III) | 906-III | | GP2CG | unknown | WILD | unknown | Nevada Gaming | Yes | OK | Yes 51.08| Poker (906-III) | 906-III | | GP2CG | unknown | WILD | unknown | Nevada Gaming | Yes | OK | Yes + 60.04| Poker (906-III) | 906-III | | GP2CG | unknown | WILD | unknown | Nevada Gaming | Yes | OK | Yes | | | | | | | | | | | * 903d | System 903 Diag.PROM | 903 | unknown | any | unknown | any | unknown | Testing H/W | Yes | OK | Yes * 905d | System 905 Diag.PROM | 905 | unknown | any | unknown | any | unknown | Testing H/W | Yes | OK | Yes From 99ef097d67bf55f054c8fdc730b4ea2af0051ca2 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Sat, 6 Apr 2024 08:32:29 +0200 Subject: [PATCH 023/109] misc/calomega.cpp: * Renamed and rearrange 51.xx and 60.04 ROMs. * Change games description. New working clones ------------------ CEI 51.08 (CEI 906-III Poker, Schedule 09F) [Roberto Fresca] CEI 51.08 (CEI 906-III Poker, Schedule 21F) [Roberto Fresca] --- src/mame/mame.lst | 2 + src/mame/misc/calomega.cpp | 96 ++++++++++++++++++++++++++------------ 2 files changed, 68 insertions(+), 30 deletions(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 108b270a46ad6..3d63213b9c110 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -28954,6 +28954,8 @@ comg272a // (c) 1985 Cal Omega Inc. comg272b // (c) 1985 Cal Omega Inc. comg5107 // (c) 1988 Casino Electronics Inc. comg5108 // (c) 1988 Casino Electronics Inc. +comg5108a // (c) 1988 Casino Electronics Inc. +comg5108b // (c) 1988 Casino Electronics Inc. comg6004 // (c) 1989 Casino Electronics Inc. comg903d // (c) 198? Cal Omega Inc. comg905d // (c) 198? Cal Omega Inc. diff --git a/src/mame/misc/calomega.cpp b/src/mame/misc/calomega.cpp index 809b82212b59c..b472a7f884d1d 100644 --- a/src/mame/misc/calomega.cpp +++ b/src/mame/misc/calomega.cpp @@ -5662,36 +5662,70 @@ ROM_END */ ROM_START( comg5108 ) // Cal Omega v51.08 (Poker) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "epr1.u28", 0x6000, 0x2000, CRC(3d6abca9) SHA1(54a802f89bd64380abf269a2b507513c8db5319b) ) // schedule eprom 05F. checked in offset $8034 - ROM_LOAD( "epr2.u29", 0x8000, 0x2000, CRC(72cf8376) SHA1(fa1682244402e1b36164c670241f585bf4017ad9) ) - ROM_LOAD( "epr3.u30", 0xa000, 0x2000, CRC(c79957e5) SHA1(64afdedf5369d56790e9ae7a8d3be5f52125ca1f) ) - ROM_LOAD( "epr4.u31", 0xc000, 0x2000, CRC(eb0b0a86) SHA1(4fd29700db8fe183392cc66a54a128657c7e05e0) ) - ROM_LOAD( "epr5.u32", 0xe000, 0x2000, CRC(b0981cea) SHA1(e56278176df1a6c20acfb8cbf2f5e7a946d93111) ) + ROM_LOAD( "epr1_s05f.u28", 0x6000, 0x2000, CRC(3d6abca9) SHA1(54a802f89bd64380abf269a2b507513c8db5319b) ) // schedule eprom 05F. checked in offset $8034 + ROM_LOAD( "epr2_5008.u29", 0x8000, 0x2000, CRC(72cf8376) SHA1(fa1682244402e1b36164c670241f585bf4017ad9) ) + ROM_LOAD( "epr3_5008.u30", 0xa000, 0x2000, CRC(c79957e5) SHA1(64afdedf5369d56790e9ae7a8d3be5f52125ca1f) ) + ROM_LOAD( "epr4_5008.u31", 0xc000, 0x2000, CRC(eb0b0a86) SHA1(4fd29700db8fe183392cc66a54a128657c7e05e0) ) + ROM_LOAD( "epr5_5008.u32", 0xe000, 0x2000, CRC(b0981cea) SHA1(e56278176df1a6c20acfb8cbf2f5e7a946d93111) ) ROM_REGION( 0x6000, "gfx1", 0 ) - ROM_LOAD( "cg2c.u4", 0x0000, 0x2000, CRC(dc77a6db) SHA1(3af5f568de3f2af1a6bbb00d673bdbff16c87a40) ) - ROM_LOAD( "cg2b.u5", 0x2000, 0x2000, CRC(1f79f76d) SHA1(b2bce60e24dd61977f7bf6ee4705ca7d104ab388) ) - ROM_LOAD( "cg2a.u6", 0x4000, 0x2000, CRC(d5fd9fc2) SHA1(68472e7271f835656197109620bb3988fc52308a) ) + ROM_LOAD( "cg2c.u4", 0x0000, 0x2000, CRC(dc77a6db) SHA1(3af5f568de3f2af1a6bbb00d673bdbff16c87a40) ) + ROM_LOAD( "cg2b.u5", 0x2000, 0x2000, CRC(1f79f76d) SHA1(b2bce60e24dd61977f7bf6ee4705ca7d104ab388) ) + ROM_LOAD( "cg2a.u6", 0x4000, 0x2000, CRC(d5fd9fc2) SHA1(68472e7271f835656197109620bb3988fc52308a) ) ROM_REGION( 0x200, "proms", 0 ) // second half is empty - ROM_LOAD( "bprom.u16", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) + ROM_LOAD( "bprom.u16", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) +ROM_END + +ROM_START( comg5108a ) // Cal Omega v51.08a (Poker) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "epr1_s09f.u28", 0x6000, 0x2000, CRC(6eccf229) SHA1(e3185d4f3848ece90bfbe6b0aac95e62c8b39faf) ) // schedule eprom 09F. checked in offset $8034 + ROM_LOAD( "epr2_5008.u29", 0x8000, 0x2000, CRC(72cf8376) SHA1(fa1682244402e1b36164c670241f585bf4017ad9) ) + ROM_LOAD( "epr3_5008.u30", 0xa000, 0x2000, CRC(c79957e5) SHA1(64afdedf5369d56790e9ae7a8d3be5f52125ca1f) ) + ROM_LOAD( "epr4_5008.u31", 0xc000, 0x2000, CRC(eb0b0a86) SHA1(4fd29700db8fe183392cc66a54a128657c7e05e0) ) + ROM_LOAD( "epr5_5008.u32", 0xe000, 0x2000, CRC(b0981cea) SHA1(e56278176df1a6c20acfb8cbf2f5e7a946d93111) ) + + ROM_REGION( 0x6000, "gfx1", 0 ) + ROM_LOAD( "cg2c.u4", 0x0000, 0x2000, CRC(dc77a6db) SHA1(3af5f568de3f2af1a6bbb00d673bdbff16c87a40) ) + ROM_LOAD( "cg2b.u5", 0x2000, 0x2000, CRC(1f79f76d) SHA1(b2bce60e24dd61977f7bf6ee4705ca7d104ab388) ) + ROM_LOAD( "cg2a.u6", 0x4000, 0x2000, CRC(d5fd9fc2) SHA1(68472e7271f835656197109620bb3988fc52308a) ) + + ROM_REGION( 0x200, "proms", 0 ) // second half is empty + ROM_LOAD( "bprom.u16", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) +ROM_END + +ROM_START( comg5108b ) // Cal Omega v51.08b (Poker) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "epr1_s21f.u28", 0x6000, 0x2000, CRC(33b1bb5b) SHA1(86f439ef96f7dafe320c394878ff4fda3f94c631) ) // schedule eprom 21F. checked in offset $8034 + ROM_LOAD( "epr2_5008.u29", 0x8000, 0x2000, CRC(72cf8376) SHA1(fa1682244402e1b36164c670241f585bf4017ad9) ) + ROM_LOAD( "epr3_5008.u30", 0xa000, 0x2000, CRC(c79957e5) SHA1(64afdedf5369d56790e9ae7a8d3be5f52125ca1f) ) + ROM_LOAD( "epr4_5008.u31", 0xc000, 0x2000, CRC(eb0b0a86) SHA1(4fd29700db8fe183392cc66a54a128657c7e05e0) ) + ROM_LOAD( "epr5_5008.u32", 0xe000, 0x2000, CRC(b0981cea) SHA1(e56278176df1a6c20acfb8cbf2f5e7a946d93111) ) + + ROM_REGION( 0x6000, "gfx1", 0 ) + ROM_LOAD( "cg2c.u4", 0x0000, 0x2000, CRC(dc77a6db) SHA1(3af5f568de3f2af1a6bbb00d673bdbff16c87a40) ) + ROM_LOAD( "cg2b.u5", 0x2000, 0x2000, CRC(1f79f76d) SHA1(b2bce60e24dd61977f7bf6ee4705ca7d104ab388) ) + ROM_LOAD( "cg2a.u6", 0x4000, 0x2000, CRC(d5fd9fc2) SHA1(68472e7271f835656197109620bb3988fc52308a) ) + + ROM_REGION( 0x200, "proms", 0 ) // second half is empty + ROM_LOAD( "bprom.u16", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) ROM_END ROM_START( comg5107 ) // Cal Omega v51.07 (Poker) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "epr1.u28", 0x6000, 0x2000, CRC(3d6abca9) SHA1(54a802f89bd64380abf269a2b507513c8db5319b) ) // schedule eprom 05F. same as the 51.08 set - ROM_LOAD( "epr2.u29", 0x8000, 0x2000, CRC(1cefe40d) SHA1(9169c466903485d6e78c53bd104dc61722437509) ) - ROM_LOAD( "epr3.u30", 0xa000, 0x2000, CRC(0bc9be3e) SHA1(bce88a6a37ded6396954ec8c11e19af66f658e4d) ) - ROM_LOAD( "epr4.u31", 0xc000, 0x2000, CRC(34e7d16f) SHA1(c4901e00a5dbaeb6277dbe9bdcad93827c5aa947) ) - ROM_LOAD( "epr5.u32", 0xe000, 0x2000, CRC(e5a252b5) SHA1(7a226c771ba16944b4e50c22db0cd5d7fc530e11) ) + ROM_LOAD( "epr1_s05f.u28", 0x6000, 0x2000, CRC(3d6abca9) SHA1(54a802f89bd64380abf269a2b507513c8db5319b) ) // schedule eprom 05F + ROM_LOAD( "epr2_5007.u29", 0x8000, 0x2000, CRC(1cefe40d) SHA1(9169c466903485d6e78c53bd104dc61722437509) ) + ROM_LOAD( "epr3_5007.u30", 0xa000, 0x2000, CRC(0bc9be3e) SHA1(bce88a6a37ded6396954ec8c11e19af66f658e4d) ) + ROM_LOAD( "epr4_5007.u31", 0xc000, 0x2000, CRC(34e7d16f) SHA1(c4901e00a5dbaeb6277dbe9bdcad93827c5aa947) ) + ROM_LOAD( "epr5_5007.u32", 0xe000, 0x2000, CRC(e5a252b5) SHA1(7a226c771ba16944b4e50c22db0cd5d7fc530e11) ) ROM_REGION( 0x6000, "gfx1", 0 ) - ROM_LOAD( "cg2c.u4", 0x0000, 0x2000, CRC(dc77a6db) SHA1(3af5f568de3f2af1a6bbb00d673bdbff16c87a40) ) - ROM_LOAD( "cg2b.u5", 0x2000, 0x2000, CRC(1f79f76d) SHA1(b2bce60e24dd61977f7bf6ee4705ca7d104ab388) ) - ROM_LOAD( "cg2a.u6", 0x4000, 0x2000, CRC(d5fd9fc2) SHA1(68472e7271f835656197109620bb3988fc52308a) ) + ROM_LOAD( "cg2c.u4", 0x0000, 0x2000, CRC(dc77a6db) SHA1(3af5f568de3f2af1a6bbb00d673bdbff16c87a40) ) + ROM_LOAD( "cg2b.u5", 0x2000, 0x2000, CRC(1f79f76d) SHA1(b2bce60e24dd61977f7bf6ee4705ca7d104ab388) ) + ROM_LOAD( "cg2a.u6", 0x4000, 0x2000, CRC(d5fd9fc2) SHA1(68472e7271f835656197109620bb3988fc52308a) ) ROM_REGION( 0x200, "proms", 0 ) // second half is empty - ROM_LOAD( "bprom.u16", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) + ROM_LOAD( "bprom.u16", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) ROM_END /* @@ -5717,19 +5751,19 @@ ROM_END */ ROM_START( comg6004 ) // Cal Omega v60.04 (Poker) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "60.00_epr1.bin", 0x6000, 0x2000, CRC(6eccf229) SHA1(e3185d4f3848ece90bfbe6b0aac95e62c8b39faf) ) // schedule eprom - ROM_LOAD( "60.01_epr2.bin", 0x8000, 0x2000, CRC(9f5af552) SHA1(474b6b2cc592518836c1d3804fe77cae505fcc97) ) - ROM_LOAD( "60.02_epr3.bin", 0xa000, 0x2000, CRC(98799fa0) SHA1(ae259fcfa34b20f0c9c71ca48275426f2e9cffbe) ) - ROM_LOAD( "60.03_epr4.bin", 0xc000, 0x2000, CRC(eff6fbb3) SHA1(b8a16a8b8ba245901d4f347250e0dcb7e6d36e0a) ) - ROM_LOAD( "60.04_epr5.bin", 0xe000, 0x2000, CRC(fc4b7c2f) SHA1(53d33f3b251d27f6ec40e3e3b059ea7ba8a2efe0) ) + ROM_LOAD( "epr1_s09f.u28", 0x6000, 0x2000, CRC(6eccf229) SHA1(e3185d4f3848ece90bfbe6b0aac95e62c8b39faf) ) // schedule eprom 09F + ROM_LOAD( "epr2_6004.u29", 0x8000, 0x2000, CRC(9f5af552) SHA1(474b6b2cc592518836c1d3804fe77cae505fcc97) ) + ROM_LOAD( "epr3_6004.u30", 0xa000, 0x2000, CRC(98799fa0) SHA1(ae259fcfa34b20f0c9c71ca48275426f2e9cffbe) ) + ROM_LOAD( "epr4_6004.u31", 0xc000, 0x2000, CRC(eff6fbb3) SHA1(b8a16a8b8ba245901d4f347250e0dcb7e6d36e0a) ) + ROM_LOAD( "epr5_6004.u32", 0xe000, 0x2000, CRC(fc4b7c2f) SHA1(53d33f3b251d27f6ec40e3e3b059ea7ba8a2efe0) ) ROM_REGION( 0x6000, "gfx1", 0 ) - ROM_LOAD( "cg2c.bin", 0x0000, 0x2000, CRC(dc77a6db) SHA1(3af5f568de3f2af1a6bbb00d673bdbff16c87a40) ) - ROM_LOAD( "cg2b.bin", 0x2000, 0x2000, CRC(1f79f76d) SHA1(b2bce60e24dd61977f7bf6ee4705ca7d104ab388) ) - ROM_LOAD( "cg2a.bin", 0x4000, 0x2000, CRC(d5fd9fc2) SHA1(68472e7271f835656197109620bb3988fc52308a) ) + ROM_LOAD( "cg2c.u4", 0x0000, 0x2000, CRC(dc77a6db) SHA1(3af5f568de3f2af1a6bbb00d673bdbff16c87a40) ) + ROM_LOAD( "cg2b.u5", 0x2000, 0x2000, CRC(1f79f76d) SHA1(b2bce60e24dd61977f7bf6ee4705ca7d104ab388) ) + ROM_LOAD( "cg2a.u6", 0x4000, 0x2000, CRC(d5fd9fc2) SHA1(68472e7271f835656197109620bb3988fc52308a) ) ROM_REGION( 0x200, "proms", 0 ) // second half is empty - ROM_LOAD( "bprom.bin", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) + ROM_LOAD( "bprom.u16", 0x0000, 0x0200, CRC(a6d43709) SHA1(cbff2cb60137462dc0b7c7719a64574218d96c62) ) ROM_END @@ -6220,9 +6254,11 @@ GAME( 198?, comg903d, 0, sys903, stand903, calomega_state, empty_init, GAME( 198?, comg905d, 0, sys905, stand905, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - System 905 Diag.PROM", MACHINE_SUPPORTS_SAVE ) //************* 906-III games ************** -GAME( 1988, comg5107, 0, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 51.07 (CEI 906-III Poker)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, comg5108, 0, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 51.08 (CEI 906-III Poker)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, comg6004, 0, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 60.04 (CEI 906-III Poker)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, comg5107, 0, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 51.07 (CEI 906-III Poker, Schedule 05F)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, comg5108, 0, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 51.08 (CEI 906-III Poker, Schedule 05F)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, comg5108a, comg5108, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 51.08 (CEI 906-III Poker, Schedule 09F)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, comg5108b, comg5108, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 51.08 (CEI 906-III Poker, Schedule 21F)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, comg6004, 0, sys906, stand906, calomega_state, empty_init, ROT0, "Casino Electronics Inc.", "CEI 60.04 (CEI 906-III Poker, Schedule 09F)", MACHINE_SUPPORTS_SAVE ) //****** Unofficial 903/904/905 3rd party games ******* GAME( 1982, elgrande, 0, s903mod, elgrande, calomega_state, empty_init, ROT0, "Tuni Electro Service", "El Grande - 5 Card Draw (New)", MACHINE_SUPPORTS_SAVE ) From c790916022459371b6310345beadcaf566a47766 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 6 Apr 2024 13:40:32 +0200 Subject: [PATCH 024/109] upd765.h: remove unused variable --- src/devices/machine/upd765.cpp | 4 ++-- src/devices/machine/upd765.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/devices/machine/upd765.cpp b/src/devices/machine/upd765.cpp index 51f6d0de63d7d..694a32b099997 100644 --- a/src/devices/machine/upd765.cpp +++ b/src/devices/machine/upd765.cpp @@ -483,7 +483,7 @@ void upd765_family_device::tdr_w(uint8_t data) uint8_t upd765_family_device::msr_r() { - uint32_t msr = 0; + uint8_t msr = 0; switch(main_phase) { case PHASE_CMD: msr |= MSR_RQM; @@ -540,7 +540,7 @@ uint8_t upd765_family_device::fifo_r() switch(main_phase) { case PHASE_CMD: if(machine().side_effects_disabled()) - return 0x00; + return 0xff; if(command_pos) fifo_w(0xff); LOGFIFO("fifo_r in command phase\n"); diff --git a/src/devices/machine/upd765.h b/src/devices/machine/upd765.h index 9c28f4d17d235..3de0f392691ee 100644 --- a/src/devices/machine/upd765.h +++ b/src/devices/machine/upd765.h @@ -245,7 +245,7 @@ class upd765_family_device : public device_t { int fifo_pos, fifo_expected, command_pos, result_pos, sectors_read; bool fifo_write; - uint8_t dor, dsr, msr, fifo[16], command[16], result[16]; + uint8_t dor, dsr, fifo[16], command[16], result[16]; uint8_t st1, st2, st3; uint8_t fifocfg; uint8_t precomp; From af0682c7a0367e1feb43234037581ebda7fc98c2 Mon Sep 17 00:00:00 2001 From: Sergio G Date: Sat, 6 Apr 2024 14:55:07 +0200 Subject: [PATCH 025/109] taito/taito_x.cpp: Added PCB ref. numbers for all games (#12222) --- src/mame/taito/taito_x.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mame/taito/taito_x.cpp b/src/mame/taito/taito_x.cpp index aa46737726b29..44c97ea2163fd 100644 --- a/src/mame/taito/taito_x.cpp +++ b/src/mame/taito/taito_x.cpp @@ -13,15 +13,15 @@ video merged with video/seta.cpp Supported games: ----------------------------------------------------- - Name Company Year - Superman Taito Corp. 1988 - Twin Hawk (World) Taito Corp. Japan 1988 - Twin Hawk (US) Taito America Corp. 1988 - Daisenpu (Japan) Taito Corp. 1988 - Gigandes East Technology Corp. 1989 - Last Striker East Technology Corp. 1989 - Balloon Brothers East Technology Corp. 199? +------------------------------------------------------------------------- + Name Company Year PCB ref. + Superman Taito Corp. 1988 P0-039A + Twin Hawk (World) Taito Corp. Japan 1988 P0-051A + Twin Hawk (US) Taito America Corp. 1988 P0-051A + Daisenpu (Japan) Taito Corp. 1988 P0-051A + Gigandes East Technology Corp. 1989 P0-057A + Last Striker East Technology Corp. 1989 P0-057A + P1-046A + Balloon Brothers East Technology Corp. 199? P0-057A + P1-046A This file contains routines to interface with the Taito Controller Chip @@ -209,7 +209,7 @@ P0-057A Notes: All M-8-x ROMs are held on a plug-in sub-board. - The sub-board has printed on it "East Technology" and has PCB Number P0-046A + The sub-board has printed on it "East Technology" and has PCB Number P1-046A 68000 clock: 8.000MHz Z80 clock: 4.000MHz From affb81480614e8b0c01b9aee99e3645b2acd399a Mon Sep 17 00:00:00 2001 From: ClawGrip Date: Sat, 6 Apr 2024 14:56:43 +0200 Subject: [PATCH 026/109] namco/galaga.cpp: Add a note about Sidam version of Galaga [Xavier Panadero, Recreativas.org] (#12218) --- src/mame/namco/galaga.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/mame/namco/galaga.cpp b/src/mame/namco/galaga.cpp index 3a3af9d8a2ac7..285461348d22c 100644 --- a/src/mame/namco/galaga.cpp +++ b/src/mame/namco/galaga.cpp @@ -2397,6 +2397,17 @@ Bottom board 0400 (DIP28): Motion Object and Scratch RAM to CPU Bus Interface IC 0702 (DIP28): Sync Generator/Clock Divider IC +There's also a Sidam version of Galaga (Sidam PCB 11200, official license for the Italian market), +but, unlike Sidam's Dig Dug, this one does not use any unique ROM, but a mix between the two Namco sets: + bottom-10_2532.4d = gg1_11.4d galaga Galaga (Namco rev. B) + bottom-8_2532.4h = gg1_9.4l galaga Galaga (Namco rev. B) + bottom-9_2532.4f = gg1_10.4f galaga Galaga (Namco rev. B) + top-0_2532.3n = gg1-1.3p galagao Galaga (Namco) + top-1_2532.3m = gg1-2.3m galagao Galaga (Namco) + top-2_2532.3l = gg1_3.2m galaga Galaga (Namco rev. B) + top-3_2532.3k = gg1-4.2l galagao Galaga (Namco) + top-4_2532.3j = gg1_5b.3f galaga Galaga (Namco rev. B) + top-6_2532.3e = gg1_7b.2c galaga Galaga (Namco rev. B) */ ROM_START( galaga ) From a5c5d21c09564431bb6d7ed137c52b2d656df9e8 Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 6 Apr 2024 13:46:48 -0400 Subject: [PATCH 027/109] qbus: Add dump of Matrox QG-640 Color Display Processor Card and skeleton device implementation [AJR, Bitsavers] --- scripts/src/bus.lua | 2 + src/devices/bus/qbus/qbus.cpp | 6 +- src/devices/bus/qbus/qg640.cpp | 106 +++++++++++++++++++++++++++++++++ src/devices/bus/qbus/qg640.h | 54 +++++++++++++++++ 4 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 src/devices/bus/qbus/qg640.cpp create mode 100644 src/devices/bus/qbus/qg640.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 4bd51a776990a..5fc56dcc05a1b 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -4625,6 +4625,8 @@ if (BUSES["QBUS"]~=null) then MAME_DIR .. "src/devices/bus/qbus/pc11.h", MAME_DIR .. "src/devices/bus/qbus/qbus.cpp", MAME_DIR .. "src/devices/bus/qbus/qbus.h", + MAME_DIR .. "src/devices/bus/qbus/qg640.cpp", + MAME_DIR .. "src/devices/bus/qbus/qg640.h", MAME_DIR .. "src/devices/bus/qbus/qtx.cpp", MAME_DIR .. "src/devices/bus/qbus/qtx.h", } diff --git a/src/devices/bus/qbus/qbus.cpp b/src/devices/bus/qbus/qbus.cpp index 82379c071f071..7a375ad9032c0 100644 --- a/src/devices/bus/qbus/qbus.cpp +++ b/src/devices/bus/qbus/qbus.cpp @@ -12,10 +12,11 @@ // Peripheral boards #include "dsd4432.h" -#include "pc11.h" -#include "qtx.h" #include "dvk_kgd.h" #include "dvk_mx.h" +#include "pc11.h" +#include "qg640.h" +#include "qtx.h" void qbus_cards(device_slot_interface &device) @@ -25,6 +26,7 @@ void qbus_cards(device_slot_interface &device) device.option_add("dsd4432", DSD4432); device.option_add("kgd", DVK_KGD); device.option_add("mx", DVK_MX); + device.option_add("qg640", MATROX_QG640); } diff --git a/src/devices/bus/qbus/qg640.cpp b/src/devices/bus/qbus/qg640.cpp new file mode 100644 index 0000000000000..785f4b4ebe205 --- /dev/null +++ b/src/devices/bus/qbus/qg640.cpp @@ -0,0 +1,106 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/********************************************************************** + + Matrox QG-640 640×480×8 graphics card (skeleton) + +**********************************************************************/ + +#include "emu.h" +#include "qg640.h" + +#include "cpu/ns32000/ns32000.h" +#include "screen.h" + +// device type definition +DEFINE_DEVICE_TYPE(MATROX_QG640, qg640_device, "qg640", "Matrox QG-640 Color Display Processor Card") + +qg640_device::qg640_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, MATROX_QG640, tag, owner, clock) + , device_qbus_card_interface(mconfig, *this) + , m_qgcpu(*this, "qgcpu") + , m_fifo(*this, "fifo") + , m_acrtc(*this, "acrtc") + , m_clut(*this, "clut%u", 1U) +{ +} + +void qg640_device::device_start() +{ +} + +u32 qg640_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + return 0; +} + +u8 qg640_device::status_r() +{ + return 0; +} + +void qg640_device::unknown_w(u8 data) +{ + logerror("%s: unknown_w 0x%02X\n", machine().describe_context(), data); +} + +void qg640_device::clut_w(offs_t offset, u8 data) +{ + m_clut[BIT(offset, 18)]->write(BIT(offset, 16, 2), data); +} + +u16 qg640_device::acrtc_r(offs_t offset) +{ + return m_acrtc->read16(!BIT(offset, 17)); +} + +void qg640_device::acrtc_w(offs_t offset, u16 data) +{ + m_acrtc->write16(!BIT(offset, 17), data); +} + +void qg640_device::mem_map(address_map &map) +{ + map(0x000000, 0x01ffff).rom().region("firmware", 0); + map(0x400000, 0x400000).r(FUNC(qg640_device::status_r)); + map(0x500000, 0x500000).w(FUNC(qg640_device::unknown_w)); + map(0x600000, 0x600000).select(0x70000).w(FUNC(qg640_device::clut_w)); + map(0x780000, 0x780001).select(0x40000).rw(FUNC(qg640_device::acrtc_r), FUNC(qg640_device::acrtc_w)); + map(0xc00000, 0xc1ffff).ram(); // 4x OKI M41464-12 +} + +void qg640_device::videoram_map(address_map &map) +{ + map(0x00000, 0x7ffff).ram(); // 10x HM53461P-12 +} + +void qg640_device::device_add_mconfig(machine_config &config) +{ + NS32016(config, m_qgcpu, 18.432_MHz_XTAL / 2); // NS32016N-10 + NS32C201D-10C + m_qgcpu->set_addrmap(AS_PROGRAM, &qg640_device::mem_map); + + IDT7201(config, m_fifo); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(50_MHz_XTAL / 2, 816, 0, 640, 510, 0, 480); // 25 MHz pixel clock, 30.63 kHz horizontal, 60.07 Hz vertical + screen.set_screen_update(FUNC(qg640_device::screen_update)); + + HD63484(config, m_acrtc, 50_MHz_XTAL / 8); // SCC63484C8N64; divider unknown + m_acrtc->set_screen("screen"); + m_acrtc->set_addrmap(0, &qg640_device::videoram_map); + + BT471(config, m_clut[0], 0); // IMSG170P-35 + BT471(config, m_clut[1], 0); // IMSG170P-35 +} + +ROM_START(qg640) + ROM_REGION16_LE(0x20000, "firmware", 0) + // "COPYRIGHT (C) 1985 Matrox Electronics, Ltd." (agrees with board copyright date; EPROMs and most other ICs have 1989 date codes, however) + ROM_LOAD16_BYTE("504-8.bin", 0x00000, 0x10000, CRC(213c5804) SHA1(6ab86aeda47d148dd85a548ef716c98b61c53a1a)) // TMS27C512JL + ROM_LOAD16_BYTE("505-8.bin", 0x00001, 0x10000, CRC(73610833) SHA1(815b195c37ca1053e5cddfa1efd4764c4550f4b5)) // TMS27C512JL +ROM_END + +const tiny_rom_entry *qg640_device::device_rom_region() const +{ + return ROM_NAME(qg640); +} diff --git a/src/devices/bus/qbus/qg640.h b/src/devices/bus/qbus/qg640.h new file mode 100644 index 0000000000000..30cd93ca0ce1f --- /dev/null +++ b/src/devices/bus/qbus/qg640.h @@ -0,0 +1,54 @@ +// license:BSD-3-Clause +// copyright-holders:AJR + +#ifndef MAME_BUS_QBUS_QG640_H +#define MAME_BUS_QBUS_QG640_H + +#pragma once + +#include "qbus.h" +#include "machine/7200fifo.h" +#include "video/bt47x.h" +#include "video/hd63484.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> qg640_device + +class qg640_device : public device_t, public device_qbus_card_interface +{ +public: + // device type constructor + qg640_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + +private: + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + u8 status_r(); + void unknown_w(u8 data); + void clut_w(offs_t offset, u8 data); + u16 acrtc_r(offs_t offset); + void acrtc_w(offs_t offset, u16 data); + + void mem_map(address_map &map); + void videoram_map(address_map &map); + + required_device m_qgcpu; + required_device m_fifo; + required_device m_acrtc; + required_device_array m_clut; +}; + +// device type declaration +DECLARE_DEVICE_TYPE(MATROX_QG640, qg640_device) + +#endif // MAME_BUS_QBUS_QG640_H From 913e4343fb14d5057d71f6924cc8ab33ea352f9a Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Sat, 6 Apr 2024 23:22:54 +0200 Subject: [PATCH 028/109] misc/calomega.cpp: Added more / corrected documentation. --- src/mame/misc/calomega.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/mame/misc/calomega.cpp b/src/mame/misc/calomega.cpp index b472a7f884d1d..52b0b3725c5eb 100644 --- a/src/mame/misc/calomega.cpp +++ b/src/mame/misc/calomega.cpp @@ -136,16 +136,17 @@ -----+--------------------------+---------+---------+----------+---------+----------+---------+---------------+------+------+------- VER | NAME | SYSTEM | PROGRAM | CHAR GEN | CG P/N | CLR PROM | CP P/N | GAME TYPE | DUMP | STAT | ADDED -----+--------------------------+---------+---------+----------+---------+----------+---------+---------------+------+------+------- - * 7.4 | Gaming Poker (w. export) | 903 | AUG/81 | PKCG | 6300010 | unknown | 6600020 | Gaming | Yes | OK | Yes + * 7.4 | Gaming Poker (w. export) | 903 | AUG/81 | PKCG | 6300010 | POKCLR | 6600020 | Gaming | Yes | OK | Yes 7.6 | Poker | 903 | AUG/81 | PKCG | 6300010 | POKCLR | 6600020 | Amusement | Yes | OK | Yes * 7.9 | Arcade Poker | 903 | AUG/81 | PKCG | 6300010 | POKCLR | 6600020 | Amusement | Yes | BD | Yes * 8.0 | Arcade Black Jack | 903 | SEP/81 | CPKCG | 6300010 | POKCLR | 6600020 | Amusement | Yes | BD | Yes * 9.4 | Keno | 903 | DEC/81 | KCG | 6300060 | POKCLR | 6600020 | Amusement | Yes | OK | Yes - * 10.7 | Big Game | 903 | MAR/82 | LOTCG | unknown | BCLR | unknown | Amusement? | Yes | OK | Yes + 10.2 | Keno | 903 | DEC/81 | KCG | 6300060 | POKCLR | 6600020 | Amusement | No | | No + * 10.7 | Big Game Lottery | 904 | MAR/82 | LOTCG | 6300050 | LOTCLR | 6600030 | Gaming | Yes | OK | Yes * 11.3 | Black Jack | 903 | | CPKCG? | 6300010 | POKCLR | 6600020 | Amusement? | No | | No * 12.3 | Ticket Poker | 903 | JUN/82 | PKCG | 6300010 | POKCLR | 6600020 | Amusement | Yes | BD | Yes - * 12.5 | Bingo | 903 | JUN/82 | NBCG | unknown | BCLR | unknown | Amusement | Yes | OK | Yes - * 12.7 | Keno | 903/4? | JUL/82 | KCG | 6300060 | POKCLR | 6600020 | Amusement | Yes | OK | Yes + * 12.5 | Nudge Bingo | 903 | JUN/82 | NBCG | 6300040 | BCLR | 6300040 | Amusement | Yes | OK | Yes + * 12.7 | Keno | 903 | JUL/82 | KCG | 6300060 | POKCLR | 6600020 | Amusement | Yes | OK | Yes * 12.8 | Arcade Game (Draw Poker) | 903 | JUL/82 | PKCG | 6300010 | POKCLR | 6600020 | Amusement | Yes | OK | Yes 13.4 | Nudge Bingo | 903 | SEP/82 | NBCG | 6300040 | BCLR | 6600040 | Amusement | Yes | OK | Yes 14.5 | Pixels | 903 | DEC/82 | PIXCG | 6300070 | PIXCLR | 6600050 | Amusement | Yes | BD | Yes @@ -261,7 +262,7 @@ | | | | | | | | | | | 51.07| Poker (906-III) | 906-III | | GP2CG | unknown | WILD | unknown | Nevada Gaming | Yes | OK | Yes 51.08| Poker (906-III) | 906-III | | GP2CG | unknown | WILD | unknown | Nevada Gaming | Yes | OK | Yes - 60.04| Poker (906-III) | 906-III | | GP2CG | unknown | WILD | unknown | Nevada Gaming | Yes | OK | Yes + * 60.04| Poker (906-III) | 906-III | | GP2CG | unknown | WILD | unknown | Nevada Gaming | Yes | OK | Yes | | | | | | | | | | | * 903d | System 903 Diag.PROM | 903 | unknown | any | unknown | any | unknown | Testing H/W | Yes | OK | Yes * 905d | System 905 Diag.PROM | 905 | unknown | any | unknown | any | unknown | Testing H/W | Yes | OK | Yes @@ -4898,7 +4899,7 @@ ROM_START( comg079 ) // Cal Omega v7.9 (Arcade Poker) ROM_LOAD( "pkcga.u68", 0x1000, 0x0800, CRC(6e3e9b1d) SHA1(14eb8d14ce16719a6ad7d13db01e47c8f05955f0) ) ROM_REGION( 0x100, "proms", 0 ) - ROM_LOAD( "clrprom_7.9.u28", 0x0000, 0x0100,CRC(a26a8fae) SHA1(d570fe9443a0912bd34b81ac4c3e4c5f8901f523) ) + ROM_LOAD( "clrprom_7.9.u28", 0x0000, 0x0100, CRC(a26a8fae) SHA1(d570fe9443a0912bd34b81ac4c3e4c5f8901f523) ) ROM_END ROM_START( comg080 ) // Cal Omega v8.0 (Arcade Black Jack) From c6c79c7252809f4203601830ef6a922f7b7a416d Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Sat, 6 Apr 2024 23:53:02 +0200 Subject: [PATCH 029/109] misc/calomega.cpp: * Changed comg175 game description to Cal Omega - Game 17.51 (Gaming Draw Poker, Sch 07-0T) * Added more / corrected documentation. --- src/mame/misc/calomega.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/mame/misc/calomega.cpp b/src/mame/misc/calomega.cpp index 52b0b3725c5eb..ba570b4092eaa 100644 --- a/src/mame/misc/calomega.cpp +++ b/src/mame/misc/calomega.cpp @@ -153,24 +153,25 @@ 14.7 | Nudge Bingo | 903 | | NBCG | 6300040 | BCLR | 6600040 | Amusement | No | | No 15.0 | Punchboard | 903 | | PBCG | 6300190 | PBCLR | 6600130 | Gaming Wash | No | | No 15.7 | Double-Draw Poker | 903 | JAN/83 | CPKCG | 6300010 | POKCLR | 6600020 | Amusement | Yes | OK | Yes - 15.8 | Poker Montana | ? | | CPKCG | 6300010 | POKCLR | 6600020 | Gaming | No | | No + 15.8 | Poker Montana | 904 | | CPKCG | 6300010 | POKCLR | 6600020 | Gaming | No | | No 15.9 | Wild Double-Up | 905 | JAN/83 | JKR2CG | 6300100 | WLDCLR | 6600010 | Amusement | Yes | OK | Yes - 16.2 | Gaming Lottery | ? | | LCG | 6300050 | LOTCLR | 6600030 | Gaming | No | | No - 16.3 | Black Jack | ? | | CPKCG | 6300010 | POKCLR | 6600020 | Amusement | No | | No + 16.2 | Gaming Lottery | 904 | | LCG | 6300050 | LOTCLR | 6600030 | Gaming | No | | No + 16.3 | Black Jack | 903 | | CPKCG | 6300010 | POKCLR | 6600020 | Amusement | No | | No 16.4 | K.I.S.S. Keno | 904 | MAY/83 | KCG | 6300060 | PCLR | 6600020 | Amusement | Yes | IC | Yes - 16.5 | K.I.S.S. Poker | ? | | POKER | 6300010 | POKCLR | 6600020 | Amusement | No | | No - 16.6 | Nudge Bingo | ? | | NBCG | 6300040 | BCOLOR | 6600040 | Amusement | No | | No - 16.7 | Poker | ? | | PCG | 6300010 | POKCLR | 6600020 | Amusement | No | | No - 16.8 | Keno | 903 | MAR/83 | KCG | 6300060 | POKCLR | 6600020 | Amusement | Yes | OK | Yes - 17.0 | Poker | 905 | | POKERCGs | 6300010 | PKRCLR | 6600020 | Amusement | Yes | | Yes - 17.1 | Nudge Bingo | ? | | NBCG | 6300040 | BCOLOR | 6600040 | Amusement | No | | No + 16.5 | K.I.S.S. Poker | 903 | | POKER | 6300010 | POKCLR | 6600020 | Amusement | No | | No + 16.6 | Nudge Bingo | 903 | | NBCG | 6300040 | BCOLOR | 6600040 | Amusement | No | | No + 16.7 | Poker | 903 | | PCG | 6300010 | POKCLR | 6600020 | Amusement | No | | No + 16.8 | Arcade Keno | 903 | MAR/83 | KCG | 6300060 | POKCLR | 6600020 | Amusement | Yes | OK | Yes + * 16.9 | Keno | 904 | | KCG | | | | Gaming | No | | No + 17.0 | Amusement Poker | 905 | | JKRPKR | 6300010 | PKRCLR | 6600020 | Amusement | Yes | OK | Yes + 17.1 | Nudge Bingo | 903 | | NBCG | 6300040 | BCOLOR | 6600040 | Amusement | No | | No 17.2 | Double/Double Poker | 905 | MAY/83 | JKRPKR | 6300100 | WLDCLR | 6600010 | Amusement | Yes | OK | Yes - 17.3 | Casino Poker | ? | | PKCG | 6300010 | POKCLR | 6600020 | Nevada Gaming | No | | No - 17.4 | Gin Gaming | ? | | GCG0.2 | 6300080 | GINCLR | 6600060 | Nevada Gaming | No | | No - 17.5 | Gaming Draw Poker | 903 | DEC/84 | PKCG | 6300010 | POKCLR | 6600020 | Nevada Gaming | Yes | OK | Yes + 17.3 | Casino Poker | 904 | | PKCG | 6300010 | POKCLR | 6600020 | Nevada Gaming | No | | No + 17.4 | Gin Gaming | 904 | | GCG0.2 | 6300080 | GINCLR | 6600060 | Nevada Gaming | No | | No + 17.5 | Gaming Draw Poker | 904 | DEC/84 | PKCG | 6300010 | POKCLR | 6600020 | Nevada Gaming | Yes | OK | Yes 17.6 | Nudge | 903 | SEP/82 | NBCG | 6300040 | BCLR | 6600040 | Amusement | Yes | OK | Yes - 17.7 | Keno | ? | | KCG | 6300060 | POKCLR | 6600020 | Gaming | No | | No - 17.9 | AWP Poker | ? | | PKCG | 6300010 | POKCLR | 6600020 | Gaming | No | | No + 17.7 | Keno | 904 | | KCG | 6300060 | POKCLR | 6600020 | Gaming | No | | No + 17.9 | AWP Poker | 904 | | PKCG | 6300010 | POKCLR | 6600020 | Gaming | No | | No * 18.0 | Gin | 905 | | GCG2 | 6300110 | MLTCLR | 6600070 | Amusement | No | | No 18.1 | Nudge | ? | JUL/83 | NBCG | 6300040 | BCLR | 6600040 | Amusement | Yes | OK | Yes 18.2 | Amusement Poker | 905 | | JKRCG02 | 6300100 | WLDCLR | 6600010 | Amusement | No | | No @@ -6230,7 +6231,7 @@ GAMEL( 1983, comg164, 0, sys903kb, keno_903, calomega_state, empty_init, GAMEL( 1983, comg168, 0, sys903kb, keno_903, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 16.8 (Keno)", MACHINE_SUPPORTS_SAVE, layout_kenokb ) GAME( 1983, comg170, 0, sys905, comg170, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 17.0 (Amusement Poker)", MACHINE_SUPPORTS_SAVE ) GAME( 1983, comg172, 0, sys905, comg172, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 17.2 (Double Double Poker)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, comg175, 0, sys903, gdrwpkrd, calomega_state, empty_init, ROT0, "Cal Omega / Casino Electronics Inc.", "Cal Omega - Game 17.51 (Gaming Draw Poker)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, comg175, 0, sys903, gdrwpkrd, calomega_state, empty_init, ROT0, "Cal Omega / Casino Electronics Inc.", "Cal Omega - Game 17.51 (Gaming Draw Poker, Sch 07-0T)", MACHINE_SUPPORTS_SAVE ) GAME( 1982, comg176, 0, sys903, nudgensw, calomega_state, init_comg176, ROT0, "Cal Omega Inc.", "Cal Omega - Game 17.6 (Nudge)", MACHINE_SUPPORTS_SAVE ) GAME( 1982, comg181, 0, sys903, nudgesw, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 18.1 (Nudge)", MACHINE_SUPPORTS_SAVE ) GAME( 1983, comg183, 0, sys905, pixels, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 18.3 (Pixels)", MACHINE_SUPPORTS_SAVE ) From b49381262bb9f9af175e0573c06b1c04d23c4d6c Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 7 Apr 2024 01:12:32 +0200 Subject: [PATCH 030/109] i186: fix dma on timer2 and timer2 as prescaler (#12223) * i186: fix drq_callback case when used with timer 2 * i186: only run timer 0,1 when not incremented via timer 2 pre-scaler --- src/devices/cpu/i86/i186.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/devices/cpu/i86/i186.cpp b/src/devices/cpu/i86/i186.cpp index 7f64274ce6e68..8312c30677322 100644 --- a/src/devices/cpu/i86/i186.cpp +++ b/src/devices/cpu/i86/i186.cpp @@ -1258,9 +1258,9 @@ TIMER_CALLBACK_MEMBER(i80186_cpu_device::timer_elapsed) if (which == 2) { - if ((m_dma[0].control & (TIMER_DRQ | ST_STOP)) == TIMER_DRQ) + if ((m_dma[0].control & (TIMER_DRQ | ST_STOP)) == (TIMER_DRQ | ST_STOP)) drq_callback(0); - if ((m_dma[1].control & (TIMER_DRQ | ST_STOP)) == TIMER_DRQ) + if ((m_dma[1].control & (TIMER_DRQ | ST_STOP)) == (TIMER_DRQ | ST_STOP)) drq_callback(1); if ((m_timer[0].control & 0x800c) == 0x8008) inc_timer(0); @@ -1308,6 +1308,10 @@ TIMER_CALLBACK_MEMBER(i80186_cpu_device::timer_elapsed) void i80186_cpu_device::restart_timer(int which) { timer_state *t = &m_timer[which]; + /* Only run timer 0,1 when not incremented via timer 2 pre-scaler */ + if (which != 2 && (t->control & 0x800c) == 0x8008) + return; + int count = (t->control & 0x1000) ? t->maxB : t->maxA; if (!(t->control & 4)) t->int_timer->adjust((attotime::from_hz(clock() / 8) * (count ? count : 0x10000)), which); From bff369c5e933a8fb25c51ba09c00b80b9291cd5e Mon Sep 17 00:00:00 2001 From: simzy39 <45438677+simzy39@users.noreply.github.com> Date: Sat, 6 Apr 2024 18:13:36 -0500 Subject: [PATCH 031/109] Update notes on Teckno Werk in namcos12.cpp (#12217) --- src/mame/namco/namcos12.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mame/namco/namcos12.cpp b/src/mame/namco/namcos12.cpp index 644042a503ffe..f8c3698e57073 100644 --- a/src/mame/namco/namcos12.cpp +++ b/src/mame/namco/namcos12.cpp @@ -95,7 +95,8 @@ This was cancelled, only the flyer exists. It was shown only at an amusement show. Possibly a prototype still exists. Possibly not. Tekno Werk (C) Namco, 1999 -Some kind of music game similar to Konami's Keyboard Mania series +A music game with two 17-key Yamaha keyboards side by side for 2 players +Video: https://www.youtube.com/watch?v=uGlt0HM67l8 The Namco System 12 system comprises 3 mandatory PCB's.... MOTHER PCB - This is the main PCB. It holds all sound circuitry, sound ROMs, program ROMs, shared RAM, bank-switching From b94d5da3c26faa1099c1158f1a1cc60149c1936c Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sun, 7 Apr 2024 07:34:33 +0200 Subject: [PATCH 032/109] seta/namcoeva.cpp: copied over sound and keycus handling from namco/namcond1.cpp --- src/mame/seta/namcoeva.cpp | 104 ++++++++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 18 deletions(-) diff --git a/src/mame/seta/namcoeva.cpp b/src/mame/seta/namcoeva.cpp index cf958992350cb..64bd27f803bc7 100644 --- a/src/mame/seta/namcoeva.cpp +++ b/src/mame/seta/namcoeva.cpp @@ -17,23 +17,24 @@ with - MACH111 PLD (KC026) - 2x banks of 8 DIP switches - 50 MHz XTAL -- 26.670 MHz XTAL +- 26.670 MHz XTAL (possibly for the video chips) I/O board: NAMCO M136 I/O PCB - hi-pric P41 B - 1423961101 (1423971101) with -Motorola MC68HC11K1 -Fuji MB8422 DPRAM -8 MHz XTAL +- Motorola MC68HC11K1 +- Fuji MB8422 DPRAM +- 8 MHz XTAL -The game runs without IO board to test mode but will not go in game (error 07) +On real hardware, the game runs without IO board to test mode but will not go in game (error 07) TODO: - currently starts with 9 credits inserted. After entering and exiting test mode, the game shows 0 coins and can be coined up normally; - implement proper controls. The game has a peculiar input setup (see video link above); -- complete sound hook up (missing IRQ?). Puts same string as namco/namcod1.cpp in H8 RAM ("Quattro Ver.1.2.H8"); +- sound system is the same as namco/namcond1.cpp (puts "Quattro Ver.1.2.H8" in H8 RAM). Ir interacts + with the keycus. Handling is copied over from said driver, but could probably be improved; - after coining up there's a GFX bug that maybe points to some unimplemented feature in seta2_v.cpp; - once the video emulation in seta/seta2_v.cpp has been devicified, remove derivation from seta/seta2.h and possibly move to namco/ folder. @@ -58,7 +59,7 @@ The game runs without IO board to test mode but will not go in game (error 07) #define LOG_IOCPU (1U << 2) #define LOG_SUBCPU (1U << 3) -#define VERBOSE (2) +//#define VERBOSE (LOG_GENERAL | LOG_MAINCPU | LOG_IOCPU | LOG_SUBCPU) #include "logmacro.h" @@ -80,6 +81,10 @@ class namcoeva_state : public seta2_state void hammerch(machine_config &config) ATTR_COLD; +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + private: required_device m_subcpu; required_device m_iocpu; @@ -87,17 +92,79 @@ class namcoeva_state : public seta2_state void maincpu_map(address_map &map) ATTR_COLD; void subcpu_map(address_map &map) ATTR_COLD; void iocpu_map(address_map &map) ATTR_COLD; + + uint8_t m_h8_irq5_enabled = 0; + + uint16_t keycus_r(offs_t offset); + void keycus_w(offs_t offset, uint16_t data); + INTERRUPT_GEN_MEMBER(mcu_interrupt); }; +void namcoeva_state::machine_start() +{ + save_item(NAME(m_h8_irq5_enabled)); +} + +void namcoeva_state::machine_reset() +{ + m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + + m_h8_irq5_enabled = 0; +} + + +uint16_t namcoeva_state::keycus_r(offs_t offset) +{ + switch (offset) + { + // this address returns a jump vector inside ISR2 + // - if zero then the ISR returns without jumping + case (0x2e >> 1): + return 0x0000; + case (0x30 >> 1): + return 0x0000; + + default: + return 0; + } +} + +void namcoeva_state::keycus_w(offs_t offset, uint16_t data) +{ + switch (offset) + { + case (0x0a >> 1): + // this is a kludge + if ((m_h8_irq5_enabled == 0) && (data != 0x0000)) + { + m_subcpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + } + m_h8_irq5_enabled = (data != 0x0000); + break; + + default: + break; + } +} + +INTERRUPT_GEN_MEMBER(namcoeva_state::mcu_interrupt) +{ + if (m_h8_irq5_enabled) + { + device.execute().pulse_input_line(5, device.execute().minimum_quantum_time()); + } +} + + void namcoeva_state::maincpu_map(address_map &map) { map(0x000000, 0x07ffff).rom(); map(0x200000, 0x20ffff).ram(); map(0x210000, 0x21002f).ram(); // ?? map(0x300000, 0x3001ff).ram(); // ?? - //map(0x400000, 0x40ffff).ram().share("sharedram"); // writes here, but if mapped code loops (probably some missing IRQ). Sound test shows these are audio-related comms. - map(0x600000, 0x600001).portr("IN0"); // TODO: inputs aren't tested yet + map(0x400000, 0x40ffff).ram().share("sharedram"); + map(0x600000, 0x600001).portr("IN0"); map(0x600002, 0x600003).portr("IN1"); map(0x600004, 0x600005).portr("IN2"); map(0x600006, 0x600007).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); @@ -105,10 +172,10 @@ void namcoeva_state::maincpu_map(address_map &map) map(0x600300, 0x600301).portr("DSW1"); map(0x600302, 0x600303).portr("DSW2"); map(0x800000, 0x800fff).rw("dpram", FUNC(mb8421_device::left_r), FUNC(mb8421_device::left_w)).umask16(0x00ff); // EXT IO CHECK: NG if unmapped - map(0xa00000, 0xa3ffff).ram().share("spriteram"); + map(0xa00000, 0xa3ffff).ram().share(m_spriteram); map(0xa40000, 0xa4ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0xa60000, 0xa6003f).ram().w(FUNC(namcoeva_state::vregs_w)).share("vregs"); - map(0xc3ff00, 0xc3ffff).ram(); // keycus? + map(0xa60000, 0xa6003f).ram().w(FUNC(namcoeva_state::vregs_w)).share(m_vregs); + map(0xc3ff00, 0xc3ffff).rw(FUNC(namcoeva_state::keycus_r), FUNC(namcoeva_state::keycus_w)); } void namcoeva_state::subcpu_map(address_map &map) @@ -259,13 +326,13 @@ static const gfx_layout tile_layout = /* Tiles are 8bpp, but the hardware is additionally able to discard some bitplanes and use the low 4 bits only, or the high 4 bits only */ static GFXDECODE_START( gfx_dx_10x ) - GFXDECODE_ENTRY( "sprites", 0, tile_layout, 0, 0x8000/16 ) // 8bpp, but 4bpp color granularity + GFXDECODE_ENTRY( "sprites", 0, tile_layout, 0, 0x8000 / 16 ) // 8bpp, but 4bpp color granularity GFXDECODE_END void namcoeva_state::hammerch(machine_config &config) { - tmp68301_device &maincpu(TMP68301(config, m_maincpu, 50_MHz_XTAL / 4)); // TODO: divider not verified + tmp68301_device &maincpu(TMP68301(config, m_maincpu, 50_MHz_XTAL / 4)); // TODO: clock and divider not verified maincpu.set_addrmap(AS_PROGRAM, &namcoeva_state::maincpu_map); maincpu.parallel_r_cb().set([this] () { LOGMAINCPU("%s: P4 read\n", machine().describe_context()); return uint16_t(0); }); maincpu.parallel_w_cb().set([this] (uint8_t data) { LOGMAINCPU("%s: P4 write %04x\n", machine().describe_context(), data); }); @@ -275,8 +342,9 @@ void namcoeva_state::hammerch(machine_config &config) WATCHDOG_TIMER(config, "watchdog"); - H83002(config, m_subcpu, 26.670_MHz_XTAL / 2); // TODO: divider not verified + H83002(config, m_subcpu, 50_MHz_XTAL / 3); // TODO: clock and divider not verified m_subcpu->set_addrmap(AS_PROGRAM, &namcoeva_state::subcpu_map); + m_subcpu->set_vblank_int("screen", FUNC(namcoeva_state::mcu_interrupt)); // seems to only use P4 read at start up m_subcpu->read_port4().set([this] () { LOGSUBCPU("%s: P4 read\n", machine().describe_context()); return u8(0); }); m_subcpu->write_port4().set([this] (u8 data) { LOGSUBCPU("%s: P4 write %02x\n", machine().describe_context(), data); }); @@ -344,7 +412,7 @@ void namcoeva_state::hammerch(machine_config &config) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - c352_device &c352(C352(config, "c352", 50_MHz_XTAL / 3, 288)); // TODO: divider not verified + c352_device &c352(C352(config, "c352", 50_MHz_XTAL / 2, 288)); // TODO: clock and divider not verified c352.add_route(0, "lspeaker", 1.00); c352.add_route(1, "rspeaker", 1.00); c352.add_route(2, "lspeaker", 1.00); @@ -356,7 +424,7 @@ ROM_START( hammerch ) ROM_REGION( 0x200000, "maincpu", 0 ) // TMP68301 ROM_LOAD16_WORD( "hc1_main0.u02", 0x00000, 0x80000, CRC(150164bb) SHA1(c99f03718fd1002386bfbf8695b7010ec5dad168) ) - ROM_REGION( 0x80000, "subcpu", 0 ) // H8/3007 + ROM_REGION( 0x80000, "subcpu", 0 ) // H8/3002 ROM_LOAD( "hc1_sub0.u47", 0x00000, 0x80000, CRC(4762451a) SHA1(b46bf1eaeac317264eb80c2e3f50d2821791569f) ) // 11xxxxxxxxxxxxxxxxx = 0xFF ROM_REGION( 0x10000, "iocpu", 0 ) // MC68HC11K1 @@ -375,4 +443,4 @@ ROM_END } // anonymous namespace -GAME( 1997, hammerch, 0, hammerch, hammerch, namcoeva_state, empty_init, ROT0, "Namco", "Hammer Champ (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) +GAME( 1997, hammerch, 0, hammerch, hammerch, namcoeva_state, empty_init, ROT0, "Namco", "Hammer Champ (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) From fc557a680816cabe2f65c3f4ec7dedfb173fc940 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 7 Apr 2024 15:32:00 +0200 Subject: [PATCH 033/109] chessac: correct typo --- src/mame/saitek/chessac.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mame/saitek/chessac.cpp b/src/mame/saitek/chessac.cpp index eac007ec4ec39..6f36e434dc629 100644 --- a/src/mame/saitek/chessac.cpp +++ b/src/mame/saitek/chessac.cpp @@ -81,7 +81,7 @@ class chessac_state : public driver_device u8 m_lcd_com = 0; u8 m_led_select = 0; u8 m_led_data = 0; - u32 m_adpdm_address = 0; + u32 m_adpcm_address = 0; u8 m_port3 = 0xff; u8 m_port5 = 0xff; @@ -115,7 +115,7 @@ void chessac_state::machine_start() save_item(NAME(m_lcd_com)); save_item(NAME(m_led_select)); save_item(NAME(m_led_data)); - save_item(NAME(m_adpdm_address)); + save_item(NAME(m_adpcm_address)); save_item(NAME(m_port3)); save_item(NAME(m_port5)); save_item(NAME(m_port7)); @@ -197,7 +197,7 @@ void chessac_state::update_adpcm_address() if (BIT(m_port3, i)) { const u8 shift = 8 * i; - m_adpdm_address = (m_adpdm_address & ~(0xff << shift)) | (m_port7 << shift); + m_adpcm_address = (m_adpcm_address & ~(0xff << shift)) | (m_port7 << shift); } } @@ -214,7 +214,7 @@ void chessac_state::p3_w(u8 data) m_okim6588->data_w(m_port7); // P33: ADPCM ROM CE - // P30-P33: enable ADPCM ROM address latches + // P30-P32: enable ADPCM ROM address latches m_port3 = data; update_adpcm_address(); } @@ -266,7 +266,7 @@ u8 chessac_state::p7_r() // P70-P77: read ADPCM ROM if (~m_port3 & 8) - data &= m_adpcm_rom[m_adpdm_address & (m_adpcm_rom.bytes() - 1)]; + data &= m_adpcm_rom[m_adpcm_address & (m_adpcm_rom.bytes() - 1)]; // P70-P73: read MSM6588 status if ((m_port3 & 0xf0) == 0xa0) From 2361b22ac7c6c7042f23be93ed672dc402857a81 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 7 Apr 2024 16:27:26 +0200 Subject: [PATCH 034/109] lottofun: fix old regression with ticket dispenser --- src/mame/midway/williams.cpp | 4 ++-- src/mame/misc/dcheese.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mame/midway/williams.cpp b/src/mame/midway/williams.cpp index cb0d98a53c9ad..fa0f7ec8e6a35 100644 --- a/src/mame/midway/williams.cpp +++ b/src/mame/midway/williams.cpp @@ -1690,7 +1690,7 @@ void williams_state::lottofun(machine_config &config) williams_b1(config); // pia - m_pia[0]->writepa_handler().set("ticket", FUNC(ticket_dispenser_device::motor_w)).bit(7); + m_pia[0]->writepb_handler().set("ticket", FUNC(ticket_dispenser_device::motor_w)).bit(7); m_pia[0]->ca2_handler().set([this](int state) { machine().bookkeeping().coin_lockout_global_w(state); }); TICKET_DISPENSER(config, "ticket", attotime::from_msec(70), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH); @@ -3913,7 +3913,7 @@ GAME( 1985, spdball, 0, spdball, spdball, spdball_state, e GAME( 1985, alienar, 0, joust, alienar, wms_muxed_state, init_alienar, ROT0, "Duncan Brown", "Alien Arena", MACHINE_SUPPORTS_SAVE ) GAME( 1985, alienaru, alienar, joust, alienar, wms_muxed_state, init_alienar, ROT0, "Duncan Brown", "Alien Arena (Stargate upgrade)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, lottofun, 0, lottofun, lottofun, williams_state, empty_init, ROT0, "H.A.R. Management", "Lotto Fun", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, lottofun, 0, lottofun, lottofun, williams_state, empty_init, ROT0, "HAR Management", "Lotto Fun", MACHINE_SUPPORTS_SAVE ) // 2nd Generation Williams hardware with tilemaps diff --git a/src/mame/misc/dcheese.cpp b/src/mame/misc/dcheese.cpp index 5d90102ac83fa..b6855b1367ef3 100644 --- a/src/mame/misc/dcheese.cpp +++ b/src/mame/misc/dcheese.cpp @@ -777,8 +777,8 @@ ROM_END * *************************************/ -GAME( 1993, dcheese, 0, dcheese, dcheese, dcheese_state, empty_init, ROT90, "HAR", "Double Cheese", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, lottof2, 0, dcheese, lottof2, dcheese_state, empty_init, ROT0, "HAR", "Lotto Fun 2", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, dcheese, 0, dcheese, dcheese, dcheese_state, empty_init, ROT90, "HAR Management", "Double Cheese", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, lottof2, 0, dcheese, lottof2, dcheese_state, empty_init, ROT0, "HAR Management", "Lotto Fun 2", MACHINE_SUPPORTS_SAVE ) GAME( 1993, cecmatch, 0, fredmem, fredmem, dcheese_state, empty_init, ROT0, "Coastal Amusements", "ChuckECheese's Match Game", MACHINE_SUPPORTS_SAVE ) GAME( 1994, fredmem, 0, fredmem, fredmem, dcheese_state, empty_init, ROT0, "Coastal Amusements", "Fred Flintstone's Memory Match (World?, Ticket version, 3/17/95)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, fredmemus, fredmem, fredmem, fredmem, dcheese_state, empty_init, ROT0, "Coastal Amusements", "Fred Flintstone's Memory Match (US, High Score version, 3/10/95)", MACHINE_SUPPORTS_SAVE ) From 3a7868fd3004cf1eb09febe9c38699e03e3e47f7 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 7 Apr 2024 10:02:59 -0500 Subject: [PATCH 035/109] i186: remove outdated error message --- src/devices/cpu/i86/i186.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/devices/cpu/i86/i186.cpp b/src/devices/cpu/i86/i186.cpp index 8312c30677322..1e368bc5c6755 100644 --- a/src/devices/cpu/i86/i186.cpp +++ b/src/devices/cpu/i86/i186.cpp @@ -1490,11 +1490,6 @@ void i80186_cpu_device::update_dma_control(int which, int new_control) new_control = (new_control & ~ST_STOP) | (d->control & ST_STOP); new_control &= ~CHG_NOCHG; - /* check for control bits we don't handle */ - int diff = new_control ^ d->control; - if (diff & 0x6811) - LOGMASKED(LOG_DMA, "%05X:ERROR! - unsupported DMA mode %04X\n", m_pc, new_control); - LOGMASKED(LOG_DMA, "Initiated DMA %d - count = %04X, source = %04X, dest = %04X\n", which, d->count, d->source, d->dest); /* set the new control register */ From 8c0dea9bb3c02626897a56553e26e3de29a38e2e Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Sun, 7 Apr 2024 21:44:55 +0100 Subject: [PATCH 036/109] bus/msx/slot/disk.cpp: Small improvement to Turbo-R disk interface. (#12221) * Add register mirrors. * Add read back of rom bank. * Add stubs for reading media change and some unknown registers. * Connect disk change signal. --- src/devices/bus/msx/slot/disk.cpp | 46 ++++++++++++++++++++++++++++++- src/devices/bus/msx/slot/disk.h | 7 ++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/devices/bus/msx/slot/disk.cpp b/src/devices/bus/msx/slot/disk.cpp index 1865797c206c7..98df7665654ac 100644 --- a/src/devices/bus/msx/slot/disk.cpp +++ b/src/devices/bus/msx/slot/disk.cpp @@ -598,13 +598,27 @@ void msx_slot_disk4_tc8566_device::device_start() m_rombank->set_entry(0); page(1)->install_read_bank(0x4000, 0x7fff, m_rombank); + page(1)->install_read_handler(0x7ff0, 0x7ff0, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::bank_r))); page(1)->install_write_handler(0x7ff0, 0x7ff0, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::bank_w))); - // 0x7ff1 media change register + page(1)->install_read_handler(0x7ff1, 0x7ff1, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::media_change_r))); page(1)->install_write_handler(0x7ff2, 0x7ff2, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::dor_w))); page(1)->install_write_handler(0x7ff3, 0x7ff3, emu::rw_delegate(*m_fdc, FUNC(tc8566af_device::cr1_w))); page(1)->install_read_handler(0x7ff4, 0x7ff4, emu::rw_delegate(*m_fdc, FUNC(tc8566af_device::msr_r))); page(1)->install_read_handler(0x7ff5, 0x7ff5, emu::rw_delegate(*m_fdc, FUNC(tc8566af_device::fifo_r))); page(1)->install_write_handler(0x7ff5, 0x7ff5, emu::rw_delegate(*m_fdc, FUNC(tc8566af_device::fifo_w))); + page(1)->install_read_handler(0x7ffc, 0x7ffc, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::unk_7ffc_r))); + page(1)->install_read_handler(0x7ffd, 0x7ffd, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::unk_7ffd_r))); + page(1)->install_read_handler(0x7fff, 0x7fff, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::unk_7fff_r))); + // TODO: Investigate on real unit + // Some or all register reads are mirrored? Register writes also? + // At least msr_r must be mirrored otherwise Microcabin software will not boot (on FS-A1ST). + page(2)->install_read_handler(0xbff0, 0xbff0, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::bank_r))); + page(2)->install_read_handler(0xbff1, 0xbff1, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::media_change_r))); + page(2)->install_read_handler(0xbff4, 0xbff4, emu::rw_delegate(*m_fdc, FUNC(tc8566af_device::msr_r))); + page(2)->install_read_handler(0xbff5, 0xbff5, emu::rw_delegate(*m_fdc, FUNC(tc8566af_device::fifo_r))); + page(2)->install_read_handler(0xbffc, 0xbffc, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::unk_7ffc_r))); + page(2)->install_read_handler(0xbffd, 0xbffd, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::unk_7ffd_r))); + page(2)->install_read_handler(0xbfff, 0xbfff, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::unk_7fff_r))); } void msx_slot_disk4_tc8566_device::device_add_mconfig(machine_config &config) @@ -612,11 +626,41 @@ void msx_slot_disk4_tc8566_device::device_add_mconfig(machine_config &config) add_mconfig(config); } +u8 msx_slot_disk4_tc8566_device::bank_r() +{ + return m_rombank->entry(); +} + void msx_slot_disk4_tc8566_device::bank_w(u8 data) { m_rombank->set_entry(data & 0x03); } +u8 msx_slot_disk4_tc8566_device::media_change_r() +{ + return (m_floppy[0] && m_floppy[0]->get_device()->dskchg_r() ? 0x10 : 0x00) | + (m_floppy[1] && m_floppy[1]->get_device()->dskchg_r() ? 0x20 : 0x00) | + 0x03 + ; +} + +u8 msx_slot_disk4_tc8566_device::unk_7ffc_r() +{ + // Unknown + return 0xfc; +} + +u8 msx_slot_disk4_tc8566_device::unk_7ffd_r() +{ + // Unknown + return 0xfc; +} + +u8 msx_slot_disk4_tc8566_device::unk_7fff_r() +{ + // Unknown + return 0x3f; +} diff --git a/src/devices/bus/msx/slot/disk.h b/src/devices/bus/msx/slot/disk.h index 5ad299cdab46d..9b5c3eea82ca3 100644 --- a/src/devices/bus/msx/slot/disk.h +++ b/src/devices/bus/msx/slot/disk.h @@ -315,7 +315,12 @@ class msx_slot_disk4_tc8566_device : public msx_slot_tc8566_disk_device virtual void device_start() override; private: - void bank_w(u8 control); + u8 bank_r(); + void bank_w(u8 bank); + u8 media_change_r(); + u8 unk_7ffc_r(); + u8 unk_7ffd_r(); + u8 unk_7fff_r(); memory_bank_creator m_rombank; }; From 2752ad052d98970b72fcb65bce2a9f0febb11fa8 Mon Sep 17 00:00:00 2001 From: Julian Sikorski Date: Sun, 7 Apr 2024 22:45:17 +0200 Subject: [PATCH 037/109] Add C compiler flags for Wayland EGL backend to bgfx build options (#12216) --- scripts/src/3rdparty.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/src/3rdparty.lua b/scripts/src/3rdparty.lua index 64a8e3b7ab601..fc3ef8a6daac0 100755 --- a/scripts/src/3rdparty.lua +++ b/scripts/src/3rdparty.lua @@ -1558,6 +1558,9 @@ end defines { "WL_EGL_PLATFORM=1", } + buildoptions { + backtick(pkgconfigcmd() .. " --cflags wayland-egl-backend"), + } end end From 86516799a5e5018854b7a9e287640c3448e4dd78 Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 7 Apr 2024 20:03:07 -0400 Subject: [PATCH 038/109] New clones marked as NOT_WORKING -------------------------------- Xiao Ao Jiang Hu [dyq, little0, Guru] * bishjan: Provide actual dump of DS2430A [Guru] * subsino/subsino2.cpp: Update hardware notes [AJR] --- src/mame/subsino/subsino2.cpp | 61 ++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/src/mame/subsino/subsino2.cpp b/src/mame/subsino/subsino2.cpp index 4ea98aa951ce3..5b0b756a22b9f 100644 --- a/src/mame/subsino/subsino2.cpp +++ b/src/mame/subsino/subsino2.cpp @@ -29,6 +29,10 @@ Year Game CPU Sound Custom ---------------------------------------------------------------------------------------------------------------- *SS9600 **SS9689 +Graphics for the H8-based games are stored in either four socketed DIP28 8-bit EPROMs, two socketed DIP40 16-bit EPROMs or one +surface-mounted SSOP70 32-bit ROM. Later H8-based PCBs have a custom QFP device labeled "SG 003" instead of the off-the-shelf +RAMDAC. + To do: - Add sound to SS9804/SS9904 games. @@ -43,10 +47,9 @@ Protection seems to work the same way on every game in this driver, using a bitb command is issued, and only the first 8 bits returned are examined to determine whether they match the expected device code (0x14). If this test passes, the EEPROM contents are recalled and the first 64 bits are read out. These 64 bits are then unscrambled using a permutation table common to all games. The second and final protection check compares byte 6 in the unscrambled data buffer -against a game-specific ID code. This byte is composed of EEPROM bits 22 (MSB), 27, 52, 50, 42, 9, 38 and 35 (LSB). - -It is unknown where this protection EEPROM exists on any Subsino PCB (if it isn't an external dongle), though the IC package is -known to be quite small. (The iButton version, DS1971, is another possibility.) +against a game-specific ID code. This byte is composed of EEPROM bits 22 (MSB), 27, 52, 50, 42, 9, 38 and 35 (LSB). This EEPROM +comes in a small TO-92 package which is very difficult to spot on PCB photos, though it appears to be typically positioned near +one of the edge connectors. Timings in the Z180-based and H8-based games consistently fail to meet 1-Wire specifications. In the case of the H8-based games, this likely has to do with CPU clocks and emulated cycle timings being both too fast. There may also be wait states programmed @@ -122,6 +125,7 @@ class subsino2_state : public driver_device { } void bishjan(machine_config &config); + void xiaoao(machine_config &config); void saklove(machine_config &config); void mtrain(machine_config &config); void tbonusal(machine_config &config); @@ -133,6 +137,7 @@ class subsino2_state : public driver_device void ptrain(machine_config &config); void init_bishjan(); + void init_xiaoao(); void init_new2001(); void init_queenbee(); void init_queenbeeb(); @@ -187,6 +192,7 @@ class subsino2_state : public driver_device uint8_t bishjan_sound_r(); void bishjan_sound_w(uint8_t data); uint8_t bishjan_serial_r(); + uint8_t xiaoao_serial_r(); uint8_t bishjan_unknown_r(); void bishjan_input_w(uint8_t data); uint8_t bishjan_input_r(); @@ -951,6 +957,14 @@ uint8_t subsino2_state::bishjan_serial_r() ((m_bishjan_sound == 0x12) ? 0x40:0x00); // bit 6 - sound communication } +uint8_t subsino2_state::xiaoao_serial_r() +{ + return + (m_eeprom->data_r() ? 0x80 : 0) | // bit 7 - serial communication + (machine().rand() & 0x18) | + ((m_bishjan_sound == 0x11) ? 0x40:0x00); // bit 6 - sound communication +} + uint8_t subsino2_state::bishjan_unknown_r() { return @@ -2798,6 +2812,14 @@ void subsino2_state::bishjan(machine_config &config) // SS9904 } +void subsino2_state::xiaoao(machine_config &config) +{ + bishjan(config); + + ss9802_device &io(*subdevice("io")); + io.in_port_callback<6>().set(FUNC(subsino2_state::xiaoao_serial_r)); +} + void subsino2_state::new2001(machine_config &config) { bishjan(config); @@ -3102,7 +3124,7 @@ ROM_START( bishjan ) ROM_LOAD( "2-v201.u9", 0x000000, 0x100000, CRC(ea42764d) SHA1(13fe1cd30e474f4b092949c440068e9ddca79976) ) ROM_REGION( 0x28, "eeprom", 0 ) - ROM_LOAD( "ds2430a.bin", 0x00, 0x28, CRC(e248ebfa) SHA1(b75e5be0a0a6b32e6cc372fc3da01009f3cca7e2) BAD_DUMP ) // handcrafted to pass protection check + ROM_LOAD( "bishoujan-ds2430a.q3", 0x00, 0x28, CRC(7366d9d5) SHA1(1b276015f70bdc8cc7ba8380be19a821e728b617) ) ROM_END void subsino2_state::init_bishjan() @@ -3114,6 +3136,34 @@ void subsino2_state::init_bishjan() rom[0x0CC5C/2] = 0x5670; // IRQ 8 } +// Uses newer PCB type, same as Humlan's Lyckohjul +ROM_START( xiaoao ) + ROM_REGION( 0x80000, "maincpu", 0 ) + ROM_LOAD( "1-v100.u21", 0x00000, 0x80000, CRC(728b4597) SHA1(97f92b9a6c455d2d906d55482166fd9704253615) ) + + ROM_REGION( 0x400000, "tilemap", 0 ) + ROM_LOAD( "graphics.bin", 0x000000, 0x400000, NO_DUMP ) // SSOP70 ROM not dumped yet; using ROMs from bishjan for now + ROM_LOAD32_BYTE( "3-v201.u25", 0x000000, 0x100000, CRC(e013e647) SHA1(a5b0f82f3454393c1ea5e635b0d37735a25e2ea5) BAD_DUMP ) + ROM_LOAD32_BYTE( "4-v201.u26", 0x000002, 0x100000, CRC(e0d40ef1) SHA1(95f80889103a7b93080b46387274cb1ffe0c8768) BAD_DUMP ) + ROM_LOAD32_BYTE( "5-v201.u27", 0x000001, 0x100000, CRC(85067d40) SHA1(3ecf7851311a77a0dfca90775fcbf6faabe9c2ab) BAD_DUMP ) + ROM_LOAD32_BYTE( "6-v201.u28", 0x000003, 0x100000, CRC(430bd9d7) SHA1(dadf5a7eb90cf2dc20f97dbf20a4b6c8e7734fb1) BAD_DUMP ) + + ROM_REGION( 0x100000, "samples", 0 ) + ROM_LOAD( "mj-v1.u10", 0x000000, 0x100000, CRC(4d797394) SHA1(fa40a410f903cd81f15c3a86a60ad405b5db8168) ) + + ROM_REGION( 0x28, "eeprom", 0 ) + ROM_LOAD( "xiaoaojianghu-ds2430a.q3", 0x00, 0x28, CRC(518e4ba3) SHA1(704fb6f8ff9966d1b90af849b2b7c6df06d3e4a0) ) +ROM_END + +void subsino2_state::init_xiaoao() +{ + uint16_t *rom = (uint16_t*)memregion("maincpu")->base(); + + // rts -> rte + rom[0x35238/2] = 0x5670; // IRQ 0 + rom[0x0D550/2] = 0x5670; // IRQ 8 +} + /*************************************************************************** New 2001 (Italy, V200N) @@ -4002,6 +4052,7 @@ GAME( 1997, treacity, 0, saklove, treacity, subsino2_state, empty_init, GAME( 1997, treacity202, treacity,saklove, treacity, subsino2_state, empty_init, ROT0, "Subsino (American Alpha license)", "Treasure City (Ver. 202)", MACHINE_NOT_WORKING ) GAME( 1999, bishjan, 0, bishjan, bishjan, subsino2_state, init_bishjan, ROT0, "Subsino", "Bishou Jan (Japan, Ver. 203)", MACHINE_NO_SOUND ) +GAME( 200?, xiaoao, bishjan, xiaoao, bishjan, subsino2_state, init_xiaoao, ROT0, "Subsino", "Xiao Ao Jiang Hu", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) GAME( 2000, new2001, 0, new2001, new2001, subsino2_state, init_new2001, ROT0, "Subsino", "New 2001 (Italy, Ver. 200N)", MACHINE_NO_SOUND ) From 82ce30d3cfe72e458a432cced99811a926957896 Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 7 Apr 2024 20:06:13 -0400 Subject: [PATCH 039/109] mame.lst: Update for 86516799a5e5018854b7a9e287640c3448e4dd78 --- src/mame/mame.lst | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 3d63213b9c110..5daf365e31bb7 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -42740,6 +42740,7 @@ qbeebing treamary treacity treacity202 +xiaoao @source:sun/sun1.cpp sun1 // From cd2aa4c138fa70704aa4b401c9eb23599ba230f4 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Mon, 8 Apr 2024 11:05:37 +0700 Subject: [PATCH 040/109] ibm5100: improve program memory handling * force execution from ros during interrupts * correct lower-case 'u' in character font * fix l32/r32 display mode on 5110 --- src/devices/cpu/palm/palm.cpp | 16 +++---- src/devices/cpu/palm/palm.h | 10 ++--- src/mame/ibm/ibm5100.cpp | 85 +++++++++++++++++++++-------------- 3 files changed, 65 insertions(+), 46 deletions(-) diff --git a/src/devices/cpu/palm/palm.cpp b/src/devices/cpu/palm/palm.cpp index 28ae003eff296..30ffa404afae0 100644 --- a/src/devices/cpu/palm/palm.cpp +++ b/src/devices/cpu/palm/palm.cpp @@ -36,13 +36,13 @@ DEFINE_DEVICE_TYPE(PALM, palm_device, "palm", "IBM PALM") palm_device::palm_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) : cpu_device(mconfig, PALM, tag, owner, clock) - , m_ros_config("ros", ENDIANNESS_BIG, 16, 16) + , m_pgm_config("pgm", ENDIANNESS_BIG, 16, 16) , m_rws_config("rws", ENDIANNESS_BIG, 16, 16) , m_ioc_config("ioc", ENDIANNESS_BIG, 8, 4) , m_iod_config("iod", ENDIANNESS_BIG, 8, 4) , m_getb_bus(*this) - , m_select_ros(*this) , m_program_level(*this) + , m_select_ros(*this) , m_icount(0) , m_r{} { @@ -77,7 +77,7 @@ void palm_device::device_start() save_item(NAME(m_il)); save_item(NAME(m_ff)); - space(AS_ROS).specific(m_ros); + space(AS_PGM).specific(m_pgm); space(AS_RWS).specific(m_rws); space(AS_IOC).specific(m_ioc); space(AS_IOD).specific(m_iod); @@ -90,11 +90,11 @@ void palm_device::device_reset() // select instruction source m_ff = FF_IPL | FF_MSS; m_select_ros((m_ff & FF_MSS) && !(m_ff & FF_IPL)); - m_program_level(0); - // read initial PC from ROS + // read initial PC from program memory m_il = 0; - m_pc = m_r[m_il][0] = m_ros.read_word(0); + m_program_level(0); + m_pc = m_r[m_il][0] = m_pgm.read_word(0); } #define Rx r[IBIT(op, 4, 4)] @@ -126,7 +126,7 @@ void palm_device::execute_run() debugger_instruction_hook(r[0] & ~1); // fetch instruction - u16 const op = m_ros.read_word(r[0] & ~1); + u16 const op = m_pgm.read_word(r[0] & ~1); // increment instruction address register r[0] += 2; @@ -258,7 +258,7 @@ device_memory_interface::space_config_vector palm_device::memory_space_config() { return space_config_vector { - std::make_pair(AS_ROS, &m_ros_config), + std::make_pair(AS_PGM, &m_pgm_config), std::make_pair(AS_RWS, &m_rws_config), std::make_pair(AS_IOC, &m_ioc_config), std::make_pair(AS_IOD, &m_iod_config), diff --git a/src/devices/cpu/palm/palm.h b/src/devices/cpu/palm/palm.h index 0e218e8ff837d..af19bd3f1debc 100644 --- a/src/devices/cpu/palm/palm.h +++ b/src/devices/cpu/palm/palm.h @@ -15,14 +15,14 @@ class palm_device : public cpu_device static unsigned constexpr IRPT_REQ3 = INPUT_LINE_IRQ2; // four address spaces - static unsigned constexpr AS_ROS = AS_PROGRAM; + static unsigned constexpr AS_PGM = AS_PROGRAM; static unsigned constexpr AS_RWS = AS_DATA; static unsigned constexpr AS_IOC = AS_IO; static unsigned constexpr AS_IOD = 4; auto getb_bus() { return m_getb_bus.bind(); } - auto select_ros() { return m_select_ros.bind(); } auto program_level() { return m_program_level.bind(); } + auto select_ros() { return m_select_ros.bind(); } palm_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); @@ -51,19 +51,19 @@ class palm_device : public cpu_device private: // address spaces - address_space_config const m_ros_config; + address_space_config const m_pgm_config; address_space_config const m_rws_config; address_space_config const m_ioc_config; address_space_config const m_iod_config; - memory_access<16, 1, 0, ENDIANNESS_BIG>::specific m_ros; + memory_access<16, 1, 0, ENDIANNESS_BIG>::specific m_pgm; memory_access<16, 1, 0, ENDIANNESS_BIG>::specific m_rws; memory_access<4, 0, 0, ENDIANNESS_BIG>::specific m_ioc; memory_access<4, 0, 0, ENDIANNESS_BIG>::specific m_iod; devcb_write8 m_getb_bus; - devcb_write_line m_select_ros; devcb_write_line m_program_level; + devcb_write_line m_select_ros; // mame state int m_icount; diff --git a/src/mame/ibm/ibm5100.cpp b/src/mame/ibm/ibm5100.cpp index 0d4adb5675708..53b51ba7aa26f 100644 --- a/src/mame/ibm/ibm5100.cpp +++ b/src/mame/ibm/ibm5100.cpp @@ -44,6 +44,7 @@ class ibm5100_state : public driver_device , m_kbd(*this, "kbd") , m_nxr(*this, { "common", "basic", "apl" }) , m_cgr(*this, "cgr") + , m_pgm(*this, "pgm") , m_ros(*this, "ros") , m_conf(*this, "CONF") , m_disp(*this, "DISP") @@ -59,7 +60,7 @@ class ibm5100_state : public driver_device virtual void machine_start() override; virtual void machine_reset() override; - virtual void cpu_ros_map(address_map &map); + virtual void cpu_pgm_map(address_map &map); virtual void cpu_rws_map(address_map &map); virtual void cpu_ioc_map(address_map &map); virtual void cpu_iod_map(address_map &map); @@ -87,6 +88,7 @@ class ibm5100_state : public driver_device required_region_ptr_array m_nxr; required_region_ptr m_cgr; // character generator ROS + memory_view m_pgm; memory_view m_ros; required_ioport m_conf; @@ -108,7 +110,6 @@ class ibm5110_state : public ibm5100_state ibm5110_state(machine_config const &mconfig, device_type type, char const *tag) : ibm5100_state(mconfig, type, tag) , m_alarm(*this, "alarm") - , m_exr(*this, "exr") , m_jmp(*this, { "L2_1", "L2_2", "K4" }) { } @@ -119,7 +120,7 @@ class ibm5110_state : public ibm5100_state virtual void machine_start() override; virtual void machine_reset() override; - virtual void cpu_ros_map(address_map &map) override; + virtual void cpu_pgm_map(address_map &map) override; virtual void cpu_ioc_map(address_map &map) override; virtual void da0_ctl_w(u8 data) override; @@ -135,8 +136,6 @@ class ibm5110_state : public ibm5100_state private: required_device m_alarm; - memory_view m_exr; - required_ioport_array<3> m_jmp; u8 m_exr_ff; // executable ROS flip-flops @@ -203,23 +202,35 @@ void ibm5110_state::machine_reset() { ibm5100_state::machine_reset(); - m_exr.disable(); m_exr_ff = 0; } -void ibm5100_state::cpu_ros_map(address_map &map) +void ibm5100_state::cpu_pgm_map(address_map &map) { - map(0x0000, 0xffff).view(m_ros); + map(0x0000, 0xffff).view(m_pgm); + + // normal mode program memory + m_pgm[0](0x0000, 0xffff).view(m_ros); m_ros[0](0x0000, 0xffff).rom().region("ros", 0); + // m_ros[1] RWS (configurable size) + + // interrupt mode program memory + m_pgm[1](0x0000, 0xffff).rom().region("ros", 0); } -void ibm5110_state::cpu_ros_map(address_map &map) +void ibm5110_state::cpu_pgm_map(address_map &map) { - map(0x0000, 0xffff).view(m_ros); - m_ros[0](0x0000, 0x7fff).rom().region("l2_1", 0); - m_ros[0](0x0000, 0x7fff).view(m_exr); - m_exr[0](0x0000, 0x7fff).rom().region("l2_2a", 0); - m_exr[1](0x0000, 0x7fff).rom().region("l2_2b", 0); + map(0x0000, 0xffff).view(m_pgm); + + // normal mode program memory + m_pgm[0](0x0000, 0xffff).view(m_ros); + m_ros[0](0x0000, 0x7fff).rom().region("ros1", 0); + // m_ros[1] RWS (configurable size) + m_ros[2](0x0000, 0x7fff).rom().region("ros2a", 0); + m_ros[3](0x0000, 0x7fff).rom().region("ros2b", 0); + + // interrupt mode program memory + m_pgm[1](0x0000, 0x7fff).rom().region("ros1", 0); } void ibm5100_state::cpu_rws_map(address_map &map) @@ -267,12 +278,12 @@ void ibm5100_state::cpu_iod_map(address_map &map) void ibm5100_state::common(machine_config &config) { PALM(config, m_cpu, 15'091'200); - m_cpu->set_addrmap(palm_device::AS_ROS, &ibm5100_state::cpu_ros_map); + m_cpu->set_addrmap(palm_device::AS_PGM, &ibm5100_state::cpu_pgm_map); m_cpu->set_addrmap(palm_device::AS_RWS, &ibm5100_state::cpu_rws_map); m_cpu->set_addrmap(palm_device::AS_IOC, &ibm5100_state::cpu_ioc_map); m_cpu->set_addrmap(palm_device::AS_IOD, &ibm5100_state::cpu_iod_map); m_cpu->getb_bus().set([this](offs_t offset, u8 data) { m_getb_bus = data; }); - m_cpu->select_ros().set([this](int state) { m_ros.select(state); }); + m_cpu->program_level().set([this](int state) { m_pgm.select(state); }); /* * Display output is 16 rows of 64 characters. Each character cell is 10x12 @@ -288,6 +299,8 @@ void ibm5100_state::ibm5100(machine_config &config) { ibm5100_state::common(config); + m_cpu->select_ros().set([this](int state) { m_ros.select(state); }); + IBM5100_KEYBOARD(config, m_kbd); m_kbd->strobe().set( [this](int state) @@ -301,13 +314,13 @@ void ibm5110_state::ibm5110(machine_config &config) { ibm5100_state::common(config); - m_cpu->program_level().set( + m_cpu->select_ros().set( [this](int state) { - if (state || !(m_exr_ff & EXR_ROS2)) - m_exr.disable(); + if (!state && (m_exr_ff & EXR_ROS2)) + m_ros.select(BIT(m_lang->read(), 6) + 2); else - m_exr.select(BIT(m_lang->read(), 6)); + m_ros.select(state); }); IBM5110_KEYBOARD(config, m_kbd); @@ -354,7 +367,7 @@ u32 ibm5100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, re bool const reverse = BIT(disp, 0); bool const n64 = !BIT(disp, 2); - bool const r32 = BIT(disp, 3); + unsigned const r32 = BIT(disp, 3) ? 32 : 0; // start with a blank screen bitmap.fill(c[reverse]); @@ -370,16 +383,18 @@ u32 ibm5100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, re int const y = screen.visible_area().min_y + char_y * 12 * 2; // compute offset into rws for each row - offs_t offset = 0x200 + char_y * 64 + (r32 ? 32 : 0); + offs_t offset = 0x200 + char_y * 64 + r32; for (unsigned char_x = 0; char_x < 64; char_x++) { + // skip alternate columns in l32/r32 mode + if (!n64 && (char_x & 1)) + continue; + int const x = screen.visible_area().min_x + char_x * 10; - // read next character if normal mode or even column - u8 char_data = 0; - if (n64 || !(char_x & 1)) - char_data = rws[offset++]; + // read next character + u8 const char_data = rws[offset++]; // draw 8x12 character cell for (unsigned cell_y = 0; cell_y < 12; cell_y++) @@ -461,13 +476,17 @@ void ibm5110_state::exr_ctl_w(u8 data) if (BIT(data, 7)) { - m_exr.select(BIT(m_lang->read(), 6)); m_exr_ff |= EXR_ROS2; + + if (m_ros.entry() != 1) + m_ros.select(BIT(m_lang->read(), 6) + 2); } else if (BIT(data, 6)) { - m_exr.disable(); m_exr_ff &= ~EXR_ROS2; + + if (m_ros.entry() != 1) + m_ros.select(0); } } @@ -701,16 +720,16 @@ ROM_END ROM_START(ibm5110) // Executable ROS - ROM_REGION16_BE(0x8000, "l2_1", 0) + ROM_REGION16_BE(0x8000, "ros1", 0) ROM_LOAD("l2_1.ros", 0x0000, 0x8000, CRC(0355894f) SHA1(c76a91cbbec226feb942ccde93ecb1637c88a01b)) // APL Executable ROS - ROM_REGION16_BE(0x8000, "l2_2a", 0) + ROM_REGION16_BE(0x8000, "ros2a", 0) ROM_LOAD("l2_2a.ros", 0x0000, 0x5000, CRC(46918be9) SHA1(bf45a44f77104c55f2ccfa462af06944e6bffe1a)) ROM_FILL(0x5000, 0x3000, 0xff) // BASIC Executable ROS - ROM_REGION16_BE(0x8000, "l2_2b", 0) + ROM_REGION16_BE(0x8000, "ros2b", 0) ROM_LOAD("l2_2b.ros", 0x0000, 0x4000, CRC(a69dd0c1) SHA1(ecdc1363e25b72b695c517af145c50a069b6e8dc)) ROM_FILL(0x4000, 0x3000, 0xff) @@ -732,10 +751,10 @@ ROM_START(ibm5110) /* * This data was hand-made based on the character map in the documentation. * It was assumed that the first 12 bytes of each character store the 8x12 - * cell, followed by 8x4 empty bytes. + * cell, followed by 4 empty bytes. */ ROM_REGION(0x1000, "cgr", 0) - ROM_LOAD("g2.ros", 0x000, 0x1000, CRC(1f55161c) SHA1(eb22f3177060bd7cb4ba8facaa293147ffeceabc) BAD_DUMP) + ROM_LOAD("g2.ros", 0x000, 0x1000, CRC(86e6a99c) SHA1(7168ba05fbac3f66bd98b8ef9fc135d0d08eb44b) BAD_DUMP) ROM_END static INPUT_PORTS_START(ibm5100) From 4071f307fd433b8c2791871d228d9a2ebf48563d Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 8 Apr 2024 15:51:19 +0200 Subject: [PATCH 041/109] msx: add magic key dongle --- scripts/src/bus.lua | 2 + src/devices/bus/msx/cart/holy_quran.cpp | 6 +-- src/devices/bus/msx/ctrl/ctrl.cpp | 2 + src/devices/bus/msx/ctrl/joystick.cpp | 2 +- src/devices/bus/msx/ctrl/magickey.cpp | 53 +++++++++++++++++++++++++ src/devices/bus/msx/ctrl/magickey.h | 19 +++++++++ src/devices/bus/msx/ctrl/mouse.cpp | 2 +- src/devices/bus/msx/ctrl/vaus.cpp | 2 +- src/devices/bus/msx/slot/disk.cpp | 3 +- src/devices/bus/nes_ctrl/arkpaddle.cpp | 4 +- src/mame/ddr/slc1.cpp | 2 +- 11 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 src/devices/bus/msx/ctrl/magickey.cpp create mode 100644 src/devices/bus/msx/ctrl/magickey.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 5fc56dcc05a1b..ed1f4e55a7e10 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1898,6 +1898,8 @@ if (BUSES["MSX_CTRL"]~=null) then MAME_DIR .. "src/devices/bus/msx/ctrl/joystick.h", MAME_DIR .. "src/devices/bus/msx/ctrl/libbler.cpp", MAME_DIR .. "src/devices/bus/msx/ctrl/libbler.h", + MAME_DIR .. "src/devices/bus/msx/ctrl/magickey.cpp", + MAME_DIR .. "src/devices/bus/msx/ctrl/magickey.h", MAME_DIR .. "src/devices/bus/msx/ctrl/mouse.cpp", MAME_DIR .. "src/devices/bus/msx/ctrl/mouse.h", MAME_DIR .. "src/devices/bus/msx/ctrl/sgadapt.cpp", diff --git a/src/devices/bus/msx/cart/holy_quran.cpp b/src/devices/bus/msx/cart/holy_quran.cpp index 1e5be50bbc1bb..74df118b46b04 100644 --- a/src/devices/bus/msx/cart/holy_quran.cpp +++ b/src/devices/bus/msx/cart/holy_quran.cpp @@ -68,14 +68,10 @@ std::error_condition msx_cart_holy_quran_device::initialize_cartridge(std::strin m_decrypted.resize(size); - u8 lookup_prot[256]; // protection uses a simple rotation on databus, some lines inverted - for (int i = 0; i < 0x100; i++) - lookup_prot[i] = bitswap<8>(i,6,2,4,0,1,5,7,3) ^ 0x4d; - u8 *rom = cart_rom_region()->base(); for (u32 i = 0; i < size; i++) - m_decrypted[i] = lookup_prot[rom[i]]; + m_decrypted[i] = bitswap<8>(rom[i],6,2,4,0,1,5,7,3) ^ 0x4d; for (int i = 0; i < 4; i++) m_rombank[i]->configure_entries(0, banks, m_decrypted.data(), BANK_SIZE); diff --git a/src/devices/bus/msx/ctrl/ctrl.cpp b/src/devices/bus/msx/ctrl/ctrl.cpp index efa8716edc1af..f26c175c44993 100644 --- a/src/devices/bus/msx/ctrl/ctrl.cpp +++ b/src/devices/bus/msx/ctrl/ctrl.cpp @@ -12,6 +12,7 @@ #include "hypershot.h" #include "joystick.h" #include "libbler.h" +#include "magickey.h" #include "mouse.h" #include "sgadapt.h" #include "towns6b.h" @@ -49,6 +50,7 @@ void msx_general_purpose_port_devices(device_slot_interface &device) device.option_add("hypershot", MSX_HYPERSHOT); device.option_add("joystick", MSX_JOYSTICK); device.option_add("libbler", MSX_LIBBLERPAD); + device.option_add("magickey", MSX_MAGICKEY); device.option_add("martypad", MSX_MARTYPAD); device.option_add("mouse", MSX_MOUSE); device.option_add("sega", MSX_SEGACTRL); diff --git a/src/devices/bus/msx/ctrl/joystick.cpp b/src/devices/bus/msx/ctrl/joystick.cpp index b87b219e5f839..e5d792c8590c0 100644 --- a/src/devices/bus/msx/ctrl/joystick.cpp +++ b/src/devices/bus/msx/ctrl/joystick.cpp @@ -2,7 +2,7 @@ // copyright-holders:Wilbert Pol /********************************************************************** - MSX Digital Joystick emulation + MSX Digital Joystick emulation **********************************************************************/ diff --git a/src/devices/bus/msx/ctrl/magickey.cpp b/src/devices/bus/msx/ctrl/magickey.cpp new file mode 100644 index 0000000000000..f515b2f39b75b --- /dev/null +++ b/src/devices/bus/msx/ctrl/magickey.cpp @@ -0,0 +1,53 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/********************************************************************** + +Sony Magic Key emulation + +It's a dongle that enables a cheat menu on some games published by Sony +when inserted into port B. It was a lottery prize from a Japanese MSX +magazine, not sold separately. + +The dongle ties pin 1/2 (up/down) to pin 8 (strobe). + +Note that this cheat menu can also be accessed with an FM Towns pad. + +**********************************************************************/ + +#include "emu.h" +#include "magickey.h" + + +namespace { + +class msx_magickey_device : public device_t, public device_msx_general_purpose_port_interface +{ +public: + msx_magickey_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + virtual u8 read() override { return m_pin8_state ? 0xff : 0xfc; } + virtual void pin_8_w(int state) override { m_pin8_state = state; } + +protected: + virtual void device_start() override; + +private: + u8 m_pin8_state = 0; +}; + + +msx_magickey_device::msx_magickey_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, MSX_MAGICKEY, tag, owner, clock) + , device_msx_general_purpose_port_interface(mconfig, *this) +{ +} + +void msx_magickey_device::device_start() +{ + save_item(NAME(m_pin8_state)); +} + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(MSX_MAGICKEY, device_msx_general_purpose_port_interface, msx_magickey_device, "msx_magickey", "Sony Magic Key Dongle") diff --git a/src/devices/bus/msx/ctrl/magickey.h b/src/devices/bus/msx/ctrl/magickey.h new file mode 100644 index 0000000000000..031a554ce7cb9 --- /dev/null +++ b/src/devices/bus/msx/ctrl/magickey.h @@ -0,0 +1,19 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/********************************************************************** + + Sony Magic Key emulation + +**********************************************************************/ + +#ifndef MAME_BUS_MSX_CTRL_MAGICKEY_H +#define MAME_BUS_MSX_CTRL_MAGICKEY_H + +#pragma once + +#include "ctrl.h" + + +DECLARE_DEVICE_TYPE(MSX_MAGICKEY, device_msx_general_purpose_port_interface) + +#endif // MAME_BUS_MSX_CTRL_MAGICKEY_H diff --git a/src/devices/bus/msx/ctrl/mouse.cpp b/src/devices/bus/msx/ctrl/mouse.cpp index aa5f70d403d25..f8182903d718a 100644 --- a/src/devices/bus/msx/ctrl/mouse.cpp +++ b/src/devices/bus/msx/ctrl/mouse.cpp @@ -2,7 +2,7 @@ // copyright-holders:Wilbert Pol /********************************************************************** - MSX Mouse emulation + MSX Mouse emulation **********************************************************************/ diff --git a/src/devices/bus/msx/ctrl/vaus.cpp b/src/devices/bus/msx/ctrl/vaus.cpp index 4ae62b8f89bfb..6d3e1878e9669 100644 --- a/src/devices/bus/msx/ctrl/vaus.cpp +++ b/src/devices/bus/msx/ctrl/vaus.cpp @@ -112,4 +112,4 @@ TIMER_CALLBACK_MEMBER(msx_vaus_device::copy_counter) } // anonymous namespace -DEFINE_DEVICE_TYPE_PRIVATE(MSX_VAUS, device_msx_general_purpose_port_interface, msx_vaus_device, "msx_vaus", "MSX Arkanoid Vaus") +DEFINE_DEVICE_TYPE_PRIVATE(MSX_VAUS, device_msx_general_purpose_port_interface, msx_vaus_device, "msx_vaus", "Taito Arkanoid Vaus Controller (MSX)") diff --git a/src/devices/bus/msx/slot/disk.cpp b/src/devices/bus/msx/slot/disk.cpp index 98df7665654ac..0de21e7df6fb2 100644 --- a/src/devices/bus/msx/slot/disk.cpp +++ b/src/devices/bus/msx/slot/disk.cpp @@ -640,8 +640,7 @@ u8 msx_slot_disk4_tc8566_device::media_change_r() { return (m_floppy[0] && m_floppy[0]->get_device()->dskchg_r() ? 0x10 : 0x00) | (m_floppy[1] && m_floppy[1]->get_device()->dskchg_r() ? 0x20 : 0x00) | - 0x03 - ; + 0x03; } u8 msx_slot_disk4_tc8566_device::unk_7ffc_r() diff --git a/src/devices/bus/nes_ctrl/arkpaddle.cpp b/src/devices/bus/nes_ctrl/arkpaddle.cpp index cad203bc45ea0..48be8990b47e0 100644 --- a/src/devices/bus/nes_ctrl/arkpaddle.cpp +++ b/src/devices/bus/nes_ctrl/arkpaddle.cpp @@ -33,8 +33,8 @@ // DEVICE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(NES_ARKPADDLE, nes_vaus_device, "nes_vaus", "NES Arkanoid Vaus Controller") -DEFINE_DEVICE_TYPE(NES_ARKPADDLE_FC, nes_vausfc_device, "nes_vausfc", "FC Arkanoid Vaus Controller") +DEFINE_DEVICE_TYPE(NES_ARKPADDLE, nes_vaus_device, "nes_vaus", "Taito Arkanoid Vaus Controller (NES)") +DEFINE_DEVICE_TYPE(NES_ARKPADDLE_FC, nes_vausfc_device, "nes_vausfc", "Taito Arkanoid Vaus Controller (FC)") static INPUT_PORTS_START( arkanoid_paddle ) diff --git a/src/mame/ddr/slc1.cpp b/src/mame/ddr/slc1.cpp index f96e3f476e8cd..177fe8ea92d2f 100644 --- a/src/mame/ddr/slc1.cpp +++ b/src/mame/ddr/slc1.cpp @@ -25,7 +25,7 @@ This computer is both a Z80 trainer, and a chess computer. The keyboard Hardware: 4 Kbytes ROM in the address range 0000-0FFF - 1 Kbyte RAM in the address range 5000-53ff (user area starts at 5100) + 1 Kbyte RAM in the address range 5000-53FF (user area starts at 5100) 6-digit 7-segment display Busy LED Keyboard with 12 keys From 067afa1a2e6f7af0ce7c5c7809266d9de62ec97c Mon Sep 17 00:00:00 2001 From: MetalSlug Date: Mon, 8 Apr 2024 17:26:48 +0200 Subject: [PATCH 042/109] util/cdrom.cpp: Zero entire output TOC structure in cdrom_file::parse_metadata. (#12219) Fixes issues with fields that are not explicitly assigned in all situation. --- src/lib/util/cdrom.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/util/cdrom.cpp b/src/lib/util/cdrom.cpp index aa82ae438f16d..159a9c964a168 100644 --- a/src/lib/util/cdrom.cpp +++ b/src/lib/util/cdrom.cpp @@ -865,7 +865,8 @@ std::error_condition cdrom_file::parse_metadata(chd_file *chd, toc &toc) std::string metadata; std::error_condition err; - toc.flags = 0; + /* clear structures */ + memset(&toc, 0, sizeof(toc)); /* start with no tracks */ for (toc.numtrks = 0; toc.numtrks < MAX_TRACKS; toc.numtrks++) From 114fc62e138d9e363e47a7b0b22f4307a1541afa Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Mon, 8 Apr 2024 18:12:07 +0200 Subject: [PATCH 043/109] New systems marked not working ------------------------------ Soccer 10 (ver. 16.44) [trol] --- src/mame/mame.lst | 1 + src/mame/misc/magic10.cpp | 43 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 5daf365e31bb7..3e1014087b080 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -30637,6 +30637,7 @@ mcolors // (c) 1999 ABM Games mcolorsa // (c) 1999 ABM Games musicsrt // (c) 1995 ABM Games sgsafari // (c) 1996 New Impeuropex Corp. +soccer10 // (c) 1996 spetrix // 199? unknown suprpool // (c) 1998 ABM Games diff --git a/src/mame/misc/magic10.cpp b/src/mame/misc/magic10.cpp index 0820034183776..03e7c6b755bb4 100644 --- a/src/mame/misc/magic10.cpp +++ b/src/mame/misc/magic10.cpp @@ -17,6 +17,7 @@ Magic's 10 (ver. 16.45) 1995 A.W.P. Games post lex direct yes ? no NVRAM ? Magic's 10 (ver. 16.54) 1995 A.W.P. Games post lex direct yes ? no ? ? Magic's 10 (ver. 16.55) 1995 A.W.P. Games post lex direct yes DIP H no NVRAM 040 + Soccer 10 (ver. 16.44) 1996 Unknown post lex direct yes DIP H no NVRAM none Hot Slot (ver. 05.01) 1996 ABM Games post lex direct yes LCC no battery ? Super Gran Safari (ver. 3.11) 1996 New Impeuropex Corp. post lex [1] yes DIP V no NVRAM COMP01 Magic's 10 2 (ver. 1.1) 1997 ABM Games post lex [2] no ? yes battery 9605 Rev.02 @@ -152,6 +153,7 @@ Both setups show different variants for components layout, memory size, NVRAM, e blue scrolling diagonally. The blocks are out of alignment which is caused by update_screen doing m_tilemap[1]->set_scrollx(0, (m_vregs[2 / 2] - m_vregs[6 / 2]) + 4) Removing the +4 fixes the problem but does it cause other issues ? + - soccer10 needs correct GFX decode ****************************************************************************/ @@ -223,9 +225,11 @@ class magic10_state : public magic10_base_state void magic10(machine_config &config); void magic10a(machine_config &config); void sgsafari(machine_config &config); + void soccer10(machine_config &config); void init_magic10(); void init_sgsafari(); + void init_soccer10(); protected: virtual void machine_start() override { m_lamps.resolve(); } @@ -962,6 +966,12 @@ void magic10_state::magic10a(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &magic10_state::magic10a_map); } +void magic10_state::soccer10(machine_config &config) +{ + magic10a(config); + + m_maincpu->set_vblank_int("screen", FUNC(magic10_base_state::irq4_line_hold)); +} void magic102_state::magic102(machine_config &config) { @@ -1257,6 +1267,25 @@ ROM_START( magic102a ) ROM_LOAD( "palce16v8h.u54", 0x02dd, 0x0117, NO_DUMP ) ROM_END +ROM_START( soccer10 ) // PCB marked I.G.T. International Games Trade s.r.l. (Italian, as s.r.l. is an acronym for 'Società a Responsabilità Limitata') + ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 code + ROM_LOAD16_BYTE( "12.u16", 0x000000, 0x20000, CRC(5b1d8de2) SHA1(c20f4ca235dc78acb20277407833db8906027d4f) ) // 1xxxxxxxxxxxxxxxx = 0xFF + ROM_LOAD16_BYTE( "13.u15", 0x000001, 0x20000, CRC(92ed3808) SHA1(eb1a062190cbcc389561504a0d0685c91952dbd9) ) // 1xxxxxxxxxxxxxxxx = 0xFF + + ROM_REGION( 0x80000, "tiles", 0 ) + ROM_LOAD( "4.u24", 0x00000, 0x40000, CRC(06db9866) SHA1(97c18c50c5eb0bd3bc927d3ac22c3176498017fd) ) + ROM_LOAD( "5.u28", 0x40000, 0x40000, CRC(f41c196d) SHA1(046b7d4bb30740a43ea9ccfb7e5a4d1405456ef8) ) + + ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_LOAD( "1.u44", 0x00000, 0x40000, CRC(98885246) SHA1(752d549e6248074f2a7f6c5cc4d0bbc44c7fa4c3) ) // same as magic10 and clones + + ROM_REGION( 0x0800, "ds1220", 0 ) // TODO: is this needed or is it just user data? Verify once working + ROM_LOAD( "ds1220.u20", 0x0000, 0x0800, CRC(afc7cbc3) SHA1(74f51217a4f280c20742657ef80a9b4d5a891a7e) ) + + ROM_REGION( 0x0400, "plds", 0 ) + ROM_LOAD( "gal20v8a.u4", 0x0000, 0x0157, NO_DUMP ) +ROM_END + /* Super Pool (ver. 1.2) @@ -1886,6 +1915,17 @@ void magic10_state::init_sgsafari() m_layer2_offset[1] = 20; } +void magic10_state::init_soccer10() +{ + //m_layer2_offset[0] = 16; + //m_layer2_offset[1] = 20; + + uint16_t *rom = (uint16_t *)memregion("maincpu")->base(); + + for (int i = 0; i < 0x40000 / 2; i++) + rom[i] = bitswap<16>(rom[i], 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, 1); +} + void spetrix_state::init_spetrix() { m_layer2_offset[0] = 16; @@ -1904,7 +1944,7 @@ void magic102_state::init_altaten() rom[0x7669] = 0x4e; } -} // Anonymous namespace +} // anonymous namespace /****************************** @@ -1916,6 +1956,7 @@ GAMEL( 1995, magic10, 0, magic10, magic10, magic10_state, init_magic GAMEL( 1995, magic10a, magic10, magic10, magic10, magic10_state, init_magic10, ROT0, "A.W.P. Games", "Magic's 10 (ver. 16.54)", MACHINE_SUPPORTS_SAVE, layout_sgsafari ) GAMEL( 1995, magic10b, magic10, magic10a, magic10, magic10_state, init_magic10, ROT0, "A.W.P. Games", "Magic's 10 (ver. 16.45)", MACHINE_SUPPORTS_SAVE, layout_sgsafari ) GAMEL( 1995, magic10c, magic10, magic10a, magic10, magic10_state, init_magic10, ROT0, "A.W.P. Games", "Magic's 10 (ver. 16.15)", MACHINE_SUPPORTS_SAVE, layout_sgsafari ) +GAMEL( 1996, soccer10, 0, soccer10, magic10, magic10_state, init_soccer10, ROT0, "", "Soccer 10 (ver. 16.44)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_sgsafari ) // needs correct GFX decode. Manufacturer to be verified once done GAME( 1997, magic102, 0, magic102, magic102, magic102_state, init_magic102, ROT0, "ABM Games", "Magic's 10 2 (ver. 1.1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) GAME( 1997, magic102a, magic102, magic102, magic102, magic102_state, init_magic102, ROT0, "ABM Games", "Magic's 10 2 (ver. BETA3)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) GAME( 1998, suprpool, 0, magic102, magic102, magic102_state, init_suprpool, ROT0, "ABM Games", "Super Pool (ver. 1.2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) From 23ac5bbc20c26e947a53826ef75791f6cca93bf6 Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Mon, 8 Apr 2024 18:32:58 +0200 Subject: [PATCH 044/109] docs: Removed unnecessary repetition in othertools.rst. (#12224) --- docs/source/tools/othertools.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/source/tools/othertools.rst b/docs/source/tools/othertools.rst index ebf31719d1658..5a24dc6c5bb80 100644 --- a/docs/source/tools/othertools.rst +++ b/docs/source/tools/othertools.rst @@ -25,38 +25,40 @@ This tool is used in regression testing to compare PNG screenshot results with t nltool ------ -Discrete component conversion tool. Most users will not need to work with this. +Discrete component conversion tool. + nlwav ----- -Discrete component conversion and testing tool. Most users will not need to work with this. +Discrete component conversion and testing tool. jedutil ------- -PAL/PLA/PLD/GAL dump handling tool. It can convert between the industry-standard JED format and MAME's proprietary packed binary format and it can show logic equations for the types of devices it knows the internal logic of. Most users will not need to work with this. +PAL/PLA/PLD/GAL dump handling tool. It can convert between the industry-standard JED format and MAME's proprietary packed binary format and it can show logic equations for the types of devices it knows the internal logic of. ldresample ---------- -This tool recompresses video data for laserdisc and VHS dumps. Most users will not need to work with this. +This tool recompresses video data for laserdisc and VHS dumps. + ldverify -------- -This tool is used for comparing laserdisc or VHS CHD images with the source AVI. Most users will not need to work with this. +This tool is used for comparing laserdisc or VHS CHD images with the source AVI. romcmp ------ -This tool is used to perform basic data comparisons and integrity checks on binary dumps. With the -h switch, it can also be used to calculate hash functions. Most users will not need to work with this. +This tool is used to perform basic data comparisons and integrity checks on binary dumps. With the -h switch, it can also be used to calculate hash functions. unidasm ------- -Universal disassembler for many of the architectures supported in MAME. Most users will not need to work with this. +Universal disassembler for many of the architectures supported in MAME. From c895c5e19865e804d9ba37b1f0f05d9c9bcc19dd Mon Sep 17 00:00:00 2001 From: shattered Date: Mon, 8 Apr 2024 17:17:12 +0000 Subject: [PATCH 045/109] bus/multibus: Added Robotron K7071 text-only video card for the A7100 series. (#12188) --- scripts/src/bus.lua | 2 + src/devices/bus/multibus/robotron_k7071.cpp | 222 ++++++++++++++++++++ src/devices/bus/multibus/robotron_k7071.h | 61 ++++++ src/mame/robotron/a7150.cpp | 2 + 4 files changed, 287 insertions(+) create mode 100644 src/devices/bus/multibus/robotron_k7071.cpp create mode 100644 src/devices/bus/multibus/robotron_k7071.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index ed1f4e55a7e10..2ae59a041ccf5 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -5265,6 +5265,8 @@ if (BUSES["MULTIBUS"]~=null) then MAME_DIR .. "src/devices/bus/multibus/labtam_z80sbc.h", MAME_DIR .. "src/devices/bus/multibus/robotron_k7070.cpp", MAME_DIR .. "src/devices/bus/multibus/robotron_k7070.h", + MAME_DIR .. "src/devices/bus/multibus/robotron_k7071.cpp", + MAME_DIR .. "src/devices/bus/multibus/robotron_k7071.h", } end diff --git a/src/devices/bus/multibus/robotron_k7071.cpp b/src/devices/bus/multibus/robotron_k7071.cpp new file mode 100644 index 0000000000000..89c26dc39cb64 --- /dev/null +++ b/src/devices/bus/multibus/robotron_k7071.cpp @@ -0,0 +1,222 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev + +/* + * Robotron K7071 (ABS) text-only video + * + * Reference: http://www.tiffe.de/Robotron/MMS16/ + * + * To do: + * - fix screen corruption (DMA reprogramming timing?) + * - loadable font - CRTC LA0 connected to NMI via gate + */ + +#include "emu.h" +#include "robotron_k7071.h" + +#define VERBOSE 0 +#include "logmacro.h" + +enum kgs_st : u8 +{ + KGS_ST_OBF = 0x01, + KGS_ST_IBF = 0x02, + KGS_ST_INT = 0x04, + KGS_ST_ERR = 0x80, +}; + +DEFINE_DEVICE_TYPE(ROBOTRON_K7071, robotron_k7071_device, "robotron_k7071", "Robotron K7071 ABS") + +robotron_k7071_device::robotron_k7071_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : device_t(mconfig, ROBOTRON_K7071, tag, owner, clock) + , device_multibus_interface(mconfig, *this) + , m_cpu(*this, "cpu") + , m_dma(*this, "dma") + , m_crtc(*this, "crtc") + , m_screen(*this, "screen") + , m_palette(*this, "palette") + , m_ram(*this, "ram") + , m_p_chargen(*this, "chargen") +{ +} + +ROM_START(robotron_k7071) + ROM_REGION(0x1000, "eprom", ROMREGION_ERASEFF) + ROM_LOAD("q209.bin", 0x0000, 0x0800, CRC(efc4aac0) SHA1(2cb4db3572e6ec7f3d3ae8e70d61b509b1fa3203)) + ROM_LOAD("q210.bin", 0x0800, 0x0800, CRC(d23e00ed) SHA1(eaca53ed784cf263323e9abba24a364b2aadac44)) + + ROM_REGION(0x2000, "chargen", ROMREGION_ERASE00) + ROM_LOAD("q211.bin", 0x0000, 0x0800, CRC(b6241bc5) SHA1(8428e344df95451a34ad01322e245d2357712010)) +ROM_END + +const tiny_rom_entry *robotron_k7071_device::device_rom_region() const +{ + return ROM_NAME(robotron_k7071); +} + +void robotron_k7071_device::device_start() +{ + save_item(NAME(m_kgs_datao)); + save_item(NAME(m_kgs_datai)); + save_item(NAME(m_kgs_ctrl)); + save_item(NAME(m_nmi_enable)); + + m_cpu->space(AS_PROGRAM).specific(m_program); + m_bus->space(AS_IO).install_readwrite_handler(0x200, 0x203, read16s_delegate(*this, FUNC(robotron_k7071_device::io_r)), write16s_delegate(*this, FUNC(robotron_k7071_device::io_w))); +} + +void robotron_k7071_device::device_reset() +{ + m_kgs_ctrl = KGS_ST_IBF | KGS_ST_OBF; + m_kgs_datao = m_kgs_datai = m_nmi_enable = 0; +} + +void robotron_k7071_device::device_add_mconfig(machine_config &config) +{ + Z80(config, m_cpu, XTAL(16'000'000) / 6); + m_cpu->set_addrmap(AS_PROGRAM, &robotron_k7071_device::cpu_mem); + m_cpu->set_addrmap(AS_IO, &robotron_k7071_device::cpu_pio); + + I8257(config, m_dma, XTAL(16'000'000) / 6); + m_dma->out_hrq_cb().set(FUNC(robotron_k7071_device::hrq_w)); + m_dma->in_memr_cb().set([this] (offs_t offset) { return m_program.read_byte(offset); }); + m_dma->out_iow_cb<0>().set(m_crtc, FUNC(i8275_device::dack_w)); + + I8275(config, m_crtc, XTAL(16'000'000) / 8); + m_crtc->set_screen(m_screen); + m_crtc->set_character_width(8); + m_crtc->set_display_callback(FUNC(robotron_k7071_device::display_pixels)); + m_crtc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq0_w)); + m_crtc->lc_wr_callback().set([this] (int data) { m_cpu->set_input_line(INPUT_LINE_IRQ0, data == 15 ? ASSERT_LINE : CLEAR_LINE); }); + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_color(rgb_t::green()); + m_screen->set_raw(XTAL(16'000'000), 736, 0, 640, 432, 0, 416); + m_screen->set_screen_update(m_crtc, FUNC(i8275_device::screen_update)); + + PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT); +} + +void robotron_k7071_device::cpu_mem(address_map &map) +{ + map.unmap_value_high(); + + map(0x0000, 0x0fff).rom().region("eprom", 0); + map(0x1400, 0x1fff).ram().share("ram").mirror(0x8000); +} + +void robotron_k7071_device::cpu_pio(address_map &map) +{ + map.unmap_value_high(); + map.global_mask(0xff); + + map(0x00, 0x08).rw(m_dma, FUNC(i8257_device::read), FUNC(i8257_device::write)); + map(0x20, 0x21).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); + map(0x30, 0x30).noprw(); // chargen ram access + map(0x40, 0x40).nopw(); // line counter input for sync generator + map(0x50, 0x50).lw8(NAME([this] (u8 data) { m_kgs_ctrl |= KGS_ST_INT; int_w(7, ASSERT_LINE); })); + map(0x60, 0x60).lw8(NAME([this] (u8 data) { m_kgs_ctrl |= KGS_ST_ERR; })); + map(0x70, 0x71).rw(FUNC(robotron_k7071_device::kgs_host_r), FUNC(robotron_k7071_device::kgs_host_w)); + map(0x80, 0x80).lw8(NAME([this] (u8 data) { m_nmi_enable = BIT(data, 7); })); + map(0xdf, 0xdf).nopw(); // used by IRQ handler +} + +uint16_t robotron_k7071_device::io_r(offs_t offset, uint16_t mem_mask) +{ + uint8_t data = 0; + + switch (offset) + { + case 0: + data = m_kgs_ctrl; + break; + + case 1: + data = m_kgs_datai; + if (!machine().side_effects_disabled()) + m_kgs_ctrl &= ~KGS_ST_OBF; + break; + } + + return data; +} + +void robotron_k7071_device::io_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + switch (offset) + { + case 0: + m_kgs_ctrl &= ~(KGS_ST_ERR | KGS_ST_INT); + int_w(7, CLEAR_LINE); + break; + + case 1: + if (m_kgs_ctrl & KGS_ST_IBF) + { + m_kgs_ctrl |= KGS_ST_ERR; + } + else + { + m_kgs_datao = data; + m_kgs_ctrl |= KGS_ST_IBF; + } + break; + } +} + + +uint8_t robotron_k7071_device::kgs_host_r(offs_t offset) +{ + uint8_t data = 0; + + switch (offset) + { + case 0: + data = m_kgs_ctrl; + break; + + case 1: + data = m_kgs_datao; + if (!machine().side_effects_disabled()) + m_kgs_ctrl &= ~(KGS_ST_ERR | KGS_ST_IBF); + break; + + default: + break; + } + + return data; +} + +void robotron_k7071_device::kgs_host_w(offs_t offset, uint8_t data) +{ + if (offset) + { + m_kgs_datai = data; + m_kgs_ctrl |= KGS_ST_OBF; + } +} + +void robotron_k7071_device::hrq_w(int state) +{ + // since our Z80 has no support for BUSACK, we assume it is granted immediately + m_cpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state); + m_cpu->set_input_line(INPUT_LINE_HALT, state); // do we need this? + m_dma->hlda_w(state); +} + +I8275_DRAW_CHARACTER_MEMBER(robotron_k7071_device::display_pixels) +{ + using namespace i8275_attributes; + + rgb_t const *const palette = m_palette->palette()->entry_list_raw(); + u8 gfx = (BIT(attrcode, LTEN)) ? 0xff : 0; + if (!BIT(attrcode, VSP)) + gfx = m_p_chargen[linecount | (charcode << 4)]; + + if (BIT(attrcode, RVV)) + gfx ^= 0xff; + + for (u8 i = 0; i < 8; i++) + bitmap.pix(y, x + i) = palette[BIT(gfx, 7-i) ? (BIT(attrcode, HLGT) ? 2 : 1) : 0]; +} diff --git a/src/devices/bus/multibus/robotron_k7071.h b/src/devices/bus/multibus/robotron_k7071.h new file mode 100644 index 0000000000000..55efbd3e05ef6 --- /dev/null +++ b/src/devices/bus/multibus/robotron_k7071.h @@ -0,0 +1,61 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev + +#ifndef MAME_BUS_MULTIBUS_ROBOTRON_K7071_H +#define MAME_BUS_MULTIBUS_ROBOTRON_K7071_H + +#pragma once + +#include "multibus.h" + +#include "cpu/z80/z80.h" +#include "machine/i8257.h" +#include "video/i8275.h" + +#include "emupal.h" +#include "screen.h" + + +class robotron_k7071_device + : public device_t + , public device_multibus_interface +{ +public: + robotron_k7071_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + virtual void device_reset() override; + virtual const tiny_rom_entry *device_rom_region() const override; + + void cpu_mem(address_map &map); + virtual void cpu_pio(address_map &map); + +private: + required_device m_cpu; + required_device m_dma; + required_device m_crtc; + required_device m_screen; + required_device m_palette; + required_shared_ptr m_ram; + required_region_ptr m_p_chargen; + + memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program; + + uint8_t m_kgs_datao, m_kgs_datai, m_kgs_ctrl; + bool m_nmi_enable; + + I8275_DRAW_CHARACTER_MEMBER(display_pixels); + void hrq_w(int state); + + uint8_t kgs_host_r(offs_t offset); + void kgs_host_w(offs_t offset, uint8_t data); + + uint16_t io_r(offs_t offset, uint16_t mem_mask); + void io_w(offs_t offset, uint16_t data, uint16_t mem_mask); +}; + +DECLARE_DEVICE_TYPE(ROBOTRON_K7071, robotron_k7071_device) + +#endif // MAME_BUS_MULTIBUS_ROBOTRON_K7071_H diff --git a/src/mame/robotron/a7150.cpp b/src/mame/robotron/a7150.cpp index eaae878352c1c..448eaaa35a777 100644 --- a/src/mame/robotron/a7150.cpp +++ b/src/mame/robotron/a7150.cpp @@ -34,6 +34,7 @@ To do: #include "bus/multibus/multibus.h" #include "bus/multibus/robotron_k7070.h" +#include "bus/multibus/robotron_k7071.h" #include "bus/rs232/rs232.h" #include "cpu/i86/i86.h" #include "machine/i8087.h" @@ -140,6 +141,7 @@ void a7150_state::machine_start() static void a7150_cards(device_slot_interface &device) { device.option_add("kgs", ROBOTRON_K7070); + device.option_add("abs", ROBOTRON_K7071); } /* From a6a81a692955a8abfd41db832ec33cd64fe9323e Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 9 Apr 2024 16:28:20 +1000 Subject: [PATCH 046/109] -konami/konamigq.cpp, konami/konamigv.cpp: Use "new SCSI" 53CF96 and drives. [Windy Fairy] * Marked games as not supporting save states due to DMA pointer in member variable, and marked kdeadeye as having imperfect graphics due existing texturing issues that cause in-game text to be jumbled. -konami/konamigv.cpp: Redumped CD for kdeadeye. [Brian Troha] --- src/mame/konami/konamigq.cpp | 120 +++++++++++++------- src/mame/konami/konamigv.cpp | 211 +++++++++++++++++------------------ 2 files changed, 183 insertions(+), 148 deletions(-) diff --git a/src/mame/konami/konamigq.cpp b/src/mame/konami/konamigq.cpp index 6f58e57178d97..ba8291a3444ac 100644 --- a/src/mame/konami/konamigq.cpp +++ b/src/mame/konami/konamigq.cpp @@ -69,21 +69,23 @@ */ #include "emu.h" -#include "bus/scsi/scsi.h" -#include "bus/scsi/scsihd.h" + +#include "bus/nscsi/hd.h" #include "cpu/m68000/m68000.h" #include "cpu/psx/psx.h" #include "cpu/tms57002/tms57002.h" -#include "machine/am53cf96.h" #include "machine/eepromser.h" #include "machine/mb89371.h" +#include "machine/ncr53c90.h" #include "machine/ram.h" #include "sound/k054539.h" #include "sound/k056800.h" #include "video/psx.h" + #include "screen.h" #include "speaker.h" +#include "endianness.h" #include "multibyte.h" @@ -97,7 +99,7 @@ class konamigq_state : public driver_device m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), m_dasp(*this, "dasp"), - m_am53cf96(*this, "am53cf96"), + m_ncr53cf96(*this, "scsi:7:ncr53cf96"), m_k056800(*this, "k056800"), m_pcmram(*this, "pcmram") { @@ -107,18 +109,26 @@ class konamigq_state : public driver_device protected: virtual void machine_start() override; + virtual void machine_reset() override; private: + emu_timer *m_dma_timer; + required_device m_maincpu; required_device m_soundcpu; required_device m_dasp; - required_device m_am53cf96; + required_device m_ncr53cf96; required_device m_k056800; required_shared_ptr m_pcmram; - uint8_t m_sector_buffer[ 512 ]{}; - uint8_t m_sound_ctrl = 0; - uint8_t m_sound_intck = 0; + uint8_t m_sound_ctrl; + uint8_t m_sound_intck; + + uint32_t *m_dma_data_ptr; + uint32_t m_dma_offset; + int32_t m_dma_size; + bool m_dma_is_write; + bool m_dma_requested; void eeprom_w(uint16_t data); void pcmram_w(offs_t offset, uint8_t data); @@ -128,8 +138,12 @@ class konamigq_state : public driver_device INTERRUPT_GEN_MEMBER(tms_sync); void k054539_irq_gen(int state); + TIMER_CALLBACK_MEMBER(scsi_dma_transfer); + void scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ); void scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ); + void scsi_drq(int state); + void konamigq_dasp_map(address_map &map); void konamigq_k054539_map(address_map &map); void konamigq_map(address_map &map); @@ -173,7 +187,7 @@ uint8_t konamigq_state::pcmram_r(offs_t offset) void konamigq_state::konamigq_map(address_map &map) { - map(0x1f000000, 0x1f00001f).rw(m_am53cf96, FUNC(am53cf96_device::read), FUNC(am53cf96_device::write)).umask32(0x00ff00ff); + map(0x1f000000, 0x1f00001f).m(m_ncr53cf96, FUNC(ncr53cf96_device::map)).umask16(0x00ff); map(0x1f100000, 0x1f10001f).rw(m_k056800, FUNC(k056800_device::host_r), FUNC(k056800_device::host_w)).umask32(0x00ff00ff); map(0x1f180000, 0x1f180001).w(FUNC(konamigq_state::eeprom_w)); map(0x1f198000, 0x1f198003).nopw(); /* cabinet lamps? */ @@ -269,43 +283,66 @@ void konamigq_state::k054539_irq_gen(int state) void konamigq_state::scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ) { - uint8_t *sector_buffer = m_sector_buffer; - int i; - int n_this; + m_dma_data_ptr = p_n_psxram; + m_dma_offset = n_address; + m_dma_size = n_size * 4; + m_dma_is_write = false; + m_dma_timer->adjust(attotime::from_usec(10)); +} + +void konamigq_state::scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ) +{ + m_dma_data_ptr = p_n_psxram; + m_dma_offset = n_address; + m_dma_size = n_size * 4; + m_dma_is_write = true; + m_dma_timer->adjust(attotime::from_usec(10)); +} - while( n_size > 0 ) +TIMER_CALLBACK_MEMBER(konamigq_state::scsi_dma_transfer) +{ + if (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0) { - if( n_size > sizeof( m_sector_buffer ) / 4 ) - { - n_this = sizeof( m_sector_buffer ) / 4; - } + if (m_dma_is_write) + m_ncr53cf96->dma_w(util::little_endian_cast(m_dma_data_ptr)[m_dma_offset]); else - { - n_this = n_size; - } - m_am53cf96->dma_read_data( n_this * 4, sector_buffer ); - n_size -= n_this; - - i = 0; - while( n_this > 0 ) - { - p_n_psxram[ n_address / 4 ] = get_u32le( §or_buffer[ i ] ); - n_address += 4; - i += 4; - n_this--; - } + util::little_endian_cast(m_dma_data_ptr)[m_dma_offset] = m_ncr53cf96->dma_r(); + + m_dma_offset++; + m_dma_size--; } + + if (m_dma_requested && m_dma_size > 0) + m_dma_timer->adjust(attotime::from_usec(10)); } -void konamigq_state::scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ) +void konamigq_state::scsi_drq(int state) { + if (!m_dma_requested && state) + m_dma_timer->adjust(attotime::from_usec(10)); + + m_dma_requested = state; } void konamigq_state::machine_start() { - save_item(NAME(m_sector_buffer)); save_item(NAME(m_sound_ctrl)); save_item(NAME(m_sound_intck)); + + m_dma_timer = timer_alloc(FUNC(konamigq_state::scsi_dma_transfer), this); + m_dma_timer->adjust(attotime::never); +} + +void konamigq_state::machine_reset() +{ + m_sound_ctrl = 0; + m_sound_intck = 0; + + m_dma_timer->adjust(attotime::never); + m_dma_data_ptr = nullptr; + m_dma_offset = 0; + m_dma_size = 0; + m_dma_requested = m_dma_is_write = false; } void konamigq_state::konamigq(machine_config &config) @@ -328,12 +365,15 @@ void konamigq_state::konamigq(machine_config &config) EEPROM_93C46_16BIT(config, "eeprom").default_data(konamigq_def_eeprom, 128); - scsi_port_device &scsi(SCSI_PORT(config, "scsi", 0)); - scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); - - AM53CF96(config, m_am53cf96, 0); - m_am53cf96->set_scsi_port("scsi"); - m_am53cf96->irq_handler().set("maincpu:irq", FUNC(psxirq_device::intin10)); + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:0").option_set("harddisk", NSCSI_HARDDISK); + NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr53cf96", NCR53CF96).clock(32_MHz_XTAL/2).machine_config( + [this] (device_t *device) + { + ncr53cf96_device &adapter = downcast(*device); + adapter.irq_handler_cb().set(":maincpu:irq", FUNC(psxirq_device::intin10)); + adapter.drq_handler_cb().set(*this, FUNC(konamigq_state::scsi_drq)); + }); /* video hardware */ CXD8538Q(config, "gpu", XTAL(53'693'175), 0x200000, subdevice("maincpu")).set_screen("screen"); @@ -453,7 +493,7 @@ ROM_START( cryptklr ) ROM_REGION32_LE( 0x080000, "maincpu:rom", 0 ) /* bios */ ROM_LOAD( "420b03.27p", 0x0000000, 0x080000, CRC(aab391b1) SHA1(bf9dc7c0c8168c22a4be266fe6a66d3738df916b) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":harddisk" ) + DISK_REGION( "scsi:0:harddisk:image" ) DISK_IMAGE( "420uaa04", 0, SHA1(67cb1418fc0de2a89fc61847dc9efb9f1bebb347) ) ROM_END diff --git a/src/mame/konami/konamigv.cpp b/src/mame/konami/konamigv.cpp index 38bd4c21aa6ea..c804090ef9560 100644 --- a/src/mame/konami/konamigv.cpp +++ b/src/mame/konami/konamigv.cpp @@ -44,6 +44,10 @@ The Simpsons Bowling uses an extra PCB plugged in on top containing flash ROMs a Some of the other games may also have extra PCBs. +Have seen two different CD-ROM drives: +- Sony CDU-76S (found in Hyper Athlete) +- Toshiba XM-5401B (found in Tokimeki Memorial Oshiete Your Heart) + PCB Layouts @@ -62,7 +66,7 @@ ZV610 PWB301331 |A CXD2923AR 058239 | |M | |M CXD8530BQ | -|A D482445LGW-A70 93CF96-2 | +|A D482445LGW-A70 53CF96-2 | | CXD8514Q S| | D482445LGW-A70 C| | 67.7376MHz S| @@ -86,7 +90,7 @@ GV999 PWB301949A |A 058239 | |M 53.693175MHz | |M CXD8530CQ | -|A 93CF96-2 | +|A 53CF96-2 | | CXD8561Q S| | KM4132G271Q-12 C| | 67.7376MHz S| @@ -214,23 +218,24 @@ GQ673 PWB404691A #include "emu.h" -#include "bus/scsi/scsi.h" -#include "bus/scsi/scsicd.h" + +#include "bus/nscsi/cd.h" #include "cpu/psx/psx.h" -#include "machine/am53cf96.h" #include "machine/eepromser.h" #include "machine/intelfsh.h" #include "machine/mb89371.h" +#include "machine/ncr53c90.h" #include "machine/upd4701.h" #include "machine/ram.h" #include "sound/cdda.h" #include "sound/spu.h" #include "video/psx.h" + #include "screen.h" #include "speaker.h" -#include "cdrom.h" -#include "multibyte.h" +#include "cdrom.h" +#include "endianness.h" namespace { @@ -240,7 +245,7 @@ class konamigv_state : public driver_device public: konamigv_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , m_am53cf96(*this, "am53cf96") + , m_ncr53cf96(*this, "scsi:7:ncr53cf96") , m_btc_trackball(*this, "upd%u", 1) , m_maincpu(*this, "maincpu") { @@ -255,24 +260,33 @@ class konamigv_state : public driver_device void konamigv_map(address_map &map); virtual void machine_start() override; + virtual void machine_reset() override; void btc_trackball_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); uint16_t tokimeki_serial_r(); void tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ); - void scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ); + void scsi_dma_read(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size); + void scsi_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size); + void scsi_drq(int state); void btchamp_map(address_map &map); void kdeadeye_map(address_map &map); void tmosh_map(address_map &map); - static void cdrom_config(device_t *device); + TIMER_CALLBACK_MEMBER(scsi_dma_transfer); - required_device m_am53cf96; + required_device m_ncr53cf96; optional_device_array m_btc_trackball; - uint8_t m_sector_buffer[ 4096 ]; required_device m_maincpu; + + uint32_t *m_dma_data_ptr; + uint32_t m_dma_offset; + int32_t m_dma_size; + bool m_dma_is_write; + bool m_dma_requested; + + emu_timer *m_dma_timer; }; class simpbowl_state : public konamigv_state @@ -301,7 +315,7 @@ class simpbowl_state : public konamigv_state void konamigv_state::konamigv_map(address_map &map) { - map(0x1f000000, 0x1f00001f).rw(m_am53cf96, FUNC(am53cf96_device::read), FUNC(am53cf96_device::write)).umask32(0x00ff00ff); + map(0x1f000000, 0x1f00001f).m(m_ncr53cf96, FUNC(ncr53cf96_device::map)).umask16(0x00ff); map(0x1f100000, 0x1f100003).portr("P1"); map(0x1f100004, 0x1f100007).portr("P2"); map(0x1f100008, 0x1f10000b).portr("P3_P4"); @@ -353,93 +367,67 @@ void konamigv_state::tmosh_map(address_map &map) // SCSI -void konamigv_state::scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ) +void konamigv_state::scsi_dma_read(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size) { - uint8_t *sector_buffer = m_sector_buffer; - int i; - int n_this; + m_dma_data_ptr = p_n_psxram; + m_dma_offset = n_address; + m_dma_size = n_size * 4; + m_dma_is_write = false; + m_dma_timer->adjust(attotime::from_usec(10)); +} + +void konamigv_state::scsi_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size) +{ + m_dma_data_ptr = p_n_psxram; + m_dma_offset = n_address; + m_dma_size = n_size * 4; + m_dma_is_write = true; + m_dma_timer->adjust(attotime::from_usec(10)); +} - while( n_size > 0 ) +TIMER_CALLBACK_MEMBER(konamigv_state::scsi_dma_transfer) +{ + if (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0) { - if( n_size > sizeof( m_sector_buffer ) / 4 ) - { - n_this = sizeof( m_sector_buffer ) / 4; - } - else - { - n_this = n_size; - } - if( n_this < 2048 / 4 ) - { - // non-READ commands - m_am53cf96->dma_read_data( n_this * 4, sector_buffer ); - } + if (m_dma_is_write) + m_ncr53cf96->dma_w(util::little_endian_cast(m_dma_data_ptr)[m_dma_offset]); else - { - // assume normal 2048 byte data for now - m_am53cf96->dma_read_data( 2048, sector_buffer ); - n_this = 2048 / 4; - } - n_size -= n_this; - - i = 0; - while( n_this > 0 ) - { - p_n_psxram[ n_address / 4 ] = get_u32le( §or_buffer[ i ] ); - n_address += 4; - i += 4; - n_this--; - } + util::little_endian_cast(m_dma_data_ptr)[m_dma_offset] = m_ncr53cf96->dma_r(); + + m_dma_offset++; + m_dma_size--; } + + if (m_dma_requested && m_dma_size > 0) + m_dma_timer->adjust(attotime::from_usec(10)); } -void konamigv_state::scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ) +void konamigv_state::scsi_drq(int state) { - uint8_t *sector_buffer = m_sector_buffer; - int i; - int n_this; + if (!m_dma_requested && state) + m_dma_timer->adjust(attotime::from_usec(10)); - while( n_size > 0 ) - { - if( n_size > sizeof( m_sector_buffer ) / 4 ) - { - n_this = sizeof( m_sector_buffer ) / 4; - } - else - { - n_this = n_size; - } - n_size -= n_this; - - i = 0; - while( n_this > 0 ) - { - put_u32le( §or_buffer[ i ], p_n_psxram[ n_address / 4 ] ); - n_address += 4; - i += 4; - n_this--; - } - - m_am53cf96->dma_write_data( i, sector_buffer ); - } + m_dma_requested = state; } void konamigv_state::machine_start() { - save_item(NAME(m_sector_buffer)); + m_dma_timer = timer_alloc(FUNC(konamigv_state::scsi_dma_transfer), this); } -void simpbowl_state::machine_start() +void konamigv_state::machine_reset() { - konamigv_state::machine_start(); - save_item(NAME(m_flash_address)); + m_dma_timer->adjust(attotime::never); + m_dma_data_ptr = nullptr; + m_dma_offset = 0; + m_dma_size = 0; + m_dma_requested = m_dma_is_write = false; } -void konamigv_state::cdrom_config(device_t *device) +void simpbowl_state::machine_start() { - device->subdevice("cdda")->add_route(0, "^^lspeaker", 1.0); - device->subdevice("cdda")->add_route(1, "^^rspeaker", 1.0); - device = device->subdevice("cdda"); + konamigv_state::machine_start(); + save_item(NAME(m_flash_address)); } void konamigv_state::konamigv(machine_config &config) @@ -454,13 +442,20 @@ void konamigv_state::konamigv(machine_config &config) MB89371(config, "mb89371", 0); EEPROM_93C46_16BIT(config, "eeprom"); - scsi_port_device &scsi(SCSI_PORT(config, "scsi", 0)); - scsi.set_slot_device(1, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4)); - scsi.slot(1).set_option_machine_config("cdrom", cdrom_config); - - AM53CF96(config, m_am53cf96, 0); - m_am53cf96->set_scsi_port("scsi"); - m_am53cf96->irq_handler().set("maincpu:irq", FUNC(psxirq_device::intin10)); + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:4").option_set("cdrom", NSCSI_XM5401).machine_config( + [](device_t *device) + { + device->subdevice("cdda")->add_route(0, "^^lspeaker", 1.0); + device->subdevice("cdda")->add_route(1, "^^rspeaker", 1.0); + }); + NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr53cf96", NCR53CF96).clock(32_MHz_XTAL/2).machine_config( + [this](device_t *device) + { + ncr53cf96_device &adapter = downcast(*device); + adapter.irq_handler_cb().set(":maincpu:irq", FUNC(psxirq_device::intin10)); + adapter.drq_handler_cb().set(*this, FUNC(konamigv_state::scsi_drq)); + }); // video hardware CXD8514Q(config, "gpu", XTAL(53'693'175), 0x100000, subdevice("maincpu")).set_screen("screen"); @@ -823,7 +818,7 @@ ROM_START( lacrazyc ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "lacrazyc.25c", 0x000000, 0x000080, CRC(e20e5730) SHA1(066b49236c658a4ef2930f7bacc4b2354dd7f240) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "gv027-a1", 0, BAD_DUMP SHA1(840d0d4876cf1b814c9d8db975aa6c92e1fe4039) ) ROM_END @@ -833,7 +828,7 @@ ROM_START( susume ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "susume.25c", 0x000000, 0x000080, CRC(52f17df7) SHA1(b8ad7787b0692713439d7d9bebfa0c801c806006) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "gv027j1", 0, BAD_DUMP SHA1(e7e6749ac65de7771eb8fed7d5eefaec3f902255) ) ROM_END @@ -843,7 +838,7 @@ ROM_START( hyperath ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "hyperath.25c", 0x000000, 0x000080, CRC(20a8c435) SHA1(a0f203a999757fba68b391c525ac4b9684a57ba9) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "gv021-j1", 0, SHA1(579442444025b18da658cd6455c51459fbc3de0e) ) ROM_END @@ -853,7 +848,7 @@ ROM_START( powyak96 ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "powyak96.25c", 0x000000, 0x000080, CRC(405a7fc9) SHA1(e2d978f49748ba3c4a425188abcd3d272ec23907) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "powyak96", 0, BAD_DUMP SHA1(ebd0ea18ff9ce300ea1e30d66a739a96acfb0621) ) ROM_END @@ -863,7 +858,7 @@ ROM_START( weddingr ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "weddingr.25c", 0x000000, 0x000080, CRC(b90509a0) SHA1(41510a0ceded81dcb26a70eba97636d38d3742c3) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "weddingr", 0, BAD_DUMP SHA1(4e7122b191747ab7220fe4ce1b4483d62ab579af) ) ROM_END @@ -873,7 +868,7 @@ ROM_START( simpbowl ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "simpbowl.25c", 0x000000, 0x000080, CRC(2c61050c) SHA1(16ae7f81cbe841c429c5c7326cf83e87db1782bf) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "829uaa02", 0, SHA1(2ec4cc608d5582e478ee047b60ccee67b52f060c) ) ROM_END @@ -883,7 +878,7 @@ ROM_START( btchamp ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "btchmp.25c", 0x000000, 0x000080, CRC(6d02ea54) SHA1(d3babf481fd89db3aec17f589d0d3d999a2aa6e1) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "btchamp", 0, BAD_DUMP SHA1(c9c858e9034826e1a12c3c003dd068a49a3577e1) ) ROM_END @@ -893,8 +888,8 @@ ROM_START( kdeadeye ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "kdeadeye.25c", 0x000000, 0x000080, CRC(3935d2df) SHA1(cbb855c475269077803c380dbc3621e522efe51e) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) - DISK_IMAGE_READONLY( "kdeadeye", 0, BAD_DUMP SHA1(3c737c51717925be724dcb93d30769649029b8ce) ) + DISK_REGION( "scsi:4:cdrom" ) + DISK_IMAGE_READONLY( "054uaa01", 0, SHA1(84ff29b6ca0282b8d3ffac8c8a1a1c58085fd469) ) ROM_END ROM_START( nagano98 ) @@ -903,7 +898,7 @@ ROM_START( nagano98 ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "nagano98.25c", 0x000000, 0x000080, CRC(b64b7451) SHA1(a77a37e0cc580934d1e7e05d523bae0acd2c1480) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "nagano98", 0, BAD_DUMP SHA1(1be7bd4531f249ff2233dd40a206c8d60054a8c6) ) ROM_END @@ -913,7 +908,7 @@ ROM_START( naganoj ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "720ja.25c", 0x000000, 0x000080, CRC(34c473ba) SHA1(768225b04a293bdbc114a092d14dee28d52044e9) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "720jaa01", 0, SHA1(437160996551ef4dfca43899d1d14beca62eb4c9) ) ROM_END @@ -923,7 +918,7 @@ ROM_START( tmosh ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "tmosh.25c", 0x000000, 0x000080, NO_DUMP ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "673jaa01", 0, SHA1(eaa76073749f9db48c1bee3dff9bea955683c8a8) ) ROM_END @@ -933,7 +928,7 @@ ROM_START( tmoshs ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "tmoshs.25c", 0x000000, 0x000080, CRC(e57b833f) SHA1(f18a0974a6be69dc179706643aab837ff61c2738) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "755jaa01", 0, SHA1(fc742a0b763ba38350ba7eb5d775948632aafd9d) ) ROM_END @@ -943,7 +938,7 @@ ROM_START( tmoshsp ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "tmoshsp.25c", 0x000000, 0x000080, CRC(af4cdd87) SHA1(97041e287e4c80066043967450779b81b62b2b8e) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "756jab01", 0, SHA1(b2c59b9801debccbbd986728152f314535c67e53) ) ROM_END @@ -953,7 +948,7 @@ ROM_START( tmoshspa ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "tmoshsp.25c", 0x000000, 0x000080, CRC(af4cdd87) SHA1(97041e287e4c80066043967450779b81b62b2b8e) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "756jaa01", 0, BAD_DUMP SHA1(5e6d349ad1a22c0dbb1ec26aa05febc830254339) ) // The CD was damaged ROM_END @@ -968,12 +963,12 @@ GAME( 1996, hyperath, konamigv, konamigv, konamigv, konamigv_state, empty_init, GAME( 1996, lacrazyc, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Let's Attack Crazy Cross (GV027 Asia 1.10)", MACHINE_IMPERFECT_SOUND ) GAME( 1996, susume, lacrazyc, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Susume! Taisen Puzzle-Dama (GV027 Japan 1.20)", MACHINE_IMPERFECT_SOUND ) GAME( 1996, btchamp, konamigv, btchamp, btchamp, konamigv_state, empty_init, ROT0, "Konami", "Beat the Champ (GV053 UAA01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -GAME( 1996, kdeadeye, konamigv, kdeadeye, kdeadeye, konamigv_state, empty_init, ROT0, "Konami", "Dead Eye (GV054 UAA01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +GAME( 1996, kdeadeye, konamigv, kdeadeye, kdeadeye, konamigv_state, empty_init, ROT0, "Konami", "Dead Eye (GV054 UAA01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) GAME( 1997, weddingr, konamigv, konamigv, weddingr, konamigv_state, empty_init, ROT0, "Konami", "Wedding Rhapsody (GX624 JAA)", MACHINE_IMPERFECT_SOUND ) GAME( 1997, tmosh, konamigv, tmosh, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart (GQ673 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1997, tmoshs, konamigv, tmosh, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version (GE755 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1997, tmoshsp, konamigv, tmosh, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAB)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1997, tmoshspa, tmoshsp, tmosh, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) -GAME( 1998, nagano98, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Nagano Winter Olympics '98 (GX720 EAA)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE) -GAME( 1998, naganoj, nagano98, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Hyper Olympic in Nagano (GX720 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE) -GAME( 2000, simpbowl, konamigv, simpbowl, simpbowl, simpbowl_state, empty_init, ROT0, "Konami", "The Simpsons Bowling (GQ829 UAA)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE) +GAME( 1998, nagano98, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Nagano Winter Olympics '98 (GX720 EAA)", MACHINE_IMPERFECT_SOUND) +GAME( 1998, naganoj, nagano98, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Hyper Olympic in Nagano (GX720 JAA)", MACHINE_IMPERFECT_SOUND) +GAME( 2000, simpbowl, konamigv, simpbowl, simpbowl, simpbowl_state, empty_init, ROT0, "Konami", "The Simpsons Bowling (GQ829 UAA)", MACHINE_IMPERFECT_SOUND) From d062c313a3512e6895fd550c95085d817b863f9e Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Tue, 9 Apr 2024 21:45:39 +0200 Subject: [PATCH 047/109] -bmc/koftball.cpp updates: * inputs for jxzh [dyq] * added 3rd and 4th tilemap layers, fixes missing GFX * ported over IRQ handling from bmc/bmcpokr.cpp - subsino/subsino2.cpp: dumped DS2430A for saklove [Guru] --- src/mame/bmc/koftball.cpp | 325 ++++++++++++++++++++++++++++------ src/mame/subsino/subsino2.cpp | 2 +- 2 files changed, 274 insertions(+), 53 deletions(-) diff --git a/src/mame/bmc/koftball.cpp b/src/mame/bmc/koftball.cpp index 18972af6c6f20..242e2fa299a86 100644 --- a/src/mame/bmc/koftball.cpp +++ b/src/mame/bmc/koftball.cpp @@ -1,18 +1,22 @@ // license:BSD-3-Clause -// copyright-holders:Tomasz Slanina +// copyright-holders: Tomasz Slanina + /* King Of Football (c)1995 BMC preliminary driver by Tomasz Slanina -TODO: jxzh has bad GFX and needs correct protection handling. For testing, one well-placed soft reset - will make it boot +TODO: +- boards have 2 DIP banks which aren't hooked up in emulation, jxzh DSW 2:8 enables test mode on real hw; +- lots of unknown writes / reads; +- one of the customs could contain a VIA6522-like core. bmc/bmcbowl.cpp uses the VIA6522 and the + accesses are similar. -- MC68000P10 -M28 (OKI 6295, next to rom C9) -BMC ADB40817(80 Pin PQFP - google hits, but no datasheet or description) +M28 (OKI 6295, next to ROM C9) +BMC ADB40817(80 Pin PQFP - Google hits, but no datasheet or description) RAMDAC TRC1710-80PCA (Monolithic 256-word by 18bit Look-up Table & Triple Video DAC with 6-bit DACs) File 89C67 (MCU?? Next to 3.57954MHz OSC) OSC: 21.47727MHz & 3.57954MHz @@ -45,6 +49,16 @@ ft5_v6_c4.u58 / #include "tilemap.h" +// configurable logging +#define LOG_GFX (1U << 1) + +//#define VERBOSE (LOG_GENERAL | LOG_GFX) + +#include "logmacro.h" + +#define LOGGFX(...) LOGMASKED(LOG_GFX, __VA_ARGS__) + + namespace { @@ -68,17 +82,21 @@ class koftball_state : public driver_device void init_koftball(); protected: + virtual void machine_start() override; virtual void video_start() override; private: required_device m_maincpu; required_shared_ptr m_main_ram; - required_shared_ptr_array m_videoram; + required_shared_ptr_array m_videoram; required_device m_gfxdecode; required_device m_palette; - tilemap_t *m_tilemap[2]{}; + tilemap_t *m_tilemap[4]{}; uint16_t m_prot_data = 0; + uint8_t m_irq_enable = 0; + uint8_t m_gfx_ctrl = 0; + void irq_ack_w(uint8_t data); uint16_t random_number_r(); uint16_t prot_r(); void prot_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); @@ -92,28 +110,72 @@ class koftball_state : public driver_device }; +void koftball_state::machine_start() +{ + m_prot_data = 0; + + save_item(NAME(m_prot_data)); + save_item(NAME(m_irq_enable)); + save_item(NAME(m_gfx_ctrl)); +} + template TILE_GET_INFO_MEMBER(koftball_state::get_tile_info) { - int data = m_videoram[Which][tile_index]; - tileinfo.set(0, - data, - 0, - 0); + int const data = m_videoram[Which][tile_index]; + tileinfo.set(0, data, 0, 0); } void koftball_state::video_start() { - m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(koftball_state::get_tile_info<0>)), TILEMAP_SCAN_ROWS, 8,8,64,32); - m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(koftball_state::get_tile_info<1>)), TILEMAP_SCAN_ROWS, 8,8,64,32); + m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(koftball_state::get_tile_info<0>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(koftball_state::get_tile_info<1>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(koftball_state::get_tile_info<2>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(koftball_state::get_tile_info<3>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); m_tilemap[0]->set_transparent_pen(0); + m_tilemap[2]->set_transparent_pen(0); } uint32_t koftball_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); - m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0); + /* + TODO: + there are a lot of unused bits written to both 0x320000 and 0x2a000f during screen changes. + Bit 1 and 5 of 0x320000 are the only ones that give correct layer results (see table below). + What is the meaning of the others? More games running on this hw would help. + + The following table describes the attract mode sequence for jxzh. koftball is relatively simpler as it almost + only uses the first 2 layers. + + layer0 layer 1 layer 2 layer 3 0x2a000f 0x320000 + title screen over under off off 0x13 0x98 + girl with scrolling tiles prev screen prev screen over under 0x1b 0xba + 0x00 0x00 + demon over under prev screen prev screen 0x1f 0x98 + 0x00 0x00 + slot with road signs prev screen prev screen over under 0x17 0xba + Chinese lanterns prev screen prev screen over under 0x17 0xba + slot with numbers prev screen prev screen over under 0x17 0xba + 0x00 0x00 + pirates over under prev screen prev screen 0x17 0x98 + 0x00 0x00 + tile race over under prev screen prev screen 0x17 0x98 + 0x00 0x00 + girl select after coin up prev screen prev screen over under 0x13 0x3a + */ + + if (BIT(m_gfx_ctrl, 5)) // TODO: or bit 1? + { + m_tilemap[3]->draw(screen, bitmap, cliprect, 0, 0); + m_tilemap[2]->draw(screen, bitmap, cliprect, 0, 0); + } + else + { + m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); + m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0); + } + return 0; } @@ -125,7 +187,7 @@ uint16_t koftball_state::random_number_r() uint16_t koftball_state::prot_r() { - switch(m_prot_data) + switch (m_prot_data) { case 0x0000: return 0x0d00; case 0xff00: return 0x8d00; @@ -133,7 +195,7 @@ uint16_t koftball_state::prot_r() case 0x8000: return 0x0f0f; } - logerror("unk prot r %x %x\n",m_prot_data, m_maincpu->pcbase()); + logerror("unk prot r %x %x\n", m_prot_data, m_maincpu->pcbase()); return machine().rand(); } @@ -149,30 +211,43 @@ void koftball_state::videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) m_tilemap[Which]->mark_tile_dirty(offset); } +void koftball_state::irq_ack_w(uint8_t data) +{ + for (int i = 1; i < 8; i++) + if (BIT(data, i)) + m_maincpu->set_input_line(i, CLEAR_LINE); +} + void koftball_state::koftball_mem(address_map &map) { map(0x000000, 0x01ffff).rom(); map(0x220000, 0x22ffff).ram().share(m_main_ram); - map(0x260000, 0x260fff).w(FUNC(koftball_state::videoram_w<0>)).share(m_videoram[0]); - map(0x261000, 0x261fff).w(FUNC(koftball_state::videoram_w<1>)).share(m_videoram[1]); - map(0x262000, 0x26ffff).ram(); + map(0x260000, 0x260fff).ram().w(FUNC(koftball_state::videoram_w<0>)).share(m_videoram[0]); + map(0x261000, 0x261fff).ram().w(FUNC(koftball_state::videoram_w<1>)).share(m_videoram[1]); + map(0x262000, 0x262fff).ram().w(FUNC(koftball_state::videoram_w<2>)).share(m_videoram[2]); + map(0x263000, 0x263fff).ram().w(FUNC(koftball_state::videoram_w<3>)).share(m_videoram[3]); + map(0x268000, 0x26ffff).ram(); map(0x280000, 0x28ffff).ram(); // unused ? - map(0x2a0000, 0x2a001f).nopw(); + map(0x2a0007, 0x2a0007).w(FUNC(koftball_state::irq_ack_w)); + map(0x2a0009, 0x2a0009).lw8(NAME([this] (uint8_t data) { m_irq_enable = data; })); + map(0x2a000f, 0x2a000f).lw8(NAME([this] (uint8_t data) { LOGGFX("GFX ctrk 2a000f %02x\n", data); })); + map(0x2a001a, 0x2a001b).nopw(); map(0x2a0000, 0x2a001f).r(FUNC(koftball_state::random_number_r)); map(0x2b0000, 0x2b0003).r(FUNC(koftball_state::random_number_r)); map(0x2d8000, 0x2d8001).r(FUNC(koftball_state::random_number_r)); map(0x2da000, 0x2da003).w("ymsnd", FUNC(ym2413_device::write)).umask16(0xff00); map(0x2db001, 0x2db001).w("ramdac", FUNC(ramdac_device::index_w)); + map(0x2db002, 0x2db003).nopr(); // reads here during some scene changes map(0x2db003, 0x2db003).w("ramdac", FUNC(ramdac_device::pal_w)); map(0x2db005, 0x2db005).w("ramdac", FUNC(ramdac_device::mask_w)); map(0x2dc000, 0x2dc000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x2f0000, 0x2f0003).portr("INPUTS"); map(0x300000, 0x300001).nopw(); - map(0x320000, 0x320001).nopw(); + map(0x320000, 0x320000).lw8(NAME([this] (uint8_t data) { m_gfx_ctrl = data; LOGGFX("GFX ctrl 320000 %02x\n", data); })); map(0x340000, 0x340001).r(FUNC(koftball_state::prot_r)); map(0x360000, 0x360001).w(FUNC(koftball_state::prot_w)); } @@ -184,23 +259,29 @@ void koftball_state::jxzh_mem(address_map &map) map(0x260000, 0x260fff).ram().w(FUNC(koftball_state::videoram_w<0>)).share(m_videoram[0]); map(0x261000, 0x261fff).ram().w(FUNC(koftball_state::videoram_w<1>)).share(m_videoram[1]); - map(0x262000, 0x26ffff).ram(); + map(0x262000, 0x262fff).ram().w(FUNC(koftball_state::videoram_w<2>)).share(m_videoram[2]); + map(0x263000, 0x263fff).ram().w(FUNC(koftball_state::videoram_w<3>)).share(m_videoram[3]); + map(0x264b00, 0x264dff).ram(); // TODO: writes here at least at girl selection after coin up. Some kind of effect? + map(0x268000, 0x26ffff).ram(); map(0x280000, 0x28ffff).ram(); // unused ? - map(0x2a0000, 0x2a001f).nopw(); + map(0x2a0007, 0x2a0007).w(FUNC(koftball_state::irq_ack_w)); + map(0x2a0009, 0x2a0009).lw8(NAME([this] (uint8_t data) { m_irq_enable = data; })); + map(0x2a000f, 0x2a000f).lw8(NAME([this] (uint8_t data) { LOGGFX("GFX ctrk 2a000f %02x\n", data); })); + map(0x2a001a, 0x2a001d).nopw(); map(0x2a0000, 0x2a001f).r(FUNC(koftball_state::random_number_r)); - map(0x2b0000, 0x2b0003).r(FUNC(koftball_state::random_number_r)); - map(0x2d8000, 0x2d8001).r(FUNC(koftball_state::random_number_r)); + map(0x2b0000, 0x2b0001).portr("INPUTS2"); map(0x2da000, 0x2da003).w("ymsnd", FUNC(ym2413_device::write)).umask16(0xff00); map(0x2db001, 0x2db001).w("ramdac", FUNC(ramdac_device::index_w)); + map(0x2db002, 0x2db003).nopr(); // reads here during some scene changes map(0x2db003, 0x2db003).w("ramdac", FUNC(ramdac_device::pal_w)); map(0x2db005, 0x2db005).w("ramdac", FUNC(ramdac_device::mask_w)); map(0x2dc000, 0x2dc000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0x2f0000, 0x2f0003).portr("INPUTS"); + map(0x2f0000, 0x2f0001).portr("INPUTS"); map(0x300000, 0x300001).nopw(); - map(0x320000, 0x320001).nopw(); + map(0x320000, 0x320000).lw8(NAME([this] (uint8_t data) { m_gfx_ctrl = data; LOGGFX("GFX ctrl 320000 %02x\n", data); })); map(0x340000, 0x340001).r(FUNC(koftball_state::prot_r)); map(0x360000, 0x360001).w(FUNC(koftball_state::prot_w)); map(0x380000, 0x380001).w(FUNC(koftball_state::prot_w)); @@ -214,10 +295,10 @@ void koftball_state::ramdac_map(address_map &map) static INPUT_PORTS_START( koftball ) PORT_START("INPUTS") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("info") PORT_CODE(KEYCODE_Z)//info page + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("info") PORT_CODE(KEYCODE_Z) //info page PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test2") PORT_CODE(KEYCODE_X) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("dec") PORT_CODE(KEYCODE_C)//dec sound test - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("inc") PORT_CODE(KEYCODE_V)//inc sound test + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("dec") PORT_CODE(KEYCODE_C) //dec sound test + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("inc") PORT_CODE(KEYCODE_V) //inc sound test PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test5") PORT_CODE(KEYCODE_B) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test6") PORT_CODE(KEYCODE_N) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test7") PORT_CODE(KEYCODE_M) @@ -227,25 +308,169 @@ static INPUT_PORTS_START( koftball ) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test12") PORT_CODE(KEYCODE_D) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test13") PORT_CODE(KEYCODE_F) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test14") PORT_CODE(KEYCODE_G) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("sound test") PORT_CODE(KEYCODE_H) //test mdoe enter + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("sound test") PORT_CODE(KEYCODE_H) //test mode enter PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test16") PORT_CODE(KEYCODE_J) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Select") PORT_CODE(KEYCODE_K)//test mode select + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Select") PORT_CODE(KEYCODE_K) //test mode select PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test18") PORT_CODE(KEYCODE_L) + + PORT_START("DSW1") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( jxzh ) + PORT_START("INPUTS") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) + + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Freeze") + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP) PORT_NAME("Change Tile / Double Up") + + PORT_START("INPUTS2") + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START("DSW1") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_SERVICE_DIPLOC( 0x0080, IP_ACTIVE_LOW, "SW2:8" ) INPUT_PORTS_END TIMER_DEVICE_CALLBACK_MEMBER(koftball_state::interrupt) { - int scanline = param; + int const scanline = param; - if(scanline == 240) - m_maincpu->set_input_line(2, HOLD_LINE); + if (scanline == 240) + if (BIT(m_irq_enable, 2)) + m_maincpu->set_input_line(2, ASSERT_LINE); - if(scanline == 128) - m_maincpu->set_input_line(3, HOLD_LINE); + if (scanline == 128) + if (BIT(m_irq_enable, 3)) + m_maincpu->set_input_line(3, ASSERT_LINE); - if(scanline == 64) - m_maincpu->set_input_line(6, HOLD_LINE); + if (scanline == 64) + if (BIT(m_irq_enable, 6)) + m_maincpu->set_input_line(6, ASSERT_LINE); } static const gfx_layout tilelayout = @@ -266,7 +491,7 @@ GFXDECODE_END void koftball_state::koftball(machine_config &config) { - M68000(config, m_maincpu, XTAL(21'477'272) / 2); + M68000(config, m_maincpu, 21.477272_MHz_XTAL / 2); m_maincpu->set_addrmap(AS_PROGRAM, &koftball_state::koftball_mem); TIMER(config, "scantimer").configure_scanline(FUNC(koftball_state::interrupt), "screen", 0, 1); @@ -287,11 +512,11 @@ void koftball_state::koftball(machine_config &config) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - ym2413_device &ymsnd(YM2413(config, "ymsnd", XTAL(3'579'545))); // guessed chip type, clock not verified + ym2413_device &ymsnd(YM2413(config, "ymsnd", 3.579545_MHz_XTAL)); ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.50); ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.50); - okim6295_device &oki(OKIM6295(config, "oki", 1122000, okim6295_device::PIN7_LOW)); // clock frequency & pin 7 not verified + okim6295_device &oki(OKIM6295(config, "oki", 21.477272_MHz_XTAL / 22, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 verified for jxzh oki.add_route(ALL_OUTPUTS, "lspeaker", 0.50); oki.add_route(ALL_OUTPUTS, "rspeaker", 0.50); } @@ -368,7 +593,7 @@ BMC-A-41210 *******************************************************************/ ROM_START( jxzh ) - ROM_REGION( 0x200000, "maincpu", 0 ) // 68000 Code + ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 Code ROM_LOAD16_BYTE( "bmc_m5k.u14", 0x000001, 0x20000, CRC(43b67d0a) SHA1(f421c71165d79881c208d332416f1c82057f5680) ) ROM_LOAD16_BYTE( "bmc_m6k.u15", 0x000000, 0x20000, CRC(410ee342) SHA1(2b83e0fc2c5f9a2d745755572eba751bfac107f5) ) @@ -408,16 +633,12 @@ static const uint16_t nvram[]= #endif void koftball_state::init_koftball() { - m_prot_data = 0; - - save_item(NAME(m_prot_data)); - #if NVRAM_HACK { int offset = 0; - while(nvram[offset] != 0xffff) + while (nvram[offset] != 0xffff) { - m_main_ram[offset]=nvram[offset]; + m_main_ram[offset] = nvram[offset]; ++offset; } } @@ -428,4 +649,4 @@ void koftball_state::init_koftball() GAME( 1995, koftball, 0, koftball, koftball, koftball_state, init_koftball, ROT0, "BMC", "King of Football", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1996, jxzh, 0, jxzh, koftball, koftball_state, empty_init, ROT0, "BMC", "Jinxiu Zhonghua", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1996, jxzh, 0, jxzh, jxzh, koftball_state, empty_init, ROT0, "BMC", "Jinxiu Zhonghua", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/subsino/subsino2.cpp b/src/mame/subsino/subsino2.cpp index 5b0b756a22b9f..c1478ac125f3f 100644 --- a/src/mame/subsino/subsino2.cpp +++ b/src/mame/subsino/subsino2.cpp @@ -3757,7 +3757,7 @@ ROM_START( saklove ) ROM_LOAD( "2.u10", 0x00000, 0x80000, CRC(4f70125c) SHA1(edd5e6bd47b9a4fa3c4057cb4a85544241fe483d) ) ROM_REGION( 0x28, "eeprom", 0 ) - ROM_LOAD( "ds2430a.bin", 0x00, 0x28, CRC(0ed01bd7) SHA1(62546003443845552e6adc4ca26375f93824d662) BAD_DUMP ) // handcrafted to pass protection check + ROM_LOAD( "ds2430a.q3", 0x00, 0x28, CRC(225136fb) SHA1(86095f7c98b579282605730de820d17ac2c8a141) ) ROM_END /*************************************************************************** From e3e15204d048c29b6c7e55886fe2c092c16f2895 Mon Sep 17 00:00:00 2001 From: barbudreadmon Date: Wed, 10 Apr 2024 07:59:31 +0200 Subject: [PATCH 048/109] seta/seta2.cpp: Fixed year for Guardians / Denjin Makai II (bootleg) (#12230) --- src/mame/seta/seta2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/seta/seta2.cpp b/src/mame/seta/seta2.cpp index 72b6c20012366..dc9e0bbe8a03e 100644 --- a/src/mame/seta/seta2.cpp +++ b/src/mame/seta/seta2.cpp @@ -4400,7 +4400,7 @@ GAME( 1994, gundamex, 0, gundamex, gundamex, seta2_state, empty_init, GAME( 1995, grdians, 0, grdians, grdians, seta2_state, empty_init, ROT0, "Winkysoft (Banpresto license)", "Guardians / Denjin Makai II (P-FG01-1 PCB)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1995, grdiansa, grdians, grdiansa, grdians, seta2_state, empty_init, ROT0, "Winkysoft (Banpresto license)", "Guardians / Denjin Makai II (P0-113A PCB)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1995, grdiansbl, grdians, grdiansa, grdians, seta2_state, empty_init, ROT0, "bootleg (Intac Japan)", "Guardians / Denjin Makai II (bootleg)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1998, grdiansbl, grdians, grdiansa, grdians, seta2_state, empty_init, ROT0, "bootleg (Intac Japan)", "Guardians / Denjin Makai II (bootleg)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1996, mj4simai, 0, seta2, mj4simai, mj4simai_state, empty_init, ROT0, "Maboroshi Ware", "Wakakusamonogatari Mahjong Yonshimai (Japan)", MACHINE_NO_COCKTAIL ) From 7667dde203e487ff6c0ee7da0e75f67289ba9d5a Mon Sep 17 00:00:00 2001 From: AJR Date: Wed, 10 Apr 2024 11:31:47 -0400 Subject: [PATCH 049/109] i186: Use cycles_to_attotime and attotime_to_cycles for timer period calculation. Gives better timings for Am188EM-based games in subsino/subsino2.cpp. --- src/devices/cpu/i86/i186.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/devices/cpu/i86/i186.cpp b/src/devices/cpu/i86/i186.cpp index 1e368bc5c6755..504cb331c63c3 100644 --- a/src/devices/cpu/i86/i186.cpp +++ b/src/devices/cpu/i86/i186.cpp @@ -1314,7 +1314,7 @@ void i80186_cpu_device::restart_timer(int which) int count = (t->control & 0x1000) ? t->maxB : t->maxA; if (!(t->control & 4)) - t->int_timer->adjust((attotime::from_hz(clock() / 8) * (count ? count : 0x10000)), which); + t->int_timer->adjust(cycles_to_attotime(4 * (count ? count : 0x10000)), which); } void i80186_cpu_device::internal_timer_sync(int which) @@ -1323,7 +1323,7 @@ void i80186_cpu_device::internal_timer_sync(int which) /* if we have a timing timer running, adjust the count */ if ((t->control & 0x8000) && !(t->control & 0x0c) && t->int_timer->enabled()) - t->count = ((t->control & 0x1000) ? t->maxB : t->maxA) - t->int_timer->remaining().as_ticks(clock() / 8); + t->count = ((t->control & 0x1000) ? t->maxB : t->maxA) - attotime_to_cycles(t->int_timer->remaining()) / 4; } void i80186_cpu_device::inc_timer(int which) @@ -1447,7 +1447,7 @@ void i80186_cpu_device::internal_timer_update(int which, int new_count, int new_ int diff = ((t->control & 0x1000) ? t->maxB : t->maxA) - t->count; if (diff <= 0) diff += 0x10000; - t->int_timer->adjust(attotime::from_hz(clock()/8) * diff, which); + t->int_timer->adjust(cycles_to_attotime(4 * diff), which); LOGMASKED(LOG_TIMER, "Set interrupt timer for %d\n", which); } else From 8f21eadb872e1b372e06af16dcc3903e39cf2e68 Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 10 Apr 2024 17:43:36 +0200 Subject: [PATCH 050/109] Systems promoted to working --------------------------- Igor (Excalibur) [hap, Sean Riddle] --- src/mame/atari/destroyr.cpp | 4 ++-- src/mame/efo/cidelsa.cpp | 10 +++++----- src/mame/excalibur/igor.cpp | 9 ++++----- src/mame/layout/excal_igor.lay | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/mame/atari/destroyr.cpp b/src/mame/atari/destroyr.cpp index cb719a2485301..d6b77b6510274 100644 --- a/src/mame/atari/destroyr.cpp +++ b/src/mame/atari/destroyr.cpp @@ -570,5 +570,5 @@ ROM_END } // anonymous namespace -GAMEL( 1977, destroyr, 0, destroyr, destroyr, destroyr_state, empty_init, ORIENTATION_FLIP_X, "Atari", "Destroyer (version O2)", MACHINE_SUPPORTS_SAVE, layout_destroyr ) -GAMEL( 1977, destroyr1, destroyr, destroyr, destroyr, destroyr_state, empty_init, ORIENTATION_FLIP_X, "Atari", "Destroyer (version O1)", MACHINE_SUPPORTS_SAVE, layout_destroyr ) +GAMEL( 1977, destroyr, 0, destroyr, destroyr, destroyr_state, empty_init, ORIENTATION_FLIP_X, "Atari", "Destroyer (Atari, version O2)", MACHINE_SUPPORTS_SAVE, layout_destroyr ) +GAMEL( 1977, destroyr1, destroyr, destroyr, destroyr, destroyr_state, empty_init, ORIENTATION_FLIP_X, "Atari", "Destroyer (Atari, version O1)", MACHINE_SUPPORTS_SAVE, layout_destroyr ) diff --git a/src/mame/efo/cidelsa.cpp b/src/mame/efo/cidelsa.cpp index a7314078715dd..4426d2f9300bc 100644 --- a/src/mame/efo/cidelsa.cpp +++ b/src/mame/efo/cidelsa.cpp @@ -561,8 +561,8 @@ ROM_END // Game Drivers -GAME( 1980, destryer, 0, destryer, destryer, cidelsa_state, empty_init, ROT90, "Cidelsa", "Destroyer (Cidelsa) (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1980, destryera, destryer, destryera, destryer, cidelsa_state, empty_init, ROT90, "Cidelsa", "Destroyer (Cidelsa) (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1981, altair, 0, altair, altair, cidelsa_state, empty_init, ROT90, "Cidelsa", "Altair", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 198?, altair2, 0, altair, altair, cidelsa_state, empty_init, ROT90, "Cidelsa", "Altair II", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1981, draco, 0, draco, draco, draco_state, empty_init, ROT90, "Cidelsa", "Draco", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1980, destryer, 0, destryer, destryer, cidelsa_state, empty_init, ROT90, "Cidelsa", "Destroyer (Cidelsa, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1980, destryera, destryer, destryera, destryer, cidelsa_state, empty_init, ROT90, "Cidelsa", "Destroyer (Cidelsa, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1981, altair, 0, altair, altair, cidelsa_state, empty_init, ROT90, "Cidelsa", "Altair", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 198?, altair2, 0, altair, altair, cidelsa_state, empty_init, ROT90, "Cidelsa", "Altair II", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1981, draco, 0, draco, draco, draco_state, empty_init, ROT90, "Cidelsa", "Draco", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/excalibur/igor.cpp b/src/mame/excalibur/igor.cpp index 846aa4d777957..c912c24708a15 100644 --- a/src/mame/excalibur/igor.cpp +++ b/src/mame/excalibur/igor.cpp @@ -18,7 +18,6 @@ it has a Samsung KS57C2308 MCU instead. TODO: - it does a cold boot at every reset, so nvram won't work properly unless MAME adds some kind of auxillary autosave state feature at power-off -- add SVG for LCD (not same as mirage/ivan) - where is the low battery signal? *******************************************************************************/ @@ -318,7 +317,7 @@ void igor_state::igor(machine_config &config) screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); screen.set_refresh_hz(60); - screen.set_size(1920/5, 1080/5); + screen.set_size(1920/6, 723/6); screen.set_visarea_full(); config.set_default_layout(layout_excal_igor); @@ -341,8 +340,8 @@ ROM_START( igor ) ROM_REGION( 0x20000, "cobrom", 0 ) ROM_LOAD("sound.ic2", 0x00000, 0x20000, CRC(bc540da3) SHA1(68647ce1c7e87eba90d9d1912921213af03e3c5d) ) // no label - ROM_REGION( 200000, "screen", 0 ) - ROM_LOAD("igor.svg", 0, 200000, NO_DUMP ) + ROM_REGION( 165302, "screen", 0 ) + ROM_LOAD("igor.svg", 0, 165302, CRC(25655697) SHA1(5faee5dc0c58e8e86e5f86eb2fc73d9921cb220e) ) ROM_END } // anonymous namespace @@ -354,4 +353,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1997, igor, 0, 0, igor, igor, igor_state, init_igor, "Excalibur Electronics", "Igor (Excalibur)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1997, igor, 0, 0, igor, igor, igor_state, init_igor, "Excalibur Electronics", "Igor (Excalibur)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/layout/excal_igor.lay b/src/mame/layout/excal_igor.lay index 53b1e0293b2f9..221955e71f716 100644 --- a/src/mame/layout/excal_igor.lay +++ b/src/mame/layout/excal_igor.lay @@ -461,7 +461,7 @@ authors:hap - + From 984183b9367f10f0290baf3442646bd79fb5f157 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Wed, 10 Apr 2024 18:04:13 +0200 Subject: [PATCH 051/109] bmc/koftball.cpp updates: * ported 'pixmap' related methods from bmc/bmcpokr.cpp. Test mode is now visible, although badly: * hooked up DIP switches; * identified some DIPs and inputs * hooked up NVRAM for jxzh --- src/mame/bmc/koftball.cpp | 389 ++++++++++++++++++++++---------------- 1 file changed, 226 insertions(+), 163 deletions(-) diff --git a/src/mame/bmc/koftball.cpp b/src/mame/bmc/koftball.cpp index 242e2fa299a86..ba3877361d81b 100644 --- a/src/mame/bmc/koftball.cpp +++ b/src/mame/bmc/koftball.cpp @@ -7,10 +7,15 @@ King Of Football (c)1995 BMC preliminary driver by Tomasz Slanina TODO: -- boards have 2 DIP banks which aren't hooked up in emulation, jxzh DSW 2:8 enables test mode on real hw; +- uses same 'pixmap' as bmc/bmcpokr.cpp. Noted uses are for jxzh's test mode and bookkeeping. + For now implementation is just copied over, but it needs to be adapted; - lots of unknown writes / reads; - one of the customs could contain a VIA6522-like core. bmc/bmcbowl.cpp uses the VIA6522 and the - accesses are similar. + accesses are similar; +- probably jxzh also supports the mahjong keyboard. Check if one of the dips enable it and where it + is read; +- better understanding of the koftball protection; +- hardware has a lot in common with that in bmc/bmcpokr.cpp. Merge? -- @@ -38,6 +43,7 @@ ft5_v6_c4.u58 / #include "emu.h" #include "cpu/m68000/m68000.h" +#include "machine/nvram.h" #include "machine/timer.h" #include "sound/okim6295.h" #include "sound/ymopl.h" @@ -72,6 +78,7 @@ class koftball_state : public driver_device m_maincpu(*this,"maincpu"), m_main_ram(*this, "main_ram"), m_videoram(*this, "videoram%u", 0U), + m_pixram(*this, "pixram"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette") { } @@ -84,22 +91,30 @@ class koftball_state : public driver_device protected: virtual void machine_start() override; virtual void video_start() override; + virtual void device_post_load() override; private: required_device m_maincpu; - required_shared_ptr m_main_ram; + optional_shared_ptr m_main_ram; required_shared_ptr_array m_videoram; + required_shared_ptr m_pixram; required_device m_gfxdecode; required_device m_palette; tilemap_t *m_tilemap[4]{}; uint16_t m_prot_data = 0; uint8_t m_irq_enable = 0; uint8_t m_gfx_ctrl = 0; + uint8_t m_priority = 0; + std::unique_ptr m_pixbitmap; + uint8_t m_pixpal = 0; void irq_ack_w(uint8_t data); uint16_t random_number_r(); uint16_t prot_r(); void prot_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void pixbitmap_redraw(); + void pixram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void pixpal_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); template void videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); template TILE_GET_INFO_MEMBER(get_tile_info); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -117,6 +132,8 @@ void koftball_state::machine_start() save_item(NAME(m_prot_data)); save_item(NAME(m_irq_enable)); save_item(NAME(m_gfx_ctrl)); + save_item(NAME(m_priority)); + save_item(NAME(m_pixpal)); } template @@ -126,6 +143,60 @@ TILE_GET_INFO_MEMBER(koftball_state::get_tile_info) tileinfo.set(0, data, 0, 0); } +// TODO: the following 'pixpal' methods were copied from bmc/bmcpokr.cpp. They need adapting. + +void koftball_state::pixram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_pixram[offset]); + + int const x = (offset & 0xff) << 2; + int const y = (offset >> 8); + + uint16_t const pixpal = (m_pixpal & 0xf) << 4; + + uint16_t pen; + if (ACCESSING_BITS_8_15) + { + pen = (data >> 12) & 0xf; m_pixbitmap->pix(y, x + 0) = pen ? pixpal + pen : 0; + pen = (data >> 8) & 0xf; m_pixbitmap->pix(y, x + 1) = pen ? pixpal + pen : 0; + } + if (ACCESSING_BITS_0_7) + { + pen = (data >> 4) & 0xf; m_pixbitmap->pix(y, x + 2) = pen ? pixpal + pen : 0; + pen = (data >> 0) & 0xf; m_pixbitmap->pix(y, x + 3) = pen ? pixpal + pen : 0; + } +} + +void koftball_state::pixbitmap_redraw() +{ + uint16_t const pixpal = (m_pixpal & 0xf) << 4; + int offset = 0; + for (int y = 0; y < 512; y++) + { + for (int x = 0; x < 1024; x += 4) + { + uint16_t const data = m_pixram[offset++]; + uint16_t pen; + pen = (data >> 12) & 0xf; m_pixbitmap->pix(y, x + 0) = pen ? pixpal + pen : 0; + pen = (data >> 8) & 0xf; m_pixbitmap->pix(y, x + 1) = pen ? pixpal + pen : 0; + pen = (data >> 4) & 0xf; m_pixbitmap->pix(y, x + 2) = pen ? pixpal + pen : 0; + pen = (data >> 0) & 0xf; m_pixbitmap->pix(y, x + 3) = pen ? pixpal + pen : 0; + } + } +} + +void koftball_state::pixpal_w(offs_t offset, uint8_t data, uint8_t mem_mask) +{ + uint8_t const old = m_pixpal; + if (old != COMBINE_DATA(&m_pixpal)) + pixbitmap_redraw(); +} + +void koftball_state::device_post_load() +{ + pixbitmap_redraw(); +} + void koftball_state::video_start() { m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(koftball_state::get_tile_info<0>)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); @@ -135,6 +206,8 @@ void koftball_state::video_start() m_tilemap[0]->set_transparent_pen(0); m_tilemap[2]->set_transparent_pen(0); + + m_pixbitmap = std::make_unique(0x400, 0x200); } uint32_t koftball_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -146,7 +219,7 @@ uint32_t koftball_state::screen_update(screen_device &screen, bitmap_ind16 &bitm What is the meaning of the others? More games running on this hw would help. The following table describes the attract mode sequence for jxzh. koftball is relatively simpler as it almost - only uses the first 2 layers. + only uses the first 2 layers (only noted use of the 3rd layer is for the bookkeeping screen). layer0 layer 1 layer 2 layer 3 0x2a000f 0x320000 title screen over under off off 0x13 0x98 @@ -165,6 +238,9 @@ uint32_t koftball_state::screen_update(screen_device &screen, bitmap_ind16 &bitm girl select after coin up prev screen prev screen over under 0x13 0x3a */ + if (BIT(m_priority, 3)) + copyscrollbitmap_trans(bitmap, *m_pixbitmap, 0, 0, 0, 0, cliprect, 0); + if (BIT(m_gfx_ctrl, 5)) // TODO: or bit 1? { m_tilemap[3]->draw(screen, bitmap, cliprect, 0, 0); @@ -176,6 +252,9 @@ uint32_t koftball_state::screen_update(screen_device &screen, bitmap_ind16 &bitm m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0); } + if (!BIT(m_priority, 3)) + copyscrollbitmap_trans(bitmap, *m_pixbitmap, 0, 0, 0, 0, cliprect, 0); + return 0; } @@ -229,13 +308,14 @@ void koftball_state::koftball_mem(address_map &map) map(0x263000, 0x263fff).ram().w(FUNC(koftball_state::videoram_w<3>)).share(m_videoram[3]); map(0x268000, 0x26ffff).ram(); - map(0x280000, 0x28ffff).ram(); // unused ? + map(0x280000, 0x29ffff).ram().w(FUNC(koftball_state::pixram_w)).share(m_pixram); map(0x2a0007, 0x2a0007).w(FUNC(koftball_state::irq_ack_w)); map(0x2a0009, 0x2a0009).lw8(NAME([this] (uint8_t data) { m_irq_enable = data; })); - map(0x2a000f, 0x2a000f).lw8(NAME([this] (uint8_t data) { LOGGFX("GFX ctrk 2a000f %02x\n", data); })); + map(0x2a000f, 0x2a000f).lw8(NAME([this] (uint8_t data) { m_priority = data; LOGGFX("GFX ctrl 2a000f %02x\n", data); })); + map(0x2a0017, 0x2a0017).w(FUNC(koftball_state::pixpal_w)); map(0x2a001a, 0x2a001b).nopw(); map(0x2a0000, 0x2a001f).r(FUNC(koftball_state::random_number_r)); - map(0x2b0000, 0x2b0003).r(FUNC(koftball_state::random_number_r)); + map(0x2b0000, 0x2b0001).portr("DSW"); map(0x2d8000, 0x2d8001).r(FUNC(koftball_state::random_number_r)); map(0x2da000, 0x2da003).w("ymsnd", FUNC(ym2413_device::write)).umask16(0xff00); @@ -255,7 +335,7 @@ void koftball_state::koftball_mem(address_map &map) void koftball_state::jxzh_mem(address_map &map) { map(0x000000, 0x03ffff).rom(); - map(0x200000, 0x20ffff).ram().share(m_main_ram); + map(0x200000, 0x200fff).ram().share("nvram"); map(0x260000, 0x260fff).ram().w(FUNC(koftball_state::videoram_w<0>)).share(m_videoram[0]); map(0x261000, 0x261fff).ram().w(FUNC(koftball_state::videoram_w<1>)).share(m_videoram[1]); @@ -264,13 +344,14 @@ void koftball_state::jxzh_mem(address_map &map) map(0x264b00, 0x264dff).ram(); // TODO: writes here at least at girl selection after coin up. Some kind of effect? map(0x268000, 0x26ffff).ram(); - map(0x280000, 0x28ffff).ram(); // unused ? + map(0x280000, 0x29ffff).ram().w(FUNC(koftball_state::pixram_w)).share(m_pixram); map(0x2a0007, 0x2a0007).w(FUNC(koftball_state::irq_ack_w)); map(0x2a0009, 0x2a0009).lw8(NAME([this] (uint8_t data) { m_irq_enable = data; })); - map(0x2a000f, 0x2a000f).lw8(NAME([this] (uint8_t data) { LOGGFX("GFX ctrk 2a000f %02x\n", data); })); + map(0x2a000f, 0x2a000f).lw8(NAME([this] (uint8_t data) { m_priority = data; LOGGFX("GFX ctrl 2a000f %02x\n", data); })); + map(0x2a0017, 0x2a0017).w(FUNC(koftball_state::pixpal_w)); map(0x2a001a, 0x2a001d).nopw(); map(0x2a0000, 0x2a001f).r(FUNC(koftball_state::random_number_r)); - map(0x2b0000, 0x2b0001).portr("INPUTS2"); + map(0x2b0000, 0x2b0001).portr("DSW"); map(0x2da000, 0x2da003).w("ymsnd", FUNC(ym2413_device::write)).umask16(0xff00); map(0x2db001, 0x2db001).w("ramdac", FUNC(ramdac_device::index_w)); @@ -295,81 +376,79 @@ void koftball_state::ramdac_map(address_map &map) static INPUT_PORTS_START( koftball ) PORT_START("INPUTS") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("info") PORT_CODE(KEYCODE_Z) //info page - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test2") PORT_CODE(KEYCODE_X) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("dec") PORT_CODE(KEYCODE_C) //dec sound test - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("inc") PORT_CODE(KEYCODE_V) //inc sound test - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test5") PORT_CODE(KEYCODE_B) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test6") PORT_CODE(KEYCODE_N) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test7") PORT_CODE(KEYCODE_M) - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test8") PORT_CODE(KEYCODE_A) //test mode exit - - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("BET") PORT_CODE(KEYCODE_S) //bet ? - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test12") PORT_CODE(KEYCODE_D) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test13") PORT_CODE(KEYCODE_F) - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test14") PORT_CODE(KEYCODE_G) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("sound test") PORT_CODE(KEYCODE_H) //test mode enter - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test16") PORT_CODE(KEYCODE_J) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Select") PORT_CODE(KEYCODE_K) //test mode select - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("test18") PORT_CODE(KEYCODE_L) - - PORT_START("DSW1") - PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1") - PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") - PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4") - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:5") - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6") - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") - PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:8") - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - - PORT_START("DSW2") - PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:1") - PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:2") - PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:3") - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4") - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5") - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6") - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") - PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8") - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BILL1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) // also decrease in sound test + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) // also increase in sound test + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("unknown1") PORT_CODE(KEYCODE_A) + + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("unknown2") PORT_CODE(KEYCODE_S) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) + PORT_SERVICE_NO_TOGGLE( 0x1000, IP_ACTIVE_LOW ) // test mode enter + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("unknown3") PORT_CODE(KEYCODE_D) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("unknown4") PORT_CODE(KEYCODE_F) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("unknown5") PORT_CODE(KEYCODE_G) + + PORT_START("DSW") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!8") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!7") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!6") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!5") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!4") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!3") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!2") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!1") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!8") + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!7") + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!6") + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!5") + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!4") + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!3") + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!2") + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:!1") + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END static INPUT_PORTS_START( jxzh ) PORT_START("INPUTS") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("unknown1") PORT_CODE(KEYCODE_A) // TODO: read in test mode, check the meaning shown there PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) @@ -378,81 +457,63 @@ static INPUT_PORTS_START( jxzh ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Freeze") - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("unknown2") PORT_CODE(KEYCODE_S) // TODO: read in test mode, check the meaning shown there + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) + PORT_SERVICE_NO_TOGGLE( 0x1000, IP_ACTIVE_LOW ) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP) PORT_NAME("Change Tile / Double Up") - PORT_START("INPUTS2") - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - - PORT_START("DSW1") - PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1") - PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") - PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4") - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:5") - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6") - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") - PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:8") - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - - PORT_START("DSW2") - PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:1") - PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:2") - PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:3") - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4") - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5") - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6") - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") - PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_SERVICE_DIPLOC( 0x0080, IP_ACTIVE_LOW, "SW2:8" ) + PORT_START("DSW") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!8") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!7") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!6") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!5") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!4") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!3") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!2") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!1") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Service_Mode ) ) PORT_DIPLOCATION("SW2:!8") + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!7") + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!6") + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!5") + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!4") + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!3") + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:!2") + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:!1") + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END @@ -485,7 +546,7 @@ static const gfx_layout tilelayout = }; static GFXDECODE_START( gfx_koftball ) - GFXDECODE_ENTRY( "tiles", 0, tilelayout, 0, 1 ) + GFXDECODE_ENTRY( "tiles", 0, tilelayout, 0, 1 ) GFXDECODE_END @@ -500,7 +561,7 @@ void koftball_state::koftball(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_screen_update(FUNC(koftball_state::screen_update)); screen.set_size(64*8, 32*8); - screen.set_visarea(0*8, 64*8-1, 0*8, 30*8-1); + screen.set_visarea(0*8, 64*8-1, 0*8, 29*8-1); screen.set_palette(m_palette); PALETTE(config, m_palette).set_entries(256); @@ -526,12 +587,14 @@ void koftball_state::jxzh(machine_config &config) koftball(config); m_maincpu->set_addrmap(AS_PROGRAM, &koftball_state::jxzh_mem); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); } ROM_START( koftball ) - ROM_REGION( 0x200000, "maincpu", 0 ) // 68000 Code - ROM_LOAD16_BYTE( "ft5_v16_c5.u14", 0x000001, 0x10000, CRC(45c856e3) SHA1(0a25cfc2b09f1bf996f9149ee2a7d0a7e51794b7) ) - ROM_LOAD16_BYTE( "ft5_v16_c6.u15", 0x000000, 0x10000, CRC(5e1784a5) SHA1(5690d315500fb533b12b598cb0a51bd1eadd0505) ) + ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 Code + ROM_LOAD16_BYTE( "ft5_v16_c6.u15", 0x00000, 0x10000, CRC(5e1784a5) SHA1(5690d315500fb533b12b598cb0a51bd1eadd0505) ) + ROM_LOAD16_BYTE( "ft5_v16_c5.u14", 0x00001, 0x10000, CRC(45c856e3) SHA1(0a25cfc2b09f1bf996f9149ee2a7d0a7e51794b7) ) ROM_REGION( 0x80000, "tiles", 0 ) ROM_LOAD16_BYTE( "ft5_v6_c3.u61", 0x00000, 0x20000, CRC(f3f747f3) SHA1(6e376d42099733e52779c089303391eeddf4fa87) ) @@ -539,8 +602,8 @@ ROM_START( koftball ) ROM_LOAD16_BYTE( "ft5_v6_c1.u59", 0x40000, 0x20000, CRC(b33a008f) SHA1(c4fd40883fa1c1cbc58f7b342fed753c52f0cf59) ) ROM_LOAD16_BYTE( "ft5_v6_c2.u60", 0x40001, 0x20000, CRC(3dc22223) SHA1(dc74800c51de3b6a7fbf7214a1da1d2f3d2aea84) ) - ROM_REGION( 0x040000, "oki", 0 ) // Samples - ROM_LOAD( "ft5_v6_c9.u21", 0x00000, 0x10000, CRC(f6216740) SHA1(3d1c795da2f8093e937107e3848cb96338536faf) ) + ROM_REGION( 0x40000, "oki", 0 ) // Samples + ROM_LOAD( "ft5_v6_c9.u21", 0x00000, 0x10000, CRC(f6216740) SHA1(3d1c795da2f8093e937107e3848cb96338536faf) ) ROM_END /******************************************************************* @@ -594,8 +657,8 @@ BMC-A-41210 ROM_START( jxzh ) ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 Code - ROM_LOAD16_BYTE( "bmc_m5k.u14", 0x000001, 0x20000, CRC(43b67d0a) SHA1(f421c71165d79881c208d332416f1c82057f5680) ) - ROM_LOAD16_BYTE( "bmc_m6k.u15", 0x000000, 0x20000, CRC(410ee342) SHA1(2b83e0fc2c5f9a2d745755572eba751bfac107f5) ) + ROM_LOAD16_BYTE( "bmc_m6k.u15", 0x00000, 0x20000, CRC(410ee342) SHA1(2b83e0fc2c5f9a2d745755572eba751bfac107f5) ) + ROM_LOAD16_BYTE( "bmc_m5k.u14", 0x00001, 0x20000, CRC(43b67d0a) SHA1(f421c71165d79881c208d332416f1c82057f5680) ) ROM_REGION( 0x200000, "tiles", 0 ) ROM_LOAD16_BYTE( "bmc_mj9601-3.u61", 0x000000, 0x80000, CRC(b0c66e6f) SHA1(7539178d3bd4c012f0dd2f642e5a02303779109d) ) @@ -603,8 +666,8 @@ ROM_START( jxzh ) ROM_LOAD16_BYTE( "bmc_mj9601-1.u59", 0x100000, 0x80000, CRC(184b8ba8) SHA1(0b84b9540ff72a57982a8f9e107a6d8d9314fdd1) ) ROM_LOAD16_BYTE( "bmc_mj9601-2.u60", 0x100001, 0x80000, CRC(f82e0f34) SHA1(4051c7b24f865cf7fb77eb89dde79cb30bdba7a0) ) - ROM_REGION( 0x040000, "oki", 0 ) // Samples - ROM_LOAD( "bmc_mj9601-9.u21", 0x00000, 0x40000, CRC(0ffcae13) SHA1(f8501c7c8a8bebf5da95aa3b275dd514f1014971) ) + ROM_REGION( 0x40000, "oki", 0 ) // Samples + ROM_LOAD( "bmc_mj9601-9.u21", 0x00000, 0x40000, CRC(0ffcae13) SHA1(f8501c7c8a8bebf5da95aa3b275dd514f1014971) ) ROM_END #if NVRAM_HACK From 4bcbfac11f352eabcae33b203c026ce02b3fd4ba Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 10 Apr 2024 18:06:34 +0200 Subject: [PATCH 052/109] igor: remove hidden leftover junk in svg --- src/mame/excalibur/igor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/excalibur/igor.cpp b/src/mame/excalibur/igor.cpp index c912c24708a15..b5eb6630ff94c 100644 --- a/src/mame/excalibur/igor.cpp +++ b/src/mame/excalibur/igor.cpp @@ -340,8 +340,8 @@ ROM_START( igor ) ROM_REGION( 0x20000, "cobrom", 0 ) ROM_LOAD("sound.ic2", 0x00000, 0x20000, CRC(bc540da3) SHA1(68647ce1c7e87eba90d9d1912921213af03e3c5d) ) // no label - ROM_REGION( 165302, "screen", 0 ) - ROM_LOAD("igor.svg", 0, 165302, CRC(25655697) SHA1(5faee5dc0c58e8e86e5f86eb2fc73d9921cb220e) ) + ROM_REGION( 89047, "screen", 0 ) + ROM_LOAD("igor.svg", 0, 89047, CRC(fe514f65) SHA1(da5a56882bd241d01a6c49cb1cb066b88473c445) ) ROM_END } // anonymous namespace From 2c566627a1fc0ab21cc0399e8ad0ce134e36b53f Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Thu, 11 Apr 2024 00:16:51 +0700 Subject: [PATCH 053/109] 3rdparty/asmjit: Updated to upstream version 1.13.0. (#12228) From revision asmjit/asmjit@e5d7c0bd5d9aec44d68830187138149e6a8c4e32 --- 3rdparty/asmjit/.gitignore | 3 - 3rdparty/asmjit/CMakeLists.txt | 252 +- 3rdparty/asmjit/CONTRIBUTING.md | 102 + 3rdparty/asmjit/LICENSE.md | 2 +- 3rdparty/asmjit/README.md | 51 +- 3rdparty/asmjit/src/asmjit/a64.h | 28 +- 3rdparty/asmjit/src/asmjit/arm.h | 44 +- .../asmjit/src/asmjit/arm/a64archtraits_p.h | 7 +- .../asmjit/src/asmjit/arm/a64assembler.cpp | 252 +- 3rdparty/asmjit/src/asmjit/arm/a64assembler.h | 15 +- 3rdparty/asmjit/src/asmjit/arm/a64builder.cpp | 10 +- 3rdparty/asmjit/src/asmjit/arm/a64builder.h | 2 +- .../asmjit/src/asmjit/arm/a64compiler.cpp | 5 +- 3rdparty/asmjit/src/asmjit/arm/a64compiler.h | 117 +- .../asmjit/src/asmjit/arm/a64emithelper.cpp | 14 +- .../asmjit/src/asmjit/arm/a64emithelper_p.h | 8 +- 3rdparty/asmjit/src/asmjit/arm/a64emitter.h | 36 +- .../asmjit/src/asmjit/arm/a64formatter.cpp | 247 +- .../asmjit/src/asmjit/arm/a64formatter_p.h | 17 - 3rdparty/asmjit/src/asmjit/arm/a64func.cpp | 25 +- 3rdparty/asmjit/src/asmjit/arm/a64func_p.h | 2 +- 3rdparty/asmjit/src/asmjit/arm/a64globals.h | 25 +- 3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp | 81 +- 3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h | 10 +- 3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp | 2402 +++-- 3rdparty/asmjit/src/asmjit/arm/a64instdb.h | 12 +- 3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h | 47 +- 3rdparty/asmjit/src/asmjit/arm/a64operand.cpp | 96 +- 3rdparty/asmjit/src/asmjit/arm/a64operand.h | 364 +- 3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp | 12 +- 3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h | 6 +- .../asmjit/src/asmjit/arm/armformatter.cpp | 515 +- .../asmjit/src/asmjit/arm/armformatter_p.h | 25 + 3rdparty/asmjit/src/asmjit/arm/armglobals.h | 4 - 3rdparty/asmjit/src/asmjit/arm/armoperand.h | 571 +- .../src/asmjit/arm/{a64utils.h => armutils.h} | 87 +- 3rdparty/asmjit/src/asmjit/asmjit.h | 2 +- 3rdparty/asmjit/src/asmjit/core.h | 280 +- 3rdparty/asmjit/src/asmjit/core/api-build_p.h | 19 + 3rdparty/asmjit/src/asmjit/core/api-config.h | 313 +- 3rdparty/asmjit/src/asmjit/core/archcommons.h | 194 +- .../asmjit/src/asmjit/core/archtraits.cpp | 1 + 3rdparty/asmjit/src/asmjit/core/archtraits.h | 45 +- 3rdparty/asmjit/src/asmjit/core/assembler.h | 17 +- 3rdparty/asmjit/src/asmjit/core/builder.cpp | 68 +- 3rdparty/asmjit/src/asmjit/core/builder.h | 492 +- 3rdparty/asmjit/src/asmjit/core/builder_p.h | 37 + 3rdparty/asmjit/src/asmjit/core/codebuffer.h | 30 +- .../asmjit/src/asmjit/core/codeholder.cpp | 41 +- 3rdparty/asmjit/src/asmjit/core/codeholder.h | 304 +- .../asmjit/src/asmjit/core/codewriter.cpp | 105 +- 3rdparty/asmjit/src/asmjit/core/compiler.cpp | 42 +- 3rdparty/asmjit/src/asmjit/core/compiler.h | 116 +- .../asmjit/src/asmjit/core/compilerdefs.h | 54 +- 3rdparty/asmjit/src/asmjit/core/constpool.cpp | 83 +- 3rdparty/asmjit/src/asmjit/core/constpool.h | 45 +- 3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp | 1954 +++- 3rdparty/asmjit/src/asmjit/core/cpuinfo.h | 917 +- .../asmjit/src/asmjit/core/emithelper.cpp | 25 +- .../asmjit/src/asmjit/core/emithelper_p.h | 12 +- 3rdparty/asmjit/src/asmjit/core/emitter.cpp | 82 + 3rdparty/asmjit/src/asmjit/core/emitter.h | 234 +- .../asmjit/src/asmjit/core/emitterutils.cpp | 8 +- .../asmjit/src/asmjit/core/emitterutils_p.h | 4 +- 3rdparty/asmjit/src/asmjit/core/environment.h | 256 +- .../asmjit/src/asmjit/core/errorhandler.cpp | 4 + .../asmjit/src/asmjit/core/errorhandler.h | 8 +- 3rdparty/asmjit/src/asmjit/core/formatter.cpp | 62 +- 3rdparty/asmjit/src/asmjit/core/formatter.h | 34 +- 3rdparty/asmjit/src/asmjit/core/func.cpp | 20 +- 3rdparty/asmjit/src/asmjit/core/func.h | 808 +- .../src/asmjit/core/funcargscontext.cpp | 20 +- .../src/asmjit/core/funcargscontext_p.h | 12 +- 3rdparty/asmjit/src/asmjit/core/globals.cpp | 4 +- 3rdparty/asmjit/src/asmjit/core/globals.h | 70 +- 3rdparty/asmjit/src/asmjit/core/inst.cpp | 22 +- 3rdparty/asmjit/src/asmjit/core/inst.h | 212 +- 3rdparty/asmjit/src/asmjit/core/instdb.cpp | 101 + 3rdparty/asmjit/src/asmjit/core/instdb_p.h | 40 + .../asmjit/src/asmjit/core/jitallocator.cpp | 685 +- .../asmjit/src/asmjit/core/jitallocator.h | 385 +- .../asmjit/src/asmjit/core/jitruntime.cpp | 31 +- 3rdparty/asmjit/src/asmjit/core/jitruntime.h | 26 +- 3rdparty/asmjit/src/asmjit/core/logger.cpp | 8 + 3rdparty/asmjit/src/asmjit/core/logger.h | 54 +- 3rdparty/asmjit/src/asmjit/core/operand.cpp | 136 +- 3rdparty/asmjit/src/asmjit/core/operand.h | 986 +- 3rdparty/asmjit/src/asmjit/core/osutils.cpp | 82 +- 3rdparty/asmjit/src/asmjit/core/osutils.h | 15 +- 3rdparty/asmjit/src/asmjit/core/osutils_p.h | 40 +- .../asmjit/src/asmjit/core/raassignment_p.h | 18 +- .../asmjit/src/asmjit/core/rabuilders_p.h | 2 +- 3rdparty/asmjit/src/asmjit/core/radefs_p.h | 354 +- 3rdparty/asmjit/src/asmjit/core/ralocal.cpp | 10 +- 3rdparty/asmjit/src/asmjit/core/ralocal_p.h | 65 +- 3rdparty/asmjit/src/asmjit/core/rapass.cpp | 148 +- 3rdparty/asmjit/src/asmjit/core/rapass_p.h | 292 +- 3rdparty/asmjit/src/asmjit/core/rastack.cpp | 2 +- 3rdparty/asmjit/src/asmjit/core/rastack_p.h | 31 +- 3rdparty/asmjit/src/asmjit/core/string.cpp | 108 +- 3rdparty/asmjit/src/asmjit/core/string.h | 95 +- 3rdparty/asmjit/src/asmjit/core/support.cpp | 452 +- 3rdparty/asmjit/src/asmjit/core/support.h | 661 +- 3rdparty/asmjit/src/asmjit/core/support_p.h | 27 + 3rdparty/asmjit/src/asmjit/core/target.cpp | 4 +- 3rdparty/asmjit/src/asmjit/core/target.h | 12 +- 3rdparty/asmjit/src/asmjit/core/type.h | 114 +- 3rdparty/asmjit/src/asmjit/core/virtmem.cpp | 886 +- 3rdparty/asmjit/src/asmjit/core/virtmem.h | 147 +- 3rdparty/asmjit/src/asmjit/core/zone.cpp | 12 +- 3rdparty/asmjit/src/asmjit/core/zone.h | 56 +- 3rdparty/asmjit/src/asmjit/core/zonehash.cpp | 8 +- 3rdparty/asmjit/src/asmjit/core/zonehash.h | 16 +- 3rdparty/asmjit/src/asmjit/core/zonelist.cpp | 180 +- 3rdparty/asmjit/src/asmjit/core/zonelist.h | 37 +- 3rdparty/asmjit/src/asmjit/core/zonestack.cpp | 58 +- 3rdparty/asmjit/src/asmjit/core/zonestack.h | 42 +- 3rdparty/asmjit/src/asmjit/core/zonestring.h | 16 +- 3rdparty/asmjit/src/asmjit/core/zonetree.cpp | 17 +- 3rdparty/asmjit/src/asmjit/core/zonetree.h | 62 +- .../asmjit/src/asmjit/core/zonevector.cpp | 71 +- 3rdparty/asmjit/src/asmjit/core/zonevector.h | 171 +- .../asmjit/src/asmjit/x86/x86assembler.cpp | 428 +- 3rdparty/asmjit/src/asmjit/x86/x86assembler.h | 68 +- 3rdparty/asmjit/src/asmjit/x86/x86builder.cpp | 9 +- 3rdparty/asmjit/src/asmjit/x86/x86builder.h | 11 +- .../asmjit/src/asmjit/x86/x86compiler.cpp | 5 +- 3rdparty/asmjit/src/asmjit/x86/x86compiler.h | 329 +- .../asmjit/src/asmjit/x86/x86emithelper.cpp | 105 +- .../asmjit/src/asmjit/x86/x86emithelper_p.h | 4 +- 3rdparty/asmjit/src/asmjit/x86/x86emitter.h | 324 +- .../asmjit/src/asmjit/x86/x86formatter.cpp | 142 +- 3rdparty/asmjit/src/asmjit/x86/x86func.cpp | 3 +- 3rdparty/asmjit/src/asmjit/x86/x86globals.h | 401 +- 3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp | 526 +- 3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h | 7 +- 3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp | 9286 ++++++++++------- 3rdparty/asmjit/src/asmjit/x86/x86instdb.h | 166 +- 3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h | 25 +- 3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h | 66 +- 3rdparty/asmjit/src/asmjit/x86/x86operand.cpp | 332 +- 3rdparty/asmjit/src/asmjit/x86/x86operand.h | 552 +- 3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp | 19 +- 3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h | 12 +- .../asmjit/test/asmjit_test_assembler.cpp | 19 +- 3rdparty/asmjit/test/asmjit_test_assembler.h | 29 +- .../asmjit/test/asmjit_test_assembler_a64.cpp | 21 +- .../asmjit/test/asmjit_test_assembler_x64.cpp | 5843 ++++++----- .../asmjit/test/asmjit_test_assembler_x86.cpp | 5229 +++++----- 3rdparty/asmjit/test/asmjit_test_compiler.cpp | 378 +- 3rdparty/asmjit/test/asmjit_test_compiler.h | 20 +- .../asmjit/test/asmjit_test_compiler_a64.cpp | 111 +- .../asmjit/test/asmjit_test_compiler_x86.cpp | 551 +- 3rdparty/asmjit/test/asmjit_test_emitters.cpp | 242 +- 3rdparty/asmjit/test/asmjit_test_execute.cpp | 103 + 3rdparty/asmjit/test/asmjit_test_instinfo.cpp | 8 +- 3rdparty/asmjit/test/asmjit_test_misc.h | 6 +- 3rdparty/asmjit/test/asmjit_test_perf.cpp | 16 +- 3rdparty/asmjit/test/asmjit_test_perf.h | 63 +- 3rdparty/asmjit/test/asmjit_test_perf_a64.cpp | 30 +- 3rdparty/asmjit/test/asmjit_test_perf_x86.cpp | 7612 +++++++------- 3rdparty/asmjit/test/asmjit_test_unit.cpp | 3 +- .../asmjit/test/asmjit_test_x86_sections.cpp | 35 +- 3rdparty/asmjit/test/asmjitutils.h | 24 +- 3rdparty/asmjit/test/broken.cpp | 16 +- 3rdparty/asmjit/test/broken.h | 212 +- 3rdparty/asmjit/test/performancetimer.h | 8 - 3rdparty/asmjit/tools/configure-sanitizers.sh | 4 + 3rdparty/asmjit/tools/generator-commons.js | 592 ++ 3rdparty/asmjit/tools/generator-cxx.js | 270 + .../{tablegen-arm.js => tablegen-a64.js} | 45 +- 3rdparty/asmjit/tools/tablegen-a64.sh | 3 + 3rdparty/asmjit/tools/tablegen-arm.sh | 3 - 3rdparty/asmjit/tools/tablegen-x86.js | 403 +- 3rdparty/asmjit/tools/tablegen.js | 871 +- 3rdparty/asmjit/tools/tablegen.sh | 3 +- scripts/src/3rdparty.lua | 6 +- 177 files changed, 32296 insertions(+), 22618 deletions(-) create mode 100644 3rdparty/asmjit/CONTRIBUTING.md rename 3rdparty/asmjit/src/asmjit/arm/{a64utils.h => armutils.h} (62%) create mode 100644 3rdparty/asmjit/src/asmjit/core/builder_p.h create mode 100644 3rdparty/asmjit/src/asmjit/core/instdb.cpp create mode 100644 3rdparty/asmjit/src/asmjit/core/instdb_p.h create mode 100644 3rdparty/asmjit/src/asmjit/core/support_p.h create mode 100644 3rdparty/asmjit/test/asmjit_test_execute.cpp create mode 100644 3rdparty/asmjit/tools/generator-commons.js create mode 100644 3rdparty/asmjit/tools/generator-cxx.js rename 3rdparty/asmjit/tools/{tablegen-arm.js => tablegen-a64.js} (89%) create mode 100644 3rdparty/asmjit/tools/tablegen-a64.sh delete mode 100644 3rdparty/asmjit/tools/tablegen-arm.sh diff --git a/3rdparty/asmjit/.gitignore b/3rdparty/asmjit/.gitignore index 75d36d09cd08e..7847c1c2beb6c 100644 --- a/3rdparty/asmjit/.gitignore +++ b/3rdparty/asmjit/.gitignore @@ -1,6 +1,3 @@ /build /build_* -/tools/asmdb .vscode -.kdev4 -*.kdev4 diff --git a/3rdparty/asmjit/CMakeLists.txt b/3rdparty/asmjit/CMakeLists.txt index 5d4648efbe377..9d459f00cadd4 100644 --- a/3rdparty/asmjit/CMakeLists.txt +++ b/3rdparty/asmjit/CMakeLists.txt @@ -1,12 +1,12 @@ -cmake_minimum_required(VERSION 3.5 FATAL_ERROR) +cmake_minimum_required(VERSION 3.8 FATAL_ERROR) cmake_policy(PUSH) -if(POLICY CMP0063) +if (POLICY CMP0063) cmake_policy(SET CMP0063 NEW) # Honor visibility properties. endif() -if(POLICY CMP0092) +if (POLICY CMP0092) cmake_policy(SET CMP0092 NEW) # Don't add -W3 warning level by default. endif() @@ -17,6 +17,7 @@ if (NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" STREQUAL "asmjit") endif() include(CheckCXXCompilerFlag) +INCLUDE(CheckCXXSourceCompiles) include(GNUInstallDirs) # AsmJit - Deprecated @@ -32,8 +33,8 @@ if (DEFINED ASMJIT_BUILD_STATIC) set(ASMJIT_STATIC "${ASMJIT_BUILD_STATIC}") endif() -# AsmJit - Configuration -# ====================== +# AsmJit - Configuration - Build +# ============================== if (NOT DEFINED ASMJIT_TEST) set(ASMJIT_TEST FALSE) @@ -51,12 +52,24 @@ if (NOT DEFINED ASMJIT_SANITIZE) set(ASMJIT_SANITIZE FALSE) endif() -if (NOT DEFINED ASMJIT_NO_X86) - set(ASMJIT_NO_X86 FALSE) +if (NOT DEFINED ASMJIT_NO_CUSTOM_FLAGS) + set(ASMJIT_NO_CUSTOM_FLAGS FALSE) endif() -if (NOT DEFINED ASMJIT_NO_AARCH32) - set(ASMJIT_NO_AARCH32 FALSE) +if (NOT DEFINED ASMJIT_NO_NATVIS) + set(ASMJIT_NO_NATVIS FALSE) +endif() + +# EMBED implies STATIC. +if (ASMJIT_EMBED AND NOT ASMJIT_STATIC) + set(ASMJIT_STATIC TRUE) +endif() + +# AsmJit - Configuration - Backend +# ================================ + +if (NOT DEFINED ASMJIT_NO_X86) + set(ASMJIT_NO_X86 FALSE) endif() if (NOT DEFINED ASMJIT_NO_AARCH64) @@ -67,30 +80,73 @@ if (NOT DEFINED ASMJIT_NO_FOREIGN) set(ASMJIT_NO_FOREIGN FALSE) endif() -if (NOT DEFINED ASMJIT_NO_NATVIS) - set(ASMJIT_NO_NATVIS FALSE) +# AsmJit - Configuration - Features +# ================================= + +if (NOT DEFINED ASMJIT_NO_DEPRECATED) + set(ASMJIT_NO_DEPRECATED FALSE) endif() -if (NOT DEFINED ASMJIT_NO_CUSTOM_FLAGS) - set(ASMJIT_NO_CUSTOM_FLAGS FALSE) +if (NOT DEFINED ASMJIT_NO_SHM_OPEN) + set(ASMJIT_NO_SHM_OPEN FALSE) endif() -# EMBED implies STATIC. -if (ASMJIT_EMBED AND NOT ASMJIT_STATIC) - set(ASMJIT_STATIC TRUE) +if (NOT DEFINED ASMJIT_NO_JIT) + set(ASMJIT_NO_JIT FALSE) endif() -set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'") -set(ASMJIT_TEST "${ASMJIT_TEST}" CACHE BOOL "Build 'asmjit' test applications") -set(ASMJIT_EMBED "${ASMJIT_EMBED}" CACHE BOOL "Embed 'asmjit' library (no targets)") -set(ASMJIT_STATIC "${ASMJIT_STATIC}" CACHE BOOL "Build 'asmjit' library as static") -set(ASMJIT_SANITIZE "${ASMJIT_SANITIZE}" CACHE STRING "Build with sanitizers: 'address', 'undefined', etc...") -set(ASMJIT_NO_X86 "${ASMJIT_NO_X86}" CACHE BOOL "Disable X86/X64 backend") -set(ASMJIT_NO_AARCH32 "${ASMJIT_NO_AARCH32}" CACHE BOOL "Disable AArch32 backend (ARM and THUMB)") -set(ASMJIT_NO_AARCH64 "${ASMJIT_NO_AARCH64}" CACHE BOOL "Disable AArch64 backend") -set(ASMJIT_NO_FOREIGN "${ASMJIT_NO_FOREIGN}" CACHE BOOL "Disable all foreign architectures (enables only a native architecture)") -set(ASMJIT_NO_NATVIS "${ASMJIT_NO_NATVIS}" CACHE BOOL "Disable natvis support (embedding asmjit.natvis in PDB)") -set(ASMJIT_NO_CUSTOM_FLAGS "${ASMJIT_NO_CUSTOM_FLAGS}" CACHE BOOL "Disable extra compilation flags added by AsmJit to its targets") +if (NOT DEFINED ASMJIT_NO_TEXT) + set(ASMJIT_NO_TEXT FALSE) +endif() + +if (NOT DEFINED ASMJIT_NO_LOGGING) + set(ASMJIT_NO_LOGGING ${ASMJIT_NO_TEXT}) +endif() + +if (NOT DEFINED ASMJIT_NO_VALIDATION) + set(ASMJIT_NO_VALIDATION FALSE) +endif() + +if (NOT DEFINED ASMJIT_NO_INTROSPECTION) + set(ASMJIT_NO_INTROSPECTION FALSE) +endif() + +if (NOT DEFINED ASMJIT_NO_BUILDER) + set(ASMJIT_NO_BUILDER FALSE) +endif() + +if (NOT DEFINED ASMJIT_NO_COMPILER) + if (ASMJIT_NO_BUILDER OR ASMJIT_NO_INTROSPECTION) + set(ASMJIT_NO_COMPILER TRUE) + else() + set(ASMJIT_NO_COMPILER FALSE) + endif() +endif() + +# AsmJit - Configuration - CMake Introspection +# ============================================ + +set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'") +set(ASMJIT_TEST "${ASMJIT_TEST}" CACHE BOOL "Build 'asmjit' test applications") +set(ASMJIT_EMBED "${ASMJIT_EMBED}" CACHE BOOL "Embed 'asmjit' library (no targets)") +set(ASMJIT_STATIC "${ASMJIT_STATIC}" CACHE BOOL "Build 'asmjit' library as static") +set(ASMJIT_SANITIZE "${ASMJIT_SANITIZE}" CACHE STRING "Build with sanitizers: 'address', 'undefined', etc...") +set(ASMJIT_NO_NATVIS "${ASMJIT_NO_NATVIS}" CACHE BOOL "Disable natvis support (embedding asmjit.natvis in PDB)") +set(ASMJIT_NO_CUSTOM_FLAGS "${ASMJIT_NO_CUSTOM_FLAGS}" CACHE BOOL "Disable extra compilation flags added by AsmJit to its targets") + +set(ASMJIT_NO_X86 "${ASMJIT_NO_X86}" CACHE BOOL "Disable X86/X64 backend") +set(ASMJIT_NO_AARCH64 "${ASMJIT_NO_AARCH64}" CACHE BOOL "Disable AArch64 backend") +set(ASMJIT_NO_FOREIGN "${ASMJIT_NO_FOREIGN}" CACHE BOOL "Disable all foreign architectures (enables only a target architecture)") + +set(ASMJIT_NO_DEPRECATED "${ASMJIT_NO_DEPRECATED}" CACHE BOOL "Disable deprecated API at build time") +set(ASMJIT_NO_SHM_OPEN "${ASMJIT_NO_SHM_OPEN}" CACHE BOOL "Disable the use of shm_open() even on platforms where it's supported") +set(ASMJIT_NO_JIT "${ASMJIT_NO_JIT}" CACHE BOOL "Disable VirtMem, JitAllocator, and JitRuntime at build time") +set(ASMJIT_NO_TEXT "${ASMJIT_NO_TEXT}" CACHE BOOL "Disable textual representation of instructions, enums, cpu features, ...") +set(ASMJIT_NO_LOGGING "${ASMJIT_NO_LOGGING}" CACHE BOOL "Disable logging features at build time") +set(ASMJIT_NO_VALIDATION "${ASMJIT_NO_VALIDATION}" CACHE BOOL "Disable instruction validation API at build time") +set(ASMJIT_NO_INTROSPECTION "${ASMJIT_NO_INTROSPECTION}" CACHE BOOL "Disable instruction introspection API at build time") +set(ASMJIT_NO_BUILDER "${ASMJIT_NO_BUILDER}" CACHE BOOL "Disable Builder emitter at build time") +set(ASMJIT_NO_COMPILER "${ASMJIT_NO_COMPILER}" CACHE BOOL "Disable Compiler emitter at build time") # AsmJit - Project # ================ @@ -160,15 +216,11 @@ function(asmjit_add_target target target_type) target_link_libraries(${target} PRIVATE ${X_LIBRARIES}) # target_link_options was added in cmake v3.13, don't use it for now... - foreach(link_flag ${ASMJIT_SANITIZE_LFLAGS}) + foreach(link_flag ${ASMJIT_PRIVATE_LFLAGS}) set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${link_flag}") endforeach() - if (${CMAKE_VERSION} VERSION_LESS "3.8.0") - set_property(TARGET ${target} PROPERTY CXX_STANDARD 11) - else() - target_compile_features(${target} PUBLIC cxx_std_11) - endif() + target_compile_features(${target} PUBLIC cxx_std_11) set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS NO) set_property(TARGET ${target} PROPERTY CXX_VISIBILITY_PRESET hidden) target_compile_options(${target} PRIVATE ${X_CFLAGS} ${ASMJIT_SANITIZE_CFLAGS} $<$:${X_CFLAGS_DBG}> $<$>:${X_CFLAGS_REL}>) @@ -181,21 +233,11 @@ endfunction() # AsmJit - Compiler Support # ========================= -set(ASMJIT_INCLUDE_DIRS "${ASMJIT_DIR}/src") # Include directory is the same as source dir. -set(ASMJIT_DEPS "") # AsmJit dependencies (libraries) for the linker. -set(ASMJIT_LIBS "") # Dependencies of libs/apps that want to use AsmJit. -set(ASMJIT_CFLAGS "") # Public compiler flags. -set(ASMJIT_PRIVATE_CFLAGS "") # Private compiler flags independent of build type. -set(ASMJIT_PRIVATE_CFLAGS_DBG "") # Private compiler flags used by debug builds. -set(ASMJIT_PRIVATE_CFLAGS_REL "") # Private compiler flags used by release builds. -set(ASMJIT_SANITIZE_CFLAGS "") # Compiler flags required by currently enabled sanitizers. -set(ASMJIT_SANITIZE_LFLAGS "") # Linker flags required by currently enabled sanitizers. - # We will have to keep this most likely forever as some users may still be using it. set(ASMJIT_INCLUDE_DIR "${ASMJIT_INCLUDE_DIRS}") if (NOT ASMJIT_NO_CUSTOM_FLAGS) - if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") list(APPEND ASMJIT_PRIVATE_CFLAGS -MP # [+] Multi-Process Compilation. -GF # [+] Eliminate duplicate strings. @@ -217,9 +259,12 @@ if (NOT ASMJIT_NO_CUSTOM_FLAGS) list(APPEND ASMJIT_PRIVATE_CFLAGS -fno-math-errno) list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -O2) - asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS - -fno-threadsafe-statics - -fno-semantic-interposition) + # -fno-semantic-interposition is not available on apple - the compiler issues a warning, which is not detected. + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") + asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -fno-threadsafe-statics) + else() + asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -fno-threadsafe-statics -fno-semantic-interposition) + endif() # The following flags can save few bytes in the resulting binary. asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS_REL @@ -230,7 +275,7 @@ endif() # Support for sanitizers. if (ASMJIT_SANITIZE) - ASMJIT_detect_sanitizers(ASMJIT_SANITIZE_CFLAGS ${ASMJIT_SANITIZE}) + asmjit_detect_sanitizers(ASMJIT_SANITIZE_CFLAGS ${ASMJIT_SANITIZE}) if (ASMJIT_SANITIZE_CFLAGS) message("-- Enabling sanitizers: '${ASMJIT_SANITIZE_CFLAGS}'") @@ -238,7 +283,7 @@ if (ASMJIT_SANITIZE) set(ASMJIT_SANITIZE_LFLAGS ${ASMJIT_SANITIZE_CFLAGS}) # Don't omit frame pointer if sanitizers are enabled. - if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") list(APPEND ASMJIT_SANITIZE_CFLAGS -Oy-) else() list(APPEND ASMJIT_SANITIZE_CFLAGS -fno-omit-frame-pointer -g) @@ -249,13 +294,53 @@ if (ASMJIT_SANITIZE) endif() endif() -# Do not link to pthread on Android as it's part of C runtime. -if (NOT WIN32 AND NOT ANDROID) - list(APPEND ASMJIT_DEPS pthread) -endif() +if (WIN32) + # Dependency: nothing extra at the moment. +elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") + # Dependency: libc is the only required library on Android as it also provides libthread. + message("-- Dependency: adding libc (Android target detected)") + list(APPEND ASMJIT_DEPS c) +elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Haiku") + # Dependency: libroot is used by Haiku instead of libc, so link to libroot and libpthread. + message("-- Dependency: adding libroot and libpthread (Haiku target detected)") + list(APPEND ASMJIT_DEPS root pthread) +else() + # Dependency: libc is always required. + message("-- Dependency: adding libc (Linux, BSD, or other UNIX/POSIX environment)") + list(APPEND ASMJIT_DEPS c) + + # Dependency: pthread (required so AsmJit can use pthread_lock). + check_cxx_source_compiles(" + #include + int main() { + pthread_mutex_t m; + pthread_mutex_init(&m, nullptr); + return pthread_mutex_destroy(&m); + } + " ASMJIT_LIBC_HAS_LIBPTHREAD) + if (ASMJIT_LIBC_HAS_LIBPTHREAD) + message("-- Dependency: libpthread provided by libc (not linking to libpthread)") + else() + message("-- Dependency: libpthread not provided by libc, linking to libpthread") + list(APPEND ASMJIT_DEPS pthread) + endif() -if ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR "${CMAKE_SYSTEM_NAME}" MATCHES "NetBSD") - list(APPEND ASMJIT_DEPS rt) + # Dependency: shm_open (required so AsmJit can use shm_open on supported platforms). + if ("${CMAKE_SYSTEM_NAME}" MATCHES "^(Linux|NetBSD)$" AND NOT ASMJIT_NO_SHM_OPEN) + check_cxx_source_compiles(" + #include + int main() { + const char file_name[1] {}; + return shm_open(file_name, 0, 0); + } + " ASMJIT_LIBC_HAS_LIBRT) + if (ASMJIT_LIBC_HAS_LIBRT) + message("-- Dependency: shm_open provided by libc (not linking to librt)") + else() + message("-- Dependency: shm_open not provided by libc, linking to librt") + list(APPEND ASMJIT_DEPS rt) + endif() + endif() endif() set(ASMJIT_LIBS ${ASMJIT_DEPS}) @@ -271,21 +356,21 @@ else() set(ASMJIT_TARGET_TYPE "SHARED") endif() -foreach(build_option ASMJIT_STATIC +foreach(build_option # AsmJit build options. + ASMJIT_STATIC + ASMJIT_NO_DEPRECATED # AsmJit backends selection. ASMJIT_NO_X86 - ASMJIT_NO_AARCH32 ASMJIT_NO_AARCH64 ASMJIT_NO_FOREIGN # AsmJit features selection. - ASMJIT_NO_DEPRECATED ASMJIT_NO_JIT - ASMJIT_NO_LOGGING - ASMJIT_NO_BUILDER - ASMJIT_NO_COMPILER ASMJIT_NO_TEXT + ASMJIT_NO_LOGGING + ASMJIT_NO_INTROSPECTION ASMJIT_NO_VALIDATION - ASMJIT_NO_INTROSPECTION) + ASMJIT_NO_BUILDER + ASMJIT_NO_COMPILER) if (${build_option}) List(APPEND ASMJIT_CFLAGS "-D${build_option}") List(APPEND ASMJIT_PRIVATE_CFLAGS "-D${build_option}") @@ -296,7 +381,7 @@ endforeach() # ======================= if (WIN32) - if(CMAKE_LINKER MATCHES "link\\.exe" OR CMAKE_LINKER MATCHES "lld-link\\.exe") + if (CMAKE_LINKER MATCHES "link\\.exe" OR CMAKE_LINKER MATCHES "lld-link\\.exe") set(ASMJIT_LINKER_SUPPORTS_NATVIS TRUE) endif() endif() @@ -351,6 +436,8 @@ set(ASMJIT_SRC_LIST asmjit/core/globals.h asmjit/core/inst.cpp asmjit/core/inst.h + asmjit/core/instdb.cpp + asmjit/core/instdb_p.h asmjit/core/jitallocator.cpp asmjit/core/jitallocator.h asmjit/core/jitruntime.cpp @@ -362,6 +449,7 @@ set(ASMJIT_SRC_LIST asmjit/core/operand.h asmjit/core/osutils.cpp asmjit/core/osutils.h + asmjit/core/osutils_p.h asmjit/core/raassignment_p.h asmjit/core/rabuilders_p.h asmjit/core/radefs_p.h @@ -395,11 +483,13 @@ set(ASMJIT_SRC_LIST asmjit/core/zonevector.cpp asmjit/core/zonevector.h + asmjit/a64.h asmjit/arm.h asmjit/arm/armformatter.cpp asmjit/arm/armformatter_p.h asmjit/arm/armglobals.h asmjit/arm/armoperand.h + asmjit/arm/armutils.h asmjit/arm/a64archtraits_p.h asmjit/arm/a64assembler.cpp asmjit/arm/a64assembler.h @@ -423,7 +513,6 @@ set(ASMJIT_SRC_LIST asmjit/arm/a64operand.h asmjit/arm/a64rapass.cpp asmjit/arm/a64rapass_p.h - asmjit/arm/a64utils.h asmjit/x86.h asmjit/x86/x86archtraits_p.h @@ -468,9 +557,7 @@ foreach(src_file ${ASMJIT_SRC_LIST}) endif() endforeach() -if (NOT ${CMAKE_VERSION} VERSION_LESS "3.8.0") - source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC}) -endif() +source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC}) # AsmJit - Summary # ================ @@ -568,6 +655,7 @@ if (NOT ASMJIT_EMBED) CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) foreach(_target asmjit_test_emitters + asmjit_test_execute asmjit_test_x86_sections) asmjit_add_target(${_target} TEST SOURCES test/${_target}.cpp @@ -588,11 +676,29 @@ if (NOT ASMJIT_EMBED) if (NOT (ASMJIT_NO_BUILDER OR ASMJIT_NO_COMPILER)) # Vectorcall tests and XMM tests require at least SSE2 in 32-bit mode (in 64-bit mode it's implicit). - set(sse2_flags "") - if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") - asmjit_detect_cflags(sse2_flags "-arch:SSE2") - else() - asmjit_detect_cflags(sse2_flags "-msse2") + # Some compilers don't like passing -msse2 for 64-bit targets, and some compilers targeting non-x86 + # would pass "-msse2" compile flag check, but with a warning not detected by CMake. Thus, verify that + # our target is really 32-bit X86 and only use -msse2 or -arch:SSE2 flags when necessary. + set(ASMJIT_SSE2_CFLAGS "") + + check_cxx_source_compiles(" + #if defined(_M_IX86) || defined(__X86__) || defined(__i386__) + int target_is_32_bit_x86() { return 1; } + #else + // Compile error... + #endif + + int main() { + return target_is_32_bit_x86(); + } + " ASMJIT_TARGET_IS_32_BIT_X86) + + if (ASMJIT_TARGET_IS_32_BIT_X86) + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") + asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-arch:SSE2") + else() + asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-msse2") + endif() endif() asmjit_add_target(asmjit_test_compiler TEST SOURCES test/asmjit_test_compiler.cpp @@ -600,7 +706,7 @@ if (NOT ASMJIT_EMBED) test/asmjit_test_compiler_a64.cpp test/asmjit_test_compiler_x86.cpp LIBRARIES asmjit::asmjit - CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${sse2_flags} + CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_SSE2_CFLAGS} CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG} CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL}) endif() diff --git a/3rdparty/asmjit/CONTRIBUTING.md b/3rdparty/asmjit/CONTRIBUTING.md new file mode 100644 index 0000000000000..54f5047b223ab --- /dev/null +++ b/3rdparty/asmjit/CONTRIBUTING.md @@ -0,0 +1,102 @@ +## How to Contribute to AsmJit + +### Did you find a bug or something isn't working as expected? + + * Please use [Issues](https://github.com/asmjit/asmjit/issues) page to report bugs or create a [pull request](https://github.com/asmjit/asmjit/pulls) if you have already fixed it. + + * Make sure that when a bug is reported it provides as much information as possible to make it easy to either reproduce it locally or to at least guess where the problem could be. AsmJit is a low-level tool, which makes it very easy to emit code that would crash or not work as intended when executed. Always use AsmJit's [Logging](https://asmjit.com/doc/group__asmjit__logging.html) and [Error Handling](https://asmjit.com/doc/group__asmjit__error__handling.html) features first to analyze whether there is not a simple to catch bug in your own code. + + * Don't be afraid to ask for help if you don't know how to solve a particular problem or in case it's unclear how to do it. The community would help if the problem is well described and has a solution. In general we always try to at least improve the documentation in case it doesn't provide enough information and users must ask for help. + +### Asking questions + + * We prefer GitHub issues to be used for reporting bugs or feature requests, but it's still okay to ask questions there as well. However, please consider joining our [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) to ask questions; it has an active community that can quickly respond. + +### Suggesting feature requests + + * It's very likely that when using AsmJit you have found something that AsmJit doesn't provide, which would be handy to have as a built-in. The [Issues](https://github.com/asmjit/asmjit/issues) page can be used to submit feature requests, but please keep in mind that AsmJit is a relatively small project and not all requested features will be accepted, especially if they are non-trivial, time consuming to implement, or the scope of the feature doesn't match AsmJit goals. + + * If you have already implemented the feature you are suggesting, please open a [pull request](https://github.com/asmjit/asmjit/pulls). + + * Ports (requesting new AsmJit backends) can be reported as feature requests, but only by people that are willing to work on them as creating new ports takes a lot of time. + +### Suggesting a documentation enhancement + + * [AsmJit's documentation](https://asmjit.com/doc/index.html) is auto-generated from source code, so if you would like to improve it just open a [pull request](https://github.com/asmjit/asmjit/pulls) with your changes. The documentation uses [Doxygen](https://www.doxygen.nl/) as a front-end, so you can use `\ref` keyword to create links and other Doxygen keywords to enhance the documentation. + +### Suggesting a website content enhancement + + * [AsmJit's website](https://asmjit.com) is also generated, but not from public sources at the moment. If you did find an issue on the website you can either use contact information on the [support page](https://asmjit.com/support.html) or to discuss the change on our [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im). Alternatively, opening a regular issue is also okay. + + +## Coding Style & Consistency + + * If you decide to open a pull request, make sure that the code you submit uses the same convention as the rest of the code. We prefer keeping the code consistent. + + * [.editorconfig](./.editorconfig) should help with basic settings. + + * Initially, AsmJit coding style was based on Google C++ Style Guide, but it has diverged from it. + + * Include guards use `_H_INCLUDED` format. + + * `asmjit` namespace must be open by `ASMJIT_BEGIN_NAMESPACE` and closed by `ASMJIT_END_NAMESPACE` + + * `asmjit::xxx` (backend specific) nested namespace must be open by `ASMJIT_BEGIN_SUB_NAMESPACE(xxx)` and closed by `ASMJIT_END_SUB_NAMESPACE`. + + * Opening bracket is on the same line, like `struct Something {`, `if (condition) {`, etc... + + * The code uses a soft limit of 120 characters per line (including documentation), but it's not enforced and it's okay to use more when it makes sense (for example defining tables, etc...). + + * Since AsmJit doesn't use Exceptions nor RTTI the code cannot use containers provided by the C++ standard library. In general, we try to only use a bare minimum from the C++ standard library to make it viable to use AsmJit even in C code bases where JIT complier is implemented in C++ ([Erlang](https://www.erlang.org/) can be seen as a great example). + +## Testing + + * AsmJit uses a minimalist unit testing framework to write unit tests to avoid third-party dependencies. + + * At the moment tests are in the same file as the implementation and are only compiled when `ASMJIT_TEST` macro is defined. + + * Use `-DASMJIT_TEST=1` when invoking [CMake](https://cmake.org/) to compile AsmJit tests. + + * Unit tests are compiled to a single `asmjit_test_unit[.exe]` executable. + + * Other tests have their own executables based on what is tested. + + * Always add assembler tests when adding new instructions, see [asmjit_test_assembler_x64.cpp](./test/asmjit_test_assembler_x64.cpp) and [asmjit_test_assembler_a64.cpp](./test/asmjit_test_assembler_a64.cpp) for more details. + +## Pull Request Messages + + * If a change fixes a bug the message should should start with `[bug]`. + + * If a change fixes or enhances documentation it should start with `[doc]`. + + * If a change fixes or enhances our CI it should start with `[ci]`. + + * If a change breaks ABI it must start with `[abi]`. + + * Otherwise there is no suggested prefix. + +## ABI Changes + + * ABI changes happen, but they are usually accumulated and committed within a short time window to not break it often. In general we prefer to break ABI once a year, or once 6 months if there is something that has a high priority. There are no hard rules though. + + * AsmJit uses an `inline namespace`, which should make it impossible to link to AsmJit library that is ABI incompatible. When ABI break happens both AsmJit version and ABI namespace are changed, see [asmjit/core/api-config.h](./src/asmjit/core/api-config.h) for more details. + + * What is an ABI break? + + * Modifying a public struct/class in a way that its functionality is altered and/or its size is changed + + * Adding/removing virtual functions to/from classes, respectively + + * Changing a signature of a public function or a class member function (for example adding a parameter). + + * Changing the value of an enum or global constant (for example instructions are now sorted by name, so adding a new instruction breaks ABI) + + * Possibly more, but these were the most common... + + * What is not ABI break? + + * Extending the functionality by using reserved members of a struct/class + + * Adding new API including new structs and classes + + * Changing anything that is internal and that doesn't leak to public headers diff --git a/3rdparty/asmjit/LICENSE.md b/3rdparty/asmjit/LICENSE.md index 020a569dbde8d..d87dbf9bca28e 100644 --- a/3rdparty/asmjit/LICENSE.md +++ b/3rdparty/asmjit/LICENSE.md @@ -1,4 +1,4 @@ -Copyright (c) 2008-2020 The AsmJit Authors +Copyright (c) 2008-2024 The AsmJit Authors This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/3rdparty/asmjit/README.md b/3rdparty/asmjit/README.md index c683989c6562c..ee0c7200ed3a1 100644 --- a/3rdparty/asmjit/README.md +++ b/3rdparty/asmjit/README.md @@ -5,7 +5,7 @@ AsmJit is a lightweight library for machine code generation written in C++ langu * [Official Home Page (asmjit.com)](https://asmjit.com) * [Official Repository (asmjit/asmjit)](https://github.com/asmjit/asmjit) - * [Public Chat Channel](https://gitter.im/asmjit/asmjit) + * [Public Chat Channel](https://app.gitter.im/#/room/#asmjit:gitter.im) * [Zlib License](./LICENSE.md) See [asmjit.com](https://asmjit.com) page for more details, examples, and documentation. @@ -16,41 +16,42 @@ Documentation * [Documentation Index](https://asmjit.com/doc/index.html) * [Build Instructions](https://asmjit.com/doc/group__asmjit__build.html) +Contributing +------------ + + * See [CONTRIBUTING](./CONTRIBUTING.md) page for more details + Breaking Changes ---------------- Breaking the API is sometimes inevitable, what to do? - * See [Breaking Changes Guide](https://asmjit.com/doc/group__asmjit__breaking__changes.html), which is now part of AsmJit documentation. + * See [Breaking Changes Guide](https://asmjit.com/doc/group__asmjit__breaking__changes.html), which is now part of AsmJit documentation * See asmjit tests, they always compile and provide implementation of many use-cases: - * [asmjit_test_emitters.cpp](./test/asmjit_test_emitters.cpp) - Tests that demonstrate the purpose of emitters. - * [asmjit_test_assembler_x86.cpp](./test/asmjit_test_assembler_x86.cpp) - Tests targeting AsmJit's Assembler (x86/x64). - * [asmjit_test_compiler_x86.cpp](./test/asmjit_test_compiler_x86.cpp) - Tests targeting AsmJit's Compiler (x86/x64). - * [asmjit_test_instinfo.cpp](./test/asmjit_test_instinfo.cpp) - Tests that query instruction information. + * [asmjit_test_emitters.cpp](./test/asmjit_test_emitters.cpp) - Tests that demonstrate the purpose of emitters + * [asmjit_test_assembler_x86.cpp](./test/asmjit_test_assembler_x86.cpp) - Tests targeting AsmJit's Assembler (x86/x64) + * [asmjit_test_compiler_x86.cpp](./test/asmjit_test_compiler_x86.cpp) - Tests targeting AsmJit's Compiler (x86/x64) + * [asmjit_test_instinfo.cpp](./test/asmjit_test_instinfo.cpp) - Tests that query instruction information * [asmjit_test_x86_sections.cpp](./test/asmjit_test_x86_sections.cpp) - Multiple sections test. - * Visit our [Official Chat](https://gitter.im/asmjit/asmjit) if you need a quick help. + * Visit our [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) if you need a quick help Project Organization -------------------- - * **`/`** - Project root. - * **src** - Source code. - * **asmjit** - Source code and headers (always point include path in here). - * **core** - Core API, backend independent except relocations. - * **arm** - ARM specific API, used only by ARM and AArch64 backends. - * **x86** - X86 specific API, used only by X86 and X64 backends. - * **test** - Unit and integration tests (don't embed in your project). - * **tools** - Tools used for configuring, documenting, and generating files. - -TODO ----- - - * [ ] Core: - * [ ] Add support for user external buffers in CodeBuffer / CodeHolder. - * [ ] Ports: - * [ ] 32-bit ARM/Thumb port. - * [ ] 64-bit ARM (AArch64) port. - * [ ] RISC-V port. + * **`/`** - Project root + * **src** - Source code + * **asmjit** - Source code and headers (always point include path in here) + * **core** - Core API, backend independent except relocations + * **arm** - ARM specific API, used only by ARM and AArch64 backends + * **x86** - X86 specific API, used only by X86 and X64 backends + * **test** - Unit and integration tests (don't embed in your project) + * **tools** - Tools used for configuring, documenting, and generating files + +Ports +----- + + * [ ] 32-bit ARM/Thumb port (work in progress) + * [ ] RISC-V port (not in progress, help welcome) Support ------- diff --git a/3rdparty/asmjit/src/asmjit/a64.h b/3rdparty/asmjit/src/asmjit/a64.h index ea4d304f058b0..e849eb3a8ca30 100644 --- a/3rdparty/asmjit/src/asmjit/a64.h +++ b/3rdparty/asmjit/src/asmjit/a64.h @@ -18,25 +18,24 @@ //! ### Supported Instructions //! //! - Emitters: -//! - \ref a64::EmitterExplicitT - Provides all instructions that use explicit -//! operands, provides also utility functions. The member functions provided -//! are part of all ARM/AArch64 emitters. +//! - \ref a64::EmitterExplicitT - Provides all instructions that use explicit operands, provides also utility +//! functions. The member functions provided are part of all AArch64 emitters. //! //! - Instruction representation: //! - \ref a64::Inst::Id - instruction identifiers. //! //! ### Register Operands //! -//! - \ref arm::Reg - Base class for any AArch32/AArch64 register. -//! - \ref arm::Gp - General purpose register: -//! - \ref arm::GpW - 32-bit register. -//! - \ref arm::GpX - 64-bit register. -//! - \ref arm::Vec - Vector (SIMD) register: -//! - \ref arm::VecB - 8-bit SIMD register (AArch64 only). -//! - \ref arm::VecH - 16-bit SIMD register (AArch64 only). -//! - \ref arm::VecS - 32-bit SIMD register. -//! - \ref arm::VecD - 64-bit SIMD register. -//! - \ref arm::VecV - 128-bit SIMD register. +//! - \ref arm::Reg - Base class of all AArch32/AArch64 registers. +//! - \ref a64::Gp - General purpose register (AArch64): +//! - \ref a64::GpW - 32-bit general purpose register (AArch64). +//! - \ref a64::GpX - 64-bit general purpose register (AArch64). +//! - \ref a64::Vec - Vector (SIMD) register: +//! - \ref a64::VecB - 8-bit SIMD register. +//! - \ref a64::VecH - 16-bit SIMD register. +//! - \ref a64::VecS - 32-bit SIMD register. +//! - \ref a64::VecD - 64-bit SIMD register. +//! - \ref a64::VecV - 128-bit SIMD register. //! //! ### Memory Operands //! @@ -46,7 +45,7 @@ //! ### Other //! //! - \ref arm::Shift - Shift operation and value. -//! - \ref a64::Utils - Utilities that can help during code generation for AArch64. +//! - \ref arm::Utils - Utilities that can help during code generation for AArch32 and AArch64. #include "./arm.h" #include "./arm/a64assembler.h" @@ -56,7 +55,6 @@ #include "./arm/a64globals.h" #include "./arm/a64instdb.h" #include "./arm/a64operand.h" -#include "./arm/a64utils.h" #endif // ASMJIT_A64_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/arm.h b/3rdparty/asmjit/src/asmjit/arm.h index 57ffa815b8c02..e4a3e3d3ac552 100644 --- a/3rdparty/asmjit/src/asmjit/arm.h +++ b/3rdparty/asmjit/src/asmjit/arm.h @@ -11,11 +11,19 @@ //! ### Namespaces //! //! - \ref arm - arm namespace provides common functionality for both AArch32 and AArch64 backends. +//! - \ref a32 - a32 namespace provides support for AArch32 architecture. In addition it includes +//! \ref arm namespace, so you can only use a single namespace when targeting AArch32 architecture. //! - \ref a64 - a64 namespace provides support for AArch64 architecture. In addition it includes //! \ref arm namespace, so you can only use a single namespace when targeting AArch64 architecture. //! //! ### Emitters //! +//! - AArch32 +//! - \ref a32::Assembler - AArch32 assembler (must read, provides examples). +//! - \ref a32::Builder - AArch32 builder. +//! - \ref a32::Compiler - AArch32 compiler. +//! - \ref a32::Emitter - AArch32 emitter (abstract). +//! //! - AArch64 //! - \ref a64::Assembler - AArch64 assembler (must read, provides examples). //! - \ref a64::Builder - AArch64 builder. @@ -24,6 +32,13 @@ //! //! ### Supported Instructions //! +//! - AArch32: +//! - Emitters: +//! - \ref a32::EmitterExplicitT - Provides all instructions that use explicit operands, provides also +//! utility functions. The member functions provided are part of all AArch32 emitters. +//! - Instruction representation: +//! - \ref a32::Inst::Id - instruction identifiers. +//! //! - AArch64: //! - Emitters: //! - \ref a64::EmitterExplicitT - Provides all instructions that use explicit operands, provides also @@ -33,16 +48,22 @@ //! //! ### Register Operands //! -//! - \ref arm::Reg - Base class for any AArch32/AArch64 register. -//! - \ref arm::Gp - General purpose register: -//! - \ref arm::GpW - 32-bit register. -//! - \ref arm::GpX - 64-bit register. -//! - \ref arm::Vec - Vector (SIMD) register: -//! - \ref arm::VecB - 8-bit SIMD register (AArch64 only). -//! - \ref arm::VecH - 16-bit SIMD register (AArch64 only). -//! - \ref arm::VecS - 32-bit SIMD register. -//! - \ref arm::VecD - 64-bit SIMD register. -//! - \ref arm::VecV - 128-bit SIMD register. +//! - \ref arm::Reg - Base class of all AArch32/AArch64 registers. +//! - \ref a32::Gp - 32-bit general purpose register used by AArch32: +//! - \ref a64::Gp - 32-bit or 64-bit general purpose register used by AArch64: +//! - \ref a64::GpW - 32-bit register (AArch64). +//! - \ref a64::GpX - 64-bit register (AArch64). +//! - \ref arm::BaseVec - Base vector (SIMD) register. +//! - \ref a32::Vec - Vector (SIMD) register (AArch32): +//! - \ref a32::VecS - 32-bit SIMD register (AArch32). +//! - \ref a32::VecD - 64-bit SIMD register (AArch32). +//! - \ref a32::VecV - 128-bit SIMD register (AArch32). +//! - \ref a64::Vec - Vector (SIMD) register (AArch64): +//! - \ref a64::VecB - 8-bit SIMD register (AArch64). +//! - \ref a64::VecH - 16-bit SIMD register (AArch64). +//! - \ref a64::VecS - 32-bit SIMD register (AArch64). +//! - \ref a64::VecD - 64-bit SIMD register (AArch64). +//! - \ref a64::VecV - 128-bit SIMD register (AArch64). //! //! ### Memory Operands //! @@ -53,10 +74,11 @@ //! //! - \ref arm::Shift - Shift operation and value (both AArch32 and AArch64). //! - \ref arm::DataType - Data type that is part of an instruction in AArch32 mode. -//! - \ref a64::Utils - Utilities that can help during code generation for AArch64. +//! - \ref arm::Utils - Utilities that can help during code generation for AArch32 and AArch64. #include "./core.h" #include "./arm/armglobals.h" #include "./arm/armoperand.h" +#include "./arm/armutils.h" #endif // ASMJIT_ARM_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h b/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h index 87559c71d5a38..4b5bde68a9ed0 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h @@ -9,6 +9,7 @@ #include "../core/archtraits.h" #include "../core/misc_p.h" #include "../core/type.h" +#include "../arm/a64globals.h" #include "../arm/a64operand.h" ASMJIT_BEGIN_SUB_NAMESPACE(a64) @@ -24,7 +25,7 @@ static const constexpr ArchTraits a64ArchTraits = { // Reserved. { 0, 0, 0 }, - // HW stack alignment (AArch64 requires stack aligned to 64 bytes). + // HW stack alignment (AArch64 requires stack aligned to 16 bytes at HW level). 16, // Min/max stack offset - byte addressing is the worst, VecQ addressing the best. @@ -39,12 +40,12 @@ static const constexpr ArchTraits a64ArchTraits = { }}, // RegInfo. - #define V(index) OperandSignature{arm::RegTraits::kSignature} + #define V(index) OperandSignature{RegTraits::kSignature} {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }}, #undef V // RegTypeToTypeId. - #define V(index) TypeId(arm::RegTraits::kTypeId) + #define V(index) TypeId(RegTraits::kTypeId) {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }}, #undef V diff --git a/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp b/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp index 485f05f491f51..c926766af6fd4 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp @@ -14,19 +14,23 @@ #include "../core/misc_p.h" #include "../core/support.h" #include "../arm/armformatter_p.h" +#include "../arm/armutils.h" #include "../arm/a64assembler.h" #include "../arm/a64emithelper_p.h" #include "../arm/a64instdb_p.h" -#include "../arm/a64utils.h" ASMJIT_BEGIN_SUB_NAMESPACE(a64) +// a64::Assembler - Utils +// ====================== + +static ASMJIT_FORCE_INLINE constexpr uint32_t diff(RegType a, RegType b) noexcept { return uint32_t(a) - uint32_t(b); } +static ASMJIT_FORCE_INLINE constexpr uint32_t diff(VecElementType elementType, VecElementType baseType) noexcept { return uint32_t(elementType) - uint32_t(baseType); } + // a64::Assembler - Cond // ===================== -static inline uint32_t condCodeToOpcodeCond(uint32_t cond) noexcept { - return (uint32_t(cond) - 2u) & 0xFu; -} +static inline uint32_t condCodeToOpcodeCond(uint32_t cond) noexcept { return (uint32_t(cond) - 2u) & 0xFu; } // a64::Assembler - Bits // ===================== @@ -49,10 +53,6 @@ static constexpr uint32_t kWX = InstDB::kWX; static const uint8_t armShiftOpToLdStOptMap[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) }; #undef VALUE -static inline constexpr uint32_t diff(RegType a, RegType b) noexcept { - return uint32_t(a) - uint32_t(b); -} - // asmjit::a64::Assembler - SizeOp // =============================== @@ -118,25 +118,25 @@ struct SizeOpTable { }; #define VALUE_BIN(x) { \ - x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k00 : \ - x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k00Q : \ - x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00 : \ - x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00Q : SizeOp::kInvalid \ + x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00 : \ + x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00Q : \ + x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00 : \ + x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00Q : SizeOp::kInvalid \ } #define VALUE_ANY(x) { \ - x == (((uint32_t(RegType::kARM_VecB) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k00S : \ - x == (((uint32_t(RegType::kARM_VecH) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k01S : \ - x == (((uint32_t(RegType::kARM_VecS) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k10S : \ - x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeNone)) ? SizeOp::k11S : \ - x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00 : \ - x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeB )) ? SizeOp::k00Q : \ - x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeH )) ? SizeOp::k01 : \ - x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeH )) ? SizeOp::k01Q : \ - x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeS )) ? SizeOp::k10 : \ - x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeS )) ? SizeOp::k10Q : \ - x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeD )) ? SizeOp::k11S : \ - x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | (Vec::kElementTypeD )) ? SizeOp::k11Q : SizeOp::kInvalid \ + x == (((uint32_t(RegType::kARM_VecB) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00S : \ + x == (((uint32_t(RegType::kARM_VecH) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k01S : \ + x == (((uint32_t(RegType::kARM_VecS) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k10S : \ + x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k11S : \ + x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00 : \ + x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00Q : \ + x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kH )) ? SizeOp::k01 : \ + x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kH )) ? SizeOp::k01Q : \ + x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kS )) ? SizeOp::k10 : \ + x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kS )) ? SizeOp::k10Q : \ + x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kD )) ? SizeOp::k11S : \ + x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kD )) ? SizeOp::k11Q : SizeOp::kInvalid \ } static const SizeOpTable sizeOpTable[SizeOpTable::kCount] = { @@ -254,16 +254,16 @@ static const Operand_& significantSimdOp(const Operand_& o0, const Operand_& o1, return !(instFlags & InstDB::kInstFlagLong) ? o0 : o1; } -static inline SizeOp armElementTypeToSizeOp(uint32_t vecOpType, RegType regType, uint32_t elementType) noexcept { +static inline SizeOp armElementTypeToSizeOp(uint32_t vecOpType, RegType regType, VecElementType elementType) noexcept { // Instruction data or Assembler is wrong if this triggers an assertion failure. ASMJIT_ASSERT(vecOpType < InstDB::kVO_Count); // ElementType uses 3 bits in the operand signature, it should never overflow. - ASMJIT_ASSERT(elementType <= 0x7u); + ASMJIT_ASSERT(uint32_t(elementType) <= 0x7u); const SizeOpMap& map = sizeOpMap[vecOpType]; const SizeOpTable& table = sizeOpTable[map.tableId]; - size_t index = (Support::min(diff(regType, RegType::kARM_VecB), diff(RegType::kARM_VecV, RegType::kARM_VecB) + 1) << 3) | elementType; + size_t index = (Support::min(diff(regType, RegType::kARM_VecB), diff(RegType::kARM_VecV, RegType::kARM_VecB) + 1) << 3) | uint32_t(elementType); SizeOp op = table.array[index]; SizeOp modifiedOp { uint8_t(op.value & map.sizeOpMask) }; @@ -398,14 +398,6 @@ static inline bool encodeLMH(uint32_t sizeField, uint32_t elementIndex, LMHImm* return elementIndex <= maxElementIndex; } -// [.......A|B.......|.......C|D.......|.......E|F.......|.......G|H.......] -static inline uint32_t encodeImm64ByteMaskToImm8(uint64_t imm) noexcept { - return uint32_t(((imm >> (7 - 0)) & 0b00000011) | // [.......G|H.......] - ((imm >> (23 - 2)) & 0b00001100) | // [.......E|F.......] - ((imm >> (39 - 4)) & 0b00110000) | // [.......C|D.......] - ((imm >> (55 - 6)) & 0b11000000)); // [.......A|B.......] -} - // a64::Assembler - Opcode // ======================= @@ -475,7 +467,7 @@ static inline bool matchSignature(const Operand_& o0, const Operand_& o1, const } static inline bool matchSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, uint32_t instFlags) noexcept { - return matchSignature(o0, o1, instFlags) && o1.signature() == o2.signature() && o2.signature() == o3.signature();; + return matchSignature(o0, o1, instFlags) && o1.signature() == o2.signature() && o2.signature() == o3.signature(); } // Memory must be either: @@ -545,7 +537,7 @@ static inline bool pickFpOpcode(const Vec& reg, uint32_t sOp, uint32_t sHf, uint else { // Vector operation [HSD]. uint32_t q = diff(reg.type(), RegType::kARM_VecD); - uint32_t sz = reg.elementType() - Vec::kElementTypeH; + uint32_t sz = diff(reg.elementType(), VecElementType::kH); if (q > 1u || sz > 2u || !Support::bitTest(szBits[vHf].sizeMask, sz)) return false; @@ -698,25 +690,25 @@ static const Support::Array commonHiRegIdOfType = {{ #undef V static inline bool checkValidRegs(const Operand_& o0) noexcept { - return ((o0.id() < 31) | (o0.id() == commonHiRegIdOfType[o0.as().type()])); + return bool(unsigned(o0.id() < 31) | unsigned(o0.id() == commonHiRegIdOfType[o0.as().type()])); } static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1) noexcept { - return ((o0.id() < 31) | (o0.id() == commonHiRegIdOfType[o0.as().type()])) & - ((o1.id() < 31) | (o1.id() == commonHiRegIdOfType[o1.as().type()])) ; + return bool((unsigned(o0.id() < 31) | unsigned(o0.id() == commonHiRegIdOfType[o0.as().type()])) & + (unsigned(o1.id() < 31) | unsigned(o1.id() == commonHiRegIdOfType[o1.as().type()]))); } static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept { - return ((o0.id() < 31) | (o0.id() == commonHiRegIdOfType[o0.as().type()])) & - ((o1.id() < 31) | (o1.id() == commonHiRegIdOfType[o1.as().type()])) & - ((o2.id() < 31) | (o2.id() == commonHiRegIdOfType[o2.as().type()])) ; + return bool((unsigned(o0.id() < 31) | unsigned(o0.id() == commonHiRegIdOfType[o0.as().type()])) & + (unsigned(o1.id() < 31) | unsigned(o1.id() == commonHiRegIdOfType[o1.as().type()])) & + (unsigned(o2.id() < 31) | unsigned(o2.id() == commonHiRegIdOfType[o2.as().type()]))); } static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept { - return ((o0.id() < 31) | (o0.id() == commonHiRegIdOfType[o0.as().type()])) & - ((o1.id() < 31) | (o1.id() == commonHiRegIdOfType[o1.as().type()])) & - ((o2.id() < 31) | (o2.id() == commonHiRegIdOfType[o2.as().type()])) & - ((o3.id() < 31) | (o3.id() == commonHiRegIdOfType[o3.as().type()])) ; + return bool((unsigned(o0.id() < 31) | unsigned(o0.id() == commonHiRegIdOfType[o0.as().type()])) & + (unsigned(o1.id() < 31) | unsigned(o1.id() == commonHiRegIdOfType[o1.as().type()])) & + (unsigned(o2.id() < 31) | unsigned(o2.id() == commonHiRegIdOfType[o2.as().type()])) & + (unsigned(o3.id() < 31) | unsigned(o3.id() == commonHiRegIdOfType[o3.as().type()]))); } // a64::Assembler - Construction & Destruction @@ -724,8 +716,6 @@ static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1, const Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() { _archMask = uint64_t(1) << uint32_t(Arch::kAArch64); - assignEmitterFuncs(this); - if (code) code->attach(this); } @@ -811,7 +801,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co Operand_ opArray[Globals::kMaxOpCount]; EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt); - err = _funcs.validate(arch(), BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone); + err = _funcs.validate(BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone); if (ASMJIT_UNLIKELY(err)) goto Failed; } @@ -2249,6 +2239,86 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co break; } + // ------------------------------------------------------------------------ + // [Base - Prefetch] + // ------------------------------------------------------------------------ + + case InstDB::kEncodingBasePrfm: { + const InstDB::EncodingData::BasePrfm& opData = InstDB::EncodingData::basePrfm[encodingIndex]; + + if (isign4 == ENC_OPS2(Imm, Mem)) { + const Mem& m = o1.as(); + rmRel = &m; + + uint32_t immShift = 3u; + + if (o0.as().valueAs() > 0x1Fu) + goto InvalidImmediate; + + if (!armCheckMemBaseIndexRel(m)) + goto InvalidAddress; + + int64_t offset = m.offset(); + uint32_t prfop = o0.as().valueAs(); + + if (m.hasBaseReg()) { + // [Base {Offset | Index}] + if (m.hasIndex()) { + uint32_t opt = armShiftOpToLdStOptMap[size_t(m.shiftOp())]; + if (opt == 0xFF) + goto InvalidAddress; + + uint32_t shift = m.shift(); + uint32_t s = shift != 0; + + if (s && shift != immShift) + goto InvalidAddressScale; + + opcode.reset(uint32_t(opData.registerOp) << 21); + opcode.addImm(opt, 13); + opcode.addImm(s, 12); + opcode |= B(11); + opcode.addImm(prfop, 0); + goto EmitOp_MemBaseIndex_Rn5_Rm16; + } + + if (!Support::isInt32(offset)) + goto InvalidDisplacement; + + int32_t offset32 = int32_t(offset); + + if (m.isPreOrPost()) + goto InvalidAddress; + + uint32_t imm12 = uint32_t(offset32) >> immShift; + + if (Support::isUInt12(imm12) && (imm12 << immShift) == uint32_t(offset32)) { + opcode.reset(uint32_t(opData.sOffsetOp) << 22); + opcode.addImm(imm12, 10); + opcode.addImm(prfop, 0); + goto EmitOp_MemBase_Rn5; + } + + if (Support::isInt9(offset32)) { + opcode.reset(uint32_t(opData.uOffsetOp) << 21); + opcode.addImm(uint32_t(offset32) & 0x1FFu, 12); + opcode.addImm(prfop, 0); + goto EmitOp_MemBase_Rn5; + } + + goto InvalidAddress; + } + else { + opcode.reset(uint32_t(opData.literalOp) << 24); + opcode.addImm(prfop, 0); + offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2); + goto EmitOp_Rel; + } + } + + break; + } + // ------------------------------------------------------------------------ // [Base - Load / Store] // ------------------------------------------------------------------------ @@ -2280,7 +2350,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (m.hasBaseReg()) { // [Base {Offset | Index}] if (m.hasIndex()) { - uint32_t opt = armShiftOpToLdStOptMap[m.predicate()]; + uint32_t opt = armShiftOpToLdStOptMap[size_t(m.shiftOp())]; if (opt == 0xFF) goto InvalidAddress; @@ -2698,7 +2768,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co // hD, vS.{4|8}h (16-bit) // sD, vS.4s (32-bit) uint32_t sz = diff(o0.as().type(), RegType::kARM_VecH); - uint32_t elementSz = o1.as().elementType() - Vec::kElementTypeH; + uint32_t elementSz = diff(o1.as().elementType(), VecElementType::kH); // Size greater than 1 means 64-bit elements, not supported. if ((sz | elementSz) > 1 || sz != elementSz) @@ -2820,7 +2890,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (q > 1) goto InvalidInstruction; - uint32_t sz = o0.as().elementType() - Vec::kElementTypeB; + uint32_t sz = diff(o0.as().elementType(), VecElementType::kB); if (sz == 0 || sz > 3) goto InvalidInstruction; @@ -2912,7 +2982,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (q > 1) goto InvalidInstruction; - uint32_t sz = o0.as().elementType() - Vec::kElementTypeB; + uint32_t sz = diff(o0.as().elementType(), VecElementType::kB); if (sz == 0 || sz > 3) goto InvalidInstruction; @@ -3094,11 +3164,11 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (uint32_t(opcode.hasQ()) != q) goto InvalidInstruction; - if (rL.isVecS4() && rN.elementType() == Vec::kElementTypeH && !opData.isCvtxn()) { + if (rL.isVecS4() && rN.elementType() == VecElementType::kH && !opData.isCvtxn()) { goto EmitOp_Rd0_Rn5; } - if (rL.isVecD2() && rN.elementType() == Vec::kElementTypeS) { + if (rL.isVecD2() && rN.elementType() == VecElementType::kS) { opcode |= B(22); goto EmitOp_Rd0_Rn5; } @@ -3209,8 +3279,8 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co } if (uint32_t(o0.as().type()) != uint32_t(o1.as().type()) + qIsOptional || - o0.as().elementType() != opData.tA || - o1.as().elementType() != opData.tB) + uint32_t(o0.as().elementType()) != opData.tA || + uint32_t(o1.as().elementType()) != opData.tB) goto InvalidInstruction; if (!o2.as().hasElementIndex()) { @@ -3222,7 +3292,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co goto EmitOp_Rd0_Rn5_Rm16; } else { - if (o2.as().elementType() != opData.tElement) + if (uint32_t(o2.as().elementType()) != opData.tElement) goto InvalidInstruction; if (o2.as().id() > 15) @@ -3372,7 +3442,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co } else { uint32_t q = diff(o0.as().type(), RegType::kARM_VecD); - uint32_t sz = o0.as().elementType() - Vec::kElementTypeH; + uint32_t sz = diff(o0.as().elementType(), VecElementType::kH); if (q > 1 || sz > 2) goto InvalidInstruction; @@ -3426,7 +3496,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (q > 1) goto InvalidInstruction; - uint32_t sz = o0.as().elementType() - Vec::kElementTypeH; + uint32_t sz = diff(o0.as().elementType(), VecElementType::kH); if (sz > 2) goto InvalidInstruction; @@ -3450,7 +3520,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (isign4 == ENC_OPS2(Reg, Reg)) { // The first destination operand is scalar, which matches element-type of source vectors. uint32_t L = (instFlags & InstDB::kInstFlagLong) != 0; - if (diff(o0.as().type(), RegType::kARM_VecB) != o1.as().elementType() - Vec::kElementTypeB + L) + if (diff(o0.as().type(), RegType::kARM_VecB) != diff(o1.as().elementType(), VecElementType::kB) + L) goto InvalidInstruction; SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as().type(), o1.as().elementType()); @@ -3550,7 +3620,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (!sizeOp.isValid()) goto InvalidInstruction; - if (!checkSignature(o0, o1) || !o0.as().isVecV() || o0.as().elementType() != o2.as().elementType() + 1) + if (!checkSignature(o0, o1) || !o0.as().isVecV() || uint32_t(o0.as().elementType()) != uint32_t(o2.as().elementType()) + 1u) goto InvalidInstruction; opcode.reset(opData.opcode()); @@ -3753,7 +3823,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co goto InvalidImmediate; } else if (imm) { - shift = Support::ctz(imm) & 0x7u; + shift = Support::ctz(imm) & ~0x7u; imm >>= shift; if (imm > 0xFFu || shift > maxShift) @@ -3835,9 +3905,9 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (o0.as().type() != o1.as().type() || o1.as().type() != o2.as().type()) goto InvalidInstruction; - if (o0.as().elementType() != opData.tA || - o1.as().elementType() != opData.tB || - o2.as().elementType() != opData.tB) + if (uint32_t(o0.as().elementType()) != opData.tA || + uint32_t(o1.as().elementType()) != opData.tB || + uint32_t(o2.as().elementType()) != opData.tB) goto InvalidInstruction; opcode.reset(uint32_t(opData.vectorOp) << 10); @@ -3851,9 +3921,9 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (o0.as().type() != o1.as().type() || !o2.as().isVecV()) goto InvalidInstruction; - if (o0.as().elementType() != opData.tA || - o1.as().elementType() != opData.tB || - o2.as().elementType() != opData.tElement) + if (uint32_t(o0.as().elementType()) != opData.tA || + uint32_t(o1.as().elementType()) != opData.tB || + uint32_t(o2.as().elementType()) != opData.tElement) goto InvalidInstruction; uint32_t elementIndex = o2.as().elementIndex(); @@ -3879,13 +3949,13 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co case InstDB::kEncodingSimdDup: SimdDup: { if (isign4 == ENC_OPS2(Reg, Reg)) { // Truth table of valid encodings of `Q:1|ElementType:3` - uint32_t kValidEncodings = B(Vec::kElementTypeB + 0) | - B(Vec::kElementTypeH + 0) | - B(Vec::kElementTypeS + 0) | - B(Vec::kElementTypeB + 8) | - B(Vec::kElementTypeH + 8) | - B(Vec::kElementTypeS + 8) | - B(Vec::kElementTypeD + 8) ; + uint32_t kValidEncodings = B(uint32_t(VecElementType::kB) + 0) | + B(uint32_t(VecElementType::kH) + 0) | + B(uint32_t(VecElementType::kS) + 0) | + B(uint32_t(VecElementType::kB) + 8) | + B(uint32_t(VecElementType::kH) + 8) | + B(uint32_t(VecElementType::kS) + 8) | + B(uint32_t(VecElementType::kD) + 8) ; uint32_t q = diff(o0.as().type(), RegType::kARM_VecD); @@ -3894,7 +3964,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co // // NOTE: This is only scalar for `dup d, x` case, otherwise the value // would be duplicated across all vector elements (1, 2, 4, 8, or 16). - uint32_t elementType = o0.as().elementType(); + uint32_t elementType = uint32_t(o0.as().elementType()); if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType)) goto InvalidInstruction; @@ -3915,7 +3985,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co // DUP - Vec (scalar) <- Vec[N]. uint32_t lsbIndex = diff(o0.as().type(), RegType::kARM_VecB); - if (lsbIndex != o1.as().elementType() - Vec::kElementTypeB || lsbIndex > 3) + if (lsbIndex != diff(o1.as().elementType(), VecElementType::kB) || lsbIndex > 3) goto InvalidInstruction; uint32_t imm5 = ((dstIndex << 1) | 1u) << lsbIndex; @@ -3928,7 +3998,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co } else { // DUP - Vec (all) <- Vec[N]. - uint32_t elementType = o0.as().elementType(); + uint32_t elementType = uint32_t(o0.as().elementType()); if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType)) goto InvalidInstruction; @@ -3953,7 +4023,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (!o0.as().hasElementIndex()) goto InvalidInstruction; - uint32_t elementType = o0.as().elementType(); + uint32_t elementType = uint32_t(o0.as().elementType()); uint32_t dstIndex = o0.as().elementIndex(); uint32_t lsbIndex = elementType - 1u; @@ -4056,7 +4126,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co goto InvalidImmediate; if (Utils::isByteMaskImm8(imm64)) { - imm8 = encodeImm64ByteMaskToImm8(imm64); + imm8 = Utils::encodeImm64ByteMaskToImm8(imm64); } else { // Change from D to S and from 64-bit imm to 32-bit imm if this @@ -4122,7 +4192,6 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (inverted) { imm8 = ~imm8 & 0xFFu; - inverted = 0; } cmode = B(3) | B(2) | B(1); @@ -4155,7 +4224,6 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co case 3: if (inverted) { imm8 = ~imm8 & 0xFFu; - inverted = 0; } op = 1; @@ -4443,7 +4511,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co if (m.hasBaseReg()) { // [Base {Offset | Index}] if (m.hasIndex()) { - uint32_t opt = armShiftOpToLdStOptMap[m.predicate()]; + uint32_t opt = armShiftOpToLdStOptMap[size_t(m.shiftOp())]; if (opt == 0xFFu) goto InvalidAddress; @@ -4667,7 +4735,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co uint32_t q = 0; uint32_t rm = 0; uint32_t rn = m.baseId(); - uint32_t sz = v.elementType() - Vec::kElementTypeB; + uint32_t sz = diff(v.elementType(), VecElementType::kB); uint32_t opcSsize = sz; uint32_t offsetPossibility = 0; @@ -4997,9 +5065,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co #endif } - resetExtraReg(); - resetInstOptions(); - resetInlineComment(); + resetState(); writer.done(this); return kErrorOk; @@ -5025,9 +5091,7 @@ Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, co #ifndef ASMJIT_NO_LOGGING return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt); #else - resetExtraReg(); - resetInstOptions(); - resetInlineComment(); + resetState(); return reportError(err); #endif } @@ -5103,6 +5167,10 @@ Error Assembler::align(AlignMode alignMode, uint32_t alignment) { Error Assembler::onAttach(CodeHolder* code) noexcept { ASMJIT_PROPAGATE(Base::onAttach(code)); + + _instructionAlignment = uint8_t(4); + assignEmitterFuncs(this); + return kErrorOk; } diff --git a/3rdparty/asmjit/src/asmjit/arm/a64assembler.h b/3rdparty/asmjit/src/asmjit/arm/a64assembler.h index f1ac72b8d5678..319321576d85d 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64assembler.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64assembler.h @@ -23,22 +23,11 @@ class ASMJIT_VIRTAPI Assembler public: typedef BaseAssembler Base; - //! \name Construction / Destruction + //! \name Construction & Destruction //! \{ ASMJIT_API Assembler(CodeHolder* code = nullptr) noexcept; - ASMJIT_API virtual ~Assembler() noexcept; - - //! \} - - //! \name Accessors - //! \{ - - //! Gets whether the current ARM mode is THUMB (alternative to 32-bit ARM encoding). - inline bool isInThumbMode() const noexcept { return _environment.isArchThumb(); } - - //! Gets the current code alignment of the current mode (ARM vs THUMB). - inline uint32_t codeAlignment() const noexcept { return isInThumbMode() ? 2 : 4; } + ASMJIT_API ~Assembler() noexcept override; //! \} diff --git a/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp b/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp index 3a52b2a578ca5..d29b0a498b952 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp @@ -17,8 +17,6 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64) Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() { _archMask = uint64_t(1) << uint32_t(Arch::kAArch64); - assignEmitterFuncs(this); - if (code) code->attach(this); } @@ -28,13 +26,19 @@ Builder::~Builder() noexcept {} // ===================== Error Builder::onAttach(CodeHolder* code) noexcept { - return Base::onAttach(code); + ASMJIT_PROPAGATE(Base::onAttach(code)); + + _instructionAlignment = uint8_t(4); + assignEmitterFuncs(this); + + return kErrorOk; } Error Builder::onDetach(CodeHolder* code) noexcept { return Base::onDetach(code); } + // a64::Builder - Finalize // ======================= diff --git a/3rdparty/asmjit/src/asmjit/arm/a64builder.h b/3rdparty/asmjit/src/asmjit/arm/a64builder.h index adc99aafc8ccf..cab1083172b3d 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64builder.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64builder.h @@ -29,7 +29,7 @@ class ASMJIT_VIRTAPI Builder //! \{ ASMJIT_API explicit Builder(CodeHolder* code = nullptr) noexcept; - ASMJIT_API virtual ~Builder() noexcept; + ASMJIT_API ~Builder() noexcept override; //! \} diff --git a/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp b/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp index d6c4ed28ff2fb..765fd4b9dee2d 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp @@ -18,8 +18,6 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64) Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() { _archMask = uint64_t(1) << uint32_t(Arch::kAArch64); - assignEmitterFuncs(this); - if (code) code->attach(this); } @@ -37,6 +35,9 @@ Error Compiler::onAttach(CodeHolder* code) noexcept { return err; } + _instructionAlignment = uint8_t(4); + assignEmitterFuncs(this); + return kErrorOk; } diff --git a/3rdparty/asmjit/src/asmjit/arm/a64compiler.h b/3rdparty/asmjit/src/asmjit/arm/a64compiler.h index bed408a98fd23..64f82f62538ec 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64compiler.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64compiler.h @@ -3,8 +3,8 @@ // See asmjit.h or LICENSE.md for license and copyright information // SPDX-License-Identifier: Zlib -#ifndef ASMJIT_ARM_ARMCOMPILER_H_INCLUDED -#define ASMJIT_ARM_ARMCOMPILER_H_INCLUDED +#ifndef ASMJIT_ARM_A64COMPILER_H_INCLUDED +#define ASMJIT_ARM_A64COMPILER_H_INCLUDED #include "../core/api-config.h" #ifndef ASMJIT_NO_COMPILER @@ -30,7 +30,7 @@ class ASMJIT_VIRTAPI Compiler //! \{ ASMJIT_API explicit Compiler(CodeHolder* code = nullptr) noexcept; - ASMJIT_API virtual ~Compiler() noexcept; + ASMJIT_API ~Compiler() noexcept override; //! \} @@ -39,74 +39,81 @@ class ASMJIT_VIRTAPI Compiler //! \cond INTERNAL template - inline RegT _newRegInternal(const Type& type) { + ASMJIT_INLINE_NODEBUG RegT _newRegInternal(const Type& type) { RegT reg(Globals::NoInit); _newReg(®, type, nullptr); return reg; } - template - inline RegT _newRegInternal(const Type& type, const char* s, Args&&... args) { + template + ASMJIT_INLINE_NODEBUG RegT _newRegInternal(const Type& type, const char* s) { #ifndef ASMJIT_NO_LOGGING RegT reg(Globals::NoInit); - if (sizeof...(Args) == 0) - _newReg(®, type, s); - else - _newRegFmt(®, type, s, std::forward(args)...); + _newReg(®, type, s); return reg; #else - DebugUtils::unused(std::forward(args)...); + DebugUtils::unused(s); + return _newRegInternal(type); +#endif + } + + template + ASMJIT_INLINE_NODEBUG RegT _newRegInternal(const Type& type, const char* s, Args&&... args) { +#ifndef ASMJIT_NO_LOGGING RegT reg(Globals::NoInit); - _newReg(®, type, nullptr); + _newRegFmt(®, type, s, std::forward(args)...); return reg; +#else + DebugUtils::unused(s, std::forward(args)...); + return _newRegInternal(type); #endif } //! \endcond template - inline RegT newSimilarReg(const RegT& ref, Args&&... args) { + ASMJIT_INLINE_NODEBUG RegT newSimilarReg(const RegT& ref, Args&&... args) { return _newRegInternal(ref, std::forward(args)...); } template - inline Reg newReg(TypeId typeId, Args&&... args) { return _newRegInternal(typeId, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Reg newReg(TypeId typeId, Args&&... args) { return _newRegInternal(typeId, std::forward(args)...); } template - inline Gp newGp(TypeId typeId, Args&&... args) { return _newRegInternal(typeId, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newGp(TypeId typeId, Args&&... args) { return _newRegInternal(typeId, std::forward(args)...); } template - inline Vec newVec(TypeId typeId, Args&&... args) { return _newRegInternal(typeId, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Vec newVec(TypeId typeId, Args&&... args) { return _newRegInternal(typeId, std::forward(args)...); } template - inline Gp newInt32(Args&&... args) { return _newRegInternal(TypeId::kInt32, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newInt32(Args&&... args) { return _newRegInternal(TypeId::kInt32, std::forward(args)...); } template - inline Gp newUInt32(Args&&... args) { return _newRegInternal(TypeId::kUInt32, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newUInt32(Args&&... args) { return _newRegInternal(TypeId::kUInt32, std::forward(args)...); } template - inline Gp newInt64(Args&&... args) { return _newRegInternal(TypeId::kInt64, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newInt64(Args&&... args) { return _newRegInternal(TypeId::kInt64, std::forward(args)...); } template - inline Gp newUInt64(Args&&... args) { return _newRegInternal(TypeId::kUInt64, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newUInt64(Args&&... args) { return _newRegInternal(TypeId::kUInt64, std::forward(args)...); } template - inline Gp newIntPtr(Args&&... args) { return _newRegInternal(TypeId::kIntPtr, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newIntPtr(Args&&... args) { return _newRegInternal(TypeId::kIntPtr, std::forward(args)...); } template - inline Gp newUIntPtr(Args&&... args) { return _newRegInternal(TypeId::kUIntPtr, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newUIntPtr(Args&&... args) { return _newRegInternal(TypeId::kUIntPtr, std::forward(args)...); } template - inline Gp newGpw(Args&&... args) { return _newRegInternal(TypeId::kUInt32, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newGpw(Args&&... args) { return _newRegInternal(TypeId::kUInt32, std::forward(args)...); } template - inline Gp newGpx(Args&&... args) { return _newRegInternal(TypeId::kUInt64, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newGpx(Args&&... args) { return _newRegInternal(TypeId::kUInt64, std::forward(args)...); } template - inline Gp newGpz(Args&&... args) { return _newRegInternal(TypeId::kUIntPtr, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Gp newGpz(Args&&... args) { return _newRegInternal(TypeId::kUIntPtr, std::forward(args)...); } template - inline Vec newVecS(Args&&... args) { return _newRegInternal(TypeId::kFloat32, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Vec newVecS(Args&&... args) { return _newRegInternal(TypeId::kFloat32, std::forward(args)...); } template - inline Vec newVecD(Args&&... args) { return _newRegInternal(TypeId::kFloat64, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Vec newVecD(Args&&... args) { return _newRegInternal(TypeId::kFloat64, std::forward(args)...); } template - inline Vec newVecQ(Args&&... args) { return _newRegInternal(TypeId::kUInt8x16, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG Vec newVecQ(Args&&... args) { return _newRegInternal(TypeId::kUInt8x16, std::forward(args)...); } //! \} @@ -114,7 +121,7 @@ class ASMJIT_VIRTAPI Compiler //! \{ //! Creates a new memory chunk allocated on the current function's stack. - inline Mem newStack(uint32_t size, uint32_t alignment, const char* name = nullptr) { + ASMJIT_INLINE_NODEBUG Mem newStack(uint32_t size, uint32_t alignment, const char* name = nullptr) { Mem m(Globals::NoInit); _newStack(&m, size, alignment, name); return m; @@ -126,38 +133,38 @@ class ASMJIT_VIRTAPI Compiler //! \{ //! Put data to a constant-pool and get a memory reference to it. - inline Mem newConst(ConstPoolScope scope, const void* data, size_t size) { + ASMJIT_INLINE_NODEBUG Mem newConst(ConstPoolScope scope, const void* data, size_t size) { Mem m(Globals::NoInit); _newConst(&m, scope, data, size); return m; } //! Put a BYTE `val` to a constant-pool (8 bits). - inline Mem newByteConst(ConstPoolScope scope, uint8_t val) noexcept { return newConst(scope, &val, 1); } + ASMJIT_INLINE_NODEBUG Mem newByteConst(ConstPoolScope scope, uint8_t val) noexcept { return newConst(scope, &val, 1); } //! Put a HWORD `val` to a constant-pool (16 bits). - inline Mem newHWordConst(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); } + ASMJIT_INLINE_NODEBUG Mem newHWordConst(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); } //! Put a WORD `val` to a constant-pool (32 bits). - inline Mem newWordConst(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); } + ASMJIT_INLINE_NODEBUG Mem newWordConst(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); } //! Put a DWORD `val` to a constant-pool (64 bits). - inline Mem newDWordConst(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); } + ASMJIT_INLINE_NODEBUG Mem newDWordConst(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); } //! Put a WORD `val` to a constant-pool. - inline Mem newInt16Const(ConstPoolScope scope, int16_t val) noexcept { return newConst(scope, &val, 2); } + ASMJIT_INLINE_NODEBUG Mem newInt16Const(ConstPoolScope scope, int16_t val) noexcept { return newConst(scope, &val, 2); } //! Put a WORD `val` to a constant-pool. - inline Mem newUInt16Const(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); } + ASMJIT_INLINE_NODEBUG Mem newUInt16Const(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); } //! Put a DWORD `val` to a constant-pool. - inline Mem newInt32Const(ConstPoolScope scope, int32_t val) noexcept { return newConst(scope, &val, 4); } + ASMJIT_INLINE_NODEBUG Mem newInt32Const(ConstPoolScope scope, int32_t val) noexcept { return newConst(scope, &val, 4); } //! Put a DWORD `val` to a constant-pool. - inline Mem newUInt32Const(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); } + ASMJIT_INLINE_NODEBUG Mem newUInt32Const(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); } //! Put a QWORD `val` to a constant-pool. - inline Mem newInt64Const(ConstPoolScope scope, int64_t val) noexcept { return newConst(scope, &val, 8); } + ASMJIT_INLINE_NODEBUG Mem newInt64Const(ConstPoolScope scope, int64_t val) noexcept { return newConst(scope, &val, 8); } //! Put a QWORD `val` to a constant-pool. - inline Mem newUInt64Const(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); } + ASMJIT_INLINE_NODEBUG Mem newUInt64Const(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); } //! Put a SP-FP `val` to a constant-pool. - inline Mem newFloatConst(ConstPoolScope scope, float val) noexcept { return newConst(scope, &val, 4); } + ASMJIT_INLINE_NODEBUG Mem newFloatConst(ConstPoolScope scope, float val) noexcept { return newConst(scope, &val, 4); } //! Put a DP-FP `val` to a constant-pool. - inline Mem newDoubleConst(ConstPoolScope scope, double val) noexcept { return newConst(scope, &val, 8); } + ASMJIT_INLINE_NODEBUG Mem newDoubleConst(ConstPoolScope scope, double val) noexcept { return newConst(scope, &val, 8); } //! \} @@ -165,7 +172,7 @@ class ASMJIT_VIRTAPI Compiler //! \{ //! Force the compiler to not follow the conditional or unconditional jump. - inline Compiler& unfollow() noexcept { _instOptions |= InstOptions::kUnfollow; return *this; } + ASMJIT_INLINE_NODEBUG Compiler& unfollow() noexcept { _instOptions |= InstOptions::kUnfollow; return *this; } //! \} @@ -177,7 +184,7 @@ class ASMJIT_VIRTAPI Compiler //! \note At the moment this instruction is only useful to load a stack allocated address into a GP register //! for further use. It makes very little sense to use it for anything else. The semantics of this instruction //! is the same as X86 `LEA` (load effective address) instruction. - inline Error loadAddressOf(const Gp& o0, const Mem& o1) { return _emitter()->_emitI(Inst::kIdAdr, o0, o1); } + ASMJIT_INLINE_NODEBUG Error loadAddressOf(const Gp& o0, const Mem& o1) { return _emitter()->_emitI(Inst::kIdAdr, o0, o1); } //! \} @@ -185,7 +192,7 @@ class ASMJIT_VIRTAPI Compiler //! \{ //! Invoke a function call without `target` type enforcement. - inline Error invoke_(InvokeNode** out, const Operand_& target, const FuncSignature& signature) { + ASMJIT_INLINE_NODEBUG Error invoke_(InvokeNode** out, const Operand_& target, const FuncSignature& signature) { return addInvokeNode(out, Inst::kIdBlr, target, signature); } @@ -194,22 +201,22 @@ class ASMJIT_VIRTAPI Compiler //! Creates a new \ref InvokeNode, initializes all the necessary members to match the given function `signature`, //! adds the node to the compiler, and stores its pointer to `out`. The operation is atomic, if anything fails //! nullptr is stored in `out` and error code is returned. - inline Error invoke(InvokeNode** out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); } //! \overload - inline Error invoke(InvokeNode** out, const Mem& target, const FuncSignature& signature) { return invoke_(out, target, signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Mem& target, const FuncSignature& signature) { return invoke_(out, target, signature); } //! \overload - inline Error invoke(InvokeNode** out, const Label& target, const FuncSignature& signature) { return invoke_(out, target, signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Label& target, const FuncSignature& signature) { return invoke_(out, target, signature); } //! \overload - inline Error invoke(InvokeNode** out, const Imm& target, const FuncSignature& signature) { return invoke_(out, target, signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Imm& target, const FuncSignature& signature) { return invoke_(out, target, signature); } //! \overload - inline Error invoke(InvokeNode** out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); } //! Return. - inline Error ret() { return addRet(Operand(), Operand()); } + ASMJIT_INLINE_NODEBUG Error ret() { return addRet(Operand(), Operand()); } //! \overload - inline Error ret(const BaseReg& o0) { return addRet(o0, Operand()); } + ASMJIT_INLINE_NODEBUG Error ret(const BaseReg& o0) { return addRet(o0, Operand()); } //! \overload - inline Error ret(const BaseReg& o0, const BaseReg& o1) { return addRet(o0, o1); } + ASMJIT_INLINE_NODEBUG Error ret(const BaseReg& o0, const BaseReg& o1) { return addRet(o0, o1); } //! \} @@ -219,7 +226,7 @@ class ASMJIT_VIRTAPI Compiler using EmitterExplicitT::br; //! Adds a jump to the given `target` with the provided jump `annotation`. - inline Error br(const BaseReg& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdBr, target, annotation); } + ASMJIT_INLINE_NODEBUG Error br(const BaseReg& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdBr, target, annotation); } //! \} @@ -244,4 +251,4 @@ class ASMJIT_VIRTAPI Compiler ASMJIT_END_SUB_NAMESPACE #endif // !ASMJIT_NO_COMPILER -#endif // ASMJIT_ARM_ARMCOMPILER_H_INCLUDED +#endif // ASMJIT_ARM_A64COMPILER_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp b/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp index 1e8da619a6b82..0cf098250a3fb 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp @@ -169,7 +169,7 @@ Error EmitHelper::emitArgMove( if (TypeUtils::isInt(dstTypeId)) { if (TypeUtils::isInt(srcTypeId)) { - uint32_t x = dstSize == 8; + uint32_t x = uint32_t(dstSize == 8); dst.setSignature(OperandSignature{x ? uint32_t(GpX::kSignature) : uint32_t(GpW::kSignature)}); _emitter->setInlineComment(comment); @@ -186,7 +186,7 @@ Error EmitHelper::emitArgMove( case TypeId::kInt16: instId = Inst::kIdLdrsh; break; case TypeId::kUInt16: instId = Inst::kIdLdrh; break; case TypeId::kInt32: instId = x ? Inst::kIdLdrsw : Inst::kIdLdr; break; - case TypeId::kUInt32: instId = Inst::kIdLdr; x = 0; break; + case TypeId::kUInt32: instId = Inst::kIdLdr; break; case TypeId::kInt64: instId = Inst::kIdLdr; break; case TypeId::kUInt64: instId = Inst::kIdLdr; break; default: @@ -312,6 +312,12 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) { { Inst::kIdStr_v, Inst::kIdStp_v } }}; + // Emit: 'bti' (indirect branch protection). + if (frame.hasIndirectBranchProtection()) { + // TODO: The instruction is not available at the moment (would be ABI break). + // ASMJIT_PROPAGATE(emitter->bti()); + } + uint32_t adjustInitialOffset = pei.sizeTotal; for (RegGroup group : Support::EnumValues{}) { @@ -339,7 +345,7 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) { else ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem)); - mem.resetToFixedOffset(); + mem.resetOffsetMode(); if (i == 0 && frame.hasPreservedFP()) { ASMJIT_PROPAGATE(emitter->mov(x29, sp)); @@ -421,7 +427,7 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitEpilog(const FuncFrame& frame) { else ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem)); - mem.resetToFixedOffset(); + mem.resetOffsetMode(); } } diff --git a/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h b/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h index b1ba1a92960b0..6e10f9eaabe7f 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h @@ -3,8 +3,8 @@ // See asmjit.h or LICENSE.md for license and copyright information // SPDX-License-Identifier: Zlib -#ifndef ASMJIT_ARM_ARMEMITHELPER_P_H_INCLUDED -#define ASMJIT_ARM_ARMEMITHELPER_P_H_INCLUDED +#ifndef ASMJIT_ARM_A64EMITHELPER_P_H_INCLUDED +#define ASMJIT_ARM_A64EMITHELPER_P_H_INCLUDED #include "../core/api-config.h" @@ -21,7 +21,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64) class EmitHelper : public BaseEmitHelper { public: - inline explicit EmitHelper(BaseEmitter* emitter = nullptr) noexcept + ASMJIT_INLINE_NODEBUG explicit EmitHelper(BaseEmitter* emitter = nullptr) noexcept : BaseEmitHelper(emitter) {} Error emitRegMove( @@ -47,4 +47,4 @@ void assignEmitterFuncs(BaseEmitter* emitter); ASMJIT_END_SUB_NAMESPACE -#endif // ASMJIT_ARM_ARMEMITHELPER_P_H_INCLUDED +#endif // ASMJIT_ARM_A64EMITHELPER_P_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/arm/a64emitter.h b/3rdparty/asmjit/src/asmjit/arm/a64emitter.h index 54354eaca8495..43484344526a8 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64emitter.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64emitter.h @@ -11,6 +11,14 @@ #include "../arm/a64instdb.h" #include "../arm/a64operand.h" +// MSVC targeting AArch64 defines a lot of macros without underscores clashing +// with AArch64 instruction names. We have to workaround until it's fixed in SDK. +#if defined(_MSC_VER) && defined(mvn) + #define ASMJIT_RESTORE_MSVC_AARCH64_MACROS + #pragma push_macro("mvn") + #undef mvn +#endif + ASMJIT_BEGIN_SUB_NAMESPACE(a64) #define ASMJIT_INST_0x(NAME, ID) \ @@ -63,7 +71,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64) //! ARM emitter. //! //! NOTE: This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either -//! \ref Assembler, \ref Builder, or \ref Compiler (use withcaution with \ref Compiler as it expects virtual +//! \ref Assembler, \ref Builder, or \ref Compiler (use with caution with \ref Compiler as it expects virtual //! registers to be used). template struct EmitterExplicitT { @@ -71,22 +79,11 @@ struct EmitterExplicitT { // These two are unfortunately reported by the sanitizer. We know what we do, however, the sanitizer doesn't. // I have tried to use reinterpret_cast instead, but that would generate bad code when compiled by MSC. - ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline This* _emitter() noexcept { return static_cast(this); } - ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline const This* _emitter() const noexcept { return static_cast(this); } + ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG This* _emitter() noexcept { return static_cast(this); } + ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG const This* _emitter() const noexcept { return static_cast(this); } //! \endcond - // -------------------------------------------------------------------------- - // [Options] - // -------------------------------------------------------------------------- - -protected: - inline This& _addInstOptions(InstOptions options) noexcept { - static_cast(this)->addInstOptions(options); - return *static_cast(this); - } - -public: //! \name General Purpose Instructions //! \{ @@ -517,6 +514,8 @@ struct EmitterExplicitT { ASMJIT_INST_2x(ldxrb, Ldxrb, Gp, Mem) ASMJIT_INST_2x(ldxrh, Ldxrh, Gp, Mem) + ASMJIT_INST_2x(prfm, Prfm, Imm, Mem) + ASMJIT_INST_2x(stadd, Stadd, Gp, Mem) ASMJIT_INST_2x(staddb, Staddb, Gp, Mem) ASMJIT_INST_2x(staddh, Staddh, Gp, Mem) @@ -1111,14 +1110,14 @@ struct EmitterExplicitT { //! \} - //! \name FJCVTZS Instruction (ARMv8.3-A) + //! \name JSCVT Instruction (ARMv8.3-A) //! \{ ASMJIT_INST_2x(fjcvtzs, Fjcvtzs_v, Gp, Vec); //! \} - //! \name FP16FML Instructions (ARMv8.4-A, optional in ARMv8.2-A) + //! \name FHM Instructions //! \{ ASMJIT_INST_3x(fmlal, Fmlal_v, Vec, Vec, Vec); @@ -1225,4 +1224,9 @@ class Emitter : public BaseEmitter, public EmitterExplicitT { ASMJIT_END_SUB_NAMESPACE +// Restore undefined MSVC AArch64 macros. +#if defined(ASMJIT_RESTORE_MSVC_AARCH64_MACROS) + #pragma pop_macro("mvn") +#endif + #endif // ASMJIT_ARM_A64EMITTER_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp b/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp index bccb68b99b086..94ef3ee59e9dc 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp @@ -4,7 +4,7 @@ // SPDX-License-Identifier: Zlib #include "../core/api-build_p.h" -#ifndef ASMJIT_NO_LOGGING +#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_LOGGING) #include "../core/misc_p.h" #include "../core/support.h" @@ -19,243 +19,6 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64) -// a64::FormatterInternal - Format Register -// ======================================== - -ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister( - String& sb, - FormatFlags flags, - const BaseEmitter* emitter, - Arch arch, - RegType regType, - uint32_t rId, - uint32_t elementType, - uint32_t elementIndex) noexcept { - - DebugUtils::unused(flags); - DebugUtils::unused(arch); - - static const char bhsdq[] = "bhsdq"; - - bool virtRegFormatted = false; - -#ifndef ASMJIT_NO_COMPILER - if (Operand::isVirtId(rId)) { - if (emitter && emitter->isCompiler()) { - const BaseCompiler* cc = static_cast(emitter); - if (cc->isVirtIdValid(rId)) { - VirtReg* vReg = cc->virtRegById(rId); - ASMJIT_ASSERT(vReg != nullptr); - - const char* name = vReg->name(); - if (name && name[0] != '\0') - ASMJIT_PROPAGATE(sb.append(name)); - else - ASMJIT_PROPAGATE(sb.appendFormat("%%%u", unsigned(Operand::virtIdToIndex(rId)))); - - virtRegFormatted = true; - } - } - } -#else - DebugUtils::unused(emitter, flags); -#endif - - if (!virtRegFormatted) { - char letter = '\0'; - switch (regType) { - case RegType::kARM_GpW: - if (rId == Gp::kIdZr) - return sb.append("wzr"); - if (rId == Gp::kIdSp) - return sb.append("wsp"); - - letter = 'w'; - break; - - case RegType::kARM_GpX: - if (rId == Gp::kIdZr) - return sb.append("xzr"); - if (rId == Gp::kIdSp) - return sb.append("sp"); - - letter = 'x'; - break; - - case RegType::kARM_VecB: - case RegType::kARM_VecH: - case RegType::kARM_VecS: - case RegType::kARM_VecD: - case RegType::kARM_VecV: - letter = bhsdq[uint32_t(regType) - uint32_t(RegType::kARM_VecB)]; - if (elementType) - letter = 'v'; - break; - - default: - ASMJIT_PROPAGATE(sb.appendFormat("?$u", uint32_t(regType), rId)); - break; - } - - if (letter) - ASMJIT_PROPAGATE(sb.appendFormat("%c%u", letter, rId)); - } - - if (elementType) { - char elementLetter = '\0'; - uint32_t elementCount = 0; - - switch (elementType) { - case Vec::kElementTypeB: - elementLetter = 'b'; - elementCount = 16; - break; - - case Vec::kElementTypeH: - elementLetter = 'h'; - elementCount = 8; - break; - - case Vec::kElementTypeS: - elementLetter = 's'; - elementCount = 4; - break; - - case Vec::kElementTypeD: - elementLetter = 'd'; - elementCount = 2; - break; - - default: - return sb.append("."); - } - - if (elementLetter) { - if (elementIndex == 0xFFFFFFFFu) { - if (regType == RegType::kARM_VecD) - elementCount /= 2u; - ASMJIT_PROPAGATE(sb.appendFormat(".%u%c", elementCount, elementLetter)); - } - else { - ASMJIT_PROPAGATE(sb.appendFormat(".%c[%u]", elementLetter, elementIndex)); - } - } - } - - return kErrorOk; -} - -// a64::FormatterInternal - Format Operand -// ======================================= - -ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand( - String& sb, - FormatFlags flags, - const BaseEmitter* emitter, - Arch arch, - const Operand_& op) noexcept { - - if (op.isReg()) { - const BaseReg& reg = op.as(); - - uint32_t elementType = op.as().elementType(); - uint32_t elementIndex = op.as().elementIndex(); - - if (!op.as().hasElementIndex()) - elementIndex = 0xFFFFFFFFu; - - return formatRegister(sb, flags, emitter, arch, reg.type(), reg.id(), elementType, elementIndex); - } - - if (op.isMem()) { - const Mem& m = op.as(); - ASMJIT_PROPAGATE(sb.append('[')); - - if (m.hasBase()) { - if (m.hasBaseLabel()) { - ASMJIT_PROPAGATE(Formatter::formatLabel(sb, flags, emitter, m.baseId())); - } - else { - FormatFlags modifiedFlags = flags; - if (m.isRegHome()) { - ASMJIT_PROPAGATE(sb.append('&')); - modifiedFlags &= ~FormatFlags::kRegCasts; - } - ASMJIT_PROPAGATE(formatRegister(sb, modifiedFlags, emitter, arch, m.baseType(), m.baseId())); - } - } - else { - // ARM really requires base. - if (m.hasIndex() || m.hasOffset()) { - ASMJIT_PROPAGATE(sb.append("")); - } - } - - // The post index makes it look like there was another operand, but it's - // still the part of AsmJit's `arm::Mem` operand so it's consistent with - // other architectures. - if (m.isPostIndex()) - ASMJIT_PROPAGATE(sb.append(']')); - - if (m.hasIndex()) { - ASMJIT_PROPAGATE(sb.append(", ")); - ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, m.indexType(), m.indexId())); - } - - if (m.hasOffset()) { - ASMJIT_PROPAGATE(sb.append(", ")); - - int64_t off = int64_t(m.offset()); - uint32_t base = 10; - - if (Support::test(flags, FormatFlags::kHexOffsets) && uint64_t(off) > 9) - base = 16; - - if (base == 10) { - ASMJIT_PROPAGATE(sb.appendInt(off, base)); - } - else { - ASMJIT_PROPAGATE(sb.append("0x")); - ASMJIT_PROPAGATE(sb.appendUInt(uint64_t(off), base)); - } - } - - if (m.hasShift()) { - ASMJIT_PROPAGATE(sb.append(' ')); - if (!m.isPreOrPost()) - ASMJIT_PROPAGATE(formatShiftOp(sb, (ShiftOp)m.predicate())); - ASMJIT_PROPAGATE(sb.appendFormat(" %u", m.shift())); - } - - if (!m.isPostIndex()) - ASMJIT_PROPAGATE(sb.append(']')); - - if (m.isPreIndex()) - ASMJIT_PROPAGATE(sb.append('!')); - - return kErrorOk; - } - - if (op.isImm()) { - const Imm& i = op.as(); - int64_t val = i.value(); - - if (Support::test(flags, FormatFlags::kHexImms) && uint64_t(val) > 9) { - ASMJIT_PROPAGATE(sb.append("0x")); - return sb.appendUInt(uint64_t(val), 16); - } - else { - return sb.appendInt(val, 10); - } - } - - if (op.isLabel()) { - return Formatter::formatLabel(sb, flags, emitter, op.id()); - } - - return sb.append(""); -} - // a64::FormatterInternal - Format Instruction // =========================================== @@ -266,12 +29,10 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction( Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept { - DebugUtils::unused(arch); - // Format instruction options and instruction mnemonic. InstId instId = inst.realId(); - if (instId < Inst::_kIdCount) - ASMJIT_PROPAGATE(InstInternal::instIdToString(arch, instId, sb)); + if (instId != Inst::kIdNone && instId < Inst::_kIdCount) + ASMJIT_PROPAGATE(InstInternal::instIdToString(instId, sb)); else ASMJIT_PROPAGATE(sb.appendFormat("[InstId=#%u]", unsigned(instId))); @@ -295,4 +56,4 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction( ASMJIT_END_SUB_NAMESPACE -#endif // !ASMJIT_NO_LOGGING +#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_LOGGING diff --git a/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h b/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h index bd7a1440cb0ec..d0adde3ce0d62 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h @@ -24,23 +24,6 @@ namespace FormatterInternal { using namespace arm::FormatterInternal; -Error ASMJIT_CDECL formatRegister( - String& sb, - FormatFlags flags, - const BaseEmitter* emitter, - Arch arch, - RegType regType, - uint32_t regId, - uint32_t elementType = 0, - uint32_t elementIndex = 0xFFFFFFFFu) noexcept; - -Error ASMJIT_CDECL formatOperand( - String& sb, - FormatFlags flags, - const BaseEmitter* emitter, - Arch arch, - const Operand_& op) noexcept; - Error ASMJIT_CDECL formatInstruction( String& sb, FormatFlags flags, diff --git a/3rdparty/asmjit/src/asmjit/arm/a64func.cpp b/3rdparty/asmjit/src/asmjit/arm/a64func.cpp index 55e3f2e71ec5c..a88c4d885060f 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64func.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64func.cpp @@ -41,12 +41,13 @@ static RegType regTypeFromFpOrVecTypeId(TypeId typeId) noexcept { ASMJIT_FAVOR_SIZE Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept { cc.setArch(environment.arch()); + cc.setStrategy(environment.isDarwin() ? CallConvStrategy::kAArch64Apple : CallConvStrategy::kDefault); cc.setSaveRestoreRegSize(RegGroup::kGp, 8); cc.setSaveRestoreRegSize(RegGroup::kVec, 8); cc.setSaveRestoreAlignment(RegGroup::kGp, 16); cc.setSaveRestoreAlignment(RegGroup::kVec, 16); - cc.setSaveRestoreAlignment(RegGroup::kExtraVirt2, 1); + cc.setSaveRestoreAlignment(RegGroup::kMask, 1); cc.setSaveRestoreAlignment(RegGroup::kExtraVirt3, 1); cc.setPassedOrder(RegGroup::kGp, 0, 1, 2, 3, 4, 5, 6, 7); cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7); @@ -68,7 +69,7 @@ ASMJIT_FAVOR_SIZE Error initCallConv(CallConv& cc, CallConvId ccId, const Enviro return kErrorOk; } -ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept { +ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& signature) noexcept { DebugUtils::unused(signature); const CallConv& cc = func.callConv(); @@ -77,6 +78,13 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si uint32_t i; uint32_t argCount = func.argCount(); + // Minimum stack size of a single argument passed via stack. The standard AArch64 calling convention + // specifies 8 bytes, so each function argument would occupy at least 8 bytes even if it needs less. + // However, Apple has decided to not follow this rule and function argument can occupy less, for + // example two consecutive 32-bit arguments would occupy 8 bytes total, instead of 16 as specified + // by ARM. + uint32_t minStackArgSize = cc.strategy() == CallConvStrategy::kAArch64Apple ? 4u : 8u; + if (func.hasRet()) { for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) { TypeId typeId = func._rets[valueIndex].typeId(); @@ -119,7 +127,8 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si } switch (cc.strategy()) { - case CallConvStrategy::kDefault: { + case CallConvStrategy::kDefault: + case CallConvStrategy::kAArch64Apple: { uint32_t gpzPos = 0; uint32_t vecPos = 0; @@ -140,7 +149,9 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si gpzPos++; } else { - uint32_t size = Support::max(TypeUtils::sizeOf(typeId), registerSize); + uint32_t size = Support::max(TypeUtils::sizeOf(typeId), minStackArgSize); + if (size >= 8) + stackOffset = Support::alignUp(stackOffset, 8); arg.assignStackOffset(int32_t(stackOffset)); stackOffset += size; } @@ -164,7 +175,9 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si vecPos++; } else { - uint32_t size = TypeUtils::sizeOf(typeId); + uint32_t size = Support::max(TypeUtils::sizeOf(typeId), minStackArgSize); + if (size >= 8) + stackOffset = Support::alignUp(stackOffset, 8); arg.assignStackOffset(int32_t(stackOffset)); stackOffset += size; } @@ -178,7 +191,7 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si return DebugUtils::errored(kErrorInvalidState); } - func._argStackSize = stackOffset; + func._argStackSize = Support::alignUp(stackOffset, 8u); return kErrorOk; } diff --git a/3rdparty/asmjit/src/asmjit/arm/a64func_p.h b/3rdparty/asmjit/src/asmjit/arm/a64func_p.h index 9f531fc5a2301..7f2221c70591a 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64func_p.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64func_p.h @@ -21,7 +21,7 @@ namespace FuncInternal { Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept; //! Initialize `FuncDetail` (AArch64 specific). -Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept; +Error initFuncDetail(FuncDetail& func, const FuncSignature& signature) noexcept; } // {FuncInternal} diff --git a/3rdparty/asmjit/src/asmjit/arm/a64globals.h b/3rdparty/asmjit/src/asmjit/arm/a64globals.h index 2b6b6f0ce91a5..8093885b32c1a 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64globals.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64globals.h @@ -15,9 +15,6 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64) -// a64 uses everything from arm namespace and adds into it. -using namespace arm; - //! \addtogroup asmjit_a64 //! \{ @@ -293,6 +290,7 @@ struct Inst { kIdPacdza, //!< Instruction 'pacdza'. kIdPacdzb, //!< Instruction 'pacdzb'. kIdPacga, //!< Instruction 'pacga'. + kIdPrfm, //!< Instruction 'prfm'. kIdPssbb, //!< Instruction 'pssbb'. kIdRbit, //!< Instruction 'rbit'. kIdRet, //!< Instruction 'ret'. @@ -797,14 +795,14 @@ struct Inst { }; //! Tests whether the `instId` is defined (counts also Inst::kIdNone, which must be zero). - static inline bool isDefinedId(InstId instId) noexcept { return (instId & uint32_t(InstIdParts::kRealId)) < _kIdCount; } + static ASMJIT_INLINE_NODEBUG bool isDefinedId(InstId instId) noexcept { return (instId & uint32_t(InstIdParts::kRealId)) < _kIdCount; } }; namespace Predicate { //! Address translate options (AT). namespace AT { - static inline constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0); } @@ -862,7 +860,7 @@ namespace DB { //! Data cache maintenance options. namespace DC { - static inline constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0); } @@ -901,7 +899,7 @@ namespace DC { //! Instruction cache maintenance options. namespace IC { - static inline constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0); } @@ -955,7 +953,7 @@ namespace PSB { } namespace TLBI { - static inline constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0); } @@ -1054,7 +1052,7 @@ namespace TSB { //! Processor state access through MSR. namespace PState { //! Encodes a pstate from `op0` and `op1`. - static inline constexpr uint32_t encode(uint32_t op0, uint32_t op1) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op0, uint32_t op1) noexcept { return (op0 << 3) | (op1 << 0); } @@ -1083,17 +1081,17 @@ namespace SysReg { }; //! Encodes a system register from `op0`, `op1`, `cRn`, `cRm`, and `op2` fields. - static inline constexpr uint32_t encode(uint32_t op0, uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op0, uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept { return (op0 << 14) | (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0); } //! Encodes a system register from `fields`. - static inline constexpr uint32_t encode(const Fields& fields) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(const Fields& fields) noexcept { return encode(fields.op0, fields.op1, fields.cRn, fields.cRm, fields.op2); } //! Decodes a system register to \ref Fields. - static inline constexpr Fields decode(uint32_t id) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr Fields decode(uint32_t id) noexcept { return Fields { uint8_t((id >> 14) & 0x3u), uint8_t((id >> 11) & 0x7u), @@ -1417,9 +1415,12 @@ namespace SysReg { kID_AA64DFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0101, 0b001), // RO kID_AA64ISAR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0110, 0b000), // RO kID_AA64ISAR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0110, 0b001), // RO + kID_AA64ISAR2_EL1 = encode(0b11, 0b000, 0b0000, 0b0110, 0b010), // RO kID_AA64MMFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0111, 0b000), // RO kID_AA64MMFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0111, 0b001), // RO kID_AA64MMFR2_EL1 = encode(0b11, 0b000, 0b0000, 0b0111, 0b010), // RO + kID_AA64MMFR3_EL1 = encode(0b11, 0b000, 0b0000, 0b0111, 0b011), // RO + kID_AA64MMFR4_EL1 = encode(0b11, 0b000, 0b0000, 0b0111, 0b100), // RO kID_AA64PFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0100, 0b000), // RO kID_AA64PFR1_EL1 = encode(0b11, 0b000, 0b0000, 0b0100, 0b001), // RO kID_AA64ZFR0_EL1 = encode(0b11, 0b000, 0b0000, 0b0100, 0b100), // RO diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp b/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp index d933d4bd7f75f..97e23fd945263 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp @@ -8,71 +8,29 @@ #include "../core/cpuinfo.h" #include "../core/misc_p.h" -#include "../core/support.h" +#include "../core/support_p.h" #include "../arm/a64instapi_p.h" #include "../arm/a64instdb_p.h" #include "../arm/a64operand.h" ASMJIT_BEGIN_SUB_NAMESPACE(a64) +namespace InstInternal { + // a64::InstInternal - Text // ======================== #ifndef ASMJIT_NO_TEXT -Error InstInternal::instIdToString(Arch arch, InstId instId, String& output) noexcept { +Error instIdToString(InstId instId, String& output) noexcept { uint32_t realId = instId & uint32_t(InstIdParts::kRealId); - DebugUtils::unused(arch); - if (ASMJIT_UNLIKELY(!Inst::isDefinedId(realId))) return DebugUtils::errored(kErrorInvalidInstruction); - const InstDB::InstInfo& info = InstDB::infoById(realId); - return output.append(InstDB::_nameData + info._nameDataIndex); + return InstNameUtils::decode(output, InstDB::_instNameIndexTable[realId], InstDB::_instNameStringTable); } -InstId InstInternal::stringToInstId(Arch arch, const char* s, size_t len) noexcept { - DebugUtils::unused(arch); - - if (ASMJIT_UNLIKELY(!s)) - return Inst::kIdNone; - - if (len == SIZE_MAX) - len = strlen(s); - - if (ASMJIT_UNLIKELY(len == 0 || len > InstDB::kMaxNameSize)) - return Inst::kIdNone; - - uint32_t prefix = uint32_t(s[0]) - 'a'; - if (ASMJIT_UNLIKELY(prefix > 'z' - 'a')) - return Inst::kIdNone; - - uint32_t index = InstDB::instNameIndex[prefix].start; - if (ASMJIT_UNLIKELY(!index)) - return Inst::kIdNone; - - const char* nameData = InstDB::_nameData; - const InstDB::InstInfo* table = InstDB::_instInfoTable; - - const InstDB::InstInfo* base = table + index; - const InstDB::InstInfo* end = table + InstDB::instNameIndex[prefix].end; - - for (size_t lim = (size_t)(end - base); lim != 0; lim >>= 1) { - const InstDB::InstInfo* cur = base + (lim >> 1); - int result = Support::cmpInstName(nameData + cur[0]._nameDataIndex, s, len); - - if (result < 0) { - base = cur + 1; - lim--; - continue; - } - - if (result > 0) - continue; - - return uint32_t((size_t)(cur - table)); - } - - return Inst::kIdNone; +InstId stringToInstId(const char* s, size_t len) noexcept { + return InstNameUtils::find(s, len, InstDB::instNameIndex, InstDB::_instNameIndexTable, InstDB::_instNameStringTable); } #endif // !ASMJIT_NO_TEXT @@ -80,9 +38,9 @@ InstId InstInternal::stringToInstId(Arch arch, const char* s, size_t len) noexce // ============================ #ifndef ASMJIT_NO_VALIDATION -ASMJIT_FAVOR_SIZE Error InstInternal::validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept { +ASMJIT_FAVOR_SIZE Error validate(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept { // TODO: - DebugUtils::unused(arch, inst, operands, opCount, validationFlags); + DebugUtils::unused(inst, operands, opCount, validationFlags); return kErrorOk; } #endif // !ASMJIT_NO_VALIDATION @@ -126,13 +84,7 @@ static const InstRWInfoData instRWInfoData[] = { static const uint8_t elementTypeSize[8] = { 0, 1, 2, 4, 8, 4, 4, 0 }; -Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept { - // Unused in Release configuration as the assert is not compiled in. - DebugUtils::unused(arch); - - // Only called when `arch` matches X86 family. - ASMJIT_ASSERT(Environment::isFamilyARM(arch)); - +Error queryRWInfo(const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept { // Get the instruction data. uint32_t realId = inst.id() & uint32_t(InstIdParts::kRealId); @@ -222,10 +174,10 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* if (srcOp.isReg()) { if (srcOp.as().hasElementIndex()) { // Only part of the vector is accessed if element index [] is used. - uint32_t elementType = srcOp.as().elementType(); + VecElementType elementType = srcOp.as().elementType(); uint32_t elementIndex = srcOp.as().elementIndex(); - uint32_t elementSize = elementTypeSize[elementType]; + uint32_t elementSize = elementTypeSize[size_t(elementType)]; uint64_t accessMask = uint64_t(Support::lsbMask(elementSize)) << (elementIndex * elementSize); op._readByteMask &= accessMask; @@ -242,8 +194,7 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* } if (memOp.hasIndex()) { - op.addOpFlags(OpRWFlags::kMemIndexRead); - op.addOpFlags(memOp.isPreOrPost() ? OpRWFlags::kMemIndexWrite : OpRWFlags::kNone); + op.addOpFlags(memOp.isPreOrPost() ? OpRWFlags::kMemIndexRW : OpRWFlags::kMemIndexRead); } } } @@ -257,13 +208,15 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* // ================================= #ifndef ASMJIT_NO_INTROSPECTION -Error InstInternal::queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept { +Error queryFeatures(const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept { // TODO: [ARM] QueryFeatures not implemented yet. - DebugUtils::unused(arch, inst, operands, opCount, out); + DebugUtils::unused(inst, operands, opCount, out); return kErrorOk; } #endif // !ASMJIT_NO_INTROSPECTION +} // {InstInternal} + // a64::InstInternal - Unit // ======================== diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h b/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h index 320a3e881d9b9..535e4bd71f8b7 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h @@ -18,17 +18,17 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64) namespace InstInternal { #ifndef ASMJIT_NO_TEXT -Error ASMJIT_CDECL instIdToString(Arch arch, InstId instId, String& output) noexcept; -InstId ASMJIT_CDECL stringToInstId(Arch arch, const char* s, size_t len) noexcept; +Error ASMJIT_CDECL instIdToString(InstId instId, String& output) noexcept; +InstId ASMJIT_CDECL stringToInstId(const char* s, size_t len) noexcept; #endif // !ASMJIT_NO_TEXT #ifndef ASMJIT_NO_VALIDATION -Error ASMJIT_CDECL validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept; +Error ASMJIT_CDECL validate(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept; #endif // !ASMJIT_NO_VALIDATION #ifndef ASMJIT_NO_INTROSPECTION -Error ASMJIT_CDECL queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept; -Error ASMJIT_CDECL queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept; +Error ASMJIT_CDECL queryRWInfo(const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept; +Error ASMJIT_CDECL queryFeatures(const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept; #endif // !ASMJIT_NO_INTROSPECTION } // {InstInternal} diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp b/3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp index 64709b5db0316..b19f8808a63c5 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp @@ -18,20 +18,11 @@ namespace InstDB { // a64::InstDB - InstInfoTable // =========================== -// Don't store `_nameDataIndex` if instruction names are disabled. Since some -// APIs can use `_nameDataIndex` it's much safer if it's zero if it's not used. -#if defined(ASMJIT_NO_TEXT) - #define NAME_DATA_INDEX(x) 0 -#else - #define NAME_DATA_INDEX(x) x -#endif - // Defines an ARM/AArch64 instruction. -#define INST(id, opcodeEncoding, opcodeData, rwInfoIndex, flags, opcodeDataIndex, nameDataIndex) { \ +#define INST(id, opcodeEncoding, opcodeData, rwInfoIndex, flags, opcodeDataIndex) { \ uint32_t(kEncoding##opcodeEncoding), \ uint32_t(opcodeDataIndex), \ 0, \ - uint32_t(NAME_DATA_INDEX(nameDataIndex)), \ uint16_t(rwInfoIndex), \ uint16_t(flags) \ } @@ -63,774 +54,775 @@ IRG: Insert Random Tag. INST_(Irg , BaseRRR , (0b1001101011000000000100, kX , kSP, kX , kSP, kX , kZR, true) , kRWI_W , 0 , 0 , 1 ), // #1 */ const InstInfo _instInfoTable[] = { - // +------------------+---------------------+--------------------------------------------------------------------------------------+-----------+---------------------------+----+-----+ - // | Instruction Id | Encoding | Opcode Data | RW Info | Instruction Flags |DatX|NameX| - // +------------------+---------------------+--------------------------------------------------------------------------------------+-----------+---------------------------+----+-----+ + // +------------------+---------------------+--------------------------------------------------------------------------------------+-----------+---------------------------+----+ + // | Instruction Id | Encoding | Opcode Data | RW Info | Instruction Flags |DatX| + // +------------------+---------------------+--------------------------------------------------------------------------------------+-----------+---------------------------+----+ // ${InstInfo:Begin} - INST(None , None , (_) , 0 , 0 , 0 , 0 ), // #0 - INST(Adc , BaseRRR , (0b0001101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 , 1 ), // #1 - INST(Adcs , BaseRRR , (0b0011101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 , 5 ), // #2 - INST(Add , BaseAddSub , (0b0001011000, 0b0001011001, 0b0010001) , kRWI_W , 0 , 0 , 978 ), // #3 - INST(Addg , BaseRRII , (0b1001000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 0 , 10 ), // #4 - INST(Adds , BaseAddSub , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_W , 0 , 1 , 15 ), // #5 - INST(Adr , BaseAdr , (0b0001000000000000000000, OffsetType::kAArch64_ADR) , kRWI_W , 0 , 0 , 25 ), // #6 - INST(Adrp , BaseAdr , (0b1001000000000000000000, OffsetType::kAArch64_ADRP) , kRWI_W , 0 , 1 , 29 ), // #7 - INST(And , BaseLogical , (0b0001010000, 0b00100100, 0) , kRWI_W , 0 , 0 , 57 ), // #8 - INST(Ands , BaseLogical , (0b1101010000, 0b11100100, 0) , kRWI_W , 0 , 1 , 61 ), // #9 - INST(Asr , BaseShift , (0b0001101011000000001010, 0b0001001100000000011111, 0) , kRWI_W , 0 , 0 , 66 ), // #10 - INST(Asrv , BaseShift , (0b0001101011000000001010, 0b0000000000000000000000, 0) , kRWI_W , 0 , 1 , 70 ), // #11 - INST(At , BaseAtDcIcTlbi , (0b00011111110000, 0b00001111000000, true) , kRWI_RX , 0 , 0 , 75 ), // #12 - INST(Autda , BaseRR , (0b11011010110000010001100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 0 , 78 ), // #13 - INST(Autdza , BaseR , (0b11011010110000010011101111100000, kX, kZR, 0) , kRWI_X , 0 , 0 , 90 ), // #14 - INST(Autdb , BaseRR , (0b11011010110000010001110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 1 , 84 ), // #15 - INST(Autdzb , BaseR , (0b11011010110000010011111111100000, kX, kZR, 0) , kRWI_X , 0 , 1 , 97 ), // #16 - INST(Autia , BaseRR , (0b11011010110000010001000000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 2 , 104 ), // #17 - INST(Autia1716 , BaseOp , (0b11010101000000110010000110011111) , 0 , 0 , 0 , 110 ), // #18 - INST(Autiasp , BaseOp , (0b11010101000000110010001110111111) , 0 , 0 , 1 , 120 ), // #19 - INST(Autiaz , BaseOp , (0b11010101000000110010001110011111) , 0 , 0 , 2 , 128 ), // #20 - INST(Autib , BaseRR , (0b11011010110000010001010000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 3 , 135 ), // #21 - INST(Autib1716 , BaseOp , (0b11010101000000110010000111011111) , 0 , 0 , 3 , 141 ), // #22 - INST(Autibsp , BaseOp , (0b11010101000000110010001111111111) , 0 , 0 , 4 , 151 ), // #23 - INST(Autibz , BaseOp , (0b11010101000000110010001111011111) , 0 , 0 , 5 , 159 ), // #24 - INST(Autiza , BaseR , (0b11011010110000010011001111100000, kX, kZR, 0) , kRWI_X , 0 , 2 , 166 ), // #25 - INST(Autizb , BaseR , (0b11011010110000010011011111100000, kX, kZR, 0) , kRWI_X , 0 , 3 , 173 ), // #26 - INST(Axflag , BaseOp , (0b11010101000000000100000001011111) , 0 , 0 , 6 , 180 ), // #27 - INST(B , BaseBranchRel , (0b00010100000000000000000000000000) , 0 , F(Cond) , 0 , 1738), // #28 - INST(Bfc , BaseBfc , (0b00110011000000000000001111100000) , kRWI_X , 0 , 0 , 192 ), // #29 - INST(Bfi , BaseBfi , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 , 223 ), // #30 - INST(Bfm , BaseBfm , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 , 2514), // #31 - INST(Bfxil , BaseBfx , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 , 250 ), // #32 - INST(Bic , BaseLogical , (0b0001010001, 0b00100100, 1) , kRWI_W , 0 , 2 , 256 ), // #33 - INST(Bics , BaseLogical , (0b1101010001, 0b11100100, 1) , kRWI_W , 0 , 3 , 260 ), // #34 - INST(Bl , BaseBranchRel , (0b10010100000000000000000000000000) , 0 , 0 , 1 , 2831), // #35 - INST(Blr , BaseBranchReg , (0b11010110001111110000000000000000) , kRWI_R , 0 , 0 , 269 ), // #36 - INST(Br , BaseBranchReg , (0b11010110000111110000000000000000) , kRWI_R , 0 , 1 , 273 ), // #37 - INST(Brk , BaseOpImm , (0b11010100001000000000000000000000, 16, 5) , 0 , 0 , 0 , 276 ), // #38 - INST(Cas , BaseAtomicOp , (0b1000100010100000011111, kWX, 30, 0) , kRWI_XRX , 0 , 0 , 284 ), // #39 - INST(Casa , BaseAtomicOp , (0b1000100011100000011111, kWX, 30, 1) , kRWI_XRX , 0 , 1 , 288 ), // #40 - INST(Casab , BaseAtomicOp , (0b0000100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 2 , 293 ), // #41 - INST(Casah , BaseAtomicOp , (0b0100100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 3 , 299 ), // #42 - INST(Casal , BaseAtomicOp , (0b1000100011100000111111, kWX, 30, 1) , kRWI_XRX , 0 , 4 , 305 ), // #43 - INST(Casalb , BaseAtomicOp , (0b0000100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 5 , 311 ), // #44 - INST(Casalh , BaseAtomicOp , (0b0100100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 6 , 318 ), // #45 - INST(Casb , BaseAtomicOp , (0b0000100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 7 , 325 ), // #46 - INST(Cash , BaseAtomicOp , (0b0100100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 8 , 330 ), // #47 - INST(Casl , BaseAtomicOp , (0b1000100010100000111111, kWX, 30, 0) , kRWI_XRX , 0 , 9 , 335 ), // #48 - INST(Caslb , BaseAtomicOp , (0b0000100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 10 , 340 ), // #49 - INST(Caslh , BaseAtomicOp , (0b0100100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 11 , 346 ), // #50 - INST(Casp , BaseAtomicCasp , (0b0000100000100000011111, kWX, 30) , kRWI_XXRRX, 0 , 0 , 352 ), // #51 - INST(Caspa , BaseAtomicCasp , (0b0000100001100000011111, kWX, 30) , kRWI_XXRRX, 0 , 1 , 357 ), // #52 - INST(Caspal , BaseAtomicCasp , (0b0000100001100000111111, kWX, 30) , kRWI_XXRRX, 0 , 2 , 363 ), // #53 - INST(Caspl , BaseAtomicCasp , (0b0000100000100000111111, kWX, 30) , kRWI_XXRRX, 0 , 3 , 370 ), // #54 - INST(Cbnz , BaseBranchCmp , (0b00110101000000000000000000000000) , kRWI_R , 0 , 0 , 376 ), // #55 - INST(Cbz , BaseBranchCmp , (0b00110100000000000000000000000000) , kRWI_R , 0 , 1 , 381 ), // #56 - INST(Ccmn , BaseCCmp , (0b00111010010000000000000000000000) , kRWI_R , 0 , 0 , 385 ), // #57 - INST(Ccmp , BaseCCmp , (0b01111010010000000000000000000000) , kRWI_R , 0 , 1 , 650 ), // #58 - INST(Cfinv , BaseOp , (0b11010101000000000100000000011111) , 0 , 0 , 7 , 390 ), // #59 - INST(Cinc , BaseCInc , (0b00011010100000000000010000000000) , kRWI_W , 0 , 0 , 396 ), // #60 - INST(Cinv , BaseCInc , (0b01011010100000000000000000000000) , kRWI_W , 0 , 1 , 401 ), // #61 - INST(Clrex , BaseOpImm , (0b11010101000000110011000001011111, 4, 8) , 0 , 0 , 1 , 406 ), // #62 - INST(Cls , BaseRR , (0b01011010110000000001010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 4 , 412 ), // #63 - INST(Clz , BaseRR , (0b01011010110000000001000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 5 , 416 ), // #64 - INST(Cmn , BaseCmpCmn , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_R , 0 , 0 , 386 ), // #65 - INST(Cmp , BaseCmpCmn , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_R , 0 , 1 , 651 ), // #66 - INST(Cmpp , BaseRR , (0b10111010110000000000000000011111, kX, kSP, 5, kX, kSP, 16, true) , kRWI_R , 0 , 6 , 430 ), // #67 - INST(Cneg , BaseCInc , (0b01011010100000000000010000000000) , kRWI_W , 0 , 2 , 441 ), // #68 - INST(Crc32b , BaseRRR , (0b0001101011000000010000, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 2 , 450 ), // #69 - INST(Crc32cb , BaseRRR , (0b0001101011000000010100, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 3 , 457 ), // #70 - INST(Crc32ch , BaseRRR , (0b0001101011000000010101, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 4 , 465 ), // #71 - INST(Crc32cw , BaseRRR , (0b0001101011000000010110, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 5 , 473 ), // #72 - INST(Crc32cx , BaseRRR , (0b1001101011000000010111, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 6 , 481 ), // #73 - INST(Crc32h , BaseRRR , (0b0001101011000000010001, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 7 , 489 ), // #74 - INST(Crc32w , BaseRRR , (0b0001101011000000010010, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 8 , 496 ), // #75 - INST(Crc32x , BaseRRR , (0b1001101011000000010011, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 9 , 503 ), // #76 - INST(Csdb , BaseOp , (0b11010101000000110010001010011111) , 0 , 0 , 8 , 510 ), // #77 - INST(Csel , BaseCSel , (0b00011010100000000000000000000000) , kRWI_W , 0 , 0 , 710 ), // #78 - INST(Cset , BaseCSet , (0b00011010100111110000011111100000) , kRWI_W , 0 , 0 , 515 ), // #79 - INST(Csetm , BaseCSet , (0b01011010100111110000001111100000) , kRWI_W , 0 , 1 , 520 ), // #80 - INST(Csinc , BaseCSel , (0b00011010100000000000010000000000) , kRWI_W , 0 , 1 , 526 ), // #81 - INST(Csinv , BaseCSel , (0b01011010100000000000000000000000) , kRWI_W , 0 , 2 , 532 ), // #82 - INST(Csneg , BaseCSel , (0b01011010100000000000010000000000) , kRWI_W , 0 , 3 , 538 ), // #83 - INST(Dc , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, true) , kRWI_RX , 0 , 1 , 2 ), // #84 - INST(Dcps1 , BaseOpImm , (0b11010100101000000000000000000001, 16, 5) , 0 , 0 , 2 , 544 ), // #85 - INST(Dcps2 , BaseOpImm , (0b11010100101000000000000000000010, 16, 5) , 0 , 0 , 3 , 550 ), // #86 - INST(Dcps3 , BaseOpImm , (0b11010100101000000000000000000011, 16, 5) , 0 , 0 , 4 , 556 ), // #87 - INST(Dgh , BaseOp , (0b11010101000000110010000011011111) , 0 , 0 , 9 , 562 ), // #88 - INST(Dmb , BaseOpImm , (0b11010101000000110011000010111111, 4, 8) , 0 , 0 , 5 , 566 ), // #89 - INST(Drps , BaseOp , (0b11010110101111110000001111100000) , 0 , 0 , 10 , 570 ), // #90 - INST(Dsb , BaseOpImm , (0b11010101000000110011000010011111, 4, 8) , 0 , 0 , 6 , 575 ), // #91 - INST(Eon , BaseLogical , (0b1001010001, 0b10100100, 1) , kRWI_W , 0 , 4 , 583 ), // #92 - INST(Eor , BaseLogical , (0b1001010000, 0b10100100, 0) , kRWI_W , 0 , 5 , 1418), // #93 - INST(Esb , BaseOp , (0b11010101000000110010001000011111) , 0 , 0 , 11 , 597 ), // #94 - INST(Extr , BaseExtract , (0b00010011100000000000000000000000) , kRWI_W , 0 , 0 , 605 ), // #95 - INST(Eret , BaseOp , (0b11010110100111110000001111100000) , 0 , 0 , 12 , 592 ), // #96 - INST(Gmi , BaseRRR , (0b1001101011000000000101, kX , kZR, kX , kSP, kX , kZR, true) , kRWI_W , 0 , 10 , 1128), // #97 - INST(Hint , BaseOpImm , (0b11010101000000110010000000011111, 7, 5) , 0 , 0 , 7 , 1132), // #98 - INST(Hlt , BaseOpImm , (0b11010100010000000000000000000000, 16, 5) , 0 , 0 , 8 , 1137), // #99 - INST(Hvc , BaseOpImm , (0b11010100000000000000000000000010, 16, 5) , 0 , 0 , 9 , 1141), // #100 - INST(Ic , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, false) , kRWI_RX , 0 , 2 , 257 ), // #101 - INST(Isb , BaseOpImm , (0b11010101000000110011000011011111, 4, 8) , 0 , 0 , 10 , 1149), // #102 - INST(Ldadd , BaseAtomicOp , (0b1011100000100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 12 , 1189), // #103 - INST(Ldadda , BaseAtomicOp , (0b1011100010100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 13 , 1195), // #104 - INST(Ldaddab , BaseAtomicOp , (0b0011100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 14 , 1202), // #105 - INST(Ldaddah , BaseAtomicOp , (0b0111100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 15 , 1210), // #106 - INST(Ldaddal , BaseAtomicOp , (0b1011100011100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 16 , 1218), // #107 - INST(Ldaddalb , BaseAtomicOp , (0b0011100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 17 , 1226), // #108 - INST(Ldaddalh , BaseAtomicOp , (0b0111100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 18 , 1235), // #109 - INST(Ldaddb , BaseAtomicOp , (0b0011100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 19 , 1244), // #110 - INST(Ldaddh , BaseAtomicOp , (0b0111100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 20 , 1251), // #111 - INST(Ldaddl , BaseAtomicOp , (0b1011100001100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 21 , 1258), // #112 - INST(Ldaddlb , BaseAtomicOp , (0b0011100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 22 , 1265), // #113 - INST(Ldaddlh , BaseAtomicOp , (0b0111100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 23 , 1273), // #114 - INST(Ldar , BaseRM_NoImm , (0b1000100011011111111111, kWX, kZR, 30) , kRWI_W , 0 , 0 , 1281), // #115 - INST(Ldarb , BaseRM_NoImm , (0b0000100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 1 , 1286), // #116 - INST(Ldarh , BaseRM_NoImm , (0b0100100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 2 , 1292), // #117 - INST(Ldaxp , BaseLdxp , (0b1000100001111111100000, kWX, 30) , kRWI_WW , 0 , 0 , 1298), // #118 - INST(Ldaxr , BaseRM_NoImm , (0b1000100001011111111111, kWX, kZR, 30) , kRWI_W , 0 , 3 , 1304), // #119 - INST(Ldaxrb , BaseRM_NoImm , (0b0000100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 4 , 1310), // #120 - INST(Ldaxrh , BaseRM_NoImm , (0b0100100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 5 , 1317), // #121 - INST(Ldclr , BaseAtomicOp , (0b1011100000100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 24 , 1324), // #122 - INST(Ldclra , BaseAtomicOp , (0b1011100010100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 25 , 1330), // #123 - INST(Ldclrab , BaseAtomicOp , (0b0011100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 26 , 1337), // #124 - INST(Ldclrah , BaseAtomicOp , (0b0111100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 27 , 1345), // #125 - INST(Ldclral , BaseAtomicOp , (0b1011100011100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 28 , 1353), // #126 - INST(Ldclralb , BaseAtomicOp , (0b0011100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 29 , 1361), // #127 - INST(Ldclralh , BaseAtomicOp , (0b0111100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 30 , 1370), // #128 - INST(Ldclrb , BaseAtomicOp , (0b0011100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 31 , 1379), // #129 - INST(Ldclrh , BaseAtomicOp , (0b0111100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 32 , 1386), // #130 - INST(Ldclrl , BaseAtomicOp , (0b1011100001100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 33 , 1393), // #131 - INST(Ldclrlb , BaseAtomicOp , (0b0011100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 34 , 1400), // #132 - INST(Ldclrlh , BaseAtomicOp , (0b0111100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 35 , 1408), // #133 - INST(Ldeor , BaseAtomicOp , (0b1011100000100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 36 , 1416), // #134 - INST(Ldeora , BaseAtomicOp , (0b1011100010100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 37 , 1422), // #135 - INST(Ldeorab , BaseAtomicOp , (0b0011100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 38 , 1429), // #136 - INST(Ldeorah , BaseAtomicOp , (0b0111100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 39 , 1437), // #137 - INST(Ldeoral , BaseAtomicOp , (0b1011100011100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 40 , 1445), // #138 - INST(Ldeoralb , BaseAtomicOp , (0b0011100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 41 , 1453), // #139 - INST(Ldeoralh , BaseAtomicOp , (0b0111100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 42 , 1462), // #140 - INST(Ldeorb , BaseAtomicOp , (0b0011100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 43 , 1471), // #141 - INST(Ldeorh , BaseAtomicOp , (0b0111100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 44 , 1478), // #142 - INST(Ldeorl , BaseAtomicOp , (0b1011100001100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 45 , 1485), // #143 - INST(Ldeorlb , BaseAtomicOp , (0b0011100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 46 , 1492), // #144 - INST(Ldeorlh , BaseAtomicOp , (0b0111100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 47 , 1500), // #145 - INST(Ldg , BaseRM_SImm9 , (0b1101100101100000000000, 0b0000000000000000000000, kX , kZR, 0, 4) , kRWI_W , 0 , 0 , 1508), // #146 - INST(Ldgm , BaseRM_NoImm , (0b1101100111100000000000, kX , kZR, 0 ) , kRWI_W , 0 , 6 , 1512), // #147 - INST(Ldlar , BaseRM_NoImm , (0b1000100011011111011111, kWX, kZR, 30) , kRWI_W , 0 , 7 , 1517), // #148 - INST(Ldlarb , BaseRM_NoImm , (0b0000100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 8 , 1523), // #149 - INST(Ldlarh , BaseRM_NoImm , (0b0100100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 9 , 1530), // #150 - INST(Ldnp , BaseLdpStp , (0b0010100001, 0 , kWX, 31, 2) , kRWI_WW , 0 , 0 , 1537), // #151 - INST(Ldp , BaseLdpStp , (0b0010100101, 0b0010100011, kWX, 31, 2) , kRWI_W , 0 , 1 , 1542), // #152 - INST(Ldpsw , BaseLdpStp , (0b0110100101, 0b0110100011, kX , 0 , 2) , kRWI_WW , 0 , 2 , 1546), // #153 - INST(Ldr , BaseLdSt , (0b1011100101, 0b10111000010, 0b10111000011, 0b00011000, kWX, 30, 2, Inst::kIdLdur) , kRWI_W , 0 , 0 , 1552), // #154 - INST(Ldraa , BaseRM_SImm10 , (0b1111100000100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 0 , 1556), // #155 - INST(Ldrab , BaseRM_SImm10 , (0b1111100010100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 1 , 1562), // #156 - INST(Ldrb , BaseLdSt , (0b0011100101, 0b00111000010, 0b00111000011, 0 , kW , 0 , 0, Inst::kIdLdurb) , kRWI_W , 0 , 1 , 1568), // #157 - INST(Ldrh , BaseLdSt , (0b0111100101, 0b01111000010, 0b01111000011, 0 , kW , 0 , 1, Inst::kIdLdurh) , kRWI_W , 0 , 2 , 1573), // #158 - INST(Ldrsb , BaseLdSt , (0b0011100111, 0b00111000100, 0b00111000101, 0 , kWX, 22, 0, Inst::kIdLdursb) , kRWI_W , 0 , 3 , 1578), // #159 - INST(Ldrsh , BaseLdSt , (0b0111100110, 0b01111000100, 0b01111000101, 0 , kWX, 22, 1, Inst::kIdLdursh) , kRWI_W , 0 , 4 , 1584), // #160 - INST(Ldrsw , BaseLdSt , (0b1011100110, 0b10111000100, 0b10111000101, 0b10011000, kX , 0 , 2, Inst::kIdLdursw) , kRWI_W , 0 , 5 , 1590), // #161 - INST(Ldset , BaseAtomicOp , (0b1011100000100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 48 , 1596), // #162 - INST(Ldseta , BaseAtomicOp , (0b1011100010100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 49 , 1602), // #163 - INST(Ldsetab , BaseAtomicOp , (0b0011100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 50 , 1609), // #164 - INST(Ldsetah , BaseAtomicOp , (0b0111100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 51 , 1617), // #165 - INST(Ldsetal , BaseAtomicOp , (0b1011100011100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 52 , 1625), // #166 - INST(Ldsetalb , BaseAtomicOp , (0b0011100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 53 , 1633), // #167 - INST(Ldsetalh , BaseAtomicOp , (0b0111100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 54 , 1642), // #168 - INST(Ldsetb , BaseAtomicOp , (0b0011100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 55 , 1651), // #169 - INST(Ldseth , BaseAtomicOp , (0b0111100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 56 , 1658), // #170 - INST(Ldsetl , BaseAtomicOp , (0b1011100001100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 57 , 1665), // #171 - INST(Ldsetlb , BaseAtomicOp , (0b0011100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 58 , 1672), // #172 - INST(Ldsetlh , BaseAtomicOp , (0b0111100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 59 , 1680), // #173 - INST(Ldsmax , BaseAtomicOp , (0b1011100000100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 60 , 1688), // #174 - INST(Ldsmaxa , BaseAtomicOp , (0b1011100010100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 61 , 1695), // #175 - INST(Ldsmaxab , BaseAtomicOp , (0b0011100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 62 , 1703), // #176 - INST(Ldsmaxah , BaseAtomicOp , (0b0111100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 63 , 1712), // #177 - INST(Ldsmaxal , BaseAtomicOp , (0b1011100011100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 64 , 1721), // #178 - INST(Ldsmaxalb , BaseAtomicOp , (0b0011100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 65 , 1730), // #179 - INST(Ldsmaxalh , BaseAtomicOp , (0b0111100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 66 , 1740), // #180 - INST(Ldsmaxb , BaseAtomicOp , (0b0011100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 67 , 1750), // #181 - INST(Ldsmaxh , BaseAtomicOp , (0b0111100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 68 , 1758), // #182 - INST(Ldsmaxl , BaseAtomicOp , (0b1011100001100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 69 , 1766), // #183 - INST(Ldsmaxlb , BaseAtomicOp , (0b0011100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 70 , 1774), // #184 - INST(Ldsmaxlh , BaseAtomicOp , (0b0111100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 71 , 1783), // #185 - INST(Ldsmin , BaseAtomicOp , (0b1011100000100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 72 , 1792), // #186 - INST(Ldsmina , BaseAtomicOp , (0b1011100010100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 73 , 1799), // #187 - INST(Ldsminab , BaseAtomicOp , (0b0011100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 74 , 1807), // #188 - INST(Ldsminah , BaseAtomicOp , (0b0111100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 75 , 1816), // #189 - INST(Ldsminal , BaseAtomicOp , (0b1011100011100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 76 , 1825), // #190 - INST(Ldsminalb , BaseAtomicOp , (0b0011100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 77 , 1834), // #191 - INST(Ldsminalh , BaseAtomicOp , (0b0111100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 78 , 1844), // #192 - INST(Ldsminb , BaseAtomicOp , (0b0011100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 79 , 1854), // #193 - INST(Ldsminh , BaseAtomicOp , (0b0111100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 80 , 1862), // #194 - INST(Ldsminl , BaseAtomicOp , (0b1011100001100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 81 , 1870), // #195 - INST(Ldsminlb , BaseAtomicOp , (0b0011100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 82 , 1878), // #196 - INST(Ldsminlh , BaseAtomicOp , (0b0111100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 83 , 1887), // #197 - INST(Ldtr , BaseRM_SImm9 , (0b1011100001000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 1 , 1896), // #198 - INST(Ldtrb , BaseRM_SImm9 , (0b0011100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 2 , 1901), // #199 - INST(Ldtrh , BaseRM_SImm9 , (0b0111100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 3 , 1907), // #200 - INST(Ldtrsb , BaseRM_SImm9 , (0b0011100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 4 , 1913), // #201 - INST(Ldtrsh , BaseRM_SImm9 , (0b0111100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 5 , 1920), // #202 - INST(Ldtrsw , BaseRM_SImm9 , (0b1011100010000000000010, 0b0000000000000000000000, kX , kZR, 0 , 0) , kRWI_W , 0 , 6 , 1927), // #203 - INST(Ldumax , BaseAtomicOp , (0b1011100000100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 84 , 1934), // #204 - INST(Ldumaxa , BaseAtomicOp , (0b1011100010100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 85 , 1941), // #205 - INST(Ldumaxab , BaseAtomicOp , (0b0011100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 86 , 1949), // #206 - INST(Ldumaxah , BaseAtomicOp , (0b0111100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 87 , 1958), // #207 - INST(Ldumaxal , BaseAtomicOp , (0b1011100011100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 88 , 1967), // #208 - INST(Ldumaxalb , BaseAtomicOp , (0b0011100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 89 , 1976), // #209 - INST(Ldumaxalh , BaseAtomicOp , (0b0111100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 90 , 1986), // #210 - INST(Ldumaxb , BaseAtomicOp , (0b0011100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 91 , 1996), // #211 - INST(Ldumaxh , BaseAtomicOp , (0b0111100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 92 , 2004), // #212 - INST(Ldumaxl , BaseAtomicOp , (0b1011100001100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 93 , 2012), // #213 - INST(Ldumaxlb , BaseAtomicOp , (0b0011100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 94 , 2020), // #214 - INST(Ldumaxlh , BaseAtomicOp , (0b0111100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 95 , 2029), // #215 - INST(Ldumin , BaseAtomicOp , (0b1011100000100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 96 , 2038), // #216 - INST(Ldumina , BaseAtomicOp , (0b1011100010100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 97 , 2045), // #217 - INST(Lduminab , BaseAtomicOp , (0b0011100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 98 , 2053), // #218 - INST(Lduminah , BaseAtomicOp , (0b0111100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 99 , 2062), // #219 - INST(Lduminal , BaseAtomicOp , (0b1011100011100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 100, 2071), // #220 - INST(Lduminalb , BaseAtomicOp , (0b0011100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 101, 2080), // #221 - INST(Lduminalh , BaseAtomicOp , (0b0111100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 102, 2090), // #222 - INST(Lduminb , BaseAtomicOp , (0b0011100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 103, 2100), // #223 - INST(Lduminh , BaseAtomicOp , (0b0111100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 104, 2108), // #224 - INST(Lduminl , BaseAtomicOp , (0b1011100001100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 105, 2116), // #225 - INST(Lduminlb , BaseAtomicOp , (0b0011100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 106, 2124), // #226 - INST(Lduminlh , BaseAtomicOp , (0b0111100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 107, 2133), // #227 - INST(Ldur , BaseRM_SImm9 , (0b1011100001000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 7 , 2142), // #228 - INST(Ldurb , BaseRM_SImm9 , (0b0011100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 8 , 2147), // #229 - INST(Ldurh , BaseRM_SImm9 , (0b0111100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 9 , 2153), // #230 - INST(Ldursb , BaseRM_SImm9 , (0b0011100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 10 , 2159), // #231 - INST(Ldursh , BaseRM_SImm9 , (0b0111100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 11 , 2166), // #232 - INST(Ldursw , BaseRM_SImm9 , (0b1011100010000000000000, 0b0000000000000000000000, kWX, kZR, 0 , 0) , kRWI_W , 0 , 12 , 2173), // #233 - INST(Ldxp , BaseLdxp , (0b1000100001111111000000, kWX, 30) , kRWI_WW , 0 , 1 , 2180), // #234 - INST(Ldxr , BaseRM_NoImm , (0b1000100001011111011111, kWX, kZR, 30) , kRWI_W , 0 , 10 , 2185), // #235 - INST(Ldxrb , BaseRM_NoImm , (0b0000100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 11 , 2190), // #236 - INST(Ldxrh , BaseRM_NoImm , (0b0100100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 12 , 2196), // #237 - INST(Lsl , BaseShift , (0b0001101011000000001000, 0b0101001100000000000000, 0) , kRWI_W , 0 , 2 , 2880), // #238 - INST(Lslv , BaseShift , (0b0001101011000000001000, 0b0000000000000000000000, 0) , kRWI_W , 0 , 3 , 2202), // #239 - INST(Lsr , BaseShift , (0b0001101011000000001001, 0b0101001100000000011111, 0) , kRWI_W , 0 , 4 , 2207), // #240 - INST(Lsrv , BaseShift , (0b0001101011000000001001, 0b0000000000000000000000, 0) , kRWI_W , 0 , 5 , 2211), // #241 - INST(Madd , BaseRRRR , (0b0001101100000000000000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 , 977 ), // #242 - INST(Mneg , BaseRRR , (0b0001101100000000111111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 11 , 2216), // #243 - INST(Mov , BaseMov , (_) , kRWI_W , 0 , 0 , 949 ), // #244 - INST(Movk , BaseMovKNZ , (0b01110010100000000000000000000000) , kRWI_X , 0 , 0 , 2226), // #245 - INST(Movn , BaseMovKNZ , (0b00010010100000000000000000000000) , kRWI_W , 0 , 1 , 2231), // #246 - INST(Movz , BaseMovKNZ , (0b01010010100000000000000000000000) , kRWI_W , 0 , 2 , 2236), // #247 - INST(Mrs , BaseMrs , (_) , kRWI_W , 0 , 0 , 2241), // #248 - INST(Msr , BaseMsr , (_) , kRWI_W , 0 , 0 , 2245), // #249 - INST(Msub , BaseRRRR , (0b0001101100000000100000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 , 984 ), // #250 - INST(Mul , BaseRRR , (0b0001101100000000011111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 12 , 991 ), // #251 - INST(Mvn , BaseMvnNeg , (0b00101010001000000000001111100000) , kRWI_W , 0 , 0 , 2249), // #252 - INST(Neg , BaseMvnNeg , (0b01001011000000000000001111100000) , kRWI_W , 0 , 1 , 540 ), // #253 - INST(Negs , BaseMvnNeg , (0b01101011000000000000001111100000) , kRWI_W , 0 , 2 , 2258), // #254 - INST(Ngc , BaseRR , (0b01011010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 7 , 2263), // #255 - INST(Ngcs , BaseRR , (0b01111010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 8 , 2267), // #256 - INST(Nop , BaseOp , (0b11010101000000110010000000011111) , 0 , 0 , 13 , 2272), // #257 - INST(Orn , BaseLogical , (0b0101010001, 0b01100100, 1) , kRWI_W , 0 , 6 , 2280), // #258 - INST(Orr , BaseLogical , (0b0101010000, 0b01100100, 0) , kRWI_W , 0 , 7 , 2284), // #259 - INST(Pacda , BaseRR , (0b11011010110000010000100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 9 , 2288), // #260 - INST(Pacdb , BaseRR , (0b11011010110000010000110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 10 , 2294), // #261 - INST(Pacdza , BaseR , (0b11011010110000010010101111100000, kX, kZR, 0) , kRWI_X , 0 , 4 , 2300), // #262 - INST(Pacdzb , BaseR , (0b11011010110000010010111111100000, kX, kZR, 0) , kRWI_X , 0 , 5 , 2307), // #263 - INST(Pacga , BaseRRR , (0b1001101011000000001100, kX, kZR, kX, kZR, kX, kSP, false) , kRWI_W , 0 , 13 , 2314), // #264 - INST(Pssbb , BaseOp , (0b11010101000000110011010010011111) , 0 , 0 , 14 , 2338), // #265 - INST(Rbit , BaseRR , (0b01011010110000000000000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 11 , 2364), // #266 - INST(Ret , BaseBranchReg , (0b11010110010111110000000000000000) , kRWI_R , 0 , 2 , 593 ), // #267 - INST(Rev , BaseRev , (_) , kRWI_W , 0 , 0 , 2369), // #268 - INST(Rev16 , BaseRR , (0b01011010110000000000010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 12 , 2373), // #269 - INST(Rev32 , BaseRR , (0b11011010110000000000100000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 13 , 2379), // #270 - INST(Rev64 , BaseRR , (0b11011010110000000000110000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 14 , 2385), // #271 - INST(Ror , BaseShift , (0b0001101011000000001011, 0b0001001110000000000000, 1) , kRWI_W , 0 , 6 , 2391), // #272 - INST(Rorv , BaseShift , (0b0001101011000000001011, 0b0000000000000000000000, 1) , kRWI_W , 0 , 7 , 2395), // #273 - INST(Sbc , BaseRRR , (0b0101101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 14 , 2498), // #274 - INST(Sbcs , BaseRRR , (0b0111101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 15 , 2502), // #275 - INST(Sbfiz , BaseBfi , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 , 2507), // #276 - INST(Sbfm , BaseBfm , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 , 2513), // #277 - INST(Sbfx , BaseBfx , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 , 2518), // #278 - INST(Sdiv , BaseRRR , (0b0001101011000000000011, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 16 , 2529), // #279 - INST(Setf8 , BaseR , (0b00111010000000000000100000001101, kW, kZR, 5) , 0 , 0 , 6 , 2541), // #280 - INST(Setf16 , BaseR , (0b00111010000000000100100000001101, kW, kZR, 5) , 0 , 0 , 7 , 2534), // #281 - INST(Sev , BaseOp , (0b11010101000000110010000010011111) , 0 , 0 , 15 , 2547), // #282 - INST(Sevl , BaseOp , (0b11010101000000110010000010111111) , 0 , 0 , 16 , 2551), // #283 - INST(Smaddl , BaseRRRR , (0b1001101100100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 2 , 2758), // #284 - INST(Smc , BaseOpImm , (0b11010100000000000000000000000011, 16, 5) , 0 , 0 , 11 , 53 ), // #285 - INST(Smnegl , BaseRRR , (0b1001101100100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 17 , 2815), // #286 - INST(Smsubl , BaseRRRR , (0b1001101100100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 3 , 2827), // #287 - INST(Smulh , BaseRRR , (0b1001101101000000011111, kX , kZR, kX , kZR, kX , kZR, true) , kRWI_W , 0 , 18 , 2834), // #288 - INST(Smull , BaseRRR , (0b1001101100100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 19 , 2840), // #289 - INST(Ssbb , BaseOp , (0b11010101000000110011000010011111) , 0 , 0 , 17 , 2339), // #290 - INST(St2g , BaseRM_SImm9 , (0b1101100110100000000010, 0b1101100110100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 13 , 3164), // #291 - INST(Stadd , BaseAtomicSt , (0b1011100000100000000000, kWX, 30) , kRWI_RX , 0 , 0 , 3177), // #292 - INST(Staddl , BaseAtomicSt , (0b1011100001100000000000, kWX, 30) , kRWI_RX , 0 , 1 , 3197), // #293 - INST(Staddb , BaseAtomicSt , (0b0011100000100000000000, kW , 0 ) , kRWI_RX , 0 , 2 , 3183), // #294 - INST(Staddlb , BaseAtomicSt , (0b0011100001100000000000, kW , 0 ) , kRWI_RX , 0 , 3 , 3204), // #295 - INST(Staddh , BaseAtomicSt , (0b0111100000100000000000, kW , 0 ) , kRWI_RX , 0 , 4 , 3190), // #296 - INST(Staddlh , BaseAtomicSt , (0b0111100001100000000000, kW , 0 ) , kRWI_RX , 0 , 5 , 3212), // #297 - INST(Stclr , BaseAtomicSt , (0b1011100000100000000100, kWX, 30) , kRWI_RX , 0 , 6 , 3220), // #298 - INST(Stclrl , BaseAtomicSt , (0b1011100001100000000100, kWX, 30) , kRWI_RX , 0 , 7 , 3240), // #299 - INST(Stclrb , BaseAtomicSt , (0b0011100000100000000100, kW , 0 ) , kRWI_RX , 0 , 8 , 3226), // #300 - INST(Stclrlb , BaseAtomicSt , (0b0011100001100000000100, kW , 0 ) , kRWI_RX , 0 , 9 , 3247), // #301 - INST(Stclrh , BaseAtomicSt , (0b0111100000100000000100, kW , 0 ) , kRWI_RX , 0 , 10 , 3233), // #302 - INST(Stclrlh , BaseAtomicSt , (0b0111100001100000000100, kW , 0 ) , kRWI_RX , 0 , 11 , 3255), // #303 - INST(Steor , BaseAtomicSt , (0b1011100000100000001000, kWX, 30) , kRWI_RX , 0 , 12 , 3263), // #304 - INST(Steorl , BaseAtomicSt , (0b1011100001100000001000, kWX, 30) , kRWI_RX , 0 , 13 , 3283), // #305 - INST(Steorb , BaseAtomicSt , (0b0011100000100000001000, kW , 0 ) , kRWI_RX , 0 , 14 , 3269), // #306 - INST(Steorlb , BaseAtomicSt , (0b0011100001100000001000, kW , 0 ) , kRWI_RX , 0 , 15 , 3290), // #307 - INST(Steorh , BaseAtomicSt , (0b0111100000100000001000, kW , 0 ) , kRWI_RX , 0 , 16 , 3276), // #308 - INST(Steorlh , BaseAtomicSt , (0b0111100001100000001000, kW , 0 ) , kRWI_RX , 0 , 17 , 3298), // #309 - INST(Stg , BaseRM_SImm9 , (0b1101100100100000000010, 0b1101100100100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 14 , 3306), // #310 - INST(Stgm , BaseRM_NoImm , (0b1101100110100000000000, kX , kZR, 0 ) , kRWI_RW , 0 , 13 , 3310), // #311 - INST(Stgp , BaseLdpStp , (0b0110100100, 0b0110100010, kX, 0, 4) , kRWI_RRW , 0 , 3 , 3315), // #312 - INST(Stllr , BaseRM_NoImm , (0b1000100010011111011111, kWX, kZR, 30) , kRWI_RW , 0 , 14 , 3320), // #313 - INST(Stllrb , BaseRM_NoImm , (0b0000100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 15 , 3326), // #314 - INST(Stllrh , BaseRM_NoImm , (0b0100100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 16 , 3333), // #315 - INST(Stlr , BaseRM_NoImm , (0b1000100010011111111111, kWX, kZR, 30) , kRWI_RW , 0 , 17 , 3340), // #316 - INST(Stlrb , BaseRM_NoImm , (0b0000100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 18 , 3345), // #317 - INST(Stlrh , BaseRM_NoImm , (0b0100100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 19 , 3351), // #318 - INST(Stlxp , BaseStxp , (0b1000100000100000100000, kWX, 30) , kRWI_WRRX , 0 , 0 , 3357), // #319 - INST(Stlxr , BaseAtomicOp , (0b1000100000000000111111, kWX, 30, 1) , kRWI_WRX , 0 , 108, 3363), // #320 - INST(Stlxrb , BaseAtomicOp , (0b0000100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 109, 3369), // #321 - INST(Stlxrh , BaseAtomicOp , (0b0100100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 110, 3376), // #322 - INST(Stnp , BaseLdpStp , (0b0010100000, 0 , kWX, 31, 2) , kRWI_RRW , 0 , 4 , 3383), // #323 - INST(Stp , BaseLdpStp , (0b0010100100, 0b0010100010, kWX, 31, 2) , kRWI_RRW , 0 , 5 , 3388), // #324 - INST(Str , BaseLdSt , (0b1011100100, 0b10111000000, 0b10111000001, 0 , kWX, 30, 2, Inst::kIdStur) , kRWI_RW , 0 , 6 , 3392), // #325 - INST(Strb , BaseLdSt , (0b0011100100, 0b00111000000, 0b00111000001, 0 , kW , 30, 0, Inst::kIdSturb) , kRWI_RW , 0 , 7 , 3396), // #326 - INST(Strh , BaseLdSt , (0b0111100100, 0b01111000000, 0b01111000001, 0 , kWX, 30, 1, Inst::kIdSturh) , kRWI_RW , 0 , 8 , 3401), // #327 - INST(Stset , BaseAtomicSt , (0b1011100000100000001100, kWX, 30) , kRWI_RX , 0 , 18 , 3406), // #328 - INST(Stsetl , BaseAtomicSt , (0b1011100001100000001100, kWX, 30) , kRWI_RX , 0 , 19 , 3426), // #329 - INST(Stsetb , BaseAtomicSt , (0b0011100000100000001100, kW , 0 ) , kRWI_RX , 0 , 20 , 3412), // #330 - INST(Stsetlb , BaseAtomicSt , (0b0011100001100000001100, kW , 0 ) , kRWI_RX , 0 , 21 , 3433), // #331 - INST(Stseth , BaseAtomicSt , (0b0111100000100000001100, kW , 0 ) , kRWI_RX , 0 , 22 , 3419), // #332 - INST(Stsetlh , BaseAtomicSt , (0b0111100001100000001100, kW , 0 ) , kRWI_RX , 0 , 23 , 3441), // #333 - INST(Stsmax , BaseAtomicSt , (0b1011100000100000010000, kWX, 30) , kRWI_RX , 0 , 24 , 3449), // #334 - INST(Stsmaxl , BaseAtomicSt , (0b1011100001100000010000, kWX, 30) , kRWI_RX , 0 , 25 , 3472), // #335 - INST(Stsmaxb , BaseAtomicSt , (0b0011100000100000010000, kW , 0 ) , kRWI_RX , 0 , 26 , 3456), // #336 - INST(Stsmaxlb , BaseAtomicSt , (0b0011100001100000010000, kW , 0 ) , kRWI_RX , 0 , 27 , 3480), // #337 - INST(Stsmaxh , BaseAtomicSt , (0b0111100000100000010000, kW , 0 ) , kRWI_RX , 0 , 28 , 3464), // #338 - INST(Stsmaxlh , BaseAtomicSt , (0b0111100001100000010000, kW , 0 ) , kRWI_RX , 0 , 29 , 3489), // #339 - INST(Stsmin , BaseAtomicSt , (0b1011100000100000010100, kWX, 30) , kRWI_RX , 0 , 30 , 3498), // #340 - INST(Stsminl , BaseAtomicSt , (0b1011100001100000010100, kWX, 30) , kRWI_RX , 0 , 31 , 3521), // #341 - INST(Stsminb , BaseAtomicSt , (0b0011100000100000010100, kW , 0 ) , kRWI_RX , 0 , 32 , 3505), // #342 - INST(Stsminlb , BaseAtomicSt , (0b0011100001100000010100, kW , 0 ) , kRWI_RX , 0 , 33 , 3529), // #343 - INST(Stsminh , BaseAtomicSt , (0b0111100000100000010100, kW , 0 ) , kRWI_RX , 0 , 34 , 3513), // #344 - INST(Stsminlh , BaseAtomicSt , (0b0111100001100000010100, kW , 0 ) , kRWI_RX , 0 , 35 , 3538), // #345 - INST(Sttr , BaseRM_SImm9 , (0b1011100000000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 15 , 3547), // #346 - INST(Sttrb , BaseRM_SImm9 , (0b0011100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 16 , 3552), // #347 - INST(Sttrh , BaseRM_SImm9 , (0b0111100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 17 , 3558), // #348 - INST(Stumax , BaseAtomicSt , (0b1011100000100000011000, kWX, 30) , kRWI_RX , 0 , 36 , 3564), // #349 - INST(Stumaxl , BaseAtomicSt , (0b1011100001100000011000, kWX, 30) , kRWI_RX , 0 , 37 , 3587), // #350 - INST(Stumaxb , BaseAtomicSt , (0b0011100000100000011000, kW , 0 ) , kRWI_RX , 0 , 38 , 3571), // #351 - INST(Stumaxlb , BaseAtomicSt , (0b0011100001100000011000, kW , 0 ) , kRWI_RX , 0 , 39 , 3595), // #352 - INST(Stumaxh , BaseAtomicSt , (0b0111100000100000011000, kW , 0 ) , kRWI_RX , 0 , 40 , 3579), // #353 - INST(Stumaxlh , BaseAtomicSt , (0b0111100001100000011000, kW , 0 ) , kRWI_RX , 0 , 41 , 3604), // #354 - INST(Stumin , BaseAtomicSt , (0b1011100000100000011100, kWX, 30) , kRWI_RX , 0 , 42 , 3613), // #355 - INST(Stuminl , BaseAtomicSt , (0b1011100001100000011100, kWX, 30) , kRWI_RX , 0 , 43 , 3636), // #356 - INST(Stuminb , BaseAtomicSt , (0b0011100000100000011100, kW , 0 ) , kRWI_RX , 0 , 44 , 3620), // #357 - INST(Stuminlb , BaseAtomicSt , (0b0011100001100000011100, kW , 0 ) , kRWI_RX , 0 , 45 , 3644), // #358 - INST(Stuminh , BaseAtomicSt , (0b0111100000100000011100, kW , 0 ) , kRWI_RX , 0 , 46 , 3628), // #359 - INST(Stuminlh , BaseAtomicSt , (0b0111100001100000011100, kW , 0 ) , kRWI_RX , 0 , 47 , 3653), // #360 - INST(Stur , BaseRM_SImm9 , (0b1011100000000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 18 , 3662), // #361 - INST(Sturb , BaseRM_SImm9 , (0b0011100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 19 , 3667), // #362 - INST(Sturh , BaseRM_SImm9 , (0b0111100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 20 , 3673), // #363 - INST(Stxp , BaseStxp , (0b1000100000100000000000, kWX, 30) , kRWI_WRRW , 0 , 1 , 3679), // #364 - INST(Stxr , BaseStx , (0b1000100000000000011111, kWX, 30) , kRWI_WRW , 0 , 0 , 3684), // #365 - INST(Stxrb , BaseStx , (0b0000100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 1 , 3689), // #366 - INST(Stxrh , BaseStx , (0b0100100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 2 , 3695), // #367 - INST(Stz2g , BaseRM_SImm9 , (0b1101100111100000000010, 0b1101100111100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 21 , 3701), // #368 - INST(Stzg , BaseRM_SImm9 , (0b1101100101100000000010, 0b1101100101100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 22 , 3707), // #369 - INST(Stzgm , BaseRM_NoImm , (0b1101100100100000000000, kX , kZR, 0) , kRWI_RW , 0 , 20 , 3712), // #370 - INST(Sub , BaseAddSub , (0b1001011000, 0b1001011001, 0b1010001) , kRWI_X , 0 , 2 , 985 ), // #371 - INST(Subg , BaseRRII , (0b1101000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 1 , 3718), // #372 - INST(Subp , BaseRRR , (0b1001101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 20 , 3723), // #373 - INST(Subps , BaseRRR , (0b1011101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 21 , 3728), // #374 - INST(Subs , BaseAddSub , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_X , 0 , 3 , 3734), // #375 - INST(Svc , BaseOpImm , (0b11010100000000000000000000000001, 16, 5) , 0 , 0 , 12 , 3752), // #376 - INST(Swp , BaseAtomicOp , (0b1011100000100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 111, 3756), // #377 - INST(Swpa , BaseAtomicOp , (0b1011100010100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 112, 3760), // #378 - INST(Swpab , BaseAtomicOp , (0b0011100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 113, 3765), // #379 - INST(Swpah , BaseAtomicOp , (0b0111100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 114, 3771), // #380 - INST(Swpal , BaseAtomicOp , (0b1011100011100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 115, 3777), // #381 - INST(Swpalb , BaseAtomicOp , (0b0011100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 116, 3783), // #382 - INST(Swpalh , BaseAtomicOp , (0b0111100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 117, 3790), // #383 - INST(Swpb , BaseAtomicOp , (0b0011100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 118, 3797), // #384 - INST(Swph , BaseAtomicOp , (0b0111100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 119, 3802), // #385 - INST(Swpl , BaseAtomicOp , (0b1011100001100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 120, 3807), // #386 - INST(Swplb , BaseAtomicOp , (0b0011100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 121, 3812), // #387 - INST(Swplh , BaseAtomicOp , (0b0111100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 122, 3818), // #388 - INST(Sxtb , BaseExtend , (0b0001001100000000000111, kWX, 0) , kRWI_W , 0 , 0 , 3824), // #389 - INST(Sxth , BaseExtend , (0b0001001100000000001111, kWX, 0) , kRWI_W , 0 , 1 , 3829), // #390 - INST(Sxtw , BaseExtend , (0b1001001101000000011111, kX , 0) , kRWI_W , 0 , 2 , 3845), // #391 - INST(Sys , BaseSys , (_) , kRWI_W , 0 , 0 , 3850), // #392 - INST(Tlbi , BaseAtDcIcTlbi , (0b00011110000000, 0b00010000000000, false) , kRWI_RX , 0 , 3 , 3871), // #393 - INST(Tst , BaseTst , (0b1101010000, 0b111001000) , kRWI_R , 0 , 0 , 437 ), // #394 - INST(Tbnz , BaseBranchTst , (0b00110111000000000000000000000000) , kRWI_R , 0 , 0 , 3858), // #395 - INST(Tbz , BaseBranchTst , (0b00110110000000000000000000000000) , kRWI_R , 0 , 1 , 3867), // #396 - INST(Ubfiz , BaseBfi , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 , 3969), // #397 - INST(Ubfm , BaseBfm , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 , 3975), // #398 - INST(Ubfx , BaseBfx , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 , 3980), // #399 - INST(Udf , BaseOpImm , (0b00000000000000000000000000000000, 16, 0) , 0 , 0 , 13 , 3991), // #400 - INST(Udiv , BaseRRR , (0b0001101011000000000010, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 22 , 3995), // #401 - INST(Umaddl , BaseRRRR , (0b1001101110100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 4 , 4012), // #402 - INST(Umnegl , BaseRRR , (0b1001101110100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 23 , 4075), // #403 - INST(Umull , BaseRRR , (0b1001101110100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 24 , 4100), // #404 - INST(Umulh , BaseRRR , (0b1001101111000000011111, kX , kZR, kX , kZR, kX , kZR, false) , kRWI_W , 0 , 25 , 4094), // #405 - INST(Umsubl , BaseRRRR , (0b1001101110100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 5 , 4087), // #406 - INST(Uxtb , BaseExtend , (0b0101001100000000000111, kW, 1) , kRWI_W , 0 , 3 , 4291), // #407 - INST(Uxth , BaseExtend , (0b0101001100000000001111, kW, 1) , kRWI_W , 0 , 4 , 4296), // #408 - INST(Wfe , BaseOp , (0b11010101000000110010000001011111) , 0 , 0 , 18 , 4322), // #409 - INST(Wfi , BaseOp , (0b11010101000000110010000001111111) , 0 , 0 , 19 , 4326), // #410 - INST(Xaflag , BaseOp , (0b11010101000000000100000000111111) , 0 , 0 , 20 , 4330), // #411 - INST(Xpacd , BaseR , (0b11011010110000010100011111100000, kX, kZR, 0) , kRWI_X , 0 , 8 , 4341), // #412 - INST(Xpaci , BaseR , (0b11011010110000010100001111100000, kX, kZR, 0) , kRWI_X , 0 , 9 , 4347), // #413 - INST(Xpaclri , BaseOp , (0b11010101000000110010000011111111) , kRWI_X , 0 , 21 , 4353), // #414 - INST(Yield , BaseOp , (0b11010101000000110010000000111111) , 0 , 0 , 22 , 4361), // #415 - INST(Abs_v , ISimdVV , (0b0000111000100000101110, kVO_V_Any) , kRWI_W , 0 , 0 , 2855), // #416 - INST(Add_v , ISimdVVV , (0b0000111000100000100001, kVO_V_Any) , kRWI_W , 0 , 0 , 978 ), // #417 - INST(Addhn_v , ISimdVVV , (0b0000111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 1 , 2345), // #418 - INST(Addhn2_v , ISimdVVV , (0b0100111000100000010000, kVO_V_B16H8S4) , kRWI_W , F(Narrow) , 2 , 2352), // #419 - INST(Addp_v , ISimdPair , (0b0101111000110001101110, 0b0000111000100000101111, kVO_V_Any) , kRWI_W , F(Pair) , 0 , 638 ), // #420 - INST(Addv_v , ISimdSV , (0b0000111000110001101110, kVO_V_BH_4S) , kRWI_W , 0 , 0 , 20 ), // #421 - INST(Aesd_v , ISimdVVx , (0b0100111000101000010110, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 0 , 34 ), // #422 - INST(Aese_v , ISimdVVx , (0b0100111000101000010010, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 1 , 39 ), // #423 - INST(Aesimc_v , ISimdVVx , (0b0100111000101000011110, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 2 , 44 ), // #424 - INST(Aesmc_v , ISimdVVx , (0b0100111000101000011010, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 3 , 51 ), // #425 - INST(And_v , ISimdVVV , (0b0000111000100000000111, kVO_V_B) , kRWI_W , 0 , 3 , 57 ), // #426 - INST(Bcax_v , ISimdVVVV , (0b1100111000100000000000, kVO_V_B16) , kRWI_W , 0 , 0 , 187 ), // #427 - INST(Bfcvt_v , ISimdVVx , (0b0001111001100011010000, kOp_H, kOp_S) , kRWI_W , 0 , 4 , 196 ), // #428 - INST(Bfcvtn_v , ISimdVVx , (0b0000111010100001011010, kOp_V4H, kOp_V4S) , kRWI_W , F(Narrow) , 5 , 202 ), // #429 - INST(Bfcvtn2_v , ISimdVVx , (0b0100111010100001011010, kOp_V8H, kOp_V4S) , kRWI_W , F(Narrow) , 6 , 209 ), // #430 - INST(Bfdot_v , SimdDot , (0b0010111001000000111111, 0b0000111101000000111100, kET_S, kET_H, kET_2H) , kRWI_X , 0 , 0 , 217 ), // #431 - INST(Bfmlalb_v , SimdFmlal , (0b0010111011000000111111, 0b0000111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 0 , 227 ), // #432 - INST(Bfmlalt_v , SimdFmlal , (0b0110111011000000111111, 0b0100111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 1 , 235 ), // #433 - INST(Bfmmla_v , ISimdVVVx , (0b0110111001000000111011, kOp_V4S, kOp_V8H, kOp_V8H) , kRWI_X , F(Long) , 0 , 243 ), // #434 - INST(Bic_v , SimdBicOrr , (0b0000111001100000000111, 0b0010111100000000000001) , kRWI_W , 0 , 0 , 256 ), // #435 - INST(Bif_v , ISimdVVV , (0b0010111011100000000111, kVO_V_B) , kRWI_X , 0 , 4 , 265 ), // #436 - INST(Bit_v , ISimdVVV , (0b0010111010100000000111, kVO_V_B) , kRWI_X , 0 , 5 , 2365), // #437 - INST(Bsl_v , ISimdVVV , (0b0010111001100000000111, kVO_V_B) , kRWI_X , 0 , 6 , 280 ), // #438 - INST(Cls_v , ISimdVV , (0b0000111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 1 , 412 ), // #439 - INST(Clz_v , ISimdVV , (0b0010111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 2 , 416 ), // #440 - INST(Cmeq_v , SimdCmp , (0b0010111000100000100011, 0b0000111000100000100110, kVO_V_Any) , kRWI_W , 0 , 0 , 663 ), // #441 - INST(Cmge_v , SimdCmp , (0b0000111000100000001111, 0b0010111000100000100010, kVO_V_Any) , kRWI_W , 0 , 1 , 669 ), // #442 - INST(Cmgt_v , SimdCmp , (0b0000111000100000001101, 0b0000111000100000100010, kVO_V_Any) , kRWI_W , 0 , 2 , 675 ), // #443 - INST(Cmhi_v , SimdCmp , (0b0010111000100000001101, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 3 , 420 ), // #444 - INST(Cmhs_v , SimdCmp , (0b0010111000100000001111, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 4 , 425 ), // #445 - INST(Cmle_v , SimdCmp , (0b0000000000000000000000, 0b0010111000100000100110, kVO_V_Any) , kRWI_W , 0 , 5 , 687 ), // #446 - INST(Cmlt_v , SimdCmp , (0b0000000000000000000000, 0b0000111000100000101010, kVO_V_Any) , kRWI_W , 0 , 6 , 693 ), // #447 - INST(Cmtst_v , ISimdVVV , (0b0000111000100000100011, kVO_V_Any) , kRWI_W , 0 , 7 , 435 ), // #448 - INST(Cnt_v , ISimdVV , (0b0000111000100000010110, kVO_V_B) , kRWI_W , 0 , 3 , 446 ), // #449 - INST(Dup_v , SimdDup , (_) , kRWI_W , 0 , 0 , 579 ), // #450 - INST(Eor_v , ISimdVVV , (0b0010111000100000000111, kVO_V_B) , kRWI_W , 0 , 8 , 1418), // #451 - INST(Eor3_v , ISimdVVVV , (0b1100111000000000000000, kVO_V_B16) , kRWI_W , 0 , 1 , 587 ), // #452 - INST(Ext_v , ISimdVVVI , (0b0010111000000000000000, kVO_V_B, 4, 11, 1) , kRWI_W , 0 , 0 , 601 ), // #453 - INST(Fabd_v , FSimdVVV , (0b0111111010100000110101, kHF_C, 0b0010111010100000110101, kHF_C) , kRWI_W , 0 , 0 , 610 ), // #454 - INST(Fabs_v , FSimdVV , (0b0001111000100000110000, kHF_A, 0b0000111010100000111110, kHF_B) , kRWI_W , 0 , 0 , 615 ), // #455 - INST(Facge_v , FSimdVVV , (0b0111111000100000111011, kHF_C, 0b0010111000100000111011, kHF_C) , kRWI_W , 0 , 1 , 620 ), // #456 - INST(Facgt_v , FSimdVVV , (0b0111111010100000111011, kHF_C, 0b0010111010100000111011, kHF_C) , kRWI_W , 0 , 2 , 626 ), // #457 - INST(Fadd_v , FSimdVVV , (0b0001111000100000001010, kHF_A, 0b0000111000100000110101, kHF_C) , kRWI_W , 0 , 3 , 632 ), // #458 - INST(Faddp_v , FSimdPair , (0b0111111000110000110110, 0b0010111000100000110101) , kRWI_W , 0 , 0 , 637 ), // #459 - INST(Fcadd_v , SimdFcadd , (0b0010111000000000111001) , kRWI_W , 0 , 0 , 643 ), // #460 - INST(Fccmp_v , SimdFccmpFccmpe , (0b00011110001000000000010000000000) , kRWI_R , 0 , 0 , 649 ), // #461 - INST(Fccmpe_v , SimdFccmpFccmpe , (0b00011110001000000000010000010000) , kRWI_R , 0 , 1 , 655 ), // #462 - INST(Fcmeq_v , SimdFcm , (0b0000111000100000111001, kHF_C, 0b0000111010100000110110) , kRWI_W , 0 , 0 , 662 ), // #463 - INST(Fcmge_v , SimdFcm , (0b0010111000100000111001, kHF_C, 0b0010111010100000110010) , kRWI_W , 0 , 1 , 668 ), // #464 - INST(Fcmgt_v , SimdFcm , (0b0010111010100000111001, kHF_C, 0b0000111010100000110010) , kRWI_W , 0 , 2 , 674 ), // #465 - INST(Fcmla_v , SimdFcmla , (0b0010111000000000110001, 0b0010111100000000000100) , kRWI_X , 0 , 0 , 680 ), // #466 - INST(Fcmle_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0010111010100000110110) , kRWI_W , 0 , 3 , 686 ), // #467 - INST(Fcmlt_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0000111010100000111010) , kRWI_W , 0 , 4 , 692 ), // #468 - INST(Fcmp_v , SimdFcmpFcmpe , (0b00011110001000000010000000000000) , kRWI_R , 0 , 0 , 698 ), // #469 - INST(Fcmpe_v , SimdFcmpFcmpe , (0b00011110001000000010000000010000) , kRWI_R , 0 , 1 , 703 ), // #470 - INST(Fcsel_v , SimdFcsel , (_) , kRWI_W , 0 , 0 , 709 ), // #471 - INST(Fcvt_v , SimdFcvt , (_) , kRWI_W , 0 , 0 , 197 ), // #472 - INST(Fcvtas_v , SimdFcvtSV , (0b0000111000100001110010, 0b0000000000000000000000, 0b0001111000100100000000, 1) , kRWI_W , 0 , 0 , 715 ), // #473 - INST(Fcvtau_v , SimdFcvtSV , (0b0010111000100001110010, 0b0000000000000000000000, 0b0001111000100101000000, 1) , kRWI_W , 0 , 1 , 722 ), // #474 - INST(Fcvtl_v , SimdFcvtLN , (0b0000111000100001011110, 0, 0) , kRWI_W , F(Long) , 0 , 729 ), // #475 - INST(Fcvtl2_v , SimdFcvtLN , (0b0100111000100001011110, 0, 0) , kRWI_W , F(Long) , 1 , 735 ), // #476 - INST(Fcvtms_v , SimdFcvtSV , (0b0000111000100001101110, 0b0000000000000000000000, 0b0001111000110000000000, 1) , kRWI_W , 0 , 2 , 742 ), // #477 - INST(Fcvtmu_v , SimdFcvtSV , (0b0010111000100001101110, 0b0000000000000000000000, 0b0001111000110001000000, 1) , kRWI_W , 0 , 3 , 749 ), // #478 - INST(Fcvtn_v , SimdFcvtLN , (0b0000111000100001011010, 0, 0) , kRWI_W , F(Narrow) , 2 , 203 ), // #479 - INST(Fcvtn2_v , SimdFcvtLN , (0b0100111000100001011010, 0, 0) , kRWI_X , F(Narrow) , 3 , 210 ), // #480 - INST(Fcvtns_v , SimdFcvtSV , (0b0000111000100001101010, 0b0000000000000000000000, 0b0001111000100000000000, 1) , kRWI_W , 0 , 4 , 756 ), // #481 - INST(Fcvtnu_v , SimdFcvtSV , (0b0010111000100001101010, 0b0000000000000000000000, 0b0001111000100001000000, 1) , kRWI_W , 0 , 5 , 763 ), // #482 - INST(Fcvtps_v , SimdFcvtSV , (0b0000111010100001101010, 0b0000000000000000000000, 0b0001111000101000000000, 1) , kRWI_W , 0 , 6 , 770 ), // #483 - INST(Fcvtpu_v , SimdFcvtSV , (0b0010111010100001101010, 0b0000000000000000000000, 0b0001111000101001000000, 1) , kRWI_W , 0 , 7 , 777 ), // #484 - INST(Fcvtxn_v , SimdFcvtLN , (0b0010111000100001011010, 1, 1) , kRWI_W , F(Narrow) , 4 , 784 ), // #485 - INST(Fcvtxn2_v , SimdFcvtLN , (0b0110111000100001011010, 1, 0) , kRWI_X , F(Narrow) , 5 , 791 ), // #486 - INST(Fcvtzs_v , SimdFcvtSV , (0b0000111010100001101110, 0b0000111100000000111111, 0b0001111000111000000000, 1) , kRWI_W , 0 , 8 , 799 ), // #487 - INST(Fcvtzu_v , SimdFcvtSV , (0b0010111010100001101110, 0b0010111100000000111111, 0b0001111000111001000000, 1) , kRWI_W , 0 , 9 , 806 ), // #488 - INST(Fdiv_v , FSimdVVV , (0b0001111000100000000110, kHF_A, 0b0010111000100000111111, kHF_C) , kRWI_W , 0 , 4 , 813 ), // #489 - INST(Fjcvtzs_v , ISimdVVx , (0b0001111001111110000000, kOp_GpW, kOp_D) , kRWI_W , 0 , 7 , 818 ), // #490 - INST(Fmadd_v , FSimdVVVV , (0b0001111100000000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 0 , 826 ), // #491 - INST(Fmax_v , FSimdVVV , (0b0001111000100000010010, kHF_A, 0b0000111000100000111101, kHF_C) , kRWI_W , 0 , 5 , 832 ), // #492 - INST(Fmaxnm_v , FSimdVVV , (0b0001111000100000011010, kHF_A, 0b0000111000100000110001, kHF_C) , kRWI_W , 0 , 6 , 837 ), // #493 - INST(Fmaxnmp_v , FSimdPair , (0b0111111000110000110010, 0b0010111000100000110001) , kRWI_W , 0 , 1 , 844 ), // #494 - INST(Fmaxnmv_v , FSimdSV , (0b0010111000110000110010) , kRWI_W , 0 , 0 , 852 ), // #495 - INST(Fmaxp_v , FSimdPair , (0b0111111000110000111110, 0b0010111000100000111101) , kRWI_W , 0 , 2 , 860 ), // #496 - INST(Fmaxv_v , FSimdSV , (0b0010111000110000111110) , kRWI_W , 0 , 1 , 866 ), // #497 - INST(Fmin_v , FSimdVVV , (0b0001111000100000010110, kHF_A, 0b0000111010100000111101, kHF_C) , kRWI_W , 0 , 7 , 872 ), // #498 - INST(Fminnm_v , FSimdVVV , (0b0001111000100000011110, kHF_A, 0b0000111010100000110001, kHF_C) , kRWI_W , 0 , 8 , 877 ), // #499 - INST(Fminnmp_v , FSimdPair , (0b0111111010110000110010, 0b0010111010100000110001) , kRWI_W , 0 , 3 , 884 ), // #500 - INST(Fminnmv_v , FSimdSV , (0b0010111010110000110010) , kRWI_W , 0 , 2 , 892 ), // #501 - INST(Fminp_v , FSimdPair , (0b0111111010110000111110, 0b0010111010100000111101) , kRWI_W , 0 , 4 , 900 ), // #502 - INST(Fminv_v , FSimdSV , (0b0010111010110000111110) , kRWI_W , 0 , 3 , 906 ), // #503 - INST(Fmla_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111000100000110011, 0b0000111110000000000100) , kRWI_X , F(VH0_15) , 0 , 912 ), // #504 - INST(Fmlal_v , SimdFmlal , (0b0000111000100000111011, 0b0000111110000000000000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 2 , 917 ), // #505 - INST(Fmlal2_v , SimdFmlal , (0b0010111000100000110011, 0b0010111110000000100000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 3 , 923 ), // #506 - INST(Fmls_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111010100000110011, 0b0000111110000000010100) , kRWI_X , F(VH0_15) , 1 , 930 ), // #507 - INST(Fmlsl_v , SimdFmlal , (0b0000111010100000111011, 0b0000111110000000010000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 4 , 935 ), // #508 - INST(Fmlsl2_v , SimdFmlal , (0b0010111010100000110011, 0b0010111110000000110000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 5 , 941 ), // #509 - INST(Fmov_v , SimdFmov , (_) , kRWI_W , 0 , 0 , 948 ), // #510 - INST(Fmsub_v , FSimdVVVV , (0b0001111100000000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 1 , 953 ), // #511 - INST(Fmul_v , FSimdVVVe , (0b0001111000100000000010, kHF_A, 0b0010111000100000110111, 0b0000111110000000100100) , kRWI_W , F(VH0_15) , 2 , 959 ), // #512 - INST(Fmulx_v , FSimdVVVe , (0b0101111000100000110111, kHF_C, 0b0000111000100000110111, 0b0010111110000000100100) , kRWI_W , F(VH0_15) , 3 , 964 ), // #513 - INST(Fneg_v , FSimdVV , (0b0001111000100001010000, kHF_A, 0b0010111010100000111110, kHF_B) , kRWI_W , 0 , 1 , 970 ), // #514 - INST(Fnmadd_v , FSimdVVVV , (0b0001111100100000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 2 , 975 ), // #515 - INST(Fnmsub_v , FSimdVVVV , (0b0001111100100000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 , 982 ), // #516 - INST(Fnmul_v , FSimdVVV , (0b0001111000100000100010, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 9 , 989 ), // #517 - INST(Frecpe_v , FSimdVV , (0b0101111010100001110110, kHF_B, 0b0000111010100001110110, kHF_B) , kRWI_W , 0 , 2 , 995 ), // #518 - INST(Frecps_v , FSimdVVV , (0b0101111000100000111111, kHF_C, 0b0000111000100000111111, kHF_C) , kRWI_W , 0 , 10 , 1002), // #519 - INST(Frecpx_v , FSimdVV , (0b0101111010100001111110, kHF_B, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 , 1009), // #520 - INST(Frint32x_v , FSimdVV , (0b0001111000101000110000, kHF_N, 0b0010111000100001111010, kHF_N) , kRWI_W , 0 , 4 , 1016), // #521 - INST(Frint32z_v , FSimdVV , (0b0001111000101000010000, kHF_N, 0b0000111000100001111010, kHF_N) , kRWI_W , 0 , 5 , 1025), // #522 - INST(Frint64x_v , FSimdVV , (0b0001111000101001110000, kHF_N, 0b0010111000100001111110, kHF_N) , kRWI_W , 0 , 6 , 1034), // #523 - INST(Frint64z_v , FSimdVV , (0b0001111000101001010000, kHF_N, 0b0000111000100001111110, kHF_N) , kRWI_W , 0 , 7 , 1043), // #524 - INST(Frinta_v , FSimdVV , (0b0001111000100110010000, kHF_A, 0b0010111000100001100010, kHF_B) , kRWI_W , 0 , 8 , 1052), // #525 - INST(Frinti_v , FSimdVV , (0b0001111000100111110000, kHF_A, 0b0010111010100001100110, kHF_B) , kRWI_W , 0 , 9 , 1059), // #526 - INST(Frintm_v , FSimdVV , (0b0001111000100101010000, kHF_A, 0b0000111000100001100110, kHF_B) , kRWI_W , 0 , 10 , 1066), // #527 - INST(Frintn_v , FSimdVV , (0b0001111000100100010000, kHF_A, 0b0000111000100001100010, kHF_B) , kRWI_W , 0 , 11 , 1073), // #528 - INST(Frintp_v , FSimdVV , (0b0001111000100100110000, kHF_A, 0b0000111010100001100010, kHF_B) , kRWI_W , 0 , 12 , 1080), // #529 - INST(Frintx_v , FSimdVV , (0b0001111000100111010000, kHF_A, 0b0010111000100001100110, kHF_B) , kRWI_W , 0 , 13 , 1087), // #530 - INST(Frintz_v , FSimdVV , (0b0001111000100101110000, kHF_A, 0b0000111010100001100110, kHF_B) , kRWI_W , 0 , 14 , 1094), // #531 - INST(Frsqrte_v , FSimdVV , (0b0111111010100001110110, kHF_B, 0b0010111010100001110110, kHF_B) , kRWI_W , 0 , 15 , 1101), // #532 - INST(Frsqrts_v , FSimdVVV , (0b0101111010100000111111, kHF_C, 0b0000111010100000111111, kHF_C) , kRWI_W , 0 , 11 , 1109), // #533 - INST(Fsqrt_v , FSimdVV , (0b0001111000100001110000, kHF_A, 0b0010111010100001111110, kHF_B) , kRWI_W , 0 , 16 , 1117), // #534 - INST(Fsub_v , FSimdVVV , (0b0001111000100000001110, kHF_A, 0b0000111010100000110101, kHF_C) , kRWI_W , 0 , 12 , 1123), // #535 - INST(Ins_v , SimdIns , (_) , kRWI_X , 0 , 0 , 1145), // #536 - INST(Ld1_v , SimdLdNStN , (0b0000110101000000000000, 0b0000110001000000001000, 1, 0) , kRWI_LDn , F(Consecutive) , 0 , 1153), // #537 - INST(Ld1r_v , SimdLdNStN , (0b0000110101000000110000, 0b0000000000000000000000, 1, 1) , kRWI_LDn , F(Consecutive) , 1 , 1157), // #538 - INST(Ld2_v , SimdLdNStN , (0b0000110101100000000000, 0b0000110001000000100000, 2, 0) , kRWI_LDn , F(Consecutive) , 2 , 1162), // #539 - INST(Ld2r_v , SimdLdNStN , (0b0000110101100000110000, 0b0000000000000000000000, 2, 1) , kRWI_LDn , F(Consecutive) , 3 , 1166), // #540 - INST(Ld3_v , SimdLdNStN , (0b0000110101000000001000, 0b0000110001000000010000, 3, 0) , kRWI_LDn , F(Consecutive) , 4 , 1171), // #541 - INST(Ld3r_v , SimdLdNStN , (0b0000110101000000111000, 0b0000000000000000000000, 3, 1) , kRWI_LDn , F(Consecutive) , 5 , 1175), // #542 - INST(Ld4_v , SimdLdNStN , (0b0000110101100000001000, 0b0000110001000000000000, 4, 0) , kRWI_LDn , F(Consecutive) , 6 , 1180), // #543 - INST(Ld4r_v , SimdLdNStN , (0b0000110101100000111000, 0b0000000000000000000000, 4, 1) , kRWI_LDn , F(Consecutive) , 7 , 1184), // #544 - INST(Ldnp_v , SimdLdpStp , (0b0010110001, 0b0000000000) , kRWI_WW , 0 , 0 , 1537), // #545 - INST(Ldp_v , SimdLdpStp , (0b0010110101, 0b0010110011) , kRWI_WW , 0 , 1 , 1542), // #546 - INST(Ldr_v , SimdLdSt , (0b0011110101, 0b00111100010, 0b00111100011, 0b00011100, Inst::kIdLdur_v) , kRWI_W , 0 , 0 , 1552), // #547 - INST(Ldur_v , SimdLdurStur , (0b0011110001000000000000) , kRWI_W , 0 , 0 , 2142), // #548 - INST(Mla_v , ISimdVVVe , (0b0000111000100000100101, kVO_V_BHS, 0b0010111100000000000000, kVO_V_HS) , kRWI_X , F(VH0_15) , 0 , 246 ), // #549 - INST(Mls_v , ISimdVVVe , (0b0010111000100000100101, kVO_V_BHS, 0b0010111100000000010000, kVO_V_HS) , kRWI_X , F(VH0_15) , 1 , 931 ), // #550 - INST(Mov_v , SimdMov , (_) , kRWI_W , 0 , 0 , 949 ), // #551 - INST(Movi_v , SimdMoviMvni , (0b0000111100000000000001, 0) , kRWI_W , 0 , 0 , 2221), // #552 - INST(Mul_v , ISimdVVVe , (0b0000111000100000100111, kVO_V_BHS, 0b0000111100000000100000, kVO_V_HS) , kRWI_W , F(VH0_15) , 2 , 991 ), // #553 - INST(Mvn_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 4 , 2249), // #554 - INST(Mvni_v , SimdMoviMvni , (0b0000111100000000000001, 1) , kRWI_W , 0 , 1 , 2253), // #555 - INST(Neg_v , ISimdVV , (0b0010111000100000101110, kVO_V_Any) , kRWI_W , 0 , 5 , 540 ), // #556 - INST(Not_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 6 , 2276), // #557 - INST(Orn_v , ISimdVVV , (0b0000111011100000000111, kVO_V_B) , kRWI_W , 0 , 9 , 2280), // #558 - INST(Orr_v , SimdBicOrr , (0b0000111010100000000111, 0b0000111100000000000001) , kRWI_W , 0 , 1 , 2284), // #559 - INST(Pmul_v , ISimdVVV , (0b0010111000100000100111, kVO_V_B) , kRWI_W , 0 , 10 , 2320), // #560 - INST(Pmull_v , ISimdVVV , (0b0000111000100000111000, kVO_V_B8D1) , kRWI_W , F(Long) , 11 , 2325), // #561 - INST(Pmull2_v , ISimdVVV , (0b0100111000100000111000, kVO_V_B16D2) , kRWI_W , F(Long) , 12 , 2331), // #562 - INST(Raddhn_v , ISimdVVV , (0b0010111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 13 , 2344), // #563 - INST(Raddhn2_v , ISimdVVV , (0b0110111000100000010000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 , 2351), // #564 - INST(Rax1_v , ISimdVVV , (0b1100111001100000100011, kVO_V_D2) , kRWI_W , 0 , 15 , 2359), // #565 - INST(Rbit_v , ISimdVV , (0b0010111001100000010110, kVO_V_B) , kRWI_W , 0 , 7 , 2364), // #566 - INST(Rev16_v , ISimdVV , (0b0000111000100000000110, kVO_V_B) , kRWI_W , 0 , 8 , 2373), // #567 - INST(Rev32_v , ISimdVV , (0b0010111000100000000010, kVO_V_BH) , kRWI_W , 0 , 9 , 2379), // #568 - INST(Rev64_v , ISimdVV , (0b0000111000100000000010, kVO_V_BHS) , kRWI_W , 0 , 10 , 2385), // #569 - INST(Rshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100011, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 0 , 2960), // #570 - INST(Rshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 1 , 2968), // #571 - INST(Rsubhn_v , ISimdVVV , (0b0010111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 16 , 2400), // #572 - INST(Rsubhn2_v , ISimdVVV , (0b0110111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 17 , 2407), // #573 - INST(Saba_v , ISimdVVV , (0b0000111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 18 , 2415), // #574 - INST(Sabal_v , ISimdVVV , (0b0000111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 19 , 2420), // #575 - INST(Sabal2_v , ISimdVVV , (0b0100111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 20 , 2426), // #576 - INST(Sabd_v , ISimdVVV , (0b0000111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 21 , 2433), // #577 - INST(Sabdl_v , ISimdVVV , (0b0000111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 , 2438), // #578 - INST(Sabdl2_v , ISimdVVV , (0b0100111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 , 2444), // #579 - INST(Sadalp_v , ISimdVV , (0b0000111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 11 , 2451), // #580 - INST(Saddl_v , ISimdVVV , (0b0000111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 24 , 2458), // #581 - INST(Saddl2_v , ISimdVVV , (0b0100111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 25 , 2464), // #582 - INST(Saddlp_v , ISimdVV , (0b0000111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 12 , 2471), // #583 - INST(Saddlv_v , ISimdSV , (0b0000111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 1 , 2478), // #584 - INST(Saddw_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 0 , 2485), // #585 - INST(Saddw2_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 1 , 2491), // #586 - INST(Scvtf_v , SimdFcvtSV , (0b0000111000100001110110, 0b0000111100000000111001, 0b0001111000100010000000, 0) , kRWI_W , 0 , 10 , 2523), // #587 - INST(Sdot_v , SimdDot , (0b0000111010000000100101, 0b0000111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 1 , 4218), // #588 - INST(Sha1c_v , ISimdVVVx , (0b0101111000000000000000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 1 , 2556), // #589 - INST(Sha1h_v , ISimdVVx , (0b0101111000101000000010, kOp_S, kOp_S) , kRWI_W , 0 , 8 , 2562), // #590 - INST(Sha1m_v , ISimdVVVx , (0b0101111000000000001000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 2 , 2568), // #591 - INST(Sha1p_v , ISimdVVVx , (0b0101111000000000000100, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 3 , 2574), // #592 - INST(Sha1su0_v , ISimdVVVx , (0b0101111000000000001100, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 4 , 2580), // #593 - INST(Sha1su1_v , ISimdVVx , (0b0101111000101000000110, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 9 , 2588), // #594 - INST(Sha256h_v , ISimdVVVx , (0b0101111000000000010000, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 5 , 2596), // #595 - INST(Sha256h2_v , ISimdVVVx , (0b0101111000000000010100, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 6 , 2604), // #596 - INST(Sha256su0_v , ISimdVVx , (0b0101111000101000001010, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 10 , 2613), // #597 - INST(Sha256su1_v , ISimdVVVx , (0b0101111000000000011000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 7 , 2623), // #598 - INST(Sha512h_v , ISimdVVVx , (0b1100111001100000100000, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 8 , 2633), // #599 - INST(Sha512h2_v , ISimdVVVx , (0b1100111001100000100001, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 9 , 2641), // #600 - INST(Sha512su0_v , ISimdVVx , (0b1100111011000000100000, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 11 , 2650), // #601 - INST(Sha512su1_v , ISimdVVVx , (0b1100111001100000100010, kOp_V2D, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 10 , 2660), // #602 - INST(Shadd_v , ISimdVVV , (0b0000111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 26 , 2670), // #603 - INST(Shl_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000010101, 0, kVO_V_Any) , kRWI_W , 0 , 2 , 2954), // #604 - INST(Shll_v , SimdShiftES , (0b0010111000100001001110, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 , 3108), // #605 - INST(Shll2_v , SimdShiftES , (0b0110111000100001001110, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 , 3114), // #606 - INST(Shrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100001, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 3 , 2961), // #607 - INST(Shrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 4 , 2969), // #608 - INST(Shsub_v , ISimdVVV , (0b0000111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 27 , 2676), // #609 - INST(Sli_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010101, 0, kVO_V_Any) , kRWI_X , 0 , 5 , 2682), // #610 - INST(Sm3partw1_v , ISimdVVVx , (0b1100111001100000110000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 11 , 2686), // #611 - INST(Sm3partw2_v , ISimdVVVx , (0b1100111001100000110001, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 , 2696), // #612 - INST(Sm3ss1_v , ISimdVVVVx , (0b1100111001000000000000, kOp_V4S, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_W , 0 , 0 , 2706), // #613 - INST(Sm3tt1a_v , SimdSm3tt , (0b1100111001000000100000) , kRWI_X , 0 , 0 , 2713), // #614 - INST(Sm3tt1b_v , SimdSm3tt , (0b1100111001000000100001) , kRWI_X , 0 , 1 , 2721), // #615 - INST(Sm3tt2a_v , SimdSm3tt , (0b1100111001000000100010) , kRWI_X , 0 , 2 , 2729), // #616 - INST(Sm3tt2b_v , SimdSm3tt , (0b1100111001000000100011) , kRWI_X , 0 , 3 , 2737), // #617 - INST(Sm4e_v , ISimdVVx , (0b1100111011000000100001, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 , 2745), // #618 - INST(Sm4ekey_v , ISimdVVVx , (0b1100111001100000110010, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 13 , 2750), // #619 - INST(Smax_v , ISimdVVV , (0b0000111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 28 , 1690), // #620 - INST(Smaxp_v , ISimdVVV , (0b0000111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 29 , 2765), // #621 - INST(Smaxv_v , ISimdSV , (0b0000111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 2 , 2771), // #622 - INST(Smin_v , ISimdVVV , (0b0000111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 30 , 1794), // #623 - INST(Sminp_v , ISimdVVV , (0b0000111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 31 , 2777), // #624 - INST(Sminv_v , ISimdSV , (0b0000111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 3 , 2783), // #625 - INST(Smlal_v , ISimdVVVe , (0b0000111000100000100000, kVO_V_B8H4S2, 0b0000111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 3 , 2789), // #626 - INST(Smlal2_v , ISimdVVVe , (0b0100111000100000100000, kVO_V_B16H8S4, 0b0100111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 4 , 2795), // #627 - INST(Smlsl_v , ISimdVVVe , (0b0000111000100000101000, kVO_V_B8H4S2, 0b0000111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 5 , 2802), // #628 - INST(Smlsl2_v , ISimdVVVe , (0b0100111000100000101000, kVO_V_B16H8S4, 0b0100111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 6 , 2808), // #629 - INST(Smmla_v , ISimdVVVx , (0b0100111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 14 , 4247), // #630 - INST(Smov_v , SimdSmovUmov , (0b0000111000000000001011, kVO_V_BHS, 1) , kRWI_W , 0 , 0 , 2822), // #631 - INST(Smull_v , ISimdVVVe , (0b0000111000100000110000, kVO_V_B8H4S2, 0b0000111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 7 , 2840), // #632 - INST(Smull2_v , ISimdVVVe , (0b0100111000100000110000, kVO_V_B16H8S4, 0b0100111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 8 , 2846), // #633 - INST(Sqabs_v , ISimdVV , (0b0000111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 13 , 2853), // #634 - INST(Sqadd_v , ISimdVVV , (0b0000111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 32 , 4254), // #635 - INST(Sqdmlal_v , ISimdVVVe , (0b0000111000100000100100, kVO_SV_BHS, 0b0000111100000000001100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 9 , 2859), // #636 - INST(Sqdmlal2_v , ISimdVVVe , (0b0100111000100000100100, kVO_V_B16H8S4, 0b0100111100000000001100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 10 , 2867), // #637 - INST(Sqdmlsl_v , ISimdVVVe , (0b0000111000100000101100, kVO_SV_BHS, 0b0000111100000000011100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 11 , 2876), // #638 - INST(Sqdmlsl2_v , ISimdVVVe , (0b0100111000100000101100, kVO_V_B16H8S4, 0b0100111100000000011100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 12 , 2884), // #639 - INST(Sqdmulh_v , ISimdVVVe , (0b0000111000100000101101, kVO_SV_HS, 0b0000111100000000110000, kVO_SV_HS) , kRWI_W , F(VH0_15) , 13 , 2893), // #640 - INST(Sqdmull_v , ISimdVVVe , (0b0000111000100000110100, kVO_SV_BHS, 0b0000111100000000101100, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 14 , 2901), // #641 - INST(Sqdmull2_v , ISimdVVVe , (0b0100111000100000110100, kVO_V_B16H8S4, 0b0100111100000000101100, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 15 , 2909), // #642 - INST(Sqneg_v , ISimdVV , (0b0010111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 14 , 2918), // #643 - INST(Sqrdmlah_v , ISimdVVVe , (0b0010111000000000100001, kVO_SV_HS, 0b0010111100000000110100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 16 , 2924), // #644 - INST(Sqrdmlsh_v , ISimdVVVe , (0b0010111000000000100011, kVO_SV_HS, 0b0010111100000000111100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 17 , 2933), // #645 - INST(Sqrdmulh_v , ISimdVVVe , (0b0010111000100000101101, kVO_SV_HS, 0b0000111100000000110100, kVO_SV_HS) , kRWI_W , F(VH0_15) , 18 , 2942), // #646 - INST(Sqrshl_v , SimdShift , (0b0000111000100000010111, 0b0000000000000000000000, 1, kVO_SV_Any) , kRWI_W , 0 , 6 , 2951), // #647 - INST(Sqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 7 , 2958), // #648 - INST(Sqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 8 , 2966), // #649 - INST(Sqrshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100011, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 9 , 2975), // #650 - INST(Sqrshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 10 , 2984), // #651 - INST(Sqshl_v , SimdShift , (0b0000111000100000010011, 0b0000111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 11 , 2994), // #652 - INST(Sqshlu_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000011001, 0, kVO_SV_Any) , kRWI_W , 0 , 12 , 3000), // #653 - INST(Sqshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 13 , 3007), // #654 - INST(Sqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 , 3014), // #655 - INST(Sqshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100001, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 , 3022), // #656 - INST(Sqshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 , 3030), // #657 - INST(Sqsub_v , ISimdVVV , (0b0000111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 33 , 3039), // #658 - INST(Sqxtn_v , ISimdVV , (0b0000111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 , 3045), // #659 - INST(Sqxtn2_v , ISimdVV , (0b0100111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 , 3051), // #660 - INST(Sqxtun_v , ISimdVV , (0b0010111000100001001010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 17 , 3058), // #661 - INST(Sqxtun2_v , ISimdVV , (0b0110111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 18 , 3065), // #662 - INST(Srhadd_v , ISimdVVV , (0b0000111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 34 , 3073), // #663 - INST(Sri_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010001, 1, kVO_V_Any) , kRWI_W , 0 , 17 , 3080), // #664 - INST(Srshl_v , SimdShift , (0b0000111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 18 , 3084), // #665 - INST(Srshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 19 , 3090), // #666 - INST(Srsra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 20 , 3096), // #667 - INST(Sshl_v , SimdShift , (0b0000111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 21 , 3102), // #668 - INST(Sshll_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 , 3107), // #669 - INST(Sshll2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 , 3113), // #670 - INST(Sshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 24 , 3120), // #671 - INST(Ssra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 25 , 3125), // #672 - INST(Ssubl_v , ISimdVVV , (0b0000111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 35 , 3130), // #673 - INST(Ssubl2_v , ISimdVVV , (0b0100111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 36 , 3136), // #674 - INST(Ssubw_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 2 , 3143), // #675 - INST(Ssubw2_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B16H8S4) , kRWI_X , 0 , 3 , 3149), // #676 - INST(St1_v , SimdLdNStN , (0b0000110100000000000000, 0b0000110000000000001000, 1, 0) , kRWI_STn , F(Consecutive) , 8 , 3156), // #677 - INST(St2_v , SimdLdNStN , (0b0000110100100000000000, 0b0000110000000000100000, 2, 0) , kRWI_STn , F(Consecutive) , 9 , 3160), // #678 - INST(St3_v , SimdLdNStN , (0b0000110100000000001000, 0b0000110000000000010000, 3, 0) , kRWI_STn , F(Consecutive) , 10 , 3169), // #679 - INST(St4_v , SimdLdNStN , (0b0000110100100000001000, 0b0000110000000000000000, 4, 0) , kRWI_STn , F(Consecutive) , 11 , 3173), // #680 - INST(Stnp_v , SimdLdpStp , (0b0010110000, 0b0000000000) , kRWI_RRW , 0 , 2 , 3383), // #681 - INST(Stp_v , SimdLdpStp , (0b0010110100, 0b0010110010) , kRWI_RRW , 0 , 3 , 3388), // #682 - INST(Str_v , SimdLdSt , (0b0011110100, 0b00111100000, 0b00111100001, 0b00000000, Inst::kIdStur_v) , kRWI_RW , 0 , 1 , 3392), // #683 - INST(Stur_v , SimdLdurStur , (0b0011110000000000000000) , kRWI_RW , 0 , 1 , 3662), // #684 - INST(Sub_v , ISimdVVV , (0b0010111000100000100001, kVO_V_Any) , kRWI_W , 0 , 37 , 985 ), // #685 - INST(Subhn_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 38 , 2401), // #686 - INST(Subhn2_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 39 , 2408), // #687 - INST(Sudot_v , SimdDot , (0b0000000000000000000000, 0b0000111100000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 2 , 3739), // #688 - INST(Suqadd_v , ISimdVV , (0b0000111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 19 , 3745), // #689 - INST(Sxtl_v , SimdSxtlUxtl , (0b0000111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 , 3834), // #690 - INST(Sxtl2_v , SimdSxtlUxtl , (0b0100111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 , 3839), // #691 - INST(Tbl_v , SimdTblTbx , (0b0000111000000000000000) , kRWI_W , 0 , 0 , 3854), // #692 - INST(Tbx_v , SimdTblTbx , (0b0000111000000000000100) , kRWI_W , 0 , 1 , 3863), // #693 - INST(Trn1_v , ISimdVVV , (0b0000111000000000001010, kVO_V_BHS_D2) , kRWI_W , 0 , 40 , 3876), // #694 - INST(Trn2_v , ISimdVVV , (0b0000111000000000011010, kVO_V_BHS_D2) , kRWI_W , 0 , 41 , 3881), // #695 - INST(Uaba_v , ISimdVVV , (0b0010111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 42 , 3886), // #696 - INST(Uabal_v , ISimdVVV , (0b0010111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 43 , 3891), // #697 - INST(Uabal2_v , ISimdVVV , (0b0110111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 44 , 3897), // #698 - INST(Uabd_v , ISimdVVV , (0b0010111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 45 , 3904), // #699 - INST(Uabdl_v , ISimdVVV , (0b0010111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 46 , 3909), // #700 - INST(Uabdl2_v , ISimdVVV , (0b0110111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 47 , 3915), // #701 - INST(Uadalp_v , ISimdVV , (0b0010111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 20 , 3922), // #702 - INST(Uaddl_v , ISimdVVV , (0b0010111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 48 , 3929), // #703 - INST(Uaddl2_v , ISimdVVV , (0b0110111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 49 , 3935), // #704 - INST(Uaddlp_v , ISimdVV , (0b0010111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 21 , 3942), // #705 - INST(Uaddlv_v , ISimdSV , (0b0010111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 4 , 3949), // #706 - INST(Uaddw_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 4 , 3956), // #707 - INST(Uaddw2_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 5 , 3962), // #708 - INST(Ucvtf_v , SimdFcvtSV , (0b0010111000100001110110, 0b0010111100000000111001, 0b0001111000100011000000, 0) , kRWI_W , 0 , 11 , 3985), // #709 - INST(Udot_v , SimdDot , (0b0010111010000000100101, 0b0010111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 3 , 3740), // #710 - INST(Uhadd_v , ISimdVVV , (0b0010111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 50 , 4000), // #711 - INST(Uhsub_v , ISimdVVV , (0b0010111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 51 , 4006), // #712 - INST(Umax_v , ISimdVVV , (0b0010111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 52 , 1936), // #713 - INST(Umaxp_v , ISimdVVV , (0b0010111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 53 , 4019), // #714 - INST(Umaxv_v , ISimdSV , (0b0010111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 5 , 4025), // #715 - INST(Umin_v , ISimdVVV , (0b0010111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 54 , 2040), // #716 - INST(Uminp_v , ISimdVVV , (0b0010111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 55 , 4031), // #717 - INST(Uminv_v , ISimdSV , (0b0010111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 6 , 4037), // #718 - INST(Umlal_v , ISimdVVVe , (0b0010111000100000100000, kVO_V_B8H4S2, 0b0010111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 19 , 4043), // #719 - INST(Umlal2_v , ISimdVVVe , (0b0110111000100000100000, kVO_V_B16H8S4, 0b0010111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 20 , 4049), // #720 - INST(Umlsl_v , ISimdVVVe , (0b0010111000100000101000, kVO_V_B8H4S2, 0b0010111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 21 , 4056), // #721 - INST(Umlsl2_v , ISimdVVVe , (0b0110111000100000101000, kVO_V_B16H8S4, 0b0110111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 22 , 4062), // #722 - INST(Ummla_v , ISimdVVVx , (0b0110111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 15 , 4069), // #723 - INST(Umov_v , SimdSmovUmov , (0b0000111000000000001111, kVO_V_Any, 0) , kRWI_W , 0 , 1 , 4082), // #724 - INST(Umull_v , ISimdVVVe , (0b0010111000100000110000, kVO_V_B8H4S2, 0b0010111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 23 , 4100), // #725 - INST(Umull2_v , ISimdVVVe , (0b0110111000100000110000, kVO_V_B16H8S4, 0b0110111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 24 , 4106), // #726 - INST(Uqadd_v , ISimdVVV , (0b0010111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 56 , 3746), // #727 - INST(Uqrshl_v , SimdShift , (0b0010111000100000010111, 0b0000000000000000000000, 0, kVO_SV_Any) , kRWI_W , 0 , 26 , 4113), // #728 - INST(Uqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 27 , 4120), // #729 - INST(Uqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 , 4128), // #730 - INST(Uqshl_v , SimdShift , (0b0010111000100000010011, 0b0010111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 29 , 4137), // #731 - INST(Uqshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 30 , 4143), // #732 - INST(Uqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 31 , 4150), // #733 - INST(Uqsub_v , ISimdVVV , (0b0010111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 57 , 4158), // #734 - INST(Uqxtn_v , ISimdVV , (0b0010111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 22 , 4164), // #735 - INST(Uqxtn2_v , ISimdVV , (0b0110111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 23 , 4170), // #736 - INST(Urecpe_v , ISimdVV , (0b0000111010100001110010, kVO_V_S) , kRWI_W , 0 , 24 , 4177), // #737 - INST(Urhadd_v , ISimdVVV , (0b0010111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 58 , 4184), // #738 - INST(Urshl_v , SimdShift , (0b0010111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 32 , 4191), // #739 - INST(Urshr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 33 , 4197), // #740 - INST(Ursqrte_v , ISimdVV , (0b0010111010100001110010, kVO_V_S) , kRWI_W , 0 , 25 , 4203), // #741 - INST(Ursra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 34 , 4211), // #742 - INST(Usdot_v , SimdDot , (0b0000111010000000100111, 0b0000111110000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 4 , 4217), // #743 - INST(Ushl_v , SimdShift , (0b0010111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 35 , 4223), // #744 - INST(Ushll_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 36 , 4228), // #745 - INST(Ushll2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 37 , 4234), // #746 - INST(Ushr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 38 , 4241), // #747 - INST(Usmmla_v , ISimdVVVx , (0b0100111010000000101011, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 16 , 4246), // #748 - INST(Usqadd_v , ISimdVV , (0b0010111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 26 , 4253), // #749 - INST(Usra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 39 , 4260), // #750 - INST(Usubl_v , ISimdVVV , (0b0010111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 59 , 4265), // #751 - INST(Usubl2_v , ISimdVVV , (0b0110111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 60 , 4271), // #752 - INST(Usubw_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 6 , 4278), // #753 - INST(Usubw2_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B16H8S4) , kRWI_W , 0 , 7 , 4284), // #754 - INST(Uxtl_v , SimdSxtlUxtl , (0b0010111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 2 , 4301), // #755 - INST(Uxtl2_v , SimdSxtlUxtl , (0b0110111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 3 , 4306), // #756 - INST(Uzp1_v , ISimdVVV , (0b0000111000000000000110, kVO_V_BHS_D2) , kRWI_W , 0 , 61 , 4312), // #757 - INST(Uzp2_v , ISimdVVV , (0b0000111000000000010110, kVO_V_BHS_D2) , kRWI_W , 0 , 62 , 4317), // #758 - INST(Xar_v , ISimdVVVI , (0b1100111001100000100011, kVO_V_D2, 6, 10, 0) , kRWI_W , 0 , 1 , 4337), // #759 - INST(Xtn_v , ISimdVV , (0b0000111000100001001010, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 27 , 3047), // #760 - INST(Xtn2_v , ISimdVV , (0b0100111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 , 3053), // #761 - INST(Zip1_v , ISimdVVV , (0b0000111000000000001110, kVO_V_BHS_D2) , kRWI_W , 0 , 63 , 4367), // #762 - INST(Zip2_v , ISimdVVV , (0b0000111000000000011110, kVO_V_BHS_D2) , kRWI_W , 0 , 64 , 4372) // #763 + INST(None , None , (_) , 0 , 0 , 0 ), // #0 + INST(Adc , BaseRRR , (0b0001101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 ), // #1 + INST(Adcs , BaseRRR , (0b0011101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 ), // #2 + INST(Add , BaseAddSub , (0b0001011000, 0b0001011001, 0b0010001) , kRWI_W , 0 , 0 ), // #3 + INST(Addg , BaseRRII , (0b1001000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 0 ), // #4 + INST(Adds , BaseAddSub , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_W , 0 , 1 ), // #5 + INST(Adr , BaseAdr , (0b0001000000000000000000, OffsetType::kAArch64_ADR) , kRWI_W , 0 , 0 ), // #6 + INST(Adrp , BaseAdr , (0b1001000000000000000000, OffsetType::kAArch64_ADRP) , kRWI_W , 0 , 1 ), // #7 + INST(And , BaseLogical , (0b0001010000, 0b00100100, 0) , kRWI_W , 0 , 0 ), // #8 + INST(Ands , BaseLogical , (0b1101010000, 0b11100100, 0) , kRWI_W , 0 , 1 ), // #9 + INST(Asr , BaseShift , (0b0001101011000000001010, 0b0001001100000000011111, 0) , kRWI_W , 0 , 0 ), // #10 + INST(Asrv , BaseShift , (0b0001101011000000001010, 0b0000000000000000000000, 0) , kRWI_W , 0 , 1 ), // #11 + INST(At , BaseAtDcIcTlbi , (0b00011111110000, 0b00001111000000, true) , kRWI_RX , 0 , 0 ), // #12 + INST(Autda , BaseRR , (0b11011010110000010001100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 0 ), // #13 + INST(Autdza , BaseR , (0b11011010110000010011101111100000, kX, kZR, 0) , kRWI_X , 0 , 0 ), // #14 + INST(Autdb , BaseRR , (0b11011010110000010001110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 1 ), // #15 + INST(Autdzb , BaseR , (0b11011010110000010011111111100000, kX, kZR, 0) , kRWI_X , 0 , 1 ), // #16 + INST(Autia , BaseRR , (0b11011010110000010001000000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 2 ), // #17 + INST(Autia1716 , BaseOp , (0b11010101000000110010000110011111) , 0 , 0 , 0 ), // #18 + INST(Autiasp , BaseOp , (0b11010101000000110010001110111111) , 0 , 0 , 1 ), // #19 + INST(Autiaz , BaseOp , (0b11010101000000110010001110011111) , 0 , 0 , 2 ), // #20 + INST(Autib , BaseRR , (0b11011010110000010001010000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 3 ), // #21 + INST(Autib1716 , BaseOp , (0b11010101000000110010000111011111) , 0 , 0 , 3 ), // #22 + INST(Autibsp , BaseOp , (0b11010101000000110010001111111111) , 0 , 0 , 4 ), // #23 + INST(Autibz , BaseOp , (0b11010101000000110010001111011111) , 0 , 0 , 5 ), // #24 + INST(Autiza , BaseR , (0b11011010110000010011001111100000, kX, kZR, 0) , kRWI_X , 0 , 2 ), // #25 + INST(Autizb , BaseR , (0b11011010110000010011011111100000, kX, kZR, 0) , kRWI_X , 0 , 3 ), // #26 + INST(Axflag , BaseOp , (0b11010101000000000100000001011111) , 0 , 0 , 6 ), // #27 + INST(B , BaseBranchRel , (0b00010100000000000000000000000000) , 0 , F(Cond) , 0 ), // #28 + INST(Bfc , BaseBfc , (0b00110011000000000000001111100000) , kRWI_X , 0 , 0 ), // #29 + INST(Bfi , BaseBfi , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 ), // #30 + INST(Bfm , BaseBfm , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 ), // #31 + INST(Bfxil , BaseBfx , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 ), // #32 + INST(Bic , BaseLogical , (0b0001010001, 0b00100100, 1) , kRWI_W , 0 , 2 ), // #33 + INST(Bics , BaseLogical , (0b1101010001, 0b11100100, 1) , kRWI_W , 0 , 3 ), // #34 + INST(Bl , BaseBranchRel , (0b10010100000000000000000000000000) , 0 , 0 , 1 ), // #35 + INST(Blr , BaseBranchReg , (0b11010110001111110000000000000000) , kRWI_R , 0 , 0 ), // #36 + INST(Br , BaseBranchReg , (0b11010110000111110000000000000000) , kRWI_R , 0 , 1 ), // #37 + INST(Brk , BaseOpImm , (0b11010100001000000000000000000000, 16, 5) , 0 , 0 , 0 ), // #38 + INST(Cas , BaseAtomicOp , (0b1000100010100000011111, kWX, 30, 0) , kRWI_XRX , 0 , 0 ), // #39 + INST(Casa , BaseAtomicOp , (0b1000100011100000011111, kWX, 30, 1) , kRWI_XRX , 0 , 1 ), // #40 + INST(Casab , BaseAtomicOp , (0b0000100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 2 ), // #41 + INST(Casah , BaseAtomicOp , (0b0100100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 3 ), // #42 + INST(Casal , BaseAtomicOp , (0b1000100011100000111111, kWX, 30, 1) , kRWI_XRX , 0 , 4 ), // #43 + INST(Casalb , BaseAtomicOp , (0b0000100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 5 ), // #44 + INST(Casalh , BaseAtomicOp , (0b0100100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 6 ), // #45 + INST(Casb , BaseAtomicOp , (0b0000100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 7 ), // #46 + INST(Cash , BaseAtomicOp , (0b0100100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 8 ), // #47 + INST(Casl , BaseAtomicOp , (0b1000100010100000111111, kWX, 30, 0) , kRWI_XRX , 0 , 9 ), // #48 + INST(Caslb , BaseAtomicOp , (0b0000100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 10 ), // #49 + INST(Caslh , BaseAtomicOp , (0b0100100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 11 ), // #50 + INST(Casp , BaseAtomicCasp , (0b0000100000100000011111, kWX, 30) , kRWI_XXRRX, 0 , 0 ), // #51 + INST(Caspa , BaseAtomicCasp , (0b0000100001100000011111, kWX, 30) , kRWI_XXRRX, 0 , 1 ), // #52 + INST(Caspal , BaseAtomicCasp , (0b0000100001100000111111, kWX, 30) , kRWI_XXRRX, 0 , 2 ), // #53 + INST(Caspl , BaseAtomicCasp , (0b0000100000100000111111, kWX, 30) , kRWI_XXRRX, 0 , 3 ), // #54 + INST(Cbnz , BaseBranchCmp , (0b00110101000000000000000000000000) , kRWI_R , 0 , 0 ), // #55 + INST(Cbz , BaseBranchCmp , (0b00110100000000000000000000000000) , kRWI_R , 0 , 1 ), // #56 + INST(Ccmn , BaseCCmp , (0b00111010010000000000000000000000) , kRWI_R , 0 , 0 ), // #57 + INST(Ccmp , BaseCCmp , (0b01111010010000000000000000000000) , kRWI_R , 0 , 1 ), // #58 + INST(Cfinv , BaseOp , (0b11010101000000000100000000011111) , 0 , 0 , 7 ), // #59 + INST(Cinc , BaseCInc , (0b00011010100000000000010000000000) , kRWI_W , 0 , 0 ), // #60 + INST(Cinv , BaseCInc , (0b01011010100000000000000000000000) , kRWI_W , 0 , 1 ), // #61 + INST(Clrex , BaseOpImm , (0b11010101000000110011000001011111, 4, 8) , 0 , 0 , 1 ), // #62 + INST(Cls , BaseRR , (0b01011010110000000001010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 4 ), // #63 + INST(Clz , BaseRR , (0b01011010110000000001000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 5 ), // #64 + INST(Cmn , BaseCmpCmn , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_R , 0 , 0 ), // #65 + INST(Cmp , BaseCmpCmn , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_R , 0 , 1 ), // #66 + INST(Cmpp , BaseRR , (0b10111010110000000000000000011111, kX, kSP, 5, kX, kSP, 16, true) , kRWI_R , 0 , 6 ), // #67 + INST(Cneg , BaseCInc , (0b01011010100000000000010000000000) , kRWI_W , 0 , 2 ), // #68 + INST(Crc32b , BaseRRR , (0b0001101011000000010000, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 2 ), // #69 + INST(Crc32cb , BaseRRR , (0b0001101011000000010100, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 3 ), // #70 + INST(Crc32ch , BaseRRR , (0b0001101011000000010101, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 4 ), // #71 + INST(Crc32cw , BaseRRR , (0b0001101011000000010110, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 5 ), // #72 + INST(Crc32cx , BaseRRR , (0b1001101011000000010111, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 6 ), // #73 + INST(Crc32h , BaseRRR , (0b0001101011000000010001, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 7 ), // #74 + INST(Crc32w , BaseRRR , (0b0001101011000000010010, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 8 ), // #75 + INST(Crc32x , BaseRRR , (0b1001101011000000010011, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 9 ), // #76 + INST(Csdb , BaseOp , (0b11010101000000110010001010011111) , 0 , 0 , 8 ), // #77 + INST(Csel , BaseCSel , (0b00011010100000000000000000000000) , kRWI_W , 0 , 0 ), // #78 + INST(Cset , BaseCSet , (0b00011010100111110000011111100000) , kRWI_W , 0 , 0 ), // #79 + INST(Csetm , BaseCSet , (0b01011010100111110000001111100000) , kRWI_W , 0 , 1 ), // #80 + INST(Csinc , BaseCSel , (0b00011010100000000000010000000000) , kRWI_W , 0 , 1 ), // #81 + INST(Csinv , BaseCSel , (0b01011010100000000000000000000000) , kRWI_W , 0 , 2 ), // #82 + INST(Csneg , BaseCSel , (0b01011010100000000000010000000000) , kRWI_W , 0 , 3 ), // #83 + INST(Dc , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, true) , kRWI_RX , 0 , 1 ), // #84 + INST(Dcps1 , BaseOpImm , (0b11010100101000000000000000000001, 16, 5) , 0 , 0 , 2 ), // #85 + INST(Dcps2 , BaseOpImm , (0b11010100101000000000000000000010, 16, 5) , 0 , 0 , 3 ), // #86 + INST(Dcps3 , BaseOpImm , (0b11010100101000000000000000000011, 16, 5) , 0 , 0 , 4 ), // #87 + INST(Dgh , BaseOp , (0b11010101000000110010000011011111) , 0 , 0 , 9 ), // #88 + INST(Dmb , BaseOpImm , (0b11010101000000110011000010111111, 4, 8) , 0 , 0 , 5 ), // #89 + INST(Drps , BaseOp , (0b11010110101111110000001111100000) , 0 , 0 , 10 ), // #90 + INST(Dsb , BaseOpImm , (0b11010101000000110011000010011111, 4, 8) , 0 , 0 , 6 ), // #91 + INST(Eon , BaseLogical , (0b1001010001, 0b10100100, 1) , kRWI_W , 0 , 4 ), // #92 + INST(Eor , BaseLogical , (0b1001010000, 0b10100100, 0) , kRWI_W , 0 , 5 ), // #93 + INST(Esb , BaseOp , (0b11010101000000110010001000011111) , 0 , 0 , 11 ), // #94 + INST(Extr , BaseExtract , (0b00010011100000000000000000000000) , kRWI_W , 0 , 0 ), // #95 + INST(Eret , BaseOp , (0b11010110100111110000001111100000) , 0 , 0 , 12 ), // #96 + INST(Gmi , BaseRRR , (0b1001101011000000000101, kX , kZR, kX , kSP, kX , kZR, true) , kRWI_W , 0 , 10 ), // #97 + INST(Hint , BaseOpImm , (0b11010101000000110010000000011111, 7, 5) , 0 , 0 , 7 ), // #98 + INST(Hlt , BaseOpImm , (0b11010100010000000000000000000000, 16, 5) , 0 , 0 , 8 ), // #99 + INST(Hvc , BaseOpImm , (0b11010100000000000000000000000010, 16, 5) , 0 , 0 , 9 ), // #100 + INST(Ic , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, false) , kRWI_RX , 0 , 2 ), // #101 + INST(Isb , BaseOpImm , (0b11010101000000110011000011011111, 4, 8) , 0 , 0 , 10 ), // #102 + INST(Ldadd , BaseAtomicOp , (0b1011100000100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 12 ), // #103 + INST(Ldadda , BaseAtomicOp , (0b1011100010100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 13 ), // #104 + INST(Ldaddab , BaseAtomicOp , (0b0011100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 14 ), // #105 + INST(Ldaddah , BaseAtomicOp , (0b0111100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 15 ), // #106 + INST(Ldaddal , BaseAtomicOp , (0b1011100011100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 16 ), // #107 + INST(Ldaddalb , BaseAtomicOp , (0b0011100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 17 ), // #108 + INST(Ldaddalh , BaseAtomicOp , (0b0111100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 18 ), // #109 + INST(Ldaddb , BaseAtomicOp , (0b0011100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 19 ), // #110 + INST(Ldaddh , BaseAtomicOp , (0b0111100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 20 ), // #111 + INST(Ldaddl , BaseAtomicOp , (0b1011100001100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 21 ), // #112 + INST(Ldaddlb , BaseAtomicOp , (0b0011100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 22 ), // #113 + INST(Ldaddlh , BaseAtomicOp , (0b0111100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 23 ), // #114 + INST(Ldar , BaseRM_NoImm , (0b1000100011011111111111, kWX, kZR, 30) , kRWI_W , 0 , 0 ), // #115 + INST(Ldarb , BaseRM_NoImm , (0b0000100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 1 ), // #116 + INST(Ldarh , BaseRM_NoImm , (0b0100100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 2 ), // #117 + INST(Ldaxp , BaseLdxp , (0b1000100001111111100000, kWX, 30) , kRWI_WW , 0 , 0 ), // #118 + INST(Ldaxr , BaseRM_NoImm , (0b1000100001011111111111, kWX, kZR, 30) , kRWI_W , 0 , 3 ), // #119 + INST(Ldaxrb , BaseRM_NoImm , (0b0000100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 4 ), // #120 + INST(Ldaxrh , BaseRM_NoImm , (0b0100100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 5 ), // #121 + INST(Ldclr , BaseAtomicOp , (0b1011100000100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 24 ), // #122 + INST(Ldclra , BaseAtomicOp , (0b1011100010100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 25 ), // #123 + INST(Ldclrab , BaseAtomicOp , (0b0011100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 26 ), // #124 + INST(Ldclrah , BaseAtomicOp , (0b0111100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 27 ), // #125 + INST(Ldclral , BaseAtomicOp , (0b1011100011100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 28 ), // #126 + INST(Ldclralb , BaseAtomicOp , (0b0011100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 29 ), // #127 + INST(Ldclralh , BaseAtomicOp , (0b0111100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 30 ), // #128 + INST(Ldclrb , BaseAtomicOp , (0b0011100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 31 ), // #129 + INST(Ldclrh , BaseAtomicOp , (0b0111100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 32 ), // #130 + INST(Ldclrl , BaseAtomicOp , (0b1011100001100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 33 ), // #131 + INST(Ldclrlb , BaseAtomicOp , (0b0011100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 34 ), // #132 + INST(Ldclrlh , BaseAtomicOp , (0b0111100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 35 ), // #133 + INST(Ldeor , BaseAtomicOp , (0b1011100000100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 36 ), // #134 + INST(Ldeora , BaseAtomicOp , (0b1011100010100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 37 ), // #135 + INST(Ldeorab , BaseAtomicOp , (0b0011100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 38 ), // #136 + INST(Ldeorah , BaseAtomicOp , (0b0111100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 39 ), // #137 + INST(Ldeoral , BaseAtomicOp , (0b1011100011100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 40 ), // #138 + INST(Ldeoralb , BaseAtomicOp , (0b0011100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 41 ), // #139 + INST(Ldeoralh , BaseAtomicOp , (0b0111100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 42 ), // #140 + INST(Ldeorb , BaseAtomicOp , (0b0011100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 43 ), // #141 + INST(Ldeorh , BaseAtomicOp , (0b0111100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 44 ), // #142 + INST(Ldeorl , BaseAtomicOp , (0b1011100001100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 45 ), // #143 + INST(Ldeorlb , BaseAtomicOp , (0b0011100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 46 ), // #144 + INST(Ldeorlh , BaseAtomicOp , (0b0111100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 47 ), // #145 + INST(Ldg , BaseRM_SImm9 , (0b1101100101100000000000, 0b0000000000000000000000, kX , kZR, 0, 4) , kRWI_W , 0 , 0 ), // #146 + INST(Ldgm , BaseRM_NoImm , (0b1101100111100000000000, kX , kZR, 0 ) , kRWI_W , 0 , 6 ), // #147 + INST(Ldlar , BaseRM_NoImm , (0b1000100011011111011111, kWX, kZR, 30) , kRWI_W , 0 , 7 ), // #148 + INST(Ldlarb , BaseRM_NoImm , (0b0000100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 8 ), // #149 + INST(Ldlarh , BaseRM_NoImm , (0b0100100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 9 ), // #150 + INST(Ldnp , BaseLdpStp , (0b0010100001, 0 , kWX, 31, 2) , kRWI_WW , 0 , 0 ), // #151 + INST(Ldp , BaseLdpStp , (0b0010100101, 0b0010100011, kWX, 31, 2) , kRWI_W , 0 , 1 ), // #152 + INST(Ldpsw , BaseLdpStp , (0b0110100101, 0b0110100011, kX , 0 , 2) , kRWI_WW , 0 , 2 ), // #153 + INST(Ldr , BaseLdSt , (0b1011100101, 0b10111000010, 0b10111000011, 0b00011000, kWX, 30, 2, Inst::kIdLdur) , kRWI_W , 0 , 0 ), // #154 + INST(Ldraa , BaseRM_SImm10 , (0b1111100000100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 0 ), // #155 + INST(Ldrab , BaseRM_SImm10 , (0b1111100010100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 1 ), // #156 + INST(Ldrb , BaseLdSt , (0b0011100101, 0b00111000010, 0b00111000011, 0 , kW , 0 , 0, Inst::kIdLdurb) , kRWI_W , 0 , 1 ), // #157 + INST(Ldrh , BaseLdSt , (0b0111100101, 0b01111000010, 0b01111000011, 0 , kW , 0 , 1, Inst::kIdLdurh) , kRWI_W , 0 , 2 ), // #158 + INST(Ldrsb , BaseLdSt , (0b0011100111, 0b00111000100, 0b00111000111, 0 , kWX, 22, 0, Inst::kIdLdursb) , kRWI_W , 0 , 3 ), // #159 + INST(Ldrsh , BaseLdSt , (0b0111100111, 0b01111000100, 0b01111000111, 0 , kWX, 22, 1, Inst::kIdLdursh) , kRWI_W , 0 , 4 ), // #160 + INST(Ldrsw , BaseLdSt , (0b1011100110, 0b10111000100, 0b10111000101, 0b10011000, kX , 0 , 2, Inst::kIdLdursw) , kRWI_W , 0 , 5 ), // #161 + INST(Ldset , BaseAtomicOp , (0b1011100000100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 48 ), // #162 + INST(Ldseta , BaseAtomicOp , (0b1011100010100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 49 ), // #163 + INST(Ldsetab , BaseAtomicOp , (0b0011100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 50 ), // #164 + INST(Ldsetah , BaseAtomicOp , (0b0111100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 51 ), // #165 + INST(Ldsetal , BaseAtomicOp , (0b1011100011100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 52 ), // #166 + INST(Ldsetalb , BaseAtomicOp , (0b0011100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 53 ), // #167 + INST(Ldsetalh , BaseAtomicOp , (0b0111100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 54 ), // #168 + INST(Ldsetb , BaseAtomicOp , (0b0011100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 55 ), // #169 + INST(Ldseth , BaseAtomicOp , (0b0111100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 56 ), // #170 + INST(Ldsetl , BaseAtomicOp , (0b1011100001100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 57 ), // #171 + INST(Ldsetlb , BaseAtomicOp , (0b0011100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 58 ), // #172 + INST(Ldsetlh , BaseAtomicOp , (0b0111100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 59 ), // #173 + INST(Ldsmax , BaseAtomicOp , (0b1011100000100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 60 ), // #174 + INST(Ldsmaxa , BaseAtomicOp , (0b1011100010100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 61 ), // #175 + INST(Ldsmaxab , BaseAtomicOp , (0b0011100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 62 ), // #176 + INST(Ldsmaxah , BaseAtomicOp , (0b0111100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 63 ), // #177 + INST(Ldsmaxal , BaseAtomicOp , (0b1011100011100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 64 ), // #178 + INST(Ldsmaxalb , BaseAtomicOp , (0b0011100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 65 ), // #179 + INST(Ldsmaxalh , BaseAtomicOp , (0b0111100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 66 ), // #180 + INST(Ldsmaxb , BaseAtomicOp , (0b0011100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 67 ), // #181 + INST(Ldsmaxh , BaseAtomicOp , (0b0111100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 68 ), // #182 + INST(Ldsmaxl , BaseAtomicOp , (0b1011100001100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 69 ), // #183 + INST(Ldsmaxlb , BaseAtomicOp , (0b0011100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 70 ), // #184 + INST(Ldsmaxlh , BaseAtomicOp , (0b0111100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 71 ), // #185 + INST(Ldsmin , BaseAtomicOp , (0b1011100000100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 72 ), // #186 + INST(Ldsmina , BaseAtomicOp , (0b1011100010100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 73 ), // #187 + INST(Ldsminab , BaseAtomicOp , (0b0011100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 74 ), // #188 + INST(Ldsminah , BaseAtomicOp , (0b0111100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 75 ), // #189 + INST(Ldsminal , BaseAtomicOp , (0b1011100011100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 76 ), // #190 + INST(Ldsminalb , BaseAtomicOp , (0b0011100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 77 ), // #191 + INST(Ldsminalh , BaseAtomicOp , (0b0111100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 78 ), // #192 + INST(Ldsminb , BaseAtomicOp , (0b0011100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 79 ), // #193 + INST(Ldsminh , BaseAtomicOp , (0b0111100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 80 ), // #194 + INST(Ldsminl , BaseAtomicOp , (0b1011100001100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 81 ), // #195 + INST(Ldsminlb , BaseAtomicOp , (0b0011100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 82 ), // #196 + INST(Ldsminlh , BaseAtomicOp , (0b0111100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 83 ), // #197 + INST(Ldtr , BaseRM_SImm9 , (0b1011100001000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 1 ), // #198 + INST(Ldtrb , BaseRM_SImm9 , (0b0011100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 2 ), // #199 + INST(Ldtrh , BaseRM_SImm9 , (0b0111100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 3 ), // #200 + INST(Ldtrsb , BaseRM_SImm9 , (0b0011100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 4 ), // #201 + INST(Ldtrsh , BaseRM_SImm9 , (0b0111100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 5 ), // #202 + INST(Ldtrsw , BaseRM_SImm9 , (0b1011100010000000000010, 0b0000000000000000000000, kX , kZR, 0 , 0) , kRWI_W , 0 , 6 ), // #203 + INST(Ldumax , BaseAtomicOp , (0b1011100000100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 84 ), // #204 + INST(Ldumaxa , BaseAtomicOp , (0b1011100010100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 85 ), // #205 + INST(Ldumaxab , BaseAtomicOp , (0b0011100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 86 ), // #206 + INST(Ldumaxah , BaseAtomicOp , (0b0111100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 87 ), // #207 + INST(Ldumaxal , BaseAtomicOp , (0b1011100011100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 88 ), // #208 + INST(Ldumaxalb , BaseAtomicOp , (0b0011100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 89 ), // #209 + INST(Ldumaxalh , BaseAtomicOp , (0b0111100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 90 ), // #210 + INST(Ldumaxb , BaseAtomicOp , (0b0011100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 91 ), // #211 + INST(Ldumaxh , BaseAtomicOp , (0b0111100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 92 ), // #212 + INST(Ldumaxl , BaseAtomicOp , (0b1011100001100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 93 ), // #213 + INST(Ldumaxlb , BaseAtomicOp , (0b0011100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 94 ), // #214 + INST(Ldumaxlh , BaseAtomicOp , (0b0111100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 95 ), // #215 + INST(Ldumin , BaseAtomicOp , (0b1011100000100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 96 ), // #216 + INST(Ldumina , BaseAtomicOp , (0b1011100010100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 97 ), // #217 + INST(Lduminab , BaseAtomicOp , (0b0011100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 98 ), // #218 + INST(Lduminah , BaseAtomicOp , (0b0111100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 99 ), // #219 + INST(Lduminal , BaseAtomicOp , (0b1011100011100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 100), // #220 + INST(Lduminalb , BaseAtomicOp , (0b0011100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 101), // #221 + INST(Lduminalh , BaseAtomicOp , (0b0111100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 102), // #222 + INST(Lduminb , BaseAtomicOp , (0b0011100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 103), // #223 + INST(Lduminh , BaseAtomicOp , (0b0111100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 104), // #224 + INST(Lduminl , BaseAtomicOp , (0b1011100001100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 105), // #225 + INST(Lduminlb , BaseAtomicOp , (0b0011100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 106), // #226 + INST(Lduminlh , BaseAtomicOp , (0b0111100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 107), // #227 + INST(Ldur , BaseRM_SImm9 , (0b1011100001000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 7 ), // #228 + INST(Ldurb , BaseRM_SImm9 , (0b0011100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 8 ), // #229 + INST(Ldurh , BaseRM_SImm9 , (0b0111100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 9 ), // #230 + INST(Ldursb , BaseRM_SImm9 , (0b0011100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 10 ), // #231 + INST(Ldursh , BaseRM_SImm9 , (0b0111100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 11 ), // #232 + INST(Ldursw , BaseRM_SImm9 , (0b1011100010000000000000, 0b0000000000000000000000, kX , kZR, 0 , 0) , kRWI_W , 0 , 12 ), // #233 + INST(Ldxp , BaseLdxp , (0b1000100001111111000000, kWX, 30) , kRWI_WW , 0 , 1 ), // #234 + INST(Ldxr , BaseRM_NoImm , (0b1000100001011111011111, kWX, kZR, 30) , kRWI_W , 0 , 10 ), // #235 + INST(Ldxrb , BaseRM_NoImm , (0b0000100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 11 ), // #236 + INST(Ldxrh , BaseRM_NoImm , (0b0100100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 12 ), // #237 + INST(Lsl , BaseShift , (0b0001101011000000001000, 0b0101001100000000000000, 0) , kRWI_W , 0 , 2 ), // #238 + INST(Lslv , BaseShift , (0b0001101011000000001000, 0b0000000000000000000000, 0) , kRWI_W , 0 , 3 ), // #239 + INST(Lsr , BaseShift , (0b0001101011000000001001, 0b0101001100000000011111, 0) , kRWI_W , 0 , 4 ), // #240 + INST(Lsrv , BaseShift , (0b0001101011000000001001, 0b0000000000000000000000, 0) , kRWI_W , 0 , 5 ), // #241 + INST(Madd , BaseRRRR , (0b0001101100000000000000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 ), // #242 + INST(Mneg , BaseRRR , (0b0001101100000000111111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 11 ), // #243 + INST(Mov , BaseMov , (_) , kRWI_W , 0 , 0 ), // #244 + INST(Movk , BaseMovKNZ , (0b01110010100000000000000000000000) , kRWI_X , 0 , 0 ), // #245 + INST(Movn , BaseMovKNZ , (0b00010010100000000000000000000000) , kRWI_W , 0 , 1 ), // #246 + INST(Movz , BaseMovKNZ , (0b01010010100000000000000000000000) , kRWI_W , 0 , 2 ), // #247 + INST(Mrs , BaseMrs , (_) , kRWI_W , 0 , 0 ), // #248 + INST(Msr , BaseMsr , (_) , kRWI_W , 0 , 0 ), // #249 + INST(Msub , BaseRRRR , (0b0001101100000000100000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 ), // #250 + INST(Mul , BaseRRR , (0b0001101100000000011111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 12 ), // #251 + INST(Mvn , BaseMvnNeg , (0b00101010001000000000001111100000) , kRWI_W , 0 , 0 ), // #252 + INST(Neg , BaseMvnNeg , (0b01001011000000000000001111100000) , kRWI_W , 0 , 1 ), // #253 + INST(Negs , BaseMvnNeg , (0b01101011000000000000001111100000) , kRWI_W , 0 , 2 ), // #254 + INST(Ngc , BaseRR , (0b01011010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 7 ), // #255 + INST(Ngcs , BaseRR , (0b01111010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 8 ), // #256 + INST(Nop , BaseOp , (0b11010101000000110010000000011111) , 0 , 0 , 13 ), // #257 + INST(Orn , BaseLogical , (0b0101010001, 0b01100100, 1) , kRWI_W , 0 , 6 ), // #258 + INST(Orr , BaseLogical , (0b0101010000, 0b01100100, 0) , kRWI_W , 0 , 7 ), // #259 + INST(Pacda , BaseRR , (0b11011010110000010000100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 9 ), // #260 + INST(Pacdb , BaseRR , (0b11011010110000010000110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 10 ), // #261 + INST(Pacdza , BaseR , (0b11011010110000010010101111100000, kX, kZR, 0) , kRWI_X , 0 , 4 ), // #262 + INST(Pacdzb , BaseR , (0b11011010110000010010111111100000, kX, kZR, 0) , kRWI_X , 0 , 5 ), // #263 + INST(Pacga , BaseRRR , (0b1001101011000000001100, kX, kZR, kX, kZR, kX, kSP, false) , kRWI_W , 0 , 13 ), // #264 + INST(Prfm , BasePrfm , (0b11111000101, 0b1111100110, 0b11111000100, 0b11011000) , kRWI_R , 0 , 0 ), // #265 + INST(Pssbb , BaseOp , (0b11010101000000110011010010011111) , 0 , 0 , 14 ), // #266 + INST(Rbit , BaseRR , (0b01011010110000000000000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 11 ), // #267 + INST(Ret , BaseBranchReg , (0b11010110010111110000000000000000) , kRWI_R , 0 , 2 ), // #268 + INST(Rev , BaseRev , (_) , kRWI_W , 0 , 0 ), // #269 + INST(Rev16 , BaseRR , (0b01011010110000000000010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 12 ), // #270 + INST(Rev32 , BaseRR , (0b11011010110000000000100000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 13 ), // #271 + INST(Rev64 , BaseRR , (0b11011010110000000000110000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 14 ), // #272 + INST(Ror , BaseShift , (0b0001101011000000001011, 0b0001001110000000000000, 1) , kRWI_W , 0 , 6 ), // #273 + INST(Rorv , BaseShift , (0b0001101011000000001011, 0b0000000000000000000000, 1) , kRWI_W , 0 , 7 ), // #274 + INST(Sbc , BaseRRR , (0b0101101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 14 ), // #275 + INST(Sbcs , BaseRRR , (0b0111101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 15 ), // #276 + INST(Sbfiz , BaseBfi , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 ), // #277 + INST(Sbfm , BaseBfm , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 ), // #278 + INST(Sbfx , BaseBfx , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 ), // #279 + INST(Sdiv , BaseRRR , (0b0001101011000000000011, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 16 ), // #280 + INST(Setf8 , BaseR , (0b00111010000000000000100000001101, kW, kZR, 5) , 0 , 0 , 6 ), // #281 + INST(Setf16 , BaseR , (0b00111010000000000100100000001101, kW, kZR, 5) , 0 , 0 , 7 ), // #282 + INST(Sev , BaseOp , (0b11010101000000110010000010011111) , 0 , 0 , 15 ), // #283 + INST(Sevl , BaseOp , (0b11010101000000110010000010111111) , 0 , 0 , 16 ), // #284 + INST(Smaddl , BaseRRRR , (0b1001101100100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 2 ), // #285 + INST(Smc , BaseOpImm , (0b11010100000000000000000000000011, 16, 5) , 0 , 0 , 11 ), // #286 + INST(Smnegl , BaseRRR , (0b1001101100100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 17 ), // #287 + INST(Smsubl , BaseRRRR , (0b1001101100100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 3 ), // #288 + INST(Smulh , BaseRRR , (0b1001101101000000011111, kX , kZR, kX , kZR, kX , kZR, true) , kRWI_W , 0 , 18 ), // #289 + INST(Smull , BaseRRR , (0b1001101100100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 19 ), // #290 + INST(Ssbb , BaseOp , (0b11010101000000110011000010011111) , 0 , 0 , 17 ), // #291 + INST(St2g , BaseRM_SImm9 , (0b1101100110100000000010, 0b1101100110100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 13 ), // #292 + INST(Stadd , BaseAtomicSt , (0b1011100000100000000000, kWX, 30) , kRWI_RX , 0 , 0 ), // #293 + INST(Staddl , BaseAtomicSt , (0b1011100001100000000000, kWX, 30) , kRWI_RX , 0 , 1 ), // #294 + INST(Staddb , BaseAtomicSt , (0b0011100000100000000000, kW , 0 ) , kRWI_RX , 0 , 2 ), // #295 + INST(Staddlb , BaseAtomicSt , (0b0011100001100000000000, kW , 0 ) , kRWI_RX , 0 , 3 ), // #296 + INST(Staddh , BaseAtomicSt , (0b0111100000100000000000, kW , 0 ) , kRWI_RX , 0 , 4 ), // #297 + INST(Staddlh , BaseAtomicSt , (0b0111100001100000000000, kW , 0 ) , kRWI_RX , 0 , 5 ), // #298 + INST(Stclr , BaseAtomicSt , (0b1011100000100000000100, kWX, 30) , kRWI_RX , 0 , 6 ), // #299 + INST(Stclrl , BaseAtomicSt , (0b1011100001100000000100, kWX, 30) , kRWI_RX , 0 , 7 ), // #300 + INST(Stclrb , BaseAtomicSt , (0b0011100000100000000100, kW , 0 ) , kRWI_RX , 0 , 8 ), // #301 + INST(Stclrlb , BaseAtomicSt , (0b0011100001100000000100, kW , 0 ) , kRWI_RX , 0 , 9 ), // #302 + INST(Stclrh , BaseAtomicSt , (0b0111100000100000000100, kW , 0 ) , kRWI_RX , 0 , 10 ), // #303 + INST(Stclrlh , BaseAtomicSt , (0b0111100001100000000100, kW , 0 ) , kRWI_RX , 0 , 11 ), // #304 + INST(Steor , BaseAtomicSt , (0b1011100000100000001000, kWX, 30) , kRWI_RX , 0 , 12 ), // #305 + INST(Steorl , BaseAtomicSt , (0b1011100001100000001000, kWX, 30) , kRWI_RX , 0 , 13 ), // #306 + INST(Steorb , BaseAtomicSt , (0b0011100000100000001000, kW , 0 ) , kRWI_RX , 0 , 14 ), // #307 + INST(Steorlb , BaseAtomicSt , (0b0011100001100000001000, kW , 0 ) , kRWI_RX , 0 , 15 ), // #308 + INST(Steorh , BaseAtomicSt , (0b0111100000100000001000, kW , 0 ) , kRWI_RX , 0 , 16 ), // #309 + INST(Steorlh , BaseAtomicSt , (0b0111100001100000001000, kW , 0 ) , kRWI_RX , 0 , 17 ), // #310 + INST(Stg , BaseRM_SImm9 , (0b1101100100100000000010, 0b1101100100100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 14 ), // #311 + INST(Stgm , BaseRM_NoImm , (0b1101100110100000000000, kX , kZR, 0 ) , kRWI_RW , 0 , 13 ), // #312 + INST(Stgp , BaseLdpStp , (0b0110100100, 0b0110100010, kX, 0, 4) , kRWI_RRW , 0 , 3 ), // #313 + INST(Stllr , BaseRM_NoImm , (0b1000100010011111011111, kWX, kZR, 30) , kRWI_RW , 0 , 14 ), // #314 + INST(Stllrb , BaseRM_NoImm , (0b0000100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 15 ), // #315 + INST(Stllrh , BaseRM_NoImm , (0b0100100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 16 ), // #316 + INST(Stlr , BaseRM_NoImm , (0b1000100010011111111111, kWX, kZR, 30) , kRWI_RW , 0 , 17 ), // #317 + INST(Stlrb , BaseRM_NoImm , (0b0000100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 18 ), // #318 + INST(Stlrh , BaseRM_NoImm , (0b0100100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 19 ), // #319 + INST(Stlxp , BaseStxp , (0b1000100000100000100000, kWX, 30) , kRWI_WRRX , 0 , 0 ), // #320 + INST(Stlxr , BaseAtomicOp , (0b1000100000000000111111, kWX, 30, 1) , kRWI_WRX , 0 , 108), // #321 + INST(Stlxrb , BaseAtomicOp , (0b0000100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 109), // #322 + INST(Stlxrh , BaseAtomicOp , (0b0100100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 110), // #323 + INST(Stnp , BaseLdpStp , (0b0010100000, 0 , kWX, 31, 2) , kRWI_RRW , 0 , 4 ), // #324 + INST(Stp , BaseLdpStp , (0b0010100100, 0b0010100010, kWX, 31, 2) , kRWI_RRW , 0 , 5 ), // #325 + INST(Str , BaseLdSt , (0b1011100100, 0b10111000000, 0b10111000001, 0 , kWX, 30, 2, Inst::kIdStur) , kRWI_RW , 0 , 6 ), // #326 + INST(Strb , BaseLdSt , (0b0011100100, 0b00111000000, 0b00111000001, 0 , kW , 30, 0, Inst::kIdSturb) , kRWI_RW , 0 , 7 ), // #327 + INST(Strh , BaseLdSt , (0b0111100100, 0b01111000000, 0b01111000001, 0 , kWX, 30, 1, Inst::kIdSturh) , kRWI_RW , 0 , 8 ), // #328 + INST(Stset , BaseAtomicSt , (0b1011100000100000001100, kWX, 30) , kRWI_RX , 0 , 18 ), // #329 + INST(Stsetl , BaseAtomicSt , (0b1011100001100000001100, kWX, 30) , kRWI_RX , 0 , 19 ), // #330 + INST(Stsetb , BaseAtomicSt , (0b0011100000100000001100, kW , 0 ) , kRWI_RX , 0 , 20 ), // #331 + INST(Stsetlb , BaseAtomicSt , (0b0011100001100000001100, kW , 0 ) , kRWI_RX , 0 , 21 ), // #332 + INST(Stseth , BaseAtomicSt , (0b0111100000100000001100, kW , 0 ) , kRWI_RX , 0 , 22 ), // #333 + INST(Stsetlh , BaseAtomicSt , (0b0111100001100000001100, kW , 0 ) , kRWI_RX , 0 , 23 ), // #334 + INST(Stsmax , BaseAtomicSt , (0b1011100000100000010000, kWX, 30) , kRWI_RX , 0 , 24 ), // #335 + INST(Stsmaxl , BaseAtomicSt , (0b1011100001100000010000, kWX, 30) , kRWI_RX , 0 , 25 ), // #336 + INST(Stsmaxb , BaseAtomicSt , (0b0011100000100000010000, kW , 0 ) , kRWI_RX , 0 , 26 ), // #337 + INST(Stsmaxlb , BaseAtomicSt , (0b0011100001100000010000, kW , 0 ) , kRWI_RX , 0 , 27 ), // #338 + INST(Stsmaxh , BaseAtomicSt , (0b0111100000100000010000, kW , 0 ) , kRWI_RX , 0 , 28 ), // #339 + INST(Stsmaxlh , BaseAtomicSt , (0b0111100001100000010000, kW , 0 ) , kRWI_RX , 0 , 29 ), // #340 + INST(Stsmin , BaseAtomicSt , (0b1011100000100000010100, kWX, 30) , kRWI_RX , 0 , 30 ), // #341 + INST(Stsminl , BaseAtomicSt , (0b1011100001100000010100, kWX, 30) , kRWI_RX , 0 , 31 ), // #342 + INST(Stsminb , BaseAtomicSt , (0b0011100000100000010100, kW , 0 ) , kRWI_RX , 0 , 32 ), // #343 + INST(Stsminlb , BaseAtomicSt , (0b0011100001100000010100, kW , 0 ) , kRWI_RX , 0 , 33 ), // #344 + INST(Stsminh , BaseAtomicSt , (0b0111100000100000010100, kW , 0 ) , kRWI_RX , 0 , 34 ), // #345 + INST(Stsminlh , BaseAtomicSt , (0b0111100001100000010100, kW , 0 ) , kRWI_RX , 0 , 35 ), // #346 + INST(Sttr , BaseRM_SImm9 , (0b1011100000000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 15 ), // #347 + INST(Sttrb , BaseRM_SImm9 , (0b0011100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 16 ), // #348 + INST(Sttrh , BaseRM_SImm9 , (0b0111100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 17 ), // #349 + INST(Stumax , BaseAtomicSt , (0b1011100000100000011000, kWX, 30) , kRWI_RX , 0 , 36 ), // #350 + INST(Stumaxl , BaseAtomicSt , (0b1011100001100000011000, kWX, 30) , kRWI_RX , 0 , 37 ), // #351 + INST(Stumaxb , BaseAtomicSt , (0b0011100000100000011000, kW , 0 ) , kRWI_RX , 0 , 38 ), // #352 + INST(Stumaxlb , BaseAtomicSt , (0b0011100001100000011000, kW , 0 ) , kRWI_RX , 0 , 39 ), // #353 + INST(Stumaxh , BaseAtomicSt , (0b0111100000100000011000, kW , 0 ) , kRWI_RX , 0 , 40 ), // #354 + INST(Stumaxlh , BaseAtomicSt , (0b0111100001100000011000, kW , 0 ) , kRWI_RX , 0 , 41 ), // #355 + INST(Stumin , BaseAtomicSt , (0b1011100000100000011100, kWX, 30) , kRWI_RX , 0 , 42 ), // #356 + INST(Stuminl , BaseAtomicSt , (0b1011100001100000011100, kWX, 30) , kRWI_RX , 0 , 43 ), // #357 + INST(Stuminb , BaseAtomicSt , (0b0011100000100000011100, kW , 0 ) , kRWI_RX , 0 , 44 ), // #358 + INST(Stuminlb , BaseAtomicSt , (0b0011100001100000011100, kW , 0 ) , kRWI_RX , 0 , 45 ), // #359 + INST(Stuminh , BaseAtomicSt , (0b0111100000100000011100, kW , 0 ) , kRWI_RX , 0 , 46 ), // #360 + INST(Stuminlh , BaseAtomicSt , (0b0111100001100000011100, kW , 0 ) , kRWI_RX , 0 , 47 ), // #361 + INST(Stur , BaseRM_SImm9 , (0b1011100000000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 18 ), // #362 + INST(Sturb , BaseRM_SImm9 , (0b0011100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 19 ), // #363 + INST(Sturh , BaseRM_SImm9 , (0b0111100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 20 ), // #364 + INST(Stxp , BaseStxp , (0b1000100000100000000000, kWX, 30) , kRWI_WRRW , 0 , 1 ), // #365 + INST(Stxr , BaseStx , (0b1000100000000000011111, kWX, 30) , kRWI_WRW , 0 , 0 ), // #366 + INST(Stxrb , BaseStx , (0b0000100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 1 ), // #367 + INST(Stxrh , BaseStx , (0b0100100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 2 ), // #368 + INST(Stz2g , BaseRM_SImm9 , (0b1101100111100000000010, 0b1101100111100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 21 ), // #369 + INST(Stzg , BaseRM_SImm9 , (0b1101100101100000000010, 0b1101100101100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 22 ), // #370 + INST(Stzgm , BaseRM_NoImm , (0b1101100100100000000000, kX , kZR, 0) , kRWI_RW , 0 , 20 ), // #371 + INST(Sub , BaseAddSub , (0b1001011000, 0b1001011001, 0b1010001) , kRWI_W , 0 , 2 ), // #372 + INST(Subg , BaseRRII , (0b1101000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 1 ), // #373 + INST(Subp , BaseRRR , (0b1001101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 20 ), // #374 + INST(Subps , BaseRRR , (0b1011101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 21 ), // #375 + INST(Subs , BaseAddSub , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_W , 0 , 3 ), // #376 + INST(Svc , BaseOpImm , (0b11010100000000000000000000000001, 16, 5) , 0 , 0 , 12 ), // #377 + INST(Swp , BaseAtomicOp , (0b1011100000100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 111), // #378 + INST(Swpa , BaseAtomicOp , (0b1011100010100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 112), // #379 + INST(Swpab , BaseAtomicOp , (0b0011100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 113), // #380 + INST(Swpah , BaseAtomicOp , (0b0111100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 114), // #381 + INST(Swpal , BaseAtomicOp , (0b1011100011100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 115), // #382 + INST(Swpalb , BaseAtomicOp , (0b0011100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 116), // #383 + INST(Swpalh , BaseAtomicOp , (0b0111100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 117), // #384 + INST(Swpb , BaseAtomicOp , (0b0011100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 118), // #385 + INST(Swph , BaseAtomicOp , (0b0111100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 119), // #386 + INST(Swpl , BaseAtomicOp , (0b1011100001100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 120), // #387 + INST(Swplb , BaseAtomicOp , (0b0011100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 121), // #388 + INST(Swplh , BaseAtomicOp , (0b0111100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 122), // #389 + INST(Sxtb , BaseExtend , (0b0001001100000000000111, kWX, 0) , kRWI_W , 0 , 0 ), // #390 + INST(Sxth , BaseExtend , (0b0001001100000000001111, kWX, 0) , kRWI_W , 0 , 1 ), // #391 + INST(Sxtw , BaseExtend , (0b1001001101000000011111, kX , 0) , kRWI_W , 0 , 2 ), // #392 + INST(Sys , BaseSys , (_) , kRWI_W , 0 , 0 ), // #393 + INST(Tlbi , BaseAtDcIcTlbi , (0b00011110000000, 0b00010000000000, false) , kRWI_RX , 0 , 3 ), // #394 + INST(Tst , BaseTst , (0b1101010000, 0b111001000) , kRWI_R , 0 , 0 ), // #395 + INST(Tbnz , BaseBranchTst , (0b00110111000000000000000000000000) , kRWI_R , 0 , 0 ), // #396 + INST(Tbz , BaseBranchTst , (0b00110110000000000000000000000000) , kRWI_R , 0 , 1 ), // #397 + INST(Ubfiz , BaseBfi , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 ), // #398 + INST(Ubfm , BaseBfm , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 ), // #399 + INST(Ubfx , BaseBfx , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 ), // #400 + INST(Udf , BaseOpImm , (0b00000000000000000000000000000000, 16, 0) , 0 , 0 , 13 ), // #401 + INST(Udiv , BaseRRR , (0b0001101011000000000010, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 22 ), // #402 + INST(Umaddl , BaseRRRR , (0b1001101110100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 4 ), // #403 + INST(Umnegl , BaseRRR , (0b1001101110100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 23 ), // #404 + INST(Umull , BaseRRR , (0b1001101110100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 24 ), // #405 + INST(Umulh , BaseRRR , (0b1001101111000000011111, kX , kZR, kX , kZR, kX , kZR, false) , kRWI_W , 0 , 25 ), // #406 + INST(Umsubl , BaseRRRR , (0b1001101110100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 5 ), // #407 + INST(Uxtb , BaseExtend , (0b0101001100000000000111, kW, 1) , kRWI_W , 0 , 3 ), // #408 + INST(Uxth , BaseExtend , (0b0101001100000000001111, kW, 1) , kRWI_W , 0 , 4 ), // #409 + INST(Wfe , BaseOp , (0b11010101000000110010000001011111) , 0 , 0 , 18 ), // #410 + INST(Wfi , BaseOp , (0b11010101000000110010000001111111) , 0 , 0 , 19 ), // #411 + INST(Xaflag , BaseOp , (0b11010101000000000100000000111111) , 0 , 0 , 20 ), // #412 + INST(Xpacd , BaseR , (0b11011010110000010100011111100000, kX, kZR, 0) , kRWI_X , 0 , 8 ), // #413 + INST(Xpaci , BaseR , (0b11011010110000010100001111100000, kX, kZR, 0) , kRWI_X , 0 , 9 ), // #414 + INST(Xpaclri , BaseOp , (0b11010101000000110010000011111111) , kRWI_X , 0 , 21 ), // #415 + INST(Yield , BaseOp , (0b11010101000000110010000000111111) , 0 , 0 , 22 ), // #416 + INST(Abs_v , ISimdVV , (0b0000111000100000101110, kVO_V_Any) , kRWI_W , 0 , 0 ), // #417 + INST(Add_v , ISimdVVV , (0b0000111000100000100001, kVO_V_Any) , kRWI_W , 0 , 0 ), // #418 + INST(Addhn_v , ISimdVVV , (0b0000111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 1 ), // #419 + INST(Addhn2_v , ISimdVVV , (0b0100111000100000010000, kVO_V_B16H8S4) , kRWI_W , F(Narrow) , 2 ), // #420 + INST(Addp_v , ISimdPair , (0b0101111000110001101110, 0b0000111000100000101111, kVO_V_Any) , kRWI_W , F(Pair) , 0 ), // #421 + INST(Addv_v , ISimdSV , (0b0000111000110001101110, kVO_V_BH_4S) , kRWI_W , 0 , 0 ), // #422 + INST(Aesd_v , ISimdVVx , (0b0100111000101000010110, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 0 ), // #423 + INST(Aese_v , ISimdVVx , (0b0100111000101000010010, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 1 ), // #424 + INST(Aesimc_v , ISimdVVx , (0b0100111000101000011110, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 2 ), // #425 + INST(Aesmc_v , ISimdVVx , (0b0100111000101000011010, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 3 ), // #426 + INST(And_v , ISimdVVV , (0b0000111000100000000111, kVO_V_B) , kRWI_W , 0 , 3 ), // #427 + INST(Bcax_v , ISimdVVVV , (0b1100111000100000000000, kVO_V_B16) , kRWI_W , 0 , 0 ), // #428 + INST(Bfcvt_v , ISimdVVx , (0b0001111001100011010000, kOp_H, kOp_S) , kRWI_W , 0 , 4 ), // #429 + INST(Bfcvtn_v , ISimdVVx , (0b0000111010100001011010, kOp_V4H, kOp_V4S) , kRWI_W , F(Narrow) , 5 ), // #430 + INST(Bfcvtn2_v , ISimdVVx , (0b0100111010100001011010, kOp_V8H, kOp_V4S) , kRWI_W , F(Narrow) , 6 ), // #431 + INST(Bfdot_v , SimdDot , (0b0010111001000000111111, 0b0000111101000000111100, kET_S, kET_H, kET_2H) , kRWI_X , 0 , 0 ), // #432 + INST(Bfmlalb_v , SimdFmlal , (0b0010111011000000111111, 0b0000111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 0 ), // #433 + INST(Bfmlalt_v , SimdFmlal , (0b0110111011000000111111, 0b0100111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 1 ), // #434 + INST(Bfmmla_v , ISimdVVVx , (0b0110111001000000111011, kOp_V4S, kOp_V8H, kOp_V8H) , kRWI_X , F(Long) , 0 ), // #435 + INST(Bic_v , SimdBicOrr , (0b0000111001100000000111, 0b0010111100000000000001) , kRWI_W , 0 , 0 ), // #436 + INST(Bif_v , ISimdVVV , (0b0010111011100000000111, kVO_V_B) , kRWI_X , 0 , 4 ), // #437 + INST(Bit_v , ISimdVVV , (0b0010111010100000000111, kVO_V_B) , kRWI_X , 0 , 5 ), // #438 + INST(Bsl_v , ISimdVVV , (0b0010111001100000000111, kVO_V_B) , kRWI_X , 0 , 6 ), // #439 + INST(Cls_v , ISimdVV , (0b0000111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 1 ), // #440 + INST(Clz_v , ISimdVV , (0b0010111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 2 ), // #441 + INST(Cmeq_v , SimdCmp , (0b0010111000100000100011, 0b0000111000100000100110, kVO_V_Any) , kRWI_W , 0 , 0 ), // #442 + INST(Cmge_v , SimdCmp , (0b0000111000100000001111, 0b0010111000100000100010, kVO_V_Any) , kRWI_W , 0 , 1 ), // #443 + INST(Cmgt_v , SimdCmp , (0b0000111000100000001101, 0b0000111000100000100010, kVO_V_Any) , kRWI_W , 0 , 2 ), // #444 + INST(Cmhi_v , SimdCmp , (0b0010111000100000001101, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 3 ), // #445 + INST(Cmhs_v , SimdCmp , (0b0010111000100000001111, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 4 ), // #446 + INST(Cmle_v , SimdCmp , (0b0000000000000000000000, 0b0010111000100000100110, kVO_V_Any) , kRWI_W , 0 , 5 ), // #447 + INST(Cmlt_v , SimdCmp , (0b0000000000000000000000, 0b0000111000100000101010, kVO_V_Any) , kRWI_W , 0 , 6 ), // #448 + INST(Cmtst_v , ISimdVVV , (0b0000111000100000100011, kVO_V_Any) , kRWI_W , 0 , 7 ), // #449 + INST(Cnt_v , ISimdVV , (0b0000111000100000010110, kVO_V_B) , kRWI_W , 0 , 3 ), // #450 + INST(Dup_v , SimdDup , (_) , kRWI_W , 0 , 0 ), // #451 + INST(Eor_v , ISimdVVV , (0b0010111000100000000111, kVO_V_B) , kRWI_W , 0 , 8 ), // #452 + INST(Eor3_v , ISimdVVVV , (0b1100111000000000000000, kVO_V_B16) , kRWI_W , 0 , 1 ), // #453 + INST(Ext_v , ISimdVVVI , (0b0010111000000000000000, kVO_V_B, 4, 11, 1) , kRWI_W , 0 , 0 ), // #454 + INST(Fabd_v , FSimdVVV , (0b0111111010100000110101, kHF_C, 0b0010111010100000110101, kHF_C) , kRWI_W , 0 , 0 ), // #455 + INST(Fabs_v , FSimdVV , (0b0001111000100000110000, kHF_A, 0b0000111010100000111110, kHF_B) , kRWI_W , 0 , 0 ), // #456 + INST(Facge_v , FSimdVVV , (0b0111111000100000111011, kHF_C, 0b0010111000100000111011, kHF_C) , kRWI_W , 0 , 1 ), // #457 + INST(Facgt_v , FSimdVVV , (0b0111111010100000111011, kHF_C, 0b0010111010100000111011, kHF_C) , kRWI_W , 0 , 2 ), // #458 + INST(Fadd_v , FSimdVVV , (0b0001111000100000001010, kHF_A, 0b0000111000100000110101, kHF_C) , kRWI_W , 0 , 3 ), // #459 + INST(Faddp_v , FSimdPair , (0b0111111000110000110110, 0b0010111000100000110101) , kRWI_W , 0 , 0 ), // #460 + INST(Fcadd_v , SimdFcadd , (0b0010111000000000111001) , kRWI_W , 0 , 0 ), // #461 + INST(Fccmp_v , SimdFccmpFccmpe , (0b00011110001000000000010000000000) , kRWI_R , 0 , 0 ), // #462 + INST(Fccmpe_v , SimdFccmpFccmpe , (0b00011110001000000000010000010000) , kRWI_R , 0 , 1 ), // #463 + INST(Fcmeq_v , SimdFcm , (0b0000111000100000111001, kHF_C, 0b0000111010100000110110) , kRWI_W , 0 , 0 ), // #464 + INST(Fcmge_v , SimdFcm , (0b0010111000100000111001, kHF_C, 0b0010111010100000110010) , kRWI_W , 0 , 1 ), // #465 + INST(Fcmgt_v , SimdFcm , (0b0010111010100000111001, kHF_C, 0b0000111010100000110010) , kRWI_W , 0 , 2 ), // #466 + INST(Fcmla_v , SimdFcmla , (0b0010111000000000110001, 0b0010111100000000000100) , kRWI_X , 0 , 0 ), // #467 + INST(Fcmle_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0010111010100000110110) , kRWI_W , 0 , 3 ), // #468 + INST(Fcmlt_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0000111010100000111010) , kRWI_W , 0 , 4 ), // #469 + INST(Fcmp_v , SimdFcmpFcmpe , (0b00011110001000000010000000000000) , kRWI_R , 0 , 0 ), // #470 + INST(Fcmpe_v , SimdFcmpFcmpe , (0b00011110001000000010000000010000) , kRWI_R , 0 , 1 ), // #471 + INST(Fcsel_v , SimdFcsel , (_) , kRWI_W , 0 , 0 ), // #472 + INST(Fcvt_v , SimdFcvt , (_) , kRWI_W , 0 , 0 ), // #473 + INST(Fcvtas_v , SimdFcvtSV , (0b0000111000100001110010, 0b0000000000000000000000, 0b0001111000100100000000, 1) , kRWI_W , 0 , 0 ), // #474 + INST(Fcvtau_v , SimdFcvtSV , (0b0010111000100001110010, 0b0000000000000000000000, 0b0001111000100101000000, 1) , kRWI_W , 0 , 1 ), // #475 + INST(Fcvtl_v , SimdFcvtLN , (0b0000111000100001011110, 0, 0) , kRWI_W , F(Long) , 0 ), // #476 + INST(Fcvtl2_v , SimdFcvtLN , (0b0100111000100001011110, 0, 0) , kRWI_W , F(Long) , 1 ), // #477 + INST(Fcvtms_v , SimdFcvtSV , (0b0000111000100001101110, 0b0000000000000000000000, 0b0001111000110000000000, 1) , kRWI_W , 0 , 2 ), // #478 + INST(Fcvtmu_v , SimdFcvtSV , (0b0010111000100001101110, 0b0000000000000000000000, 0b0001111000110001000000, 1) , kRWI_W , 0 , 3 ), // #479 + INST(Fcvtn_v , SimdFcvtLN , (0b0000111000100001011010, 0, 0) , kRWI_W , F(Narrow) , 2 ), // #480 + INST(Fcvtn2_v , SimdFcvtLN , (0b0100111000100001011010, 0, 0) , kRWI_X , F(Narrow) , 3 ), // #481 + INST(Fcvtns_v , SimdFcvtSV , (0b0000111000100001101010, 0b0000000000000000000000, 0b0001111000100000000000, 1) , kRWI_W , 0 , 4 ), // #482 + INST(Fcvtnu_v , SimdFcvtSV , (0b0010111000100001101010, 0b0000000000000000000000, 0b0001111000100001000000, 1) , kRWI_W , 0 , 5 ), // #483 + INST(Fcvtps_v , SimdFcvtSV , (0b0000111010100001101010, 0b0000000000000000000000, 0b0001111000101000000000, 1) , kRWI_W , 0 , 6 ), // #484 + INST(Fcvtpu_v , SimdFcvtSV , (0b0010111010100001101010, 0b0000000000000000000000, 0b0001111000101001000000, 1) , kRWI_W , 0 , 7 ), // #485 + INST(Fcvtxn_v , SimdFcvtLN , (0b0010111000100001011010, 1, 1) , kRWI_W , F(Narrow) , 4 ), // #486 + INST(Fcvtxn2_v , SimdFcvtLN , (0b0110111000100001011010, 1, 0) , kRWI_X , F(Narrow) , 5 ), // #487 + INST(Fcvtzs_v , SimdFcvtSV , (0b0000111010100001101110, 0b0000111100000000111111, 0b0001111000111000000000, 1) , kRWI_W , 0 , 8 ), // #488 + INST(Fcvtzu_v , SimdFcvtSV , (0b0010111010100001101110, 0b0010111100000000111111, 0b0001111000111001000000, 1) , kRWI_W , 0 , 9 ), // #489 + INST(Fdiv_v , FSimdVVV , (0b0001111000100000000110, kHF_A, 0b0010111000100000111111, kHF_C) , kRWI_W , 0 , 4 ), // #490 + INST(Fjcvtzs_v , ISimdVVx , (0b0001111001111110000000, kOp_GpW, kOp_D) , kRWI_W , 0 , 7 ), // #491 + INST(Fmadd_v , FSimdVVVV , (0b0001111100000000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 0 ), // #492 + INST(Fmax_v , FSimdVVV , (0b0001111000100000010010, kHF_A, 0b0000111000100000111101, kHF_C) , kRWI_W , 0 , 5 ), // #493 + INST(Fmaxnm_v , FSimdVVV , (0b0001111000100000011010, kHF_A, 0b0000111000100000110001, kHF_C) , kRWI_W , 0 , 6 ), // #494 + INST(Fmaxnmp_v , FSimdPair , (0b0111111000110000110010, 0b0010111000100000110001) , kRWI_W , 0 , 1 ), // #495 + INST(Fmaxnmv_v , FSimdSV , (0b0010111000110000110010) , kRWI_W , 0 , 0 ), // #496 + INST(Fmaxp_v , FSimdPair , (0b0111111000110000111110, 0b0010111000100000111101) , kRWI_W , 0 , 2 ), // #497 + INST(Fmaxv_v , FSimdSV , (0b0010111000110000111110) , kRWI_W , 0 , 1 ), // #498 + INST(Fmin_v , FSimdVVV , (0b0001111000100000010110, kHF_A, 0b0000111010100000111101, kHF_C) , kRWI_W , 0 , 7 ), // #499 + INST(Fminnm_v , FSimdVVV , (0b0001111000100000011110, kHF_A, 0b0000111010100000110001, kHF_C) , kRWI_W , 0 , 8 ), // #500 + INST(Fminnmp_v , FSimdPair , (0b0111111010110000110010, 0b0010111010100000110001) , kRWI_W , 0 , 3 ), // #501 + INST(Fminnmv_v , FSimdSV , (0b0010111010110000110010) , kRWI_W , 0 , 2 ), // #502 + INST(Fminp_v , FSimdPair , (0b0111111010110000111110, 0b0010111010100000111101) , kRWI_W , 0 , 4 ), // #503 + INST(Fminv_v , FSimdSV , (0b0010111010110000111110) , kRWI_W , 0 , 3 ), // #504 + INST(Fmla_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111000100000110011, 0b0000111110000000000100) , kRWI_X , F(VH0_15) , 0 ), // #505 + INST(Fmlal_v , SimdFmlal , (0b0000111000100000111011, 0b0000111110000000000000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 2 ), // #506 + INST(Fmlal2_v , SimdFmlal , (0b0010111000100000110011, 0b0010111110000000100000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 3 ), // #507 + INST(Fmls_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111010100000110011, 0b0000111110000000010100) , kRWI_X , F(VH0_15) , 1 ), // #508 + INST(Fmlsl_v , SimdFmlal , (0b0000111010100000111011, 0b0000111110000000010000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 4 ), // #509 + INST(Fmlsl2_v , SimdFmlal , (0b0010111010100000110011, 0b0010111110000000110000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 5 ), // #510 + INST(Fmov_v , SimdFmov , (_) , kRWI_W , 0 , 0 ), // #511 + INST(Fmsub_v , FSimdVVVV , (0b0001111100000000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 1 ), // #512 + INST(Fmul_v , FSimdVVVe , (0b0001111000100000000010, kHF_A, 0b0010111000100000110111, 0b0000111110000000100100) , kRWI_W , F(VH0_15) , 2 ), // #513 + INST(Fmulx_v , FSimdVVVe , (0b0101111000100000110111, kHF_C, 0b0000111000100000110111, 0b0010111110000000100100) , kRWI_W , F(VH0_15) , 3 ), // #514 + INST(Fneg_v , FSimdVV , (0b0001111000100001010000, kHF_A, 0b0010111010100000111110, kHF_B) , kRWI_W , 0 , 1 ), // #515 + INST(Fnmadd_v , FSimdVVVV , (0b0001111100100000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 2 ), // #516 + INST(Fnmsub_v , FSimdVVVV , (0b0001111100100000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 ), // #517 + INST(Fnmul_v , FSimdVVV , (0b0001111000100000100010, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 9 ), // #518 + INST(Frecpe_v , FSimdVV , (0b0101111010100001110110, kHF_B, 0b0000111010100001110110, kHF_B) , kRWI_W , 0 , 2 ), // #519 + INST(Frecps_v , FSimdVVV , (0b0101111000100000111111, kHF_C, 0b0000111000100000111111, kHF_C) , kRWI_W , 0 , 10 ), // #520 + INST(Frecpx_v , FSimdVV , (0b0101111010100001111110, kHF_B, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 ), // #521 + INST(Frint32x_v , FSimdVV , (0b0001111000101000110000, kHF_N, 0b0010111000100001111010, kHF_N) , kRWI_W , 0 , 4 ), // #522 + INST(Frint32z_v , FSimdVV , (0b0001111000101000010000, kHF_N, 0b0000111000100001111010, kHF_N) , kRWI_W , 0 , 5 ), // #523 + INST(Frint64x_v , FSimdVV , (0b0001111000101001110000, kHF_N, 0b0010111000100001111110, kHF_N) , kRWI_W , 0 , 6 ), // #524 + INST(Frint64z_v , FSimdVV , (0b0001111000101001010000, kHF_N, 0b0000111000100001111110, kHF_N) , kRWI_W , 0 , 7 ), // #525 + INST(Frinta_v , FSimdVV , (0b0001111000100110010000, kHF_A, 0b0010111000100001100010, kHF_B) , kRWI_W , 0 , 8 ), // #526 + INST(Frinti_v , FSimdVV , (0b0001111000100111110000, kHF_A, 0b0010111010100001100110, kHF_B) , kRWI_W , 0 , 9 ), // #527 + INST(Frintm_v , FSimdVV , (0b0001111000100101010000, kHF_A, 0b0000111000100001100110, kHF_B) , kRWI_W , 0 , 10 ), // #528 + INST(Frintn_v , FSimdVV , (0b0001111000100100010000, kHF_A, 0b0000111000100001100010, kHF_B) , kRWI_W , 0 , 11 ), // #529 + INST(Frintp_v , FSimdVV , (0b0001111000100100110000, kHF_A, 0b0000111010100001100010, kHF_B) , kRWI_W , 0 , 12 ), // #530 + INST(Frintx_v , FSimdVV , (0b0001111000100111010000, kHF_A, 0b0010111000100001100110, kHF_B) , kRWI_W , 0 , 13 ), // #531 + INST(Frintz_v , FSimdVV , (0b0001111000100101110000, kHF_A, 0b0000111010100001100110, kHF_B) , kRWI_W , 0 , 14 ), // #532 + INST(Frsqrte_v , FSimdVV , (0b0111111010100001110110, kHF_B, 0b0010111010100001110110, kHF_B) , kRWI_W , 0 , 15 ), // #533 + INST(Frsqrts_v , FSimdVVV , (0b0101111010100000111111, kHF_C, 0b0000111010100000111111, kHF_C) , kRWI_W , 0 , 11 ), // #534 + INST(Fsqrt_v , FSimdVV , (0b0001111000100001110000, kHF_A, 0b0010111010100001111110, kHF_B) , kRWI_W , 0 , 16 ), // #535 + INST(Fsub_v , FSimdVVV , (0b0001111000100000001110, kHF_A, 0b0000111010100000110101, kHF_C) , kRWI_W , 0 , 12 ), // #536 + INST(Ins_v , SimdIns , (_) , kRWI_X , 0 , 0 ), // #537 + INST(Ld1_v , SimdLdNStN , (0b0000110101000000000000, 0b0000110001000000001000, 1, 0) , kRWI_LDn , F(Consecutive) , 0 ), // #538 + INST(Ld1r_v , SimdLdNStN , (0b0000110101000000110000, 0b0000000000000000000000, 1, 1) , kRWI_LDn , F(Consecutive) , 1 ), // #539 + INST(Ld2_v , SimdLdNStN , (0b0000110101100000000000, 0b0000110001000000100000, 2, 0) , kRWI_LDn , F(Consecutive) , 2 ), // #540 + INST(Ld2r_v , SimdLdNStN , (0b0000110101100000110000, 0b0000000000000000000000, 2, 1) , kRWI_LDn , F(Consecutive) , 3 ), // #541 + INST(Ld3_v , SimdLdNStN , (0b0000110101000000001000, 0b0000110001000000010000, 3, 0) , kRWI_LDn , F(Consecutive) , 4 ), // #542 + INST(Ld3r_v , SimdLdNStN , (0b0000110101000000111000, 0b0000000000000000000000, 3, 1) , kRWI_LDn , F(Consecutive) , 5 ), // #543 + INST(Ld4_v , SimdLdNStN , (0b0000110101100000001000, 0b0000110001000000000000, 4, 0) , kRWI_LDn , F(Consecutive) , 6 ), // #544 + INST(Ld4r_v , SimdLdNStN , (0b0000110101100000111000, 0b0000000000000000000000, 4, 1) , kRWI_LDn , F(Consecutive) , 7 ), // #545 + INST(Ldnp_v , SimdLdpStp , (0b0010110001, 0b0000000000) , kRWI_WW , 0 , 0 ), // #546 + INST(Ldp_v , SimdLdpStp , (0b0010110101, 0b0010110011) , kRWI_WW , 0 , 1 ), // #547 + INST(Ldr_v , SimdLdSt , (0b0011110101, 0b00111100010, 0b00111100011, 0b00011100, Inst::kIdLdur_v) , kRWI_W , 0 , 0 ), // #548 + INST(Ldur_v , SimdLdurStur , (0b0011110001000000000000) , kRWI_W , 0 , 0 ), // #549 + INST(Mla_v , ISimdVVVe , (0b0000111000100000100101, kVO_V_BHS, 0b0010111100000000000000, kVO_V_HS) , kRWI_X , F(VH0_15) , 0 ), // #550 + INST(Mls_v , ISimdVVVe , (0b0010111000100000100101, kVO_V_BHS, 0b0010111100000000010000, kVO_V_HS) , kRWI_X , F(VH0_15) , 1 ), // #551 + INST(Mov_v , SimdMov , (_) , kRWI_W , 0 , 0 ), // #552 + INST(Movi_v , SimdMoviMvni , (0b0000111100000000000001, 0) , kRWI_W , 0 , 0 ), // #553 + INST(Mul_v , ISimdVVVe , (0b0000111000100000100111, kVO_V_BHS, 0b0000111100000000100000, kVO_V_HS) , kRWI_W , F(VH0_15) , 2 ), // #554 + INST(Mvn_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 4 ), // #555 + INST(Mvni_v , SimdMoviMvni , (0b0000111100000000000001, 1) , kRWI_W , 0 , 1 ), // #556 + INST(Neg_v , ISimdVV , (0b0010111000100000101110, kVO_V_Any) , kRWI_W , 0 , 5 ), // #557 + INST(Not_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 6 ), // #558 + INST(Orn_v , ISimdVVV , (0b0000111011100000000111, kVO_V_B) , kRWI_W , 0 , 9 ), // #559 + INST(Orr_v , SimdBicOrr , (0b0000111010100000000111, 0b0000111100000000000001) , kRWI_W , 0 , 1 ), // #560 + INST(Pmul_v , ISimdVVV , (0b0010111000100000100111, kVO_V_B) , kRWI_W , 0 , 10 ), // #561 + INST(Pmull_v , ISimdVVV , (0b0000111000100000111000, kVO_V_B8D1) , kRWI_W , F(Long) , 11 ), // #562 + INST(Pmull2_v , ISimdVVV , (0b0100111000100000111000, kVO_V_B16D2) , kRWI_W , F(Long) , 12 ), // #563 + INST(Raddhn_v , ISimdVVV , (0b0010111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 13 ), // #564 + INST(Raddhn2_v , ISimdVVV , (0b0110111000100000010000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 ), // #565 + INST(Rax1_v , ISimdVVV , (0b1100111001100000100011, kVO_V_D2) , kRWI_W , 0 , 15 ), // #566 + INST(Rbit_v , ISimdVV , (0b0010111001100000010110, kVO_V_B) , kRWI_W , 0 , 7 ), // #567 + INST(Rev16_v , ISimdVV , (0b0000111000100000000110, kVO_V_B) , kRWI_W , 0 , 8 ), // #568 + INST(Rev32_v , ISimdVV , (0b0010111000100000000010, kVO_V_BH) , kRWI_W , 0 , 9 ), // #569 + INST(Rev64_v , ISimdVV , (0b0000111000100000000010, kVO_V_BHS) , kRWI_W , 0 , 10 ), // #570 + INST(Rshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100011, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 0 ), // #571 + INST(Rshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 1 ), // #572 + INST(Rsubhn_v , ISimdVVV , (0b0010111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 16 ), // #573 + INST(Rsubhn2_v , ISimdVVV , (0b0110111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 17 ), // #574 + INST(Saba_v , ISimdVVV , (0b0000111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 18 ), // #575 + INST(Sabal_v , ISimdVVV , (0b0000111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 19 ), // #576 + INST(Sabal2_v , ISimdVVV , (0b0100111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 20 ), // #577 + INST(Sabd_v , ISimdVVV , (0b0000111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 21 ), // #578 + INST(Sabdl_v , ISimdVVV , (0b0000111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 ), // #579 + INST(Sabdl2_v , ISimdVVV , (0b0100111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 ), // #580 + INST(Sadalp_v , ISimdVV , (0b0000111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 11 ), // #581 + INST(Saddl_v , ISimdVVV , (0b0000111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 24 ), // #582 + INST(Saddl2_v , ISimdVVV , (0b0100111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 25 ), // #583 + INST(Saddlp_v , ISimdVV , (0b0000111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 12 ), // #584 + INST(Saddlv_v , ISimdSV , (0b0000111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 1 ), // #585 + INST(Saddw_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 0 ), // #586 + INST(Saddw2_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 1 ), // #587 + INST(Scvtf_v , SimdFcvtSV , (0b0000111000100001110110, 0b0000111100000000111001, 0b0001111000100010000000, 0) , kRWI_W , 0 , 10 ), // #588 + INST(Sdot_v , SimdDot , (0b0000111010000000100101, 0b0000111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 1 ), // #589 + INST(Sha1c_v , ISimdVVVx , (0b0101111000000000000000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 1 ), // #590 + INST(Sha1h_v , ISimdVVx , (0b0101111000101000000010, kOp_S, kOp_S) , kRWI_W , 0 , 8 ), // #591 + INST(Sha1m_v , ISimdVVVx , (0b0101111000000000001000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 2 ), // #592 + INST(Sha1p_v , ISimdVVVx , (0b0101111000000000000100, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 3 ), // #593 + INST(Sha1su0_v , ISimdVVVx , (0b0101111000000000001100, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 4 ), // #594 + INST(Sha1su1_v , ISimdVVx , (0b0101111000101000000110, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 9 ), // #595 + INST(Sha256h_v , ISimdVVVx , (0b0101111000000000010000, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 5 ), // #596 + INST(Sha256h2_v , ISimdVVVx , (0b0101111000000000010100, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 6 ), // #597 + INST(Sha256su0_v , ISimdVVx , (0b0101111000101000001010, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 10 ), // #598 + INST(Sha256su1_v , ISimdVVVx , (0b0101111000000000011000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 7 ), // #599 + INST(Sha512h_v , ISimdVVVx , (0b1100111001100000100000, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 8 ), // #600 + INST(Sha512h2_v , ISimdVVVx , (0b1100111001100000100001, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 9 ), // #601 + INST(Sha512su0_v , ISimdVVx , (0b1100111011000000100000, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 11 ), // #602 + INST(Sha512su1_v , ISimdVVVx , (0b1100111001100000100010, kOp_V2D, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 10 ), // #603 + INST(Shadd_v , ISimdVVV , (0b0000111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 26 ), // #604 + INST(Shl_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000010101, 0, kVO_V_Any) , kRWI_W , 0 , 2 ), // #605 + INST(Shll_v , SimdShiftES , (0b0010111000100001001110, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 ), // #606 + INST(Shll2_v , SimdShiftES , (0b0110111000100001001110, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 ), // #607 + INST(Shrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100001, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 3 ), // #608 + INST(Shrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 4 ), // #609 + INST(Shsub_v , ISimdVVV , (0b0000111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 27 ), // #610 + INST(Sli_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010101, 0, kVO_V_Any) , kRWI_X , 0 , 5 ), // #611 + INST(Sm3partw1_v , ISimdVVVx , (0b1100111001100000110000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 11 ), // #612 + INST(Sm3partw2_v , ISimdVVVx , (0b1100111001100000110001, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 ), // #613 + INST(Sm3ss1_v , ISimdVVVVx , (0b1100111001000000000000, kOp_V4S, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_W , 0 , 0 ), // #614 + INST(Sm3tt1a_v , SimdSm3tt , (0b1100111001000000100000) , kRWI_X , 0 , 0 ), // #615 + INST(Sm3tt1b_v , SimdSm3tt , (0b1100111001000000100001) , kRWI_X , 0 , 1 ), // #616 + INST(Sm3tt2a_v , SimdSm3tt , (0b1100111001000000100010) , kRWI_X , 0 , 2 ), // #617 + INST(Sm3tt2b_v , SimdSm3tt , (0b1100111001000000100011) , kRWI_X , 0 , 3 ), // #618 + INST(Sm4e_v , ISimdVVx , (0b1100111011000000100001, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 ), // #619 + INST(Sm4ekey_v , ISimdVVVx , (0b1100111001100000110010, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 13 ), // #620 + INST(Smax_v , ISimdVVV , (0b0000111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 28 ), // #621 + INST(Smaxp_v , ISimdVVV , (0b0000111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 29 ), // #622 + INST(Smaxv_v , ISimdSV , (0b0000111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 2 ), // #623 + INST(Smin_v , ISimdVVV , (0b0000111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 30 ), // #624 + INST(Sminp_v , ISimdVVV , (0b0000111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 31 ), // #625 + INST(Sminv_v , ISimdSV , (0b0000111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 3 ), // #626 + INST(Smlal_v , ISimdVVVe , (0b0000111000100000100000, kVO_V_B8H4S2, 0b0000111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 3 ), // #627 + INST(Smlal2_v , ISimdVVVe , (0b0100111000100000100000, kVO_V_B16H8S4, 0b0100111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 4 ), // #628 + INST(Smlsl_v , ISimdVVVe , (0b0000111000100000101000, kVO_V_B8H4S2, 0b0000111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 5 ), // #629 + INST(Smlsl2_v , ISimdVVVe , (0b0100111000100000101000, kVO_V_B16H8S4, 0b0100111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 6 ), // #630 + INST(Smmla_v , ISimdVVVx , (0b0100111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 14 ), // #631 + INST(Smov_v , SimdSmovUmov , (0b0000111000000000001011, kVO_V_BHS, 1) , kRWI_W , 0 , 0 ), // #632 + INST(Smull_v , ISimdVVVe , (0b0000111000100000110000, kVO_V_B8H4S2, 0b0000111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 7 ), // #633 + INST(Smull2_v , ISimdVVVe , (0b0100111000100000110000, kVO_V_B16H8S4, 0b0100111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 8 ), // #634 + INST(Sqabs_v , ISimdVV , (0b0000111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 13 ), // #635 + INST(Sqadd_v , ISimdVVV , (0b0000111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 32 ), // #636 + INST(Sqdmlal_v , ISimdVVVe , (0b0000111000100000100100, kVO_SV_BHS, 0b0000111100000000001100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 9 ), // #637 + INST(Sqdmlal2_v , ISimdVVVe , (0b0100111000100000100100, kVO_V_B16H8S4, 0b0100111100000000001100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 10 ), // #638 + INST(Sqdmlsl_v , ISimdVVVe , (0b0000111000100000101100, kVO_SV_BHS, 0b0000111100000000011100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 11 ), // #639 + INST(Sqdmlsl2_v , ISimdVVVe , (0b0100111000100000101100, kVO_V_B16H8S4, 0b0100111100000000011100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 12 ), // #640 + INST(Sqdmulh_v , ISimdVVVe , (0b0000111000100000101101, kVO_SV_HS, 0b0000111100000000110000, kVO_SV_HS) , kRWI_W , F(VH0_15) , 13 ), // #641 + INST(Sqdmull_v , ISimdVVVe , (0b0000111000100000110100, kVO_SV_BHS, 0b0000111100000000101100, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 14 ), // #642 + INST(Sqdmull2_v , ISimdVVVe , (0b0100111000100000110100, kVO_V_B16H8S4, 0b0100111100000000101100, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 15 ), // #643 + INST(Sqneg_v , ISimdVV , (0b0010111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 14 ), // #644 + INST(Sqrdmlah_v , ISimdVVVe , (0b0010111000000000100001, kVO_SV_HS, 0b0010111100000000110100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 16 ), // #645 + INST(Sqrdmlsh_v , ISimdVVVe , (0b0010111000000000100011, kVO_SV_HS, 0b0010111100000000111100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 17 ), // #646 + INST(Sqrdmulh_v , ISimdVVVe , (0b0010111000100000101101, kVO_SV_HS, 0b0000111100000000110100, kVO_SV_HS) , kRWI_W , F(VH0_15) , 18 ), // #647 + INST(Sqrshl_v , SimdShift , (0b0000111000100000010111, 0b0000000000000000000000, 1, kVO_SV_Any) , kRWI_W , 0 , 6 ), // #648 + INST(Sqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 7 ), // #649 + INST(Sqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 8 ), // #650 + INST(Sqrshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100011, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 9 ), // #651 + INST(Sqrshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 10 ), // #652 + INST(Sqshl_v , SimdShift , (0b0000111000100000010011, 0b0000111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 11 ), // #653 + INST(Sqshlu_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000011001, 0, kVO_SV_Any) , kRWI_W , 0 , 12 ), // #654 + INST(Sqshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 13 ), // #655 + INST(Sqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 ), // #656 + INST(Sqshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100001, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 ), // #657 + INST(Sqshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 ), // #658 + INST(Sqsub_v , ISimdVVV , (0b0000111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 33 ), // #659 + INST(Sqxtn_v , ISimdVV , (0b0000111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 ), // #660 + INST(Sqxtn2_v , ISimdVV , (0b0100111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 ), // #661 + INST(Sqxtun_v , ISimdVV , (0b0010111000100001001010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 17 ), // #662 + INST(Sqxtun2_v , ISimdVV , (0b0110111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 18 ), // #663 + INST(Srhadd_v , ISimdVVV , (0b0000111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 34 ), // #664 + INST(Sri_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010001, 1, kVO_V_Any) , kRWI_W , 0 , 17 ), // #665 + INST(Srshl_v , SimdShift , (0b0000111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 18 ), // #666 + INST(Srshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 19 ), // #667 + INST(Srsra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 20 ), // #668 + INST(Sshl_v , SimdShift , (0b0000111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 21 ), // #669 + INST(Sshll_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 ), // #670 + INST(Sshll2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 ), // #671 + INST(Sshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 24 ), // #672 + INST(Ssra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 25 ), // #673 + INST(Ssubl_v , ISimdVVV , (0b0000111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 35 ), // #674 + INST(Ssubl2_v , ISimdVVV , (0b0100111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 36 ), // #675 + INST(Ssubw_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 2 ), // #676 + INST(Ssubw2_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B16H8S4) , kRWI_X , 0 , 3 ), // #677 + INST(St1_v , SimdLdNStN , (0b0000110100000000000000, 0b0000110000000000001000, 1, 0) , kRWI_STn , F(Consecutive) , 8 ), // #678 + INST(St2_v , SimdLdNStN , (0b0000110100100000000000, 0b0000110000000000100000, 2, 0) , kRWI_STn , F(Consecutive) , 9 ), // #679 + INST(St3_v , SimdLdNStN , (0b0000110100000000001000, 0b0000110000000000010000, 3, 0) , kRWI_STn , F(Consecutive) , 10 ), // #680 + INST(St4_v , SimdLdNStN , (0b0000110100100000001000, 0b0000110000000000000000, 4, 0) , kRWI_STn , F(Consecutive) , 11 ), // #681 + INST(Stnp_v , SimdLdpStp , (0b0010110000, 0b0000000000) , kRWI_RRW , 0 , 2 ), // #682 + INST(Stp_v , SimdLdpStp , (0b0010110100, 0b0010110010) , kRWI_RRW , 0 , 3 ), // #683 + INST(Str_v , SimdLdSt , (0b0011110100, 0b00111100000, 0b00111100001, 0b00000000, Inst::kIdStur_v) , kRWI_RW , 0 , 1 ), // #684 + INST(Stur_v , SimdLdurStur , (0b0011110000000000000000) , kRWI_RW , 0 , 1 ), // #685 + INST(Sub_v , ISimdVVV , (0b0010111000100000100001, kVO_V_Any) , kRWI_W , 0 , 37 ), // #686 + INST(Subhn_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 38 ), // #687 + INST(Subhn2_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 39 ), // #688 + INST(Sudot_v , SimdDot , (0b0000000000000000000000, 0b0000111100000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 2 ), // #689 + INST(Suqadd_v , ISimdVV , (0b0000111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 19 ), // #690 + INST(Sxtl_v , SimdSxtlUxtl , (0b0000111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 ), // #691 + INST(Sxtl2_v , SimdSxtlUxtl , (0b0100111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 ), // #692 + INST(Tbl_v , SimdTblTbx , (0b0000111000000000000000) , kRWI_W , 0 , 0 ), // #693 + INST(Tbx_v , SimdTblTbx , (0b0000111000000000000100) , kRWI_W , 0 , 1 ), // #694 + INST(Trn1_v , ISimdVVV , (0b0000111000000000001010, kVO_V_BHS_D2) , kRWI_W , 0 , 40 ), // #695 + INST(Trn2_v , ISimdVVV , (0b0000111000000000011010, kVO_V_BHS_D2) , kRWI_W , 0 , 41 ), // #696 + INST(Uaba_v , ISimdVVV , (0b0010111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 42 ), // #697 + INST(Uabal_v , ISimdVVV , (0b0010111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 43 ), // #698 + INST(Uabal2_v , ISimdVVV , (0b0110111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 44 ), // #699 + INST(Uabd_v , ISimdVVV , (0b0010111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 45 ), // #700 + INST(Uabdl_v , ISimdVVV , (0b0010111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 46 ), // #701 + INST(Uabdl2_v , ISimdVVV , (0b0110111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 47 ), // #702 + INST(Uadalp_v , ISimdVV , (0b0010111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 20 ), // #703 + INST(Uaddl_v , ISimdVVV , (0b0010111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 48 ), // #704 + INST(Uaddl2_v , ISimdVVV , (0b0110111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 49 ), // #705 + INST(Uaddlp_v , ISimdVV , (0b0010111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 21 ), // #706 + INST(Uaddlv_v , ISimdSV , (0b0010111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 4 ), // #707 + INST(Uaddw_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 4 ), // #708 + INST(Uaddw2_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 5 ), // #709 + INST(Ucvtf_v , SimdFcvtSV , (0b0010111000100001110110, 0b0010111100000000111001, 0b0001111000100011000000, 0) , kRWI_W , 0 , 11 ), // #710 + INST(Udot_v , SimdDot , (0b0010111010000000100101, 0b0010111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 3 ), // #711 + INST(Uhadd_v , ISimdVVV , (0b0010111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 50 ), // #712 + INST(Uhsub_v , ISimdVVV , (0b0010111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 51 ), // #713 + INST(Umax_v , ISimdVVV , (0b0010111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 52 ), // #714 + INST(Umaxp_v , ISimdVVV , (0b0010111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 53 ), // #715 + INST(Umaxv_v , ISimdSV , (0b0010111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 5 ), // #716 + INST(Umin_v , ISimdVVV , (0b0010111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 54 ), // #717 + INST(Uminp_v , ISimdVVV , (0b0010111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 55 ), // #718 + INST(Uminv_v , ISimdSV , (0b0010111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 6 ), // #719 + INST(Umlal_v , ISimdVVVe , (0b0010111000100000100000, kVO_V_B8H4S2, 0b0010111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 19 ), // #720 + INST(Umlal2_v , ISimdVVVe , (0b0110111000100000100000, kVO_V_B16H8S4, 0b0010111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 20 ), // #721 + INST(Umlsl_v , ISimdVVVe , (0b0010111000100000101000, kVO_V_B8H4S2, 0b0010111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 21 ), // #722 + INST(Umlsl2_v , ISimdVVVe , (0b0110111000100000101000, kVO_V_B16H8S4, 0b0110111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 22 ), // #723 + INST(Ummla_v , ISimdVVVx , (0b0110111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 15 ), // #724 + INST(Umov_v , SimdSmovUmov , (0b0000111000000000001111, kVO_V_Any, 0) , kRWI_W , 0 , 1 ), // #725 + INST(Umull_v , ISimdVVVe , (0b0010111000100000110000, kVO_V_B8H4S2, 0b0010111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 23 ), // #726 + INST(Umull2_v , ISimdVVVe , (0b0110111000100000110000, kVO_V_B16H8S4, 0b0110111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 24 ), // #727 + INST(Uqadd_v , ISimdVVV , (0b0010111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 56 ), // #728 + INST(Uqrshl_v , SimdShift , (0b0010111000100000010111, 0b0000000000000000000000, 0, kVO_SV_Any) , kRWI_W , 0 , 26 ), // #729 + INST(Uqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 27 ), // #730 + INST(Uqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 ), // #731 + INST(Uqshl_v , SimdShift , (0b0010111000100000010011, 0b0010111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 29 ), // #732 + INST(Uqshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 30 ), // #733 + INST(Uqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 31 ), // #734 + INST(Uqsub_v , ISimdVVV , (0b0010111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 57 ), // #735 + INST(Uqxtn_v , ISimdVV , (0b0010111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 22 ), // #736 + INST(Uqxtn2_v , ISimdVV , (0b0110111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 23 ), // #737 + INST(Urecpe_v , ISimdVV , (0b0000111010100001110010, kVO_V_S) , kRWI_W , 0 , 24 ), // #738 + INST(Urhadd_v , ISimdVVV , (0b0010111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 58 ), // #739 + INST(Urshl_v , SimdShift , (0b0010111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 32 ), // #740 + INST(Urshr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 33 ), // #741 + INST(Ursqrte_v , ISimdVV , (0b0010111010100001110010, kVO_V_S) , kRWI_W , 0 , 25 ), // #742 + INST(Ursra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 34 ), // #743 + INST(Usdot_v , SimdDot , (0b0000111010000000100111, 0b0000111110000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 4 ), // #744 + INST(Ushl_v , SimdShift , (0b0010111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 35 ), // #745 + INST(Ushll_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 36 ), // #746 + INST(Ushll2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 37 ), // #747 + INST(Ushr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 38 ), // #748 + INST(Usmmla_v , ISimdVVVx , (0b0100111010000000101011, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 16 ), // #749 + INST(Usqadd_v , ISimdVV , (0b0010111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 26 ), // #750 + INST(Usra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 39 ), // #751 + INST(Usubl_v , ISimdVVV , (0b0010111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 59 ), // #752 + INST(Usubl2_v , ISimdVVV , (0b0110111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 60 ), // #753 + INST(Usubw_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 6 ), // #754 + INST(Usubw2_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B16H8S4) , kRWI_W , 0 , 7 ), // #755 + INST(Uxtl_v , SimdSxtlUxtl , (0b0010111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 2 ), // #756 + INST(Uxtl2_v , SimdSxtlUxtl , (0b0110111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 3 ), // #757 + INST(Uzp1_v , ISimdVVV , (0b0000111000000000000110, kVO_V_BHS_D2) , kRWI_W , 0 , 61 ), // #758 + INST(Uzp2_v , ISimdVVV , (0b0000111000000000010110, kVO_V_BHS_D2) , kRWI_W , 0 , 62 ), // #759 + INST(Xar_v , ISimdVVVI , (0b1100111001100000100011, kVO_V_D2, 6, 10, 0) , kRWI_W , 0 , 1 ), // #760 + INST(Xtn_v , ISimdVV , (0b0000111000100001001010, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 27 ), // #761 + INST(Xtn2_v , ISimdVV , (0b0100111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 ), // #762 + INST(Zip1_v , ISimdVVV , (0b0000111000000000001110, kVO_V_BHS_D2) , kRWI_W , 0 , 63 ), // #763 + INST(Zip2_v , ISimdVVV , (0b0000111000000000011110, kVO_V_BHS_D2) , kRWI_W , 0 , 64 ) // #764 // ${InstInfo:End} }; @@ -1132,8 +1124,8 @@ const BaseLdSt baseLdSt[9] = { { 0b1011100101, 0b10111000010, 0b10111000011, 0b00011000, kWX, 30, 2, Inst::kIdLdur }, // ldr { 0b0011100101, 0b00111000010, 0b00111000011, 0 , kW , 0 , 0, Inst::kIdLdurb }, // ldrb { 0b0111100101, 0b01111000010, 0b01111000011, 0 , kW , 0 , 1, Inst::kIdLdurh }, // ldrh - { 0b0011100111, 0b00111000100, 0b00111000101, 0 , kWX, 22, 0, Inst::kIdLdursb }, // ldrsb - { 0b0111100110, 0b01111000100, 0b01111000101, 0 , kWX, 22, 1, Inst::kIdLdursh }, // ldrsh + { 0b0011100111, 0b00111000100, 0b00111000111, 0 , kWX, 22, 0, Inst::kIdLdursb }, // ldrsb + { 0b0111100111, 0b01111000100, 0b01111000111, 0 , kWX, 22, 1, Inst::kIdLdursh }, // ldrsh { 0b1011100110, 0b10111000100, 0b10111000101, 0b10011000, kX , 0 , 2, Inst::kIdLdursw }, // ldrsw { 0b1011100100, 0b10111000000, 0b10111000001, 0 , kWX, 30, 2, Inst::kIdStur }, // str { 0b0011100100, 0b00111000000, 0b00111000001, 0 , kW , 30, 0, Inst::kIdSturb }, // strb @@ -1220,6 +1212,10 @@ const BaseOpImm baseOpImm[14] = { { 0b00000000000000000000000000000000, 16, 0 } // udf }; +const BasePrfm basePrfm[1] = { + { 0b11111000101, 0b1111100110, 0b11111000100, 0b11011000 } // prfm +}; + const BaseR baseR[10] = { { 0b11011010110000010011101111100000, kX, kZR, 0 }, // autdza { 0b11011010110000010011111111100000, kX, kZR, 0 }, // autdzb @@ -1275,7 +1271,7 @@ const BaseRM_SImm9 baseRM_SImm9[23] = { { 0b0111100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0 }, // ldurh { 0b0011100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0 }, // ldursb { 0b0111100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0 }, // ldursh - { 0b1011100010000000000000, 0b0000000000000000000000, kWX, kZR, 0 , 0 }, // ldursw + { 0b1011100010000000000000, 0b0000000000000000000000, kX , kZR, 0 , 0 }, // ldursw { 0b1101100110100000000010, 0b1101100110100000000001, kX, kSP, 0, 4 }, // st2g { 0b1101100100100000000010, 0b1101100100100000000001, kX, kSP, 0, 4 }, // stg { 0b1011100000000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0 }, // sttr @@ -1852,75 +1848,10 @@ const InstDB::CommonInfo InstDB::commonData[] = { // ArmUtil - Id <-> Name // ===================== -#ifndef ASMJIT_DISABLE_TEXT +#ifndef ASMJIT_NO_TEXT // ${NameData:Begin} // ------------------- Automatically generated, do not edit ------------------- -const char InstDB::_nameData[] = - "\0" "adc\0" "adcs\0" "addg\0" "adds\0" "addv\0" "adr\0" "adrp\0" "aesd\0" "aese\0" "aesimc\0" "aesmc\0" "and\0" - "ands\0" "asr\0" "asrv\0" "at\0" "autda\0" "autdb\0" "autdza\0" "autdzb\0" "autia\0" "autia1716\0" "autiasp\0" - "autiaz\0" "autib\0" "autib1716\0" "autibsp\0" "autibz\0" "autiza\0" "autizb\0" "axflag\0" "bcax\0" "bfc\0" "bfcvt\0" - "bfcvtn\0" "bfcvtn2\0" "bfdot\0" "bfi\0" "bfmlalb\0" "bfmlalt\0" "bfmmla\0" "bfxil\0" "bic\0" "bics\0" "bif\0" - "blr\0" "br\0" "brk\0" "bsl\0" "cas\0" "casa\0" "casab\0" "casah\0" "casal\0" "casalb\0" "casalh\0" "casb\0" "cash\0" - "casl\0" "caslb\0" "caslh\0" "casp\0" "caspa\0" "caspal\0" "caspl\0" "cbnz\0" "cbz\0" "ccmn\0" "cfinv\0" "cinc\0" - "cinv\0" "clrex\0" "cls\0" "clz\0" "cmhi\0" "cmhs\0" "cmpp\0" "cmtst\0" "cneg\0" "cnt\0" "crc32b\0" "crc32cb\0" - "crc32ch\0" "crc32cw\0" "crc32cx\0" "crc32h\0" "crc32w\0" "crc32x\0" "csdb\0" "cset\0" "csetm\0" "csinc\0" "csinv\0" - "csneg\0" "dcps1\0" "dcps2\0" "dcps3\0" "dgh\0" "dmb\0" "drps\0" "dsb\0" "dup\0" "eon\0" "eor3\0" "eret\0" "esb\0" - "ext\0" "extr\0" "fabd\0" "fabs\0" "facge\0" "facgt\0" "fadd\0" "faddp\0" "fcadd\0" "fccmp\0" "fccmpe\0" "fcmeq\0" - "fcmge\0" "fcmgt\0" "fcmla\0" "fcmle\0" "fcmlt\0" "fcmp\0" "fcmpe\0" "fcsel\0" "fcvtas\0" "fcvtau\0" "fcvtl\0" - "fcvtl2\0" "fcvtms\0" "fcvtmu\0" "fcvtns\0" "fcvtnu\0" "fcvtps\0" "fcvtpu\0" "fcvtxn\0" "fcvtxn2\0" "fcvtzs\0" - "fcvtzu\0" "fdiv\0" "fjcvtzs\0" "fmadd\0" "fmax\0" "fmaxnm\0" "fmaxnmp\0" "fmaxnmv\0" "fmaxp\0" "fmaxv\0" "fmin\0" - "fminnm\0" "fminnmp\0" "fminnmv\0" "fminp\0" "fminv\0" "fmla\0" "fmlal\0" "fmlal2\0" "fmls\0" "fmlsl\0" "fmlsl2\0" - "fmov\0" "fmsub\0" "fmul\0" "fmulx\0" "fneg\0" "fnmadd\0" "fnmsub\0" "fnmul\0" "frecpe\0" "frecps\0" "frecpx\0" - "frint32x\0" "frint32z\0" "frint64x\0" "frint64z\0" "frinta\0" "frinti\0" "frintm\0" "frintn\0" "frintp\0" "frintx\0" - "frintz\0" "frsqrte\0" "frsqrts\0" "fsqrt\0" "fsub\0" "gmi\0" "hint\0" "hlt\0" "hvc\0" "ins\0" "isb\0" "ld1\0" - "ld1r\0" "ld2\0" "ld2r\0" "ld3\0" "ld3r\0" "ld4\0" "ld4r\0" "ldadd\0" "ldadda\0" "ldaddab\0" "ldaddah\0" "ldaddal\0" - "ldaddalb\0" "ldaddalh\0" "ldaddb\0" "ldaddh\0" "ldaddl\0" "ldaddlb\0" "ldaddlh\0" "ldar\0" "ldarb\0" "ldarh\0" - "ldaxp\0" "ldaxr\0" "ldaxrb\0" "ldaxrh\0" "ldclr\0" "ldclra\0" "ldclrab\0" "ldclrah\0" "ldclral\0" "ldclralb\0" - "ldclralh\0" "ldclrb\0" "ldclrh\0" "ldclrl\0" "ldclrlb\0" "ldclrlh\0" "ldeor\0" "ldeora\0" "ldeorab\0" "ldeorah\0" - "ldeoral\0" "ldeoralb\0" "ldeoralh\0" "ldeorb\0" "ldeorh\0" "ldeorl\0" "ldeorlb\0" "ldeorlh\0" "ldg\0" "ldgm\0" - "ldlar\0" "ldlarb\0" "ldlarh\0" "ldnp\0" "ldp\0" "ldpsw\0" "ldr\0" "ldraa\0" "ldrab\0" "ldrb\0" "ldrh\0" "ldrsb\0" - "ldrsh\0" "ldrsw\0" "ldset\0" "ldseta\0" "ldsetab\0" "ldsetah\0" "ldsetal\0" "ldsetalb\0" "ldsetalh\0" "ldsetb\0" - "ldseth\0" "ldsetl\0" "ldsetlb\0" "ldsetlh\0" "ldsmax\0" "ldsmaxa\0" "ldsmaxab\0" "ldsmaxah\0" "ldsmaxal\0" - "ldsmaxalb\0" "ldsmaxalh\0" "ldsmaxb\0" "ldsmaxh\0" "ldsmaxl\0" "ldsmaxlb\0" "ldsmaxlh\0" "ldsmin\0" "ldsmina\0" - "ldsminab\0" "ldsminah\0" "ldsminal\0" "ldsminalb\0" "ldsminalh\0" "ldsminb\0" "ldsminh\0" "ldsminl\0" "ldsminlb\0" - "ldsminlh\0" "ldtr\0" "ldtrb\0" "ldtrh\0" "ldtrsb\0" "ldtrsh\0" "ldtrsw\0" "ldumax\0" "ldumaxa\0" "ldumaxab\0" - "ldumaxah\0" "ldumaxal\0" "ldumaxalb\0" "ldumaxalh\0" "ldumaxb\0" "ldumaxh\0" "ldumaxl\0" "ldumaxlb\0" "ldumaxlh\0" - "ldumin\0" "ldumina\0" "lduminab\0" "lduminah\0" "lduminal\0" "lduminalb\0" "lduminalh\0" "lduminb\0" "lduminh\0" - "lduminl\0" "lduminlb\0" "lduminlh\0" "ldur\0" "ldurb\0" "ldurh\0" "ldursb\0" "ldursh\0" "ldursw\0" "ldxp\0" "ldxr\0" - "ldxrb\0" "ldxrh\0" "lslv\0" "lsr\0" "lsrv\0" "mneg\0" "movi\0" "movk\0" "movn\0" "movz\0" "mrs\0" "msr\0" "mvn\0" - "mvni\0" "negs\0" "ngc\0" "ngcs\0" "nop\0" "not\0" "orn\0" "orr\0" "pacda\0" "pacdb\0" "pacdza\0" "pacdzb\0" - "pacga\0" "pmul\0" "pmull\0" "pmull2\0" "pssbb\0" "raddhn\0" "raddhn2\0" "rax1\0" "rbit\0" "rev\0" "rev16\0" - "rev32\0" "rev64\0" "ror\0" "rorv\0" "rsubhn\0" "rsubhn2\0" "saba\0" "sabal\0" "sabal2\0" "sabd\0" "sabdl\0" - "sabdl2\0" "sadalp\0" "saddl\0" "saddl2\0" "saddlp\0" "saddlv\0" "saddw\0" "saddw2\0" "sbc\0" "sbcs\0" "sbfiz\0" - "sbfm\0" "sbfx\0" "scvtf\0" "sdiv\0" "setf16\0" "setf8\0" "sev\0" "sevl\0" "sha1c\0" "sha1h\0" "sha1m\0" "sha1p\0" - "sha1su0\0" "sha1su1\0" "sha256h\0" "sha256h2\0" "sha256su0\0" "sha256su1\0" "sha512h\0" "sha512h2\0" "sha512su0\0" - "sha512su1\0" "shadd\0" "shsub\0" "sli\0" "sm3partw1\0" "sm3partw2\0" "sm3ss1\0" "sm3tt1a\0" "sm3tt1b\0" "sm3tt2a\0" - "sm3tt2b\0" "sm4e\0" "sm4ekey\0" "smaddl\0" "smaxp\0" "smaxv\0" "sminp\0" "sminv\0" "smlal\0" "smlal2\0" "smlsl\0" - "smlsl2\0" "smnegl\0" "smov\0" "smsubl\0" "smulh\0" "smull\0" "smull2\0" "sqabs\0" "sqdmlal\0" "sqdmlal2\0" - "sqdmlsl\0" "sqdmlsl2\0" "sqdmulh\0" "sqdmull\0" "sqdmull2\0" "sqneg\0" "sqrdmlah\0" "sqrdmlsh\0" "sqrdmulh\0" - "sqrshl\0" "sqrshrn\0" "sqrshrn2\0" "sqrshrun\0" "sqrshrun2\0" "sqshl\0" "sqshlu\0" "sqshrn\0" "sqshrn2\0" - "sqshrun\0" "sqshrun2\0" "sqsub\0" "sqxtn\0" "sqxtn2\0" "sqxtun\0" "sqxtun2\0" "srhadd\0" "sri\0" "srshl\0" "srshr\0" - "srsra\0" "sshl\0" "sshll\0" "sshll2\0" "sshr\0" "ssra\0" "ssubl\0" "ssubl2\0" "ssubw\0" "ssubw2\0" "st1\0" "st2\0" - "st2g\0" "st3\0" "st4\0" "stadd\0" "staddb\0" "staddh\0" "staddl\0" "staddlb\0" "staddlh\0" "stclr\0" "stclrb\0" - "stclrh\0" "stclrl\0" "stclrlb\0" "stclrlh\0" "steor\0" "steorb\0" "steorh\0" "steorl\0" "steorlb\0" "steorlh\0" - "stg\0" "stgm\0" "stgp\0" "stllr\0" "stllrb\0" "stllrh\0" "stlr\0" "stlrb\0" "stlrh\0" "stlxp\0" "stlxr\0" "stlxrb\0" - "stlxrh\0" "stnp\0" "stp\0" "str\0" "strb\0" "strh\0" "stset\0" "stsetb\0" "stseth\0" "stsetl\0" "stsetlb\0" - "stsetlh\0" "stsmax\0" "stsmaxb\0" "stsmaxh\0" "stsmaxl\0" "stsmaxlb\0" "stsmaxlh\0" "stsmin\0" "stsminb\0" - "stsminh\0" "stsminl\0" "stsminlb\0" "stsminlh\0" "sttr\0" "sttrb\0" "sttrh\0" "stumax\0" "stumaxb\0" "stumaxh\0" - "stumaxl\0" "stumaxlb\0" "stumaxlh\0" "stumin\0" "stuminb\0" "stuminh\0" "stuminl\0" "stuminlb\0" "stuminlh\0" - "stur\0" "sturb\0" "sturh\0" "stxp\0" "stxr\0" "stxrb\0" "stxrh\0" "stz2g\0" "stzg\0" "stzgm\0" "subg\0" "subp\0" - "subps\0" "subs\0" "sudot\0" "suqadd\0" "svc\0" "swp\0" "swpa\0" "swpab\0" "swpah\0" "swpal\0" "swpalb\0" "swpalh\0" - "swpb\0" "swph\0" "swpl\0" "swplb\0" "swplh\0" "sxtb\0" "sxth\0" "sxtl\0" "sxtl2\0" "sxtw\0" "sys\0" "tbl\0" "tbnz\0" - "tbx\0" "tbz\0" "tlbi\0" "trn1\0" "trn2\0" "uaba\0" "uabal\0" "uabal2\0" "uabd\0" "uabdl\0" "uabdl2\0" "uadalp\0" - "uaddl\0" "uaddl2\0" "uaddlp\0" "uaddlv\0" "uaddw\0" "uaddw2\0" "ubfiz\0" "ubfm\0" "ubfx\0" "ucvtf\0" "udf\0" - "udiv\0" "uhadd\0" "uhsub\0" "umaddl\0" "umaxp\0" "umaxv\0" "uminp\0" "uminv\0" "umlal\0" "umlal2\0" "umlsl\0" - "umlsl2\0" "ummla\0" "umnegl\0" "umov\0" "umsubl\0" "umulh\0" "umull\0" "umull2\0" "uqrshl\0" "uqrshrn\0" - "uqrshrn2\0" "uqshl\0" "uqshrn\0" "uqshrn2\0" "uqsub\0" "uqxtn\0" "uqxtn2\0" "urecpe\0" "urhadd\0" "urshl\0" - "urshr\0" "ursqrte\0" "ursra\0" "usdot\0" "ushl\0" "ushll\0" "ushll2\0" "ushr\0" "usmmla\0" "usqadd\0" "usra\0" - "usubl\0" "usubl2\0" "usubw\0" "usubw2\0" "uxtb\0" "uxth\0" "uxtl\0" "uxtl2\0" "uzp1\0" "uzp2\0" "wfe\0" "wfi\0" - "xaflag\0" "xar\0" "xpacd\0" "xpaci\0" "xpaclri\0" "yield\0" "zip1\0" "zip2"; - -const InstDB::InstNameIndex InstDB::instNameIndex[26] = { +const InstNameIndex InstDB::instNameIndex = {{ { Inst::kIdAdc , Inst::kIdAnd_v + 1 }, { Inst::kIdB , Inst::kIdBsl_v + 1 }, { Inst::kIdCas , Inst::kIdCnt_v + 1 }, @@ -1947,10 +1878,785 @@ const InstDB::InstNameIndex InstDB::instNameIndex[26] = { { Inst::kIdXaflag , Inst::kIdXtn2_v + 1 }, { Inst::kIdYield , Inst::kIdYield + 1 }, { Inst::kIdZip1_v , Inst::kIdZip2_v + 1 } +}, uint16_t(9)}; + +const char InstDB::_instNameStringTable[] = + "autia1716autibldsmaxalhldsminalldumaxallduminalsha256su0sha512su1sm3partwsqrshru" + "nldaddalldclralldeoralldsetallbstsmaxstsminstumaxstuminfrint32z64x64zh2sqdmlalsl" + "2sqdmulsqrdmlaulhn2sqshruuqrshrspcrc32cstaddstclrsteorstsetxpaclbfcvtbfmlaltfcvt" + "xfjcvtzfmaxnmfminnmfrsqrraddrsubsha1sm3tt12a2bsm4ekeysqxtuuqshrursqrsetfrev8"; + + +const uint32_t InstDB::_instNameIndexTable[] = { + 0x80000000, // Small ''. + 0x80000C81, // Small 'adc'. + 0x80098C81, // Small 'adcs'. + 0x80001081, // Small 'add'. + 0x80039081, // Small 'addg'. + 0x80099081, // Small 'adds'. + 0x80004881, // Small 'adr'. + 0x80084881, // Small 'adrp'. + 0x800011C1, // Small 'and'. + 0x800991C1, // Small 'ands'. + 0x80004A61, // Small 'asr'. + 0x800B4A61, // Small 'asrv'. + 0x80000281, // Small 'at'. + 0x801252A1, // Small 'autda'. + 0x83A252A1, // Small 'autdza'. + 0x802252A1, // Small 'autdb'. + 0x85A252A1, // Small 'autdzb'. + 0x8014D2A1, // Small 'autia'. + 0x00009000, // Large 'autia1716'. + 0x20BF5000, // Large 'autia|sp'. + 0xB414D2A1, // Small 'autiaz'. + 0x8024D2A1, // Small 'autib'. + 0x40055009, // Large 'autib|1716'. + 0x20BF5009, // Large 'autib|sp'. + 0xB424D2A1, // Small 'autibz'. + 0x83A4D2A1, // Small 'autiza'. + 0x85A4D2A1, // Small 'autizb'. + 0x8E161B01, // Small 'axflag'. + 0x80000002, // Small 'b'. + 0x80000CC2, // Small 'bfc'. + 0x800024C2, // Small 'bfi'. + 0x800034C2, // Small 'bfm'. + 0x80C4E0C2, // Small 'bfxil'. + 0x80000D22, // Small 'bic'. + 0x80098D22, // Small 'bics'. + 0x80000182, // Small 'bl'. + 0x80004982, // Small 'blr'. + 0x80000242, // Small 'br'. + 0x80002E42, // Small 'brk'. + 0x80004C23, // Small 'cas'. + 0x8000CC23, // Small 'casa'. + 0x8020CC23, // Small 'casab'. + 0x8080CC23, // Small 'casah'. + 0x80C0CC23, // Small 'casal'. + 0x84C0CC23, // Small 'casalb'. + 0x90C0CC23, // Small 'casalh'. + 0x80014C23, // Small 'casb'. + 0x80044C23, // Small 'cash'. + 0x80064C23, // Small 'casl'. + 0x80264C23, // Small 'caslb'. + 0x80864C23, // Small 'caslh'. + 0x80084C23, // Small 'casp'. + 0x80184C23, // Small 'caspa'. + 0x98184C23, // Small 'caspal'. + 0x80C84C23, // Small 'caspl'. + 0x800D3843, // Small 'cbnz'. + 0x80006843, // Small 'cbz'. + 0x80073463, // Small 'ccmn'. + 0x80083463, // Small 'ccmp'. + 0x816724C3, // Small 'cfinv'. + 0x8001B923, // Small 'cinc'. + 0x800B3923, // Small 'cinv'. + 0x8182C983, // Small 'clrex'. + 0x80004D83, // Small 'cls'. + 0x80006983, // Small 'clz'. + 0x800039A3, // Small 'cmn'. + 0x800041A3, // Small 'cmp'. + 0x800841A3, // Small 'cmpp'. + 0x800395C3, // Small 'cneg'. + 0x85DF0E43, // Small 'crc32b'. + 0x100D60C1, // Large 'crc32c|b'. + 0x101660C1, // Large 'crc32c|h'. + 0x104860C1, // Large 'crc32c|w'. + 0x101360C1, // Large 'crc32c|x'. + 0x91DF0E43, // Small 'crc32h'. + 0xAFDF0E43, // Small 'crc32w'. + 0xB1DF0E43, // Small 'crc32x'. + 0x80011263, // Small 'csdb'. + 0x80061663, // Small 'csel'. + 0x800A1663, // Small 'cset'. + 0x80DA1663, // Small 'csetm'. + 0x80372663, // Small 'csinc'. + 0x81672663, // Small 'csinv'. + 0x8072BA63, // Small 'csneg'. + 0x80000064, // Small 'dc'. + 0x81C9C064, // Small 'dcps1'. + 0x81D9C064, // Small 'dcps2'. + 0x81E9C064, // Small 'dcps3'. + 0x800020E4, // Small 'dgh'. + 0x800009A4, // Small 'dmb'. + 0x8009C244, // Small 'drps'. + 0x80000A64, // Small 'dsb'. + 0x800039E5, // Small 'eon'. + 0x800049E5, // Small 'eor'. + 0x80000A65, // Small 'esb'. + 0x80095305, // Small 'extr'. + 0x800A1645, // Small 'eret'. + 0x800025A7, // Small 'gmi'. + 0x800A3928, // Small 'hint'. + 0x80005188, // Small 'hlt'. + 0x80000EC8, // Small 'hvc'. + 0x80000069, // Small 'ic'. + 0x80000A69, // Small 'isb'. + 0x8042048C, // Small 'ldadd'. + 0x8242048C, // Small 'ldadda'. + 0x100D6051, // Large 'ldadda|b'. + 0x10166051, // Large 'ldadda|h'. + 0x00007051, // Large 'ldaddal'. + 0x100D7051, // Large 'ldaddal|b'. + 0x10167051, // Large 'ldaddal|h'. + 0x8442048C, // Small 'ldaddb'. + 0x9042048C, // Small 'ldaddh'. + 0x9842048C, // Small 'ldaddl'. + 0x206D5051, // Large 'ldadd|lb'. + 0x20155051, // Large 'ldadd|lh'. + 0x8009048C, // Small 'ldar'. + 0x8029048C, // Small 'ldarb'. + 0x8089048C, // Small 'ldarh'. + 0x810C048C, // Small 'ldaxp'. + 0x812C048C, // Small 'ldaxr'. + 0x852C048C, // Small 'ldaxrb'. + 0x912C048C, // Small 'ldaxrh'. + 0x81260C8C, // Small 'ldclr'. + 0x83260C8C, // Small 'ldclra'. + 0x100D6058, // Large 'ldclra|b'. + 0x10166058, // Large 'ldclra|h'. + 0x00007058, // Large 'ldclral'. + 0x100D7058, // Large 'ldclral|b'. + 0x10167058, // Large 'ldclral|h'. + 0x85260C8C, // Small 'ldclrb'. + 0x91260C8C, // Small 'ldclrh'. + 0x99260C8C, // Small 'ldclrl'. + 0x206D5058, // Large 'ldclr|lb'. + 0x20155058, // Large 'ldclr|lh'. + 0x8127948C, // Small 'ldeor'. + 0x8327948C, // Small 'ldeora'. + 0x100D605F, // Large 'ldeora|b'. + 0x1016605F, // Large 'ldeora|h'. + 0x0000705F, // Large 'ldeoral'. + 0x100D705F, // Large 'ldeoral|b'. + 0x1016705F, // Large 'ldeoral|h'. + 0x8527948C, // Small 'ldeorb'. + 0x9127948C, // Small 'ldeorh'. + 0x9927948C, // Small 'ldeorl'. + 0x206D505F, // Large 'ldeor|lb'. + 0x2015505F, // Large 'ldeor|lh'. + 0x80001C8C, // Small 'ldg'. + 0x80069C8C, // Small 'ldgm'. + 0x8120B08C, // Small 'ldlar'. + 0x8520B08C, // Small 'ldlarb'. + 0x9120B08C, // Small 'ldlarh'. + 0x8008388C, // Small 'ldnp'. + 0x8000408C, // Small 'ldp'. + 0x8179C08C, // Small 'ldpsw'. + 0x8000488C, // Small 'ldr'. + 0x8010C88C, // Small 'ldraa'. + 0x8020C88C, // Small 'ldrab'. + 0x8001488C, // Small 'ldrb'. + 0x8004488C, // Small 'ldrh'. + 0x8029C88C, // Small 'ldrsb'. + 0x8089C88C, // Small 'ldrsh'. + 0x8179C88C, // Small 'ldrsw'. + 0x8142CC8C, // Small 'ldset'. + 0x8342CC8C, // Small 'ldseta'. + 0x100D6066, // Large 'ldseta|b'. + 0x10166066, // Large 'ldseta|h'. + 0x00007066, // Large 'ldsetal'. + 0x100D7066, // Large 'ldsetal|b'. + 0x10167066, // Large 'ldsetal|h'. + 0x8542CC8C, // Small 'ldsetb'. + 0x9142CC8C, // Small 'ldseth'. + 0x9942CC8C, // Small 'ldsetl'. + 0x206D5066, // Large 'ldset|lb'. + 0x20155066, // Large 'ldset|lh'. + 0xB016CC8C, // Small 'ldsmax'. + 0x0000700E, // Large 'ldsmaxa'. + 0x100D700E, // Large 'ldsmaxa|b'. + 0x1016700E, // Large 'ldsmaxa|h'. + 0x0000800E, // Large 'ldsmaxal'. + 0x100D800E, // Large 'ldsmaxal|b'. + 0x1016800E, // Large 'ldsmaxal|h'. + 0x100D600E, // Large 'ldsmax|b'. + 0x1016600E, // Large 'ldsmax|h'. + 0x100E600E, // Large 'ldsmax|l'. + 0x206D600E, // Large 'ldsmax|lb'. + 0x2015600E, // Large 'ldsmax|lh'. + 0x9C96CC8C, // Small 'ldsmin'. + 0x00007017, // Large 'ldsmina'. + 0x100D7017, // Large 'ldsmina|b'. + 0x10167017, // Large 'ldsmina|h'. + 0x00008017, // Large 'ldsminal'. + 0x100D8017, // Large 'ldsminal|b'. + 0x10168017, // Large 'ldsminal|h'. + 0x100D6017, // Large 'ldsmin|b'. + 0x10166017, // Large 'ldsmin|h'. + 0x100E6017, // Large 'ldsmin|l'. + 0x206D6017, // Large 'ldsmin|lb'. + 0x20156017, // Large 'ldsmin|lh'. + 0x8009508C, // Small 'ldtr'. + 0x8029508C, // Small 'ldtrb'. + 0x8089508C, // Small 'ldtrh'. + 0x8539508C, // Small 'ldtrsb'. + 0x9139508C, // Small 'ldtrsh'. + 0xAF39508C, // Small 'ldtrsw'. + 0xB016D48C, // Small 'ldumax'. + 0x0000701F, // Large 'ldumaxa'. + 0x100D701F, // Large 'ldumaxa|b'. + 0x1016701F, // Large 'ldumaxa|h'. + 0x0000801F, // Large 'ldumaxal'. + 0x100D801F, // Large 'ldumaxal|b'. + 0x1016801F, // Large 'ldumaxal|h'. + 0x100D601F, // Large 'ldumax|b'. + 0x1016601F, // Large 'ldumax|h'. + 0x100E601F, // Large 'ldumax|l'. + 0x206D601F, // Large 'ldumax|lb'. + 0x2015601F, // Large 'ldumax|lh'. + 0x9C96D48C, // Small 'ldumin'. + 0x00007027, // Large 'ldumina'. + 0x100D7027, // Large 'ldumina|b'. + 0x10167027, // Large 'ldumina|h'. + 0x00008027, // Large 'lduminal'. + 0x100D8027, // Large 'lduminal|b'. + 0x10168027, // Large 'lduminal|h'. + 0x100D6027, // Large 'ldumin|b'. + 0x10166027, // Large 'ldumin|h'. + 0x100E6027, // Large 'ldumin|l'. + 0x206D6027, // Large 'ldumin|lb'. + 0x20156027, // Large 'ldumin|lh'. + 0x8009548C, // Small 'ldur'. + 0x8029548C, // Small 'ldurb'. + 0x8089548C, // Small 'ldurh'. + 0x8539548C, // Small 'ldursb'. + 0x9139548C, // Small 'ldursh'. + 0xAF39548C, // Small 'ldursw'. + 0x8008608C, // Small 'ldxp'. + 0x8009608C, // Small 'ldxr'. + 0x8029608C, // Small 'ldxrb'. + 0x8089608C, // Small 'ldxrh'. + 0x8000326C, // Small 'lsl'. + 0x800B326C, // Small 'lslv'. + 0x80004A6C, // Small 'lsr'. + 0x800B4A6C, // Small 'lsrv'. + 0x8002102D, // Small 'madd'. + 0x800395CD, // Small 'mneg'. + 0x800059ED, // Small 'mov'. + 0x8005D9ED, // Small 'movk'. + 0x800759ED, // Small 'movn'. + 0x800D59ED, // Small 'movz'. + 0x80004E4D, // Small 'mrs'. + 0x80004A6D, // Small 'msr'. + 0x8001566D, // Small 'msub'. + 0x800032AD, // Small 'mul'. + 0x80003ACD, // Small 'mvn'. + 0x80001CAE, // Small 'neg'. + 0x80099CAE, // Small 'negs'. + 0x80000CEE, // Small 'ngc'. + 0x80098CEE, // Small 'ngcs'. + 0x800041EE, // Small 'nop'. + 0x80003A4F, // Small 'orn'. + 0x80004A4F, // Small 'orr'. + 0x80120C30, // Small 'pacda'. + 0x80220C30, // Small 'pacdb'. + 0x83A20C30, // Small 'pacdza'. + 0x85A20C30, // Small 'pacdzb'. + 0x80138C30, // Small 'pacga'. + 0x80069A50, // Small 'prfm'. + 0x80214E70, // Small 'pssbb'. + 0x800A2452, // Small 'rbit'. + 0x800050B2, // Small 'ret'. + 0x800058B2, // Small 'rev'. + 0x20073138, // Large 'rev|16'. + 0x81DF58B2, // Small 'rev32'. + 0x208F3138, // Large 'rev|64'. + 0x800049F2, // Small 'ror'. + 0x800B49F2, // Small 'rorv'. + 0x80000C53, // Small 'sbc'. + 0x80098C53, // Small 'sbcs'. + 0x81A49853, // Small 'sbfiz'. + 0x80069853, // Small 'sbfm'. + 0x800C1853, // Small 'sbfx'. + 0x800B2493, // Small 'sdiv'. + 0x113B4134, // Large 'setf|8'. + 0x20074134, // Large 'setf|16'. + 0x800058B3, // Small 'sev'. + 0x800658B3, // Small 'sevl'. + 0x984205B3, // Small 'smaddl'. + 0x80000DB3, // Small 'smc'. + 0x9872B9B3, // Small 'smnegl'. + 0x982ACDB3, // Small 'smsubl'. + 0x808655B3, // Small 'smulh'. + 0x80C655B3, // Small 'smull'. + 0x80010A73, // Small 'ssbb'. + 0x8003F693, // Small 'st2g'. + 0x80420693, // Small 'stadd'. + 0x98420693, // Small 'staddl'. + 0x84420693, // Small 'staddb'. + 0x206D50C7, // Large 'stadd|lb'. + 0x90420693, // Small 'staddh'. + 0x201550C7, // Large 'stadd|lh'. + 0x81260E93, // Small 'stclr'. + 0x99260E93, // Small 'stclrl'. + 0x85260E93, // Small 'stclrb'. + 0x206D50CC, // Large 'stclr|lb'. + 0x91260E93, // Small 'stclrh'. + 0x201550CC, // Large 'stclr|lh'. + 0x81279693, // Small 'steor'. + 0x99279693, // Small 'steorl'. + 0x85279693, // Small 'steorb'. + 0x206D50D1, // Large 'steor|lb'. + 0x91279693, // Small 'steorh'. + 0x201550D1, // Large 'steor|lh'. + 0x80001E93, // Small 'stg'. + 0x80069E93, // Small 'stgm'. + 0x80081E93, // Small 'stgp'. + 0x81263293, // Small 'stllr'. + 0x85263293, // Small 'stllrb'. + 0x91263293, // Small 'stllrh'. + 0x80093293, // Small 'stlr'. + 0x80293293, // Small 'stlrb'. + 0x80893293, // Small 'stlrh'. + 0x810C3293, // Small 'stlxp'. + 0x812C3293, // Small 'stlxr'. + 0x852C3293, // Small 'stlxrb'. + 0x912C3293, // Small 'stlxrh'. + 0x80083A93, // Small 'stnp'. + 0x80004293, // Small 'stp'. + 0x80004A93, // Small 'str'. + 0x80014A93, // Small 'strb'. + 0x80044A93, // Small 'strh'. + 0x8142CE93, // Small 'stset'. + 0x9942CE93, // Small 'stsetl'. + 0x8542CE93, // Small 'stsetb'. + 0x206D50D6, // Large 'stset|lb'. + 0x9142CE93, // Small 'stseth'. + 0x201550D6, // Large 'stset|lh'. + 0xB016CE93, // Small 'stsmax'. + 0x100E606F, // Large 'stsmax|l'. + 0x100D606F, // Large 'stsmax|b'. + 0x206D606F, // Large 'stsmax|lb'. + 0x1016606F, // Large 'stsmax|h'. + 0x2015606F, // Large 'stsmax|lh'. + 0x9C96CE93, // Small 'stsmin'. + 0x100E6075, // Large 'stsmin|l'. + 0x100D6075, // Large 'stsmin|b'. + 0x206D6075, // Large 'stsmin|lb'. + 0x10166075, // Large 'stsmin|h'. + 0x20156075, // Large 'stsmin|lh'. + 0x80095293, // Small 'sttr'. + 0x80295293, // Small 'sttrb'. + 0x80895293, // Small 'sttrh'. + 0xB016D693, // Small 'stumax'. + 0x100E607B, // Large 'stumax|l'. + 0x100D607B, // Large 'stumax|b'. + 0x206D607B, // Large 'stumax|lb'. + 0x1016607B, // Large 'stumax|h'. + 0x2015607B, // Large 'stumax|lh'. + 0x9C96D693, // Small 'stumin'. + 0x100E6081, // Large 'stumin|l'. + 0x100D6081, // Large 'stumin|b'. + 0x206D6081, // Large 'stumin|lb'. + 0x10166081, // Large 'stumin|h'. + 0x20156081, // Large 'stumin|lh'. + 0x80095693, // Small 'stur'. + 0x80295693, // Small 'sturb'. + 0x80895693, // Small 'sturh'. + 0x80086293, // Small 'stxp'. + 0x80096293, // Small 'stxr'. + 0x80296293, // Small 'stxrb'. + 0x80896293, // Small 'stxrh'. + 0x807EEA93, // Small 'stz2g'. + 0x8003EA93, // Small 'stzg'. + 0x80D3EA93, // Small 'stzgm'. + 0x80000AB3, // Small 'sub'. + 0x80038AB3, // Small 'subg'. + 0x80080AB3, // Small 'subp'. + 0x81380AB3, // Small 'subps'. + 0x80098AB3, // Small 'subs'. + 0x80000ED3, // Small 'svc'. + 0x800042F3, // Small 'swp'. + 0x8000C2F3, // Small 'swpa'. + 0x8020C2F3, // Small 'swpab'. + 0x8080C2F3, // Small 'swpah'. + 0x80C0C2F3, // Small 'swpal'. + 0x84C0C2F3, // Small 'swpalb'. + 0x90C0C2F3, // Small 'swpalh'. + 0x800142F3, // Small 'swpb'. + 0x800442F3, // Small 'swph'. + 0x800642F3, // Small 'swpl'. + 0x802642F3, // Small 'swplb'. + 0x808642F3, // Small 'swplh'. + 0x80015313, // Small 'sxtb'. + 0x80045313, // Small 'sxth'. + 0x800BD313, // Small 'sxtw'. + 0x80004F33, // Small 'sys'. + 0x80048994, // Small 'tlbi'. + 0x80005274, // Small 'tst'. + 0x800D3854, // Small 'tbnz'. + 0x80006854, // Small 'tbz'. + 0x81A49855, // Small 'ubfiz'. + 0x80069855, // Small 'ubfm'. + 0x800C1855, // Small 'ubfx'. + 0x80001895, // Small 'udf'. + 0x800B2495, // Small 'udiv'. + 0x984205B5, // Small 'umaddl'. + 0x9872B9B5, // Small 'umnegl'. + 0x80C655B5, // Small 'umull'. + 0x808655B5, // Small 'umulh'. + 0x982ACDB5, // Small 'umsubl'. + 0x80015315, // Small 'uxtb'. + 0x80045315, // Small 'uxth'. + 0x800014D7, // Small 'wfe'. + 0x800024D7, // Small 'wfi'. + 0x8E161838, // Small 'xaflag'. + 0x80418618, // Small 'xpacd'. + 0x80918618, // Small 'xpaci'. + 0x208850DB, // Large 'xpacl|ri'. + 0x80461539, // Small 'yield'. + 0x80004C41, // Small 'abs'. + 0x80001081, // Small 'add'. + 0x80E41081, // Small 'addhn'. + 0xBAE41081, // Small 'addhn2'. + 0x80081081, // Small 'addp'. + 0x800B1081, // Small 'addv'. + 0x80024CA1, // Small 'aesd'. + 0x8002CCA1, // Small 'aese'. + 0x86D4CCA1, // Small 'aesimc'. + 0x8036CCA1, // Small 'aesmc'. + 0x800011C1, // Small 'and'. + 0x800C0462, // Small 'bcax'. + 0x814B0CC2, // Small 'bfcvt'. + 0x9D4B0CC2, // Small 'bfcvtn'. + 0x20B150E0, // Large 'bfcvt|n2'. + 0x814790C2, // Small 'bfdot'. + 0x206D50E5, // Large 'bfmla|lb'. + 0x20EA50E5, // Large 'bfmla|lt'. + 0x82C6B4C2, // Small 'bfmmla'. + 0x80000D22, // Small 'bic'. + 0x80001922, // Small 'bif'. + 0x80005122, // Small 'bit'. + 0x80003262, // Small 'bsl'. + 0x80004D83, // Small 'cls'. + 0x80006983, // Small 'clz'. + 0x800895A3, // Small 'cmeq'. + 0x80029DA3, // Small 'cmge'. + 0x800A1DA3, // Small 'cmgt'. + 0x8004A1A3, // Small 'cmhi'. + 0x8009A1A3, // Small 'cmhs'. + 0x8002B1A3, // Small 'cmle'. + 0x800A31A3, // Small 'cmlt'. + 0x8149D1A3, // Small 'cmtst'. + 0x800051C3, // Small 'cnt'. + 0x800042A4, // Small 'dup'. + 0x800049E5, // Small 'eor'. + 0x800F49E5, // Small 'eor3'. + 0x80005305, // Small 'ext'. + 0x80020826, // Small 'fabd'. + 0x80098826, // Small 'fabs'. + 0x80538C26, // Small 'facge'. + 0x81438C26, // Small 'facgt'. + 0x80021026, // Small 'fadd'. + 0x81021026, // Small 'faddp'. + 0x80420466, // Small 'fcadd'. + 0x81068C66, // Small 'fccmp'. + 0x8B068C66, // Small 'fccmpe'. + 0x8112B466, // Small 'fcmeq'. + 0x8053B466, // Small 'fcmge'. + 0x8143B466, // Small 'fcmgt'. + 0x80163466, // Small 'fcmla'. + 0x80563466, // Small 'fcmle'. + 0x81463466, // Small 'fcmlt'. + 0x80083466, // Small 'fcmp'. + 0x80583466, // Small 'fcmpe'. + 0x80C2CC66, // Small 'fcsel'. + 0x800A5866, // Small 'fcvt'. + 0xA61A5866, // Small 'fcvtas'. + 0xAA1A5866, // Small 'fcvtau'. + 0x80CA5866, // Small 'fcvtl'. + 0xBACA5866, // Small 'fcvtl2'. + 0xA6DA5866, // Small 'fcvtms'. + 0xAADA5866, // Small 'fcvtmu'. + 0x80EA5866, // Small 'fcvtn'. + 0xBAEA5866, // Small 'fcvtn2'. + 0xA6EA5866, // Small 'fcvtns'. + 0xAAEA5866, // Small 'fcvtnu'. + 0xA70A5866, // Small 'fcvtps'. + 0xAB0A5866, // Small 'fcvtpu'. + 0x9D8A5866, // Small 'fcvtxn'. + 0x20B150EC, // Large 'fcvtx|n2'. + 0xA7AA5866, // Small 'fcvtzs'. + 0xABAA5866, // Small 'fcvtzu'. + 0x800B2486, // Small 'fdiv'. + 0x101060F1, // Large 'fjcvtz|s'. + 0x804205A6, // Small 'fmadd'. + 0x800C05A6, // Small 'fmax'. + 0x9AEC05A6, // Small 'fmaxnm'. + 0x104460F7, // Large 'fmaxnm|p'. + 0x10E360F7, // Large 'fmaxnm|v'. + 0x810C05A6, // Small 'fmaxp'. + 0x816C05A6, // Small 'fmaxv'. + 0x800725A6, // Small 'fmin'. + 0x9AE725A6, // Small 'fminnm'. + 0x104460FD, // Large 'fminnm|p'. + 0x10E360FD, // Large 'fminnm|v'. + 0x810725A6, // Small 'fminp'. + 0x816725A6, // Small 'fminv'. + 0x8000B1A6, // Small 'fmla'. + 0x80C0B1A6, // Small 'fmlal'. + 0xBAC0B1A6, // Small 'fmlal2'. + 0x8009B1A6, // Small 'fmls'. + 0x80C9B1A6, // Small 'fmlsl'. + 0xBAC9B1A6, // Small 'fmlsl2'. + 0x800B3DA6, // Small 'fmov'. + 0x802ACDA6, // Small 'fmsub'. + 0x800655A6, // Small 'fmul'. + 0x818655A6, // Small 'fmulx'. + 0x800395C6, // Small 'fneg'. + 0x8840B5C6, // Small 'fnmadd'. + 0x8559B5C6, // Small 'fnmsub'. + 0x80CAB5C6, // Small 'fnmul'. + 0x8B019646, // Small 'frecpe'. + 0xA7019646, // Small 'frecps'. + 0xB1019646, // Small 'frecpx'. + 0x10137087, // Large 'frint32|x'. + 0x108E7087, // Large 'frint32|z'. + 0x308F5087, // Large 'frint|64x'. + 0x30925087, // Large 'frint|64z'. + 0x83472646, // Small 'frinta'. + 0x93472646, // Small 'frinti'. + 0x9B472646, // Small 'frintm'. + 0x9D472646, // Small 'frintn'. + 0xA1472646, // Small 'frintp'. + 0xB1472646, // Small 'frintx'. + 0xB5472646, // Small 'frintz'. + 0x20D25103, // Large 'frsqr|te'. + 0x20705103, // Large 'frsqr|ts'. + 0x81494666, // Small 'fsqrt'. + 0x80015666, // Small 'fsub'. + 0x80004DC9, // Small 'ins'. + 0x8000708C, // Small 'ld1'. + 0x8009708C, // Small 'ld1r'. + 0x8000748C, // Small 'ld2'. + 0x8009748C, // Small 'ld2r'. + 0x8000788C, // Small 'ld3'. + 0x8009788C, // Small 'ld3r'. + 0x80007C8C, // Small 'ld4'. + 0x80097C8C, // Small 'ld4r'. + 0x8008388C, // Small 'ldnp'. + 0x8000408C, // Small 'ldp'. + 0x8000488C, // Small 'ldr'. + 0x8009548C, // Small 'ldur'. + 0x8000058D, // Small 'mla'. + 0x80004D8D, // Small 'mls'. + 0x800059ED, // Small 'mov'. + 0x8004D9ED, // Small 'movi'. + 0x800032AD, // Small 'mul'. + 0x80003ACD, // Small 'mvn'. + 0x8004BACD, // Small 'mvni'. + 0x80001CAE, // Small 'neg'. + 0x800051EE, // Small 'not'. + 0x80003A4F, // Small 'orn'. + 0x80004A4F, // Small 'orr'. + 0x800655B0, // Small 'pmul'. + 0x80C655B0, // Small 'pmull'. + 0xBAC655B0, // Small 'pmull2'. + 0x9C821032, // Small 'raddhn'. + 0x30B04108, // Large 'radd|hn2'. + 0x800E6032, // Small 'rax1'. + 0x800A2452, // Small 'rbit'. + 0x20073138, // Large 'rev|16'. + 0x81DF58B2, // Small 'rev32'. + 0x208F3138, // Large 'rev|64'. + 0x80E92272, // Small 'rshrn'. + 0xBAE92272, // Small 'rshrn2'. + 0x9C815672, // Small 'rsubhn'. + 0x30B0410C, // Large 'rsub|hn2'. + 0x80008833, // Small 'saba'. + 0x80C08833, // Small 'sabal'. + 0xBAC08833, // Small 'sabal2'. + 0x80020833, // Small 'sabd'. + 0x80C20833, // Small 'sabdl'. + 0xBAC20833, // Small 'sabdl2'. + 0xA0C09033, // Small 'sadalp'. + 0x80C21033, // Small 'saddl'. + 0xBAC21033, // Small 'saddl2'. + 0xA0C21033, // Small 'saddlp'. + 0xACC21033, // Small 'saddlv'. + 0x81721033, // Small 'saddw'. + 0xBB721033, // Small 'saddw2'. + 0x806A5873, // Small 'scvtf'. + 0x800A3C93, // Small 'sdot'. + 0x803E0513, // Small 'sha1c'. + 0x808E0513, // Small 'sha1h'. + 0x80DE0513, // Small 'sha1m'. + 0x810E0513, // Small 'sha1p'. + 0x30354110, // Large 'sha1|su0'. + 0x303E4110, // Large 'sha1|su1'. + 0x1016602F, // Large 'sha256|h'. + 0x2095602F, // Large 'sha256|h2'. + 0x0000902F, // Large 'sha256su0'. + 0x1005802F, // Large 'sha256su|1'. + 0x10166038, // Large 'sha512|h'. + 0x20956038, // Large 'sha512|h2'. + 0x30356038, // Large 'sha512|su0'. + 0x303E6038, // Large 'sha512|su1'. + 0x80420513, // Small 'shadd'. + 0x80003113, // Small 'shl'. + 0x80063113, // Small 'shll'. + 0x81D63113, // Small 'shll2'. + 0x80074913, // Small 'shrn'. + 0x81D74913, // Small 'shrn2'. + 0x802ACD13, // Small 'shsub'. + 0x80002593, // Small 'sli'. + 0x10058041, // Large 'sm3partw|1'. + 0x10328041, // Large 'sm3partw|2'. + 0xB939F9B3, // Small 'sm3ss1'. + 0x10006114, // Large 'sm3tt1|a'. + 0x100D6114, // Large 'sm3tt1|b'. + 0x211A5114, // Large 'sm3tt|2a'. + 0x211C5114, // Large 'sm3tt|2b'. + 0x8002FDB3, // Small 'sm4e'. + 0x0000711E, // Large 'sm4ekey'. + 0x800C05B3, // Small 'smax'. + 0x810C05B3, // Small 'smaxp'. + 0x816C05B3, // Small 'smaxv'. + 0x800725B3, // Small 'smin'. + 0x810725B3, // Small 'sminp'. + 0x816725B3, // Small 'sminv'. + 0x80C0B1B3, // Small 'smlal'. + 0xBAC0B1B3, // Small 'smlal2'. + 0x80C9B1B3, // Small 'smlsl'. + 0xBAC9B1B3, // Small 'smlsl2'. + 0x801635B3, // Small 'smmla'. + 0x800B3DB3, // Small 'smov'. + 0x80C655B3, // Small 'smull'. + 0xBAC655B3, // Small 'smull2'. + 0x81310633, // Small 'sqabs'. + 0x80420633, // Small 'sqadd'. + 0x00007097, // Large 'sqdmlal'. + 0x10327097, // Large 'sqdmlal|2'. + 0x209E5097, // Large 'sqdml|sl'. + 0x309E5097, // Large 'sqdml|sl2'. + 0x101660A1, // Large 'sqdmul|h'. + 0x100E60A1, // Large 'sqdmul|l'. + 0x209F60A1, // Large 'sqdmul|l2'. + 0x8072BA33, // Small 'sqneg'. + 0x101670A7, // Large 'sqrdmla|h'. + 0x202F60A7, // Large 'sqrdml|sh'. + 0x30AE50A7, // Large 'sqrdm|ulh'. + 0x9889CA33, // Small 'sqrshl'. + 0x101C6049, // Large 'sqrshr|n'. + 0x20B16049, // Large 'sqrshr|n2'. + 0x00008049, // Large 'sqrshrun'. + 0x10328049, // Large 'sqrshrun|2'. + 0x80C44E33, // Small 'sqshl'. + 0xAAC44E33, // Small 'sqshlu'. + 0x9D244E33, // Small 'sqshrn'. + 0x20B150B3, // Large 'sqshr|n2'. + 0x101C60B3, // Large 'sqshru|n'. + 0x20B160B3, // Large 'sqshru|n2'. + 0x802ACE33, // Small 'sqsub'. + 0x80EA6233, // Small 'sqxtn'. + 0xBAEA6233, // Small 'sqxtn2'. + 0x9D5A6233, // Small 'sqxtun'. + 0x20B15125, // Large 'sqxtu|n2'. + 0x8840A253, // Small 'srhadd'. + 0x80002653, // Small 'sri'. + 0x80C44E53, // Small 'srshl'. + 0x81244E53, // Small 'srshr'. + 0x80194E53, // Small 'srsra'. + 0x80062273, // Small 'sshl'. + 0x80C62273, // Small 'sshll'. + 0xBAC62273, // Small 'sshll2'. + 0x80092273, // Small 'sshr'. + 0x8000CA73, // Small 'ssra'. + 0x80C15673, // Small 'ssubl'. + 0xBAC15673, // Small 'ssubl2'. + 0x81715673, // Small 'ssubw'. + 0xBB715673, // Small 'ssubw2'. + 0x80007293, // Small 'st1'. + 0x80007693, // Small 'st2'. + 0x80007A93, // Small 'st3'. + 0x80007E93, // Small 'st4'. + 0x80083A93, // Small 'stnp'. + 0x80004293, // Small 'stp'. + 0x80004A93, // Small 'str'. + 0x80095693, // Small 'stur'. + 0x80000AB3, // Small 'sub'. + 0x80E40AB3, // Small 'subhn'. + 0xBAE40AB3, // Small 'subhn2'. + 0x814792B3, // Small 'sudot'. + 0x8840C6B3, // Small 'suqadd'. + 0x80065313, // Small 'sxtl'. + 0x81D65313, // Small 'sxtl2'. + 0x80003054, // Small 'tbl'. + 0x80006054, // Small 'tbx'. + 0x800E3A54, // Small 'trn1'. + 0x800EBA54, // Small 'trn2'. + 0x80008835, // Small 'uaba'. + 0x80C08835, // Small 'uabal'. + 0xBAC08835, // Small 'uabal2'. + 0x80020835, // Small 'uabd'. + 0x80C20835, // Small 'uabdl'. + 0xBAC20835, // Small 'uabdl2'. + 0xA0C09035, // Small 'uadalp'. + 0x80C21035, // Small 'uaddl'. + 0xBAC21035, // Small 'uaddl2'. + 0xA0C21035, // Small 'uaddlp'. + 0xACC21035, // Small 'uaddlv'. + 0x81721035, // Small 'uaddw'. + 0xBB721035, // Small 'uaddw2'. + 0x806A5875, // Small 'ucvtf'. + 0x800A3C95, // Small 'udot'. + 0x80420515, // Small 'uhadd'. + 0x802ACD15, // Small 'uhsub'. + 0x800C05B5, // Small 'umax'. + 0x810C05B5, // Small 'umaxp'. + 0x816C05B5, // Small 'umaxv'. + 0x800725B5, // Small 'umin'. + 0x810725B5, // Small 'uminp'. + 0x816725B5, // Small 'uminv'. + 0x80C0B1B5, // Small 'umlal'. + 0xBAC0B1B5, // Small 'umlal2'. + 0x80C9B1B5, // Small 'umlsl'. + 0xBAC9B1B5, // Small 'umlsl2'. + 0x801635B5, // Small 'ummla'. + 0x800B3DB5, // Small 'umov'. + 0x80C655B5, // Small 'umull'. + 0xBAC655B5, // Small 'umull2'. + 0x80420635, // Small 'uqadd'. + 0x9889CA35, // Small 'uqrshl'. + 0x101C60B9, // Large 'uqrshr|n'. + 0x20B160B9, // Large 'uqrshr|n2'. + 0x80C44E35, // Small 'uqshl'. + 0x9D244E35, // Small 'uqshrn'. + 0x20B1512A, // Large 'uqshr|n2'. + 0x802ACE35, // Small 'uqsub'. + 0x80EA6235, // Small 'uqxtn'. + 0xBAEA6235, // Small 'uqxtn2'. + 0x8B019655, // Small 'urecpe'. + 0x8840A255, // Small 'urhadd'. + 0x80C44E55, // Small 'urshl'. + 0x81244E55, // Small 'urshr'. + 0x20D2512F, // Large 'ursqr|te'. + 0x80194E55, // Small 'ursra'. + 0x81479275, // Small 'usdot'. + 0x80062275, // Small 'ushl'. + 0x80C62275, // Small 'ushll'. + 0xBAC62275, // Small 'ushll2'. + 0x80092275, // Small 'ushr'. + 0x82C6B675, // Small 'usmmla'. + 0x8840C675, // Small 'usqadd'. + 0x8000CA75, // Small 'usra'. + 0x80C15675, // Small 'usubl'. + 0xBAC15675, // Small 'usubl2'. + 0x81715675, // Small 'usubw'. + 0xBB715675, // Small 'usubw2'. + 0x80065315, // Small 'uxtl'. + 0x81D65315, // Small 'uxtl2'. + 0x800E4355, // Small 'uzp1'. + 0x800EC355, // Small 'uzp2'. + 0x80004838, // Small 'xar'. + 0x80003A98, // Small 'xtn'. + 0x800EBA98, // Small 'xtn2'. + 0x800E413A, // Small 'zip1'. + 0x800EC13A // Small 'zip2'. }; // ---------------------------------------------------------------------------- // ${NameData:End} -#endif +#endif // !ASMJIT_NO_TEXT ASMJIT_END_SUB_NAMESPACE diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instdb.h b/3rdparty/asmjit/src/asmjit/arm/a64instdb.h index 0575d1a2fa65d..a03125401ad98 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64instdb.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64instdb.h @@ -29,7 +29,7 @@ enum InstFlags : uint32_t { //! SIMD element access of half-words can only be used with v0..15. kInstFlagVH0_15 = 0x00000010u, - //! Instruction may consecutive registers if the number of operands is greater than 2. + //! Instruction uses consecutive registers if the number of operands is greater than 2. kInstFlagConsecutive = 0x00000080u }; @@ -39,9 +39,7 @@ struct InstInfo { uint32_t _encoding : 8; //! Index to data specific to each encoding type. uint32_t _encodingDataIndex : 8; - uint32_t _reserved : 2; - //! Index to \ref _nameData. - uint32_t _nameDataIndex : 14; + uint32_t _reserved : 16; uint16_t _rwInfoIndex; uint16_t _flags; @@ -49,10 +47,10 @@ struct InstInfo { //! \name Accessors //! \{ - inline uint32_t rwInfoIndex() const noexcept { return _rwInfoIndex; } - inline uint32_t flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG uint32_t rwInfoIndex() const noexcept { return _rwInfoIndex; } + ASMJIT_INLINE_NODEBUG uint32_t flags() const noexcept { return _flags; } - inline bool hasFlag(uint32_t flag) const { return (_flags & flag) != 0; } + ASMJIT_INLINE_NODEBUG bool hasFlag(uint32_t flag) const { return (_flags & flag) != 0; } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h b/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h index eb4f3f8376676..5c3da7e1f9f71 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h @@ -7,6 +7,7 @@ #define ASMJIT_ARM_A64INSTDB_H_P_INCLUDED #include "../core/codeholder.h" +#include "../core/instdb_p.h" #include "../arm/a64instdb.h" #include "../arm/a64operand.h" @@ -58,14 +59,14 @@ enum RWInfoType : uint32_t { // a64::InstDB - ElementType // ========================= -enum ElementType : uint8_t { - kET_None = Vec::kElementTypeNone, - kET_B = Vec::kElementTypeB, - kET_H = Vec::kElementTypeH, - kET_S = Vec::kElementTypeS, - kET_D = Vec::kElementTypeD, - kET_2H = Vec::kElementTypeH2, - kET_4B = Vec::kElementTypeB4 +enum InstElementType : uint8_t { + kET_None = uint8_t(VecElementType::kNone), + kET_B = uint8_t(VecElementType::kB), + kET_H = uint8_t(VecElementType::kH), + kET_S = uint8_t(VecElementType::kS), + kET_D = uint8_t(VecElementType::kD), + kET_2H = uint8_t(VecElementType::kH2), + kET_4B = uint8_t(VecElementType::kB4) }; // a64::InstDB - GpType @@ -192,6 +193,7 @@ enum EncodingId : uint32_t { kEncodingBaseMvnNeg, kEncodingBaseOp, kEncodingBaseOpImm, + kEncodingBasePrfm, kEncodingBaseR, kEncodingBaseRM_NoImm, kEncodingBaseRM_SImm10, @@ -262,7 +264,7 @@ namespace EncodingData { #define M_OPCODE(field, bits) \ uint32_t _##field : bits; \ - inline constexpr uint32_t field() const noexcept { return uint32_t(_##field) << (32 - bits); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t field() const noexcept { return uint32_t(_##field) << (32 - bits); } struct BaseOp { uint32_t opcode; @@ -412,6 +414,13 @@ struct BaseRM_SImm10 { uint32_t immShift : 4; }; +struct BasePrfm { + uint32_t registerOp : 11; + uint32_t sOffsetOp : 10; + uint32_t uOffsetOp : 11; + uint32_t literalOp; +}; + struct BaseLdSt { uint32_t uOffsetOp : 10; uint32_t prePostOp : 11; @@ -787,6 +796,7 @@ extern const BaseMovKNZ baseMovKNZ[3]; extern const BaseMvnNeg baseMvnNeg[3]; extern const BaseOp baseOp[23]; extern const BaseOpImm baseOpImm[14]; +extern const BasePrfm basePrfm[1]; extern const BaseR baseR[10]; extern const BaseRM_NoImm baseRM_NoImm[21]; extern const BaseRM_SImm10 baseRM_SImm10[2]; @@ -843,26 +853,13 @@ extern const SimdTblTbx simdTblTbx[2]; } // {EncodingData} -// a64::InstDB - InstNameIndex -// =========================== - -// ${NameLimits:Begin} -// ------------------- Automatically generated, do not edit ------------------- -enum : uint32_t { kMaxNameSize = 9 }; -// ---------------------------------------------------------------------------- -// ${NameLimits:End} - -struct InstNameIndex { - uint16_t start; - uint16_t end; -}; - // a64::InstDB - Tables // ==================== #ifndef ASMJIT_NO_TEXT -extern const char _nameData[]; -extern const InstNameIndex instNameIndex[26]; +extern const InstNameIndex instNameIndex; +extern const char _instNameStringTable[]; +extern const uint32_t _instNameIndexTable[]; #endif // !ASMJIT_NO_TEXT } // {InstDB} diff --git a/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp b/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp index 40a4a7952bc9d..e8c6100fa68e8 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp @@ -17,66 +17,66 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64) #if defined(ASMJIT_TEST) UNIT(a64_operand) { INFO("Checking if a64::reg(...) matches built-in IDs"); - EXPECT(w(5) == w5); - EXPECT(x(5) == x5); + EXPECT_EQ(w(5), w5); + EXPECT_EQ(x(5), x5); INFO("Checking Gp register properties"); - EXPECT(Gp().isReg() == true); - EXPECT(w0.isReg() == true); - EXPECT(x0.isReg() == true); - EXPECT(w0.id() == 0); - EXPECT(x0.id() == 0); - EXPECT(wzr.id() == Gp::kIdZr); - EXPECT(xzr.id() == Gp::kIdZr); - EXPECT(wsp.id() == Gp::kIdSp); - EXPECT(sp.id() == Gp::kIdSp); - EXPECT(w0.size() == 4); - EXPECT(x0.size() == 8); - EXPECT(w0.type() == RegType::kARM_GpW); - EXPECT(x0.type() == RegType::kARM_GpX); - EXPECT(w0.group() == RegGroup::kGp); - EXPECT(x0.group() == RegGroup::kGp); + EXPECT_TRUE(Gp().isReg()); + EXPECT_TRUE(w0.isReg()); + EXPECT_TRUE(x0.isReg()); + EXPECT_EQ(w0.id(), 0u); + EXPECT_EQ(x0.id(), 0u); + EXPECT_EQ(wzr.id(), Gp::kIdZr); + EXPECT_EQ(xzr.id(), Gp::kIdZr); + EXPECT_EQ(wsp.id(), Gp::kIdSp); + EXPECT_EQ(sp.id(), Gp::kIdSp); + EXPECT_EQ(w0.size(), 4u); + EXPECT_EQ(x0.size(), 8u); + EXPECT_EQ(w0.type(), RegType::kARM_GpW); + EXPECT_EQ(x0.type(), RegType::kARM_GpX); + EXPECT_EQ(w0.group(), RegGroup::kGp); + EXPECT_EQ(x0.group(), RegGroup::kGp); INFO("Checking Vec register properties"); - EXPECT(v0.type() == RegType::kARM_VecV); - EXPECT(d0.type() == RegType::kARM_VecD); - EXPECT(s0.type() == RegType::kARM_VecS); - EXPECT(h0.type() == RegType::kARM_VecH); - EXPECT(b0.type() == RegType::kARM_VecB); + EXPECT_EQ(v0.type(), RegType::kARM_VecV); + EXPECT_EQ(d0.type(), RegType::kARM_VecD); + EXPECT_EQ(s0.type(), RegType::kARM_VecS); + EXPECT_EQ(h0.type(), RegType::kARM_VecH); + EXPECT_EQ(b0.type(), RegType::kARM_VecB); - EXPECT(v0.group() == RegGroup::kVec); - EXPECT(d0.group() == RegGroup::kVec); - EXPECT(s0.group() == RegGroup::kVec); - EXPECT(h0.group() == RegGroup::kVec); - EXPECT(b0.group() == RegGroup::kVec); + EXPECT_EQ(v0.group(), RegGroup::kVec); + EXPECT_EQ(d0.group(), RegGroup::kVec); + EXPECT_EQ(s0.group(), RegGroup::kVec); + EXPECT_EQ(h0.group(), RegGroup::kVec); + EXPECT_EQ(b0.group(), RegGroup::kVec); INFO("Checking Vec register element[] access"); Vec vd_1 = v15.d(1); - EXPECT(vd_1.type() == RegType::kARM_VecV); - EXPECT(vd_1.group() == RegGroup::kVec); - EXPECT(vd_1.id() == 15); - EXPECT(vd_1.isVecD2()); - EXPECT(vd_1.elementType() == Vec::kElementTypeD); - EXPECT(vd_1.hasElementIndex()); - EXPECT(vd_1.elementIndex() == 1); + EXPECT_EQ(vd_1.type(), RegType::kARM_VecV); + EXPECT_EQ(vd_1.group(), RegGroup::kVec); + EXPECT_EQ(vd_1.id(), 15u); + EXPECT_TRUE(vd_1.isVecD2()); + EXPECT_EQ(vd_1.elementType(), VecElementType::kD); + EXPECT_TRUE(vd_1.hasElementIndex()); + EXPECT_EQ(vd_1.elementIndex(), 1u); Vec vs_3 = v15.s(3); - EXPECT(vs_3.type() == RegType::kARM_VecV); - EXPECT(vs_3.group() == RegGroup::kVec); - EXPECT(vs_3.id() == 15); - EXPECT(vs_3.isVecS4()); - EXPECT(vs_3.elementType() == Vec::kElementTypeS); - EXPECT(vs_3.hasElementIndex()); - EXPECT(vs_3.elementIndex() == 3); + EXPECT_EQ(vs_3.type(), RegType::kARM_VecV); + EXPECT_EQ(vs_3.group(), RegGroup::kVec); + EXPECT_EQ(vs_3.id(), 15u); + EXPECT_TRUE(vs_3.isVecS4()); + EXPECT_EQ(vs_3.elementType(), VecElementType::kS); + EXPECT_TRUE(vs_3.hasElementIndex()); + EXPECT_EQ(vs_3.elementIndex(), 3u); Vec vb_4 = v15.b4(3); - EXPECT(vb_4.type() == RegType::kARM_VecV); - EXPECT(vb_4.group() == RegGroup::kVec); - EXPECT(vb_4.id() == 15); - EXPECT(vb_4.isVecB4x4()); - EXPECT(vb_4.elementType() == Vec::kElementTypeB4); - EXPECT(vb_4.hasElementIndex()); - EXPECT(vb_4.elementIndex() == 3); + EXPECT_EQ(vb_4.type(), RegType::kARM_VecV); + EXPECT_EQ(vb_4.group(), RegGroup::kVec); + EXPECT_EQ(vb_4.id(), 15u); + EXPECT_TRUE(vb_4.isVecB4x4()); + EXPECT_EQ(vb_4.elementType(), VecElementType::kB4); + EXPECT_TRUE(vb_4.hasElementIndex()); + EXPECT_EQ(vb_4.elementIndex(), 3u); } #endif diff --git a/3rdparty/asmjit/src/asmjit/arm/a64operand.h b/3rdparty/asmjit/src/asmjit/arm/a64operand.h index c2d3c179a86f6..c64f20eb4457c 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64operand.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64operand.h @@ -13,24 +13,276 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64) //! \addtogroup asmjit_a64 //! \{ -using arm::Reg; -using arm::Mem; -using arm::Gp; -using arm::GpW; -using arm::GpX; - -using arm::Vec; -using arm::VecB; -using arm::VecH; -using arm::VecS; -using arm::VecD; -using arm::VecV; +class GpW; +class GpX; + +class VecB; +class VecH; +class VecS; +class VecD; +class VecV; + +//! General purpose register (AArch64). +class Gp : public Reg { +public: + ASMJIT_DEFINE_ABSTRACT_REG(Gp, Reg) + + //! Special register id. + enum Id : uint32_t { + //! Register that depends on OS, could be used as TLS offset. + kIdOs = 18, + //! Frame pointer register id. + kIdFp = 29, + //! Link register id. + kIdLr = 30, + //! Stack register id. + kIdSp = 31, + //! Zero register id. + //! + //! Although zero register has the same id as stack register it has a special treatment, because we need to be + //! able to distinguish between these two at API level. Some instructions were designed to be used with SP and + //! some other with ZR - so we need a way to distinguish these two to make sure we emit the right thing. + //! + //! The number 63 is not random, when you perform `id & 31` you would always get 31 for both SP and ZR inputs, + //! which is the identifier used by AArch64 ISA to encode either SP or ZR depending on the instruction. + kIdZr = 63 + }; + + //! Test whether this register is ZR register. + ASMJIT_INLINE_NODEBUG constexpr bool isZR() const noexcept { return id() == kIdZr; } + //! Test whether this register is SP register. + ASMJIT_INLINE_NODEBUG constexpr bool isSP() const noexcept { return id() == kIdSp; } + + //! Cast this register to a 32-bit W register (returns a new operand). + ASMJIT_INLINE_NODEBUG GpW w() const noexcept; + //! \overload + ASMJIT_INLINE_NODEBUG GpW r32() const noexcept; + //! Cast this register to a 64-bit X register (returns a new operand). + ASMJIT_INLINE_NODEBUG GpX x() const noexcept; + //! \overload + ASMJIT_INLINE_NODEBUG GpX r64() const noexcept; +}; + +//! 32-bit general purpose W register (AArch64). +class GpW : public Gp { ASMJIT_DEFINE_FINAL_REG(GpW, Gp, RegTraits); }; +//! 64-bit general purpose X register (AArch64). +class GpX : public Gp { ASMJIT_DEFINE_FINAL_REG(GpX, Gp, RegTraits); }; + +#ifndef _DOXYGEN +ASMJIT_INLINE_NODEBUG GpW Gp::w() const noexcept { return GpW(id()); } +ASMJIT_INLINE_NODEBUG GpX Gp::x() const noexcept { return GpX(id()); } +ASMJIT_INLINE_NODEBUG GpW Gp::r32() const noexcept { return GpW(id()); } +ASMJIT_INLINE_NODEBUG GpX Gp::r64() const noexcept { return GpX(id()); } +#endif + +//! Vector element type (AArch64). +enum class VecElementType : uint32_t { + //! No element type specified. + kNone = 0, + //! Byte elements (B8 or B16). + kB, + //! Halfword elements (H4 or H8). + kH, + //! Singleword elements (S2 or S4). + kS, + //! Doubleword elements (D2). + kD, + //! Byte elements grouped by 4 bytes (B4). + //! + //! \note This element-type is only used by few instructions. + kB4, + //! Halfword elements grouped by 2 halfwords (H2). + //! + //! \note This element-type is only used by few instructions. + kH2, + + //! Maximum value of \ref VecElementType + kMaxValue = kH2 +}; + +//! Vector register (AArch64). +class Vec : public BaseVec { +public: + ASMJIT_DEFINE_ABSTRACT_REG(Vec, BaseVec) + + //! \cond + //! Shortcuts. + enum SignatureReg : uint32_t { + kSignatureElementB = uint32_t(VecElementType::kB) << kSignatureRegElementTypeShift, + kSignatureElementH = uint32_t(VecElementType::kH) << kSignatureRegElementTypeShift, + kSignatureElementS = uint32_t(VecElementType::kS) << kSignatureRegElementTypeShift, + kSignatureElementD = uint32_t(VecElementType::kD) << kSignatureRegElementTypeShift, + kSignatureElementB4 = uint32_t(VecElementType::kB4) << kSignatureRegElementTypeShift, + kSignatureElementH2 = uint32_t(VecElementType::kH2) << kSignatureRegElementTypeShift + }; + //! \endcond + + //! Returns whether the register has element type or element index (or both). + ASMJIT_INLINE_NODEBUG constexpr bool hasElementTypeOrIndex() const noexcept { return _signature.hasField(); } + + //! Returns whether the vector register has associated a vector element type. + ASMJIT_INLINE_NODEBUG constexpr bool hasElementType() const noexcept { return _signature.hasField(); } + //! Returns vector element type of the register. + ASMJIT_INLINE_NODEBUG constexpr VecElementType elementType() const noexcept { return VecElementType(_signature.getField()); } + //! Sets vector element type of the register to `elementType`. + ASMJIT_INLINE_NODEBUG void setElementType(VecElementType elementType) noexcept { _signature.setField(uint32_t(elementType)); } + //! Resets vector element type to none. + ASMJIT_INLINE_NODEBUG void resetElementType() noexcept { _signature.setField(0); } + + ASMJIT_INLINE_NODEBUG constexpr bool isVecB8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementB); } + ASMJIT_INLINE_NODEBUG constexpr bool isVecH4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementH); } + ASMJIT_INLINE_NODEBUG constexpr bool isVecS2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementS); } + ASMJIT_INLINE_NODEBUG constexpr bool isVecD1() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature); } + + ASMJIT_INLINE_NODEBUG constexpr bool isVecB16() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementB); } + ASMJIT_INLINE_NODEBUG constexpr bool isVecH8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementH); } + ASMJIT_INLINE_NODEBUG constexpr bool isVecS4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementS); } + ASMJIT_INLINE_NODEBUG constexpr bool isVecD2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementD); } + ASMJIT_INLINE_NODEBUG constexpr bool isVecB4x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementB4); } + ASMJIT_INLINE_NODEBUG constexpr bool isVecH2x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementH2); } + + //! Creates a cloned register with element access. + ASMJIT_INLINE_NODEBUG Vec at(uint32_t elementIndex) const noexcept { + return Vec((signature() & ~kSignatureRegElementIndexMask) | (elementIndex << kSignatureRegElementIndexShift) | kSignatureRegElementFlagMask, id()); + } + + //! Cast this register to an 8-bit B register (AArch64 only). + ASMJIT_INLINE_NODEBUG VecB b() const noexcept; + //! Cast this register to a 16-bit H register (AArch64 only). + ASMJIT_INLINE_NODEBUG VecH h() const noexcept; + //! Cast this register to a 32-bit S register. + ASMJIT_INLINE_NODEBUG VecS s() const noexcept; + //! Cast this register to a 64-bit D register. + ASMJIT_INLINE_NODEBUG VecD d() const noexcept; + //! Cast this register to a 128-bit Q register. + ASMJIT_INLINE_NODEBUG VecV q() const noexcept; + //! Cast this register to a 128-bit V register. + ASMJIT_INLINE_NODEBUG VecV v() const noexcept; + + //! Casts this register to b (clone). + ASMJIT_INLINE_NODEBUG Vec v8() const noexcept; + //! Casts this register to h (clone). + ASMJIT_INLINE_NODEBUG Vec v16() const noexcept; + //! Casts this register to s (clone). + ASMJIT_INLINE_NODEBUG Vec v32() const noexcept; + //! Casts this register to d (clone). + ASMJIT_INLINE_NODEBUG Vec v64() const noexcept; + //! Casts this register to q (clone). + ASMJIT_INLINE_NODEBUG Vec v128() const noexcept; + + //! Cast this register to a 128-bit V.B[elementIndex] register. + ASMJIT_INLINE_NODEBUG VecV b(uint32_t elementIndex) const noexcept; + //! Cast this register to a 128-bit V.H[elementIndex] register. + ASMJIT_INLINE_NODEBUG VecV h(uint32_t elementIndex) const noexcept; + //! Cast this register to a 128-bit V.S[elementIndex] register. + ASMJIT_INLINE_NODEBUG VecV s(uint32_t elementIndex) const noexcept; + //! Cast this register to a 128-bit V.D[elementIndex] register. + ASMJIT_INLINE_NODEBUG VecV d(uint32_t elementIndex) const noexcept; + //! Cast this register to a 128-bit V.H2[elementIndex] register. + ASMJIT_INLINE_NODEBUG VecV h2(uint32_t elementIndex) const noexcept; + //! Cast this register to a 128-bit V.B4[elementIndex] register. + ASMJIT_INLINE_NODEBUG VecV b4(uint32_t elementIndex) const noexcept; + + //! Cast this register to V.8B. + ASMJIT_INLINE_NODEBUG VecD b8() const noexcept; + //! Cast this register to V.16B. + ASMJIT_INLINE_NODEBUG VecV b16() const noexcept; + //! Cast this register to V.2H. + ASMJIT_INLINE_NODEBUG VecS h2() const noexcept; + //! Cast this register to V.4H. + ASMJIT_INLINE_NODEBUG VecD h4() const noexcept; + //! Cast this register to V.8H. + ASMJIT_INLINE_NODEBUG VecV h8() const noexcept; + //! Cast this register to V.2S. + ASMJIT_INLINE_NODEBUG VecD s2() const noexcept; + //! Cast this register to V.4S. + ASMJIT_INLINE_NODEBUG VecV s4() const noexcept; + //! Cast this register to V.2D. + ASMJIT_INLINE_NODEBUG VecV d2() const noexcept; + + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature _makeElementAccessSignature(VecElementType elementType, uint32_t elementIndex) noexcept { + return OperandSignature{ + uint32_t(RegTraits::kSignature) | + uint32_t(kSignatureRegElementFlagMask) | + (uint32_t(elementType) << kSignatureRegElementTypeShift) | + (uint32_t(elementIndex << kSignatureRegElementIndexShift))}; + } +}; + +//! 8-bit view (S) of VFP/SIMD register. +class VecB : public Vec { +public: + ASMJIT_DEFINE_FINAL_REG(VecB, Vec, RegTraits) +}; + +//! 16-bit view (S) of VFP/SIMD register. +class VecH : public Vec { +public: + ASMJIT_DEFINE_FINAL_REG(VecH, Vec, RegTraits) +}; + +//! 32-bit view (S) of VFP/SIMD register. +class VecS : public Vec { +public: + ASMJIT_DEFINE_FINAL_REG(VecS, Vec, RegTraits) +}; + +//! 64-bit view (D) of VFP/SIMD register. +class VecD : public Vec { +public: + ASMJIT_DEFINE_FINAL_REG(VecD, Vec, RegTraits) +}; + +//! 128-bit vector register (Q or V). +class VecV : public Vec { +public: + ASMJIT_DEFINE_FINAL_REG(VecV, Vec, RegTraits) +}; + +ASMJIT_INLINE_NODEBUG VecB Vec::b() const noexcept { return VecB(id()); } +ASMJIT_INLINE_NODEBUG VecH Vec::h() const noexcept { return VecH(id()); } +ASMJIT_INLINE_NODEBUG VecS Vec::s() const noexcept { return VecS(id()); } +ASMJIT_INLINE_NODEBUG VecD Vec::d() const noexcept { return VecD(id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::q() const noexcept { return VecV(id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::v() const noexcept { return VecV(id()); } + +ASMJIT_INLINE_NODEBUG Vec Vec::v8() const noexcept { return VecB(id()); } +ASMJIT_INLINE_NODEBUG Vec Vec::v16() const noexcept { return VecH(id()); } +ASMJIT_INLINE_NODEBUG Vec Vec::v32() const noexcept { return VecS(id()); } +ASMJIT_INLINE_NODEBUG Vec Vec::v64() const noexcept { return VecD(id()); } +ASMJIT_INLINE_NODEBUG Vec Vec::v128() const noexcept { return VecV(id()); } + +ASMJIT_INLINE_NODEBUG VecV Vec::b(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kB, elementIndex), id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::h(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kH, elementIndex), id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::s(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kS, elementIndex), id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::d(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kD, elementIndex), id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::h2(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kH2, elementIndex), id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::b4(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kB4, elementIndex), id()); } + +ASMJIT_INLINE_NODEBUG VecD Vec::b8() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementB}, id()); } +ASMJIT_INLINE_NODEBUG VecS Vec::h2() const noexcept { return VecS(OperandSignature{VecS::kSignature | kSignatureElementH}, id()); } +ASMJIT_INLINE_NODEBUG VecD Vec::h4() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementH}, id()); } +ASMJIT_INLINE_NODEBUG VecD Vec::s2() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementS}, id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::b16() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementB}, id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::h8() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementH}, id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::s4() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementS}, id()); } +ASMJIT_INLINE_NODEBUG VecV Vec::d2() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementD}, id()); } #ifndef _DOXYGEN namespace regs { #endif -using namespace ::asmjit::arm::regs; +//! Creates a 32-bit W register operand. +static ASMJIT_INLINE_NODEBUG constexpr GpW w(uint32_t id) noexcept { return GpW(id); } +//! Creates a 64-bit X register operand. +static ASMJIT_INLINE_NODEBUG constexpr GpX x(uint32_t id) noexcept { return GpX(id); } + +//! Creates a 32-bit S register operand. +static ASMJIT_INLINE_NODEBUG constexpr VecS s(uint32_t id) noexcept { return VecS(id); } +//! Creates a 64-bit D register operand. +static ASMJIT_INLINE_NODEBUG constexpr VecD d(uint32_t id) noexcept { return VecD(id); } +//! Creates a 1282-bit V register operand. +static ASMJIT_INLINE_NODEBUG constexpr VecV v(uint32_t id) noexcept { return VecV(id); } static constexpr GpW w0 = GpW(0); static constexpr GpW w1 = GpW(1); @@ -305,8 +557,94 @@ static constexpr VecV v31 = VecV(31); using namespace regs; #endif +//! \name Shift Operation Construction +//! \{ + +//! Constructs a `UXTB #value` extend and shift (unsigned byte extend) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Shift uxtb(uint32_t value) noexcept { return Shift(ShiftOp::kUXTB, value); } +//! Constructs a `UXTH #value` extend and shift (unsigned hword extend) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Shift uxth(uint32_t value) noexcept { return Shift(ShiftOp::kUXTH, value); } +//! Constructs a `UXTW #value` extend and shift (unsigned word extend) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Shift uxtw(uint32_t value) noexcept { return Shift(ShiftOp::kUXTW, value); } +//! Constructs a `UXTX #value` extend and shift (unsigned dword extend) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Shift uxtx(uint32_t value) noexcept { return Shift(ShiftOp::kUXTX, value); } + +//! Constructs a `SXTB #value` extend and shift (signed byte extend) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Shift sxtb(uint32_t value) noexcept { return Shift(ShiftOp::kSXTB, value); } +//! Constructs a `SXTH #value` extend and shift (signed hword extend) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Shift sxth(uint32_t value) noexcept { return Shift(ShiftOp::kSXTH, value); } +//! Constructs a `SXTW #value` extend and shift (signed word extend) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Shift sxtw(uint32_t value) noexcept { return Shift(ShiftOp::kSXTW, value); } +//! Constructs a `SXTX #value` extend and shift (signed dword extend) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Shift sxtx(uint32_t value) noexcept { return Shift(ShiftOp::kSXTX, value); } + +//! \} + +//! \name Memory Operand Construction +//! \{ + +//! Creates `[base, offset]` memory operand (offset mode) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, int32_t offset = 0) noexcept { + return Mem(base, offset); +} + +//! Creates `[base, offset]!` memory operand (pre-index mode) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_pre(const Gp& base, int32_t offset = 0) noexcept { + return Mem(base, offset, OperandSignature::fromValue(OffsetMode::kPreIndex)); +} + +//! Creates `[base], offset` memory operand (post-index mode) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_post(const Gp& base, int32_t offset = 0) noexcept { + return Mem(base, offset, OperandSignature::fromValue(OffsetMode::kPostIndex)); +} + +//! Creates `[base, index]` memory operand (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index) noexcept { + return Mem(base, index); +} + +//! Creates `[base, index]!` memory operand (pre-index mode) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_pre(const Gp& base, const Gp& index) noexcept { + return Mem(base, index, OperandSignature::fromValue(OffsetMode::kPreIndex)); +} + +//! Creates `[base], index` memory operand (post-index mode) (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_post(const Gp& base, const Gp& index) noexcept { + return Mem(base, index, OperandSignature::fromValue(OffsetMode::kPostIndex)); +} + +//! Creates `[base, index, SHIFT_OP #shift]` memory operand (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index, const Shift& shift) noexcept { + return Mem(base, index, shift); +} + +//! Creates `[base, offset]` memory operand (AArch64). +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, int32_t offset = 0) noexcept { + return Mem(base, offset); +} + +// TODO: [ARM] PC + offset address. +#if 0 +//! Creates `[PC + offset]` (relative) memory operand. +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const PC& pc, int32_t offset = 0) noexcept { + return Mem(pc, offset); +} +#endif + +//! \} + //! \} ASMJIT_END_SUB_NAMESPACE +//! \cond INTERNAL +ASMJIT_BEGIN_NAMESPACE +ASMJIT_DEFINE_TYPE_ID(a64::GpW, TypeId::kInt32); +ASMJIT_DEFINE_TYPE_ID(a64::GpX, TypeId::kInt64); +ASMJIT_DEFINE_TYPE_ID(a64::VecS, TypeId::kFloat32x1); +ASMJIT_DEFINE_TYPE_ID(a64::VecD, TypeId::kFloat64x1); +ASMJIT_DEFINE_TYPE_ID(a64::VecV, TypeId::kInt32x4); +ASMJIT_END_NAMESPACE +//! \endcond + #endif // ASMJIT_ARM_A64OPERAND_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp b/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp index aaec1c90f9978..b97f259efa031 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp @@ -131,7 +131,7 @@ Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& controlType, RAInstB InstId instId = inst->id(); uint32_t opCount = inst->opCount(); const Operand* opArray = inst->operands(); - ASMJIT_PROPAGATE(InstInternal::queryRWInfo(_arch, inst->baseInst(), opArray, opCount, &rwInfo)); + ASMJIT_PROPAGATE(InstInternal::queryRWInfo(inst->baseInst(), opArray, opCount, &rwInfo)); const InstDB::InstInfo& instInfo = InstDB::infoById(instId); uint32_t singleRegOps = 0; @@ -230,7 +230,7 @@ Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& controlType, RAInstB if (reg.as().hasElementIndex()) { // Only the first 0..15 registers can be used if the register uses // element accessor that accesses half-words (h[0..7] elements). - if (instInfo.hasFlag(InstDB::kInstFlagVH0_15) && reg.as().elementType() == Vec::kElementTypeH) { + if (instInfo.hasFlag(InstDB::kInstFlagVH0_15) && reg.as().elementType() == VecElementType::kH) { if (Support::test(flags, RATiedFlags::kUse)) useId &= 0x0000FFFFu; else @@ -595,14 +595,14 @@ void ARMRAPass::onInit() noexcept { _archTraits = &ArchTraits::byArch(arch); _physRegCount.set(RegGroup::kGp, 32); _physRegCount.set(RegGroup::kVec, 32); - _physRegCount.set(RegGroup::kExtraVirt2, 0); + _physRegCount.set(RegGroup::kMask, 0); _physRegCount.set(RegGroup::kExtraVirt3, 0); _buildPhysIndex(); _availableRegCount = _physRegCount; _availableRegs[RegGroup::kGp] = Support::lsbMask(_physRegCount.get(RegGroup::kGp)); _availableRegs[RegGroup::kVec] = Support::lsbMask(_physRegCount.get(RegGroup::kVec)); - _availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask(_physRegCount.get(RegGroup::kExtraVirt2)); + _availableRegs[RegGroup::kMask] = Support::lsbMask(_physRegCount.get(RegGroup::kMask)); _availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask(_physRegCount.get(RegGroup::kExtraVirt3)); _scratchRegIndexes[0] = uint8_t(27); @@ -612,7 +612,9 @@ void ARMRAPass::onInit() noexcept { // make unavailable all registers that are special and cannot be used in general. bool hasFP = _func->frame().hasPreservedFP(); - if (hasFP) + // Apple ABI requires that the frame-pointer register is not changed by leaf functions and properly updated + // by non-leaf functions. So, let's make this register unavailable as it's just not safe to update it. + if (hasFP || cc()->environment().isDarwin()) makeUnavailable(RegGroup::kGp, Gp::kIdFp); makeUnavailable(RegGroup::kGp, Gp::kIdSp); diff --git a/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h b/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h index e1a90ab8df776..73130873f4429 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h +++ b/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h @@ -37,7 +37,7 @@ class ARMRAPass : public BaseRAPass { //! \{ ARMRAPass() noexcept; - virtual ~ARMRAPass() noexcept; + ~ARMRAPass() noexcept override; //! \} @@ -45,10 +45,10 @@ class ARMRAPass : public BaseRAPass { //! \{ //! Returns the compiler casted to `arm::Compiler`. - inline Compiler* cc() const noexcept { return static_cast(_cb); } + ASMJIT_INLINE_NODEBUG Compiler* cc() const noexcept { return static_cast(_cb); } //! Returns emit helper. - inline EmitHelper* emitHelper() noexcept { return &_emitHelper; } + ASMJIT_INLINE_NODEBUG EmitHelper* emitHelper() noexcept { return &_emitHelper; } //! \} diff --git a/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp b/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp index 0432043106a8f..3fe2c6b911cf3 100644 --- a/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp +++ b/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp @@ -9,7 +9,7 @@ #include "../core/misc_p.h" #include "../core/support.h" #include "../arm/armformatter_p.h" -#include "../arm/armoperand.h" +#include "../arm/a64operand.h" #include "../arm/a64instapi_p.h" #include "../arm/a64instdb_p.h" @@ -26,78 +26,225 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept // @EnumStringBegin{"enum": "CpuFeatures::ARM", "output": "sFeature", "strip": "k"}@ static const char sFeatureString[] = "None\0" - "THUMB\0" - "THUMBv2\0" "ARMv6\0" "ARMv7\0" "ARMv8a\0" - "ARMv8_1a\0" - "ARMv8_2a\0" - "ARMv8_3a\0" - "ARMv8_4a\0" - "ARMv8_5a\0" - "ARMv8_6a\0" - "ARMv8_7a\0" - "VFPv2\0" - "VFPv3\0" - "VFPv4\0" - "VFP_D32\0" + "THUMB\0" + "THUMBv2\0" + "ABLE\0" + "ADERR\0" "AES\0" - "ALTNZCV\0" + "AFP\0" + "AIE\0" + "AMU1\0" + "AMU1_1\0" + "ANERR\0" "ASIMD\0" "BF16\0" + "BRBE\0" "BTI\0" + "BWE\0" + "CCIDX\0" + "CHK\0" + "CLRBHB\0" + "CMOW\0" + "CONSTPACFIELD\0" + "CPA\0" + "CPA2\0" "CPUID\0" "CRC32\0" + "CSSC\0" + "CSV2\0" + "CSV2_3\0" + "CSV3\0" + "D128\0" "DGH\0" "DIT\0" "DOTPROD\0" + "DPB\0" + "DPB2\0" + "EBEP\0" + "EBF16\0" + "ECBHB\0" + "ECV\0" + "EDHSR\0" "EDSP\0" + "FAMINMAX\0" "FCMA\0" - "FJCVTZS\0" + "FGT\0" + "FGT2\0" + "FHM\0" "FLAGM\0" + "FLAGM2\0" + "FMAC\0" + "FP\0" + "FP16\0" "FP16CONV\0" - "FP16FML\0" - "FP16FULL\0" - "FRINT\0" + "FP8\0" + "FP8DOT2\0" + "FP8DOT4\0" + "FP8FMA\0" + "FPMR\0" + "FRINTTS\0" + "GCS\0" + "HACDBS\0" + "HAFDBS\0" + "HAFT\0" + "HDBSS\0" + "HBC\0" + "HCX\0" + "HPDS\0" + "HPDS2\0" "I8MM\0" "IDIVA\0" "IDIVT\0" + "ITE\0" + "JSCVT\0" + "LOR\0" + "LRCPC\0" + "LRCPC2\0" + "LRCPC3\0" + "LS64\0" + "LS64_ACCDATA\0" + "LS64_V\0" "LSE\0" + "LSE128\0" + "LSE2\0" + "LUT\0" + "LVA\0" + "LVA3\0" + "MEC\0" + "MOPS\0" + "MPAM\0" "MTE\0" - "RCPC_IMMO\0" - "RDM\0" + "MTE2\0" + "MTE3\0" + "MTE4\0" + "MTE_ASYM_FAULT\0" + "MTE_ASYNC\0" + "MTE_CANONICAL_TAGS\0" + "MTE_NO_ADDRESS_TAGS\0" + "MTE_PERM_S1\0" + "MTE_STORE_ONLY\0" + "MTE_TAGGED_FAR\0" + "MTPMU\0" + "NMI\0" + "NV\0" + "NV2\0" + "PAN\0" + "PAN2\0" + "PAN3\0" + "PAUTH\0" + "PFAR\0" "PMU\0" "PMULL\0" + "PRFMSLC\0" + "RAS\0" + "RAS1_1\0" + "RAS2\0" + "RASSA2\0" + "RDM\0" + "RME\0" "RNG\0" + "RNG_TRAP\0" + "RPRES\0" + "RPRFM\0" + "S1PIE\0" + "S1POE\0" + "S2PIE\0" + "S2POE\0" "SB\0" + "SCTLR2\0" + "SEBEP\0" + "SEL2\0" "SHA1\0" - "SHA2\0" + "SHA256\0" "SHA3\0" "SHA512\0" "SM3\0" "SM4\0" + "SME\0" + "SME2\0" + "SME2_1\0" + "SME_B16B16\0" + "SME_B16F32\0" + "SME_BI32I32\0" + "SME_F16F16\0" + "SME_F16F32\0" + "SME_F32F32\0" + "SME_F64F64\0" + "SME_F8F16\0" + "SME_F8F32\0" + "SME_FA64\0" + "SME_I16I32\0" + "SME_I16I64\0" + "SME_I8I32\0" + "SME_LUTv2\0" + "SPE\0" + "SPE1_1\0" + "SPE1_2\0" + "SPE1_3\0" + "SPE1_4\0" + "SPE_ALTCLK\0" + "SPE_CRR\0" + "SPE_EFT\0" + "SPE_FDS\0" + "SPE_FPF\0" + "SPE_SME\0" + "SPECRES\0" + "SPECRES2\0" + "SPMU\0" "SSBS\0" + "SSBS2\0" + "SSVE_FP8DOT2\0" + "SSVE_FP8DOT4\0" + "SSVE_FP8FMA\0" "SVE\0" + "SVE2\0" + "SVE2_1\0" + "SVE_AES\0" + "SVE_B16B16\0" "SVE_BF16\0" + "SVE_BITPERM\0" + "SVE_EBF16\0" "SVE_F32MM\0" "SVE_F64MM\0" "SVE_I8MM\0" - "SVE_PMULL\0" - "SVE2\0" - "SVE2_AES\0" - "SVE2_BITPERM\0" - "SVE2_SHA3\0" - "SVE2_SM4\0" + "SVE_PMULL128\0" + "SVE_SHA3\0" + "SVE_SM4\0" + "SYSINSTR128\0" + "SYSREG128\0" + "THE\0" + "TLBIOS\0" + "TLBIRANGE\0" + "TLBIW\0" "TME\0" + "TRF\0" + "UAO\0" + "VFP_D32\0" + "VHE\0" + "VMID16\0" + "WFXT\0" + "XNX\0" + "XS\0" "\0"; static const uint16_t sFeatureIndex[] = { - 0, 5, 11, 19, 25, 31, 38, 47, 56, 65, 74, 83, 92, 101, 107, 113, 119, 127, - 131, 139, 145, 150, 154, 160, 166, 170, 174, 182, 187, 192, 200, 206, 215, - 223, 232, 238, 243, 249, 255, 259, 263, 273, 277, 281, 287, 291, 294, 299, - 304, 309, 316, 320, 324, 329, 333, 342, 352, 362, 371, 381, 386, 395, 408, - 418, 427, 431 + 0, 5, 11, 17, 24, 30, 38, 43, 49, 53, 57, 61, 66, 73, 79, 85, 90, 95, 99, + 103, 109, 113, 120, 125, 139, 143, 148, 154, 160, 165, 170, 177, 182, 187, + 191, 195, 203, 207, 212, 217, 223, 229, 233, 239, 244, 253, 258, 262, 267, + 271, 277, 284, 289, 292, 297, 306, 310, 318, 326, 333, 338, 346, 350, 357, + 364, 369, 375, 379, 383, 388, 394, 399, 405, 411, 415, 421, 425, 431, 438, + 445, 450, 463, 470, 474, 481, 486, 490, 494, 499, 503, 508, 513, 517, 522, + 527, 532, 547, 557, 576, 596, 608, 623, 638, 644, 648, 651, 655, 659, 664, + 669, 675, 680, 684, 690, 698, 702, 709, 714, 721, 725, 729, 733, 742, 748, + 754, 760, 766, 772, 778, 781, 788, 794, 799, 804, 811, 816, 823, 827, 831, + 835, 840, 847, 858, 869, 881, 892, 903, 914, 925, 935, 945, 954, 965, 976, + 986, 996, 1000, 1007, 1014, 1021, 1028, 1039, 1047, 1055, 1063, 1071, 1079, + 1087, 1096, 1101, 1106, 1112, 1125, 1138, 1150, 1154, 1159, 1166, 1174, 1185, + 1194, 1206, 1216, 1226, 1236, 1245, 1258, 1267, 1275, 1287, 1297, 1301, 1308, + 1318, 1324, 1328, 1332, 1336, 1344, 1348, 1355, 1360, 1364, 1367 }; // @EnumStringEnd@ @@ -111,14 +258,14 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatCondCode(String& sb, CondCode c static const char condCodeData[] = "al\0" "na\0" "eq\0" "ne\0" - "cs\0" "cc\0" "mi\0" "pl\0" "vs\0" "vc\0" + "hs\0" "lo\0" "mi\0" "pl\0" "vs\0" "vc\0" "hi\0" "ls\0" "ge\0" "lt\0" "gt\0" "le\0" ""; return sb.append(condCodeData + Support::min(uint32_t(cc), 16u) * 3); } ASMJIT_FAVOR_SIZE Error FormatterInternal::formatShiftOp(String& sb, ShiftOp shiftOp) noexcept { - const char* str = ""; + const char* str = nullptr; switch (shiftOp) { case ShiftOp::kLSL: str = "lsl"; break; case ShiftOp::kLSR: str = "lsr"; break; @@ -134,10 +281,308 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatShiftOp(String& sb, ShiftOp shi case ShiftOp::kSXTH: str = "sxth"; break; case ShiftOp::kSXTW: str = "sxtw"; break; case ShiftOp::kSXTX: str = "sxtx"; break; + default: str = ""; break; } return sb.append(str); } +// arm::FormatterInternal - Format Register +// ======================================== + +struct FormatElementData { + char letter; + uint8_t elementCount; + uint8_t onlyIndex; + uint8_t reserved; +}; + +static constexpr FormatElementData formatElementDataTable[9] = { + { '?' , 0 , 0, 0 }, // None + { 'b' , 16, 0, 0 }, // bX or b[index] + { 'h' , 8 , 0, 0 }, // hX or h[index] + { 's' , 4 , 0, 0 }, // sX or s[index] + { 'd' , 2 , 0, 0 }, // dX or d[index] + { 'b' , 4 , 1, 0 }, // ?? or b4[index] + { 'h' , 2 , 1, 0 }, // ?? or h2[index] + { '?' , 0 , 0, 0 }, // invalid (possibly stored in Operand) + { '?' , 0 , 0, 0 } // invalid (never stored in Operand, bug...) +}; + +ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister( + String& sb, + FormatFlags flags, + const BaseEmitter* emitter, + Arch arch, + RegType regType, + uint32_t rId, + uint32_t elementType, + uint32_t elementIndex) noexcept { + + DebugUtils::unused(flags); + DebugUtils::unused(arch); + + static const char bhsdq[] = "bhsdq"; + + bool virtRegFormatted = false; + +#ifndef ASMJIT_NO_COMPILER + if (Operand::isVirtId(rId)) { + if (emitter && emitter->isCompiler()) { + const BaseCompiler* cc = static_cast(emitter); + if (cc->isVirtIdValid(rId)) { + VirtReg* vReg = cc->virtRegById(rId); + ASMJIT_ASSERT(vReg != nullptr); + + const char* name = vReg->name(); + if (name && name[0] != '\0') + ASMJIT_PROPAGATE(sb.append(name)); + else + ASMJIT_PROPAGATE(sb.appendFormat("%%%u", unsigned(Operand::virtIdToIndex(rId)))); + + virtRegFormatted = true; + } + } + } +#else + DebugUtils::unused(emitter, flags); +#endif + + if (!virtRegFormatted) { + char letter = '\0'; + switch (regType) { + case RegType::kARM_VecB: + case RegType::kARM_VecH: + case RegType::kARM_VecS: + case RegType::kARM_VecD: + case RegType::kARM_VecV: + letter = bhsdq[uint32_t(regType) - uint32_t(RegType::kARM_VecB)]; + if (elementType) + letter = 'v'; + break; + + case RegType::kARM_GpW: + if (Environment::is64Bit(arch)) { + letter = 'w'; + + if (rId == a64::Gp::kIdZr) + return sb.append("wzr", 3); + + if (rId == a64::Gp::kIdSp) + return sb.append("wsp", 3); + } + else { + letter = 'r'; + } + break; + + case RegType::kARM_GpX: + if (Environment::is64Bit(arch)) { + if (rId == a64::Gp::kIdZr) + return sb.append("xzr", 3); + if (rId == a64::Gp::kIdSp) + return sb.append("sp", 2); + + letter = 'x'; + break; + } + + // X registers are undefined in 32-bit mode. + ASMJIT_FALLTHROUGH; + + default: + ASMJIT_PROPAGATE(sb.appendFormat("?%u", uint32_t(regType), rId)); + break; + } + + if (letter) + ASMJIT_PROPAGATE(sb.appendFormat("%c%u", letter, rId)); + } + + constexpr uint32_t kElementTypeCount = uint32_t(a64::VecElementType::kMaxValue) + 1; + if (elementType) { + elementType = Support::min(elementType, kElementTypeCount); + + FormatElementData elementData = formatElementDataTable[elementType]; + uint32_t elementCount = elementData.elementCount; + + if (regType == RegType::kARM_VecD) { + elementCount /= 2u; + } + + ASMJIT_PROPAGATE(sb.append('.')); + if (elementCount) { + ASMJIT_PROPAGATE(sb.appendUInt(elementCount)); + } + ASMJIT_PROPAGATE(sb.append(elementData.letter)); + } + + if (elementIndex != 0xFFFFFFFFu) { + ASMJIT_PROPAGATE(sb.appendFormat("[%u]", elementIndex)); + } + + return kErrorOk; +} + +ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegisterList( + String& sb, + FormatFlags flags, + const BaseEmitter* emitter, + Arch arch, + RegType regType, + uint32_t rMask) noexcept { + + bool first = true; + + ASMJIT_PROPAGATE(sb.append('{')); + while (rMask != 0u) { + uint32_t start = Support::ctz(rMask); + uint32_t count = 0u; + + uint32_t mask = 1u << start; + do { + rMask &= ~mask; + mask <<= 1u; + count++; + } while (rMask & mask); + + if (!first) + ASMJIT_PROPAGATE(sb.append(", ")); + + ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, regType, start, 0, 0xFFFFFFFFu)); + if (count >= 2u) { + ASMJIT_PROPAGATE(sb.append('-')); + ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, regType, start + count - 1, 0, 0xFFFFFFFFu)); + } + + first = false; + } + ASMJIT_PROPAGATE(sb.append('}')); + + return kErrorOk; +} + +// a64::FormatterInternal - Format Operand +// ======================================= + +ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand( + String& sb, + FormatFlags flags, + const BaseEmitter* emitter, + Arch arch, + const Operand_& op) noexcept { + + if (op.isReg()) { + const BaseReg& reg = op.as(); + + uint32_t elementType = op._signature.getField(); + uint32_t elementIndex = op.as().elementIndex(); + + if (!op.as().hasElementIndex()) + elementIndex = 0xFFFFFFFFu; + + return formatRegister(sb, flags, emitter, arch, reg.type(), reg.id(), elementType, elementIndex); + } + + if (op.isMem()) { + const Mem& m = op.as(); + ASMJIT_PROPAGATE(sb.append('[')); + + if (m.hasBase()) { + if (m.hasBaseLabel()) { + ASMJIT_PROPAGATE(Formatter::formatLabel(sb, flags, emitter, m.baseId())); + } + else { + FormatFlags modifiedFlags = flags; + if (m.isRegHome()) { + ASMJIT_PROPAGATE(sb.append('&')); + modifiedFlags &= ~FormatFlags::kRegCasts; + } + ASMJIT_PROPAGATE(formatRegister(sb, modifiedFlags, emitter, arch, m.baseType(), m.baseId())); + } + } + else { + // ARM really requires base. + if (m.hasIndex() || m.hasOffset()) { + ASMJIT_PROPAGATE(sb.append("")); + } + } + + // The post index makes it look like there was another operand, but it's + // still the part of AsmJit's `arm::Mem` operand so it's consistent with + // other architectures. + if (m.isPostIndex()) + ASMJIT_PROPAGATE(sb.append(']')); + + if (m.hasIndex()) { + ASMJIT_PROPAGATE(sb.append(", ")); + ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, m.indexType(), m.indexId())); + } + + if (m.hasOffset()) { + ASMJIT_PROPAGATE(sb.append(", ")); + + int64_t off = int64_t(m.offset()); + uint32_t base = 10; + + if (Support::test(flags, FormatFlags::kHexOffsets) && uint64_t(off) > 9) + base = 16; + + if (base == 10) { + ASMJIT_PROPAGATE(sb.appendInt(off, base)); + } + else { + ASMJIT_PROPAGATE(sb.append("0x")); + ASMJIT_PROPAGATE(sb.appendUInt(uint64_t(off), base)); + } + } + + if (m.hasShift()) { + ASMJIT_PROPAGATE(sb.append(' ')); + if (!m.isPreOrPost()) + ASMJIT_PROPAGATE(formatShiftOp(sb, m.shiftOp())); + ASMJIT_PROPAGATE(sb.appendFormat(" %u", m.shift())); + } + + if (!m.isPostIndex()) + ASMJIT_PROPAGATE(sb.append(']')); + + if (m.isPreIndex()) + ASMJIT_PROPAGATE(sb.append('!')); + + return kErrorOk; + } + + if (op.isImm()) { + const Imm& i = op.as(); + int64_t val = i.value(); + uint32_t predicate = i.predicate(); + + if (predicate) { + ASMJIT_PROPAGATE(formatShiftOp(sb, ShiftOp(predicate))); + ASMJIT_PROPAGATE(sb.append(' ')); + } + + if (Support::test(flags, FormatFlags::kHexImms) && uint64_t(val) > 9) { + ASMJIT_PROPAGATE(sb.append("0x")); + return sb.appendUInt(uint64_t(val), 16); + } + else { + return sb.appendInt(val, 10); + } + } + + if (op.isLabel()) { + return Formatter::formatLabel(sb, flags, emitter, op.id()); + } + + if (op.isRegList()) { + const BaseRegList& regList = op.as(); + return formatRegisterList(sb, flags, emitter, arch, regList.type(), regList.list()); + } + + return sb.append(""); +} + ASMJIT_END_SUB_NAMESPACE #endif // !ASMJIT_NO_LOGGING diff --git a/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h b/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h index 582173054a800..20b4812e913c2 100644 --- a/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h +++ b/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h @@ -33,6 +33,31 @@ Error ASMJIT_CDECL formatShiftOp( String& sb, ShiftOp shiftOp) noexcept; +Error ASMJIT_CDECL formatRegister( + String& sb, + FormatFlags flags, + const BaseEmitter* emitter, + Arch arch, + RegType regType, + uint32_t rId, + uint32_t elementType = 0, + uint32_t elementIndex = 0xFFFFFFFF) noexcept; + +Error ASMJIT_CDECL formatRegisterList( + String& sb, + FormatFlags flags, + const BaseEmitter* emitter, + Arch arch, + RegType regType, + uint32_t rMask) noexcept; + +Error ASMJIT_CDECL formatOperand( + String& sb, + FormatFlags flags, + const BaseEmitter* emitter, + Arch arch, + const Operand_& op) noexcept; + } // {FormatterInternal} //! \} diff --git a/3rdparty/asmjit/src/asmjit/arm/armglobals.h b/3rdparty/asmjit/src/asmjit/arm/armglobals.h index 506646f80689a..851f67086014e 100644 --- a/3rdparty/asmjit/src/asmjit/arm/armglobals.h +++ b/3rdparty/asmjit/src/asmjit/arm/armglobals.h @@ -14,8 +14,4 @@ //! //! API shared between AArch32 & AArch64 backends. -ASMJIT_BEGIN_SUB_NAMESPACE(arm) - -ASMJIT_END_SUB_NAMESPACE - #endif // ASMJIT_ARM_ARMGLOBALS_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/arm/armoperand.h b/3rdparty/asmjit/src/asmjit/arm/armoperand.h index ede829d9c18e6..583a3d8c326a7 100644 --- a/3rdparty/asmjit/src/asmjit/arm/armoperand.h +++ b/3rdparty/asmjit/src/asmjit/arm/armoperand.h @@ -19,18 +19,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(arm) class Reg; class Mem; -class Gp; -class GpW; -class GpX; - -class Vec; -class VecB; -class VecH; -class VecS; -class VecD; -class VecV; - -//! Register traits (ARM/AArch64). +//! Register traits (AArch32/AArch64). //! //! Register traits contains information about a particular register type. It's used by asmjit to setup register //! information on-the-fly and to populate tables that contain register information (this way it's possible to @@ -39,128 +28,106 @@ template struct RegTraits : public BaseRegTraits {}; //! \cond -// <--------------------+-----+-------------------------+------------------------+---+---+------------------+ -// | Reg | Reg-Type | Reg-Group |Sz |Cnt| TypeId | -// <--------------------+-----+-------------------------+------------------------+---+---+------------------+ -ASMJIT_DEFINE_REG_TRAITS(GpW , RegType::kARM_GpW , RegGroup::kGp , 4 , 32, TypeId::kInt32 ); -ASMJIT_DEFINE_REG_TRAITS(GpX , RegType::kARM_GpX , RegGroup::kGp , 8 , 32, TypeId::kInt64 ); -ASMJIT_DEFINE_REG_TRAITS(VecB , RegType::kARM_VecB , RegGroup::kVec , 1 , 32, TypeId::kVoid ); -ASMJIT_DEFINE_REG_TRAITS(VecH , RegType::kARM_VecH , RegGroup::kVec , 2 , 32, TypeId::kVoid ); -ASMJIT_DEFINE_REG_TRAITS(VecS , RegType::kARM_VecS , RegGroup::kVec , 4 , 32, TypeId::kInt32x1 ); -ASMJIT_DEFINE_REG_TRAITS(VecD , RegType::kARM_VecD , RegGroup::kVec , 8 , 32, TypeId::kInt32x2 ); -ASMJIT_DEFINE_REG_TRAITS(VecV , RegType::kARM_VecV , RegGroup::kVec , 16, 32, TypeId::kInt32x4 ); +// <--------------------+------------------------+------------------------+---+------------------+ +// | Reg-Type | Reg-Group |Sz | TypeId | +// <--------------------+------------------------+------------------------+---+------------------+ +ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_GpW , RegGroup::kGp , 4 , TypeId::kInt32 ); // AArch32 & AArch64 +ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_GpX , RegGroup::kGp , 8 , TypeId::kInt64 ); // AArch64 +ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecB , RegGroup::kVec , 1 , TypeId::kVoid ); // AArch64 +ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecH , RegGroup::kVec , 2 , TypeId::kVoid ); // AArch64 +ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecS , RegGroup::kVec , 4 , TypeId::kInt32x1 ); // AArch32 & AArch64 +ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecD , RegGroup::kVec , 8 , TypeId::kInt32x2 ); // AArch32 & AArch64 +ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecQ , RegGroup::kVec , 16, TypeId::kInt32x4 ); // AArch32 & AArch64 +ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_PC , RegGroup::kPC , 8 , TypeId::kInt64 ); // AArch64 //! \endcond -//! Register (ARM). +//! Register operand that can represent AArch32 and AArch64 registers. class Reg : public BaseReg { public: ASMJIT_DEFINE_ABSTRACT_REG(Reg, BaseReg) - //! Gets whether the register is a `R|W` register (32-bit). - inline constexpr bool isGpW() const noexcept { return baseSignature() == RegTraits::kSignature; } + //! Gets whether the register is either `R` or `W` register (32-bit). + ASMJIT_INLINE_NODEBUG constexpr bool isGpR() const noexcept { return baseSignature() == RegTraits::kSignature; } + //! Gets whether the register is either `R` or `W` register (32-bit). + ASMJIT_INLINE_NODEBUG constexpr bool isGpW() const noexcept { return baseSignature() == RegTraits::kSignature; } //! Gets whether the register is an `X` register (64-bit). - inline constexpr bool isGpX() const noexcept { return baseSignature() == RegTraits::kSignature; } + ASMJIT_INLINE_NODEBUG constexpr bool isGpX() const noexcept { return baseSignature() == RegTraits::kSignature; } + //! Gets whether the register is a VEC-B register (8-bit). - inline constexpr bool isVecB() const noexcept { return baseSignature() == RegTraits::kSignature; } + ASMJIT_INLINE_NODEBUG constexpr bool isVecB() const noexcept { return baseSignature() == RegTraits::kSignature; } //! Gets whether the register is a VEC-H register (16-bit). - inline constexpr bool isVecH() const noexcept { return baseSignature() == RegTraits::kSignature; } + ASMJIT_INLINE_NODEBUG constexpr bool isVecH() const noexcept { return baseSignature() == RegTraits::kSignature; } //! Gets whether the register is a VEC-S register (32-bit). - inline constexpr bool isVecS() const noexcept { return baseSignature() == RegTraits::kSignature; } + ASMJIT_INLINE_NODEBUG constexpr bool isVecS() const noexcept { return baseSignature() == RegTraits::kSignature; } //! Gets whether the register is a VEC-D register (64-bit). - inline constexpr bool isVecD() const noexcept { return baseSignature() == RegTraits::kSignature; } + ASMJIT_INLINE_NODEBUG constexpr bool isVecD() const noexcept { return baseSignature() == RegTraits::kSignature; } //! Gets whether the register is a VEC-Q register (128-bit). - inline constexpr bool isVecQ() const noexcept { return baseSignature() == RegTraits::kSignature; } - + ASMJIT_INLINE_NODEBUG constexpr bool isVecQ() const noexcept { return baseSignature() == RegTraits::kSignature; } //! Gets whether the register is either VEC-D (64-bit) or VEC-Q (128-bit). - inline constexpr bool isVecDOrQ() const noexcept { return uint32_t(type()) - uint32_t(RegType::kARM_VecD) <= 1u; } - + ASMJIT_INLINE_NODEBUG constexpr bool isVecDOrQ() const noexcept { return uint32_t(type()) - uint32_t(RegType::kARM_VecD) <= 1u; } //! Gets whether the register is a VEC-V register (128-bit). - inline constexpr bool isVecV() const noexcept { return baseSignature() == RegTraits::kSignature; } + ASMJIT_INLINE_NODEBUG constexpr bool isVecV() const noexcept { return baseSignature() == RegTraits::kSignature; } + + //! Gets whether the register is an 8-bit vector register or view, alias if \ref isVecB(). + ASMJIT_INLINE_NODEBUG constexpr bool isVec8() const noexcept { return baseSignature() == RegTraits::kSignature; } + //! Gets whether the register is a 16-bit vector register or view, alias if \ref isVecH(). + ASMJIT_INLINE_NODEBUG constexpr bool isVec16() const noexcept { return baseSignature() == RegTraits::kSignature; } + //! Gets whether the register is a 32-bit vector register or view, alias if \ref isVecS(). + ASMJIT_INLINE_NODEBUG constexpr bool isVec32() const noexcept { return baseSignature() == RegTraits::kSignature; } + //! Gets whether the register is a 64-bit vector register or view, alias if \ref isVecD(). + ASMJIT_INLINE_NODEBUG constexpr bool isVec64() const noexcept { return baseSignature() == RegTraits::kSignature; } + //! Gets whether the register is a 128-bit vector register or view, alias if \ref isVecQ(). + ASMJIT_INLINE_NODEBUG constexpr bool isVec128() const noexcept { return baseSignature() == RegTraits::kSignature; } template - inline void setRegT(uint32_t id) noexcept { + ASMJIT_INLINE_NODEBUG void setRegT(uint32_t id) noexcept { setSignature(RegTraits::kSignature); setId(id); } - inline void setTypeAndId(RegType type, uint32_t id) noexcept { + ASMJIT_INLINE_NODEBUG void setTypeAndId(RegType type, uint32_t id) noexcept { setSignature(signatureOf(type)); setId(id); } - static inline RegGroup groupOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToGroup(type); } - static inline TypeId typeIdOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToTypeId(type); } - static inline OperandSignature signatureOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToSignature(type); } + static ASMJIT_INLINE_NODEBUG RegGroup groupOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToGroup(type); } + static ASMJIT_INLINE_NODEBUG TypeId typeIdOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToTypeId(type); } + static ASMJIT_INLINE_NODEBUG OperandSignature signatureOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToSignature(type); } template - static inline RegGroup groupOfT() noexcept { return RegTraits::kGroup; } + static ASMJIT_INLINE_NODEBUG RegGroup groupOfT() noexcept { return RegTraits::kGroup; } template - static inline TypeId typeIdOfT() noexcept { return RegTraits::kTypeId; } + static ASMJIT_INLINE_NODEBUG TypeId typeIdOfT() noexcept { return RegTraits::kTypeId; } template - static inline OperandSignature signatureOfT() noexcept { return RegTraits::kSignature; } - - static inline bool isGpW(const Operand_& op) noexcept { return op.as().isGpW(); } - static inline bool isGpX(const Operand_& op) noexcept { return op.as().isGpX(); } - static inline bool isVecB(const Operand_& op) noexcept { return op.as().isVecB(); } - static inline bool isVecH(const Operand_& op) noexcept { return op.as().isVecH(); } - static inline bool isVecS(const Operand_& op) noexcept { return op.as().isVecS(); } - static inline bool isVecD(const Operand_& op) noexcept { return op.as().isVecD(); } - static inline bool isVecQ(const Operand_& op) noexcept { return op.as().isVecQ(); } - static inline bool isVecV(const Operand_& op) noexcept { return op.as().isVecV(); } - - static inline bool isGpW(const Operand_& op, uint32_t id) noexcept { return isGpW(op) & (op.id() == id); } - static inline bool isGpX(const Operand_& op, uint32_t id) noexcept { return isGpX(op) & (op.id() == id); } - static inline bool isVecB(const Operand_& op, uint32_t id) noexcept { return isVecB(op) & (op.id() == id); } - static inline bool isVecH(const Operand_& op, uint32_t id) noexcept { return isVecH(op) & (op.id() == id); } - static inline bool isVecS(const Operand_& op, uint32_t id) noexcept { return isVecS(op) & (op.id() == id); } - static inline bool isVecD(const Operand_& op, uint32_t id) noexcept { return isVecD(op) & (op.id() == id); } - static inline bool isVecQ(const Operand_& op, uint32_t id) noexcept { return isVecQ(op) & (op.id() == id); } - static inline bool isVecV(const Operand_& op, uint32_t id) noexcept { return isVecV(op) & (op.id() == id); } -}; - -//! General purpose register (ARM). -class Gp : public Reg { -public: - ASMJIT_DEFINE_ABSTRACT_REG(Gp, Reg) - - //! Special register id. - enum Id : uint32_t { - //! Register that depends on OS, could be used as TLS offset. - kIdOs = 18, - //! Frame pointer. - kIdFp = 29, - //! Link register. - kIdLr = 30, - //! Stack register id. - kIdSp = 31, - //! Zero register id. - //! - //! Although zero register has the same id as stack register it has a special treatment, because we need to be - //! able to distinguish between these two at API level. Some intructions were designed to be used with SP and - //! some other with ZR - so we need a way to distinguish these two to make sure we emit the right thing. - //! - //! The number 63 is not random, when you perform `id & 31` you would always get 31 for both SP and ZR inputs, - //! which is the identifier used by AArch64 ISA to encode either SP or ZR depending on the instruction. - kIdZr = 63 - }; - - inline constexpr bool isZR() const noexcept { return id() == kIdZr; } - inline constexpr bool isSP() const noexcept { return id() == kIdSp; } - - //! Cast this register to a 32-bit R|W. - inline GpW w() const noexcept; - //! Cast this register to a 64-bit X. - inline GpX x() const noexcept; + static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfT() noexcept { return OperandSignature{RegTraits::kSignature}; } + + static ASMJIT_INLINE_NODEBUG bool isGpW(const Operand_& op) noexcept { return op.as().isGpW(); } + static ASMJIT_INLINE_NODEBUG bool isGpX(const Operand_& op) noexcept { return op.as().isGpX(); } + static ASMJIT_INLINE_NODEBUG bool isVecB(const Operand_& op) noexcept { return op.as().isVecB(); } + static ASMJIT_INLINE_NODEBUG bool isVecH(const Operand_& op) noexcept { return op.as().isVecH(); } + static ASMJIT_INLINE_NODEBUG bool isVecS(const Operand_& op) noexcept { return op.as().isVecS(); } + static ASMJIT_INLINE_NODEBUG bool isVecD(const Operand_& op) noexcept { return op.as().isVecD(); } + static ASMJIT_INLINE_NODEBUG bool isVecQ(const Operand_& op) noexcept { return op.as().isVecQ(); } + static ASMJIT_INLINE_NODEBUG bool isVecV(const Operand_& op) noexcept { return op.as().isVecV(); } + + static ASMJIT_INLINE_NODEBUG bool isGpW(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isGpW(op)) & unsigned(op.id() == id)); } + static ASMJIT_INLINE_NODEBUG bool isGpX(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isGpX(op)) & unsigned(op.id() == id)); } + static ASMJIT_INLINE_NODEBUG bool isVecB(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecB(op)) & unsigned(op.id() == id)); } + static ASMJIT_INLINE_NODEBUG bool isVecH(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecH(op)) & unsigned(op.id() == id)); } + static ASMJIT_INLINE_NODEBUG bool isVecS(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecS(op)) & unsigned(op.id() == id)); } + static ASMJIT_INLINE_NODEBUG bool isVecD(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecD(op)) & unsigned(op.id() == id)); } + static ASMJIT_INLINE_NODEBUG bool isVecQ(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecQ(op)) & unsigned(op.id() == id)); } + static ASMJIT_INLINE_NODEBUG bool isVecV(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecV(op)) & unsigned(op.id() == id)); } }; -//! Vector register (ARM). -class Vec : public Reg { +//! Vector register base - a common base for both AArch32 & AArch64 vector register. +class BaseVec : public Reg { public: - ASMJIT_DEFINE_ABSTRACT_REG(Vec, Reg) + ASMJIT_DEFINE_ABSTRACT_REG(BaseVec, Reg) - //! Additional signature bits used by arm::Vec. + //! Additional signature bits used by a vector register. enum AdditionalBits : uint32_t { // Register element type (3 bits). // |........|........|.XXX....|........| @@ -178,202 +145,21 @@ class Vec : public Reg { kSignatureRegElementIndexMask = 0x0F << kSignatureRegElementIndexShift }; - //! Element type. - enum ElementType : uint32_t { - //! No element type specified. - kElementTypeNone = 0, - //! Byte elements (B8 or B16). - kElementTypeB, - //! Halfword elements (H4 or H8). - kElementTypeH, - //! Singleword elements (S2 or S4). - kElementTypeS, - //! Doubleword elements (D2). - kElementTypeD, - //! Byte elements grouped by 4 bytes (B4). - //! - //! \note This element-type is only used by few instructions. - kElementTypeB4, - //! Halfword elements grouped by 2 halfwords (H2). - //! - //! \note This element-type is only used by few instructions. - kElementTypeH2, - - //! Count of element types. - kElementTypeCount - }; - - //! \cond - //! Shortcuts. - enum SignatureReg : uint32_t { - kSignatureElementB = kElementTypeB << kSignatureRegElementTypeShift, - kSignatureElementH = kElementTypeH << kSignatureRegElementTypeShift, - kSignatureElementS = kElementTypeS << kSignatureRegElementTypeShift, - kSignatureElementD = kElementTypeD << kSignatureRegElementTypeShift, - kSignatureElementB4 = kElementTypeB4 << kSignatureRegElementTypeShift, - kSignatureElementH2 = kElementTypeH2 << kSignatureRegElementTypeShift - }; - //! \endcond - - //! Returns whether the register has associated an element type. - inline constexpr bool hasElementType() const noexcept { return _signature.hasField(); } //! Returns whether the register has element index (it's an element index access). - inline constexpr bool hasElementIndex() const noexcept { return _signature.hasField(); } - //! Returns whether the reggister has element type or element index (or both). - inline constexpr bool hasElementTypeOrIndex() const noexcept { return _signature.hasField(); } - - //! Returns element type of the register. - inline constexpr uint32_t elementType() const noexcept { return _signature.getField(); } - //! Sets element type of the register to `elementType`. - inline void setElementType(uint32_t elementType) noexcept { _signature.setField(elementType); } - //! Resets element type to none. - inline void resetElementType() noexcept { _signature.setField(0); } - + ASMJIT_INLINE_NODEBUG constexpr bool hasElementIndex() const noexcept { return _signature.hasField(); } //! Returns element index of the register. - inline constexpr uint32_t elementIndex() const noexcept { return _signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t elementIndex() const noexcept { return _signature.getField(); } //! Sets element index of the register to `elementType`. - inline void setElementIndex(uint32_t elementIndex) noexcept { + ASMJIT_INLINE_NODEBUG void setElementIndex(uint32_t elementIndex) noexcept { _signature |= kSignatureRegElementFlagMask; _signature.setField(elementIndex); } //! Resets element index of the register. - inline void resetElementIndex() noexcept { + ASMJIT_INLINE_NODEBUG void resetElementIndex() noexcept { _signature &= ~(kSignatureRegElementFlagMask | kSignatureRegElementIndexMask); } - - inline constexpr bool isVecB8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementB); } - inline constexpr bool isVecH4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementH); } - inline constexpr bool isVecS2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementS); } - inline constexpr bool isVecD1() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature); } - - inline constexpr bool isVecB16() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementB); } - inline constexpr bool isVecH8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementH); } - inline constexpr bool isVecS4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementS); } - inline constexpr bool isVecD2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementD); } - inline constexpr bool isVecB4x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementB4); } - inline constexpr bool isVecH2x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits::kSignature | kSignatureElementH2); } - - //! Creates a cloned register with element access. - inline Vec at(uint32_t elementIndex) const noexcept { - return Vec((signature() & ~kSignatureRegElementIndexMask) | (elementIndex << kSignatureRegElementIndexShift) | kSignatureRegElementFlagMask, id()); - } - - //! Cast this register to an 8-bit B register (scalar). - inline VecB b() const noexcept; - //! Cast this register to a 16-bit H register (scalar). - inline VecH h() const noexcept; - //! Cast this register to a 32-bit S register (scalar). - inline VecS s() const noexcept; - //! Cast this register to a 64-bit D register (scalar). - inline VecD d() const noexcept; - //! Cast this register to a 128-bit Q register (scalar). - inline VecV q() const noexcept; - //! Cast this register to a 128-bit V register. - inline VecV v() const noexcept; - - //! Cast this register to a 128-bit V.B[elementIndex] register. - inline VecV b(uint32_t elementIndex) const noexcept; - //! Cast this register to a 128-bit V.H[elementIndex] register. - inline VecV h(uint32_t elementIndex) const noexcept; - //! Cast this register to a 128-bit V.S[elementIndex] register. - inline VecV s(uint32_t elementIndex) const noexcept; - //! Cast this register to a 128-bit V.D[elementIndex] register. - inline VecV d(uint32_t elementIndex) const noexcept; - //! Cast this register to a 128-bit V.H2[elementIndex] register. - inline VecV h2(uint32_t elementIndex) const noexcept; - //! Cast this register to a 128-bit V.B4[elementIndex] register. - inline VecV b4(uint32_t elementIndex) const noexcept; - - //! Cast this register to V.8B. - inline VecD b8() const noexcept; - //! Cast this register to V.16B. - inline VecV b16() const noexcept; - //! Cast this register to V.2H. - inline VecS h2() const noexcept; - //! Cast this register to V.4H. - inline VecD h4() const noexcept; - //! Cast this register to V.8H. - inline VecV h8() const noexcept; - //! Cast this register to V.2S. - inline VecD s2() const noexcept; - //! Cast this register to V.4S. - inline VecV s4() const noexcept; - //! Cast this register to V.2D. - inline VecV d2() const noexcept; - - static inline constexpr OperandSignature _makeElementAccessSignature(uint32_t elementType, uint32_t elementIndex) noexcept { - return OperandSignature{ - uint32_t(RegTraits::kSignature) | - uint32_t(kSignatureRegElementFlagMask) | - uint32_t(elementType << kSignatureRegElementTypeShift) | - uint32_t(elementIndex << kSignatureRegElementIndexShift)}; - } }; -//! 32-bit GPW (AArch64) and/or GPR (ARM/AArch32) register. -class GpW : public Gp { ASMJIT_DEFINE_FINAL_REG(GpW, Gp, RegTraits) }; -//! 64-bit GPX (AArch64) register. -class GpX : public Gp { ASMJIT_DEFINE_FINAL_REG(GpX, Gp, RegTraits) }; - -//! 8-bit view (S) of VFP/SIMD register. -class VecB : public Vec { ASMJIT_DEFINE_FINAL_REG(VecB, Vec, RegTraits) }; -//! 16-bit view (S) of VFP/SIMD register. -class VecH : public Vec { ASMJIT_DEFINE_FINAL_REG(VecH, Vec, RegTraits) }; -//! 32-bit view (S) of VFP/SIMD register. -class VecS : public Vec { ASMJIT_DEFINE_FINAL_REG(VecS, Vec, RegTraits) }; -//! 64-bit view (D) of VFP/SIMD register. -class VecD : public Vec { ASMJIT_DEFINE_FINAL_REG(VecD, Vec, RegTraits) }; -//! 128-bit vector register (Q or V). -class VecV : public Vec { ASMJIT_DEFINE_FINAL_REG(VecV, Vec, RegTraits) }; - -inline GpW Gp::w() const noexcept { return GpW(id()); } -inline GpX Gp::x() const noexcept { return GpX(id()); } - -inline VecB Vec::b() const noexcept { return VecB(id()); } -inline VecH Vec::h() const noexcept { return VecH(id()); } -inline VecS Vec::s() const noexcept { return VecS(id()); } -inline VecD Vec::d() const noexcept { return VecD(id()); } -inline VecV Vec::q() const noexcept { return VecV(id()); } -inline VecV Vec::v() const noexcept { return VecV(id()); } - -inline VecV Vec::b(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeB, elementIndex), id()); } -inline VecV Vec::h(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeH, elementIndex), id()); } -inline VecV Vec::s(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeS, elementIndex), id()); } -inline VecV Vec::d(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeD, elementIndex), id()); } -inline VecV Vec::h2(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeH2, elementIndex), id()); } -inline VecV Vec::b4(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(kElementTypeB4, elementIndex), id()); } - -inline VecD Vec::b8() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementB}, id()); } -inline VecS Vec::h2() const noexcept { return VecS(OperandSignature{VecS::kSignature | kSignatureElementH}, id()); } -inline VecD Vec::h4() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementH}, id()); } -inline VecD Vec::s2() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementS}, id()); } -inline VecV Vec::b16() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementB}, id()); } -inline VecV Vec::h8() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementH}, id()); } -inline VecV Vec::s4() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementS}, id()); } -inline VecV Vec::d2() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementD}, id()); } - -#ifndef _DOXYGEN -namespace regs { -#endif - -//! Creates a 32-bit W register operand (ARM/AArch64). -static inline constexpr GpW w(uint32_t id) noexcept { return GpW(id); } -//! Creates a 64-bit X register operand (AArch64). -static inline constexpr GpX x(uint32_t id) noexcept { return GpX(id); } -//! Creates a 32-bit S register operand (ARM/AArch64). -static inline constexpr VecS s(uint32_t id) noexcept { return VecS(id); } -//! Creates a 64-bit D register operand (ARM/AArch64). -static inline constexpr VecD d(uint32_t id) noexcept { return VecD(id); } -//! Creates a 1282-bit V register operand (ARM/AArch64). -static inline constexpr VecV v(uint32_t id) noexcept { return VecV(id); } - -#ifndef _DOXYGEN -} // {regs} - -// Make `arm::regs` accessible through `arm` namespace as well. -using namespace regs; -#endif - //! Memory operand (ARM). class Mem : public BaseMem { public: @@ -385,64 +171,59 @@ class Mem : public BaseMem { kSignatureMemShiftValueShift = 14, kSignatureMemShiftValueMask = 0x1Fu << kSignatureMemShiftValueShift, - // Shift operation type (4 bits). + // Index shift operation (4 bits). // |........|XXXX....|........|........| - kSignatureMemPredicateShift = 20, - kSignatureMemPredicateMask = 0x0Fu << kSignatureMemPredicateShift - }; - //! \endcond + kSignatureMemShiftOpShift = 20, + kSignatureMemShiftOpMask = 0x0Fu << kSignatureMemShiftOpShift, - //! Memory offset mode. - //! - //! Additional constants that can be used with the `predicate`. - enum OffsetMode : uint32_t { - //! Pre-index "[BASE, #Offset {, }]!" with write-back. - kOffsetPreIndex = 0xE, - //! Post-index "[BASE], #Offset {, }" with write-back. - kOffsetPostIndex = 0xF + // Offset mode type (2 bits). + // |......XX|........|........|........| + kSignatureMemOffsetModeShift = 24, + kSignatureMemOffsetModeMask = 0x03u << kSignatureMemOffsetModeShift }; + //! \endcond //! \name Construction & Destruction //! \{ //! Construct a default `Mem` operand, that points to [0]. - inline constexpr Mem() noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem() noexcept : BaseMem() {} - inline constexpr Mem(const Mem& other) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const Mem& other) noexcept : BaseMem(other) {} - inline explicit Mem(Globals::NoInit_) noexcept + ASMJIT_INLINE_NODEBUG explicit Mem(Globals::NoInit_) noexcept : BaseMem(Globals::NoInit) {} - inline constexpr Mem(const Signature& signature, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const Signature& signature, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept : BaseMem(signature, baseId, indexId, offset) {} - inline constexpr explicit Mem(const Label& base, int32_t off = 0, Signature signature = Signature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr explicit Mem(const Label& base, int32_t off = 0, Signature signature = Signature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(RegType::kLabelTag) | signature, base.id(), 0, off) {} - inline constexpr explicit Mem(const BaseReg& base, int32_t off = 0, Signature signature = Signature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr explicit Mem(const BaseReg& base, int32_t off = 0, Signature signature = Signature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(base.type()) | signature, base.id(), 0, off) {} - inline constexpr Mem(const BaseReg& base, const BaseReg& index, Signature signature = Signature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const BaseReg& base, const BaseReg& index, Signature signature = Signature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(base.type()) | Signature::fromMemIndexType(index.type()) | signature, base.id(), index.id(), 0) {} - inline constexpr Mem(const BaseReg& base, const BaseReg& index, const Shift& shift, Signature signature = Signature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const BaseReg& base, const BaseReg& index, const Shift& shift, Signature signature = Signature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(base.type()) | Signature::fromMemIndexType(index.type()) | - Signature::fromValue(uint32_t(shift.op())) | + Signature::fromValue(uint32_t(shift.op())) | Signature::fromValue(shift.value()) | signature, base.id(), index.id(), 0) {} - inline constexpr Mem(uint64_t base, Signature signature = Signature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr explicit Mem(uint64_t base, Signature signature = Signature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {} @@ -451,7 +232,7 @@ class Mem : public BaseMem { //! \name Overloaded Operators //! \{ - inline Mem& operator=(const Mem& other) noexcept = default; + ASMJIT_INLINE_NODEBUG Mem& operator=(const Mem& other) noexcept = default; //! \} @@ -459,41 +240,41 @@ class Mem : public BaseMem { //! \{ //! Clones the memory operand. - inline constexpr Mem clone() const noexcept { return Mem(*this); } + ASMJIT_INLINE_NODEBUG constexpr Mem clone() const noexcept { return Mem(*this); } //! Gets new memory operand adjusted by `off`. - inline Mem cloneAdjusted(int64_t off) const noexcept { + ASMJIT_INLINE_NODEBUG Mem cloneAdjusted(int64_t off) const noexcept { Mem result(*this); result.addOffset(off); return result; } //! Clones the memory operand and makes it pre-index. - inline Mem pre() const noexcept { + ASMJIT_INLINE_NODEBUG Mem pre() const noexcept { Mem result(*this); - result.setPredicate(kOffsetPreIndex); + result.setOffsetMode(OffsetMode::kPreIndex); return result; } //! Clones the memory operand, applies a given offset `off` and makes it pre-index. - inline Mem pre(int64_t off) const noexcept { + ASMJIT_INLINE_NODEBUG Mem pre(int64_t off) const noexcept { Mem result(*this); - result.setPredicate(kOffsetPreIndex); + result.setOffsetMode(OffsetMode::kPreIndex); result.addOffset(off); return result; } //! Clones the memory operand and makes it post-index. - inline Mem post() const noexcept { + ASMJIT_INLINE_NODEBUG Mem post() const noexcept { Mem result(*this); - result.setPredicate(kOffsetPreIndex); + result.setOffsetMode(OffsetMode::kPostIndex); return result; } //! Clones the memory operand, applies a given offset `off` and makes it post-index. - inline Mem post(int64_t off) const noexcept { + ASMJIT_INLINE_NODEBUG Mem post(int64_t off) const noexcept { Mem result(*this); - result.setPredicate(kOffsetPostIndex); + result.setOffsetMode(OffsetMode::kPostIndex); result.addOffset(off); return result; } @@ -506,16 +287,21 @@ class Mem : public BaseMem { //! Converts memory `baseType` and `baseId` to `arm::Reg` instance. //! //! The memory must have a valid base register otherwise the result will be wrong. - inline Reg baseReg() const noexcept { return Reg::fromTypeAndId(baseType(), baseId()); } + ASMJIT_INLINE_NODEBUG Reg baseReg() const noexcept { return Reg::fromTypeAndId(baseType(), baseId()); } //! Converts memory `indexType` and `indexId` to `arm::Reg` instance. //! //! The memory must have a valid index register otherwise the result will be wrong. - inline Reg indexReg() const noexcept { return Reg::fromTypeAndId(indexType(), indexId()); } + ASMJIT_INLINE_NODEBUG Reg indexReg() const noexcept { return Reg::fromTypeAndId(indexType(), indexId()); } using BaseMem::setIndex; - inline void setIndex(const BaseReg& index, uint32_t shift) noexcept { + ASMJIT_INLINE_NODEBUG void setIndex(const BaseReg& index, uint32_t shift) noexcept { + setIndex(index); + setShift(shift); + } + + ASMJIT_INLINE_NODEBUG void setIndex(const BaseReg& index, Shift shift) noexcept { setIndex(index); setShift(shift); } @@ -525,97 +311,86 @@ class Mem : public BaseMem { //! \name ARM Specific Features //! \{ + //! Gets offset mode. + ASMJIT_INLINE_NODEBUG constexpr OffsetMode offsetMode() const noexcept { return OffsetMode(_signature.getField()); } + //! Sets offset mode to `mode`. + ASMJIT_INLINE_NODEBUG void setOffsetMode(OffsetMode mode) noexcept { _signature.setField(uint32_t(mode)); } + //! Resets offset mode to default (fixed offset, without write-back). + ASMJIT_INLINE_NODEBUG void resetOffsetMode() noexcept { _signature.setField(uint32_t(OffsetMode::kFixed)); } + + //! Tests whether the current memory offset mode is fixed (see \ref OffsetMode::kFixed). + ASMJIT_INLINE_NODEBUG constexpr bool isFixedOffset() const noexcept { return offsetMode() == OffsetMode::kFixed; } + //! Tests whether the current memory offset mode is either pre-index or post-index (write-back is used). + ASMJIT_INLINE_NODEBUG constexpr bool isPreOrPost() const noexcept { return offsetMode() != OffsetMode::kFixed; } + //! Tests whether the current memory offset mode is pre-index (write-back is used). + ASMJIT_INLINE_NODEBUG constexpr bool isPreIndex() const noexcept { return offsetMode() == OffsetMode::kPreIndex; } + //! Tests whether the current memory offset mode is post-index (write-back is used). + ASMJIT_INLINE_NODEBUG constexpr bool isPostIndex() const noexcept { return offsetMode() == OffsetMode::kPostIndex; } + + //! Sets offset mode of this memory operand to pre-index (write-back is used). + ASMJIT_INLINE_NODEBUG void makePreIndex() noexcept { setOffsetMode(OffsetMode::kPreIndex); } + //! Sets offset mode of this memory operand to post-index (write-back is used). + ASMJIT_INLINE_NODEBUG void makePostIndex() noexcept { setOffsetMode(OffsetMode::kPostIndex); } + + //! Gets shift operation that is used by index register. + ASMJIT_INLINE_NODEBUG constexpr ShiftOp shiftOp() const noexcept { return ShiftOp(_signature.getField()); } + //! Sets shift operation that is used by index register. + ASMJIT_INLINE_NODEBUG void setShiftOp(ShiftOp sop) noexcept { _signature.setField(uint32_t(sop)); } + //! Resets shift operation that is used by index register to LSL (default value). + ASMJIT_INLINE_NODEBUG void resetShiftOp() noexcept { _signature.setField(uint32_t(ShiftOp::kLSL)); } + //! Gets whether the memory operand has shift (aka scale) constant. - inline constexpr bool hasShift() const noexcept { return _signature.hasField(); } + ASMJIT_INLINE_NODEBUG constexpr bool hasShift() const noexcept { return _signature.hasField(); } //! Gets the memory operand's shift (aka scale) constant. - inline constexpr uint32_t shift() const noexcept { return _signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t shift() const noexcept { return _signature.getField(); } //! Sets the memory operand's shift (aka scale) constant. - inline void setShift(uint32_t shift) noexcept { _signature.setField(shift); } - //! Resets the memory operand's shift (aka scale) constant to zero. - inline void resetShift() noexcept { _signature.setField(0); } - - //! Gets memory predicate (shift mode or offset mode), see \ref ShiftOp and \ref OffsetMode. - inline constexpr uint32_t predicate() const noexcept { return _signature.getField(); } - //! Sets memory predicate to `predicate`, see `Mem::ShiftOp`. - inline void setPredicate(uint32_t predicate) noexcept { _signature.setField(predicate); } - //! Resets shift mode to LSL (default). - inline void resetPredicate() noexcept { _signature.setField(0); } + ASMJIT_INLINE_NODEBUG void setShift(uint32_t shift) noexcept { _signature.setField(shift); } - inline constexpr bool isFixedOffset() const noexcept { return predicate() < kOffsetPreIndex; } - inline constexpr bool isPreOrPost() const noexcept { return predicate() >= kOffsetPreIndex; } - inline constexpr bool isPreIndex() const noexcept { return predicate() == kOffsetPreIndex; } - inline constexpr bool isPostIndex() const noexcept { return predicate() == kOffsetPostIndex; } + //! Sets the memory operand's shift and shift operation. + ASMJIT_INLINE_NODEBUG void setShift(Shift shift) noexcept { + _signature.setField(uint32_t(shift.op())); + _signature.setField(shift.value()); + } - inline void resetToFixedOffset() noexcept { resetPredicate(); } - inline void makePreIndex() noexcept { setPredicate(kOffsetPreIndex); } - inline void makePostIndex() noexcept { setPredicate(kOffsetPostIndex); } + //! Resets the memory operand's shift (aka scale) constant to zero. + ASMJIT_INLINE_NODEBUG void resetShift() noexcept { _signature.setField(0); } //! \} }; -//! Creates `[base.reg, offset]` memory operand (offset mode). -static inline constexpr Mem ptr(const Gp& base, int32_t offset = 0) noexcept { - return Mem(base, offset); -} - -//! Creates `[base.reg, offset]!` memory operand (pre-index mode). -static inline constexpr Mem ptr_pre(const Gp& base, int32_t offset = 0) noexcept { - return Mem(base, offset, OperandSignature::fromValue(Mem::kOffsetPreIndex)); -} - -//! Creates `[base.reg], offset` memory operand (post-index mode). -static inline constexpr Mem ptr_post(const Gp& base, int32_t offset = 0) noexcept { - return Mem(base, offset, OperandSignature::fromValue(Mem::kOffsetPostIndex)); -} - -//! Creates `[base.reg, index]` memory operand. -static inline constexpr Mem ptr(const Gp& base, const Gp& index) noexcept { - return Mem(base, index); -} - -//! Creates `[base.reg], index` memory operand (post-index mode). -static inline constexpr Mem ptr_post(const Gp& base, const Gp& index) noexcept { - return Mem(base, index, OperandSignature::fromValue(Mem::kOffsetPostIndex)); -} - -//! Creates `[base.reg, index, SHIFT_OP #shift]` memory operand. -static inline constexpr Mem ptr(const Gp& base, const Gp& index, const Shift& shift) noexcept { - return Mem(base, index, shift); -} - -//! Creates `[base + offset]` memory operand. -static inline constexpr Mem ptr(const Label& base, int32_t offset = 0) noexcept { - return Mem(base, offset); -} - -// TODO: [ARM] PC + offset address. -#if 0 -//! Creates `[PC + offset]` (relative) memory operand. -static inline constexpr Mem ptr(const PC& pc, int32_t offset = 0) noexcept { - return Mem(pc, offset); -} -#endif - -//! Creates `[base]` absolute memory operand. +//! \name Shift Operation Construction +//! \{ + +//! Constructs a `LSL #value` shift (logical shift left). +static ASMJIT_INLINE_NODEBUG constexpr Shift lsl(uint32_t value) noexcept { return Shift(ShiftOp::kLSL, value); } +//! Constructs a `LSR #value` shift (logical shift right). +static ASMJIT_INLINE_NODEBUG constexpr Shift lsr(uint32_t value) noexcept { return Shift(ShiftOp::kLSR, value); } +//! Constructs a `ASR #value` shift (arithmetic shift right). +static ASMJIT_INLINE_NODEBUG constexpr Shift asr(uint32_t value) noexcept { return Shift(ShiftOp::kASR, value); } +//! Constructs a `ROR #value` shift (rotate right). +static ASMJIT_INLINE_NODEBUG constexpr Shift ror(uint32_t value) noexcept { return Shift(ShiftOp::kROR, value); } +//! Constructs a `RRX` shift (rotate with carry by 1). +static ASMJIT_INLINE_NODEBUG constexpr Shift rrx() noexcept { return Shift(ShiftOp::kRRX, 0); } +//! Constructs a `MSL #value` shift (logical shift left filling ones). +static ASMJIT_INLINE_NODEBUG constexpr Shift msl(uint32_t value) noexcept { return Shift(ShiftOp::kMSL, value); } + +//! \} + +//! \name Memory Operand Construction +//! \{ + +//! Creates `[base]` absolute memory operand (AArch32 or AArch64). //! //! \note The concept of absolute memory operands doesn't exist on ARM, the ISA only provides PC relative addressing. //! Absolute memory operands can only be used if it's known that the PC relative offset is encodable and that it -//! would be within the limits. Absolute address is also often output from disassemblers, so AsmJit support it so it -//! can assemble it back. -static inline constexpr Mem ptr(uint64_t base) noexcept { return Mem(base); } +//! would be within the limits. Absolute address is also often output from disassemblers, so AsmJit supports it to +//! make it possible to assemble such output back. +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(uint64_t base) noexcept { return Mem(base); } //! \} -ASMJIT_END_SUB_NAMESPACE +//! \} -//! \cond INTERNAL -ASMJIT_BEGIN_NAMESPACE -ASMJIT_DEFINE_TYPE_ID(arm::GpW, TypeId::kInt32); -ASMJIT_DEFINE_TYPE_ID(arm::GpX, TypeId::kInt64); -ASMJIT_DEFINE_TYPE_ID(arm::VecS, TypeId::kFloat32x1); -ASMJIT_DEFINE_TYPE_ID(arm::VecD, TypeId::kFloat64x1); -ASMJIT_DEFINE_TYPE_ID(arm::VecV, TypeId::kInt32x4); -ASMJIT_END_NAMESPACE -//! \endcond +ASMJIT_END_SUB_NAMESPACE #endif // ASMJIT_ARM_ARMOPERAND_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/arm/a64utils.h b/3rdparty/asmjit/src/asmjit/arm/armutils.h similarity index 62% rename from 3rdparty/asmjit/src/asmjit/arm/a64utils.h rename to 3rdparty/asmjit/src/asmjit/arm/armutils.h index 4a88ca5172442..8241eda052eb5 100644 --- a/3rdparty/asmjit/src/asmjit/arm/a64utils.h +++ b/3rdparty/asmjit/src/asmjit/arm/armutils.h @@ -3,20 +3,53 @@ // See asmjit.h or LICENSE.md for license and copyright information // SPDX-License-Identifier: Zlib -#ifndef ASMJIT_ARM_A64UTILS_H_INCLUDED -#define ASMJIT_ARM_A64UTILS_H_INCLUDED +#ifndef ASMJIT_ARM_ARMUTILS_H_INCLUDED +#define ASMJIT_ARM_ARMUTILS_H_INCLUDED -#include "../arm/a64globals.h" +#include "../core/support.h" +#include "../arm/armglobals.h" -ASMJIT_BEGIN_SUB_NAMESPACE(a64) +ASMJIT_BEGIN_SUB_NAMESPACE(arm) -//! \addtogroup asmjit_a64 +//! \addtogroup asmjit_arm //! \{ -//! Public utilities and helpers for targeting AArch64 architecture. +//! Public utilities and helpers for targeting AArch32 and AArch64 architectures. namespace Utils { -//! Decomposed fields of a logical immediate value (AArch64). +//! Encodes a 12-bit immediate part of opcode that ise used by a standard 32-bit ARM encoding. +ASMJIT_MAYBE_UNUSED +static inline bool encodeAArch32Imm(uint64_t imm, uint32_t* encodedImmOut) noexcept { + if (imm & 0xFFFFFFFF00000000u) + return false; + + uint32_t v = uint32_t(imm); + uint32_t r = 0; + + if (v <= 0xFFu) { + *encodedImmOut = v; + return true; + } + + // Rotate if there are bits on both ends (LSB and MSB) + // (otherwise we would not be able to calculate the rotation with ctz). + if (v & 0xFF0000FFu) { + v = Support::ror(v, 16); + r = 16u; + } + + uint32_t n = Support::ctz(v) & ~0x1u; + r = (r - n) & 0x1Eu; + v = Support::ror(v, n); + + if (v > 0xFFu) + return false; + + *encodedImmOut = v | (r << 7); + return true; +} + +//! Decomposed fields of a logical immediate value. struct LogicalImm { uint32_t n; uint32_t s; @@ -41,7 +74,7 @@ struct LogicalImm { //! +---+--------+--------+------+ //! ``` ASMJIT_MAYBE_UNUSED -static bool encodeLogicalImm(uint64_t imm, uint32_t width, a64::Utils::LogicalImm* out) noexcept { +static bool encodeLogicalImm(uint64_t imm, uint32_t width, LogicalImm* out) noexcept { // Determine the element width, which must be 2, 4, 8, 16, 32, or 64 bits. do { width /= 2; @@ -89,24 +122,38 @@ static bool encodeLogicalImm(uint64_t imm, uint32_t width, a64::Utils::LogicalIm //! width of the operation, and must be either 32 or 64. This function can be used to test whether an immediate //! value can be used with AND, ANDS, BIC, BICS, EON, EOR, ORN, and ORR instruction. ASMJIT_MAYBE_UNUSED -static inline bool isLogicalImm(uint64_t imm, uint32_t width) noexcept { +static ASMJIT_INLINE_NODEBUG bool isLogicalImm(uint64_t imm, uint32_t width) noexcept { LogicalImm dummy; return encodeLogicalImm(imm, width, &dummy); } +//! Returns true if the given `imm` value is encodable as an immediate with `add` and `sub` instructions on AArch64. +//! These two instructions can encode 12-bit immediate value optionally shifted left by 12 bits. +ASMJIT_MAYBE_UNUSED +static ASMJIT_INLINE_NODEBUG bool isAddSubImm(uint64_t imm) noexcept { + return imm <= 0xFFFu || (imm & ~uint64_t(0xFFFu << 12)) == 0; +} + //! Returns true if the given `imm` value is a byte mask. Byte mask has each byte part of the value set to either //! 0x00 or 0xFF. Some ARM instructions accept immediates that form a byte-mask and this function can be used to //! verify that the immediate is encodable before using the value. template -static inline bool isByteMaskImm8(const T& imm) noexcept { +static ASMJIT_INLINE_NODEBUG bool isByteMaskImm8(const T& imm) noexcept { constexpr T kMask = T(0x0101010101010101 & Support::allOnes()); return imm == (imm & kMask) * T(255); } +// [.......A|B.......|.......C|D.......|.......E|F.......|.......G|H.......] +static ASMJIT_INLINE_NODEBUG uint32_t encodeImm64ByteMaskToImm8(uint64_t imm) noexcept { + return uint32_t(((imm >> (7 - 0)) & 0b00000011) | // [.......G|H.......] + ((imm >> (23 - 2)) & 0b00001100) | // [.......E|F.......] + ((imm >> (39 - 4)) & 0b00110000) | // [.......C|D.......] + ((imm >> (55 - 6)) & 0b11000000)); // [.......A|B.......] +} //! \cond //! A generic implementation that checjs whether a floating point value can be converted to ARM Imm8. template -static inline bool isFPImm8Generic(T val) noexcept { +static ASMJIT_FORCE_INLINE bool isFPImm8Generic(T val) noexcept { constexpr uint32_t kAllBsMask = Support::lsbMask(kNumBBits); constexpr uint32_t kB0Pattern = Support::bitMask(kNumBBits - 1); constexpr uint32_t kB1Pattern = kAllBsMask ^ kB0Pattern; @@ -127,7 +174,7 @@ static inline bool isFPImm8Generic(T val) noexcept { //! ``` //! [aBbbcdef|gh000000] //! ``` -static inline bool isFP16Imm8(uint32_t val) noexcept { return isFPImm8Generic(val); } +static ASMJIT_INLINE_NODEBUG bool isFP16Imm8(uint32_t val) noexcept { return isFPImm8Generic(val); } //! Returns true if the given single precision floating point `val` can be encoded as ARM IMM8 value, which represents //! a limited set of floating point immediate values, which can be used with FMOV instruction. @@ -137,9 +184,9 @@ static inline bool isFP16Imm8(uint32_t val) noexcept { return isFPImm8Generic(val); } +static ASMJIT_INLINE_NODEBUG bool isFP32Imm8(uint32_t val) noexcept { return isFPImm8Generic(val); } //! \overload -static inline bool isFP32Imm8(float val) noexcept { return isFP32Imm8(Support::bitCast(val)); } +static ASMJIT_INLINE_NODEBUG bool isFP32Imm8(float val) noexcept { return isFP32Imm8(Support::bitCast(val)); } //! Returns true if the given double precision floating point `val` can be encoded as ARM IMM8 value, which represents //! a limited set of floating point immediate values, which can be used with FMOV instruction. @@ -149,13 +196,13 @@ static inline bool isFP32Imm8(float val) noexcept { return isFP32Imm8(Support::b //! ``` //! [aBbbbbbb|bbcdefgh|00000000|00000000|00000000|00000000|00000000|00000000] //! ``` -static inline bool isFP64Imm8(uint64_t val) noexcept { return isFPImm8Generic(val); } +static ASMJIT_INLINE_NODEBUG bool isFP64Imm8(uint64_t val) noexcept { return isFPImm8Generic(val); } //! \overload -static inline bool isFP64Imm8(double val) noexcept { return isFP64Imm8(Support::bitCast(val)); } +static ASMJIT_INLINE_NODEBUG bool isFP64Imm8(double val) noexcept { return isFP64Imm8(Support::bitCast(val)); } //! \cond template -static inline uint32_t encodeFPToImm8Generic(T val) noexcept { +static ASMJIT_INLINE_NODEBUG uint32_t encodeFPToImm8Generic(T val) noexcept { uint32_t bits = uint32_t(val >> kNumZeroBits); return ((bits >> (kNumBBits + kNumCDEFGHBits - 7)) & 0x80u) | (bits & 0x7F); } @@ -165,9 +212,9 @@ static inline uint32_t encodeFPToImm8Generic(T val) noexcept { //! //! \note This function expects that `isFP64Imm8(val) == true` so it doesn't perform any checks of the value and just //! rearranges some bits into Imm8 order. -static inline uint32_t encodeFP64ToImm8(uint64_t val) noexcept { return encodeFPToImm8Generic(val); } +static ASMJIT_INLINE_NODEBUG uint32_t encodeFP64ToImm8(uint64_t val) noexcept { return encodeFPToImm8Generic(val); } //! \overload -static inline uint32_t encodeFP64ToImm8(double val) noexcept { return encodeFP64ToImm8(Support::bitCast(val)); } +static ASMJIT_INLINE_NODEBUG uint32_t encodeFP64ToImm8(double val) noexcept { return encodeFP64ToImm8(Support::bitCast(val)); } } // {Utils} @@ -175,5 +222,5 @@ static inline uint32_t encodeFP64ToImm8(double val) noexcept { return encodeFP64 ASMJIT_END_SUB_NAMESPACE -#endif // ASMJIT_ARM_A64UTILS_H_INCLUDED +#endif // ASMJIT_ARM_ARMUTILS_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/asmjit.h b/3rdparty/asmjit/src/asmjit/asmjit.h index 1cd0651ffe151..f5184eb5777d3 100644 --- a/3rdparty/asmjit/src/asmjit/asmjit.h +++ b/3rdparty/asmjit/src/asmjit/asmjit.h @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Zlib // Official GitHub Repository: https://github.com/asmjit/asmjit // -// Copyright (c) 2008-2021 The AsmJit Authors +// Copyright (c) 2008-2024 The AsmJit Authors // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages diff --git a/3rdparty/asmjit/src/asmjit/core.h b/3rdparty/asmjit/src/asmjit/core.h index 4406ed89f3005..66cbce642a381 100644 --- a/3rdparty/asmjit/src/asmjit/core.h +++ b/3rdparty/asmjit/src/asmjit/core.h @@ -105,40 +105,37 @@ namespace asmjit { //! //! - Tested: //! -//! - **Clang** - Tested by GitHub Actions - Clang 3.9+ (with C++11 enabled) is officially supported (older Clang -//! versions having C++11 support are probably fine, but are not regularly tested). +//! - **Clang** - Tested by GitHub Actions - Clang 10+ is officially supported and tested by CI, older Clang versions +//! having C++11 should work, but are not tested anymore due to upgraded CI images. //! -//! - **GNU** - Tested by GitHub Actions - GCC 4.8+ (with C++11 enabled) is officially supported. +//! - **GNU** - Tested by GitHub Actions - GCC 7+ is officially supported, older GCC versions from 4.8+ having C++11 +//! enabled should also work, but are not tested anymore due to upgraded CI images. //! -//! - **MINGW** - Should work, but it's not tested in our CI environment. +//! - **MINGW** - Reported to work, but not tested in our CI environment (help welcome). //! -//! - **MSVC** - Tested by GitHub Actions - VS2017+ is officially supported, VS2015 is reported to work. -//! -//! - Untested: -//! -//! - **Intel** - No maintainers and no CI environment to regularly test this compiler. -//! -//! - **Other** C++ compilers would require basic support in -//! [core/api-config.h](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/api-config.h). +//! - **MSVC** - Tested by GitHub Actions - VS2019+ is officially supported, VS2015 and VS2017 is reported to work, +//! but not tested by CI anymore. //! //! ### Supported Operating Systems and Platforms //! //! - Tested: //! -//! - **Linux** - Tested by GitHub Actions (any distribution is generally supported). +//! - **BSD** - FreeBSD, NetBSD, and OpenBSD tested by GitHub Actions (only recent images are tested by CI). BSD +//! runners only test BSD images with clang compiler. //! -//! - **Mac OS** - Tested by GitHub Actions (any version is supported). +//! - **Linux** - Tested by GitHub Actions (only recent Ubuntu images are tested by CI, in general any distribution +//! should be supported as AsmJit has no dependencies). +//! +//! - **Mac OS** - Tested by GitHub Actions. //! //! - **Windows** - Tested by GitHub Actions - (Windows 7+ is officially supported). //! //! - **Emscripten** - Works if compiled with \ref ASMJIT_NO_JIT. AsmJit cannot generate WASM code, but can be -//! used to generate X86/X64 code within a browser, for example. +//! used to generate X86/X64/AArch64 code within a browser, for example. //! //! - Untested: //! -//! - **BSDs** - No maintainers, no CI environment to regularly test BSDs, but they should work out of box. -//! -//! - **Haiku** - Not regularly tested, but reported to work. +//! - **Haiku** - Reported to work, not tested by CI. //! //! - **Other** operating systems would require some testing and support in the following files: //! - [core/api-config.h](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/api-config.h) @@ -149,7 +146,7 @@ namespace asmjit { //! //! - **X86** and **X86_64** - Both 32-bit and 64-bit backends tested on CI. //! - **AArch64** - AArch64 backend is currently only partially tested (there is no native AArch64 runner to test -//! AsmJit Builder/Compiler) +//! AsmJit Builder/Compiler). //! //! ### Static Builds and Embedding //! @@ -180,40 +177,49 @@ namespace asmjit { //! ### AsmJit Backends //! //! AsmJit currently supports only X86/X64 backend, but the plan is to add more backends in the future. By default -//! AsmJit builds only the host backend, which is autodetected at compile-time, but this can be overridden. +//! AsmJit builds only the host backend, which is auto-detected at compile-time, but this can be overridden. //! -//! - \ref ASMJIT_NO_X86 - Disable X86/X64 backends. -//! - \ref ASMJIT_NO_FOREIGN - Disables the support for foreign architectures. +//! - \ref ASMJIT_NO_X86 - Disables both X86 and X86_64 backends. +//! - \ref ASMJIT_NO_AARCH64 - Disables AArch64 backend. +//! - \ref ASMJIT_NO_FOREIGN - Disables the support for foreign architecture backends, only keeps a native backend. //! -//! ### Features Selection -//! -//! AsmJit builds by defaults all supported features, which includes all emitters, logging, instruction validation and -//! introspection, and JIT memory allocation. Features can be disabled at compile time by using `ASMJIT_NO_...` -//! definitions. +//! ### AsmJit Compilation Options //! //! - \ref ASMJIT_NO_DEPRECATED - Disables deprecated API at compile time so it won't be available and the //! compilation will fail if there is attempt to use such API. This includes deprecated classes, namespaces, //! enumerations, and functions. //! -//! - \ref ASMJIT_NO_BUILDER - Disables \ref asmjit_builder functionality completely. This implies \ref -//! ASMJIT_NO_COMPILER as \ref asmjit_compiler cannot be used without \ref asmjit_builder. +//! - \ref ASMJIT_NO_SHM_OPEN - Disables functionality that uses `shm_open()`. //! -//! - \ref ASMJIT_NO_COMPILER - Disables \ref asmjit_compiler functionality completely. +//! - \ref ASMJIT_NO_ABI_NAMESPACE - Disables inline ABI namespace within `asmjit` namespace. This is only provided +//! for users that control all the dependencies (even transitive ones) and that make sure that no two AsmJit +//! versions are used at the same time. This option can be debugging a little simpler as there would not be ABI +//! tag after `asmjit::` namespace. Otherwise asmjit would look like `asmjit::_abi_1_13::`, for example. //! -//! - \ref ASMJIT_NO_JIT - Disables JIT memory management and \ref JitRuntime. +//! ### Features Selection //! -//! - \ref ASMJIT_NO_LOGGING - Disables \ref Logger and \ref Formatter. +//! AsmJit builds by defaults all supported features, which includes all emitters, logging, instruction validation and +//! introspection, and JIT memory allocation. Features can be disabled at compile time by using `ASMJIT_NO_...` +//! definitions. +//! - \ref ASMJIT_NO_JIT - Disables JIT memory management and \ref JitRuntime. //! //! - \ref ASMJIT_NO_TEXT - Disables everything that contains string representation of AsmJit constants, should //! be used together with \ref ASMJIT_NO_LOGGING as logging doesn't make sense without the ability to query //! instruction names, register names, etc... //! +//! - \ref ASMJIT_NO_LOGGING - Disables \ref Logger and \ref Formatter. +//! //! - \ref ASMJIT_NO_VALIDATION - Disables validation API. //! //! - \ref ASMJIT_NO_INTROSPECTION - Disables instruction introspection API, must be used together with \ref //! ASMJIT_NO_COMPILER as \ref asmjit_compiler requires introspection for its liveness analysis and register //! allocation. //! +//! - \ref ASMJIT_NO_BUILDER - Disables \ref asmjit_builder functionality completely. This implies \ref +//! ASMJIT_NO_COMPILER as \ref asmjit_compiler cannot be used without \ref asmjit_builder. +//! +//! - \ref ASMJIT_NO_COMPILER - Disables \ref asmjit_compiler functionality completely. +//! //! \note It's not recommended to disable features if you plan to build AsmJit as a shared library that will be //! used by multiple projects that you don't control how AsmJit was built (for example AsmJit in a Linux distribution). //! The possibility to disable certain features exists mainly for customized AsmJit builds. @@ -234,7 +240,7 @@ namespace asmjit { //! //! Useful tips before you start: //! -//! - Visit our [Public Gitter Channel](https://gitter.im/asmjit/asmjit) if you need a quick help. +//! - Visit our [Public Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) if you need a quick help. //! //! - Build AsmJit with `ASMJIT_NO_DEPRECATED` macro defined to make sure that you are not using deprecated //! functionality at all. Deprecated functions are decorated with `ASMJIT_DEPRECATED()` macro, but sometimes @@ -242,6 +248,77 @@ namespace asmjit { //! because some compilers would warn about that. If your project compiles fine with `ASMJIT_NO_DEPRECATED` //! it's not using anything, which was deprecated. //! +//! ### Changes committed at 2024-01-01 +//! +//! Core changes: +//! +//! - Renamed equality functions `eq()` to `equals()` - Only related to `String`, `ZoneVector`, and `CpuFeatures`. +//! Old function names were deprecated. +//! +//! - Removed `CallConvId::kNone` in favor of `CallConvId::kCDecl`, which is now the default calling convention. +//! +//! - Deprecated `CallConvId::kHost` in favor of `CallConvId::kCDecl` - host calling convention is now not part +//! of CallConvId, it can be calculated from CallConvId and Environment instead. +//! +//! ### Changes committed at 2023-12-27 +//! +//! Core changes: +//! +//! - Renamed `a64::Vec::ElementType` to `a64::VecElementType` and made it a typed enum. This enum was used mostly +//! internally, but there is a public API using it, so it's a breaking change. +//! +//! - Refactored `FuncSignature`, `FuncSignatureT`, and `FuncSignatureBuilder`. There is only `FuncSignature` now, +//! which acts as a function signature holder and builder. Replace `FuncSignatureBuilder` with `FuncSignature` +//! and use `FuncSignature::build` instead of `FuncSignatureT`. The old API has been deprecated. +//! +//! - The maximum number of function arguments was raised from 16 to 32. +//! +//! ### Changes committed at 2023-12-26 +//! +//! Core changes: +//! +//! - Reworked InstNode and InstExNode to be friendlier to static analysis and to not cause undefined behavior. +//! InstNode has no operands visually embedded within the struct so there is no _opArray (which was internal). +//! This means that sizeof(InstNode) changed, but since it's allocated by AsmJit this should be fine. Moreover, +//! there is no longer InstExNode as that was more a hack, instead there is now InstNodeWithOperands, which is +//! a template and specifies the number of operands embedded (InstNode accesses these). All nodes that inherited +//! InstExNode now just inherit InstNodeWithOperands, which would provide the same +//! number of nodes as InstNode. +//! +//! - Moved GP and Vec registers from asmjit::arm namespace to asmjit::a64 namespace. At this time there was +//! no prior deprecation as having arm::Vec would collide with a64::Vec as arm namespace is used within a64 +//! namespace. Just change `arm::Gp` to `a64::Gp` and `arm::Vec` to `a64::Vec`. +//! +//! ### Changes committed at 2023-09-10 +//! +//! Core changes: +//! +//! - Changed allocation API to work with spans (JitAllocator). +//! +//! - This change is required to support more hardened platforms in the future that make it very difficult +//! to write JIT compilers. +//! - `JitAllocator::Span` now represents a memory that the user can access. It abstracts both regular and +//! dual mappings. +//! - The `Span` is mostly designed to make it possible to write into it, so in general the read+execute +//! pointer is what user is intended to keep. Use `span.rx()` to access RX pointer. `Span` is not needed +//! after the memory it references has been modified, only remember `span.rx()` pointer, which is then +//! used to deallocate or change the memory the span references. +//! - Use a new `JitAllocator::alloc()` to allocate a `Span`, then pass the populated Span to `JitAllocator` +//! write API such as `JitAllocator::write()` - note that JitAllocator can also establish a scope, so you +//! can use a lambda function that would perform the write, but since it's going through JitAllocator it's +//! able to ensure that the memory is actually writable. +//! - If you need to repopulate a `Span` from rx pointer, use `JitAllocator::query(, rx)` to get it. +//! - Study what JitRuntime is doing to better understand how this new API works in detail. +//! - Users of JitRuntime do not have to do anything as JitRuntime properly abstracts the allocation. +//! +//! - Renamed some X86 CPU features to make them compatible with architecture manuals: +//! +//! - Changed `AVX512_CDI` to `AVX512_CD`. +//! - Changed `AVX512_ERI` to `AVX512_ER`. +//! - Changed `AVX512_PFI` to `AVX512_PF`. +//! +//! - Old names were deprecated. +//! //! ### Changes committed at 2021-12-13 //! //! Core changes: @@ -309,7 +386,7 @@ namespace asmjit { //! However, `gpCount()` was removed - at the moment `ArchTraits` can be used to access such properties. //! //! Some other functions were renamed, like `ArchInfo::isX86Family()` is now `Environment::isFamilyX86()`, etc. -//! The reason for changing the order was support for more propertries and all the accessors now start with the +//! The reason for changing the order was support for more properties and all the accessors now start with the //! type of the property, like `Environment::isPlatformWindows()`. //! //! This function causes many other classes to provide `environment()` getter instead of `archInfo()` getter. @@ -392,7 +469,7 @@ namespace asmjit { //! // Calling a function (Compiler) changed - use invoke() instead of call(). //! void functionInvocation(x86::Compiler& cc) { //! InvokeNode* invokeNode; -//! cc.invoke(&invokeNode, targetOperand, FuncSignatureT<...>(...)); +//! cc.invoke(&invokeNode, targetOperand, FuncSignature::build<...>(...)); //! } //! ``` @@ -454,7 +531,8 @@ namespace asmjit { //! JitRuntime rt; // Runtime specialized for JIT code execution. //! //! CodeHolder code; // Holds code and relocation information. -//! code.init(rt.environment()); // Initialize code to match the JIT environment. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); //! //! x86::Assembler a(&code); // Create and attach x86::Assembler to code. //! a.mov(x86::eax, 1); // Move one to eax register. @@ -599,9 +677,10 @@ namespace asmjit { //! int main() { //! // Create a custom environment that matches the current host environment. //! Environment env = Environment::host(); +//! CpuFeatures cpuFeatures = CpuInfo::host().features(); //! //! CodeHolder code; // Create a CodeHolder. -//! code.init(env); // Initialize CodeHolder with environment. +//! code.init(env, cpuFeatures); // Initialize CodeHolder with environment. //! //! x86::Assembler a(&code); // Create and attach x86::Assembler to `code`. //! @@ -722,10 +801,11 @@ namespace asmjit { //! //! void initializeCodeHolder(CodeHolder& code) { //! Environment env = Environment::host(); +//! CpuFeatures cpuFeatures = CpuInfo::host().features(); //! uint64_t baseAddress = uint64_t(0x1234); //! //! // initialize CodeHolder with environment and custom base address. -//! code.init(env, baseAddress); +//! code.init(env, cpuFeatures, baseAddress); //! } //! ``` //! @@ -757,7 +837,7 @@ namespace asmjit { //! //! There is no function that would return the number of unbound labels as this is completely unimportant from //! CodeHolder's perspective. If a label is not used then it doesn't matter whether it's bound or not, only actually -//! used labels matter. After a Label is bound it's possible to query its offset offset relative to the start of the +//! used labels matter. After a Label is bound it's possible to query its offset relative to the start of the //! section where it was bound: //! //! ``` @@ -870,7 +950,7 @@ namespace asmjit { //! //! if (code.hasUnresolvedLinks()) { //! // This would mean either unbound label or some other issue. -//! printf("The code has %zu unbound labels\n", code.unresovedLinkCount()); +//! printf("The code has %zu unbound labels\n", code.unresolvedLinkCount()); //! exit(1); //! } //! } @@ -886,12 +966,15 @@ namespace asmjit { //! with assembler requires the knowledge of the following: //! //! - \ref BaseAssembler and architecture-specific assemblers: -//! - \ref x86::Assembler - Assembler specific to X86 architecture +//! - \ref x86::Assembler - Assembler implementation targeting X86 and X86_64 architectures. +//! - \ref a64::Assembler - Assembler implementation targeting AArch64 architecture. //! - \ref Operand and its variations: //! - \ref BaseReg - Base class for a register operand, inherited by: -//! - \ref x86::Reg - Register operand specific to X86 architecture. +//! - \ref x86::Reg - Register operand specific to X86 and X86_64 architectures. +//! - \ref arm::Reg - Register operand specific to AArch64 architecture. //! - \ref BaseMem - Base class for a memory operand, inherited by: //! - \ref x86::Mem - Memory operand specific to X86 architecture. +//! - \ref arm::Mem - Memory operand specific to AArch64 architecture. //! - \ref Imm - Immediate (value) operand. //! - \ref Label - Label operand. //! @@ -999,7 +1082,7 @@ namespace asmjit { //! //! // Type-unsafe, but possible. //! a.emit(x86::Inst::kIdMov, dst, m); -//! // Also possible, `emit()` is typeless and can be used with raw Operand. +//! // Also possible, `emit()` is type-less and can be used with raw Operand. //! a.emit(x86::Inst::kIdMov, dst, op); //! } //! ``` @@ -1070,10 +1153,10 @@ namespace asmjit { //! //! void testX86Mem() { //! // The same as: dword ptr [rax + rbx]. -//! x86::Mem a = x86::dword_ptr(rax, rbx); +//! x86::Mem a = x86::dword_ptr(x86::rax, x86::rbx); //! //! // The same as: qword ptr [rdx + rsi << 0 + 1]. -//! x86::Mem b = x86::qword_ptr(rdx, rsi, 0, 1); +//! x86::Mem b = x86::qword_ptr(x86::rdx, x86::rsi, 0, 1); //! } //! ``` //! @@ -1086,18 +1169,18 @@ namespace asmjit { //! //! void testX86Mem() { //! // The same as: dword ptr [rax + 12]. -//! x86::Mem mem = x86::dword_ptr(rax, 12); +//! x86::Mem mem = x86::dword_ptr(x86::rax, 12); //! //! mem.hasBase(); // true. //! mem.hasIndex(); // false. //! mem.size(); // 4. //! mem.offset(); // 12. //! -//! mem.setSize(0); // Sets the size to 0 (makes it sizeless). +//! mem.setSize(0); // Sets the size to 0 (makes it size-less). //! mem.addOffset(-1); // Adds -1 to the offset and makes it 11. //! mem.setOffset(0); // Sets the offset to 0. -//! mem.setBase(rcx); // Changes BASE to RCX. -//! mem.setIndex(rax); // Changes INDEX to RAX. +//! mem.setBase(x86::rcx); // Changes BASE to RCX. +//! mem.setIndex(x86::rax); // Changes INDEX to RAX. //! mem.hasIndex(); // true. //! } //! // ... @@ -1189,7 +1272,8 @@ namespace asmjit { //! //! ### Builder Examples //! -//! - \ref x86::Builder provides many X86/X64 examples. +//! - \ref x86::Builder - Builder implementation targeting X86 and X86_64 architectures. +//! - \ref a64::Builder - Builder implementation targeting AArch64 architecture. //! \defgroup asmjit_compiler Compiler @@ -1226,7 +1310,8 @@ namespace asmjit { //! //! ### Compiler Examples //! -//! - \ref x86::Compiler provides many X86/X64 examples. +//! - \ref x86::Compiler - Compiler implementation targeting X86 and X86_64 architectures. +//! - \ref a64::Compiler - Compiler implementation targeting AArch64 architecture. //! //! ### Compiler Tips //! @@ -1346,7 +1431,8 @@ namespace asmjit { //! FileLogger logger(stdout); // Logger should always survive CodeHolder. //! //! CodeHolder code; // Holds code and relocation information. -//! code.init(rt.environment()); // Initialize to the same arch as JIT runtime. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); //! code.setLogger(&logger); // Attach the `logger` to `code` holder. //! //! // ... code as usual, everything emitted will be logged to `stdout` ... @@ -1369,7 +1455,8 @@ namespace asmjit { //! StringLogger logger; // Logger should always survive CodeHolder. //! //! CodeHolder code; // Holds code and relocation information. -//! code.init(rt.environment()); // Initialize to the same arch as JIT runtime. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); //! code.setLogger(&logger); // Attach the `logger` to `code` holder. //! //! // ... code as usual, logging will be concatenated to logger string ... @@ -1396,7 +1483,7 @@ namespace asmjit { //! The first example illustrates how to format operands: //! //! ``` -//! #include +//! #include //! #include //! //! using namespace asmjit; @@ -1421,17 +1508,17 @@ namespace asmjit { //! // compatible with what AsmJit normally does. //! Arch arch = Arch::kX64; //! -//! log(arch, rax); // Prints 'rax'. -//! log(arch, ptr(rax, rbx, 2)); // Prints '[rax + rbx * 4]`. -//! log(arch, dword_ptr(rax, rbx, 2)); // Prints 'dword [rax + rbx * 4]`. -//! log(arch, imm(42)); // Prints '42'. +//! logOperand(arch, rax); // Prints 'rax'. +//! logOperand(arch, ptr(rax, rbx, 2)); // Prints '[rax + rbx * 4]`. +//! logOperand(arch, dword_ptr(rax, rbx, 2)); // Prints 'dword [rax + rbx * 4]`. +//! logOperand(arch, imm(42)); // Prints '42'. //! } //! ``` //! //! Next example illustrates how to format whole instructions: //! //! ``` -//! #include +//! #include //! #include //! #include //! @@ -1446,7 +1533,7 @@ namespace asmjit { //! FormatFlags formatFlags = FormatFlags::kNone; //! //! // The formatter expects operands in an array. -//! Operand_ operands { std::forward(args)... }; +//! Operand_ operands[] { std::forward(args)... }; //! //! StringTmp<128> sb; //! Formatter::formatInstruction( @@ -1468,13 +1555,13 @@ namespace asmjit { //! // Prints 'vaddpd zmm0, zmm1, [rax] {1to8}'. //! logInstruction(arch, //! BaseInst(Inst::kIdVaddpd), -//! zmm0, zmm1, ptr(rax)._1toN()); +//! zmm0, zmm1, ptr(rax)._1to8()); //! //! // BaseInst abstracts instruction id, instruction options, and extraReg. //! // Prints 'lock add [rax], rcx'. //! logInstruction(arch, //! BaseInst(Inst::kIdAdd, InstOptions::kX86_Lock), -//! x86::ptr(rax), rcx); +//! ptr(rax), rcx); //! //! // Similarly an extra register (like AVX-512 selector) can be used. //! // Prints 'vaddpd zmm0 {k2} {z}, zmm1, [rax]'. @@ -1494,7 +1581,7 @@ namespace asmjit { //! using namespace asmjit; //! //! void formattingExample(BaseBuilder* builder) { -//! FormatFlags formatFlags = FormatFlags::kNone; +//! FormatOptions formatOptions {}; //! //! // This also shows how temporary strings can be used. //! StringTmp<512> sb; @@ -1503,7 +1590,7 @@ namespace asmjit { //! // were zero (no extra flags), and the builder instance, which we have //! // provided. An overloaded version also exists, which accepts begin and //! // and end nodes, which can be used to only format a range of nodes. -//! Formatter::formatNodeList(sb, formatFlags, builder); +//! Formatter::formatNodeList(sb, formatOptions, builder); //! //! // You can do whatever else with the string, it's always null terminated, //! // so it can be passed to C functions like printf(). @@ -1522,7 +1609,7 @@ namespace asmjit { //! override \ref ErrorHandler::handleError() to throw, in that case no error will be returned and exception will be //! thrown instead. All functions where this can happen are not marked `noexcept`. //! -//! Errors should never be ignored, however, checking errors after each AsmJit API call would simply overcomplicate +//! Errors should never be ignored, however, checking errors after each AsmJit API call would simply over-complicate //! the whole code generation experience. \ref ErrorHandler exists to make the use of AsmJit API simpler as it allows //! to customize how errors can be handled: //! @@ -1560,7 +1647,7 @@ namespace asmjit { //! MyErrorHandler myErrorHandler; //! CodeHolder code; //! -//! code.init(rt.environment()); +//! code.init(rt.environment(), rt.cpuFeatures()); //! code.setErrorHandler(&myErrorHandler); //! //! x86::Assembler a(&code); @@ -1592,7 +1679,7 @@ namespace asmjit { //! //! Each instruction can be then queried for the following information: //! -//! - \ref InstRWInfo - Read/write information of instruction and its oprands (includes \ref OpRWInfo). +//! - \ref InstRWInfo - Read/write information of instruction and its operands (includes \ref OpRWInfo). //! //! - \ref CpuFeatures - CPU features required to execute the instruction. //! @@ -1631,14 +1718,57 @@ namespace asmjit { //! //! ### Overview //! -//! AsmJit's virtual memory management is divided into two main categories: -//! -//! - Low level API that provides cross-platform abstractions for virtual memory allocation. Implemented in -//! \ref VirtMem namespace. -//! -//! - High level API that makes it very easy to store generated code for execution. See \ref JitRuntime, which is -//! used by many examples for its simplicity and easy integration with \ref CodeHolder. There is also \ref -//! JitAllocator, which lays somewhere between RAW memory allocation and \ref JitRuntime. +//! AsmJit's virtual memory management is divided into three main categories: +//! +//! - Low level interface that provides cross-platform abstractions for virtual memory allocation. Implemented in +//! \ref VirtMem namespace. This API is a thin wrapper around operating system specific calls such as +//! `VirtualAlloc()` and `mmap()` and it's intended to be used by AsmJit's higher level API. Low-level virtual +//! memory functions can be used to allocate virtual memory, change its permissions, and to release it. +//! Additionally, an API that allows to create dual mapping (to support hardened environments) is provided. +//! +//! - Middle level API that is provided by \ref JitAllocator, which uses \ref VirtMem internally and offers nicer +//! API that can be used by users to allocate executable memory conveniently. \ref JitAllocator tries to be smart, +//! for example automatically using dual mapping or `MAP_JIT` on hardened environments. +//! +//! - High level API that is provided by \ref JitRuntime, which implements \ref Target interface and uses \ref +//! JitAllocator under the hood. Since \ref JitRuntime inherits from \ref Target it makes it easy to use with +//! \ref CodeHolder. Many AsmJit examples use \ref JitRuntime for its simplicity and easy integration. +//! +//! The main difference between \ref VirtMem and \ref JitAllocator is that \ref VirtMem can only be used to allocate +//! whole pages, whereas \ref JitAllocator has `malloc()` like API that allows to allocate smaller quantities that +//! usually represent the size of an assembled function or a chunk of functions that can represent a module, for +//! example. \ref JitAllocator then tracks used space of each page it maintains. Internally, \ref JitAllocator uses +//! two bit arrays to track occupied regions in each allocated block of pages. +//! +//! ### Hardened Environments +//! +//! In the past, allocating virtual memory with Read+Write+Execute (RWX) access permissions was easy. However, modern +//! operating systems and runtime environments often use hardening, which typically prohibits mapping pages with both +//! Write and Execute permissions (known as the W^X policy). This presents a challenge for JIT compilers because +//! generated code for a single function is unlikely to fit in exactly N pages without leaving some space empty. To +//! accommodate this, the execution environment may need to temporarily change the permissions of existing pages to +//! read+write (RW) to insert new code into them, however, sometimes it's not possible to ensure that no thread is +//! executing code in such affected pages in a multithreaded environment, in which multiple threads may be executing +//! generated code. +//! +//! Such restrictions leave a lot of complexity on the application, so AsmJit implements a dual mapping technique to +//! make the life of AsmJit users easier. In this technique, a region of memory is mapped to two different virtual +//! addresses with different access permissions. One virtual address is mapped with read and write (RW) access, which +//! is used by the JIT compiler to write generated code. The other virtual address is mapped with read and execute (RX) +//! access, which is used by the application to execute the generated code. +//! +//! However, implementing dual mapping can be challenging because it typically requires obtaining an anonymous file +//! descriptor on most Unix-like operating systems. This file descriptor is then passed to mmap() twice to create +//! the two mappings. AsmJit handles this challenge by using system-specific techniques such as `memfd_create()` on +//! Linux, `shm_open(SHM_ANON)` on BSD, and `MAP_REMAPDUP` with `mremap()` on NetBSD. The latter approach does not +//! require a file descriptor. If none of these options are available, AsmJit uses a plain `open()` call followed by +//! `unlink()`. +//! +//! The most challenging part is actually obtaining a file descriptor that can be passed to `mmap()` with `PROT_EXEC`. +//! This is still something that may fail, for example the environment could be hardened in a way that this would +//! not be possible at all, and thus dual mapping would not work. +//! +//! Dual mapping is provided by both \ref VirtMem and \ref JitAllocator. //! \defgroup asmjit_zone Zone Memory diff --git a/3rdparty/asmjit/src/asmjit/core/api-build_p.h b/3rdparty/asmjit/src/asmjit/core/api-build_p.h index 6eca971037ea5..3ddc9e78d2213 100644 --- a/3rdparty/asmjit/src/asmjit/core/api-build_p.h +++ b/3rdparty/asmjit/src/asmjit/core/api-build_p.h @@ -27,6 +27,25 @@ #define NOMINMAX #endif #include +#else + // Most production code is compiled with large file support, so do the same. + #if !defined(_WIN32) && !defined(_LARGEFILE64_SOURCE) + #define _LARGEFILE64_SOURCE 1 + #endif + + // These OSes use 64-bit API by default. + #if defined(__APPLE__ ) || \ + defined(__HAIKU__ ) || \ + defined(__bsdi__ ) || \ + defined(__DragonFly__) || \ + defined(__FreeBSD__ ) || \ + defined(__NetBSD__ ) || \ + defined(__OpenBSD__ ) + #define ASMJIT_FILE64_API(NAME) NAME + #else + #define ASMJIT_FILE64_API(NAME) NAME##64 + #endif + #endif #include "./api-config.h" diff --git a/3rdparty/asmjit/src/asmjit/core/api-config.h b/3rdparty/asmjit/src/asmjit/core/api-config.h index 6bd5beecc0a82..c9199c9d7f6e7 100644 --- a/3rdparty/asmjit/src/asmjit/core/api-config.h +++ b/3rdparty/asmjit/src/asmjit/core/api-config.h @@ -12,20 +12,23 @@ //! \addtogroup asmjit_core //! \{ -//! AsmJit library version in `(Major << 16) | (Minor << 8) | (Patch)` format. -#define ASMJIT_LIBRARY_VERSION 0x010900 /* 1.9.0 */ +//! Makes a 32-bit integer that represents AsmJit version in `(major << 16) | (minor << 8) | patch` form. +#define ASMJIT_LIBRARY_MAKE_VERSION(major, minor, patch) ((major << 16) | (minor << 8) | (patch)) + +//! AsmJit library version, see \ref ASMJIT_LIBRARY_MAKE_VERSION for a version format reference. +#define ASMJIT_LIBRARY_VERSION ASMJIT_LIBRARY_MAKE_VERSION(1, 13, 0) //! \def ASMJIT_ABI_NAMESPACE //! //! AsmJit ABI namespace is an inline namespace within \ref asmjit namespace. //! -//! It's used to make sure that when user links to an incompatible version of AsmJit, it won't link. It has also some -//! additional properties as well. When `ASMJIT_ABI_NAMESPACE` is defined by the user it would override the AsmJit -//! default, which makes it possible to use use multiple AsmJit libraries within a single project, totally controlled -//! by the users. This is useful especially in cases in which some of such library comes from a third party. -#ifndef ASMJIT_ABI_NAMESPACE - #define ASMJIT_ABI_NAMESPACE _abi_1_9 -#endif +//! It's used to make sure that when user links to an incompatible version of AsmJit, it won't link. It has also +//! some additional properties as well. When `ASMJIT_ABI_NAMESPACE` is defined by the user it would override the +//! AsmJit default, which makes it possible to use multiple AsmJit libraries within a single project, totally +//! controlled by users. This is useful especially in cases in which some of such library comes from third party. +#if !defined(ASMJIT_ABI_NAMESPACE) + #define ASMJIT_ABI_NAMESPACE _abi_1_13 +#endif // !ASMJIT_ABI_NAMESPACE //! \} @@ -39,9 +42,8 @@ #include #include -#include +#include #include -#include #include #include @@ -70,20 +72,17 @@ namespace asmjit { //! Defined when AsmJit's build configuration is 'Debug'. //! -//! \note Can be defined explicitly to bypass autodetection. +//! \note Can be defined explicitly to bypass auto-detection. #define ASMJIT_BUILD_DEBUG //! Defined when AsmJit's build configuration is 'Release'. //! -//! \note Can be defined explicitly to bypass autodetection. +//! \note Can be defined explicitly to bypass auto-detection. #define ASMJIT_BUILD_RELEASE //! Disables X86/X64 backends. #define ASMJIT_NO_X86 -//! Disables AArch32 backends (both ARM and Thumb). -#define ASMJIT_NO_AARCH32 - //! Disables AArch64 backend. #define ASMJIT_NO_AARCH64 @@ -115,7 +114,7 @@ namespace asmjit { #define ASMJIT_NO_INTROSPECTION // Avoid doxygen preprocessor using feature-selection definitions. -#undef ASMJIT_BUILD_EMBNED +#undef ASMJIT_BUILD_EMBED #undef ASMJIT_BUILD_STATIC #undef ASMJIT_BUILD_DEBUG #undef ASMJIT_BUILD_RELEASE @@ -166,6 +165,41 @@ namespace asmjit { // Target Architecture Detection // ============================= +//! \addtogroup asmjit_core +//! \{ + +//! \def ASMJIT_ARCH_X86 +//! +//! Defined to either 0, 32, or 64 depending on whether the target CPU is X86 (32) or X86_64 (64). + +//! \def ASMJIT_ARCH_ARM +//! +//! Defined to either 0, 32, or 64 depending on whether the target CPU is ARM (32) or AArch64 (64). + +//! \def ASMJIT_ARCH_MIPS +//! +//! Defined to either 0, 32, or 64 depending on whether the target CPU is MIPS (32) or MISP64 (64). + +//! \def ASMJIT_ARCH_RISCV +//! +//! Defined to either 0, 32, or 64 depending on whether the target CPU is RV32 (32) or RV64 (64). + +//! \def ASMJIT_ARCH_BITS +//! +//! Defined to either 32 or 64 depending on the target. + +//! \def ASMJIT_ARCH_LE +//! +//! Defined to 1 if the target architecture is little endian. + +//! \def ASMJIT_ARCH_BE +//! +//! Defined to 1 if the target architecture is big endian. + +//! \} + +//! \cond NONE + #if defined(_M_X64) || defined(__x86_64__) #define ASMJIT_ARCH_X86 64 #elif defined(_M_IX86) || defined(__X86__) || defined(__i386__) @@ -174,7 +208,7 @@ namespace asmjit { #define ASMJIT_ARCH_X86 0 #endif -#if defined(__arm64__) || defined(__aarch64__) +#if defined(_M_ARM64) || defined(__arm64__) || defined(__aarch64__) # define ASMJIT_ARCH_ARM 64 #elif defined(_M_ARM) || defined(_M_ARMT) || defined(__arm__) || defined(__thumb__) || defined(__thumb2__) #define ASMJIT_ARCH_ARM 32 @@ -190,7 +224,14 @@ namespace asmjit { #define ASMJIT_ARCH_MIPS 0 #endif -#define ASMJIT_ARCH_BITS (ASMJIT_ARCH_X86 | ASMJIT_ARCH_ARM | ASMJIT_ARCH_MIPS) +// NOTE `__riscv` is the correct macro in this case as specified by "RISC-V Toolchain Conventions". +#if (defined(__riscv) || defined(__riscv__)) && defined(__riscv_xlen) + #define ASMJIT_ARCH_RISCV __riscv_xlen +#else + #define ASMJIT_ARCH_RISCV 0 +#endif + +#define ASMJIT_ARCH_BITS (ASMJIT_ARCH_X86 | ASMJIT_ARCH_ARM | ASMJIT_ARCH_MIPS | ASMJIT_ARCH_RISCV) #if ASMJIT_ARCH_BITS == 0 #undef ASMJIT_ARCH_BITS #if defined (__LP64__) || defined(_LP64) @@ -215,62 +256,88 @@ namespace asmjit { #define ASMJIT_NO_X86 #endif - #if !ASMJIT_ARCH_ARM && !defined(ASMJIT_NO_AARCH64) + #if ASMJIT_ARCH_ARM != 64 && !defined(ASMJIT_NO_AARCH64) #define ASMJIT_NO_AARCH64 #endif #endif +//! \endcond // C++ Compiler and Features Detection // =================================== -#define ASMJIT_CXX_GNU 0 -#define ASMJIT_CXX_MAKE_VER(MAJOR, MINOR) ((MAJOR) * 1000 + (MINOR)) - -// Intel Compiler [pretends to be GNU or MSC, so it must be checked first]: -// - https://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler -// - https://software.intel.com/en-us/articles/c14-features-supported-by-intel-c-compiler -// - https://software.intel.com/en-us/articles/c17-features-supported-by-intel-c-compiler -#if defined(__INTEL_COMPILER) - -// MSC Compiler: -// - https://msdn.microsoft.com/en-us/library/hh567368.aspx -// -// Version List: -// - 16.00.0 == VS2010 -// - 17.00.0 == VS2012 -// - 18.00.0 == VS2013 -// - 19.00.0 == VS2015 -// - 19.10.0 == VS2017 -#elif defined(_MSC_VER) && defined(_MSC_FULL_VER) - -// Clang Compiler [Pretends to be GNU, so it must be checked before]: -// - https://clang.llvm.org/cxx_status.html -#elif defined(__clang_major__) && defined(__clang_minor__) && defined(__clang_patchlevel__) - -// GNU Compiler: -// - https://gcc.gnu.org/projects/cxx-status.html -#elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) - - #undef ASMJIT_CXX_GNU - #define ASMJIT_CXX_GNU ASMJIT_CXX_MAKE_VER(__GNUC__, __GNUC_MINOR__) - -#endif - -// Compiler features detection macros. -#if defined(__clang__) && defined(__has_attribute) +#if defined(__GNUC__) && defined(__has_attribute) #define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (__has_attribute(NAME)) #else #define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (!(!(CHECK))) -#endif +#endif // !ASMJIT_CXX_HAS_ATTRIBUTE // API Decorators & C++ Extensions // =============================== +//! \addtogroup asmjit_core +//! \{ + //! \def ASMJIT_API //! //! A decorator that is used to decorate API that AsmJit exports when built as a shared library. +//! \def ASMJIT_VIRTAPI +//! +//! This is basically a workaround. When using MSVC and marking class as DLL export everything gets exported, which +//! is unwanted in most projects. MSVC automatically exports typeinfo and vtable if at least one symbol of the class +//! is exported. However, GCC has some strange behavior that even if one or more symbol is exported it doesn't export +//! typeinfo unless the class itself is decorated with "visibility(default)" (i.e. ASMJIT_API). + +//! \def ASMJIT_FORCE_INLINE +//! +//! Decorator to force inlining of functions, uses either `__attribute__((__always_inline__))` or __forceinline, +//! depending on C++ compiler. + +//! \def ASMJIT_INLINE_NODEBUG +//! +//! Like \ref ASMJIT_FORCE_INLINE, but uses additionally `__nodebug__` or `__artificial__` attribute to make the +//! debugging of some AsmJit functions easier, especially getters and one-line abstractions where usually you don't +//! want to step in. + +//! \def ASMJIT_NOINLINE +//! +//! Decorator to avoid inlining of functions, uses either `__attribute__((__noinline__))` or `__declspec(noinline)` +//! depending on C++ compiler. + +//! \def ASMJIT_NORETURN +//! +//! Decorator that marks functions that should never return. Typically used to implement assertion handlers that +//! terminate, so the function never returns. + +//! \def ASMJIT_CDECL +//! +//! CDECL function attribute - either `__attribute__((__cdecl__))` or `__cdecl`. + +//! \def ASMJIT_STDCALL +//! +//! STDCALL function attribute - either `__attribute__((__stdcall__))` or `__stdcall`. +//! +//! \note This expands to nothing on non-x86 targets as STDCALL is X86 specific. + +//! \def ASMJIT_FASTCALL +//! +//! FASTCALL function attribute - either `__attribute__((__fastcall__))` or `__fastcall`. +//! +//! \note Expands to nothing on non-x86 targets as FASTCALL is X86 specific. + +//! \def ASMJIT_REGPARM(N) +//! +//! Expands to `__attribute__((__regparm__(N)))` when compiled by GCC or clang, nothing otherwise. + +//! \def ASMJIT_VECTORCALL +//! +//! VECTORCALL function attribute - either `__attribute__((__vectorcall__))` or `__vectorcall`. +//! +//! \note Expands to nothing on non-x86 targets as VECTORCALL is X86 specific. + +//! \} + // API (Export / Import). #if !defined(ASMJIT_STATIC) #if defined(_WIN32) && (defined(_MSC_VER) || defined(__MINGW32__)) @@ -298,13 +365,7 @@ namespace asmjit { #define ASMJIT_VARAPI extern ASMJIT_API #endif -//! \def ASMJIT_VIRTAPI -//! -//! This is basically a workaround. When using MSVC and marking class as DLL export everything gets exported, which -//! is unwanted in most projects. MSVC automatically exports typeinfo and vtable if at least one symbol of the class -//! is exported. However, GCC has some strange behavior that even if one or more symbol is exported it doesn't export -//! typeinfo unless the class itself is decorated with "visibility(default)" (i.e. ASMJIT_API). -#if !defined(_WIN32) && defined(__GNUC__) +#if defined(__GNUC__) && !defined(_WIN32) #define ASMJIT_VIRTAPI ASMJIT_API #else #define ASMJIT_VIRTAPI @@ -319,6 +380,15 @@ namespace asmjit { #define ASMJIT_FORCE_INLINE inline #endif + +#if defined(__clang__) + #define ASMJIT_INLINE_NODEBUG inline __attribute__((__always_inline__, __nodebug__)) +#elif defined(__GNUC__) + #define ASMJIT_INLINE_NODEBUG inline __attribute__((__always_inline__, __artificial__)) +#else + #define ASMJIT_INLINE_NODEBUG inline +#endif + #if defined(__GNUC__) #define ASMJIT_NOINLINE __attribute__((__noinline__)) #define ASMJIT_NORETURN __attribute__((__noreturn__)) @@ -452,17 +522,10 @@ namespace asmjit { //! Marks function, class, struct, enum, or anything else as deprecated. #if defined(__GNUC__) #define ASMJIT_DEPRECATED(MESSAGE) __attribute__((__deprecated__(MESSAGE))) - #if defined(__clang__) - #define ASMJIT_DEPRECATED_STRUCT(MESSAGE) __attribute__((__deprecated__(MESSAGE))) - #else - #define ASMJIT_DEPRECATED_STRUCT(MESSAGE) /* not usable if a deprecated function uses it */ - #endif #elif defined(_MSC_VER) #define ASMJIT_DEPRECATED(MESSAGE) __declspec(deprecated(MESSAGE)) - #define ASMJIT_DEPRECATED_STRUCT(MESSAGE) /* not usable if a deprecated function uses it */ #else #define ASMJIT_DEPRECATED(MESSAGE) - #define ASMJIT_DEPRECATED_STRUCT(MESSAGE) #endif // Utilities. @@ -471,66 +534,60 @@ namespace asmjit { #if ASMJIT_CXX_HAS_ATTRIBUTE(no_sanitize, 0) #define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize__("undefined"))) -#elif ASMJIT_CXX_GNU >= ASMJIT_CXX_MAKE_VER(4, 9) +#elif defined(__GNUC__) && __GNUC__ >= 5 #define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize_undefined__)) #else #define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF #endif -// Begin-Namespace & End-Namespace Macros +// Diagnostic Macros // ====================================== -#if defined _DOXYGEN - #define ASMJIT_BEGIN_NAMESPACE namespace asmjit { - #define ASMJIT_END_NAMESPACE } -#elif defined(__clang__) - #define ASMJIT_BEGIN_NAMESPACE \ - namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wconstant-logical-operand\"") \ - _Pragma("clang diagnostic ignored \"-Wunnamed-type-template-args\"") - #define ASMJIT_END_NAMESPACE \ - _Pragma("clang diagnostic pop") \ - }} -#elif defined(__GNUC__) && __GNUC__ == 4 - #define ASMJIT_BEGIN_NAMESPACE \ - namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \ +#if !defined(__clang__) && !defined(__INTEL_COMPILER) && !defined(_DOXYGEN) + #if defined(__GNUC__) && __GNUC__ == 4 + // There is a bug in GCC 4.X that has been fixed in GCC 5+, so just silence the warning. + #define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \ _Pragma("GCC diagnostic push") \ _Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"") - #define ASMJIT_END_NAMESPACE \ - _Pragma("GCC diagnostic pop") \ - }} -#elif defined(__GNUC__) && __GNUC__ >= 8 - #define ASMJIT_BEGIN_NAMESPACE \ - namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wclass-memaccess\"") - #define ASMJIT_END_NAMESPACE \ - _Pragma("GCC diagnostic pop") \ - }} -#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER) - #define ASMJIT_BEGIN_NAMESPACE \ - namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { \ + #define ASMJIT_END_DIAGNOSTIC_SCOPE \ + _Pragma("GCC diagnostic pop") + #elif defined(_MSC_VER) + #define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \ __pragma(warning(push)) \ __pragma(warning(disable: 4127)) /* conditional expression is const */ \ __pragma(warning(disable: 4201)) /* nameless struct/union */ - #define ASMJIT_END_NAMESPACE \ - __pragma(warning(pop)) \ - }} + #define ASMJIT_END_DIAGNOSTIC_SCOPE \ + __pragma(warning(pop)) + #endif #endif -#if !defined(ASMJIT_BEGIN_NAMESPACE) && !defined(ASMJIT_END_NAMESPACE) - #define ASMJIT_BEGIN_NAMESPACE namespace asmjit { inline namespace ASMJIT_ABI_NAMESPACE { - #define ASMJIT_END_NAMESPACE }} +#if !defined(ASMJIT_BEGIN_DIAGNOSTIC_SCOPE) && !defined(ASMJIT_END_DIAGNOSTIC_SCOPE) + #define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE + #define ASMJIT_END_DIAGNOSTIC_SCOPE #endif -#define ASMJIT_BEGIN_SUB_NAMESPACE(NAMESPACE) \ - ASMJIT_BEGIN_NAMESPACE \ - namespace NAMESPACE { +// Begin-Namespace & End-Namespace Macros +// ====================================== -#define ASMJIT_END_SUB_NAMESPACE \ - } \ - ASMJIT_END_NAMESPACE +#if !defined(ASMJIT_NO_ABI_NAMESPACE) && !defined(_DOXYGEN) + #define ASMJIT_BEGIN_NAMESPACE \ + ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \ + namespace asmjit { \ + inline namespace ASMJIT_ABI_NAMESPACE { + #define ASMJIT_END_NAMESPACE \ + }} \ + ASMJIT_END_DIAGNOSTIC_SCOPE +#else + #define ASMJIT_BEGIN_NAMESPACE \ + ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \ + namespace asmjit { + #define ASMJIT_END_NAMESPACE \ + } \ + ASMJIT_END_DIAGNOSTIC_SCOPE +#endif + +#define ASMJIT_BEGIN_SUB_NAMESPACE(NAMESPACE) ASMJIT_BEGIN_NAMESPACE namespace NAMESPACE { +#define ASMJIT_END_SUB_NAMESPACE } ASMJIT_END_NAMESPACE // C++ Utilities // ============= @@ -551,34 +608,34 @@ namespace asmjit { #define ASMJIT_DEFINE_ENUM_FLAGS(T) #else #define ASMJIT_DEFINE_ENUM_FLAGS(T) \ - static ASMJIT_FORCE_INLINE constexpr T operator~(T a) noexcept { \ + static ASMJIT_INLINE_NODEBUG constexpr T operator~(T a) noexcept { \ return T(~(std::underlying_type::type)(a)); \ } \ \ - static ASMJIT_FORCE_INLINE constexpr T operator|(T a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG constexpr T operator|(T a, T b) noexcept { \ return T((std::underlying_type::type)(a) | \ (std::underlying_type::type)(b)); \ } \ - static ASMJIT_FORCE_INLINE constexpr T operator&(T a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG constexpr T operator&(T a, T b) noexcept { \ return T((std::underlying_type::type)(a) & \ (std::underlying_type::type)(b)); \ } \ - static ASMJIT_FORCE_INLINE constexpr T operator^(T a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG constexpr T operator^(T a, T b) noexcept { \ return T((std::underlying_type::type)(a) ^ \ (std::underlying_type::type)(b)); \ } \ \ - static ASMJIT_FORCE_INLINE T& operator|=(T& a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG T& operator|=(T& a, T b) noexcept { \ a = T((std::underlying_type::type)(a) | \ (std::underlying_type::type)(b)); \ return a; \ } \ - static ASMJIT_FORCE_INLINE T& operator&=(T& a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG T& operator&=(T& a, T b) noexcept { \ a = T((std::underlying_type::type)(a) & \ (std::underlying_type::type)(b)); \ return a; \ } \ - static ASMJIT_FORCE_INLINE T& operator^=(T& a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG T& operator^=(T& a, T b) noexcept { \ a = T((std::underlying_type::type)(a) ^ \ (std::underlying_type::type)(b)); \ return a; \ @@ -588,28 +645,22 @@ namespace asmjit { //! \def ASMJIT_DEFINE_ENUM_COMPARE(T) //! //! Defines comparison operations for enumeration flags. -#ifdef _DOXYGEN +#if defined(_DOXYGEN) || (defined(_MSC_VER) && _MSC_VER <= 1900) #define ASMJIT_DEFINE_ENUM_COMPARE(T) #else #define ASMJIT_DEFINE_ENUM_COMPARE(T) \ - static ASMJIT_FORCE_INLINE bool operator<(T a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG bool operator<(T a, T b) noexcept { \ return (std::underlying_type::type)(a) < (std::underlying_type::type)(b); \ } \ - static ASMJIT_FORCE_INLINE bool operator<=(T a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG bool operator<=(T a, T b) noexcept { \ return (std::underlying_type::type)(a) <= (std::underlying_type::type)(b); \ } \ - static ASMJIT_FORCE_INLINE bool operator>(T a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG bool operator>(T a, T b) noexcept { \ return (std::underlying_type::type)(a) > (std::underlying_type::type)(b); \ } \ - static ASMJIT_FORCE_INLINE bool operator>=(T a, T b) noexcept { \ + static ASMJIT_INLINE_NODEBUG bool operator>=(T a, T b) noexcept { \ return (std::underlying_type::type)(a) >= (std::underlying_type::type)(b); \ } #endif -// Cleanup Api-Config Specific Macros -// ================================== - -#undef ASMJIT_CXX_GNU -#undef ASMJIT_CXX_MAKE_VER - #endif // ASMJIT_CORE_API_CONFIG_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/core/archcommons.h b/3rdparty/asmjit/src/asmjit/core/archcommons.h index e9d2c84d7222a..2b47d17c1b448 100644 --- a/3rdparty/asmjit/src/asmjit/core/archcommons.h +++ b/3rdparty/asmjit/src/asmjit/core/archcommons.h @@ -29,8 +29,8 @@ enum class CondCode : uint8_t { kNE = 0x03u, //!< Z==0 (any_sign !=) kCS = 0x04u, //!< C==1 (unsigned >=) kHS = 0x04u, //!< C==1 (unsigned >=) - kCC = 0x05u, //!< C==0 (unsigned < ) kLO = 0x05u, //!< C==0 (unsigned < ) + kCC = 0x05u, //!< C==0 (unsigned < ) kMI = 0x06u, //!< N==1 (is negative) kPL = 0x07u, //!< N==0 (is positive or zero) kVS = 0x08u, //!< V==1 (is overflow) @@ -42,21 +42,24 @@ enum class CondCode : uint8_t { kGT = 0x0Eu, //!< Z==0 & N==V (signed > ) kLE = 0x0Fu, //!< Z==1 | N!=V (signed <=) - kSign = kMI, //!< Sign. - kNotSign = kPL, //!< Not sign. - - kOverflow = kVS, //!< Signed overflow. - kNotOverflow = kVC, //!< Not signed overflow. + kZero = kEQ, //!< Zero flag (alias to equal). + kNotZero = kNE, //!< Not zero (alias to Not Equal). kEqual = kEQ, //!< Equal `a == b`. kNotEqual = kNE, //!< Not Equal `a != b`. - kZero = kEQ, //!< Zero (alias to equal). - kNotZero = kNE, //!< Not Zero (alias to Not Equal). + kCarry = kCS, //!< Carry flag. + kNotCarry = kCC, //!< Not carry. + + kSign = kMI, //!< Sign flag. + kNotSign = kPL, //!< Not sign. kNegative = kMI, //!< Negative. kPositive = kPL, //!< Positive or zero. + kOverflow = kVS, //!< Signed overflow. + kNotOverflow = kVC, //!< Not signed overflow. + kSignedLT = kLT, //!< Signed `a < b`. kSignedLE = kLE, //!< Signed `a <= b`. kSignedGT = kGT, //!< Signed `a > b`. @@ -67,47 +70,51 @@ enum class CondCode : uint8_t { kUnsignedGT = kHI, //!< Unsigned `a > b`. kUnsignedGE = kHS, //!< Unsigned `a >= b`. + kBTZero = kZero, //!< Tested bit is zero. + kBTNotZero = kNotZero, //!< Tested bit is not zero. + kAlways = kAL, //!< No condition code (always). kMaxValue = 0x0Fu //!< Maximum value of `CondCode`. }; -//! Negates a condition code. -static inline constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ uint8_t(1)); } -//! Data type that can be encoded with the instruction (AArch32 only). -enum class DataType : uint32_t { - //! No data type specified (default for all general purpose instructions). - kNone = 0, - //! 8-bit signed integer, specified as `.s8` in assembly. - kS8 = 1, - //! 16-bit signed integer, specified as `.s16` in assembly. - kS16 = 2, - //! 32-bit signed integer, specified as `.s32` in assembly. - kS32 = 3, - //! 64-bit signed integer, specified as `.s64` in assembly. - kS64 = 4, - //! 8-bit unsigned integer, specified as `.u8` in assembly. - kU8 = 5, - //! 16-bit unsigned integer, specified as `.u16` in assembly. - kU16 = 6, - //! 32-bit unsigned integer, specified as `.u32` in assembly. - kU32 = 7, - //! 64-bit unsigned integer, specified as `.u64` in assembly. - kU64 = 8, - //! 16-bit floating point (half precision), specified as `.f16` in assembly. - kF16 = 10, - //! 32-bit floating point (single precision), specified as `.f32` in assembly. - kF32 = 11, - //! 64-bit floating point (double precision), specified as `.f64` in assembly. - kF64 = 12, - //! 8-bit polynomial. - kP8 = 13, - //! 64-bit polynomial. - kP64 = 15, +//! \cond +static constexpr CondCode _reverseCondTable[] = { + CondCode::kAL, // AL <- AL + CondCode::kNA, // NA <- NA + CondCode::kEQ, // EQ <- EQ + CondCode::kNE, // NE <- NE + CondCode::kLS, // LS <- CS + CondCode::kHI, // HI <- LO + CondCode::kMI, // MI <- MI + CondCode::kPL, // PL <- PL + CondCode::kVS, // VS <- VS + CondCode::kVC, // VC <- VC + CondCode::kLO, // LO <- HI + CondCode::kCS, // CS <- LS + CondCode::kLE, // LE <- GE + CondCode::kGT, // GT <- LT + CondCode::kLT, // LT <- GT + CondCode::kGE // GE <- LE +}; +//! \endcond - //! Maximum value of `DataType`. - kMaxValue = 15 +//! Reverses a condition code (reverses the corresponding operands of a comparison). +static ASMJIT_INLINE_NODEBUG constexpr CondCode reverseCond(CondCode cond) noexcept { return _reverseCondTable[uint8_t(cond)]; } +//! Negates a condition code. +static ASMJIT_INLINE_NODEBUG constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ uint8_t(1)); } + +//! Memory offset mode. +//! +//! Describes either fixed, pre-index, or post-index offset modes. +enum class OffsetMode : uint32_t { + //! Fixed offset mode (either no index at all or a regular index without a write-back). + kFixed = 0u, + //! Pre-index "[BASE, #Offset {, }]!" with write-back. + kPreIndex = 1u, + //! Post-index "[BASE], #Offset {, }" with write-back. + kPostIndex = 2u }; //! Shift operation predicate (ARM) describes either SHIFT or EXTEND operation. @@ -170,60 +177,85 @@ class Shift { uint32_t _value; //! Default constructed Shift is not initialized. - inline Shift() noexcept = default; + ASMJIT_INLINE_NODEBUG Shift() noexcept = default; //! Copy constructor (default) - constexpr Shift(const Shift& other) noexcept = default; + ASMJIT_INLINE_NODEBUG constexpr Shift(const Shift& other) noexcept = default; //! Constructs Shift from operation `op` and shift `value`. - constexpr Shift(ShiftOp op, uint32_t value) noexcept + ASMJIT_INLINE_NODEBUG constexpr Shift(ShiftOp op, uint32_t value) noexcept : _op(op), _value(value) {} //! Returns the shift operation. - constexpr ShiftOp op() const noexcept { return _op; } + ASMJIT_INLINE_NODEBUG constexpr ShiftOp op() const noexcept { return _op; } //! Sets shift operation to `op`. - inline void setOp(ShiftOp op) noexcept { _op = op; } + ASMJIT_INLINE_NODEBUG void setOp(ShiftOp op) noexcept { _op = op; } - //! Returns the shift smount. - constexpr uint32_t value() const noexcept { return _value; } + //! Returns the shift amount. + ASMJIT_INLINE_NODEBUG constexpr uint32_t value() const noexcept { return _value; } //! Sets shift amount to `value`. - inline void setValue(uint32_t value) noexcept { _value = value; } + ASMJIT_INLINE_NODEBUG void setValue(uint32_t value) noexcept { _value = value; } }; -//! Constructs a `LSL #value` shift (logical shift left). -static constexpr Shift lsl(uint32_t value) noexcept { return Shift(ShiftOp::kLSL, value); } -//! Constructs a `LSR #value` shift (logical shift right). -static constexpr Shift lsr(uint32_t value) noexcept { return Shift(ShiftOp::kLSR, value); } -//! Constructs a `ASR #value` shift (arithmetic shift right). -static constexpr Shift asr(uint32_t value) noexcept { return Shift(ShiftOp::kASR, value); } -//! Constructs a `ROR #value` shift (rotate right). -static constexpr Shift ror(uint32_t value) noexcept { return Shift(ShiftOp::kROR, value); } -//! Constructs a `RRX` shift (rotate with carry by 1). -static constexpr Shift rrx() noexcept { return Shift(ShiftOp::kRRX, 0); } -//! Constructs a `MSL #value` shift (logical shift left filling ones). -static constexpr Shift msl(uint32_t value) noexcept { return Shift(ShiftOp::kMSL, value); } - -//! Constructs a `UXTB #value` extend and shift (unsigned byte extend). -static constexpr Shift uxtb(uint32_t value) noexcept { return Shift(ShiftOp::kUXTB, value); } -//! Constructs a `UXTH #value` extend and shift (unsigned hword extend). -static constexpr Shift uxth(uint32_t value) noexcept { return Shift(ShiftOp::kUXTH, value); } -//! Constructs a `UXTW #value` extend and shift (unsigned word extend). -static constexpr Shift uxtw(uint32_t value) noexcept { return Shift(ShiftOp::kUXTW, value); } -//! Constructs a `UXTX #value` extend and shift (unsigned dword extend). -static constexpr Shift uxtx(uint32_t value) noexcept { return Shift(ShiftOp::kUXTX, value); } - -//! Constructs a `SXTB #value` extend and shift (signed byte extend). -static constexpr Shift sxtb(uint32_t value) noexcept { return Shift(ShiftOp::kSXTB, value); } -//! Constructs a `SXTH #value` extend and shift (signed hword extend). -static constexpr Shift sxth(uint32_t value) noexcept { return Shift(ShiftOp::kSXTH, value); } -//! Constructs a `SXTW #value` extend and shift (signed word extend). -static constexpr Shift sxtw(uint32_t value) noexcept { return Shift(ShiftOp::kSXTW, value); } -//! Constructs a `SXTX #value` extend and shift (signed dword extend). -static constexpr Shift sxtx(uint32_t value) noexcept { return Shift(ShiftOp::kSXTX, value); } - //! \} ASMJIT_END_SUB_NAMESPACE +ASMJIT_BEGIN_SUB_NAMESPACE(a32) + +using namespace arm; + +//! Data type that can be encoded with AArch32 instruction identifier. +//! +//! \note Data types are frequently used with AArch32 SIMD instructions. For example `VMAX` instruction can +//! use almost all datatypes in a form `VMAX.F32`, `VMAX.S16`, `VMAX.U32`, etc... Emitter automatically adds +//! the required data type at emit level. +enum class DataType : uint32_t { + //! No data type specified (default for all general purpose instructions). + kNone = 0, + //! 8-bit signed integer, specified as `.s8` in assembly. + kS8 = 1, + //! 16-bit signed integer, specified as `.s16` in assembly. + kS16 = 2, + //! 32-bit signed integer, specified as `.s32` in assembly. + kS32 = 3, + //! 64-bit signed integer, specified as `.s64` in assembly. + kS64 = 4, + //! 8-bit unsigned integer, specified as `.u8` in assembly. + kU8 = 5, + //! 16-bit unsigned integer, specified as `.u16` in assembly. + kU16 = 6, + //! 32-bit unsigned integer, specified as `.u32` in assembly. + kU32 = 7, + //! 64-bit unsigned integer, specified as `.u64` in assembly. + kU64 = 8, + //! 16-bit floating point (half precision), specified as `.f16` in assembly. + kF16 = 10, + //! 32-bit floating point (single precision), specified as `.f32` in assembly. + kF32 = 11, + //! 64-bit floating point (double precision), specified as `.f64` in assembly. + kF64 = 12, + //! 8-bit polynomial. + kP8 = 13, + //! 16-bit BF16 floating point. + kBF16 = 14, + //! 64-bit polynomial. + kP64 = 15, + + //! Maximum value of `DataType`. + kMaxValue = 15 +}; + +static ASMJIT_INLINE_NODEBUG uint32_t dataTypeSize(DataType dt) noexcept { + static constexpr uint8_t table[] = { 0, 1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 1, 2, 8 }; + return table[size_t(dt)]; +} + +ASMJIT_END_SUB_NAMESPACE + +ASMJIT_BEGIN_SUB_NAMESPACE(a64) +using namespace arm; +ASMJIT_END_SUB_NAMESPACE + #endif // ASMJIT_CORE_ARCHCOMMONS_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/core/archtraits.cpp b/3rdparty/asmjit/src/asmjit/core/archtraits.cpp index fc825df8009fb..a15a00c048b72 100644 --- a/3rdparty/asmjit/src/asmjit/core/archtraits.cpp +++ b/3rdparty/asmjit/src/asmjit/core/archtraits.cpp @@ -5,6 +5,7 @@ #include "../core/api-build_p.h" #include "../core/archtraits.h" +#include "../core/environment.h" #include "../core/misc_p.h" #if !defined(ASMJIT_NO_X86) diff --git a/3rdparty/asmjit/src/asmjit/core/archtraits.h b/3rdparty/asmjit/src/asmjit/core/archtraits.h index 192a826e51105..9f08dea523f8d 100644 --- a/3rdparty/asmjit/src/asmjit/core/archtraits.h +++ b/3rdparty/asmjit/src/asmjit/core/archtraits.h @@ -74,6 +74,9 @@ enum class Arch : uint8_t { ASMJIT_ARCH_X86 == 32 ? kX86 : ASMJIT_ARCH_X86 == 64 ? kX64 : + ASMJIT_ARCH_RISCV == 32 ? kRISCV32 : + ASMJIT_ARCH_RISCV == 64 ? kRISCV64 : + ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_LE ? kARM : ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_BE ? kARM_BE : ASMJIT_ARCH_ARM == 64 && ASMJIT_ARCH_LE ? kAArch64 : @@ -202,50 +205,50 @@ struct ArchTraits { //! \{ //! Returns stack pointer register id. - inline uint32_t spRegId() const noexcept { return _spRegId; } + ASMJIT_INLINE_NODEBUG uint32_t spRegId() const noexcept { return _spRegId; } //! Returns stack frame register id. - inline uint32_t fpRegId() const noexcept { return _fpRegId; } + ASMJIT_INLINE_NODEBUG uint32_t fpRegId() const noexcept { return _fpRegId; } //! Returns link register id, if the architecture provides it. - inline uint32_t linkRegId() const noexcept { return _linkRegId; } + ASMJIT_INLINE_NODEBUG uint32_t linkRegId() const noexcept { return _linkRegId; } //! Returns instruction pointer register id, if the architecture provides it. - inline uint32_t ipRegId() const noexcept { return _ipRegId; } + ASMJIT_INLINE_NODEBUG uint32_t ipRegId() const noexcept { return _ipRegId; } //! Returns a hardware stack alignment requirement. //! //! \note This is a hardware constraint. Architectures that don't constrain it would return the lowest alignment //! (1), however, some architectures may constrain the alignment, for example AArch64 requires 16-byte alignment. - inline uint32_t hwStackAlignment() const noexcept { return _hwStackAlignment; } + ASMJIT_INLINE_NODEBUG uint32_t hwStackAlignment() const noexcept { return _hwStackAlignment; } //! Tests whether the architecture provides link register, which is used across function calls. If the link //! register is not provided then a function call pushes the return address on stack (X86/X64). - inline bool hasLinkReg() const noexcept { return _linkRegId != BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG bool hasLinkReg() const noexcept { return _linkRegId != BaseReg::kIdBad; } //! Returns minimum addressable offset on stack guaranteed for all instructions. - inline uint32_t minStackOffset() const noexcept { return _minStackOffset; } + ASMJIT_INLINE_NODEBUG uint32_t minStackOffset() const noexcept { return _minStackOffset; } //! Returns maximum addressable offset on stack depending on specific instruction. - inline uint32_t maxStackOffset() const noexcept { return _maxStackOffset; } + ASMJIT_INLINE_NODEBUG uint32_t maxStackOffset() const noexcept { return _maxStackOffset; } //! Returns ISA flags of the given register `group`. - inline InstHints instFeatureHints(RegGroup group) const noexcept { return _instHints[group]; } + ASMJIT_INLINE_NODEBUG InstHints instFeatureHints(RegGroup group) const noexcept { return _instHints[group]; } //! Tests whether the given register `group` has the given `flag` set. - inline bool hasInstHint(RegGroup group, InstHints feature) const noexcept { return Support::test(_instHints[group], feature); } + ASMJIT_INLINE_NODEBUG bool hasInstHint(RegGroup group, InstHints feature) const noexcept { return Support::test(_instHints[group], feature); } //! Tests whether the ISA provides register swap instruction for the given register `group`. - inline bool hasInstRegSwap(RegGroup group) const noexcept { return hasInstHint(group, InstHints::kRegSwap); } + ASMJIT_INLINE_NODEBUG bool hasInstRegSwap(RegGroup group) const noexcept { return hasInstHint(group, InstHints::kRegSwap); } //! Tests whether the ISA provides push/pop instructions for the given register `group`. - inline bool hasInstPushPop(RegGroup group) const noexcept { return hasInstHint(group, InstHints::kPushPop); } + ASMJIT_INLINE_NODEBUG bool hasInstPushPop(RegGroup group) const noexcept { return hasInstHint(group, InstHints::kPushPop); } - inline bool hasRegType(RegType type) const noexcept { + ASMJIT_INLINE_NODEBUG bool hasRegType(RegType type) const noexcept { return type <= RegType::kMaxValue && _regSignature[type].isValid(); } //! Returns an operand signature from the given register `type` of this architecture. - inline OperandSignature regTypeToSignature(RegType type) const noexcept { return _regSignature[type]; } + ASMJIT_INLINE_NODEBUG OperandSignature regTypeToSignature(RegType type) const noexcept { return _regSignature[type]; } //! Returns a register from the given register `type` of this architecture. - inline RegGroup regTypeToGroup(RegType type) const noexcept { return _regSignature[type].regGroup(); } + ASMJIT_INLINE_NODEBUG RegGroup regTypeToGroup(RegType type) const noexcept { return _regSignature[type].regGroup(); } //! Returns a register size the given register `type` of this architecture. - inline uint32_t regTypeToSize(RegType type) const noexcept { return _regSignature[type].size(); } + ASMJIT_INLINE_NODEBUG uint32_t regTypeToSize(RegType type) const noexcept { return _regSignature[type].size(); } //! Returns a corresponding `TypeId` from the given register `type` of this architecture. - inline TypeId regTypeToTypeId(RegType type) const noexcept { return _regTypeToTypeId[type]; } + ASMJIT_INLINE_NODEBUG TypeId regTypeToTypeId(RegType type) const noexcept { return _regTypeToTypeId[type]; } //! Returns a table of ISA word names that appear in formatted text. Word names are ISA dependent. //! @@ -254,10 +257,10 @@ struct ArchTraits { //! - [1] 16-bits //! - [2] 32-bits //! - [3] 64-bits - inline const ArchTypeNameId* typeNameIdTable() const noexcept { return _typeNameIdTable; } + ASMJIT_INLINE_NODEBUG const ArchTypeNameId* typeNameIdTable() const noexcept { return _typeNameIdTable; } //! Returns an ISA word name identifier of the given `index`, see \ref typeNameIdTable() for more details. - inline ArchTypeNameId typeNameIdByIndex(uint32_t index) const noexcept { return _typeNameIdTable[index]; } + ASMJIT_INLINE_NODEBUG ArchTypeNameId typeNameIdByIndex(uint32_t index) const noexcept { return _typeNameIdTable[index]; } //! \} @@ -265,7 +268,7 @@ struct ArchTraits { //! \{ //! Returns a const reference to `ArchTraits` for the given architecture `arch`. - static inline const ArchTraits& byArch(Arch arch) noexcept; + static ASMJIT_INLINE_NODEBUG const ArchTraits& byArch(Arch arch) noexcept; //! \} }; @@ -273,7 +276,7 @@ struct ArchTraits { ASMJIT_VARAPI const ArchTraits _archTraits[uint32_t(Arch::kMaxValue) + 1]; //! \cond -inline const ArchTraits& ArchTraits::byArch(Arch arch) noexcept { return _archTraits[uint32_t(arch)]; } +ASMJIT_INLINE_NODEBUG const ArchTraits& ArchTraits::byArch(Arch arch) noexcept { return _archTraits[uint32_t(arch)]; } //! \endcond //! Architecture utilities. diff --git a/3rdparty/asmjit/src/asmjit/core/assembler.h b/3rdparty/asmjit/src/asmjit/core/assembler.h index 7ea2505f046e8..d53d9e53764f1 100644 --- a/3rdparty/asmjit/src/asmjit/core/assembler.h +++ b/3rdparty/asmjit/src/asmjit/core/assembler.h @@ -25,6 +25,7 @@ ASMJIT_BEGIN_NAMESPACE //! Check out architecture specific assemblers for more details and examples: //! //! - \ref x86::Assembler - X86/X64 assembler implementation. +//! - \ref a64::Assembler - AArch64 assembler implementation. class ASMJIT_VIRTAPI BaseAssembler : public BaseEmitter { public: ASMJIT_NONCOPYABLE(BaseAssembler) @@ -45,7 +46,7 @@ class ASMJIT_VIRTAPI BaseAssembler : public BaseEmitter { //! Creates a new `BaseAssembler` instance. ASMJIT_API BaseAssembler() noexcept; //! Destroys the `BaseAssembler` instance. - ASMJIT_API virtual ~BaseAssembler() noexcept; + ASMJIT_API ~BaseAssembler() noexcept override; //! \} @@ -53,12 +54,12 @@ class ASMJIT_VIRTAPI BaseAssembler : public BaseEmitter { //! \{ //! Returns the capacity of the current CodeBuffer. - inline size_t bufferCapacity() const noexcept { return (size_t)(_bufferEnd - _bufferData); } + ASMJIT_INLINE_NODEBUG size_t bufferCapacity() const noexcept { return (size_t)(_bufferEnd - _bufferData); } //! Returns the number of remaining bytes in the current CodeBuffer. - inline size_t remainingSpace() const noexcept { return (size_t)(_bufferEnd - _bufferPtr); } + ASMJIT_INLINE_NODEBUG size_t remainingSpace() const noexcept { return (size_t)(_bufferEnd - _bufferPtr); } //! Returns the current position in the CodeBuffer. - inline size_t offset() const noexcept { return (size_t)(_bufferPtr - _bufferData); } + ASMJIT_INLINE_NODEBUG size_t offset() const noexcept { return (size_t)(_bufferPtr - _bufferData); } //! Sets the current position in the CodeBuffer to `offset`. //! @@ -67,11 +68,11 @@ class ASMJIT_VIRTAPI BaseAssembler : public BaseEmitter { ASMJIT_API Error setOffset(size_t offset); //! Returns the start of the CodeBuffer in the current section. - inline uint8_t* bufferData() const noexcept { return _bufferData; } + ASMJIT_INLINE_NODEBUG uint8_t* bufferData() const noexcept { return _bufferData; } //! Returns the end (first invalid byte) in the current section. - inline uint8_t* bufferEnd() const noexcept { return _bufferEnd; } + ASMJIT_INLINE_NODEBUG uint8_t* bufferEnd() const noexcept { return _bufferEnd; } //! Returns the current pointer in the CodeBuffer in the current section. - inline uint8_t* bufferPtr() const noexcept { return _bufferPtr; } + ASMJIT_INLINE_NODEBUG uint8_t* bufferPtr() const noexcept { return _bufferPtr; } //! \} @@ -79,7 +80,7 @@ class ASMJIT_VIRTAPI BaseAssembler : public BaseEmitter { //! \{ //! Returns the current section. - inline Section* currentSection() const noexcept { return _section; } + ASMJIT_INLINE_NODEBUG Section* currentSection() const noexcept { return _section; } ASMJIT_API Error section(Section* section) override; diff --git a/3rdparty/asmjit/src/asmjit/core/builder.cpp b/3rdparty/asmjit/src/asmjit/core/builder.cpp index 5df243e7b8ae0..25433b9a0d825 100644 --- a/3rdparty/asmjit/src/asmjit/core/builder.cpp +++ b/3rdparty/asmjit/src/asmjit/core/builder.cpp @@ -65,7 +65,7 @@ Error BaseBuilder::newInstNode(InstNode** out, InstId instId, InstOptions instOp if (ASMJIT_UNLIKELY(!node)) return reportError(DebugUtils::errored(kErrorOutOfMemory)); - *out = new(node) InstNode(this, instId, instOptions, opCount, opCapacity); + *out = new(Support::PlacementNew{node}) InstNode(this, instId, instOptions, opCount, opCapacity); return kErrorOk; } @@ -151,14 +151,13 @@ BaseNode* BaseBuilder::addNode(BaseNode* node) noexcept { ASMJIT_ASSERT(!node->isActive()); if (!_cursor) { - if (!_firstNode) { - _firstNode = node; - _lastNode = node; + if (_nodeList.empty()) { + _nodeList.reset(node, node); } else { - node->_next = _firstNode; - _firstNode->_prev = node; - _firstNode = node; + node->_next = _nodeList.first(); + _nodeList._first->_prev = node; + _nodeList._first = node; } } else { @@ -172,7 +171,7 @@ BaseNode* BaseBuilder::addNode(BaseNode* node) noexcept { if (next) next->_prev = node; else - _lastNode = node; + _nodeList._last = node; } node->addFlags(NodeFlags::kIsActive); @@ -201,7 +200,7 @@ BaseNode* BaseBuilder::addAfter(BaseNode* node, BaseNode* ref) noexcept { if (next) next->_prev = node; else - _lastNode = node; + _nodeList._last = node; return node; } @@ -226,7 +225,7 @@ BaseNode* BaseBuilder::addBefore(BaseNode* node, BaseNode* ref) noexcept { if (prev) prev->_next = node; else - _firstNode = node; + _nodeList._first = node; return node; } @@ -238,13 +237,13 @@ BaseNode* BaseBuilder::removeNode(BaseNode* node) noexcept { BaseNode* prev = node->prev(); BaseNode* next = node->next(); - if (_firstNode == node) - _firstNode = next; + if (_nodeList._first == node) + _nodeList._first = next; else prev->_next = next; - if (_lastNode == node) - _lastNode = prev; + if (_nodeList._last == node) + _nodeList._last = prev; else next->_prev = prev; @@ -272,13 +271,13 @@ void BaseBuilder::removeNodes(BaseNode* first, BaseNode* last) noexcept { BaseNode* prev = first->prev(); BaseNode* next = last->next(); - if (_firstNode == first) - _firstNode = next; + if (_nodeList._first == first) + _nodeList._first = next; else prev->_next = next; - if (_lastNode == last) - _lastNode = prev; + if (_nodeList._last == last) + _nodeList._last = prev; else next->_prev = prev; @@ -368,7 +367,7 @@ Error BaseBuilder::section(Section* section) { if (node->_nextSection) _cursor = node->_nextSection->_prev; else - _cursor = _lastNode; + _cursor = _nodeList.last(); } return kErrorOk; @@ -378,7 +377,7 @@ void BaseBuilder::updateSectionLinks() noexcept { if (!_dirtySectionLinks) return; - BaseNode* node_ = _firstNode; + BaseNode* node_ = _nodeList.first(); SectionNode* currentSection = nullptr; while (node_) { @@ -591,13 +590,15 @@ Error BaseBuilder::_emit(InstId instId, const Operand_& o0, const Operand_& o1, EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt); ValidationFlags validationFlags = isCompiler() ? ValidationFlags::kEnableVirtRegs : ValidationFlags::kNone; - Error err = _funcs.validate(arch(), BaseInst(instId, options, _extraReg), opArray, opCount, validationFlags); + Error err = _funcs.validate(BaseInst(instId, options, _extraReg), opArray, opCount, validationFlags); if (ASMJIT_UNLIKELY(err)) { - resetInstOptions(); - resetExtraReg(); - resetInlineComment(); +#ifndef ASMJIT_NO_LOGGING + return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt); +#else + resetState(); return reportError(err); +#endif } } #endif @@ -620,7 +621,7 @@ Error BaseBuilder::_emit(InstId instId, const Operand_& o0, const Operand_& o1, return reportError(DebugUtils::errored(kErrorOutOfMemory)); } - node = new(node) InstNode(this, instId, options, opCount, opCapacity); + node = new(Support::PlacementNew{node}) InstNode(this, instId, options, opCount, opCapacity); node->setExtraReg(extraReg()); node->setOp(0, o0); node->setOp(1, o1); @@ -756,7 +757,7 @@ Error BaseBuilder::comment(const char* data, size_t size) { Error BaseBuilder::serializeTo(BaseEmitter* dst) { Error err = kErrorOk; - BaseNode* node_ = _firstNode; + BaseNode* node_ = _nodeList.first(); Operand_ opArray[Globals::kMaxOpCount]; @@ -852,8 +853,7 @@ Error BaseBuilder::onAttach(CodeHolder* code) noexcept { ASMJIT_ASSUME(initialSection != nullptr); _cursor = initialSection; - _firstNode = initialSection; - _lastNode = initialSection; + _nodeList.reset(initialSection, initialSection); initialSection->setFlags(NodeFlags::kIsActive); return kErrorOk; @@ -871,8 +871,7 @@ Error BaseBuilder::onDetach(CodeHolder* code) noexcept { _nodeFlags = NodeFlags::kNone; _cursor = nullptr; - _firstNode = nullptr; - _lastNode = nullptr; + _nodeList.reset(); return Base::onDetach(code); } @@ -884,6 +883,15 @@ Pass::Pass(const char* name) noexcept : _name(name) {} Pass::~Pass() noexcept {} +// Pass - Interface +// ================ + +// [[pure virtual]] +Error Pass::run(Zone* zone, Logger* logger) { + DebugUtils::unused(zone, logger); + return DebugUtils::errored(kErrorInvalidState); +} + ASMJIT_END_NAMESPACE #endif // !ASMJIT_NO_BUILDER diff --git a/3rdparty/asmjit/src/asmjit/core/builder.h b/3rdparty/asmjit/src/asmjit/core/builder.h index 3575de2fbb8ad..0de19234cb6eb 100644 --- a/3rdparty/asmjit/src/asmjit/core/builder.h +++ b/3rdparty/asmjit/src/asmjit/core/builder.h @@ -48,7 +48,7 @@ enum class NodeType : uint8_t { // [BaseBuilder] - //! Node is \ref InstNode or \ref InstExNode. + //! Node is \ref InstNode. kInst = 1, //! Node is \ref SectionNode. kSection = 2, @@ -109,7 +109,7 @@ enum class NodeFlags : uint8_t { }; ASMJIT_DEFINE_ENUM_FLAGS(NodeFlags) -//! Type of the sentinel (purery informative purpose). +//! Type of the sentinel (purely informative purpose). enum class SentinelType : uint8_t { //! Type of the sentinel is not known. kUnknown = 0u, @@ -117,6 +117,60 @@ enum class SentinelType : uint8_t { kFuncEnd = 1u }; +//! Node list. +//! +//! A double-linked list of pointers to \ref BaseNode, managed by \ref BaseBuilder or \ref BaseCompiler. +//! +//! \note At the moment NodeList is just a view, but it's planned that it will get more functionality in the future. +class NodeList { +public: + //! \name Members + //! \{ + + //! First node in the list or nullptr if there are no nodes in the list. + BaseNode* _first = nullptr; + //! Last node in the list or nullptr if there are no nodes in the list. + BaseNode* _last = nullptr; + + //! \} + + //! \name Construction & Destruction + //! \{ + + ASMJIT_INLINE_NODEBUG NodeList() noexcept {} + + ASMJIT_INLINE_NODEBUG NodeList(BaseNode* first, BaseNode* last) noexcept + : _first(first), + _last(last) {} + + //! \} + + //! \name Reset + //! \{ + + ASMJIT_INLINE_NODEBUG void reset() noexcept { + _first = nullptr; + _last = nullptr; + } + + ASMJIT_INLINE_NODEBUG void reset(BaseNode* first, BaseNode* last) noexcept { + _first = first; + _last = last; + } + + //! \} + + //! \name Accessors + //! \{ + + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _first == nullptr; } + + ASMJIT_INLINE_NODEBUG BaseNode* first() const noexcept { return _first; } + ASMJIT_INLINE_NODEBUG BaseNode* last() const noexcept { return _last; } + + //! \} +}; + //! Builder interface. //! //! `BaseBuilder` interface was designed to be used as a \ref BaseAssembler replacement in case pre-processing or @@ -127,6 +181,7 @@ enum class SentinelType : uint8_t { //! Check out architecture specific builders for more details and examples: //! //! - \ref x86::Builder - X86/X64 builder implementation. +//! - \ref a64::Builder - AArch64 builder implementation. class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { public: ASMJIT_NONCOPYABLE(BaseBuilder) @@ -153,10 +208,8 @@ class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { //! Current node (cursor). BaseNode* _cursor = nullptr; - //! First node of the current section. - BaseNode* _firstNode = nullptr; - //! Last node of the current section. - BaseNode* _lastNode = nullptr; + //! First and last nodes. + NodeList _nodeList; //! Flags assigned to each new node. NodeFlags _nodeFlags = NodeFlags::kNone; @@ -171,17 +224,19 @@ class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { //! Creates a new `BaseBuilder` instance. ASMJIT_API BaseBuilder() noexcept; //! Destroys the `BaseBuilder` instance. - ASMJIT_API virtual ~BaseBuilder() noexcept; + ASMJIT_API ~BaseBuilder() noexcept override; //! \} //! \name Node Management //! \{ + ASMJIT_INLINE_NODEBUG NodeList nodeList() const noexcept { return _nodeList; } + //! Returns the first node. - inline BaseNode* firstNode() const noexcept { return _firstNode; } + ASMJIT_INLINE_NODEBUG BaseNode* firstNode() const noexcept { return _nodeList.first(); } //! Returns the last node. - inline BaseNode* lastNode() const noexcept { return _lastNode; } + ASMJIT_INLINE_NODEBUG BaseNode* lastNode() const noexcept { return _nodeList.last(); } //! Allocates and instantiates a new node of type `T` and returns its instance. If the allocation fails `nullptr` //! is returned. @@ -227,7 +282,7 @@ class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { //! When the Builder/Compiler is created it automatically creates a '.text' \ref SectionNode, which will be the //! initial one. When instructions are added they are always added after the cursor and the cursor is changed //! to be that newly added node. Use `setCursor()` to change where new nodes are inserted. - inline BaseNode* cursor() const noexcept { return _cursor; } + ASMJIT_INLINE_NODEBUG BaseNode* cursor() const noexcept { return _cursor; } //! Sets the current node to `node` and return the previous one. ASMJIT_API BaseNode* setCursor(BaseNode* node) noexcept; @@ -236,7 +291,7 @@ class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { //! //! Only use this function if you are concerned about performance and want this inlined (for example if you set //! the cursor in a loop, etc...). - inline void _setCursor(BaseNode* node) noexcept { _cursor = node; } + ASMJIT_INLINE_NODEBUG void _setCursor(BaseNode* node) noexcept { _cursor = node; } //! \} @@ -247,12 +302,12 @@ class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { //! //! \note If a section of some id is not associated with the Builder/Compiler it would be null, so always check //! for nulls if you iterate over the vector. - inline const ZoneVector& sectionNodes() const noexcept { + ASMJIT_INLINE_NODEBUG const ZoneVector& sectionNodes() const noexcept { return _sectionNodes; } //! Tests whether the `SectionNode` of the given `sectionId` was registered. - inline bool hasRegisteredSectionNode(uint32_t sectionId) const noexcept { + ASMJIT_INLINE_NODEBUG bool hasRegisteredSectionNode(uint32_t sectionId) const noexcept { return sectionId < _sectionNodes.size() && _sectionNodes[sectionId] != nullptr; } @@ -266,7 +321,7 @@ class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { //! Returns whether the section links of active section nodes are dirty. You can update these links by calling //! `updateSectionLinks()` in such case. - inline bool hasDirtySectionLinks() const noexcept { return _dirtySectionLinks; } + ASMJIT_INLINE_NODEBUG bool hasDirtySectionLinks() const noexcept { return _dirtySectionLinks; } //! Updates links of all active section nodes. ASMJIT_API void updateSectionLinks() noexcept; @@ -280,15 +335,15 @@ class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { //! //! \note If a label of some id is not associated with the Builder/Compiler it would be null, so always check for //! nulls if you iterate over the vector. - inline const ZoneVector& labelNodes() const noexcept { return _labelNodes; } + ASMJIT_INLINE_NODEBUG const ZoneVector& labelNodes() const noexcept { return _labelNodes; } //! Tests whether the `LabelNode` of the given `labelId` was registered. - inline bool hasRegisteredLabelNode(uint32_t labelId) const noexcept { + ASMJIT_INLINE_NODEBUG bool hasRegisteredLabelNode(uint32_t labelId) const noexcept { return labelId < _labelNodes.size() && _labelNodes[labelId] != nullptr; } //! \overload - inline bool hasRegisteredLabelNode(const Label& label) const noexcept { + ASMJIT_INLINE_NODEBUG bool hasRegisteredLabelNode(const Label& label) const noexcept { return hasRegisteredLabelNode(label.id()); } @@ -299,7 +354,7 @@ class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { ASMJIT_API Error labelNodeOf(LabelNode** ASMJIT_NONNULL(out), uint32_t labelId); //! \overload - inline Error labelNodeOf(LabelNode** ASMJIT_NONNULL(out), const Label& label) { + ASMJIT_INLINE_NODEBUG Error labelNodeOf(LabelNode** ASMJIT_NONNULL(out), const Label& label) { return labelNodeOf(out, label.id()); } @@ -319,7 +374,7 @@ class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter { //! \{ //! Returns a vector of `Pass` instances that will be executed by `runPasses()`. - inline const ZoneVector& passes() const noexcept { return _passes; } + ASMJIT_INLINE_NODEBUG const ZoneVector& passes() const noexcept { return _passes; } //! Allocates and instantiates a new pass of type `T` and returns its instance. If the allocation fails `nullptr` is //! returned. @@ -492,7 +547,7 @@ class BaseNode { uint8_t _reserved1; }; - //! Data that can have different meaning dependning on \ref NodeType. + //! Data that can have different meaning depending on \ref NodeType. union { //! Data useful by any node type. AnyData _any; @@ -529,7 +584,7 @@ class BaseNode { //! \{ //! Creates a new `BaseNode` - always use `BaseBuilder` to allocate nodes. - inline BaseNode(BaseBuilder* cb, NodeType nodeType, NodeFlags nodeFlags = NodeFlags::kNone) noexcept { + ASMJIT_INLINE_NODEBUG BaseNode(BaseBuilder* cb, NodeType nodeType, NodeFlags nodeFlags = NodeFlags::kNone) noexcept { _prev = nullptr; _next = nullptr; _any._nodeType = nodeType; @@ -549,85 +604,85 @@ class BaseNode { //! Casts this node to `T*`. template - inline T* as() noexcept { return static_cast(this); } + ASMJIT_INLINE_NODEBUG T* as() noexcept { return static_cast(this); } //! Casts this node to `const T*`. template - inline const T* as() const noexcept { return static_cast(this); } + ASMJIT_INLINE_NODEBUG const T* as() const noexcept { return static_cast(this); } //! Returns previous node or `nullptr` if this node is either first or not //! part of Builder/Compiler node-list. - inline BaseNode* prev() const noexcept { return _prev; } + ASMJIT_INLINE_NODEBUG BaseNode* prev() const noexcept { return _prev; } //! Returns next node or `nullptr` if this node is either last or not part //! of Builder/Compiler node-list. - inline BaseNode* next() const noexcept { return _next; } + ASMJIT_INLINE_NODEBUG BaseNode* next() const noexcept { return _next; } //! Returns the type of the node, see `NodeType`. - inline NodeType type() const noexcept { return _any._nodeType; } + ASMJIT_INLINE_NODEBUG NodeType type() const noexcept { return _any._nodeType; } //! Sets the type of the node, see `NodeType` (internal). //! //! \remarks You should never set a type of a node to anything else than the initial value. This function is only //! provided for users that use custom nodes and need to change the type either during construction or later. - inline void setType(NodeType type) noexcept { _any._nodeType = type; } + ASMJIT_INLINE_NODEBUG void setType(NodeType type) noexcept { _any._nodeType = type; } //! Tests whether this node is either `InstNode` or extends it. - inline bool isInst() const noexcept { return hasFlag(NodeFlags::kActsAsInst); } + ASMJIT_INLINE_NODEBUG bool isInst() const noexcept { return hasFlag(NodeFlags::kActsAsInst); } //! Tests whether this node is `SectionNode`. - inline bool isSection() const noexcept { return type() == NodeType::kSection; } + ASMJIT_INLINE_NODEBUG bool isSection() const noexcept { return type() == NodeType::kSection; } //! Tests whether this node is either `LabelNode` or extends it. - inline bool isLabel() const noexcept { return hasFlag(NodeFlags::kActsAsLabel); } + ASMJIT_INLINE_NODEBUG bool isLabel() const noexcept { return hasFlag(NodeFlags::kActsAsLabel); } //! Tests whether this node is `AlignNode`. - inline bool isAlign() const noexcept { return type() == NodeType::kAlign; } + ASMJIT_INLINE_NODEBUG bool isAlign() const noexcept { return type() == NodeType::kAlign; } //! Tests whether this node is `EmbedDataNode`. - inline bool isEmbedData() const noexcept { return type() == NodeType::kEmbedData; } + ASMJIT_INLINE_NODEBUG bool isEmbedData() const noexcept { return type() == NodeType::kEmbedData; } //! Tests whether this node is `EmbedLabelNode`. - inline bool isEmbedLabel() const noexcept { return type() == NodeType::kEmbedLabel; } + ASMJIT_INLINE_NODEBUG bool isEmbedLabel() const noexcept { return type() == NodeType::kEmbedLabel; } //! Tests whether this node is `EmbedLabelDeltaNode`. - inline bool isEmbedLabelDelta() const noexcept { return type() == NodeType::kEmbedLabelDelta; } + ASMJIT_INLINE_NODEBUG bool isEmbedLabelDelta() const noexcept { return type() == NodeType::kEmbedLabelDelta; } //! Tests whether this node is `ConstPoolNode`. - inline bool isConstPool() const noexcept { return type() == NodeType::kConstPool; } + ASMJIT_INLINE_NODEBUG bool isConstPool() const noexcept { return type() == NodeType::kConstPool; } //! Tests whether this node is `CommentNode`. - inline bool isComment() const noexcept { return type() == NodeType::kComment; } + ASMJIT_INLINE_NODEBUG bool isComment() const noexcept { return type() == NodeType::kComment; } //! Tests whether this node is `SentinelNode`. - inline bool isSentinel() const noexcept { return type() == NodeType::kSentinel; } + ASMJIT_INLINE_NODEBUG bool isSentinel() const noexcept { return type() == NodeType::kSentinel; } //! Tests whether this node is `FuncNode`. - inline bool isFunc() const noexcept { return type() == NodeType::kFunc; } + ASMJIT_INLINE_NODEBUG bool isFunc() const noexcept { return type() == NodeType::kFunc; } //! Tests whether this node is `FuncRetNode`. - inline bool isFuncRet() const noexcept { return type() == NodeType::kFuncRet; } + ASMJIT_INLINE_NODEBUG bool isFuncRet() const noexcept { return type() == NodeType::kFuncRet; } //! Tests whether this node is `InvokeNode`. - inline bool isInvoke() const noexcept { return type() == NodeType::kInvoke; } + ASMJIT_INLINE_NODEBUG bool isInvoke() const noexcept { return type() == NodeType::kInvoke; } //! Returns the node flags. - inline NodeFlags flags() const noexcept { return _any._nodeFlags; } + ASMJIT_INLINE_NODEBUG NodeFlags flags() const noexcept { return _any._nodeFlags; } //! Tests whether the node has the given `flag` set. - inline bool hasFlag(NodeFlags flag) const noexcept { return Support::test(_any._nodeFlags, flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(NodeFlags flag) const noexcept { return Support::test(_any._nodeFlags, flag); } //! Replaces node flags with `flags`. - inline void setFlags(NodeFlags flags) noexcept { _any._nodeFlags = flags; } + ASMJIT_INLINE_NODEBUG void setFlags(NodeFlags flags) noexcept { _any._nodeFlags = flags; } //! Adds the given `flags` to node flags. - inline void addFlags(NodeFlags flags) noexcept { _any._nodeFlags |= flags; } + ASMJIT_INLINE_NODEBUG void addFlags(NodeFlags flags) noexcept { _any._nodeFlags |= flags; } //! Clears the given `flags` from node flags. - inline void clearFlags(NodeFlags flags) noexcept { _any._nodeFlags &= ~flags; } + ASMJIT_INLINE_NODEBUG void clearFlags(NodeFlags flags) noexcept { _any._nodeFlags &= ~flags; } //! Tests whether the node is code that can be executed. - inline bool isCode() const noexcept { return hasFlag(NodeFlags::kIsCode); } + ASMJIT_INLINE_NODEBUG bool isCode() const noexcept { return hasFlag(NodeFlags::kIsCode); } //! Tests whether the node is data that cannot be executed. - inline bool isData() const noexcept { return hasFlag(NodeFlags::kIsData); } + ASMJIT_INLINE_NODEBUG bool isData() const noexcept { return hasFlag(NodeFlags::kIsData); } //! Tests whether the node is informative only (is never encoded like comment, etc...). - inline bool isInformative() const noexcept { return hasFlag(NodeFlags::kIsInformative); } + ASMJIT_INLINE_NODEBUG bool isInformative() const noexcept { return hasFlag(NodeFlags::kIsInformative); } //! Tests whether the node is removable if it's in an unreachable code block. - inline bool isRemovable() const noexcept { return hasFlag(NodeFlags::kIsRemovable); } + ASMJIT_INLINE_NODEBUG bool isRemovable() const noexcept { return hasFlag(NodeFlags::kIsRemovable); } //! Tests whether the node has no effect when executed (label, .align, nop, ...). - inline bool hasNoEffect() const noexcept { return hasFlag(NodeFlags::kHasNoEffect); } + ASMJIT_INLINE_NODEBUG bool hasNoEffect() const noexcept { return hasFlag(NodeFlags::kHasNoEffect); } //! Tests whether the node is part of the code. - inline bool isActive() const noexcept { return hasFlag(NodeFlags::kIsActive); } + ASMJIT_INLINE_NODEBUG bool isActive() const noexcept { return hasFlag(NodeFlags::kIsActive); } //! Tests whether the node has a position assigned. //! //! \remarks Returns `true` if node position is non-zero. - inline bool hasPosition() const noexcept { return _position != 0; } + ASMJIT_INLINE_NODEBUG bool hasPosition() const noexcept { return _position != 0; } //! Returns node position. - inline uint32_t position() const noexcept { return _position; } + ASMJIT_INLINE_NODEBUG uint32_t position() const noexcept { return _position; } //! Sets node position. //! //! Node position is a 32-bit unsigned integer that is used by Compiler to track where the node is relatively to @@ -636,49 +691,50 @@ class BaseNode { //! //! If you don't use Compiler then you may use `position()` and `setPosition()` freely for your own purposes if //! the 32-bit value limit is okay for you. - inline void setPosition(uint32_t position) noexcept { _position = position; } + ASMJIT_INLINE_NODEBUG void setPosition(uint32_t position) noexcept { _position = position; } //! Returns user data casted to `T*`. //! - //! User data is decicated to be used only by AsmJit users and not touched by the library. The data has a pointer - //! size so you can either store a pointer or `intptr_t` value through `setUserDataAsIntPtr()`. + //! User data is dedicated to be used only by AsmJit users and not touched by the library. The data is of a pointer + //! size so you can either store a pointer or `int64_t` value through `setUserDataAsPtr()`, `setUserDataAsInt64()` + //! and `setUserDataAsUInt64()`. template - inline T* userDataAsPtr() const noexcept { return static_cast(_userDataPtr); } + ASMJIT_INLINE_NODEBUG T* userDataAsPtr() const noexcept { return static_cast(_userDataPtr); } //! Returns user data casted to `int64_t`. - inline int64_t userDataAsInt64() const noexcept { return int64_t(_userDataU64); } + ASMJIT_INLINE_NODEBUG int64_t userDataAsInt64() const noexcept { return int64_t(_userDataU64); } //! Returns user data casted to `uint64_t`. - inline uint64_t userDataAsUInt64() const noexcept { return _userDataU64; } + ASMJIT_INLINE_NODEBUG uint64_t userDataAsUInt64() const noexcept { return _userDataU64; } //! Sets user data to `data`. template - inline void setUserDataAsPtr(T* data) noexcept { _userDataPtr = static_cast(data); } + ASMJIT_INLINE_NODEBUG void setUserDataAsPtr(T* data) noexcept { _userDataPtr = static_cast(data); } //! Sets used data to the given 64-bit signed `value`. - inline void setUserDataAsInt64(int64_t value) noexcept { _userDataU64 = uint64_t(value); } + ASMJIT_INLINE_NODEBUG void setUserDataAsInt64(int64_t value) noexcept { _userDataU64 = uint64_t(value); } //! Sets used data to the given 64-bit unsigned `value`. - inline void setUserDataAsUInt64(uint64_t value) noexcept { _userDataU64 = value; } + ASMJIT_INLINE_NODEBUG void setUserDataAsUInt64(uint64_t value) noexcept { _userDataU64 = value; } //! Resets user data to zero / nullptr. - inline void resetUserData() noexcept { _userDataU64 = 0; } + ASMJIT_INLINE_NODEBUG void resetUserData() noexcept { _userDataU64 = 0; } //! Tests whether the node has an associated pass data. - inline bool hasPassData() const noexcept { return _passData != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasPassData() const noexcept { return _passData != nullptr; } //! Returns the node pass data - data used during processing & transformations. template - inline T* passData() const noexcept { return (T*)_passData; } + ASMJIT_INLINE_NODEBUG T* passData() const noexcept { return (T*)_passData; } //! Sets the node pass data to `data`. template - inline void setPassData(T* data) noexcept { _passData = (void*)data; } + ASMJIT_INLINE_NODEBUG void setPassData(T* data) noexcept { _passData = (void*)data; } //! Resets the node pass data to nullptr. - inline void resetPassData() noexcept { _passData = nullptr; } + ASMJIT_INLINE_NODEBUG void resetPassData() noexcept { _passData = nullptr; } //! Tests whether the node has an inline comment/annotation. - inline bool hasInlineComment() const noexcept { return _inlineComment != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasInlineComment() const noexcept { return _inlineComment != nullptr; } //! Returns an inline comment/annotation string. - inline const char* inlineComment() const noexcept { return _inlineComment; } + ASMJIT_INLINE_NODEBUG const char* inlineComment() const noexcept { return _inlineComment; } //! Sets an inline comment/annotation string to `s`. - inline void setInlineComment(const char* s) noexcept { _inlineComment = s; } + ASMJIT_INLINE_NODEBUG void setInlineComment(const char* s) noexcept { _inlineComment = s; } //! Resets an inline comment/annotation string to nullptr. - inline void resetInlineComment() noexcept { _inlineComment = nullptr; } + ASMJIT_INLINE_NODEBUG void resetInlineComment() noexcept { _inlineComment = nullptr; } //! \} }; @@ -693,12 +749,15 @@ class InstNode : public BaseNode { //! \name Constants //! \{ - enum : uint32_t { - //! Count of embedded operands per `InstNode` that are always allocated as a part of the instruction. Minimum - //! embedded operands is 4, but in 32-bit more pointers are smaller and we can embed 5. The rest (up to 6 operands) - //! is always stored in `InstExNode`. - kBaseOpCapacity = uint32_t((128 - sizeof(BaseNode) - sizeof(BaseInst)) / sizeof(Operand_)) - }; + //! The number of embedded operands for a default \ref InstNode instance that are always allocated as a part of + //! the instruction itself. Minimum embedded operands is 4, but in 32-bit more pointers are smaller and we can + //! embed 5. The rest (up to 6 operands) is considered extended. + //! + //! The number of operands InstNode holds is decided when \ref InstNode is created. + static constexpr uint32_t kBaseOpCapacity = uint32_t((128 - sizeof(BaseNode) - sizeof(BaseInst)) / sizeof(Operand_)); + + //! Count of maximum number of operands \ref InstNode can hold. + static constexpr uint32_t kFullOpCapacity = Globals::kMaxOpCount; //! \} @@ -707,8 +766,6 @@ class InstNode : public BaseNode { //! Base instruction data. BaseInst _baseInst; - //! First 4 or 5 operands (indexed from 0). - Operand_ _opArray[kBaseOpCapacity]; //! \} @@ -716,7 +773,7 @@ class InstNode : public BaseNode { //! \{ //! Creates a new `InstNode` instance. - inline InstNode(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCount, uint32_t opCapacity = kBaseOpCapacity) noexcept + ASMJIT_INLINE_NODEBUG InstNode(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCount, uint32_t opCapacity = kBaseOpCapacity) noexcept : BaseNode(cb, NodeType::kInst, NodeFlags::kIsCode | NodeFlags::kIsRemovable | NodeFlags::kActsAsInst), _baseInst(instId, options) { _inst._opCapacity = uint8_t(opCapacity); @@ -725,7 +782,7 @@ class InstNode : public BaseNode { //! \cond INTERNAL //! Reset all built-in operands, including `extraReg`. - inline void _resetOps() noexcept { + ASMJIT_INLINE_NODEBUG void _resetOps() noexcept { _baseInst.resetExtraReg(); resetOpRange(0, opCapacity()); } @@ -736,8 +793,8 @@ class InstNode : public BaseNode { //! \name Instruction Object //! \{ - inline BaseInst& baseInst() noexcept { return _baseInst; } - inline const BaseInst& baseInst() const noexcept { return _baseInst; } + ASMJIT_INLINE_NODEBUG BaseInst& baseInst() noexcept { return _baseInst; } + ASMJIT_INLINE_NODEBUG const BaseInst& baseInst() const noexcept { return _baseInst; } //! \} @@ -745,24 +802,30 @@ class InstNode : public BaseNode { //! \{ //! Returns the instruction id, see `BaseInst::Id`. - inline InstId id() const noexcept { return _baseInst.id(); } + ASMJIT_INLINE_NODEBUG InstId id() const noexcept { return _baseInst.id(); } //! Returns the instruction real id, see `BaseInst::Id`. - inline InstId realId() const noexcept { return _baseInst.realId(); } + ASMJIT_INLINE_NODEBUG InstId realId() const noexcept { return _baseInst.realId(); } //! Sets the instruction id to `id`, see `BaseInst::Id`. - inline void setId(InstId id) noexcept { _baseInst.setId(id); } + ASMJIT_INLINE_NODEBUG void setId(InstId id) noexcept { _baseInst.setId(id); } //! \} //! \name Instruction Options //! \{ - inline InstOptions options() const noexcept { return _baseInst.options(); } - inline bool hasOption(InstOptions option) const noexcept { return _baseInst.hasOption(option); } - inline void setOptions(InstOptions options) noexcept { _baseInst.setOptions(options); } - inline void addOptions(InstOptions options) noexcept { _baseInst.addOptions(options); } - inline void clearOptions(InstOptions options) noexcept { _baseInst.clearOptions(options); } - inline void resetOptions() noexcept { _baseInst.resetOptions(); } + //! Returns instruction options, see \ref InstOptions for more details. + ASMJIT_INLINE_NODEBUG InstOptions options() const noexcept { return _baseInst.options(); } + //! Tests whether instruction has the given \option` set/enabled. + ASMJIT_INLINE_NODEBUG bool hasOption(InstOptions option) const noexcept { return _baseInst.hasOption(option); } + //! Sets instruction `options` to the provided value, resetting all others. + ASMJIT_INLINE_NODEBUG void setOptions(InstOptions options) noexcept { _baseInst.setOptions(options); } + //! Adds instruction `options` to the instruction. + ASMJIT_INLINE_NODEBUG void addOptions(InstOptions options) noexcept { _baseInst.addOptions(options); } + //! Clears instruction `options` of the instruction (disables the given options). + ASMJIT_INLINE_NODEBUG void clearOptions(InstOptions options) noexcept { _baseInst.clearOptions(options); } + //! Resets instruction options to none - disabling all instruction options. + ASMJIT_INLINE_NODEBUG void resetOptions() noexcept { _baseInst.resetOptions(); } //! \} @@ -770,17 +833,17 @@ class InstNode : public BaseNode { //! \{ //! Tests whether the node has an extra register operand. - inline bool hasExtraReg() const noexcept { return _baseInst.hasExtraReg(); } + ASMJIT_INLINE_NODEBUG bool hasExtraReg() const noexcept { return _baseInst.hasExtraReg(); } //! Returns extra register operand. - inline RegOnly& extraReg() noexcept { return _baseInst.extraReg(); } + ASMJIT_INLINE_NODEBUG RegOnly& extraReg() noexcept { return _baseInst.extraReg(); } //! \overload - inline const RegOnly& extraReg() const noexcept { return _baseInst.extraReg(); } + ASMJIT_INLINE_NODEBUG const RegOnly& extraReg() const noexcept { return _baseInst.extraReg(); } //! Sets extra register operand to `reg`. - inline void setExtraReg(const BaseReg& reg) noexcept { _baseInst.setExtraReg(reg); } + ASMJIT_INLINE_NODEBUG void setExtraReg(const BaseReg& reg) noexcept { _baseInst.setExtraReg(reg); } //! Sets extra register operand to `reg`. - inline void setExtraReg(const RegOnly& reg) noexcept { _baseInst.setExtraReg(reg); } + ASMJIT_INLINE_NODEBUG void setExtraReg(const RegOnly& reg) noexcept { _baseInst.setExtraReg(reg); } //! Resets extra register operand. - inline void resetExtraReg() noexcept { _baseInst.resetExtraReg(); } + ASMJIT_INLINE_NODEBUG void resetExtraReg() noexcept { _baseInst.resetExtraReg(); } //! \} @@ -788,46 +851,60 @@ class InstNode : public BaseNode { //! \{ //! Returns operand count. - inline uint32_t opCount() const noexcept { return _inst._opCount; } + ASMJIT_INLINE_NODEBUG uint32_t opCount() const noexcept { return _inst._opCount; } //! Returns operand capacity. - inline uint32_t opCapacity() const noexcept { return _inst._opCapacity; } + ASMJIT_INLINE_NODEBUG uint32_t opCapacity() const noexcept { return _inst._opCapacity; } //! Sets operand count. - inline void setOpCount(uint32_t opCount) noexcept { _inst._opCount = uint8_t(opCount); } + ASMJIT_INLINE_NODEBUG void setOpCount(uint32_t opCount) noexcept { _inst._opCount = uint8_t(opCount); } //! Returns operands array. - inline Operand* operands() noexcept { return (Operand*)_opArray; } + ASMJIT_INLINE_NODEBUG Operand* operands() noexcept { + return reinterpret_cast(reinterpret_cast(this) + sizeof(InstNode)); + } + //! Returns operands array (const). - inline const Operand* operands() const noexcept { return (const Operand*)_opArray; } + ASMJIT_INLINE_NODEBUG const Operand* operands() const noexcept { + return reinterpret_cast(reinterpret_cast(this) + sizeof(InstNode)); + } //! Returns operand at the given `index`. inline Operand& op(uint32_t index) noexcept { ASMJIT_ASSERT(index < opCapacity()); - return _opArray[index].as(); + + Operand* ops = operands(); + return ops[index].as(); } //! Returns operand at the given `index` (const). inline const Operand& op(uint32_t index) const noexcept { ASMJIT_ASSERT(index < opCapacity()); - return _opArray[index].as(); + + const Operand* ops = operands(); + return ops[index].as(); } //! Sets operand at the given `index` to `op`. inline void setOp(uint32_t index, const Operand_& op) noexcept { ASMJIT_ASSERT(index < opCapacity()); - _opArray[index].copyFrom(op); + + Operand* ops = operands(); + ops[index].copyFrom(op); } //! Resets operand at the given `index` to none. inline void resetOp(uint32_t index) noexcept { ASMJIT_ASSERT(index < opCapacity()); - _opArray[index].reset(); + + Operand* ops = operands(); + ops[index].reset(); } //! Resets operands at `[start, end)` range. inline void resetOpRange(uint32_t start, uint32_t end) noexcept { + Operand* ops = operands(); for (uint32_t i = start; i < end; i++) - _opArray[i].reset(); + ops[i].reset(); } //! \} @@ -835,33 +912,47 @@ class InstNode : public BaseNode { //! \name Utilities //! \{ + //! Tests whether the given operand type `opType` is used by the instruction. inline bool hasOpType(OperandType opType) const noexcept { + const Operand* ops = operands(); for (uint32_t i = 0, count = opCount(); i < count; i++) - if (_opArray[i].opType() == opType) + if (ops[i].opType() == opType) return true; return false; } + //! Tests whether the instruction uses at least one register operand. inline bool hasRegOp() const noexcept { return hasOpType(OperandType::kReg); } + //! Tests whether the instruction uses at least one memory operand. inline bool hasMemOp() const noexcept { return hasOpType(OperandType::kMem); } + //! Tests whether the instruction uses at least one immediate operand. inline bool hasImmOp() const noexcept { return hasOpType(OperandType::kImm); } + //! Tests whether the instruction uses at least one label operand. inline bool hasLabelOp() const noexcept { return hasOpType(OperandType::kLabel); } + //! Returns the index of the given operand type `opType`. + //! + //! \note If the operand type wa found, the value returned represents its index in \ref operands() + //! array, otherwise \ref Globals::kNotFound is returned to signalize that the operand was not found. inline uint32_t indexOfOpType(OperandType opType) const noexcept { uint32_t i = 0; uint32_t count = opCount(); + const Operand* ops = operands(); while (i < count) { - if (_opArray[i].opType() == opType) - break; + if (ops[i].opType() == opType) + return i; i++; } - return i; + return Globals::kNotFound; } + //! A shortcut that calls `indexOfOpType(OperandType::kMem)`. inline uint32_t indexOfMemOp() const noexcept { return indexOfOpType(OperandType::kMem); } + //! A shortcut that calls `indexOfOpType(OperandType::kImm)`. inline uint32_t indexOfImmOp() const noexcept { return indexOfOpType(OperandType::kImm); } + //! A shortcut that calls `indexOfOpType(OperandType::kLabel)`. inline uint32_t indexOfLabelOp() const noexcept { return indexOfOpType(OperandType::kLabel); } //! \} @@ -870,20 +961,40 @@ class InstNode : public BaseNode { //! \{ //! \cond INTERNAL - inline uint32_t* _getRewriteArray() noexcept { return &_baseInst._extraReg._id; } - inline const uint32_t* _getRewriteArray() const noexcept { return &_baseInst._extraReg._id; } + //! Returns uint32_t[] view that represents BaseInst::RegOnly and instruction operands. + ASMJIT_INLINE_NODEBUG uint32_t* _getRewriteArray() noexcept { return &_baseInst._extraReg._id; } + //! \overload + ASMJIT_INLINE_NODEBUG const uint32_t* _getRewriteArray() const noexcept { return &_baseInst._extraReg._id; } + + //! Maximum value of rewrite id - 6 operands each having 4 slots is 24, one RegOnly having 2 slots => 26. + static constexpr uint32_t kMaxRewriteId = 26 - 1; + + //! Returns a rewrite index of the given pointer to `id`. + //! + //! This function returns a value that can be then passed to `\ref rewriteIdAtIndex() function. It can address + //! any id from any operand that is used by the instruction in addition to \ref BaseInst::regOnly field, which + //! can also be used by the register allocator. inline uint32_t getRewriteIndex(const uint32_t* id) const noexcept { const uint32_t* array = _getRewriteArray(); ASMJIT_ASSERT(array <= id); size_t index = (size_t)(id - array); - ASMJIT_ASSERT(index < 32); + ASMJIT_ASSERT(index <= kMaxRewriteId); return uint32_t(index); } + //! Rewrites the given `index` to the provided identifier `id`. + //! + //! \note This is an internal function that is used by a \ref BaseCompiler implementation to rewrite virtual + //! registers to physical registers. The rewriter in this case sees all operands as array of uint32 values + //! and the given `index` describes a position in this array. For example a single \ref Operand would be + //! decomposed to 4 uint32_t values, where the first at index 0 would be operand signature, next would be + //! base id, etc... This is a comfortable way of patching operands without having to check for their types. inline void rewriteIdAtIndex(uint32_t index, uint32_t id) noexcept { + ASMJIT_ASSERT(index <= kMaxRewriteId); + uint32_t* array = _getRewriteArray(); array[index] = id; } @@ -895,43 +1006,40 @@ class InstNode : public BaseNode { //! \{ //! \cond INTERNAL - static inline uint32_t capacityOfOpCount(uint32_t opCount) noexcept { - return opCount <= kBaseOpCapacity ? kBaseOpCapacity : Globals::kMaxOpCount; + + //! Returns the capacity required for the given operands count `opCount`. + //! + //! There are only two capacities used - \ref kBaseOpCapacity and \ref kFullOpCapacity, so this function + //! is used to decide between these two. The general rule is that instructions that can be represented with + //! \ref kBaseOpCapacity would use this value, and all others would take \ref kFullOpCapacity. + static ASMJIT_INLINE_NODEBUG constexpr uint32_t capacityOfOpCount(uint32_t opCount) noexcept { + return opCount <= kBaseOpCapacity ? kBaseOpCapacity : kFullOpCapacity; } - static inline size_t nodeSizeOfOpCapacity(uint32_t opCapacity) noexcept { - size_t base = sizeof(InstNode) - kBaseOpCapacity * sizeof(Operand); - return base + opCapacity * sizeof(Operand); + //! Calculates the size of \ref InstNode required to hold at most `opCapacity` operands. + //! + //! This function is used internally to allocate \ref InstNode. + static ASMJIT_INLINE_NODEBUG constexpr size_t nodeSizeOfOpCapacity(uint32_t opCapacity) noexcept { + return sizeof(InstNode) + opCapacity * sizeof(Operand); } //! \endcond //! \} }; -//! Instruction node with maximum number of operands. +//! Instruction node with embedded operands following \ref InstNode layout. //! -//! This node is created automatically by Builder/Compiler in case that the required number of operands exceeds -//! the default capacity of `InstNode`. -class InstExNode : public InstNode { +//! \note This is used to make tools such as static analysis and compilers happy about the layout. There were two +//! instruction nodes in the past, having the second extend the operand array of the first, but that has caused +//! undefined behavior and made recent tools unhappy about that. +template +class InstNodeWithOperands : public InstNode { public: - ASMJIT_NONCOPYABLE(InstExNode) - - //! \name Members - //! \{ + Operand_ _operands[kN]; - //! Continued `_opArray[]` to hold up to `kMaxOpCount` operands. - Operand_ _opArrayEx[Globals::kMaxOpCount - kBaseOpCapacity]; - - //! \} - - //! \name Construction & Destruction - //! \{ - - //! Creates a new `InstExNode` instance. - inline InstExNode(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCapacity = Globals::kMaxOpCount) noexcept - : InstNode(cb, instId, options, opCapacity) {} - - //! \} + //! Creates a new `InstNodeWithOperands` instance. + ASMJIT_INLINE_NODEBUG InstNodeWithOperands(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCount) noexcept + : InstNode(cb, instId, options, opCount, kN) {} }; //! Section node. @@ -958,9 +1066,9 @@ class SectionNode : public BaseNode { //! \{ //! Creates a new `SectionNode` instance. - inline SectionNode(BaseBuilder* cb, uint32_t secionId = 0) noexcept + ASMJIT_INLINE_NODEBUG SectionNode(BaseBuilder* cb, uint32_t sectionId = 0) noexcept : BaseNode(cb, NodeType::kSection, NodeFlags::kHasNoEffect), - _id(secionId), + _id(sectionId), _nextSection(nullptr) {} //! \} @@ -969,7 +1077,7 @@ class SectionNode : public BaseNode { //! \{ //! Returns the section id. - inline uint32_t id() const noexcept { return _id; } + ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; } //! \} }; @@ -991,7 +1099,7 @@ class LabelNode : public BaseNode { //! \{ //! Creates a new `LabelNode` instance. - inline LabelNode(BaseBuilder* cb, uint32_t labelId = 0) noexcept + ASMJIT_INLINE_NODEBUG LabelNode(BaseBuilder* cb, uint32_t labelId = 0) noexcept : BaseNode(cb, NodeType::kLabel, NodeFlags::kHasNoEffect | NodeFlags::kActsAsLabel), _labelId(labelId) {} @@ -1001,9 +1109,9 @@ class LabelNode : public BaseNode { //! \{ //! Returns \ref Label representation of the \ref LabelNode. - inline Label label() const noexcept { return Label(_labelId); } + ASMJIT_INLINE_NODEBUG Label label() const noexcept { return Label(_labelId); } //! Returns the id of the label. - inline uint32_t labelId() const noexcept { return _labelId; } + ASMJIT_INLINE_NODEBUG uint32_t labelId() const noexcept { return _labelId; } //! \} }; @@ -1027,7 +1135,7 @@ class AlignNode : public BaseNode { //! \{ //! Creates a new `AlignNode` instance. - inline AlignNode(BaseBuilder* cb, AlignMode alignMode, uint32_t alignment) noexcept + ASMJIT_INLINE_NODEBUG AlignNode(BaseBuilder* cb, AlignMode alignMode, uint32_t alignment) noexcept : BaseNode(cb, NodeType::kAlign, NodeFlags::kIsCode | NodeFlags::kHasNoEffect) { _alignData._alignMode = alignMode; @@ -1040,14 +1148,14 @@ class AlignNode : public BaseNode { //! \{ //! Returns align mode. - inline AlignMode alignMode() const noexcept { return _alignData._alignMode; } + ASMJIT_INLINE_NODEBUG AlignMode alignMode() const noexcept { return _alignData._alignMode; } //! Sets align mode to `alignMode`. - inline void setAlignMode(AlignMode alignMode) noexcept { _alignData._alignMode = alignMode; } + ASMJIT_INLINE_NODEBUG void setAlignMode(AlignMode alignMode) noexcept { _alignData._alignMode = alignMode; } //! Returns align offset in bytes. - inline uint32_t alignment() const noexcept { return _alignment; } + ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; } //! Sets align offset in bytes to `offset`. - inline void setAlignment(uint32_t alignment) noexcept { _alignment = alignment; } + ASMJIT_INLINE_NODEBUG void setAlignment(uint32_t alignment) noexcept { _alignment = alignment; } //! \} }; @@ -1083,7 +1191,7 @@ class EmbedDataNode : public BaseNode { //! \{ //! Creates a new `EmbedDataNode` instance. - inline EmbedDataNode(BaseBuilder* cb) noexcept + ASMJIT_INLINE_NODEBUG EmbedDataNode(BaseBuilder* cb) noexcept : BaseNode(cb, NodeType::kEmbedData, NodeFlags::kIsData), _itemCount(0), _repeatCount(0) { @@ -1098,31 +1206,31 @@ class EmbedDataNode : public BaseNode { //! \{ //! Returns data type as \ref TypeId. - inline TypeId typeId() const noexcept { return _embed._typeId; } + ASMJIT_INLINE_NODEBUG TypeId typeId() const noexcept { return _embed._typeId; } //! Returns the size of a single data element. - inline uint32_t typeSize() const noexcept { return _embed._typeSize; } + ASMJIT_INLINE_NODEBUG uint32_t typeSize() const noexcept { return _embed._typeSize; } //! Returns a pointer to the data casted to `uint8_t`. - inline uint8_t* data() const noexcept { + ASMJIT_INLINE_NODEBUG uint8_t* data() const noexcept { return dataSize() <= kInlineBufferSize ? const_cast(_inlineData) : _externalData; } //! Returns a pointer to the data casted to `T`. template - inline T* dataAs() const noexcept { return reinterpret_cast(data()); } + ASMJIT_INLINE_NODEBUG T* dataAs() const noexcept { return reinterpret_cast(data()); } //! Returns the number of (typed) items in the array. - inline size_t itemCount() const noexcept { return _itemCount; } + ASMJIT_INLINE_NODEBUG size_t itemCount() const noexcept { return _itemCount; } //! Returns how many times the data is repeated (default 1). //! //! Repeated data is useful when defining constants for SIMD, for example. - inline size_t repeatCount() const noexcept { return _repeatCount; } + ASMJIT_INLINE_NODEBUG size_t repeatCount() const noexcept { return _repeatCount; } //! Returns the size of the data, not considering the number of times it repeats. //! //! \note The returned value is the same as `typeSize() * itemCount()`. - inline size_t dataSize() const noexcept { return typeSize() * _itemCount; } + ASMJIT_INLINE_NODEBUG size_t dataSize() const noexcept { return typeSize() * _itemCount; } //! \} }; @@ -1144,7 +1252,7 @@ class EmbedLabelNode : public BaseNode { //! \{ //! Creates a new `EmbedLabelNode` instance. - inline EmbedLabelNode(BaseBuilder* cb, uint32_t labelId = 0, uint32_t dataSize = 0) noexcept + ASMJIT_INLINE_NODEBUG EmbedLabelNode(BaseBuilder* cb, uint32_t labelId = 0, uint32_t dataSize = 0) noexcept : BaseNode(cb, NodeType::kEmbedLabel, NodeFlags::kIsData), _labelId(labelId), _dataSize(dataSize) {} @@ -1155,19 +1263,19 @@ class EmbedLabelNode : public BaseNode { //! \{ //! Returns the label to embed as \ref Label operand. - inline Label label() const noexcept { return Label(_labelId); } + ASMJIT_INLINE_NODEBUG Label label() const noexcept { return Label(_labelId); } //! Returns the id of the label. - inline uint32_t labelId() const noexcept { return _labelId; } + ASMJIT_INLINE_NODEBUG uint32_t labelId() const noexcept { return _labelId; } //! Sets the label id from `label` operand. - inline void setLabel(const Label& label) noexcept { setLabelId(label.id()); } + ASMJIT_INLINE_NODEBUG void setLabel(const Label& label) noexcept { setLabelId(label.id()); } //! Sets the label id (use with caution, improper use can break a lot of things). - inline void setLabelId(uint32_t labelId) noexcept { _labelId = labelId; } + ASMJIT_INLINE_NODEBUG void setLabelId(uint32_t labelId) noexcept { _labelId = labelId; } //! Returns the data size. - inline uint32_t dataSize() const noexcept { return _dataSize; } + ASMJIT_INLINE_NODEBUG uint32_t dataSize() const noexcept { return _dataSize; } //! Sets the data size. - inline void setDataSize(uint32_t dataSize) noexcept { _dataSize = dataSize; } + ASMJIT_INLINE_NODEBUG void setDataSize(uint32_t dataSize) noexcept { _dataSize = dataSize; } //! \} }; @@ -1190,7 +1298,7 @@ class EmbedLabelDeltaNode : public BaseNode { //! \{ //! Creates a new `EmbedLabelDeltaNode` instance. - inline EmbedLabelDeltaNode(BaseBuilder* cb, uint32_t labelId = 0, uint32_t baseLabelId = 0, uint32_t dataSize = 0) noexcept + ASMJIT_INLINE_NODEBUG EmbedLabelDeltaNode(BaseBuilder* cb, uint32_t labelId = 0, uint32_t baseLabelId = 0, uint32_t dataSize = 0) noexcept : BaseNode(cb, NodeType::kEmbedLabelDelta, NodeFlags::kIsData), _labelId(labelId), _baseLabelId(baseLabelId), @@ -1202,29 +1310,29 @@ class EmbedLabelDeltaNode : public BaseNode { //! \{ //! Returns the label as `Label` operand. - inline Label label() const noexcept { return Label(_labelId); } + ASMJIT_INLINE_NODEBUG Label label() const noexcept { return Label(_labelId); } //! Returns the id of the label. - inline uint32_t labelId() const noexcept { return _labelId; } + ASMJIT_INLINE_NODEBUG uint32_t labelId() const noexcept { return _labelId; } //! Sets the label id from `label` operand. - inline void setLabel(const Label& label) noexcept { setLabelId(label.id()); } + ASMJIT_INLINE_NODEBUG void setLabel(const Label& label) noexcept { setLabelId(label.id()); } //! Sets the label id. - inline void setLabelId(uint32_t labelId) noexcept { _labelId = labelId; } + ASMJIT_INLINE_NODEBUG void setLabelId(uint32_t labelId) noexcept { _labelId = labelId; } //! Returns the base label as `Label` operand. - inline Label baseLabel() const noexcept { return Label(_baseLabelId); } + ASMJIT_INLINE_NODEBUG Label baseLabel() const noexcept { return Label(_baseLabelId); } //! Returns the id of the base label. - inline uint32_t baseLabelId() const noexcept { return _baseLabelId; } + ASMJIT_INLINE_NODEBUG uint32_t baseLabelId() const noexcept { return _baseLabelId; } //! Sets the base label id from `label` operand. - inline void setBaseLabel(const Label& baseLabel) noexcept { setBaseLabelId(baseLabel.id()); } + ASMJIT_INLINE_NODEBUG void setBaseLabel(const Label& baseLabel) noexcept { setBaseLabelId(baseLabel.id()); } //! Sets the base label id. - inline void setBaseLabelId(uint32_t baseLabelId) noexcept { _baseLabelId = baseLabelId; } + ASMJIT_INLINE_NODEBUG void setBaseLabelId(uint32_t baseLabelId) noexcept { _baseLabelId = baseLabelId; } //! Returns the size of the embedded label address. - inline uint32_t dataSize() const noexcept { return _dataSize; } + ASMJIT_INLINE_NODEBUG uint32_t dataSize() const noexcept { return _dataSize; } //! Sets the size of the embedded label address. - inline void setDataSize(uint32_t dataSize) noexcept { _dataSize = dataSize; } + ASMJIT_INLINE_NODEBUG void setDataSize(uint32_t dataSize) noexcept { _dataSize = dataSize; } //! \} }; @@ -1245,7 +1353,7 @@ class ConstPoolNode : public LabelNode { //! \{ //! Creates a new `ConstPoolNode` instance. - inline ConstPoolNode(BaseBuilder* cb, uint32_t id = 0) noexcept + ASMJIT_INLINE_NODEBUG ConstPoolNode(BaseBuilder* cb, uint32_t id = 0) noexcept : LabelNode(cb, id), _constPool(&cb->_codeZone) { @@ -1260,16 +1368,16 @@ class ConstPoolNode : public LabelNode { //! \{ //! Tests whether the constant-pool is empty. - inline bool empty() const noexcept { return _constPool.empty(); } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _constPool.empty(); } //! Returns the size of the constant-pool in bytes. - inline size_t size() const noexcept { return _constPool.size(); } + ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _constPool.size(); } //! Returns minimum alignment. - inline size_t alignment() const noexcept { return _constPool.alignment(); } + ASMJIT_INLINE_NODEBUG size_t alignment() const noexcept { return _constPool.alignment(); } //! Returns the wrapped `ConstPool` instance. - inline ConstPool& constPool() noexcept { return _constPool; } + ASMJIT_INLINE_NODEBUG ConstPool& constPool() noexcept { return _constPool; } //! Returns the wrapped `ConstPool` instance (const). - inline const ConstPool& constPool() const noexcept { return _constPool; } + ASMJIT_INLINE_NODEBUG const ConstPool& constPool() const noexcept { return _constPool; } //! \} @@ -1277,7 +1385,7 @@ class ConstPoolNode : public LabelNode { //! \{ //! See `ConstPool::add()`. - inline Error add(const void* data, size_t size, size_t& dstOffset) noexcept { + ASMJIT_INLINE_NODEBUG Error add(const void* data, size_t size, size_t& dstOffset) noexcept { return _constPool.add(data, size, dstOffset); } @@ -1293,7 +1401,7 @@ class CommentNode : public BaseNode { //! \{ //! Creates a new `CommentNode` instance. - inline CommentNode(BaseBuilder* cb, const char* comment) noexcept + ASMJIT_INLINE_NODEBUG CommentNode(BaseBuilder* cb, const char* comment) noexcept : BaseNode(cb, NodeType::kComment, NodeFlags::kIsInformative | NodeFlags::kHasNoEffect | NodeFlags::kIsRemovable) { _inlineComment = comment; } @@ -1313,7 +1421,7 @@ class SentinelNode : public BaseNode { //! \{ //! Creates a new `SentinelNode` instance. - inline SentinelNode(BaseBuilder* cb, SentinelType sentinelType = SentinelType::kUnknown) noexcept + ASMJIT_INLINE_NODEBUG SentinelNode(BaseBuilder* cb, SentinelType sentinelType = SentinelType::kUnknown) noexcept : BaseNode(cb, NodeType::kSentinel, NodeFlags::kIsInformative | NodeFlags::kHasNoEffect) { _sentinel._sentinelType = sentinelType; @@ -1325,12 +1433,12 @@ class SentinelNode : public BaseNode { //! \{ //! Returns the type of the sentinel. - inline SentinelType sentinelType() const noexcept { + ASMJIT_INLINE_NODEBUG SentinelType sentinelType() const noexcept { return _sentinel._sentinelType; } //! Sets the type of the sentinel. - inline void setSentinelType(SentinelType type) noexcept { + ASMJIT_INLINE_NODEBUG void setSentinelType(SentinelType type) noexcept { _sentinel._sentinelType = type; } @@ -1365,9 +1473,9 @@ class ASMJIT_VIRTAPI Pass { //! \{ //! Returns \ref BaseBuilder associated with the pass. - inline const BaseBuilder* cb() const noexcept { return _cb; } + ASMJIT_INLINE_NODEBUG const BaseBuilder* cb() const noexcept { return _cb; } //! Returns the name of the pass. - inline const char* name() const noexcept { return _name; } + ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name; } //! \} @@ -1378,7 +1486,7 @@ class ASMJIT_VIRTAPI Pass { //! //! This is the only function that is called by the `BaseBuilder` to process the code. It passes `zone`, //! which will be reset after the `run()` finishes. - virtual Error run(Zone* zone, Logger* logger) = 0; + ASMJIT_API virtual Error run(Zone* zone, Logger* logger); //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/builder_p.h b/3rdparty/asmjit/src/asmjit/core/builder_p.h new file mode 100644 index 0000000000000..98790fdf95f5a --- /dev/null +++ b/3rdparty/asmjit/src/asmjit/core/builder_p.h @@ -0,0 +1,37 @@ +// This file is part of AsmJit project +// +// See asmjit.h or LICENSE.md for license and copyright information +// SPDX-License-Identifier: Zlib + +#ifndef ASMJIT_CORE_BUILDER_P_H_INCLUDED +#define ASMJIT_CORE_BUILDER_P_H_INCLUDED + +#include "../core/api-config.h" +#ifndef ASMJIT_NO_BUILDER + +#include "../core/builder.h" + +ASMJIT_BEGIN_NAMESPACE + +//! \cond INTERNAL +//! \addtogroup asmjit_builder +//! \{ + +static inline void BaseBuilder_assignInlineComment(BaseBuilder* self, BaseNode* node, const char* comment) noexcept { + if (comment) + node->setInlineComment(static_cast(self->_dataZone.dup(comment, strlen(comment), true))); +} + +static inline void BaseBuilder_assignInstState(BaseBuilder* self, InstNode* node, const BaseEmitter::State& state) noexcept { + node->setOptions(state.options); + node->setExtraReg(state.extraReg); + BaseBuilder_assignInlineComment(self, node, state.comment); +} + +//! \} +//! \endcond + +ASMJIT_END_NAMESPACE + +#endif // !ASMJIT_NO_BUILDER +#endif // ASMJIT_CORE_BUILDER_P_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/core/codebuffer.h b/3rdparty/asmjit/src/asmjit/core/codebuffer.h index 4946e7a06a13d..d4b7cebbcef40 100644 --- a/3rdparty/asmjit/src/asmjit/core/codebuffer.h +++ b/3rdparty/asmjit/src/asmjit/core/codebuffer.h @@ -44,7 +44,7 @@ struct CodeBuffer { //! \name Overloaded Operators //! \{ - //! Returns a referebce to the byte at the given `index`. + //! Returns a reference to the byte at the given `index`. inline uint8_t& operator[](size_t index) noexcept { ASMJIT_ASSERT(index < _size); return _data[index]; @@ -61,46 +61,46 @@ struct CodeBuffer { //! \{ //! Returns code buffer flags. - inline CodeBufferFlags flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG CodeBufferFlags flags() const noexcept { return _flags; } //! Tests whether the code buffer has the given `flag` set. - inline bool hasFlag(CodeBufferFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(CodeBufferFlags flag) const noexcept { return Support::test(_flags, flag); } //! Tests whether this code buffer has a fixed size. //! //! Fixed size means that the code buffer is fixed and cannot grow. - inline bool isFixed() const noexcept { return hasFlag(CodeBufferFlags::kIsFixed); } + ASMJIT_INLINE_NODEBUG bool isFixed() const noexcept { return hasFlag(CodeBufferFlags::kIsFixed); } //! Tests whether the data in this code buffer is external. //! //! External data can only be provided by users, it's never used by AsmJit. - inline bool isExternal() const noexcept { return hasFlag(CodeBufferFlags::kIsExternal); } + ASMJIT_INLINE_NODEBUG bool isExternal() const noexcept { return hasFlag(CodeBufferFlags::kIsExternal); } //! Tests whether the data in this code buffer is allocated (non-null). - inline bool isAllocated() const noexcept { return _data != nullptr; } + ASMJIT_INLINE_NODEBUG bool isAllocated() const noexcept { return _data != nullptr; } //! Tests whether the code buffer is empty. - inline bool empty() const noexcept { return !_size; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return !_size; } //! Returns the size of the data. - inline size_t size() const noexcept { return _size; } + ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; } //! Returns the capacity of the data. - inline size_t capacity() const noexcept { return _capacity; } + ASMJIT_INLINE_NODEBUG size_t capacity() const noexcept { return _capacity; } //! Returns the pointer to the data the buffer references. - inline uint8_t* data() noexcept { return _data; } + ASMJIT_INLINE_NODEBUG uint8_t* data() noexcept { return _data; } //! \overload - inline const uint8_t* data() const noexcept { return _data; } + ASMJIT_INLINE_NODEBUG const uint8_t* data() const noexcept { return _data; } //! \} //! \name Iterators //! \{ - inline uint8_t* begin() noexcept { return _data; } - inline const uint8_t* begin() const noexcept { return _data; } + ASMJIT_INLINE_NODEBUG uint8_t* begin() noexcept { return _data; } + ASMJIT_INLINE_NODEBUG const uint8_t* begin() const noexcept { return _data; } - inline uint8_t* end() noexcept { return _data + _size; } - inline const uint8_t* end() const noexcept { return _data + _size; } + ASMJIT_INLINE_NODEBUG uint8_t* end() noexcept { return _data + _size; } + ASMJIT_INLINE_NODEBUG const uint8_t* end() const noexcept { return _data + _size; } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/codeholder.cpp b/3rdparty/asmjit/src/asmjit/core/codeholder.cpp index cf763cfff120e..63b15a3ada32e 100644 --- a/3rdparty/asmjit/src/asmjit/core/codeholder.cpp +++ b/3rdparty/asmjit/src/asmjit/core/codeholder.cpp @@ -74,6 +74,7 @@ static void CodeHolder_resetInternal(CodeHolder* self, ResetPolicy resetPolicy) // Reset everything into its construction state. self->_environment.reset(); + self->_cpuFeatures.reset(); self->_baseAddress = Globals::kNoBaseAddress; self->_logger = nullptr; self->_errorHandler = nullptr; @@ -118,6 +119,7 @@ static void CodeHolder_onSettingsUpdated(CodeHolder* self) noexcept { CodeHolder::CodeHolder(const Support::Temporary* temporary) noexcept : _environment(), + _cpuFeatures{}, _baseAddress(Globals::kNoBaseAddress), _logger(nullptr), _errorHandler(nullptr), @@ -130,8 +132,8 @@ CodeHolder::~CodeHolder() noexcept { CodeHolder_resetInternal(this, ResetPolicy::kHard); } -// CodeHolder - Init & Reset -// ========================= +// CodeHolder - Initialization & Reset +// =================================== inline void CodeHolder_setSectionDefaultName( Section* section, @@ -143,6 +145,10 @@ inline void CodeHolder_setSectionDefaultName( } Error CodeHolder::init(const Environment& environment, uint64_t baseAddress) noexcept { + return init(environment, CpuFeatures{}, baseAddress); +} + +Error CodeHolder::init(const Environment& environment, const CpuFeatures& cpuFeatures, uint64_t baseAddress) noexcept { // Cannot reinitialize if it's locked or there is one or more emitter attached. if (isInitialized()) return DebugUtils::errored(kErrorAlreadyInitialized); @@ -172,6 +178,7 @@ Error CodeHolder::init(const Environment& environment, uint64_t baseAddress) noe } else { _environment = environment; + _cpuFeatures = cpuFeatures; _baseAddress = baseAddress; return kErrorOk; } @@ -901,7 +908,7 @@ size_t CodeHolder::codeSize() const noexcept { } } - if ((sizeof(uint64_t) > sizeof(size_t) && offset > SIZE_MAX) || of) + if ((sizeof(uint64_t) > sizeof(size_t) && offset > uint64_t(SIZE_MAX)) || of) return SIZE_MAX; return size_t(offset); @@ -1119,30 +1126,30 @@ UNIT(code_holder) { env.init(Arch::kX86); code.init(env); - EXPECT(code.arch() == Arch::kX86); + EXPECT_EQ(code.arch(), Arch::kX86); INFO("Verifying named labels"); LabelEntry* le; - EXPECT(code.newNamedLabelEntry(&le, "NamedLabel", SIZE_MAX, LabelType::kGlobal) == kErrorOk); - EXPECT(strcmp(le->name(), "NamedLabel") == 0); - EXPECT(code.labelIdByName("NamedLabel") == le->id()); + EXPECT_EQ(code.newNamedLabelEntry(&le, "NamedLabel", SIZE_MAX, LabelType::kGlobal), kErrorOk); + EXPECT_EQ(strcmp(le->name(), "NamedLabel"), 0); + EXPECT_EQ(code.labelIdByName("NamedLabel"), le->id()); INFO("Verifying section ordering"); Section* section1; - EXPECT(code.newSection(§ion1, "high-priority", SIZE_MAX, SectionFlags::kNone, 1, -1) == kErrorOk); - EXPECT(code.sections()[1] == section1); - EXPECT(code.sectionsByOrder()[0] == section1); + EXPECT_EQ(code.newSection(§ion1, "high-priority", SIZE_MAX, SectionFlags::kNone, 1, -1), kErrorOk); + EXPECT_EQ(code.sections()[1], section1); + EXPECT_EQ(code.sectionsByOrder()[0], section1); Section* section0; - EXPECT(code.newSection(§ion0, "higher-priority", SIZE_MAX, SectionFlags::kNone, 1, -2) == kErrorOk); - EXPECT(code.sections()[2] == section0); - EXPECT(code.sectionsByOrder()[0] == section0); - EXPECT(code.sectionsByOrder()[1] == section1); + EXPECT_EQ(code.newSection(§ion0, "higher-priority", SIZE_MAX, SectionFlags::kNone, 1, -2), kErrorOk); + EXPECT_EQ(code.sections()[2], section0); + EXPECT_EQ(code.sectionsByOrder()[0], section0); + EXPECT_EQ(code.sectionsByOrder()[1], section1); Section* section3; - EXPECT(code.newSection(§ion3, "low-priority", SIZE_MAX, SectionFlags::kNone, 1, 2) == kErrorOk); - EXPECT(code.sections()[3] == section3); - EXPECT(code.sectionsByOrder()[3] == section3); + EXPECT_EQ(code.newSection(§ion3, "low-priority", SIZE_MAX, SectionFlags::kNone, 1, 2), kErrorOk); + EXPECT_EQ(code.sections()[3], section3); + EXPECT_EQ(code.sectionsByOrder()[3], section3); } #endif diff --git a/3rdparty/asmjit/src/asmjit/core/codeholder.h b/3rdparty/asmjit/src/asmjit/core/codeholder.h index 6ed2ddf9426a8..3f2d1d7074521 100644 --- a/3rdparty/asmjit/src/asmjit/core/codeholder.h +++ b/3rdparty/asmjit/src/asmjit/core/codeholder.h @@ -45,7 +45,7 @@ enum class ExpressionOpType : uint8_t { kSra = 5 }; -//! Value tyoe that can be used within an \ref Expression. +//! Value type that can be used within an \ref Expression. enum class ExpressionValueType : uint8_t { //! No value or invalid. kNone = 0, @@ -89,22 +89,22 @@ struct Expression { //! Resets the whole expression. //! //! Changes both values to \ref ExpressionValueType::kNone. - inline void reset() noexcept { memset(this, 0, sizeof(*this)); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Expression{}; } //! Sets the value type at `index` to \ref ExpressionValueType::kConstant and its content to `constant`. - inline void setValueAsConstant(size_t index, uint64_t constant) noexcept { + ASMJIT_INLINE_NODEBUG void setValueAsConstant(size_t index, uint64_t constant) noexcept { valueType[index] = ExpressionValueType::kConstant; value[index].constant = constant; } //! Sets the value type at `index` to \ref ExpressionValueType::kLabel and its content to `labelEntry`. - inline void setValueAsLabel(size_t index, LabelEntry* labelEntry) noexcept { + ASMJIT_INLINE_NODEBUG void setValueAsLabel(size_t index, LabelEntry* labelEntry) noexcept { valueType[index] = ExpressionValueType::kLabel; value[index].label = labelEntry; } //! Sets the value type at `index` to \ref ExpressionValueType::kExpression and its content to `expression`. - inline void setValueAsExpression(size_t index, Expression* expression) noexcept { + ASMJIT_INLINE_NODEBUG void setValueAsExpression(size_t index, Expression* expression) noexcept { valueType[index] = ExpressionValueType::kExpression; value[index].expression = expression; } @@ -175,36 +175,36 @@ class Section { //! \{ //! Returns the section id. - inline uint32_t id() const noexcept { return _id; } + ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; } //! Returns the section name, as a null terminated string. - inline const char* name() const noexcept { return _name.str; } + ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name.str; } //! Returns the section data. - inline uint8_t* data() noexcept { return _buffer.data(); } + ASMJIT_INLINE_NODEBUG uint8_t* data() noexcept { return _buffer.data(); } //! \overload - inline const uint8_t* data() const noexcept { return _buffer.data(); } + ASMJIT_INLINE_NODEBUG const uint8_t* data() const noexcept { return _buffer.data(); } //! Returns the section flags. - inline SectionFlags flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG SectionFlags flags() const noexcept { return _flags; } //! Tests whether the section has the given `flag`. - inline bool hasFlag(SectionFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(SectionFlags flag) const noexcept { return Support::test(_flags, flag); } //! Adds `flags` to the section flags. - inline void addFlags(SectionFlags flags) noexcept { _flags |= flags; } + ASMJIT_INLINE_NODEBUG void addFlags(SectionFlags flags) noexcept { _flags |= flags; } //! Removes `flags` from the section flags. - inline void clearFlags(SectionFlags flags) noexcept { _flags &= ~flags; } + ASMJIT_INLINE_NODEBUG void clearFlags(SectionFlags flags) noexcept { _flags &= ~flags; } //! Returns the minimum section alignment - inline uint32_t alignment() const noexcept { return _alignment; } + ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; } //! Sets the minimum section alignment - inline void setAlignment(uint32_t alignment) noexcept { _alignment = alignment; } + ASMJIT_INLINE_NODEBUG void setAlignment(uint32_t alignment) noexcept { _alignment = alignment; } //! Returns the section order, which has a higher priority than section id. - inline int32_t order() const noexcept { return _order; } + ASMJIT_INLINE_NODEBUG int32_t order() const noexcept { return _order; } //! Returns the section offset, relative to base. - inline uint64_t offset() const noexcept { return _offset; } + ASMJIT_INLINE_NODEBUG uint64_t offset() const noexcept { return _offset; } //! Set the section offset. - inline void setOffset(uint64_t offset) noexcept { _offset = offset; } + ASMJIT_INLINE_NODEBUG void setOffset(uint64_t offset) noexcept { _offset = offset; } //! Returns the virtual size of the section. //! @@ -212,19 +212,19 @@ class Section { //! size returned by `bufferSize()` as the buffer stores real data emitted by assemblers or appended by users. //! //! Use `realSize()` to get the real and final size of this section. - inline uint64_t virtualSize() const noexcept { return _virtualSize; } + ASMJIT_INLINE_NODEBUG uint64_t virtualSize() const noexcept { return _virtualSize; } //! Sets the virtual size of the section. - inline void setVirtualSize(uint64_t virtualSize) noexcept { _virtualSize = virtualSize; } + ASMJIT_INLINE_NODEBUG void setVirtualSize(uint64_t virtualSize) noexcept { _virtualSize = virtualSize; } //! Returns the buffer size of the section. - inline size_t bufferSize() const noexcept { return _buffer.size(); } + ASMJIT_INLINE_NODEBUG size_t bufferSize() const noexcept { return _buffer.size(); } //! Returns the real size of the section calculated from virtual and buffer sizes. - inline uint64_t realSize() const noexcept { return Support::max(virtualSize(), bufferSize()); } + ASMJIT_INLINE_NODEBUG uint64_t realSize() const noexcept { return Support::max(virtualSize(), bufferSize()); } //! Returns the `CodeBuffer` used by this section. - inline CodeBuffer& buffer() noexcept { return _buffer; } + ASMJIT_INLINE_NODEBUG CodeBuffer& buffer() noexcept { return _buffer; } //! Returns the `CodeBuffer` used by this section (const). - inline const CodeBuffer& buffer() const noexcept { return _buffer; } + ASMJIT_INLINE_NODEBUG const CodeBuffer& buffer() const noexcept { return _buffer; } //! \} }; @@ -247,7 +247,7 @@ class AddressTableEntry : public ZoneTreeNodeT { //! \name Construction & Destruction //! \{ - inline explicit AddressTableEntry(uint64_t address) noexcept + ASMJIT_INLINE_NODEBUG explicit AddressTableEntry(uint64_t address) noexcept : _address(address), _slot(0xFFFFFFFFu) {} @@ -256,22 +256,25 @@ class AddressTableEntry : public ZoneTreeNodeT { //! \name Accessors //! \{ - inline uint64_t address() const noexcept { return _address; } - inline uint32_t slot() const noexcept { return _slot; } + ASMJIT_INLINE_NODEBUG uint64_t address() const noexcept { return _address; } + ASMJIT_INLINE_NODEBUG uint32_t slot() const noexcept { return _slot; } - inline bool hasAssignedSlot() const noexcept { return _slot != 0xFFFFFFFFu; } + ASMJIT_INLINE_NODEBUG bool hasAssignedSlot() const noexcept { return _slot != 0xFFFFFFFFu; } - inline bool operator<(const AddressTableEntry& other) const noexcept { return _address < other._address; } - inline bool operator>(const AddressTableEntry& other) const noexcept { return _address > other._address; } + ASMJIT_INLINE_NODEBUG bool operator<(const AddressTableEntry& other) const noexcept { return _address < other._address; } + ASMJIT_INLINE_NODEBUG bool operator>(const AddressTableEntry& other) const noexcept { return _address > other._address; } - inline bool operator<(uint64_t queryAddress) const noexcept { return _address < queryAddress; } - inline bool operator>(uint64_t queryAddress) const noexcept { return _address > queryAddress; } + ASMJIT_INLINE_NODEBUG bool operator<(uint64_t queryAddress) const noexcept { return _address < queryAddress; } + ASMJIT_INLINE_NODEBUG bool operator>(uint64_t queryAddress) const noexcept { return _address > queryAddress; } //! \} }; //! Offset format type, used by \ref OffsetFormat. enum class OffsetType : uint8_t { + // Common Offset Formats + // --------------------- + //! A value having `_immBitCount` bits and shifted by `_immBitShift`. //! //! This offset type is sufficient for many targets that store offset as a continuous set bits within an @@ -284,14 +287,82 @@ enum class OffsetType : uint8_t { // AArch64 Specific Offset Formats // ------------------------------- - //! AARCH64 ADR format of `[.|immlo:2|.....|immhi:19|.....]`. + //! AArch64 ADR format of `[.|immlo:2|.....|immhi:19|.....]`. kAArch64_ADR, - //! AARCH64 ADRP format of `[.|immlo:2|.....|immhi:19|.....]` (4kB pages). + //! AArch64 ADRP format of `[.|immlo:2|.....|immhi:19|.....]` (4kB pages). kAArch64_ADRP, + // AArch32 Specific Offset Formats (T16 & T32) + // ------------------------------------------- + + //! AArch32 THUMBv2 immediate encoding of 'ADR' instruction (12-bit payload and sign bit): + //! + //! `|.....|imm:1|..N.N|......|imm:3|....|imm:8|` + //! + //! Where `N` is one if the offset is negative. The immediate is encoded as absolute value of the offset if negative. + kThumb32_ADR, + + //! AArch32 THUMBv2 immediate encoding of 'BLX' instruction (23-bit immediate payload, multiplied by 4): + //! + //! `|.....|imm[22]|imm[19:10]|..|ja|1|jb|imm[9:0]|0` + //! + //! Where: + //! + //! - `ja` is calculated as imm[22] ^ imm[21] ^ 1. + //! - `jb` is calculated as imm[22] ^ imm[20] ^ 1. + kThumb32_BLX, + + //! AArch32 THUMBv2 immediate encoding of 'B' instruction without `` (24-bit immediate payload, multiplied by 2): + //! + //! `|.....|imm[23]|imm[20:11]|..|ja|1|jb|imm[10:0]` + //! + //! Where: + //! + //! - `ja` is calculated as imm[23] ^ imm[22] ^ 1. + //! - `jb` is calculated as imm[23] ^ imm[21] ^ 1. + kThumb32_B, + + //! AArch32 THUMBv2 immediate encoding of 'B' instruction with `` (20-bit immediate payload, multiplied by 2). + //! + //! `|.....|imm[19]|....|imm[16:11]|..|ja|1|jb|imm[10:0]` + //! + //! Where: + //! + //! - `ja` is calculated as imm[19] ^ imm[18] ^ 1. + //! - `jb` is calculated as imm[19] ^ imm[17] ^ 1. + kThumb32_BCond, + + // AArch32 Specific Offset Formats (A32) + // ------------------------------------- + + //! AArch32 ADR instruction, which uses a standard 12-bit immediate encoding that is used by other ARM instructions. + kAArch32_ADR, + + //! AArch32 signed offset that is similar to `kSignedOffset`, however it uses absolute value of the offset and its + //! sign is encoded in 23rd bit of the opcode. + //! + //! `|........|U.......|........|........|` + //! + kAArch32_U23_SignedOffset, + + //! AArch32 offset format that encodes 8-bit offset as: + //! + //! `|........|U.......|....|imm[7:4]|....|imm[3:0]|` + //! + //! in a 32-bit word, where U is a sign of the displacement and the displacement itself is encoded as its absolute + //! value. + kAArch32_U23_0To3At0_4To7At8, + + //! AArch32 offset format that encodes a signed 25-bit offset as: + //! + //! `|.......|imm[0]|imm[24:1]|` + //! + //! in a 32-bit word. + kAArch32_1To24At0_0At24, + //! Maximum value of `OffsetFormatType`. - kMaxValue = kAArch64_ADRP + kMaxValue = kAArch32_1To24At0_0At24 }; //! Provides information about formatting offsets, absolute addresses, or their parts. Offset format is used by both @@ -348,26 +419,35 @@ struct OffsetFormat { //! \{ //! Returns the type of the offset. - inline OffsetType type() const noexcept { return _type; } + ASMJIT_INLINE_NODEBUG OffsetType type() const noexcept { return _type; } - //! Returns flags. - inline uint32_t flags() const noexcept { return _flags; } + //! Returns whether the offset is encoded as an absolute value of the offset with additional field(s) that represent + //! the sign (AArch32 U/N fields in the opcode). + //! + //! If true, the offset itself is always positive and a separate U/N field is used to indicate the sign of the offset + //! (usually `U==1` means ADD, but sometimes `N==1` means negative offset, which implies SUB). + ASMJIT_INLINE_NODEBUG bool hasSignBit() const noexcept { + return _type == OffsetType::kThumb32_ADR || + _type == OffsetType::kAArch32_ADR || + _type == OffsetType::kAArch32_U23_SignedOffset || + _type == OffsetType::kAArch32_U23_0To3At0_4To7At8; + } + //! Returns flags. + ASMJIT_INLINE_NODEBUG uint32_t flags() const noexcept { return _flags; } //! Returns the size of the region/instruction where the offset is encoded. - inline uint32_t regionSize() const noexcept { return _regionSize; } - + ASMJIT_INLINE_NODEBUG uint32_t regionSize() const noexcept { return _regionSize; } //! Returns the offset of the word relative to the start of the region where the offset is. - inline uint32_t valueOffset() const noexcept { return _valueOffset; } - + ASMJIT_INLINE_NODEBUG uint32_t valueOffset() const noexcept { return _valueOffset; } //! Returns the size of the data-type (word) that contains the offset, in bytes. - inline uint32_t valueSize() const noexcept { return _valueSize; } + ASMJIT_INLINE_NODEBUG uint32_t valueSize() const noexcept { return _valueSize; } //! Returns the count of bits of the offset value in the data it's stored in. - inline uint32_t immBitCount() const noexcept { return _immBitCount; } + ASMJIT_INLINE_NODEBUG uint32_t immBitCount() const noexcept { return _immBitCount; } //! Returns the bit-shift of the offset value in the data it's stored in. - inline uint32_t immBitShift() const noexcept { return _immBitShift; } + ASMJIT_INLINE_NODEBUG uint32_t immBitShift() const noexcept { return _immBitShift; } //! Returns the number of least significant bits of the offset value, that must be zero and that are not part of //! the encoded data. - inline uint32_t immDiscardLsb() const noexcept { return _immDiscardLsb; } + ASMJIT_INLINE_NODEBUG uint32_t immDiscardLsb() const noexcept { return _immDiscardLsb; } //! Resets this offset format to a simple data value of `dataSize` bytes. //! @@ -456,18 +536,18 @@ struct RelocEntry { //! \name Accessors //! \{ - inline uint32_t id() const noexcept { return _id; } + ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; } - inline RelocType relocType() const noexcept { return _relocType; } - inline const OffsetFormat& format() const noexcept { return _format; } + ASMJIT_INLINE_NODEBUG RelocType relocType() const noexcept { return _relocType; } + ASMJIT_INLINE_NODEBUG const OffsetFormat& format() const noexcept { return _format; } - inline uint32_t sourceSectionId() const noexcept { return _sourceSectionId; } - inline uint32_t targetSectionId() const noexcept { return _targetSectionId; } + ASMJIT_INLINE_NODEBUG uint32_t sourceSectionId() const noexcept { return _sourceSectionId; } + ASMJIT_INLINE_NODEBUG uint32_t targetSectionId() const noexcept { return _targetSectionId; } - inline uint64_t sourceOffset() const noexcept { return _sourceOffset; } - inline uint64_t payload() const noexcept { return _payload; } + ASMJIT_INLINE_NODEBUG uint64_t sourceOffset() const noexcept { return _sourceOffset; } + ASMJIT_INLINE_NODEBUG uint64_t payload() const noexcept { return _payload; } - Expression* payloadAsExpression() const noexcept { + ASMJIT_INLINE_NODEBUG Expression* payloadAsExpression() const noexcept { return reinterpret_cast(uintptr_t(_payload)); } @@ -562,53 +642,53 @@ class LabelEntry : public ZoneHashNode { // compiler targeting 64-bit CPU will add to align the structure to 64-bits. //! Returns label id. - inline uint32_t id() const noexcept { return _customData; } + ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _customData; } //! Sets label id (internal, used only by `CodeHolder`). - inline void _setId(uint32_t id) noexcept { _customData = id; } + ASMJIT_INLINE_NODEBUG void _setId(uint32_t id) noexcept { _customData = id; } //! Returns label type. - inline LabelType type() const noexcept { return _type; } + ASMJIT_INLINE_NODEBUG LabelType type() const noexcept { return _type; } //! Tests whether the label has a parent label. - inline bool hasParent() const noexcept { return _parentId != Globals::kInvalidId; } + ASMJIT_INLINE_NODEBUG bool hasParent() const noexcept { return _parentId != Globals::kInvalidId; } //! Returns label's parent id. - inline uint32_t parentId() const noexcept { return _parentId; } + ASMJIT_INLINE_NODEBUG uint32_t parentId() const noexcept { return _parentId; } //! Returns the section where the label was bound. //! //! If the label was not yet bound the return value is `nullptr`. - inline Section* section() const noexcept { return _section; } + ASMJIT_INLINE_NODEBUG Section* section() const noexcept { return _section; } //! Tests whether the label has name. - inline bool hasName() const noexcept { return !_name.empty(); } + ASMJIT_INLINE_NODEBUG bool hasName() const noexcept { return !_name.empty(); } //! Returns the label's name. //! //! \note Local labels will return their local name without their parent part, for example ".L1". - inline const char* name() const noexcept { return _name.data(); } + ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name.data(); } //! Returns size of label's name. //! //! \note Label name is always null terminated, so you can use `strlen()` to get it, however, it's also cached in //! `LabelEntry` itself, so if you want to know the size the fastest way is to call `LabelEntry::nameSize()`. - inline uint32_t nameSize() const noexcept { return _name.size(); } + ASMJIT_INLINE_NODEBUG uint32_t nameSize() const noexcept { return _name.size(); } //! Returns links associated with this label. - inline LabelLink* links() const noexcept { return _links; } + ASMJIT_INLINE_NODEBUG LabelLink* links() const noexcept { return _links; } //! Tests whether the label is bound. - inline bool isBound() const noexcept { return _section != nullptr; } + ASMJIT_INLINE_NODEBUG bool isBound() const noexcept { return _section != nullptr; } //! Tests whether the label is bound to a the given `sectionId`. - inline bool isBoundTo(Section* section) const noexcept { return _section == section; } + ASMJIT_INLINE_NODEBUG bool isBoundTo(Section* section) const noexcept { return _section == section; } //! Returns the label offset (only useful if the label is bound). - inline uint64_t offset() const noexcept { return _offset; } + ASMJIT_INLINE_NODEBUG uint64_t offset() const noexcept { return _offset; } //! Returns the hash-value of label's name and its parent label (if any). //! //! Label hash is calculated as `HASH(Name) ^ ParentId`. The hash function is implemented in `Support::hashString()` //! and `Support::hashRound()`. - inline uint32_t hashCode() const noexcept { return _hashCode; } + ASMJIT_INLINE_NODEBUG uint32_t hashCode() const noexcept { return _hashCode; } //! \} }; @@ -640,6 +720,8 @@ class CodeHolder { //! Environment information. Environment _environment; + //! CPU features of the target architecture. + CpuFeatures _cpuFeatures; //! Base address or \ref Globals::kNoBaseAddress. uint64_t _baseAddress; @@ -685,7 +767,7 @@ class CodeHolder { ASMJIT_API explicit CodeHolder(const Support::Temporary* temporary = nullptr) noexcept; //! \overload - inline explicit CodeHolder(const Support::Temporary& temporary) noexcept + ASMJIT_INLINE_NODEBUG explicit CodeHolder(const Support::Temporary& temporary) noexcept : CodeHolder(&temporary) {} //! Destroys the CodeHolder and frees all resources it has allocated. @@ -694,10 +776,12 @@ class CodeHolder { //! Tests whether the `CodeHolder` has been initialized. //! //! Emitters can be only attached to initialized `CodeHolder` instances. - inline bool isInitialized() const noexcept { return _environment.isInitialized(); } + ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _environment.isInitialized(); } //! Initializes CodeHolder to hold code described by the given `environment` and `baseAddress`. ASMJIT_API Error init(const Environment& environment, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept; + //! Initializes CodeHolder to hold code described by the given `environment`, `cpuFeatures`, and `baseAddress`. + ASMJIT_API Error init(const Environment& environment, const CpuFeatures& cpuFeatures, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept; //! Detaches all code-generators attached and resets the `CodeHolder`. ASMJIT_API void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept; @@ -721,7 +805,7 @@ class CodeHolder { //! \note This should be only used for AsmJit's purposes. Code holder uses arena allocator to allocate everything, //! so anything allocated through this allocator will be invalidated by \ref CodeHolder::reset() or by CodeHolder's //! destructor. - inline ZoneAllocator* allocator() const noexcept { return const_cast(&_allocator); } + ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept { return const_cast(&_allocator); } //! \} @@ -729,17 +813,20 @@ class CodeHolder { //! \{ //! Returns the target environment information. - inline const Environment& environment() const noexcept { return _environment; } + ASMJIT_INLINE_NODEBUG const Environment& environment() const noexcept { return _environment; } //! Returns the target architecture. - inline Arch arch() const noexcept { return environment().arch(); } + ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return environment().arch(); } //! Returns the target sub-architecture. - inline SubArch subArch() const noexcept { return environment().subArch(); } + ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return environment().subArch(); } + + //! Returns the minimum CPU features of the target architecture. + ASMJIT_INLINE_NODEBUG const CpuFeatures& cpuFeatures() const noexcept { return _cpuFeatures; } //! Tests whether a static base-address is set. - inline bool hasBaseAddress() const noexcept { return _baseAddress != Globals::kNoBaseAddress; } + ASMJIT_INLINE_NODEBUG bool hasBaseAddress() const noexcept { return _baseAddress != Globals::kNoBaseAddress; } //! Returns a static base-address or \ref Globals::kNoBaseAddress, if not set. - inline uint64_t baseAddress() const noexcept { return _baseAddress; } + ASMJIT_INLINE_NODEBUG uint64_t baseAddress() const noexcept { return _baseAddress; } //! \} @@ -747,7 +834,7 @@ class CodeHolder { //! \{ //! Returns a vector of attached emitters. - inline const ZoneVector& emitters() const noexcept { return _emitters; } + ASMJIT_INLINE_NODEBUG const ZoneVector& emitters() const noexcept { return _emitters; } //! \} @@ -755,23 +842,23 @@ class CodeHolder { //! \{ //! Returns the attached logger. - inline Logger* logger() const noexcept { return _logger; } + ASMJIT_INLINE_NODEBUG Logger* logger() const noexcept { return _logger; } //! Attaches a `logger` to CodeHolder and propagates it to all attached emitters. ASMJIT_API void setLogger(Logger* logger) noexcept; //! Resets the logger to none. - inline void resetLogger() noexcept { setLogger(nullptr); } + ASMJIT_INLINE_NODEBUG void resetLogger() noexcept { setLogger(nullptr); } //! \name Error Handling //! \{ //! Tests whether the CodeHolder has an attached error handler, see \ref ErrorHandler. - inline bool hasErrorHandler() const noexcept { return _errorHandler != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasErrorHandler() const noexcept { return _errorHandler != nullptr; } //! Returns the attached error handler. - inline ErrorHandler* errorHandler() const noexcept { return _errorHandler; } + ASMJIT_INLINE_NODEBUG ErrorHandler* errorHandler() const noexcept { return _errorHandler; } //! Attach an error handler to this `CodeHolder`. ASMJIT_API void setErrorHandler(ErrorHandler* errorHandler) noexcept; //! Resets the error handler to none. - inline void resetErrorHandler() noexcept { setErrorHandler(nullptr); } + ASMJIT_INLINE_NODEBUG void resetErrorHandler() noexcept { setErrorHandler(nullptr); } //! \} @@ -794,14 +881,14 @@ class CodeHolder { //! \{ //! Returns an array of `Section*` records. - inline const ZoneVector& sections() const noexcept { return _sections; } + ASMJIT_INLINE_NODEBUG const ZoneVector& sections() const noexcept { return _sections; } //! Returns an array of `Section*` records sorted according to section order first, then section id. - inline const ZoneVector& sectionsByOrder() const noexcept { return _sectionsByOrder; } + ASMJIT_INLINE_NODEBUG const ZoneVector& sectionsByOrder() const noexcept { return _sectionsByOrder; } //! Returns the number of sections. - inline uint32_t sectionCount() const noexcept { return _sections.size(); } + ASMJIT_INLINE_NODEBUG uint32_t sectionCount() const noexcept { return _sections.size(); } //! Tests whether the given `sectionId` is valid. - inline bool isSectionValid(uint32_t sectionId) const noexcept { return sectionId < _sections.size(); } + ASMJIT_INLINE_NODEBUG bool isSectionValid(uint32_t sectionId) const noexcept { return sectionId < _sections.size(); } //! Creates a new section and return its pointer in `sectionOut`. //! @@ -809,7 +896,7 @@ class CodeHolder { ASMJIT_API Error newSection(Section** sectionOut, const char* name, size_t nameSize = SIZE_MAX, SectionFlags flags = SectionFlags::kNone, uint32_t alignment = 1, int32_t order = 0) noexcept; //! Returns a section entry of the given index. - inline Section* sectionById(uint32_t sectionId) const noexcept { return _sections[sectionId]; } + ASMJIT_INLINE_NODEBUG Section* sectionById(uint32_t sectionId) const noexcept { return _sections[sectionId]; } //! Returns section-id that matches the given `name`. //! @@ -819,10 +906,10 @@ class CodeHolder { //! Returns '.text' section (section that commonly represents code). //! //! \note Text section is always the first section in \ref CodeHolder::sections() array. - inline Section* textSection() const noexcept { return _sections[0]; } + ASMJIT_INLINE_NODEBUG Section* textSection() const noexcept { return _sections[0]; } //! Tests whether '.addrtab' section exists. - inline bool hasAddressTable() const noexcept { return _addressTableSection != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasAddressTable() const noexcept { return _addressTableSection != nullptr; } //! Returns '.addrtab' section. //! @@ -830,7 +917,7 @@ class CodeHolder { //! addresses that cannot be encoded in instructions like 'jmp' or 'call'. //! //! \note This section is created on demand, the returned pointer can be null. - inline Section* addressTableSection() const noexcept { return _addressTableSection; } + ASMJIT_INLINE_NODEBUG Section* addressTableSection() const noexcept { return _addressTableSection; } //! Ensures that '.addrtab' section exists (creates it if it doesn't) and //! returns it. Can return `nullptr` on out of memory condition. @@ -843,7 +930,7 @@ class CodeHolder { //! use the same slot. //! //! This function should be considered internal as it's used by assemblers to insert an absolute address into the - //! address table. Inserting address into address table without creating a particula relocation entry makes no sense. + //! address table. Inserting address into address table without creating a particular relocation entry makes no sense. ASMJIT_API Error addAddressToAddressTable(uint64_t address) noexcept; //! \} @@ -852,40 +939,40 @@ class CodeHolder { //! \{ //! Returns array of `LabelEntry*` records. - inline const ZoneVector& labelEntries() const noexcept { return _labelEntries; } + ASMJIT_INLINE_NODEBUG const ZoneVector& labelEntries() const noexcept { return _labelEntries; } //! Returns number of labels created. - inline uint32_t labelCount() const noexcept { return _labelEntries.size(); } + ASMJIT_INLINE_NODEBUG uint32_t labelCount() const noexcept { return _labelEntries.size(); } //! Tests whether the label having `id` is valid (i.e. created by `newLabelEntry()`). - inline bool isLabelValid(uint32_t labelId) const noexcept { + ASMJIT_INLINE_NODEBUG bool isLabelValid(uint32_t labelId) const noexcept { return labelId < _labelEntries.size(); } //! Tests whether the `label` is valid (i.e. created by `newLabelEntry()`). - inline bool isLabelValid(const Label& label) const noexcept { + ASMJIT_INLINE_NODEBUG bool isLabelValid(const Label& label) const noexcept { return label.id() < _labelEntries.size(); } //! \overload - inline bool isLabelBound(uint32_t labelId) const noexcept { + ASMJIT_INLINE_NODEBUG bool isLabelBound(uint32_t labelId) const noexcept { return isLabelValid(labelId) && _labelEntries[labelId]->isBound(); } //! Tests whether the `label` is already bound. //! //! Returns `false` if the `label` is not valid. - inline bool isLabelBound(const Label& label) const noexcept { + ASMJIT_INLINE_NODEBUG bool isLabelBound(const Label& label) const noexcept { return isLabelBound(label.id()); } //! Returns LabelEntry of the given label `id`. - inline LabelEntry* labelEntry(uint32_t labelId) const noexcept { + ASMJIT_INLINE_NODEBUG LabelEntry* labelEntry(uint32_t labelId) const noexcept { return isLabelValid(labelId) ? _labelEntries[labelId] : static_cast(nullptr); } //! Returns LabelEntry of the given `label`. - inline LabelEntry* labelEntry(const Label& label) const noexcept { + ASMJIT_INLINE_NODEBUG LabelEntry* labelEntry(const Label& label) const noexcept { return labelEntry(label.id()); } @@ -893,13 +980,13 @@ class CodeHolder { //! //! The offset returned is relative to the start of the section. Zero offset is returned for unbound labels, //! which is their initial offset value. - inline uint64_t labelOffset(uint32_t labelId) const noexcept { + ASMJIT_INLINE_NODEBUG uint64_t labelOffset(uint32_t labelId) const noexcept { ASMJIT_ASSERT(isLabelValid(labelId)); return _labelEntries[labelId]->offset(); } //! \overload - inline uint64_t labelOffset(const Label& label) const noexcept { + ASMJIT_INLINE_NODEBUG uint64_t labelOffset(const Label& label) const noexcept { return labelOffset(label.id()); } @@ -944,7 +1031,7 @@ class CodeHolder { //! //! If the named label doesn't a default constructed \ref Label is returned, //! which has its id set to \ref Globals::kInvalidId. - inline Label labelByName(const char* name, size_t nameSize = SIZE_MAX, uint32_t parentId = Globals::kInvalidId) noexcept { + ASMJIT_INLINE_NODEBUG Label labelByName(const char* name, size_t nameSize = SIZE_MAX, uint32_t parentId = Globals::kInvalidId) noexcept { return Label(labelIdByName(name, nameSize, parentId)); } @@ -954,9 +1041,9 @@ class CodeHolder { ASMJIT_API uint32_t labelIdByName(const char* name, size_t nameSize = SIZE_MAX, uint32_t parentId = Globals::kInvalidId) noexcept; //! Tests whether there are any unresolved label links. - inline bool hasUnresolvedLinks() const noexcept { return _unresolvedLinkCount != 0; } + ASMJIT_INLINE_NODEBUG bool hasUnresolvedLinks() const noexcept { return _unresolvedLinkCount != 0; } //! Returns the number of label links, which are unresolved. - inline size_t unresolvedLinkCount() const noexcept { return _unresolvedLinkCount; } + ASMJIT_INLINE_NODEBUG size_t unresolvedLinkCount() const noexcept { return _unresolvedLinkCount; } //! Creates a new label-link used to store information about yet unbound labels. //! @@ -979,12 +1066,12 @@ class CodeHolder { //! \{ //! Tests whether the code contains relocation entries. - inline bool hasRelocEntries() const noexcept { return !_relocations.empty(); } + ASMJIT_INLINE_NODEBUG bool hasRelocEntries() const noexcept { return !_relocations.empty(); } //! Returns array of `RelocEntry*` records. - inline const ZoneVector& relocEntries() const noexcept { return _relocations; } + ASMJIT_INLINE_NODEBUG const ZoneVector& relocEntries() const noexcept { return _relocations; } //! Returns a RelocEntry of the given `id`. - inline RelocEntry* relocEntry(uint32_t id) const noexcept { return _relocations[id]; } + ASMJIT_INLINE_NODEBUG RelocEntry* relocEntry(uint32_t id) const noexcept { return _relocations[id]; } //! Creates a new relocation entry of type `relocType`. //! @@ -1011,7 +1098,8 @@ class CodeHolder { //! Relocates the code to the given `baseAddress`. //! //! \param baseAddress Absolute base address where the code will be relocated to. Please note that nothing is - //! copied to such base address, it's just an absolute value used by the relocator to resolve all stored relocations. + //! copied to such base address, it's just an absolute value used by the relocation code to resolve all stored + //! relocations. //! //! \note This should never be called more than once. ASMJIT_API Error relocateToBase(uint64_t baseAddress) noexcept; diff --git a/3rdparty/asmjit/src/asmjit/core/codewriter.cpp b/3rdparty/asmjit/src/asmjit/core/codewriter.cpp index 1babc5f172e30..2ee5b38cda538 100644 --- a/3rdparty/asmjit/src/asmjit/core/codewriter.cpp +++ b/3rdparty/asmjit/src/asmjit/core/codewriter.cpp @@ -6,6 +6,7 @@ #include "../core/api-build_p.h" #include "../core/codeholder.h" #include "../core/codewriter_p.h" +#include "../arm/armutils.h" ASMJIT_BEGIN_NAMESPACE @@ -19,9 +20,20 @@ bool CodeWriterUtils::encodeOffset32(uint32_t* dst, int64_t offset64, const Offs return false; uint32_t value; + uint32_t u = 0; + bool unsignedLogic = format.type() == OffsetType::kUnsignedOffset; + + // First handle all offsets that use additional field for their sign and the offset is encoded as its + // absolute value. + if (format.hasSignBit()) { + u = uint32_t(offset64 >= 0); + if (u == 0) + offset64 = -offset64; + unsignedLogic = true; + } // First handle all unsigned offset types. - if (format.type() == OffsetType::kUnsignedOffset) { + if (unsignedLogic) { if (discardLsb) { ASMJIT_ASSERT(discardLsb <= 32); if ((offset64 & Support::lsbMask(discardLsb)) != 0) @@ -57,6 +69,97 @@ bool CodeWriterUtils::encodeOffset32(uint32_t* dst, int64_t offset64, const Offs return true; } + // Opcode: {.....|imm:1|..N.N|......|imm:3|....|imm:8} + case OffsetType::kThumb32_ADR: { + // Sanity checks. + if (format.valueSize() != 4 || bitCount != 12 || bitShift != 0) + return false; + + uint32_t imm8 = (value & 0x00FFu); + uint32_t imm3 = (value & 0x0700u) << (12 - 8); + uint32_t imm1 = (value & 0x0800u) << (26 - 11); + uint32_t n = u ^ 1u; + + *dst = imm8 | imm3 | imm1 | (n << 21) | (n << 23); + return true; + } + + // Opcode: {....|.|imm[22]|imm[19:10]|..|ja|.|jb|imm[9:0]|.} + case OffsetType::kThumb32_BLX: + // The calculation is the same as `B`, but the first LSB bit must be zero, so account for that. + value <<= 1; + ASMJIT_FALLTHROUGH; + + // Opcode: {....|.|imm[23]|imm[20:11]|..|ja|.|jb|imm[10:0]} + case OffsetType::kThumb32_B: { + // Sanity checks. + if (format.valueSize() != 4) + return false; + + uint32_t ia = (value & 0x0007FFu); + uint32_t ib = (value & 0x1FF800u) << (16 - 11); + uint32_t ic = (value & 0x800000u) << (26 - 23); + uint32_t ja = ((~value >> 23) ^ (value >> 22)) & 1u; + uint32_t jb = ((~value >> 23) ^ (value >> 21)) & 1u; + + *dst = ia | ib | ic | (ja << 14) | (jb << 11); + return true; + } + + // Opcode: {....|.|imm[19]|....|imm[16:11]|..|ja|.|jb|imm[10:0]} + case OffsetType::kThumb32_BCond: { + // Sanity checks. + if (format.valueSize() != 4 || bitCount != 20 || bitShift != 0) + return false; + + uint32_t ia = (value & 0x0007FFu); + uint32_t ib = (value & 0x01F800u) << (16 - 11); + uint32_t ic = (value & 0x080000u) << (26 - 19); + uint32_t ja = ((~value >> 19) ^ (value >> 22)) & 1u; + uint32_t jb = ((~value >> 19) ^ (value >> 21)) & 1u; + + *dst = ia | ib | ic | (ja << 14) | (jb << 11); + return true; + } + + case OffsetType::kAArch32_ADR: { + uint32_t encodedImm; + if (!arm::Utils::encodeAArch32Imm(value, &encodedImm)) + return false; + + *dst = (Support::bitMask(22) << u) | (encodedImm << bitShift); + return true; + } + + case OffsetType::kAArch32_U23_SignedOffset: { + *dst = (value << bitShift) | (u << 23); + return true; + } + + case OffsetType::kAArch32_U23_0To3At0_4To7At8: { + // Sanity checks. + if (format.valueSize() != 4 || bitCount != 8 || bitShift != 0) + return false; + + uint32_t immLo = (value & 0x0Fu); + uint32_t immHi = (value & 0xF0u) << (8 - 4); + + *dst = immLo | immHi | (u << 23); + return true; + } + + case OffsetType::kAArch32_1To24At0_0At24: { + // Sanity checks. + if (format.valueSize() != 4 || bitCount != 25 || bitShift != 0) + return false; + + uint32_t immLo = (value & 0x0000001u) << 24; + uint32_t immHi = (value & 0x1FFFFFEu) >> 1; + + *dst = immLo | immHi; + return true; + } + case OffsetType::kAArch64_ADR: case OffsetType::kAArch64_ADRP: { // Sanity checks. diff --git a/3rdparty/asmjit/src/asmjit/core/compiler.cpp b/3rdparty/asmjit/src/asmjit/core/compiler.cpp index b1c6b803b290a..b09ae396608d3 100644 --- a/3rdparty/asmjit/src/asmjit/core/compiler.cpp +++ b/3rdparty/asmjit/src/asmjit/core/compiler.cpp @@ -7,6 +7,7 @@ #ifndef ASMJIT_NO_COMPILER #include "../core/assembler.h" +#include "../core/builder_p.h" #include "../core/compiler.h" #include "../core/cpuinfo.h" #include "../core/logger.h" @@ -103,9 +104,13 @@ Error BaseCompiler::newFuncNode(FuncNode** out, const FuncSignature& signature) } Error BaseCompiler::addFuncNode(FuncNode** out, const FuncSignature& signature) { + State state = _grabState(); + ASMJIT_PROPAGATE(newFuncNode(out, signature)); ASMJIT_ASSUME(*out != nullptr); + BaseBuilder_assignInlineComment(this, *out, state.comment); + addFunc(*out); return kErrorOk; } @@ -127,7 +132,13 @@ Error BaseCompiler::newFuncRetNode(FuncRetNode** out, const Operand_& o0, const } Error BaseCompiler::addFuncRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1) { + State state = _grabState(); + ASMJIT_PROPAGATE(newFuncRetNode(out, o0, o1)); + ASMJIT_ASSUME(*out != nullptr); + + BaseBuilder_assignInlineComment(this, *out, state.comment); + addNode(*out); return kErrorOk; } @@ -146,6 +157,7 @@ FuncNode* BaseCompiler::addFunc(FuncNode* func) { Error BaseCompiler::endFunc() { FuncNode* func = _func; + resetState(); if (ASMJIT_UNLIKELY(!func)) return reportError(DebugUtils::errored(kErrorInvalidState)); @@ -196,7 +208,12 @@ Error BaseCompiler::newInvokeNode(InvokeNode** out, InstId instId, const Operand } Error BaseCompiler::addInvokeNode(InvokeNode** out, InstId instId, const Operand_& o0, const FuncSignature& signature) { + State state = _grabState(); + ASMJIT_PROPAGATE(newInvokeNode(out, instId, o0, signature)); + ASMJIT_ASSUME(*out != nullptr); + + BaseBuilder_assignInstState(this, *out, state); addNode(*out); return kErrorOk; } @@ -231,7 +248,7 @@ Error BaseCompiler::newVirtReg(VirtReg** out, TypeId typeId, OperandSignature si uint32_t size = TypeUtils::sizeOf(typeId); uint32_t alignment = Support::min(size, 64); - vReg = new(vReg) VirtReg(signature, Operand::indexToVirtId(index), size, alignment, typeId); + vReg = new(Support::PlacementNew{vReg}) VirtReg(signature, Operand::indexToVirtId(index), size, alignment, typeId); #ifndef ASMJIT_NO_LOGGING if (name && name[0] != '\0') @@ -473,7 +490,7 @@ Error BaseCompiler::newJumpNode(JumpNode** out, InstId instId, InstOptions instO if (ASMJIT_UNLIKELY(!node)) return reportError(DebugUtils::errored(kErrorOutOfMemory)); - node = new(node) JumpNode(this, instId, instOptions, opCount, annotation); + node = new(Support::PlacementNew{node}) JumpNode(this, instId, instOptions, opCount, annotation); node->setOp(0, o0); node->resetOpRange(opCount, JumpNode::kBaseOpCapacity); @@ -481,20 +498,13 @@ Error BaseCompiler::newJumpNode(JumpNode** out, InstId instId, InstOptions instO } Error BaseCompiler::emitAnnotatedJump(InstId instId, const Operand_& o0, JumpAnnotation* annotation) { - InstOptions options = instOptions() | forcedInstOptions(); - RegOnly extra = extraReg(); - const char* comment = inlineComment(); - - resetInstOptions(); - resetInlineComment(); - resetExtraReg(); + State state = _grabState(); JumpNode* node; - ASMJIT_PROPAGATE(newJumpNode(&node, instId, options, o0, annotation)); + ASMJIT_PROPAGATE(newJumpNode(&node, instId, state.options, o0, annotation)); - node->setExtraReg(extra); - if (comment) - node->setInlineComment(static_cast(_dataZone.dup(comment, strlen(comment), true))); + node->setExtraReg(state.extraReg); + BaseBuilder_assignInlineComment(this, node, state.comment); addNode(node); return kErrorOk; @@ -577,6 +587,12 @@ Error FuncPass::run(Zone* zone, Logger* logger) { return kErrorOk; } +// [[pure virtual]] +Error FuncPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) { + DebugUtils::unused(zone, logger, func); + return DebugUtils::errored(kErrorInvalidState); +} + ASMJIT_END_NAMESPACE #endif // !ASMJIT_NO_COMPILER diff --git a/3rdparty/asmjit/src/asmjit/core/compiler.h b/3rdparty/asmjit/src/asmjit/core/compiler.h index 709fd952acc88..7d4b47c45971a 100644 --- a/3rdparty/asmjit/src/asmjit/core/compiler.h +++ b/3rdparty/asmjit/src/asmjit/core/compiler.h @@ -47,6 +47,7 @@ class InvokeNode; //! Check out architecture specific compilers for more details and examples: //! //! - \ref x86::Compiler - X86/X64 compiler implementation. +//! - \ref a64::Compiler - AArch64 compiler implementation. class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder { public: ASMJIT_NONCOPYABLE(BaseCompiler) @@ -77,7 +78,7 @@ class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder { //! Creates a new `BaseCompiler` instance. ASMJIT_API BaseCompiler() noexcept; //! Destroys the `BaseCompiler` instance. - ASMJIT_API virtual ~BaseCompiler() noexcept; + ASMJIT_API ~BaseCompiler() noexcept override; //! \} @@ -95,7 +96,7 @@ class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder { ASMJIT_API Error addFuncRetNode(FuncRetNode** ASMJIT_NONNULL(out), const Operand_& o0, const Operand_& o1); //! Returns the current function. - inline FuncNode* func() const noexcept { return _func; } + ASMJIT_INLINE_NODEBUG FuncNode* func() const noexcept { return _func; } //! Creates a new \ref FuncNode with the given `signature` and returns it. inline FuncNode* newFunc(const FuncSignature& signature) { @@ -162,6 +163,8 @@ class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder { //! //! \note This version accepts a snprintf() format `fmt` followed by a variadic arguments. ASMJIT_API Error _newRegFmt(BaseReg* ASMJIT_NONNULL(out), TypeId typeId, const char* fmt, ...); + //! \overload + inline Error _newRegFmt(BaseReg* ASMJIT_NONNULL(out), TypeId typeId) { return _newRegFmt(out, typeId, nullptr); } //! Creates a new virtual register compatible with the provided reference register `ref`. ASMJIT_API Error _newReg(BaseReg* ASMJIT_NONNULL(out), const BaseReg& ref, const char* name = nullptr); @@ -172,12 +175,12 @@ class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder { ASMJIT_API Error _newRegFmt(BaseReg* ASMJIT_NONNULL(out), const BaseReg& ref, const char* fmt, ...); //! Tests whether the given `id` is a valid virtual register id. - inline bool isVirtIdValid(uint32_t id) const noexcept { + ASMJIT_INLINE_NODEBUG bool isVirtIdValid(uint32_t id) const noexcept { uint32_t index = Operand::virtIdToIndex(id); return index < _vRegArray.size(); } //! Tests whether the given `reg` is a virtual register having a valid id. - inline bool isVirtRegValid(const BaseReg& reg) const noexcept { + ASMJIT_INLINE_NODEBUG bool isVirtRegValid(const BaseReg& reg) const noexcept { return isVirtIdValid(reg.id()); } @@ -188,16 +191,16 @@ class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder { } //! Returns \ref VirtReg associated with the given `reg`. - inline VirtReg* virtRegByReg(const BaseReg& reg) const noexcept { return virtRegById(reg.id()); } + ASMJIT_INLINE_NODEBUG VirtReg* virtRegByReg(const BaseReg& reg) const noexcept { return virtRegById(reg.id()); } //! Returns \ref VirtReg associated with the given virtual register `index`. //! //! \note This is not the same as virtual register id. The conversion between id and its index is implemented //! by \ref Operand_::virtIdToIndex() and \ref Operand_::indexToVirtId() functions. - inline VirtReg* virtRegByIndex(uint32_t index) const noexcept { return _vRegArray[index]; } + ASMJIT_INLINE_NODEBUG VirtReg* virtRegByIndex(uint32_t index) const noexcept { return _vRegArray[index]; } //! Returns an array of all virtual registers managed by the Compiler. - inline const ZoneVector& virtRegs() const noexcept { return _vRegArray; } + ASMJIT_INLINE_NODEBUG const ZoneVector& virtRegs() const noexcept { return _vRegArray; } //! \name Stack //! \{ @@ -211,7 +214,7 @@ class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder { ASMJIT_API Error setStackSize(uint32_t virtId, uint32_t newSize, uint32_t newAlignment = 0); //! Updates the stack size of a stack created by `_newStack()`. - inline Error setStackSize(const BaseMem& mem, uint32_t newSize, uint32_t newAlignment = 0) { + ASMJIT_INLINE_NODEBUG Error setStackSize(const BaseMem& mem, uint32_t newSize, uint32_t newAlignment = 0) { return setStackSize(mem.id(), newSize, newAlignment); } @@ -239,7 +242,7 @@ class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder { //! \name Jump Annotations //! \{ - inline const ZoneVector& jumpAnnotations() const noexcept { + ASMJIT_INLINE_NODEBUG const ZoneVector& jumpAnnotations() const noexcept { return _jumpAnnotations; } @@ -286,7 +289,7 @@ class JumpAnnotation { //! \name Construction & Destruction //! \{ - inline JumpAnnotation(BaseCompiler* ASMJIT_NONNULL(compiler), uint32_t annotationId) noexcept + ASMJIT_INLINE_NODEBUG JumpAnnotation(BaseCompiler* ASMJIT_NONNULL(compiler), uint32_t annotationId) noexcept : _compiler(compiler), _annotationId(annotationId) {} @@ -296,16 +299,16 @@ class JumpAnnotation { //! \{ //! Returns the compiler that owns this JumpAnnotation. - inline BaseCompiler* compiler() const noexcept { return _compiler; } + ASMJIT_INLINE_NODEBUG BaseCompiler* compiler() const noexcept { return _compiler; } //! Returns the annotation id. - inline uint32_t annotationId() const noexcept { return _annotationId; } + ASMJIT_INLINE_NODEBUG uint32_t annotationId() const noexcept { return _annotationId; } //! Returns a vector of label identifiers that lists all targets of the jump. - const ZoneVector& labelIds() const noexcept { return _labelIds; } + ASMJIT_INLINE_NODEBUG const ZoneVector& labelIds() const noexcept { return _labelIds; } //! Tests whether the given `label` is a target of this JumpAnnotation. - inline bool hasLabel(const Label& label) const noexcept { return hasLabelId(label.id()); } + ASMJIT_INLINE_NODEBUG bool hasLabel(const Label& label) const noexcept { return hasLabelId(label.id()); } //! Tests whether the given `labelId` is a target of this JumpAnnotation. - inline bool hasLabelId(uint32_t labelId) const noexcept { return _labelIds.contains(labelId); } + ASMJIT_INLINE_NODEBUG bool hasLabelId(uint32_t labelId) const noexcept { return _labelIds.contains(labelId); } //! \} @@ -313,9 +316,9 @@ class JumpAnnotation { //! \{ //! Adds the `label` to the list of targets of this JumpAnnotation. - inline Error addLabel(const Label& label) noexcept { return addLabelId(label.id()); } + ASMJIT_INLINE_NODEBUG Error addLabel(const Label& label) noexcept { return addLabelId(label.id()); } //! Adds the `labelId` to the list of targets of this JumpAnnotation. - inline Error addLabelId(uint32_t labelId) noexcept { return _labelIds.append(&_compiler->_allocator, labelId); } + ASMJIT_INLINE_NODEBUG Error addLabelId(uint32_t labelId) noexcept { return _labelIds.append(&_compiler->_allocator, labelId); } //! \} }; @@ -325,7 +328,7 @@ class JumpAnnotation { //! \note This node should be only used to represent jump where the jump target cannot be deduced by examining //! instruction operands. For example if the jump target is register or memory location. This pattern is often //! used to perform indirect jumps that use jump table, e.g. to implement `switch{}` statement. -class JumpNode : public InstNode { +class JumpNode : public InstNodeWithOperands { public: ASMJIT_NONCOPYABLE(JumpNode) @@ -340,7 +343,7 @@ class JumpNode : public InstNode { //! \{ inline JumpNode(BaseCompiler* ASMJIT_NONNULL(cc), InstId instId, InstOptions options, uint32_t opCount, JumpAnnotation* annotation) noexcept - : InstNode(cc, instId, options, opCount, kBaseOpCapacity), + : InstNodeWithOperands(cc, instId, options, opCount), _annotation(annotation) { setType(NodeType::kJump); } @@ -351,11 +354,11 @@ class JumpNode : public InstNode { //! \{ //! Tests whether this JumpNode has associated a \ref JumpAnnotation. - inline bool hasAnnotation() const noexcept { return _annotation != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasAnnotation() const noexcept { return _annotation != nullptr; } //! Returns the \ref JumpAnnotation associated with this jump, or `nullptr`. - inline JumpAnnotation* annotation() const noexcept { return _annotation; } + ASMJIT_INLINE_NODEBUG JumpAnnotation* annotation() const noexcept { return _annotation; } //! Sets the \ref JumpAnnotation associated with this jump to `annotation`. - inline void setAnnotation(JumpAnnotation* annotation) noexcept { _annotation = annotation; } + ASMJIT_INLINE_NODEBUG void setAnnotation(JumpAnnotation* annotation) noexcept { _annotation = annotation; } //! \} }; @@ -455,35 +458,35 @@ class FuncNode : public LabelNode { //! \name Accessors //! Returns function exit `LabelNode`. - inline LabelNode* exitNode() const noexcept { return _exitNode; } + ASMJIT_INLINE_NODEBUG LabelNode* exitNode() const noexcept { return _exitNode; } //! Returns function exit label. - inline Label exitLabel() const noexcept { return _exitNode->label(); } + ASMJIT_INLINE_NODEBUG Label exitLabel() const noexcept { return _exitNode->label(); } //! Returns "End of Func" sentinel node. - inline SentinelNode* endNode() const noexcept { return _end; } + ASMJIT_INLINE_NODEBUG SentinelNode* endNode() const noexcept { return _end; } //! Returns function detail. - inline FuncDetail& detail() noexcept { return _funcDetail; } + ASMJIT_INLINE_NODEBUG FuncDetail& detail() noexcept { return _funcDetail; } //! Returns function detail. - inline const FuncDetail& detail() const noexcept { return _funcDetail; } + ASMJIT_INLINE_NODEBUG const FuncDetail& detail() const noexcept { return _funcDetail; } //! Returns function frame. - inline FuncFrame& frame() noexcept { return _frame; } + ASMJIT_INLINE_NODEBUG FuncFrame& frame() noexcept { return _frame; } //! Returns function frame. - inline const FuncFrame& frame() const noexcept { return _frame; } + ASMJIT_INLINE_NODEBUG const FuncFrame& frame() const noexcept { return _frame; } //! Returns function attributes. - inline FuncAttributes attributes() const noexcept { return _frame.attributes(); } + ASMJIT_INLINE_NODEBUG FuncAttributes attributes() const noexcept { return _frame.attributes(); } //! Adds `attrs` to the function attributes. - inline void addAttributes(FuncAttributes attrs) noexcept { _frame.addAttributes(attrs); } + ASMJIT_INLINE_NODEBUG void addAttributes(FuncAttributes attrs) noexcept { _frame.addAttributes(attrs); } //! Returns arguments count. - inline uint32_t argCount() const noexcept { return _funcDetail.argCount(); } + ASMJIT_INLINE_NODEBUG uint32_t argCount() const noexcept { return _funcDetail.argCount(); } //! Returns argument packs. - inline ArgPack* argPacks() const noexcept { return _args; } + ASMJIT_INLINE_NODEBUG ArgPack* argPacks() const noexcept { return _args; } //! Tests whether the function has a return value. - inline bool hasRet() const noexcept { return _funcDetail.hasRet(); } + ASMJIT_INLINE_NODEBUG bool hasRet() const noexcept { return _funcDetail.hasRet(); } //! Returns argument pack at `argIndex`. inline ArgPack& argPack(size_t argIndex) const noexcept { @@ -531,7 +534,7 @@ class FuncNode : public LabelNode { }; //! Function return, used by \ref BaseCompiler. -class FuncRetNode : public InstNode { +class FuncRetNode : public InstNodeWithOperands { public: ASMJIT_NONCOPYABLE(FuncRetNode) @@ -539,7 +542,8 @@ class FuncRetNode : public InstNode { //! \{ //! Creates a new `FuncRetNode` instance. - inline FuncRetNode(BaseBuilder* ASMJIT_NONNULL(cb)) noexcept : InstNode(cb, BaseInst::kIdAbstract, InstOptions::kNone, 0) { + inline FuncRetNode(BaseBuilder* ASMJIT_NONNULL(cb)) noexcept + : InstNodeWithOperands(cb, BaseInst::kIdAbstract, InstOptions::kNone, 0) { _any._nodeType = NodeType::kFuncRet; } @@ -547,12 +551,12 @@ class FuncRetNode : public InstNode { }; //! Function invocation, used by \ref BaseCompiler. -class InvokeNode : public InstNode { +class InvokeNode : public InstNodeWithOperands { public: ASMJIT_NONCOPYABLE(InvokeNode) //! Operand pack provides multiple operands that can be associated with a single return value of function - //! argument. Sometims this is necessary to express an argument or return value that requires multiple + //! argument. Sometimes this is necessary to express an argument or return value that requires multiple //! registers, for example 64-bit value in 32-bit mode or passing / returning homogeneous data structures. struct OperandPack { //! Operands. @@ -594,7 +598,7 @@ class InvokeNode : public InstNode { //! Creates a new `InvokeNode` instance. inline InvokeNode(BaseBuilder* ASMJIT_NONNULL(cb), InstId instId, InstOptions options) noexcept - : InstNode(cb, instId, options, kBaseOpCapacity), + : InstNodeWithOperands(cb, instId, options, 0), _funcDetail(), _args(nullptr) { setType(NodeType::kInvoke); @@ -614,29 +618,29 @@ class InvokeNode : public InstNode { } //! Returns the function detail. - inline FuncDetail& detail() noexcept { return _funcDetail; } + ASMJIT_INLINE_NODEBUG FuncDetail& detail() noexcept { return _funcDetail; } //! Returns the function detail. - inline const FuncDetail& detail() const noexcept { return _funcDetail; } + ASMJIT_INLINE_NODEBUG const FuncDetail& detail() const noexcept { return _funcDetail; } //! Returns the target operand. - inline Operand& target() noexcept { return _opArray[0].as(); } + ASMJIT_INLINE_NODEBUG Operand& target() noexcept { return op(0); } //! \overload - inline const Operand& target() const noexcept { return _opArray[0].as(); } + ASMJIT_INLINE_NODEBUG const Operand& target() const noexcept { return op(0); } //! Returns the number of function return values. - inline bool hasRet() const noexcept { return _funcDetail.hasRet(); } + ASMJIT_INLINE_NODEBUG bool hasRet() const noexcept { return _funcDetail.hasRet(); } //! Returns the number of function arguments. - inline uint32_t argCount() const noexcept { return _funcDetail.argCount(); } + ASMJIT_INLINE_NODEBUG uint32_t argCount() const noexcept { return _funcDetail.argCount(); } //! Returns operand pack representing function return value(s). - inline OperandPack& retPack() noexcept { return _rets; } + ASMJIT_INLINE_NODEBUG OperandPack& retPack() noexcept { return _rets; } //! Returns operand pack representing function return value(s). - inline const OperandPack& retPack() const noexcept { return _rets; } + ASMJIT_INLINE_NODEBUG const OperandPack& retPack() const noexcept { return _rets; } //! Returns the return value at the given `valueIndex`. - inline Operand& ret(size_t valueIndex = 0) noexcept { return _rets[valueIndex]; } + ASMJIT_INLINE_NODEBUG Operand& ret(size_t valueIndex = 0) noexcept { return _rets[valueIndex]; } //! \overload - inline const Operand& ret(size_t valueIndex = 0) const noexcept { return _rets[valueIndex]; } + ASMJIT_INLINE_NODEBUG const Operand& ret(size_t valueIndex = 0) const noexcept { return _rets[valueIndex]; } //! Returns operand pack representing function return value(s). inline OperandPack& argPack(size_t argIndex) noexcept { @@ -669,17 +673,17 @@ class InvokeNode : public InstNode { } //! Sets the function return value at `valueIndex` to `reg`. - inline void setRet(size_t valueIndex, const BaseReg& reg) noexcept { _setRet(valueIndex, reg); } + ASMJIT_INLINE_NODEBUG void setRet(size_t valueIndex, const BaseReg& reg) noexcept { _setRet(valueIndex, reg); } //! Sets the first function argument in a value-pack at `argIndex` to `reg`. - inline void setArg(size_t argIndex, const BaseReg& reg) noexcept { _setArg(argIndex, 0, reg); } + ASMJIT_INLINE_NODEBUG void setArg(size_t argIndex, const BaseReg& reg) noexcept { _setArg(argIndex, 0, reg); } //! Sets the first function argument in a value-pack at `argIndex` to `imm`. - inline void setArg(size_t argIndex, const Imm& imm) noexcept { _setArg(argIndex, 0, imm); } + ASMJIT_INLINE_NODEBUG void setArg(size_t argIndex, const Imm& imm) noexcept { _setArg(argIndex, 0, imm); } //! Sets the function argument at `argIndex` and `valueIndex` to `reg`. - inline void setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg) noexcept { _setArg(argIndex, valueIndex, reg); } + ASMJIT_INLINE_NODEBUG void setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg) noexcept { _setArg(argIndex, valueIndex, reg); } //! Sets the function argument at `argIndex` and `valueIndex` to `imm`. - inline void setArg(size_t argIndex, size_t valueIndex, const Imm& imm) noexcept { _setArg(argIndex, valueIndex, imm); } + ASMJIT_INLINE_NODEBUG void setArg(size_t argIndex, size_t valueIndex, const Imm& imm) noexcept { _setArg(argIndex, valueIndex, imm); } //! \} }; @@ -701,7 +705,7 @@ class ASMJIT_VIRTAPI FuncPass : public Pass { //! \{ //! Returns the associated `BaseCompiler`. - inline BaseCompiler* cc() const noexcept { return static_cast(_cb); } + ASMJIT_INLINE_NODEBUG BaseCompiler* cc() const noexcept { return static_cast(_cb); } //! \} @@ -712,7 +716,7 @@ class ASMJIT_VIRTAPI FuncPass : public Pass { ASMJIT_API Error run(Zone* zone, Logger* logger) override; //! Called once per `FuncNode`. - virtual Error runOnFunction(Zone* zone, Logger* logger, FuncNode* func) = 0; + ASMJIT_API virtual Error runOnFunction(Zone* zone, Logger* logger, FuncNode* func); //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/compilerdefs.h b/3rdparty/asmjit/src/asmjit/core/compilerdefs.h index 1870e688bc96b..e2e74ce6790ea 100644 --- a/3rdparty/asmjit/src/asmjit/core/compilerdefs.h +++ b/3rdparty/asmjit/src/asmjit/core/compilerdefs.h @@ -66,18 +66,16 @@ class VirtReg { //! \name Construction & Destruction //! \{ - inline VirtReg(OperandSignature signature, uint32_t id, uint32_t virtSize, uint32_t alignment, TypeId typeId) noexcept + ASMJIT_INLINE_NODEBUG VirtReg(OperandSignature signature, uint32_t id, uint32_t virtSize, uint32_t alignment, TypeId typeId) noexcept : _signature(signature), _id(id), _virtSize(virtSize), _alignment(uint8_t(alignment)), _typeId(typeId), - _isFixed(false), - _isStack(false), - _hasStackSlot(false), - _reservedBits(0), - _stackOffset(0), - _reservedU32(0) {} + _isFixed(0), + _isStack(0), + _hasStackSlot(0), + _reservedBits(0) {} //! \} @@ -85,64 +83,64 @@ class VirtReg { //! \{ //! Returns the virtual register id. - inline uint32_t id() const noexcept { return _id; } + ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; } //! Returns the virtual register name. - inline const char* name() const noexcept { return _name.data(); } + ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name.data(); } //! Returns the size of the virtual register name. - inline uint32_t nameSize() const noexcept { return _name.size(); } + ASMJIT_INLINE_NODEBUG uint32_t nameSize() const noexcept { return _name.size(); } //! Returns a register signature of this virtual register. - inline OperandSignature signature() const noexcept { return _signature; } + ASMJIT_INLINE_NODEBUG OperandSignature signature() const noexcept { return _signature; } //! Returns a virtual register type (maps to the physical register type as well). - inline RegType type() const noexcept { return _signature.regType(); } + ASMJIT_INLINE_NODEBUG RegType type() const noexcept { return _signature.regType(); } //! Returns a virtual register group (maps to the physical register group as well). - inline RegGroup group() const noexcept { return _signature.regGroup(); } + ASMJIT_INLINE_NODEBUG RegGroup group() const noexcept { return _signature.regGroup(); } //! Returns a real size of the register this virtual register maps to. //! //! For example if this is a 128-bit SIMD register used for a scalar single precision floating point value then //! its virtSize would be 4, however, the `regSize` would still say 16 (128-bits), because it's the smallest size //! of that register type. - inline uint32_t regSize() const noexcept { return _signature.size(); } + ASMJIT_INLINE_NODEBUG uint32_t regSize() const noexcept { return _signature.size(); } //! Returns the virtual register size. //! //! The virtual register size describes how many bytes the virtual register needs to store its content. It can be //! smaller than the physical register size, see `regSize()`. - inline uint32_t virtSize() const noexcept { return _virtSize; } + ASMJIT_INLINE_NODEBUG uint32_t virtSize() const noexcept { return _virtSize; } //! Returns the virtual register alignment. - inline uint32_t alignment() const noexcept { return _alignment; } + ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; } //! Returns the virtual register type id. - inline TypeId typeId() const noexcept { return _typeId; } + ASMJIT_INLINE_NODEBUG TypeId typeId() const noexcept { return _typeId; } //! Returns the virtual register weight - the register allocator can use it as explicit hint for alloc/spill //! decisions. - inline uint32_t weight() const noexcept { return _weight; } + ASMJIT_INLINE_NODEBUG uint32_t weight() const noexcept { return _weight; } //! Sets the virtual register weight (0 to 255) - the register allocator can use it as explicit hint for //! alloc/spill decisions and initial bin-packing. - inline void setWeight(uint32_t weight) noexcept { _weight = uint8_t(weight); } + ASMJIT_INLINE_NODEBUG void setWeight(uint32_t weight) noexcept { _weight = uint8_t(weight); } //! Returns whether the virtual register is always allocated to a fixed physical register (and never reallocated). //! //! \note This is only used for special purposes and it's mostly internal. - inline bool isFixed() const noexcept { return bool(_isFixed); } + ASMJIT_INLINE_NODEBUG bool isFixed() const noexcept { return bool(_isFixed); } //! Tests whether the virtual register is in fact a stack that only uses the virtual register id. //! //! \note It's an error if a stack is accessed as a register. - inline bool isStack() const noexcept { return bool(_isStack); } + ASMJIT_INLINE_NODEBUG bool isStack() const noexcept { return bool(_isStack); } //! Tests whether this virtual register (or stack) has assigned a stack offset. //! //! If this is a virtual register that was never allocated on stack, it would return false, otherwise if //! it's a virtual register that was spilled or explicitly allocated stack, the return value would be true. - inline bool hasStackSlot() const noexcept { return bool(_hasStackSlot); } + ASMJIT_INLINE_NODEBUG bool hasStackSlot() const noexcept { return bool(_hasStackSlot); } //! Assigns a stack offset of this virtual register to `stackOffset` and sets `_hasStackSlot` to true. - inline void assignStackSlot(int32_t stackOffset) noexcept { + ASMJIT_INLINE_NODEBUG void assignStackSlot(int32_t stackOffset) noexcept { _hasStackSlot = 1; _stackOffset = stackOffset; } @@ -151,16 +149,16 @@ class VirtReg { //! //! \note Always verify that the stack offset has been assigned by calling \ref hasStackSlot(). The return //! value will be zero when the stack offset was not assigned. - inline int32_t stackOffset() const noexcept { return _stackOffset; } + ASMJIT_INLINE_NODEBUG int32_t stackOffset() const noexcept { return _stackOffset; } //! Tests whether the virtual register has an associated `RAWorkReg` at the moment. - inline bool hasWorkReg() const noexcept { return _workReg != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasWorkReg() const noexcept { return _workReg != nullptr; } //! Returns an associated RAWorkReg with this virtual register (only valid during register allocation). - inline RAWorkReg* workReg() const noexcept { return _workReg; } + ASMJIT_INLINE_NODEBUG RAWorkReg* workReg() const noexcept { return _workReg; } //! Associates a RAWorkReg with this virtual register (used by register allocator). - inline void setWorkReg(RAWorkReg* workReg) noexcept { _workReg = workReg; } + ASMJIT_INLINE_NODEBUG void setWorkReg(RAWorkReg* workReg) noexcept { _workReg = workReg; } //! Reset the RAWorkReg association (used by register allocator). - inline void resetWorkReg() noexcept { _workReg = nullptr; } + ASMJIT_INLINE_NODEBUG void resetWorkReg() noexcept { _workReg = nullptr; } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/constpool.cpp b/3rdparty/asmjit/src/asmjit/core/constpool.cpp index ad5fe4f2fc0e4..2ac5edf33c695 100644 --- a/3rdparty/asmjit/src/asmjit/core/constpool.cpp +++ b/3rdparty/asmjit/src/asmjit/core/constpool.cpp @@ -252,18 +252,18 @@ UNIT(const_pool) { size_t curOffset; uint64_t c = 0x0101010101010101u; - EXPECT(pool.add(&c, 8, prevOffset) == kErrorOk); - EXPECT(prevOffset == 0); + EXPECT_EQ(pool.add(&c, 8, prevOffset), kErrorOk); + EXPECT_EQ(prevOffset, 0u); for (i = 1; i < kCount; i++) { c++; - EXPECT(pool.add(&c, 8, curOffset) == kErrorOk); - EXPECT(prevOffset + 8 == curOffset); - EXPECT(pool.size() == (i + 1) * 8); + EXPECT_EQ(pool.add(&c, 8, curOffset), kErrorOk); + EXPECT_EQ(prevOffset + 8, curOffset); + EXPECT_EQ(pool.size(), (i + 1) * 8); prevOffset = curOffset; } - EXPECT(pool.alignment() == 8); + EXPECT_EQ(pool.alignment(), 8u); } INFO("Retrieving %u constants from the pool", kCount); @@ -272,20 +272,27 @@ UNIT(const_pool) { for (i = 0; i < kCount; i++) { size_t offset; - EXPECT(pool.add(&c, 8, offset) == kErrorOk); - EXPECT(offset == i * 8); + EXPECT_EQ(pool.add(&c, 8, offset), kErrorOk); + EXPECT_EQ(offset, i * 8); c++; } } INFO("Checking if the constants were split into 4-byte patterns"); { - uint32_t c = 0x01010101; - for (i = 0; i < kCount; i++) { - size_t offset; - EXPECT(pool.add(&c, 4, offset) == kErrorOk); - EXPECT(offset == i * 8); + uint32_t c = 0x01010101u; + size_t offset; + + EXPECT_EQ(pool.add(&c, 4, offset), kErrorOk); + EXPECT_EQ(offset, 0u); + + // NOTE: We have to adjust the offset to successfully test this on big endian architectures. + size_t baseOffset = size_t(ASMJIT_ARCH_BE ? 4 : 0); + + for (i = 1; i < kCount; i++) { c++; + EXPECT_EQ(pool.add(&c, 4, offset), kErrorOk); + EXPECT_EQ(offset, baseOffset + i * 8); } } @@ -294,9 +301,9 @@ UNIT(const_pool) { uint16_t c = 0xFFFF; size_t offset; - EXPECT(pool.add(&c, 2, offset) == kErrorOk); - EXPECT(offset == kCount * 8); - EXPECT(pool.alignment() == 8); + EXPECT_EQ(pool.add(&c, 2, offset), kErrorOk); + EXPECT_EQ(offset, kCount * 8); + EXPECT_EQ(pool.alignment(), 8u); } INFO("Adding 8 byte constant to check if pool gets aligned again"); @@ -304,8 +311,8 @@ UNIT(const_pool) { uint64_t c = 0xFFFFFFFFFFFFFFFFu; size_t offset; - EXPECT(pool.add(&c, 8, offset) == kErrorOk); - EXPECT(offset == kCount * 8 + 8); + EXPECT_EQ(pool.add(&c, 8, offset), kErrorOk); + EXPECT_EQ(offset, kCount * 8 + 8u); } INFO("Adding 2 byte constant to verify the gap is filled"); @@ -313,9 +320,9 @@ UNIT(const_pool) { uint16_t c = 0xFFFE; size_t offset; - EXPECT(pool.add(&c, 2, offset) == kErrorOk); - EXPECT(offset == kCount * 8 + 2); - EXPECT(pool.alignment() == 8); + EXPECT_EQ(pool.add(&c, 2, offset), kErrorOk); + EXPECT_EQ(offset, kCount * 8 + 2); + EXPECT_EQ(pool.alignment(), 8u); } INFO("Checking reset functionality"); @@ -323,8 +330,8 @@ UNIT(const_pool) { pool.reset(&zone); zone.reset(); - EXPECT(pool.size() == 0); - EXPECT(pool.alignment() == 0); + EXPECT_EQ(pool.size(), 0u); + EXPECT_EQ(pool.alignment(), 0u); } INFO("Checking pool alignment when combined constants are added"); @@ -333,29 +340,29 @@ UNIT(const_pool) { size_t offset; pool.add(bytes, 1, offset); - EXPECT(pool.size() == 1); - EXPECT(pool.alignment() == 1); - EXPECT(offset == 0); + EXPECT_EQ(pool.size(), 1u); + EXPECT_EQ(pool.alignment(), 1u); + EXPECT_EQ(offset, 0u); pool.add(bytes, 2, offset); - EXPECT(pool.size() == 4); - EXPECT(pool.alignment() == 2); - EXPECT(offset == 2); + EXPECT_EQ(pool.size(), 4u); + EXPECT_EQ(pool.alignment(), 2u); + EXPECT_EQ(offset, 2u); pool.add(bytes, 4, offset); - EXPECT(pool.size() == 8); - EXPECT(pool.alignment() == 4); - EXPECT(offset == 4); + EXPECT_EQ(pool.size(), 8u); + EXPECT_EQ(pool.alignment(), 4u); + EXPECT_EQ(offset, 4u); pool.add(bytes, 4, offset); - EXPECT(pool.size() == 8); - EXPECT(pool.alignment() == 4); - EXPECT(offset == 4); + EXPECT_EQ(pool.size(), 8u); + EXPECT_EQ(pool.alignment(), 4u); + EXPECT_EQ(offset, 4u); pool.add(bytes, 32, offset); - EXPECT(pool.size() == 64); - EXPECT(pool.alignment() == 32); - EXPECT(offset == 32); + EXPECT_EQ(pool.size(), 64u); + EXPECT_EQ(pool.alignment(), 32u); + EXPECT_EQ(offset, 32u); } } #endif diff --git a/3rdparty/asmjit/src/asmjit/core/constpool.h b/3rdparty/asmjit/src/asmjit/core/constpool.h index 32b84b1065d55..673c11d6a9325 100644 --- a/3rdparty/asmjit/src/asmjit/core/constpool.h +++ b/3rdparty/asmjit/src/asmjit/core/constpool.h @@ -27,6 +27,9 @@ enum class ConstPoolScope : uint32_t { }; //! Constant pool. +//! +//! Constant pool is designed to hold 1, 2, 4, 8, 16, 32, and 64 byte constants. It's not designed to hold constants +//! having arbitrary length like strings and arrays. class ConstPool { public: ASMJIT_NONCOPYABLE(ConstPool) @@ -65,12 +68,12 @@ class ConstPool { //! Data offset from the beginning of the pool. uint32_t _offset; - inline Node(size_t offset, bool shared) noexcept + ASMJIT_INLINE_NODEBUG Node(size_t offset, bool shared) noexcept : ZoneTreeNodeT(), _shared(shared), _offset(uint32_t(offset)) {} - inline void* data() const noexcept { + ASMJIT_INLINE_NODEBUG void* data() const noexcept { return static_cast(const_cast(this) + 1); } }; @@ -80,14 +83,14 @@ class ConstPool { public: size_t _dataSize; - inline Compare(size_t dataSize) noexcept + ASMJIT_INLINE_NODEBUG Compare(size_t dataSize) noexcept : _dataSize(dataSize) {} - inline int operator()(const Node& a, const Node& b) const noexcept { + ASMJIT_INLINE_NODEBUG int operator()(const Node& a, const Node& b) const noexcept { return ::memcmp(a.data(), b.data(), _dataSize); } - inline int operator()(const Node& a, const void* data) const noexcept { + ASMJIT_INLINE_NODEBUG int operator()(const Node& a, const void* data) const noexcept { return ::memcmp(a.data(), data, _dataSize); } }; @@ -101,30 +104,30 @@ class ConstPool { //! Size of the data. size_t _dataSize; - inline explicit Tree(size_t dataSize = 0) noexcept + ASMJIT_INLINE_NODEBUG explicit Tree(size_t dataSize = 0) noexcept : _tree(), _size(0), _dataSize(dataSize) {} - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _tree.reset(); _size = 0; } - inline bool empty() const noexcept { return _size == 0; } - inline size_t size() const noexcept { return _size; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; } + ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; } inline void setDataSize(size_t dataSize) noexcept { ASMJIT_ASSERT(empty()); _dataSize = dataSize; } - inline Node* get(const void* data) noexcept { + ASMJIT_INLINE_NODEBUG Node* get(const void* data) noexcept { Compare cmp(_dataSize); return _tree.get(data, cmp); } - inline void insert(Node* node) noexcept { + ASMJIT_INLINE_NODEBUG void insert(Node* node) noexcept { Compare cmp(_dataSize); _tree.insert(node, cmp); _size++; @@ -167,7 +170,7 @@ class ConstPool { Node* node = zone->allocT(sizeof(Node) + size); if (ASMJIT_UNLIKELY(!node)) return nullptr; - node = new(node) Node(offset, shared); + node = new(Support::PlacementNew{node}) Node(offset, shared); memcpy(node->data(), data, size); return node; } @@ -199,9 +202,17 @@ class ConstPool { //! \name Construction & Destruction //! \{ - ASMJIT_API ConstPool(Zone* zone) noexcept; + //! Creates a new constant pool that would use `zone` as a memory allocator. + ASMJIT_API explicit ConstPool(Zone* zone) noexcept; + //! Destroys this constant pool. ASMJIT_API ~ConstPool() noexcept; + //! \} + + //! \name Reset + //! \{ + + //! Resets this constant pool and its allocator to `zone`. ASMJIT_API void reset(Zone* zone) noexcept; //! \} @@ -210,13 +221,13 @@ class ConstPool { //! \{ //! Tests whether the constant-pool is empty. - inline bool empty() const noexcept { return _size == 0; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; } //! Returns the size of the constant-pool in bytes. - inline size_t size() const noexcept { return _size; } + ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; } //! Returns minimum alignment. - inline size_t alignment() const noexcept { return _alignment; } + ASMJIT_INLINE_NODEBUG size_t alignment() const noexcept { return _alignment; } //! Returns the minimum size of all items added to the constant pool. - inline size_t minItemSize() const noexcept { return _minItemSize; } + ASMJIT_INLINE_NODEBUG size_t minItemSize() const noexcept { return _minItemSize; } //! \} diff --git a/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp b/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp index 7bf7407f005f0..c6d3545938954 100644 --- a/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp +++ b/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp @@ -7,30 +7,85 @@ #include "../core/cpuinfo.h" #include "../core/support.h" +#include + +// Required by `__cpuidex()` and `_xgetbv()`. +#if ASMJIT_ARCH_X86 + #if defined(_MSC_VER) + #include + #endif +#endif // ASMJIT_ARCH_X86 + #if !defined(_WIN32) - #include - #include #include #endif -// Required by `getauxval()` on Linux. -#if defined(__linux__) - #include -#endif +#if ASMJIT_ARCH_ARM + // Required by various utilities that are required by features detection. + #if !defined(_WIN32) + #include + #include + #endif + + //! Required to detect CPU and features on Apple platforms. + #if defined(__APPLE__) + #include + #include + #include + #endif + + #if (defined(__linux__) || defined(__FreeBSD__)) + // Required by `getauxval()` on Linux and FreeBSD. + #include + #define ASMJIT_ARM_DETECT_VIA_HWCAPS + #endif + + #if ASMJIT_ARCH_ARM >= 64 && defined(__GNUC__) && defined(__linux__) && 0 + // This feature is disabled at the moment - it works, but it seems linux supports ARM features + // via HWCAPS pretty well and the most recent features need to access more registers that were + // not originally accessible, which would break on some systems. + #define ASMJIT_ARM_DETECT_VIA_CPUID + #endif + + #if ASMJIT_ARCH_ARM >= 64 && defined(__OpenBSD__) + #include + #include + #endif +#endif // ASMJIT_ARCH_ARM -//! Required to detect CPU and features on Apple platforms. -#if defined(__APPLE__) - #include - #include - #include -#endif +ASMJIT_BEGIN_NAMESPACE -// Required by `__cpuidex()` and `_xgetbv()`. -#if defined(_MSC_VER) - #include -#endif +// CpuInfo - Detect - Compatibility +// ================================ -ASMJIT_BEGIN_NAMESPACE +// CPU features detection is a minefield on non-X86 platforms. The following list describes which +// operating systems and architectures are supported and the status of the implementation: +// +// * X86, X86_64: +// - All OSes supported +// - Detection is based on using a CPUID instruction, which is a user-space instruction, so there +// is no need to use any OS specific APIs or syscalls to detect all features provided by the CPU. +// +// * ARM32: +// - Linux - HWCAPS based detection. +// - FreeBSD - HWCAPS based detection (shared with Linux code). +// - NetBSD - NOT IMPLEMENTED! +// - OpenBSD - NOT IMPLEMENTED! +// - Apple - sysctlbyname() based detection (this architecture is deprecated on Apple HW). +// - Windows - IsProcessorFeaturePresent() based detection (only detects a subset of features). +// - Others - NOT IMPLEMENTED! +// +// * ARM64: +// - Linux - HWCAPS and CPUID based detection. +// - FreeBSD - HWCAPS and CPUID based detection (shared with Linux code). +// - NetBSD - NOT IMPLEMENTED! +// - OpenBSD - CPUID based detection (reading CPUID via sysctl's CTL_MACHDEP). +// - Apple - sysctlbyname() based detection with FamilyId matrix (record for each family id). +// - Windows - IsProcessorFeaturePresent() based detection (only detects a subset of features). +// - Others - NOT IMPLEMENTED! +// +// * Others +// - NOT IMPLEMENTED! // CpuInfo - Detect - HW-Thread Count // ================================== @@ -55,8 +110,14 @@ static inline uint32_t detectHWThreadCount() noexcept { // CpuInfo - Detect - X86 // ====================== +// X86 and X86_64 detection is based on CPUID. + #if ASMJIT_ARCH_X86 +namespace x86 { + +typedef CpuFeatures::X86 Ext; + struct cpuid_t { uint32_t eax, ebx, ecx, edx; }; struct xgetbv_t { uint32_t eax, edx; }; @@ -160,7 +221,7 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { cpu._maxLogicalProcessors = 1; // We are gonna execute CPUID, which was introduced by I486, so it's the requirement. - features.add(CpuFeatures::X86::kI486); + features.add(Ext::kI486); // CPUID EAX=0 // ----------- @@ -191,40 +252,40 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { if (familyId == 0x0Fu) familyId += ((regs.eax >> 20) & 0xFFu); - cpu._modelId = modelId; - cpu._familyId = familyId; - cpu._brandId = ((regs.ebx ) & 0xFF); - cpu._processorType = ((regs.eax >> 12) & 0x03); - cpu._maxLogicalProcessors = ((regs.ebx >> 16) & 0xFF); - cpu._stepping = ((regs.eax ) & 0x0F); - cpu._cacheLineSize = ((regs.ebx >> 8) & 0xFF) * 8; - - features.addIf(bitTest(regs.ecx, 0), CpuFeatures::X86::kSSE3); - features.addIf(bitTest(regs.ecx, 1), CpuFeatures::X86::kPCLMULQDQ); - features.addIf(bitTest(regs.ecx, 3), CpuFeatures::X86::kMONITOR); - features.addIf(bitTest(regs.ecx, 5), CpuFeatures::X86::kVMX); - features.addIf(bitTest(regs.ecx, 6), CpuFeatures::X86::kSMX); - features.addIf(bitTest(regs.ecx, 9), CpuFeatures::X86::kSSSE3); - features.addIf(bitTest(regs.ecx, 13), CpuFeatures::X86::kCMPXCHG16B); - features.addIf(bitTest(regs.ecx, 19), CpuFeatures::X86::kSSE4_1); - features.addIf(bitTest(regs.ecx, 20), CpuFeatures::X86::kSSE4_2); - features.addIf(bitTest(regs.ecx, 22), CpuFeatures::X86::kMOVBE); - features.addIf(bitTest(regs.ecx, 23), CpuFeatures::X86::kPOPCNT); - features.addIf(bitTest(regs.ecx, 25), CpuFeatures::X86::kAESNI); - features.addIf(bitTest(regs.ecx, 26), CpuFeatures::X86::kXSAVE); - features.addIf(bitTest(regs.ecx, 27), CpuFeatures::X86::kOSXSAVE); - features.addIf(bitTest(regs.ecx, 30), CpuFeatures::X86::kRDRAND); - features.addIf(bitTest(regs.edx, 0), CpuFeatures::X86::kFPU); - features.addIf(bitTest(regs.edx, 4), CpuFeatures::X86::kRDTSC); - features.addIf(bitTest(regs.edx, 5), CpuFeatures::X86::kMSR); - features.addIf(bitTest(regs.edx, 8), CpuFeatures::X86::kCMPXCHG8B); - features.addIf(bitTest(regs.edx, 15), CpuFeatures::X86::kCMOV); - features.addIf(bitTest(regs.edx, 19), CpuFeatures::X86::kCLFLUSH); - features.addIf(bitTest(regs.edx, 23), CpuFeatures::X86::kMMX); - features.addIf(bitTest(regs.edx, 24), CpuFeatures::X86::kFXSR); - features.addIf(bitTest(regs.edx, 25), CpuFeatures::X86::kSSE); - features.addIf(bitTest(regs.edx, 25), CpuFeatures::X86::kSSE, CpuFeatures::X86::kSSE2); - features.addIf(bitTest(regs.edx, 28), CpuFeatures::X86::kMT); + cpu._modelId = modelId; + cpu._familyId = familyId; + cpu._brandId = (regs.ebx) & 0xFF; + cpu._processorType = (regs.eax >> 12) & 0x03; + cpu._maxLogicalProcessors = (regs.ebx >> 16) & 0xFF; + cpu._stepping = (regs.eax) & 0x0F; + cpu._cacheLineSize = ((regs.ebx >> 8) & 0xFF) * 8; + + features.addIf(bitTest(regs.ecx, 0), Ext::kSSE3); + features.addIf(bitTest(regs.ecx, 1), Ext::kPCLMULQDQ); + features.addIf(bitTest(regs.ecx, 3), Ext::kMONITOR); + features.addIf(bitTest(regs.ecx, 5), Ext::kVMX); + features.addIf(bitTest(regs.ecx, 6), Ext::kSMX); + features.addIf(bitTest(regs.ecx, 9), Ext::kSSSE3); + features.addIf(bitTest(regs.ecx, 13), Ext::kCMPXCHG16B); + features.addIf(bitTest(regs.ecx, 19), Ext::kSSE4_1); + features.addIf(bitTest(regs.ecx, 20), Ext::kSSE4_2); + features.addIf(bitTest(regs.ecx, 22), Ext::kMOVBE); + features.addIf(bitTest(regs.ecx, 23), Ext::kPOPCNT); + features.addIf(bitTest(regs.ecx, 25), Ext::kAESNI); + features.addIf(bitTest(regs.ecx, 26), Ext::kXSAVE); + features.addIf(bitTest(regs.ecx, 27), Ext::kOSXSAVE); + features.addIf(bitTest(regs.ecx, 30), Ext::kRDRAND); + features.addIf(bitTest(regs.edx, 0), Ext::kFPU); + features.addIf(bitTest(regs.edx, 4), Ext::kRDTSC); + features.addIf(bitTest(regs.edx, 5), Ext::kMSR); + features.addIf(bitTest(regs.edx, 8), Ext::kCMPXCHG8B); + features.addIf(bitTest(regs.edx, 15), Ext::kCMOV); + features.addIf(bitTest(regs.edx, 19), Ext::kCLFLUSH); + features.addIf(bitTest(regs.edx, 23), Ext::kMMX); + features.addIf(bitTest(regs.edx, 24), Ext::kFXSR); + features.addIf(bitTest(regs.edx, 25), Ext::kSSE, Ext::kMMX2); + features.addIf(bitTest(regs.edx, 26), Ext::kSSE2, Ext::kSSE); + features.addIf(bitTest(regs.edx, 28), Ext::kMT); // Get the content of XCR0 if supported by the CPU and enabled by the OS. if (features.hasXSAVE() && features.hasOSXSAVE()) { @@ -236,9 +297,9 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { // - XCR0[2:1] == 11b // XMM & YMM states need to be enabled by OS. if ((xcr0.eax & 0x00000006u) == 0x00000006u) { - features.add(CpuFeatures::X86::kAVX); - features.addIf(bitTest(regs.ecx, 12), CpuFeatures::X86::kFMA); - features.addIf(bitTest(regs.ecx, 29), CpuFeatures::X86::kF16C); + features.add(Ext::kAVX); + features.addIf(bitTest(regs.ecx, 12), Ext::kFMA); + features.addIf(bitTest(regs.ecx, 29), Ext::kF16C); } } } @@ -270,84 +331,114 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { maybeMPX = bitTest(regs.ebx, 14); maxSubLeafId_0x7 = regs.eax; - features.addIf(bitTest(regs.ebx, 0), CpuFeatures::X86::kFSGSBASE); - features.addIf(bitTest(regs.ebx, 3), CpuFeatures::X86::kBMI); - features.addIf(bitTest(regs.ebx, 4), CpuFeatures::X86::kHLE); - features.addIf(bitTest(regs.ebx, 7), CpuFeatures::X86::kSMEP); - features.addIf(bitTest(regs.ebx, 8), CpuFeatures::X86::kBMI2); - features.addIf(bitTest(regs.ebx, 9), CpuFeatures::X86::kERMS); - features.addIf(bitTest(regs.ebx, 11), CpuFeatures::X86::kRTM); - features.addIf(bitTest(regs.ebx, 18), CpuFeatures::X86::kRDSEED); - features.addIf(bitTest(regs.ebx, 19), CpuFeatures::X86::kADX); - features.addIf(bitTest(regs.ebx, 20), CpuFeatures::X86::kSMAP); - features.addIf(bitTest(regs.ebx, 23), CpuFeatures::X86::kCLFLUSHOPT); - features.addIf(bitTest(regs.ebx, 24), CpuFeatures::X86::kCLWB); - features.addIf(bitTest(regs.ebx, 29), CpuFeatures::X86::kSHA); - features.addIf(bitTest(regs.ecx, 0), CpuFeatures::X86::kPREFETCHWT1); - features.addIf(bitTest(regs.ecx, 4), CpuFeatures::X86::kOSPKE); - features.addIf(bitTest(regs.ecx, 5), CpuFeatures::X86::kWAITPKG); - features.addIf(bitTest(regs.ecx, 7), CpuFeatures::X86::kCET_SS); - features.addIf(bitTest(regs.ecx, 8), CpuFeatures::X86::kGFNI); - features.addIf(bitTest(regs.ecx, 9), CpuFeatures::X86::kVAES); - features.addIf(bitTest(regs.ecx, 10), CpuFeatures::X86::kVPCLMULQDQ); - features.addIf(bitTest(regs.ecx, 22), CpuFeatures::X86::kRDPID); - features.addIf(bitTest(regs.ecx, 25), CpuFeatures::X86::kCLDEMOTE); - features.addIf(bitTest(regs.ecx, 27), CpuFeatures::X86::kMOVDIRI); - features.addIf(bitTest(regs.ecx, 28), CpuFeatures::X86::kMOVDIR64B); - features.addIf(bitTest(regs.ecx, 29), CpuFeatures::X86::kENQCMD); - features.addIf(bitTest(regs.edx, 5), CpuFeatures::X86::kUINTR); - features.addIf(bitTest(regs.edx, 14), CpuFeatures::X86::kSERIALIZE); - features.addIf(bitTest(regs.edx, 16), CpuFeatures::X86::kTSXLDTRK); - features.addIf(bitTest(regs.edx, 18), CpuFeatures::X86::kPCONFIG); - features.addIf(bitTest(regs.edx, 20), CpuFeatures::X86::kCET_IBT); + features.addIf(bitTest(regs.ebx, 0), Ext::kFSGSBASE); + features.addIf(bitTest(regs.ebx, 3), Ext::kBMI); + features.addIf(bitTest(regs.ebx, 4), Ext::kHLE); + features.addIf(bitTest(regs.ebx, 7), Ext::kSMEP); + features.addIf(bitTest(regs.ebx, 8), Ext::kBMI2); + features.addIf(bitTest(regs.ebx, 9), Ext::kERMS); + features.addIf(bitTest(regs.ebx, 11), Ext::kRTM); + features.addIf(bitTest(regs.ebx, 18), Ext::kRDSEED); + features.addIf(bitTest(regs.ebx, 19), Ext::kADX); + features.addIf(bitTest(regs.ebx, 20), Ext::kSMAP); + features.addIf(bitTest(regs.ebx, 23), Ext::kCLFLUSHOPT); + features.addIf(bitTest(regs.ebx, 24), Ext::kCLWB); + features.addIf(bitTest(regs.ebx, 29), Ext::kSHA); + features.addIf(bitTest(regs.ecx, 0), Ext::kPREFETCHWT1); + features.addIf(bitTest(regs.ecx, 4), Ext::kOSPKE); + features.addIf(bitTest(regs.ecx, 5), Ext::kWAITPKG); + features.addIf(bitTest(regs.ecx, 7), Ext::kCET_SS); + features.addIf(bitTest(regs.ecx, 8), Ext::kGFNI); + features.addIf(bitTest(regs.ecx, 9), Ext::kVAES); + features.addIf(bitTest(regs.ecx, 10), Ext::kVPCLMULQDQ); + features.addIf(bitTest(regs.ecx, 22), Ext::kRDPID); + features.addIf(bitTest(regs.ecx, 25), Ext::kCLDEMOTE); + features.addIf(bitTest(regs.ecx, 27), Ext::kMOVDIRI); + features.addIf(bitTest(regs.ecx, 28), Ext::kMOVDIR64B); + features.addIf(bitTest(regs.ecx, 29), Ext::kENQCMD); + features.addIf(bitTest(regs.edx, 4), Ext::kFSRM); + features.addIf(bitTest(regs.edx, 5), Ext::kUINTR); + features.addIf(bitTest(regs.edx, 14), Ext::kSERIALIZE); + features.addIf(bitTest(regs.edx, 16), Ext::kTSXLDTRK); + features.addIf(bitTest(regs.edx, 18), Ext::kPCONFIG); + features.addIf(bitTest(regs.edx, 20), Ext::kCET_IBT); // Detect 'TSX' - Requires at least one of `HLE` and `RTM` features. - if (features.hasHLE() || features.hasRTM()) - features.add(CpuFeatures::X86::kTSX); + if (features.hasHLE() || features.hasRTM()) { + features.add(Ext::kTSX); + } - // Detect 'AVX2' - Requires AVX as well. - if (bitTest(regs.ebx, 5) && features.hasAVX()) - features.add(CpuFeatures::X86::kAVX2); + if (bitTest(regs.ebx, 5) && features.hasAVX()) { + features.add(Ext::kAVX2); + } - // Detect 'AVX512'. if (avx512EnabledByOS && bitTest(regs.ebx, 16)) { - features.add(CpuFeatures::X86::kAVX512_F); - - features.addIf(bitTest(regs.ebx, 17), CpuFeatures::X86::kAVX512_DQ); - features.addIf(bitTest(regs.ebx, 21), CpuFeatures::X86::kAVX512_IFMA); - features.addIf(bitTest(regs.ebx, 26), CpuFeatures::X86::kAVX512_PFI); - features.addIf(bitTest(regs.ebx, 27), CpuFeatures::X86::kAVX512_ERI); - features.addIf(bitTest(regs.ebx, 28), CpuFeatures::X86::kAVX512_CDI); - features.addIf(bitTest(regs.ebx, 30), CpuFeatures::X86::kAVX512_BW); - features.addIf(bitTest(regs.ebx, 31), CpuFeatures::X86::kAVX512_VL); - features.addIf(bitTest(regs.ecx, 1), CpuFeatures::X86::kAVX512_VBMI); - features.addIf(bitTest(regs.ecx, 6), CpuFeatures::X86::kAVX512_VBMI2); - features.addIf(bitTest(regs.ecx, 11), CpuFeatures::X86::kAVX512_VNNI); - features.addIf(bitTest(regs.ecx, 12), CpuFeatures::X86::kAVX512_BITALG); - features.addIf(bitTest(regs.ecx, 14), CpuFeatures::X86::kAVX512_VPOPCNTDQ); - features.addIf(bitTest(regs.edx, 2), CpuFeatures::X86::kAVX512_4VNNIW); - features.addIf(bitTest(regs.edx, 3), CpuFeatures::X86::kAVX512_4FMAPS); - features.addIf(bitTest(regs.edx, 8), CpuFeatures::X86::kAVX512_VP2INTERSECT); - features.addIf(bitTest(regs.edx, 23), CpuFeatures::X86::kAVX512_FP16); + features.add(Ext::kAVX512_F); + + features.addIf(bitTest(regs.ebx, 17), Ext::kAVX512_DQ); + features.addIf(bitTest(regs.ebx, 21), Ext::kAVX512_IFMA); + features.addIf(bitTest(regs.ebx, 26), Ext::kAVX512_PF); + features.addIf(bitTest(regs.ebx, 27), Ext::kAVX512_ER); + features.addIf(bitTest(regs.ebx, 28), Ext::kAVX512_CD); + features.addIf(bitTest(regs.ebx, 30), Ext::kAVX512_BW); + features.addIf(bitTest(regs.ebx, 31), Ext::kAVX512_VL); + features.addIf(bitTest(regs.ecx, 1), Ext::kAVX512_VBMI); + features.addIf(bitTest(regs.ecx, 6), Ext::kAVX512_VBMI2); + features.addIf(bitTest(regs.ecx, 11), Ext::kAVX512_VNNI); + features.addIf(bitTest(regs.ecx, 12), Ext::kAVX512_BITALG); + features.addIf(bitTest(regs.ecx, 14), Ext::kAVX512_VPOPCNTDQ); + features.addIf(bitTest(regs.edx, 2), Ext::kAVX512_4VNNIW); + features.addIf(bitTest(regs.edx, 3), Ext::kAVX512_4FMAPS); + features.addIf(bitTest(regs.edx, 8), Ext::kAVX512_VP2INTERSECT); + features.addIf(bitTest(regs.edx, 23), Ext::kAVX512_FP16); } - // Detect 'AMX'. if (amxEnabledByOS) { - features.addIf(bitTest(regs.edx, 22), CpuFeatures::X86::kAMX_BF16); - features.addIf(bitTest(regs.edx, 24), CpuFeatures::X86::kAMX_TILE); - features.addIf(bitTest(regs.edx, 25), CpuFeatures::X86::kAMX_INT8); + features.addIf(bitTest(regs.edx, 22), Ext::kAMX_BF16); + features.addIf(bitTest(regs.edx, 24), Ext::kAMX_TILE); + features.addIf(bitTest(regs.edx, 25), Ext::kAMX_INT8); } } // CPUID EAX=7 ECX=1 // ----------------- - if (features.hasAVX512_F() && maxSubLeafId_0x7 >= 1) { + if (maxSubLeafId_0x7 >= 1) { cpuidQuery(®s, 0x7, 1); - features.addIf(bitTest(regs.eax, 3), CpuFeatures::X86::kAVX_VNNI); - features.addIf(bitTest(regs.eax, 5), CpuFeatures::X86::kAVX512_BF16); - features.addIf(bitTest(regs.eax, 22), CpuFeatures::X86::kHRESET); + features.addIf(bitTest(regs.eax, 0), Ext::kSHA512); + features.addIf(bitTest(regs.eax, 1), Ext::kSM3); + features.addIf(bitTest(regs.eax, 2), Ext::kSM4); + features.addIf(bitTest(regs.eax, 3), Ext::kRAO_INT); + features.addIf(bitTest(regs.eax, 7), Ext::kCMPCCXADD); + features.addIf(bitTest(regs.eax, 10), Ext::kFZRM); + features.addIf(bitTest(regs.eax, 11), Ext::kFSRS); + features.addIf(bitTest(regs.eax, 12), Ext::kFSRC); + features.addIf(bitTest(regs.eax, 19), Ext::kWRMSRNS); + features.addIf(bitTest(regs.eax, 22), Ext::kHRESET); + features.addIf(bitTest(regs.eax, 26), Ext::kLAM); + features.addIf(bitTest(regs.eax, 27), Ext::kMSRLIST); + features.addIf(bitTest(regs.ebx, 1), Ext::kTSE); + features.addIf(bitTest(regs.edx, 14), Ext::kPREFETCHI); + features.addIf(bitTest(regs.edx, 18), Ext::kCET_SSS); + features.addIf(bitTest(regs.edx, 21), Ext::kAPX_F); + + if (features.hasAVX2()) { + features.addIf(bitTest(regs.eax, 4), Ext::kAVX_VNNI); + features.addIf(bitTest(regs.eax, 23), Ext::kAVX_IFMA); + features.addIf(bitTest(regs.edx, 4), Ext::kAVX_VNNI_INT8); + features.addIf(bitTest(regs.edx, 5), Ext::kAVX_NE_CONVERT); + features.addIf(bitTest(regs.edx, 10), Ext::kAVX_VNNI_INT16); + } + + if (features.hasAVX512_F()) { + features.addIf(bitTest(regs.eax, 5), Ext::kAVX512_BF16); + } + + if (amxEnabledByOS) { + features.addIf(bitTest(regs.eax, 21), Ext::kAMX_FP16); + features.addIf(bitTest(regs.edx, 8), Ext::kAMX_COMPLEX); + } } // CPUID EAX=13 ECX=0 @@ -358,13 +449,13 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { // Both CPUID result and XCR0 has to be enabled to have support for MPX. if (((regs.eax & xcr0.eax) & 0x00000018u) == 0x00000018u && maybeMPX) - features.add(CpuFeatures::X86::kMPX); + features.add(Ext::kMPX); cpuidQuery(®s, 0xD, 1); - features.addIf(bitTest(regs.eax, 0), CpuFeatures::X86::kXSAVEOPT); - features.addIf(bitTest(regs.eax, 1), CpuFeatures::X86::kXSAVEC); - features.addIf(bitTest(regs.eax, 3), CpuFeatures::X86::kXSAVES); + features.addIf(bitTest(regs.eax, 0), Ext::kXSAVEOPT); + features.addIf(bitTest(regs.eax, 1), Ext::kXSAVEC); + features.addIf(bitTest(regs.eax, 3), Ext::kXSAVES); } // CPUID EAX=14 ECX=0 @@ -373,7 +464,7 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { if (maxId >= 0xE) { cpuidQuery(®s, 0xE, 0); - features.addIf(bitTest(regs.ebx, 4), CpuFeatures::X86::kPTWRITE); + features.addIf(bitTest(regs.ebx, 4), Ext::kPTWRITE); } // CPUID EAX=0x80000000...maxId @@ -396,32 +487,32 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { break; case 0x80000001u: - features.addIf(bitTest(regs.ecx, 0), CpuFeatures::X86::kLAHFSAHF); - features.addIf(bitTest(regs.ecx, 2), CpuFeatures::X86::kSVM); - features.addIf(bitTest(regs.ecx, 5), CpuFeatures::X86::kLZCNT); - features.addIf(bitTest(regs.ecx, 6), CpuFeatures::X86::kSSE4A); - features.addIf(bitTest(regs.ecx, 7), CpuFeatures::X86::kMSSE); - features.addIf(bitTest(regs.ecx, 8), CpuFeatures::X86::kPREFETCHW); - features.addIf(bitTest(regs.ecx, 12), CpuFeatures::X86::kSKINIT); - features.addIf(bitTest(regs.ecx, 15), CpuFeatures::X86::kLWP); - features.addIf(bitTest(regs.ecx, 21), CpuFeatures::X86::kTBM); - features.addIf(bitTest(regs.ecx, 29), CpuFeatures::X86::kMONITORX); - features.addIf(bitTest(regs.edx, 20), CpuFeatures::X86::kNX); - features.addIf(bitTest(regs.edx, 21), CpuFeatures::X86::kFXSROPT); - features.addIf(bitTest(regs.edx, 22), CpuFeatures::X86::kMMX2); - features.addIf(bitTest(regs.edx, 27), CpuFeatures::X86::kRDTSCP); - features.addIf(bitTest(regs.edx, 29), CpuFeatures::X86::kPREFETCHW); - features.addIf(bitTest(regs.edx, 30), CpuFeatures::X86::k3DNOW2, CpuFeatures::X86::kMMX2); - features.addIf(bitTest(regs.edx, 31), CpuFeatures::X86::kPREFETCHW); + features.addIf(bitTest(regs.ecx, 0), Ext::kLAHFSAHF); + features.addIf(bitTest(regs.ecx, 2), Ext::kSVM); + features.addIf(bitTest(regs.ecx, 5), Ext::kLZCNT); + features.addIf(bitTest(regs.ecx, 6), Ext::kSSE4A); + features.addIf(bitTest(regs.ecx, 7), Ext::kMSSE); + features.addIf(bitTest(regs.ecx, 8), Ext::kPREFETCHW); + features.addIf(bitTest(regs.ecx, 12), Ext::kSKINIT); + features.addIf(bitTest(regs.ecx, 15), Ext::kLWP); + features.addIf(bitTest(regs.ecx, 21), Ext::kTBM); + features.addIf(bitTest(regs.ecx, 29), Ext::kMONITORX); + features.addIf(bitTest(regs.edx, 20), Ext::kNX); + features.addIf(bitTest(regs.edx, 21), Ext::kFXSROPT); + features.addIf(bitTest(regs.edx, 22), Ext::kMMX2); + features.addIf(bitTest(regs.edx, 27), Ext::kRDTSCP); + features.addIf(bitTest(regs.edx, 29), Ext::kPREFETCHW); + features.addIf(bitTest(regs.edx, 30), Ext::k3DNOW2, Ext::kMMX2); + features.addIf(bitTest(regs.edx, 31), Ext::kPREFETCHW); if (features.hasAVX()) { - features.addIf(bitTest(regs.ecx, 11), CpuFeatures::X86::kXOP); - features.addIf(bitTest(regs.ecx, 16), CpuFeatures::X86::kFMA4); + features.addIf(bitTest(regs.ecx, 11), Ext::kXOP); + features.addIf(bitTest(regs.ecx, 16), Ext::kFMA4); } // This feature seems to be only supported by AMD. if (cpu.isVendor("AMD")) { - features.addIf(bitTest(regs.ecx, 4), CpuFeatures::X86::kALTMOVCR8); + features.addIf(bitTest(regs.ecx, 4), Ext::kALTMOVCR8); } break; @@ -439,17 +530,21 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { break; case 0x80000008u: - features.addIf(bitTest(regs.ebx, 0), CpuFeatures::X86::kCLZERO); - features.addIf(bitTest(regs.ebx, 0), CpuFeatures::X86::kRDPRU); - features.addIf(bitTest(regs.ebx, 8), CpuFeatures::X86::kMCOMMIT); - features.addIf(bitTest(regs.ebx, 9), CpuFeatures::X86::kWBNOINVD); + features.addIf(bitTest(regs.ebx, 0), Ext::kCLZERO); + features.addIf(bitTest(regs.ebx, 0), Ext::kRDPRU); + features.addIf(bitTest(regs.ebx, 8), Ext::kMCOMMIT); + features.addIf(bitTest(regs.ebx, 9), Ext::kWBNOINVD); // Go directly to the next one we are interested in. i = 0x8000001Fu - 1; break; case 0x8000001Fu: - features.addIf(bitTest(regs.eax, 4), CpuFeatures::X86::kSNP); + features.addIf(bitTest(regs.eax, 0), Ext::kSME); + features.addIf(bitTest(regs.eax, 1), Ext::kSEV); + features.addIf(bitTest(regs.eax, 3), Ext::kSEV_ES); + features.addIf(bitTest(regs.eax, 4), Ext::kSEV_SNP); + features.addIf(bitTest(regs.eax, 6), Ext::kRMPQUERY); break; } } while (++i <= maxId); @@ -458,11 +553,17 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { simplifyCpuBrand(cpu._brand.str); } +} // {x86} + #endif // ASMJIT_ARCH_X86 // CpuInfo - Detect - ARM // ====================== +// Implement the most code outside the platform specific #ifdefs to minimize breaking the detection on +// platforms that don't run on our CI infrastructure. The problem with the detection is that every OS +// requires a specific implementation as ARM features cannot be detected in user-mode without OS enablement. + // The most relevant and accurate information can be found here: // https://github.com/llvm-project/llvm/blob/master/lib/Target/AArch64/AArch64.td // https://github.com/apple/llvm-project/blob/apple/main/llvm/lib/Target/AArch64/AArch64.td (Apple fork) @@ -470,277 +571,921 @@ static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept { // Other resources: // https://en.wikipedia.org/wiki/AArch64 // https://en.wikipedia.org/wiki/Apple_silicon#List_of_Apple_processors +// https://developer.arm.com/downloads/-/exploration-tools/feature-names-for-a-profile // https://developer.arm.com/architectures/learn-the-architecture/understanding-the-armv8-x-extensions/single-page #if ASMJIT_ARCH_ARM +namespace arm { + +// ARM commonly refers to CPU features using FEAT_ prefix, we use Ext:: to make it compatible with other parts. +typedef CpuFeatures::ARM Ext; + +// CpuInfo - Detect - ARM - OS Kernel Version +// ========================================== + +#if defined(__linux__) +struct UNameKernelVersion { + int parts[3]; + + inline bool atLeast(int major, int minor, int patch = 0) const noexcept { + if (parts[0] >= major) { + if (parts[0] > major) + return true; + + if (parts[1] >= minor) { + if (parts[1] > minor) + return true; + + return parts[2] >= patch; + } + } + + return false; + } +}; + +ASMJIT_MAYBE_UNUSED +static UNameKernelVersion getUNameKernelVersion() noexcept { + UNameKernelVersion ver{}; + ver.parts[0] = -1; + + utsname buffer; + if (uname(&buffer) != 0) + return ver; + + size_t count = 0; + char* p = buffer.release; + while (*p) { + uint32_t c = uint8_t(*p); + if (c >= uint32_t('0') && c <= uint32_t('9')) { + ver.parts[count] = int(strtol(p, &p, 10)); + if (++count == 3) + break; + } + else if (c == '.' || c == '-') { + p++; + } + else { + break; + } + } + + return ver; +} +#endif // __linux__ + +// CpuInfo - Detect - ARM - Baseline Features of ARM Architectures +// =============================================================== + +ASMJIT_MAYBE_UNUSED +static inline void populateBaseAArch32Features(CpuFeatures::ARM& features) noexcept { + // No baseline flags at the moment. + DebugUtils::unused(features); +} + +ASMJIT_MAYBE_UNUSED +static inline void populateBaseAArch64Features(CpuFeatures::ARM& features) noexcept { + // AArch64 is based on ARMv8.0 and later. + features.add(Ext::kARMv6); + features.add(Ext::kARMv7); + features.add(Ext::kARMv8a); + + // AArch64 comes with these features by default. + features.add(Ext::kASIMD); + features.add(Ext::kFP); + features.add(Ext::kIDIVA); +} + static inline void populateBaseARMFeatures(CpuInfo& cpu) noexcept { #if ASMJIT_ARCH_ARM == 32 - // No baseline flags at the moment. - DebugUtils::unused(cpu); + populateBaseAArch32Features(cpu.features().arm()); #else - // AArch64 is based on ARMv8-A and later. - cpu.addFeature(CpuFeatures::ARM::kARMv6); - cpu.addFeature(CpuFeatures::ARM::kARMv7); - cpu.addFeature(CpuFeatures::ARM::kARMv8a); + populateBaseAArch64Features(cpu.features().arm()); +#endif +} - // AArch64 comes with these features by default. - cpu.addFeature(CpuFeatures::ARM::kVFPv2); - cpu.addFeature(CpuFeatures::ARM::kVFPv3); - cpu.addFeature(CpuFeatures::ARM::kVFPv4); - cpu.addFeature(CpuFeatures::ARM::kASIMD); - cpu.addFeature(CpuFeatures::ARM::kIDIVA); +// CpuInfo - Detect - ARM - Mandatory Features of ARM Architectures +// ================================================================ + +// Populates mandatory ARMv8.[v]A features. +ASMJIT_MAYBE_UNUSED +static ASMJIT_FAVOR_SIZE void populateARMv8AFeatures(CpuFeatures::ARM& features, uint32_t v) noexcept { + switch (v) { + default: + ASMJIT_FALLTHROUGH; + case 9: // ARMv8.9 + features.add(Ext::kCLRBHB, Ext::kCSSC, Ext::kPRFMSLC, Ext::kSPECRES2, Ext::kRAS2); + ASMJIT_FALLTHROUGH; + case 8: // ARMv8.8 + features.add(Ext::kHBC, Ext::kMOPS, Ext::kNMI); + ASMJIT_FALLTHROUGH; + case 7: // ARMv8.7 + features.add(Ext::kHCX, Ext::kPAN3, Ext::kWFXT, Ext::kXS); + ASMJIT_FALLTHROUGH; + case 6: // ARMv8.6 + features.add(Ext::kAMU1_1, Ext::kBF16, Ext::kECV, Ext::kFGT, Ext::kI8MM); + ASMJIT_FALLTHROUGH; + case 5: // ARMv8.5 + features.add(Ext::kBTI, Ext::kCSV2, Ext::kDPB2, Ext::kFLAGM2, Ext::kFRINTTS, Ext::kSB, Ext::kSPECRES, Ext::kSSBS); + ASMJIT_FALLTHROUGH; + case 4: // ARMv8.4 + features.add(Ext::kAMU1, Ext::kDIT, Ext::kDOTPROD, Ext::kFLAGM, + Ext::kLRCPC2, Ext::kLSE2, Ext::kMPAM, Ext::kNV, + Ext::kSEL2, Ext::kTLBIOS, Ext::kTLBIRANGE, Ext::kTRF); + ASMJIT_FALLTHROUGH; + case 3: // ARMv8.3 + features.add(Ext::kCCIDX, Ext::kFCMA, Ext::kJSCVT, Ext::kLRCPC, Ext::kPAUTH); + ASMJIT_FALLTHROUGH; + case 2: // ARMv8.2 + features.add(Ext::kDPB, Ext::kPAN2, Ext::kRAS, Ext::kUAO); + ASMJIT_FALLTHROUGH; + case 1: // ARMv8.1 + features.add(Ext::kCRC32, Ext::kLOR, Ext::kLSE, Ext::kPAN, Ext::kRDM, Ext::kVHE); + ASMJIT_FALLTHROUGH; + case 0: // ARMv8.0 + features.add(Ext::kASIMD, Ext::kFP, Ext::kIDIVA, Ext::kVFP_D32); + break; + } +} + +// Populates mandatory ARMv9.[v] features. +ASMJIT_MAYBE_UNUSED +static ASMJIT_FAVOR_SIZE void populateARMv9AFeatures(CpuFeatures::ARM& features, uint32_t v) noexcept { + populateARMv8AFeatures(features, v <= 4u ? 5u + v : 9u); + + switch (v) { + default: + ASMJIT_FALLTHROUGH; + case 4: // ARMv9.4 - based on ARMv8.9. + ASMJIT_FALLTHROUGH; + case 3: // ARMv9.3 - based on ARMv8.8. + ASMJIT_FALLTHROUGH; + case 2: // ARMv9.2 - based on ARMv8.7. + ASMJIT_FALLTHROUGH; + case 1: // ARMv9.1 - based on ARMv8.6. + ASMJIT_FALLTHROUGH; + case 0: // ARMv9.0 - based on ARMv8.5. + features.add(Ext::kRME, Ext::kSVE, Ext::kSVE2); + break; + } +} + +// CpuInfo - Detect - ARM - CPUID Based Features +// ============================================= + +// This implements detection based on the content of CPUID registers. The following code doesn't actually read any +// of the registers so it's an implementation that can theoretically be tested / used in mocks. + +// Merges a feature that contains 0b1111 when it doesn't exist and starts at 0b0000 when it does. +ASMJIT_MAYBE_UNUSED +static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeatureNA(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset, + Ext::Id f0, + Ext::Id f1 = Ext::kNone, + Ext::Id f2 = Ext::kNone, + Ext::Id f3 = Ext::kNone) noexcept { + + uint32_t val = uint32_t((regBits >> offset) & 0xFu); + + // If val == 0b1111 then the feature is not implemented in this case (some early extensions). + if (val == 0xFu) + return; + + if (f0 != Ext::kNone) features.add(f0); + if (f1 != Ext::kNone) features.addIf(val >= 1, f1); + if (f2 != Ext::kNone) features.addIf(val >= 2, f2); + if (f3 != Ext::kNone) features.addIf(val >= 3, f3); +} + +// Merges a feature identified by a single bit at `offset`. +ASMJIT_MAYBE_UNUSED +static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeature1B(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset, Ext::Id f1) noexcept { + features.addIf((regBits & (uint64_t(1) << offset)) != 0, f1); +} + +// Merges a feature-list starting from 0b01 when it does (0b00 means feature not supported). +ASMJIT_MAYBE_UNUSED +static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeature2B(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset, Ext::Id f1, Ext::Id f2, Ext::Id f3) noexcept { + uint32_t val = uint32_t((regBits >> offset) & 0x3u); + + if (f1 != Ext::kNone) features.addIf(val >= 1, f1); + if (f2 != Ext::kNone) features.addIf(val >= 2, f2); + if (f3 != Ext::kNone) features.addIf(val == 3, f3); +} + +// Merges a feature-list starting from 0b0001 when it does (0b0000 means feature not supported). +ASMJIT_MAYBE_UNUSED +static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeature4B(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset, + Ext::Id f1, + Ext::Id f2 = Ext::kNone, + Ext::Id f3 = Ext::kNone, + Ext::Id f4 = Ext::kNone) noexcept { + + uint32_t val = uint32_t((regBits >> offset) & 0xFu); + + // if val == 0 it means that this feature is not supported. + + if (f1 != Ext::kNone) features.addIf(val >= 1, f1); + if (f2 != Ext::kNone) features.addIf(val >= 2, f2); + if (f3 != Ext::kNone) features.addIf(val >= 3, f3); + if (f4 != Ext::kNone) features.addIf(val >= 4, f4); +} + +// Merges a feature that is identified by an exact bit-combination of 4 bits. +ASMJIT_MAYBE_UNUSED +static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeature4S(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset, uint32_t value, Ext::Id f1) noexcept { + features.addIf(uint32_t((regBits >> offset) & 0xFu) == value, f1); +} + +#define MERGE_FEATURE_NA(identifier, reg, offset, ...) mergeAArch64CPUIDFeatureNA(cpu.features().arm(), reg, offset, __VA_ARGS__) +#define MERGE_FEATURE_1B(identifier, reg, offset, ...) mergeAArch64CPUIDFeature1B(cpu.features().arm(), reg, offset, __VA_ARGS__) +#define MERGE_FEATURE_2B(identifier, reg, offset, ...) mergeAArch64CPUIDFeature2B(cpu.features().arm(), reg, offset, __VA_ARGS__) +#define MERGE_FEATURE_4B(identifier, reg, offset, ...) mergeAArch64CPUIDFeature4B(cpu.features().arm(), reg, offset, __VA_ARGS__) +#define MERGE_FEATURE_4S(identifier, reg, offset, ...) mergeAArch64CPUIDFeature4S(cpu.features().arm(), reg, offset, __VA_ARGS__) + +// Detects features based on the content of ID_AA64PFR0_EL1 and ID_AA64PFR1_EL1 registers. +ASMJIT_MAYBE_UNUSED +static inline void detectAArch64FeaturesViaCPUID_AA64PFR0_AA64PFR1(CpuInfo& cpu, uint64_t fpr0, uint64_t fpr1) noexcept { + // ID_AA64PFR0_EL1 + // =============== + + // FP and AdvSIMD bits should match (i.e. if FP features FP16, ASIMD must feature it too). + MERGE_FEATURE_NA("FP bits [19:16]" , fpr0, 16, Ext::kFP, Ext::kFP16); + MERGE_FEATURE_NA("AdvSIMD bits [23:20]" , fpr0, 20, Ext::kASIMD, Ext::kFP16); + /* + MERGE_FEATURE_4B("GIC bits [27:24]" , fpr0, 24, ...); + */ + MERGE_FEATURE_4B("RAS bits [31:28]" , fpr0, 28, Ext::kRAS, Ext::kRAS1_1, Ext::kRAS2); + MERGE_FEATURE_4B("SVE bits [35:32]" , fpr0, 32, Ext::kSVE); + MERGE_FEATURE_4B("SEL2 bits [39:36]" , fpr0, 36, Ext::kSEL2); + MERGE_FEATURE_4B("MPAM bits [43:40]" , fpr0, 40, Ext::kMPAM); + MERGE_FEATURE_4B("AMU bits [47:44]" , fpr0, 44, Ext::kAMU1, Ext::kAMU1_1); + MERGE_FEATURE_4B("DIT bits [51:48]" , fpr0, 48, Ext::kDIT); + MERGE_FEATURE_4B("RME bits [55:52]" , fpr0, 52, Ext::kRME); + MERGE_FEATURE_4B("CSV2 bits [59:56]" , fpr0, 56, Ext::kCSV2, Ext::kCSV2, Ext::kCSV2, Ext::kCSV2_3); + MERGE_FEATURE_4B("CSV3 bits [63:60]" , fpr0, 60, Ext::kCSV3); + + // ID_AA64PFR1_EL1 + // =============== + + MERGE_FEATURE_4B("BT bits [3:0]" , fpr1, 0, Ext::kBTI); + MERGE_FEATURE_4B("SSBS bits [7:4]" , fpr1, 4, Ext::kSSBS, Ext::kSSBS2); + MERGE_FEATURE_4B("MTE bits [11:8]" , fpr1, 8, Ext::kMTE, Ext::kMTE2, Ext::kMTE3); + /* + MERGE_FEATURE_4B("RAS_frac bits [15:12]" , fpr1, 12, ...); + MERGE_FEATURE_4B("MPAM_frac bits [19:16]" , fpr1, 16, ...); + */ + MERGE_FEATURE_4B("SME bits [27:24]" , fpr1, 24, Ext::kSME, Ext::kSME2); + MERGE_FEATURE_4B("RNDR_trap bits [31:28]" , fpr1, 28, Ext::kRNG_TRAP); + /* + MERGE_FEATURE_4B("CSV2_frac bits [35:32]" , fpr1, 32, ...); + */ + MERGE_FEATURE_4B("NMI bits [39:36]" , fpr1, 36, Ext::kNMI); + /* + MERGE_FEATURE_4B("MTE_frac bits [43:40]" , fpr1, 40, ...); + */ + MERGE_FEATURE_4B("GCS bits [47:44]" , fpr1, 44, Ext::kGCS); + MERGE_FEATURE_4B("THE bits [51:48]" , fpr1, 48, Ext::kTHE); + + // MTEX extensions are only available when MTE3 is available. + if (cpu.features().arm().hasMTE3()) + MERGE_FEATURE_4B("MTEX bits [55:52]" , fpr1, 52, Ext::kMTE4); + + /* + MERGE_FEATURE_4B("DF2 bits [59:56]" , fpr1, 56, ...); + */ + MERGE_FEATURE_4B("PFAR bits [63:60]" , fpr1, 60, Ext::kPFAR); + + // ID_AA64PFR0_EL1 + ID_AA64PFR1_EL1 + // ================================= + + uint32_t rasMain = uint32_t((fpr0 >> 28) & 0xFu); + uint32_t rasFrac = uint32_t((fpr1 >> 12) & 0xFu); + + if (rasMain == 1 && rasFrac == 1) { + cpu.features().arm().add(Ext::kRAS1_1); + } + + uint32_t mpamMain = uint32_t((fpr0 >> 40) & 0xFu); + uint32_t mpamFrac = uint32_t((fpr1 >> 16) & 0xFu); + + if (mpamMain || mpamFrac) + cpu.features().arm().add(Ext::kMPAM); +} + +// Detects features based on the content of ID_AA64ISAR0_EL1 and ID_AA64ISAR1_EL1 registers. +ASMJIT_MAYBE_UNUSED +static inline void detectAArch64FeaturesViaCPUID_AA64ISAR0_AA64ISAR1(CpuInfo& cpu, uint64_t isar0, uint64_t isar1) noexcept { + // ID_AA64ISAR0_EL1 + // ================ + + MERGE_FEATURE_4B("AES bits [7:4]" , isar0, 4, Ext::kAES, Ext::kPMULL); + MERGE_FEATURE_4B("SHA1 bits [11:8]" , isar0, 8, Ext::kSHA1); + MERGE_FEATURE_4B("SHA2 bits [15:12]" , isar0, 12, Ext::kSHA256, Ext::kSHA512); + MERGE_FEATURE_4B("CRC32 bits [19:16]" , isar0, 16, Ext::kCRC32); + MERGE_FEATURE_4B("Atomic bits [23:20]" , isar0, 20, Ext::kNone, Ext::kLSE, Ext::kLSE128); + MERGE_FEATURE_4B("TME bits [27:24]" , isar0, 24, Ext::kTME); + MERGE_FEATURE_4B("RDM bits [31:28]" , isar0, 28, Ext::kRDM); + MERGE_FEATURE_4B("SHA3 bits [35:32]" , isar0, 32, Ext::kSHA3); + MERGE_FEATURE_4B("SM3 bits [39:36]" , isar0, 36, Ext::kSM3); + MERGE_FEATURE_4B("SM4 bits [43:40]" , isar0, 40, Ext::kSM4); + MERGE_FEATURE_4B("DP bits [47:44]" , isar0, 44, Ext::kDOTPROD); + MERGE_FEATURE_4B("FHM bits [51:48]" , isar0, 48, Ext::kFHM); + MERGE_FEATURE_4B("TS bits [55:52]" , isar0, 52, Ext::kFLAGM, Ext::kFLAGM2); + /* + MERGE_FEATURE_4B("TLB bits [59:56]" , isar0, 56, ...); + */ + MERGE_FEATURE_4B("RNDR bits [63:60]" , isar0, 60, Ext::kFLAGM, Ext::kRNG); + + // ID_AA64ISAR1_EL1 + // ================ + + MERGE_FEATURE_4B("DPB bits [3:0]" , isar1, 0, Ext::kDPB, Ext::kDPB2); + /* + MERGE_FEATURE_4B("APA bits [7:4]" , isar1, 4, ...); + MERGE_FEATURE_4B("API bits [11:8]" , isar1, 8, ...); + */ + MERGE_FEATURE_4B("JSCVT bits [15:12]" , isar1, 12, Ext::kJSCVT); + MERGE_FEATURE_4B("FCMA bits [19:16]" , isar1, 16, Ext::kFCMA); + MERGE_FEATURE_4B("LRCPC bits [23:20]" , isar1, 20, Ext::kLRCPC, Ext::kLRCPC2, Ext::kLRCPC3); + /* + MERGE_FEATURE_4B("GPA bits [27:24]" , isar1, 24, ...); + MERGE_FEATURE_4B("GPI bits [31:28]" , isar1, 28, ...); + */ + MERGE_FEATURE_4B("FRINTTS bits [35:32]" , isar1, 32, Ext::kFRINTTS); + MERGE_FEATURE_4B("SB bits [39:36]" , isar1, 36, Ext::kSB); + MERGE_FEATURE_4B("SPECRES bits [43:40]" , isar1, 40, Ext::kSPECRES, Ext::kSPECRES2); + MERGE_FEATURE_4B("BF16 bits [47:44]" , isar1, 44, Ext::kBF16, Ext::kEBF16); + MERGE_FEATURE_4B("DGH bits [51:48]" , isar1, 48, Ext::kDGH); + MERGE_FEATURE_4B("I8MM bits [55:52]" , isar1, 52, Ext::kI8MM); + MERGE_FEATURE_4B("XS bits [59:56]" , isar1, 56, Ext::kXS); + MERGE_FEATURE_4B("LS64 bits [63:60]" , isar1, 60, Ext::kLS64, Ext::kLS64_V, Ext::kLS64_ACCDATA); +} + +// Detects features based on the content of ID_AA64ISAR2_EL1 register. +ASMJIT_MAYBE_UNUSED +static inline void detectAArch64FeaturesViaCPUID_AA64ISAR2(CpuInfo& cpu, uint64_t isar2) noexcept { + MERGE_FEATURE_4B("WFxT bits [3:0]" , isar2, 0, Ext::kNone, Ext::kWFXT); + MERGE_FEATURE_4B("RPRES bits [7:4]" , isar2, 4, Ext::kRPRES); + /* + MERGE_FEATURE_4B("GPA3 bits [11:8]" , isar2, 8, ...); + MERGE_FEATURE_4B("APA3 bits [15:12]" , isar2, 12, ...); + */ + MERGE_FEATURE_4B("MOPS bits [19:16]" , isar2, 16, Ext::kMOPS); + MERGE_FEATURE_4B("BC bits [23:20]" , isar2, 20, Ext::kHBC); + MERGE_FEATURE_4B("PAC_frac bits [27:24]" , isar2, 24, Ext::kCONSTPACFIELD); + MERGE_FEATURE_4B("CLRBHB bits [31:28]" , isar2, 28, Ext::kCLRBHB); + MERGE_FEATURE_4B("SYSREG128 bits [35:32]" , isar2, 32, Ext::kSYSREG128); + MERGE_FEATURE_4B("SYSINSTR128 bits [39:36]" , isar2, 36, Ext::kSYSINSTR128); + MERGE_FEATURE_4B("PRFMSLC bits [43:40]" , isar2, 40, Ext::kPRFMSLC); + MERGE_FEATURE_4B("RPRFM bits [51:48]" , isar2, 48, Ext::kRPRFM); + MERGE_FEATURE_4B("CSSC bits [55:52]" , isar2, 52, Ext::kCSSC); + MERGE_FEATURE_4B("LUT bits [59:56]" , isar2, 56, Ext::kLUT); +} + +// TODO: This register is not accessed at the moment. +#if 0 +// Detects features based on the content of ID_AA64ISAR3_EL1register. +ASMJIT_MAYBE_UNUSED +static inline void detectAArch64FeaturesViaCPUID_AA64ISAR3(CpuInfo& cpu, uint64_t isar3) noexcept { + // ID_AA64ISAR3_EL1 + // ================ + + MERGE_FEATURE_4B("CPA bits [3:0]" , isar3, 0, Ext::kCPA, Ext::kCPA2); + MERGE_FEATURE_4B("FAMINMAX bits [7:4]" , isar3, 4, Ext::kFAMINMAX); + MERGE_FEATURE_4B("TLBIW bits [11:8]" , isar3, 8, Ext::kTLBIW); +} #endif + +ASMJIT_MAYBE_UNUSED +static inline void detectAArch64FeaturesViaCPUID_AA64MMFR0(CpuInfo& cpu, uint64_t mmfr0) noexcept { + // ID_AA64MMFR0_EL1 + // ================ + + /* + MERGE_FEATURE_4B("PARange bits [3:0]" , mmfr0, 0, ...); + MERGE_FEATURE_4B("ASIDBits bits [7:4]" , mmfr0, 4, ...); + MERGE_FEATURE_4B("BigEnd bits [11:8]" , mmfr0, 8, ...); + MERGE_FEATURE_4B("SNSMem bits [15:12]" , mmfr0, 12, ...); + MERGE_FEATURE_4B("BigEndEL0 bits [19:16]" , mmfr0, 16, ...); + MERGE_FEATURE_4B("TGran16 bits [23:20]" , mmfr0, 20, ...); + MERGE_FEATURE_4B("TGran64 bits [27:24]" , mmfr0, 24, ...); + MERGE_FEATURE_4B("TGran4 bits [31:28]" , mmfr0, 28, ...); + MERGE_FEATURE_4B("TGran16_2 bits [35:32]" , mmfr0, 32, ...); + MERGE_FEATURE_4B("TGran64_2 bits [39:36]" , mmfr0, 36, ...); + MERGE_FEATURE_4B("TGran4_2 bits [43:40]" , mmfr0, 40, ...); + MERGE_FEATURE_4B("ExS bits [47:44]" , mmfr0, 44, ...); + */ + MERGE_FEATURE_4B("FGT bits [59:56]" , mmfr0, 56, Ext::kFGT, Ext::kFGT2); + MERGE_FEATURE_4B("ECV bits [63:60]" , mmfr0, 60, Ext::kECV); } +ASMJIT_MAYBE_UNUSED +static inline void detectAArch64FeaturesViaCPUID_AA64MMFR1(CpuInfo& cpu, uint64_t mmfr1) noexcept { + // ID_AA64MMFR1_EL1 + // ================ + + MERGE_FEATURE_4B("HAFDBS bits [3:0]" , mmfr1, 0, Ext::kHAFDBS, Ext::kNone, Ext::kHAFT, Ext::kHDBSS); + MERGE_FEATURE_4B("VMIDBits bits [7:4]" , mmfr1, 4, Ext::kVMID16); + MERGE_FEATURE_4B("VH bits [11:8]" , mmfr1, 8, Ext::kVHE); + MERGE_FEATURE_4B("HPDS bits [15:12]" , mmfr1, 12, Ext::kHPDS, Ext::kHPDS2); + MERGE_FEATURE_4B("LO bits [19:16]" , mmfr1, 16, Ext::kLOR); + MERGE_FEATURE_4B("PAN bits [23:20]" , mmfr1, 20, Ext::kPAN, Ext::kPAN2, Ext::kPAN3); + /* + MERGE_FEATURE_4B("SpecSEI bits [27:24]" , mmfr1, 24, ...); + */ + MERGE_FEATURE_4B("XNX bits [31:28]" , mmfr1, 28, Ext::kXNX); + /* + MERGE_FEATURE_4B("TWED bits [35:32]" , mmfr1, 32, ...); + MERGE_FEATURE_4B("ETS bits [39:36]" , mmfr1, 36, ...); + */ + MERGE_FEATURE_4B("HCX bits [43:40]" , mmfr1, 40, Ext::kHCX); + MERGE_FEATURE_4B("AFP bits [47:44]" , mmfr1, 44, Ext::kAFP); + /* + MERGE_FEATURE_4B("nTLBPA bits [51:48]" , mmfr1, 48, ...); + MERGE_FEATURE_4B("TIDCP1 bits [55:52]" , mmfr1, 52, ...); + */ + MERGE_FEATURE_4B("CMOW bits [59:56]" , mmfr1, 56, Ext::kCMOW); + MERGE_FEATURE_4B("ECBHB bits [63:60]" , mmfr1, 60, Ext::kECBHB); +} + +ASMJIT_MAYBE_UNUSED +static inline void detectAArch64FeaturesViaCPUID_AA64MMFR2(CpuInfo& cpu, uint64_t mmfr2) noexcept { + // ID_AA64MMFR2_EL1 + // ================ + + /* + MERGE_FEATURE_4B("CnP bits [3:0]" , mmfr2, 0, ...); + */ + MERGE_FEATURE_4B("UAO bits [7:4]" , mmfr2, 4, Ext::kUAO); + /* + MERGE_FEATURE_4B("LSM bits [11:8]" , mmfr2, 8, ...); + MERGE_FEATURE_4B("IESB bits [15:12]" , mmfr2, 12, ...); + */ + MERGE_FEATURE_4B("VARange bits [19:16]" , mmfr2, 16, Ext::kLVA, Ext::kLVA3); + MERGE_FEATURE_4B("CCIDX bits [23:20]" , mmfr2, 20, Ext::kCCIDX); + MERGE_FEATURE_4B("NV bits [27:24]" , mmfr2, 24, Ext::kNV, Ext::kNV2); + /* + MERGE_FEATURE_4B("ST bits [31:28]" , mmfr2, 28, ...); + */ + MERGE_FEATURE_4B("AT bits [35:32]" , mmfr2, 32, Ext::kLSE2); + /* + MERGE_FEATURE_4B("IDS bits [39:36]" , mmfr2, 36, ...); + MERGE_FEATURE_4B("FWB bits [43:40]" , mmfr2, 40, ...); + MERGE_FEATURE_4B("TTL bits [51:48]" , mmfr2, 48, ...); + MERGE_FEATURE_4B("BBM bits [55:52]" , mmfr2, 52, ...); + MERGE_FEATURE_4B("EVT bits [59:56]" , mmfr2, 56, ...); + MERGE_FEATURE_4B("E0PD bits [63:60]" , mmfr2, 60, ...); + */ +} + +// Detects features based on the content of ID_AA64ZFR0_EL1 register. +ASMJIT_MAYBE_UNUSED +static inline void detectAArch64FeaturesViaCPUID_AA64ZFR0(CpuInfo& cpu, uint64_t zfr0) noexcept { + MERGE_FEATURE_4B("SVEver bits [3:0]" , zfr0, 0, Ext::kSVE2, Ext::kSVE2_1); + MERGE_FEATURE_4B("AES bits [7:4]" , zfr0, 4, Ext::kSVE_AES, Ext::kSVE_PMULL128); + MERGE_FEATURE_4B("BitPerm bits [19:16]" , zfr0, 16, Ext::kSVE_BITPERM); + MERGE_FEATURE_4B("BF16 bits [23:20]" , zfr0, 20, Ext::kSVE_BF16, Ext::kSVE_EBF16); + MERGE_FEATURE_4B("B16B16 bits [27:24]" , zfr0, 24, Ext::kSVE_B16B16); + MERGE_FEATURE_4B("SHA3 bits [35:32]" , zfr0, 32, Ext::kSVE_SHA3); + MERGE_FEATURE_4B("SM4 bits [43:40]" , zfr0, 40, Ext::kSVE_SM4); + MERGE_FEATURE_4B("I8MM bits [47:44]" , zfr0, 44, Ext::kSVE_I8MM); + MERGE_FEATURE_4B("F32MM bits [55:52]" , zfr0, 52, Ext::kSVE_F32MM); + MERGE_FEATURE_4B("F64MM bits [59:56]" , zfr0, 56, Ext::kSVE_F64MM); +} + +ASMJIT_MAYBE_UNUSED +static inline void detectAArch64FeaturesViaCPUID_AA64SMFR0(CpuInfo& cpu, uint64_t smfr0) noexcept { + MERGE_FEATURE_1B("SF8DP2 bit [28]" , smfr0, 29, Ext::kSSVE_FP8DOT2); + MERGE_FEATURE_1B("SF8DP4 bit [29]" , smfr0, 29, Ext::kSSVE_FP8DOT4); + MERGE_FEATURE_1B("SF8FMA bit [30]" , smfr0, 30, Ext::kSSVE_FP8FMA); + MERGE_FEATURE_1B("F32F32 bit [32]" , smfr0, 32, Ext::kSME_F32F32); + MERGE_FEATURE_1B("BI32I32 bit [33]" , smfr0, 33, Ext::kSME_BI32I32); + MERGE_FEATURE_1B("B16F32 bit [34]" , smfr0, 34, Ext::kSME_B16F32); + MERGE_FEATURE_1B("F16F32 bit [35]" , smfr0, 35, Ext::kSME_F16F32); + MERGE_FEATURE_4S("I8I32 bits [39:36]" , smfr0, 36, 0xF, Ext::kSME_I8I32); + MERGE_FEATURE_1B("F8F32 bit [40]" , smfr0, 40, Ext::kSME_F8F32); + MERGE_FEATURE_1B("F8F16 bit [41]" , smfr0, 41, Ext::kSME_F8F16); + MERGE_FEATURE_1B("F16F16 bit [42]" , smfr0, 42, Ext::kSME_F16F16); + MERGE_FEATURE_1B("B16B16 bit [43]" , smfr0, 43, Ext::kSME_B16B16); + MERGE_FEATURE_4S("I16I32 bits [47:44]" , smfr0, 44, 0x5, Ext::kSME_I16I32); + MERGE_FEATURE_1B("F64F64 bit [48]" , smfr0, 48, Ext::kSME_F64F64); + MERGE_FEATURE_4S("I16I64 bits [55:52]" , smfr0, 52, 0xF, Ext::kSME_I16I64); + MERGE_FEATURE_4B("SMEver bits [59:56]" , smfr0, 56, Ext::kSME2, Ext::kSME2_1); + MERGE_FEATURE_1B("LUTv2 bit [60]" , smfr0, 60, Ext::kSME_LUTv2); + MERGE_FEATURE_1B("FA64 bit [63]" , smfr0, 63, Ext::kSME_FA64); +} + +#undef MERGE_FEATURE_4S +#undef MERGE_FEATURE_4B +#undef MERGE_FEATURE_2B +#undef MERGE_FEATURE_1B +#undef MERGE_FEATURE_NA + +// CpuInfo - Detect - ARM - CPU Vendor Features +// ============================================ + +// CPU features detection based on Apple family ID. +enum class AppleFamilyId : uint32_t { + // Apple design. + kSWIFT = 0x1E2D6381u, // Apple A6/A6X (ARMv7s). + kCYCLONE = 0x37A09642u, // Apple A7 (ARMv8.0-A). + kTYPHOON = 0x2C91A47Eu, // Apple A8 (ARMv8.0-A). + kTWISTER = 0x92FB37C8u, // Apple A9 (ARMv8.0-A). + kHURRICANE = 0x67CEEE93u, // Apple A10 (ARMv8.1-A). + kMONSOON_MISTRAL = 0xE81E7EF6u, // Apple A11 (ARMv8.2-A). + kVORTEX_TEMPEST = 0x07D34B9Fu, // Apple A12 (ARMv8.3-A). + kLIGHTNING_THUNDER = 0x462504D2u, // Apple A13 (ARMv8.4-A). + kFIRESTORM_ICESTORM = 0x1B588BB3u, // Apple A14/M1 (ARMv8.5-A). + kAVALANCHE_BLIZZARD = 0XDA33D83Du, // Apple A15/M2. + kEVEREST_SAWTOOTH = 0X8765EDEAu // Apple A16. +}; + +ASMJIT_MAYBE_UNUSED +static ASMJIT_FAVOR_SIZE bool detectARMFeaturesViaAppleFamilyId(CpuInfo& cpu) noexcept { + typedef AppleFamilyId Id; + CpuFeatures::ARM& features = cpu.features().arm(); + + switch (cpu.familyId()) { + // Apple A7-A9 (ARMv8.0-A). + case uint32_t(Id::kCYCLONE): + case uint32_t(Id::kTYPHOON): + case uint32_t(Id::kTWISTER): + populateARMv8AFeatures(features, 0); + features.add(Ext::kAES, Ext::kPMU, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256); + return true; + + // Apple A10 (ARMv8.0-A). + case uint32_t(Id::kHURRICANE): + populateARMv8AFeatures(features, 0); + features.add(Ext::kAES, Ext::kCRC32, Ext::kLOR, Ext::kPAN, Ext::kPMU, Ext::kPMULL, Ext::kRDM, Ext::kSHA1, + Ext::kSHA256, Ext::kVHE); + return true; + + // Apple A11 (ARMv8.2-A). + case uint32_t(Id::kMONSOON_MISTRAL): + populateARMv8AFeatures(features, 2); + features.add(Ext::kAES, Ext::kFP16, Ext::kFP16CONV, Ext::kPMU, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256); + return true; + + // Apple A12 (ARMv8.3-A). + case uint32_t(Id::kVORTEX_TEMPEST): + populateARMv8AFeatures(features, 3); + features.add(Ext::kAES, Ext::kFP16, Ext::kFP16CONV, Ext::kPMU, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256); + return true; + + // Apple A13 (ARMv8.4-A). + case uint32_t(Id::kLIGHTNING_THUNDER): + populateARMv8AFeatures(features, 4); + features.add(Ext::kAES, Ext::kFHM, Ext::kFP16, Ext::kFP16CONV, Ext::kPMU, Ext::kPMULL, Ext::kSHA1, + Ext::kSHA256, Ext::kSHA3, Ext::kSHA512); + return true; + + // Apple A14/M1 (ARMv8.5-A). + case uint32_t(Id::kFIRESTORM_ICESTORM): + populateARMv8AFeatures(features, 4); + features.add(Ext::kAES, Ext::kCSV2, Ext::kCSV3, Ext::kDPB2, Ext::kECV, Ext::kFHM, Ext::kFLAGM2, + Ext::kFP16, Ext::kFP16CONV, Ext::kFRINTTS, Ext::kPMU, Ext::kPMULL, Ext::kSB, + Ext::kSHA1, Ext::kSHA256, Ext::kSHA3, Ext::kSHA512, Ext::kSSBS); + return true; + + // Apple A15/M2. + case uint32_t(Id::kAVALANCHE_BLIZZARD): + populateARMv8AFeatures(features, 6); + features.add(Ext::kAES, Ext::kFHM, Ext::kFP16, Ext::kFP16CONV, Ext::kPMU, Ext::kPMULL, Ext::kSHA1, + Ext::kSHA256, Ext::kSHA3, Ext::kSHA512); + return true; + + // Apple A16. + case uint32_t(Id::kEVEREST_SAWTOOTH): + populateARMv8AFeatures(features, 6); + features.add(Ext::kAES, Ext::kFHM, Ext::kFP16, Ext::kFP16CONV, Ext::kHCX, Ext::kPMU, Ext::kPMULL, + Ext::kSHA1, Ext::kSHA256, Ext::kSHA3, Ext::kSHA512); + return true; + + default: + return false; + } +} + +// CpuInfo - Detect - ARM - Compile Flags Features +// =============================================== + // Detects ARM version by macros defined at compile time. This means that AsmJit will report features forced at // compile time that should always be provided by the target CPU. This also means that if we don't provide any // means to detect CPU features the features reported by AsmJit will at least not report less features than the // target it was compiled to. -ASMJIT_MAYBE_UNUSED -static ASMJIT_FAVOR_SIZE void detectARMFeaturesViaCompilerFlags(CpuInfo& cpu) noexcept { - DebugUtils::unused(cpu); #if ASMJIT_ARCH_ARM == 32 +ASMJIT_MAYBE_UNUSED +static ASMJIT_FAVOR_SIZE void detectAArch32FeaturesViaCompilerFlags(CpuInfo& cpu) noexcept { + DebugUtils::unused(cpu); // ARM targets have no baseline at the moment. -# if defined(__ARM_ARCH_7A__) +#if defined(__ARM_ARCH_7A__) cpu.addFeature(CpuFeatures::ARM::kARMv7); -# endif -# if defined(__ARM_ARCH_8A__) +#endif + +#if defined(__ARM_ARCH_8A__) cpu.addFeature(CpuFeatures::ARM::kARMv8a); -# endif +#endif -# if defined(__TARGET_ARCH_THUMB) +#if defined(__TARGET_ARCH_THUMB) cpu.addFeature(CpuFeatures::ARM::kTHUMB); -# if __TARGET_ARCH_THUMB >= 4 +#if __TARGET_ARCH_THUMB >= 4 cpu.addFeature(CpuFeatures::ARM::kTHUMBv2); -# endif -# endif - -# if defined(__ARM_FEATURE_FMA) - cpu.addFeature(CpuFeatures::ARM::kVFPv3); - cpu.addFeature(CpuFeatures::ARM::kVFPv4); -# endif - -# if defined(__ARM_NEON) - cpu.addFeature(CpuFeatures::ARM::kASIMD); -# endif - -# if defined(__ARM_FEATURE_IDIV) && defined(__TARGET_ARCH_THUMB) - cpu.addFeature(CpuFeatures::ARM::kIDIVT); #endif -# if defined(__ARM_FEATURE_IDIV) && !defined(__TARGET_ARCH_THUMB) - cpu.addFeature(CpuFeatures::ARM::kIDIVA); -# endif - #endif -#if defined(__ARM_ARCH_8_1A__) - cpu.addFeature(CpuFeatures::ARM::kARMv8_1a); -#endif -#if defined(__ARM_ARCH_8_2A__) - cpu.addFeature(CpuFeatures::ARM::kARMv8_2a); -#endif -#if defined(__ARM_ARCH_8_3A__) - cpu.addFeature(CpuFeatures::ARM::kARMv8_3a); +#if defined(__ARM_FEATURE_FMA) + cpu.addFeature(Ext::kFP); #endif -#if defined(__ARM_ARCH_8_4A__) - cpu.addFeature(CpuFeatures::ARM::kARMv8_4a); + +#if defined(__ARM_NEON) + cpu.addFeature(Ext::kASIMD); #endif -#if defined(__ARM_ARCH_8_5A__) - cpu.addFeature(CpuFeatures::ARM::kARMv8_5a); + +#if defined(__ARM_FEATURE_IDIV) && defined(__TARGET_ARCH_THUMB) + cpu.addFeature(Ext::kIDIVT); #endif -#if defined(__ARM_ARCH_8_6A__) - cpu.addFeature(CpuFeatures::ARM::kARMv8_6a); +#if defined(__ARM_FEATURE_IDIV) && !defined(__TARGET_ARCH_THUMB) + cpu.addFeature(Ext::kIDIVA); #endif -#if defined(__ARM_ARCH_8_7A__) - cpu.addFeature(CpuFeatures::ARM::kARMv8_7a); +} +#endif // ASMJIT_ARCH_ARM == 32 + +#if ASMJIT_ARCH_ARM == 64 +ASMJIT_MAYBE_UNUSED +static ASMJIT_FAVOR_SIZE void detectAArch64FeaturesViaCompilerFlags(CpuInfo& cpu) noexcept { + DebugUtils::unused(cpu); + +#if defined(__ARM_ARCH_9_5A__) + populateARMv9AFeatures(cpu.features().arm(), 5); +#elif defined(__ARM_ARCH_9_4A__) + populateARMv9AFeatures(cpu.features().arm(), 4); +#elif defined(__ARM_ARCH_9_3A__) + populateARMv9AFeatures(cpu.features().arm(), 3); +#elif defined(__ARM_ARCH_9_2A__) + populateARMv9AFeatures(cpu.features().arm(), 2); +#elif defined(__ARM_ARCH_9_1A__) + populateARMv9AFeatures(cpu.features().arm(), 1); +#elif defined(__ARM_ARCH_9A__) + populateARMv9AFeatures(cpu.features().arm(), 0); +#elif defined(__ARM_ARCH_8_9A__) + populateARMv8AFeatures(cpu.features().arm(), 9); +#elif defined(__ARM_ARCH_8_8A__) + populateARMv8AFeatures(cpu.features().arm(), 8); +#elif defined(__ARM_ARCH_8_7A__) + populateARMv8AFeatures(cpu.features().arm(), 7); +#elif defined(__ARM_ARCH_8_6A__) + populateARMv8AFeatures(cpu.features().arm(), 6); +#elif defined(__ARM_ARCH_8_5A__) + populateARMv8AFeatures(cpu.features().arm(), 5); +#elif defined(__ARM_ARCH_8_4A__) + populateARMv8AFeatures(cpu.features().arm(), 4); +#elif defined(__ARM_ARCH_8_3A__) + populateARMv8AFeatures(cpu.features().arm(), 3); +#elif defined(__ARM_ARCH_8_2A__) + populateARMv8AFeatures(cpu.features().arm(), 2); +#elif defined(__ARM_ARCH_8_1A__) + populateARMv8AFeatures(cpu.features().arm(), 1); +#else + populateARMv8AFeatures(cpu.features().arm(), 0); #endif #if defined(__ARM_FEATURE_AES) - cpu.addFeature(CpuFeatures::ARM::kAES); + cpu.addFeature(Ext::kAES); #endif #if defined(__ARM_FEATURE_BF16_SCALAR_ARITHMETIC) && defined(__ARM_FEATURE_BF16_VECTOR_ARITHMETIC) - cpu.addFeature(CpuFeatures::ARM::kBF16); + cpu.addFeature(Ext::kBF16); #endif #if defined(__ARM_FEATURE_CRC32) - cpu.addFeature(CpuFeatures::ARM::kCRC32); + cpu.addFeature(Ext::kCRC32); #endif #if defined(__ARM_FEATURE_CRYPTO) - cpu.addFeature(CpuFeatures::ARM::kAES, - CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2); + cpu.addFeature(Ext::kAES, Ext::kSHA1, Ext::kSHA256); #endif #if defined(__ARM_FEATURE_DOTPROD) - cpu.addFeature(CpuFeatures::ARM::kDOTPROD); + cpu.addFeature(Ext::kDOTPROD); #endif #if defined(__ARM_FEATURE_FP16FML) || defined(__ARM_FEATURE_FP16_FML) - cpu.addFeature(CpuFeatures::ARM::kFP16FML); + cpu.addFeature(Ext::kFHM); #endif #if defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC) - cpu.addFeature(CpuFeatures::ARM::kFP16FULL); + cpu.addFeature(Ext::kFP16); #endif #if defined(__ARM_FEATURE_FRINT) - cpu.addFeature(CpuFeatures::ARM::kFRINT); + cpu.addFeature(Ext::kFRINTTS); #endif #if defined(__ARM_FEATURE_JCVT) - cpu.addFeature(CpuFeatures::ARM::kFJCVTZS); + cpu.addFeature(Ext::kJSCVT); #endif #if defined(__ARM_FEATURE_MATMUL_INT8) - cpu.addFeature(CpuFeatures::ARM::kI8MM); + cpu.addFeature(Ext::kI8MM); #endif #if defined(__ARM_FEATURE_ATOMICS) - cpu.addFeature(CpuFeatures::ARM::kLSE); + cpu.addFeature(Ext::kLSE); #endif #if defined(__ARM_FEATURE_MEMORY_TAGGING) - cpu.addFeature(CpuFeatures::ARM::kMTE); + cpu.addFeature(Ext::kMTE); #endif #if defined(__ARM_FEATURE_QRDMX) - cpu.addFeature(CpuFeatures::ARM::kRDM); + cpu.addFeature(Ext::kRDM); #endif #if defined(__ARM_FEATURE_RNG) - cpu.addFeature(CpuFeatures::ARM::kRNG); + cpu.addFeature(Ext::kRNG); #endif #if defined(__ARM_FEATURE_SHA2) - cpu.addFeature(CpuFeatures::ARM::kSHA2); + cpu.addFeature(Ext::kSHA256); #endif #if defined(__ARM_FEATURE_SHA3) - cpu.addFeature(CpuFeatures::ARM::kSHA3); + cpu.addFeature(Ext::kSHA3); #endif #if defined(__ARM_FEATURE_SHA512) - cpu.addFeature(CpuFeatures::ARM::kSHA512); + cpu.addFeature(Ext::kSHA512); #endif #if defined(__ARM_FEATURE_SM3) - cpu.addFeature(CpuFeatures::ARM::kSM3); + cpu.addFeature(Ext::kSM3); #endif #if defined(__ARM_FEATURE_SM4) - cpu.addFeature(CpuFeatures::ARM::kSM4); + cpu.addFeature(Ext::kSM4); #endif #if defined(__ARM_FEATURE_SVE) || defined(__ARM_FEATURE_SVE_VECTOR_OPERATORS) - cpu.addFeature(CpuFeatures::ARM::kSVE); + cpu.addFeature(Ext::kSVE); #endif #if defined(__ARM_FEATURE_SVE_MATMUL_INT8) - cpu.addFeature(CpuFeatures::ARM::kSVE_I8MM); + cpu.addFeature(Ext::kSVE_I8MM); #endif #if defined(__ARM_FEATURE_SVE_MATMUL_FP32) - cpu.addFeature(CpuFeatures::ARM::kSVE_F32MM); + cpu.addFeature(Ext::kSVE_F32MM); #endif #if defined(__ARM_FEATURE_SVE_MATMUL_FP64) - cpu.addFeature(CpuFeatures::ARM::kSVE_F64MM); + cpu.addFeature(Ext::kSVE_F64MM); #endif #if defined(__ARM_FEATURE_SVE2) - cpu.addFeature(CpuFeatures::ARM::kSVE2); + cpu.addFeature(Ext::kSVE2); #endif #if defined(__ARM_FEATURE_SVE2_AES) - cpu.addFeature(CpuFeatures::ARM::kSVE2_AES); + cpu.addFeature(Ext::kSVE_AES); #endif #if defined(__ARM_FEATURE_SVE2_BITPERM) - cpu.addFeature(CpuFeatures::ARM::kSVE2_BITPERM); + cpu.addFeature(Ext::kSVE_BITPERM); #endif #if defined(__ARM_FEATURE_SVE2_SHA3) - cpu.addFeature(CpuFeatures::ARM::kSVE2_SHA3); + cpu.addFeature(Ext::kSVE_SHA3); #endif #if defined(__ARM_FEATURE_SVE2_SM4) - cpu.addFeature(CpuFeatures::ARM::kSVE2_SM4); + cpu.addFeature(Ext::kSVE_SM4); #endif #if defined(__ARM_FEATURE_TME) - cpu.addFeature(CpuFeatures::ARM::kTME); + cpu.addFeature(Ext::kTME); #endif } +#endif // ASMJIT_ARCH_ARM == 64 ASMJIT_MAYBE_UNUSED -static ASMJIT_FAVOR_SIZE void expandARMFeaturesByVersion(CpuInfo& cpu) noexcept { - CpuFeatures::ARM& features = cpu.features().arm(); +static ASMJIT_FAVOR_SIZE void detectARMFeaturesViaCompilerFlags(CpuInfo& cpu) noexcept { +#if ASMJIT_ARCH_ARM == 32 + detectAArch32FeaturesViaCompilerFlags(cpu); +#else + detectAArch64FeaturesViaCompilerFlags(cpu); +#endif // ASMJIT_ARCH_ARM +} - if (features.hasARMv8_7a()) { - features.add(CpuFeatures::ARM::kARMv8_6a); - } +// CpuInfo - Detect - ARM - Post Processing ARM Features +// ===================================================== - if (features.hasARMv8_6a()) { - features.add(CpuFeatures::ARM::kARMv8_5a, - CpuFeatures::ARM::kBF16); +// Postprocesses AArch32 features. +ASMJIT_MAYBE_UNUSED +static ASMJIT_FAVOR_SIZE void postProcessAArch32Features(CpuFeatures::ARM& features) noexcept { + DebugUtils::unused(features); +} - if (features.hasSVE()) - features.add(CpuFeatures::ARM::kSVE_I8MM); - } +// Postprocesses AArch64 features. +// +// The only reason to use this function is to deduce some flags from others. +ASMJIT_MAYBE_UNUSED +static ASMJIT_FAVOR_SIZE void postProcessAArch64Features(CpuFeatures::ARM& features) noexcept { + if (features.hasFP16()) + features.add(Ext::kFP16CONV); - if (features.hasARMv8_5a()) { - features.add(CpuFeatures::ARM::kARMv8_4a, - CpuFeatures::ARM::kALTNZCV, - CpuFeatures::ARM::kBTI, - CpuFeatures::ARM::kFRINT, - CpuFeatures::ARM::kSB, - CpuFeatures::ARM::kSSBS); - } + if (features.hasMTE3()) + features.add(Ext::kMTE2); - if (features.hasARMv8_4a()) { - features.add(CpuFeatures::ARM::kARMv8_3a, - CpuFeatures::ARM::kDIT, - CpuFeatures::ARM::kDOTPROD, - CpuFeatures::ARM::kFLAGM, - CpuFeatures::ARM::kPMU, - CpuFeatures::ARM::kRCPC_IMMO); - } + if (features.hasMTE2()) + features.add(Ext::kMTE); - if (features.hasARMv8_3a()) { - features.add(CpuFeatures::ARM::kARMv8_2a, - CpuFeatures::ARM::kFCMA, - CpuFeatures::ARM::kFJCVTZS); - } + if (features.hasSSBS2()) + features.add(Ext::kSSBS); +} - if (features.hasARMv8_2a()) { - features.add(CpuFeatures::ARM::kARMv8_1a); - } +ASMJIT_MAYBE_UNUSED +static ASMJIT_FAVOR_SIZE void postProcessARMCpuInfo(CpuInfo& cpu) noexcept { +#if ASMJIT_ARCH_ARM == 32 + postProcessAArch32Features(cpu.features().arm()); +#else + postProcessAArch64Features(cpu.features().arm()); +#endif // ASMJIT_ARCH_ARM +} + +// CpuInfo - Detect - ARM - Detect by Reading CPUID Registers +// ========================================================== + +// Support CPUID-based detection on AArch64. +#if defined(ASMJIT_ARM_DETECT_VIA_CPUID) + +// Since the register ID is encoded with the instruction we have to create a function for each register ID to read. +#define ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(func, regId) \ +ASMJIT_MAYBE_UNUSED \ +static inline uint64_t func() noexcept { \ + uint64_t output; \ + __asm__ __volatile__("mrs %0, " #regId : "=r"(output)); \ + return output; \ +} + +// NOTE: Older tools don't know the IDs. For example Ubuntu on RPI (GCC 9) won't compile ID_AA64ISAR2_EL1 in 2023. +ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadPFR0, ID_AA64PFR0_EL1) +ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadPFR1, ID_AA64PFR1_EL1) +ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadISAR0, ID_AA64ISAR0_EL1) +ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadISAR1, ID_AA64ISAR1_EL1) +ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadISAR2, S3_0_C0_C6_2) // ID_AA64ISAR2_EL1 +ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadZFR0, S3_0_C0_C4_4) // ID_AA64ZFR0_EL1 - if (features.hasARMv8_1a()) { - features.add(CpuFeatures::ARM::kARMv8a, - CpuFeatures::ARM::kCRC32, - CpuFeatures::ARM::kLSE, - CpuFeatures::ARM::kRDM); +#undef ASMJIT_AARCH64_DEFINE_CPUID_READ_FN + +// Detects AArch64 features by reading CPUID bits directly from CPUID registers. This is the most reliable method +// as the OS doesn't have to know all supported extensions this way (if there is something missing in HWCAPS then +// there is no way to detect such feature without reading CPUID bits). +// +// This function uses MSR instructions, which means that it reads registers that cannot be read in user-mode. The +// OS typically implements this feature by handling SIGILL internally and providing a filtered content of these +// registers back to the user - at least this is what Linux documentation states - everything implementation +// dependent is zeroed, only the bits that are used for CPU feature identification would be present. +// +// References: +// - https://docs.kernel.org/arch/arm64/cpu-feature-registers.html +ASMJIT_MAYBE_UNUSED +static ASMJIT_FAVOR_SIZE void detectAArch64FeaturesViaCPUID(CpuInfo& cpu) noexcept { + populateBaseARMFeatures(cpu); + + detectAArch64FeaturesViaCPUID_AA64PFR0_AA64PFR1(cpu, + aarch64ReadPFR0(), + aarch64ReadPFR1()); + + detectAArch64FeaturesViaCPUID_AA64ISAR0_AA64ISAR1(cpu, + aarch64ReadISAR0(), + aarch64ReadISAR1()); + + // TODO: Fix this on FreeBSD - I don't know what kernel version allows to access the registers below... + +#if defined(__linux__) + UNameKernelVersion kVer = getUNameKernelVersion(); + + // Introduced in Linux 4.19 by "arm64: add ID_AA64ISAR2_EL1 sys register"), so we want at least 4.20. + if (kVer.atLeast(4, 20)) { + detectAArch64FeaturesViaCPUID_AA64ISAR2(cpu, aarch64ReadISAR2()); } - if (features.hasARMv8a()) { - features.add(CpuFeatures::ARM::kARMv7, - CpuFeatures::ARM::kVFPv2, - CpuFeatures::ARM::kVFPv3, - CpuFeatures::ARM::kVFPv4, - CpuFeatures::ARM::kVFP_D32, - CpuFeatures::ARM::kASIMD, - CpuFeatures::ARM::kIDIVA); + // Introduced in Linux 5.10 by "arm64: Expose SVE2 features for userspace", so we want at least 5.11. + if (kVer.atLeast(5, 11) && cpu.features().arm().hasAny(Ext::kSVE, Ext::kSME)) { + // Only read CPU_ID_AA64ZFR0 when either SVE or SME is available. + detectAArch64FeaturesViaCPUID_AA64ZFR0(cpu, aarch64ReadZFR0()); } +#endif } -// CpuInfo - Detect - ARM [Windows] -// ================================ +#endif // ASMJIT_ARM_DETECT_VIA_CPUID + +// CpuInfo - Detect - ARM - Detect by Windows API +// ============================================== #if defined(_WIN32) struct WinPFPMapping { @@ -749,9 +1494,11 @@ struct WinPFPMapping { }; static ASMJIT_FAVOR_SIZE void detectPFPFeatures(CpuInfo& cpu, const WinPFPMapping* mapping, size_t size) noexcept { - for (size_t i = 0; i < size; i++) - if (::IsProcessorFeaturePresent(mapping[i].pfpFeatureId)) + for (size_t i = 0; i < size; i++) { + if (::IsProcessorFeaturePresent(mapping[i].pfpFeatureId)) { cpu.addFeature(mapping[i].featureId); + } + } } //! Detect ARM CPU features on Windows. @@ -763,397 +1510,488 @@ static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept { CpuFeatures::ARM& features = cpu.features().arm(); - // Win32 for ARM requires ARMv7 with DSP extensions, VFPv3, and uses THUMBv2 by default. + // Win32 for ARM requires ARMv7 with DSP extensions, VFPv3 (FP), and uses THUMBv2 by default. #if ASMJIT_ARCH_ARM == 32 - features.add(CpuFeatures::ARM::kTHUMB); - features.add(CpuFeatures::ARM::kTHUMBv2); - features.add(CpuFeatures::ARM::kARMv6); - features.add(CpuFeatures::ARM::kARMv7); - features.add(CpuFeatures::ARM::kEDSP); - features.add(CpuFeatures::ARM::kVFPv2); - features.add(CpuFeatures::ARM::kVFPv3); + features.add(Ext::kTHUMB); + features.add(Ext::kTHUMBv2); + features.add(Ext::kARMv6); + features.add(Ext::kARMv7); + features.add(Ext::kEDSP); #endif - // Windows for ARM requires ASIMD. - features.add(CpuFeatures::ARM::kASIMD); + // Windows for ARM requires FP and ASIMD. + features.add(Ext::kFP); + features.add(Ext::kASIMD); // Detect additional CPU features by calling `IsProcessorFeaturePresent()`. static const WinPFPMapping mapping[] = { #if ASMJIT_ARCH_ARM == 32 - { uint8_t(CpuFeatures::ARM::kVFP_D32) , 18 }, // PF_ARM_VFP_32_REGISTERS_AVAILABLE - { uint8_t(CpuFeatures::ARM::kIDIVT) , 24 }, // PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE - { uint8_t(CpuFeatures::ARM::kVFPv4) , 27 }, // PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE - { uint8_t(CpuFeatures::ARM::kARMv8a) , 29 }, // PF_ARM_V8_INSTRUCTIONS_AVAILABLE + { uint8_t(Ext::kVFP_D32) , 18 }, // PF_ARM_VFP_32_REGISTERS_AVAILABLE + { uint8_t(Ext::kIDIVT) , 24 }, // PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE + { uint8_t(Ext::kFMAC) , 27 }, // PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE + { uint8_t(Ext::kARMv8a) , 29 }, // PF_ARM_V8_INSTRUCTIONS_AVAILABLE #endif - { uint8_t(CpuFeatures::ARM::kAES) , 30 }, // PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE - { uint8_t(CpuFeatures::ARM::kCRC32) , 31 }, // PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE - { uint8_t(CpuFeatures::ARM::kLSE) , 34 } // PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE - + { uint8_t(Ext::kAES) , 30 }, // PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE + { uint8_t(Ext::kCRC32) , 31 }, // PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE + { uint8_t(Ext::kLSE) , 34 }, // PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE + { uint8_t(Ext::kDOTPROD) , 43 }, // PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE + { uint8_t(Ext::kJSCVT) , 44 }, // PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE + { uint8_t(Ext::kLRCPC) , 45 } // PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE }; detectPFPFeatures(cpu, mapping, ASMJIT_ARRAY_SIZE(mapping)); + // Windows can only report ARMv8A at the moment. + if (features.hasARMv8a()) { + populateARMv8AFeatures(cpu.features().arm(), 0); + } + // Windows provides several instructions under a single flag: if (features.hasAES()) { - features.add(CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2); + features.add(Ext::kPMULL, Ext::kSHA1, Ext::kSHA256); } - expandARMFeaturesByVersion(cpu); + postProcessARMCpuInfo(cpu); } -// CpuInfo - Detect - ARM [Linux] -// ============================== +// CpuInfo - Detect - ARM - Detect by Reading HWCAPS +// ================================================= -#elif defined(__linux__) +#elif defined(ASMJIT_ARM_DETECT_VIA_HWCAPS) + +#ifndef AT_HWCAP + #define AT_HWCAP 16 +#endif // !AT_HWCAP + +#ifndef AT_HWCAP2 + #define AT_HWCAP2 26 +#endif // !AT_HWCAP2 + +#if defined(__linux__) +static void getAuxValues(unsigned long* vals, const unsigned long* tags, size_t count) noexcept { + for (size_t i = 0; i < count; i++) { + vals[i] = getauxval(tags[i]); + } +} +#elif defined(__FreeBSD__) +static void getAuxValues(unsigned long* vals, const unsigned long* tags, size_t count) noexcept { + for (size_t i = 0; i < count; i++) { + unsigned long result = 0; + if (elf_aux_info(int(tags[i]), &result, int(sizeof(unsigned long))) != 0) + result = 0; + vals[i] = result; + } +} +#else +#error "[asmjit] getAuxValues() - Unsupported OS." +#endif -struct LinuxHWCapMapping { +struct HWCapMapping { uint8_t featureId; uint8_t hwCapBit; }; -static ASMJIT_FAVOR_SIZE void detectHWCaps(CpuInfo& cpu, unsigned long type, const LinuxHWCapMapping* mapping, size_t size) noexcept { - unsigned long mask = getauxval(type); - for (size_t i = 0; i < size; i++) +static const unsigned long hwCapTags[2] = { AT_HWCAP, AT_HWCAP2 }; + +static ASMJIT_FAVOR_SIZE void mergeHWCaps(CpuInfo& cpu, unsigned long mask, const HWCapMapping* mapping, size_t size) noexcept { + for (size_t i = 0; i < size; i++) { cpu.features().addIf(Support::bitTest(mask, mapping[i].hwCapBit), mapping[i].featureId); + } } #if ASMJIT_ARCH_ARM == 32 -// `AT_HWCAP` provides ARMv7 (and less) related flags. -static const LinuxHWCapMapping hwCapMapping[] = { - { uint8_t(CpuFeatures::ARM::kVFPv2) , 6 }, // HWCAP_VFP - { uint8_t(CpuFeatures::ARM::kEDSP) , 7 }, // HWCAP_EDSP - { uint8_t(CpuFeatures::ARM::kASIMD) , 12 }, // HWCAP_NEON - { uint8_t(CpuFeatures::ARM::kVFPv3) , 13 }, // HWCAP_VFPv3 - { uint8_t(CpuFeatures::ARM::kVFPv4) , 16 }, // HWCAP_VFPv4 - { uint8_t(CpuFeatures::ARM::kIDIVA) , 17 }, // HWCAP_IDIVA - { uint8_t(CpuFeatures::ARM::kIDIVT) , 18 }, // HWCAP_IDIVT - { uint8_t(CpuFeatures::ARM::kVFP_D32) , 19 } // HWCAP_VFPD32 +// Reference: +// - https://github.com/torvalds/linux/blob/master/arch/arm/include/uapi/asm/hwcap.h +static const HWCapMapping hwCapMapping[] = { + { uint8_t(Ext::kEDSP) , 7 }, // HWCAP_EDSP + { uint8_t(Ext::kASIMD) , 12 }, // HWCAP_NEON + { uint8_t(Ext::kFP) , 13 }, // HWCAP_VFPv3 + { uint8_t(Ext::kFMAC) , 16 }, // HWCAP_VFPv4 + { uint8_t(Ext::kIDIVA) , 17 }, // HWCAP_IDIVA + { uint8_t(Ext::kIDIVT) , 18 }, // HWCAP_IDIVT + { uint8_t(Ext::kVFP_D32) , 19 }, // HWCAP_VFPD32 + { uint8_t(Ext::kFP16CONV) , 22 }, // HWCAP_FPHP + { uint8_t(Ext::kFP16) , 23 }, // HWCAP_ASIMDHP + { uint8_t(Ext::kDOTPROD) , 24 }, // HWCAP_ASIMDDP + { uint8_t(Ext::kFHM) , 25 }, // HWCAP_ASIMDFHM + { uint8_t(Ext::kBF16) , 26 }, // HWCAP_ASIMDBF16 + { uint8_t(Ext::kI8MM) , 27 } // HWCAP_I8MM }; -// `AT_HWCAP2` provides ARMv8+ related flags. -static const LinuxHWCapMapping hwCap2Mapping[] = { - { uint8_t(CpuFeatures::ARM::kAES) , 0 }, // HWCAP2_AES - { uint8_t(CpuFeatures::ARM::kPMULL) , 1 }, // HWCAP2_PMULL - { uint8_t(CpuFeatures::ARM::kSHA1) , 2 }, // HWCAP2_SHA1 - { uint8_t(CpuFeatures::ARM::kSHA2) , 3 }, // HWCAP2_SHA2 - { uint8_t(CpuFeatures::ARM::kCRC32) , 4 } // HWCAP2_CRC32 +static const HWCapMapping hwCap2Mapping[] = { + { uint8_t(Ext::kAES) , 0 }, // HWCAP2_AES + { uint8_t(Ext::kPMULL) , 1 }, // HWCAP2_PMULL + { uint8_t(Ext::kSHA1) , 2 }, // HWCAP2_SHA1 + { uint8_t(Ext::kSHA256) , 3 }, // HWCAP2_SHA2 + { uint8_t(Ext::kCRC32) , 4 }, // HWCAP2_CRC32 + { uint8_t(Ext::kSB) , 5 }, // HWCAP2_SB + { uint8_t(Ext::kSSBS) , 6 } // HWCAP2_SSBS }; static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept { cpu._wasDetected = true; - populateBaseARMFeatures(cpu); - CpuFeatures::ARM& features = cpu.features().arm(); + unsigned long hwCapMasks[2] {}; + getAuxValues(hwCapMasks, hwCapTags, 2u); - detectHWCaps(cpu, AT_HWCAP, hwCapMapping, ASMJIT_ARRAY_SIZE(hwCapMapping)); - detectHWCaps(cpu, AT_HWCAP2, hwCap2Mapping, ASMJIT_ARRAY_SIZE(hwCap2Mapping)); + mergeHWCaps(cpu, hwCapMasks[0], hwCapMapping, ASMJIT_ARRAY_SIZE(hwCapMapping)); + mergeHWCaps(cpu, hwCapMasks[1], hwCap2Mapping, ASMJIT_ARRAY_SIZE(hwCap2Mapping)); - // VFPv3 implies VFPv2. - if (features.hasVFPv3()) - features.add(CpuFeatures::ARM::kVFPv2); - - // VFPv2 implies ARMv6. - if (features.hasVFPv2()) - features.add(CpuFeatures::ARM::kARMv6); + CpuFeatures::ARM& features = cpu.features().arm(); - // ARMv7 provides VFPv3|ASIMD. - if (features.hasVFPv3() || features.hasASIMD()) + // ARMv7 provides FP|ASIMD. + if (features.hasFP() || features.hasASIMD()) features.add(CpuFeatures::ARM::kARMv7); - // ARMv8 provives AES, CRC32, PMULL, SHA1, and SHA2. - if (features.hasAES() || features.hasCRC32() || features.hasPMULL() || features.hasSHA1() || features.hasSHA2()) + // ARMv8 provives AES, CRC32, PMULL, SHA1, and SHA256. + if (features.hasAES() || features.hasCRC32() || features.hasPMULL() || features.hasSHA1() || features.hasSHA256()) features.add(CpuFeatures::ARM::kARMv8a); + + postProcessARMCpuInfo(cpu); } #else -// `AT_HWCAP` provides ARMv8+ related flags. -static const LinuxHWCapMapping hwCapMapping[] = { - /* - { uint8_t(CpuFeatures::ARM::k) , 0 }, // HWCAP_FP - */ - { uint8_t(CpuFeatures::ARM::kASIMD) , 1 }, // HWCAP_ASIMD +// Reference: +// - https://docs.kernel.org/arch/arm64/elf_hwcaps.html +// - https://github.com/torvalds/linux/blob/master/arch/arm64/include/uapi/asm/hwcap.h +static const HWCapMapping hwCapMapping[] = { + { uint8_t(Ext::kFP) , 0 }, // HWCAP_FP + { uint8_t(Ext::kASIMD) , 1 }, // HWCAP_ASIMD /* - { uint8_t(CpuFeatures::ARM::k) , 2 }, // HWCAP_EVTSTRM + { uint8_t(Ext::k) , 2 }, // HWCAP_EVTSTRM */ - { uint8_t(CpuFeatures::ARM::kAES) , 3 }, // HWCAP_AES - { uint8_t(CpuFeatures::ARM::kPMULL) , 4 }, // HWCAP_PMULL - { uint8_t(CpuFeatures::ARM::kSHA1) , 5 }, // HWCAP_SHA1 - { uint8_t(CpuFeatures::ARM::kSHA2) , 6 }, // HWCAP_SHA2 - { uint8_t(CpuFeatures::ARM::kCRC32) , 7 }, // HWCAP_CRC32 - { uint8_t(CpuFeatures::ARM::kLSE) , 8 }, // HWCAP_ATOMICS - { uint8_t(CpuFeatures::ARM::kFP16CONV) , 9 }, // HWCAP_FPHP - { uint8_t(CpuFeatures::ARM::kFP16FULL) , 10 }, // HWCAP_ASIMDHP - { uint8_t(CpuFeatures::ARM::kCPUID) , 11 }, // HWCAP_CPUID - { uint8_t(CpuFeatures::ARM::kRDM) , 12 }, // HWCAP_ASIMDRDM - { uint8_t(CpuFeatures::ARM::kFJCVTZS) , 13 }, // HWCAP_JSCVT - { uint8_t(CpuFeatures::ARM::kFCMA) , 14 }, // HWCAP_FCMA + { uint8_t(Ext::kAES) , 3 }, // HWCAP_AES + { uint8_t(Ext::kPMULL) , 4 }, // HWCAP_PMULL + { uint8_t(Ext::kSHA1) , 5 }, // HWCAP_SHA1 + { uint8_t(Ext::kSHA256) , 6 }, // HWCAP_SHA2 + { uint8_t(Ext::kCRC32) , 7 }, // HWCAP_CRC32 + { uint8_t(Ext::kLSE) , 8 }, // HWCAP_ATOMICS + { uint8_t(Ext::kFP16CONV) , 9 }, // HWCAP_FPHP + { uint8_t(Ext::kFP16) , 10 }, // HWCAP_ASIMDHP + { uint8_t(Ext::kCPUID) , 11 }, // HWCAP_CPUID + { uint8_t(Ext::kRDM) , 12 }, // HWCAP_ASIMDRDM + { uint8_t(Ext::kJSCVT) , 13 }, // HWCAP_JSCVT + { uint8_t(Ext::kFCMA) , 14 }, // HWCAP_FCMA + { uint8_t(Ext::kLRCPC) , 15 }, // HWCAP_LRCPC + { uint8_t(Ext::kDPB) , 16 }, // HWCAP_DCPOP + { uint8_t(Ext::kSHA3) , 17 }, // HWCAP_SHA3 + { uint8_t(Ext::kSM3) , 18 }, // HWCAP_SM3 + { uint8_t(Ext::kSM4) , 19 }, // HWCAP_SM4 + { uint8_t(Ext::kDOTPROD) , 20 }, // HWCAP_ASIMDDP + { uint8_t(Ext::kSHA512) , 21 }, // HWCAP_SHA512 + { uint8_t(Ext::kSVE) , 22 }, // HWCAP_SVE + { uint8_t(Ext::kFHM) , 23 }, // HWCAP_ASIMDFHM + { uint8_t(Ext::kDIT) , 24 }, // HWCAP_DIT + { uint8_t(Ext::kLSE2) , 25 }, // HWCAP_USCAT + { uint8_t(Ext::kLRCPC2) , 26 }, // HWCAP_ILRCPC + { uint8_t(Ext::kFLAGM) , 27 }, // HWCAP_FLAGM + { uint8_t(Ext::kSSBS) , 28 }, // HWCAP_SSBS + { uint8_t(Ext::kSB) , 29 } // HWCAP_SB /* - { uint8_t(CpuFeatures::ARM::k) , 15 }, // HWCAP_LRCPC - { uint8_t(CpuFeatures::ARM::k) , 16 }, // HWCAP_DCPOP - */ - { uint8_t(CpuFeatures::ARM::kSHA3) , 17 }, // HWCAP_SHA3 - { uint8_t(CpuFeatures::ARM::kSM3) , 18 }, // HWCAP_SM3 - { uint8_t(CpuFeatures::ARM::kSM4) , 19 }, // HWCAP_SM4 - { uint8_t(CpuFeatures::ARM::kDOTPROD) , 20 }, // HWCAP_ASIMDDP - { uint8_t(CpuFeatures::ARM::kSHA512) , 21 }, // HWCAP_SHA512 - { uint8_t(CpuFeatures::ARM::kSVE) , 22 }, // HWCAP_SVE - { uint8_t(CpuFeatures::ARM::kFP16FML) , 23 }, // HWCAP_ASIMDFHM - { uint8_t(CpuFeatures::ARM::kDIT) , 24 }, // HWCAP_DIT - /* - { uint8_t(CpuFeatures::ARM::k) , 25 }, // HWCAP_USCAT - { uint8_t(CpuFeatures::ARM::k) , 26 }, // HWCAP_ILRCPC - */ - { uint8_t(CpuFeatures::ARM::kFLAGM) , 27 }, // HWCAP_FLAGM - { uint8_t(CpuFeatures::ARM::kSSBS) , 28 }, // HWCAP_SSBS - { uint8_t(CpuFeatures::ARM::kSB) , 29 } // HWCAP_SB - /* - { uint8_t(CpuFeatures::ARM::k) , 30 }, // HWCAP_PACA - { uint8_t(CpuFeatures::ARM::k) , 31 } // HWCAP_PACG + { uint8_t(Ext::k) , 30 }, // HWCAP_PACA + { uint8_t(Ext::k) , 31 } // HWCAP_PACG */ }; -// `AT_HWCAP2` provides ARMv8+ related flags. -static const LinuxHWCapMapping hwCapMapping2[] = { - /* - { uint8_t(CpuFeatures::ARM::k) , 0 }, // HWCAP2_DCPODP - */ - { uint8_t(CpuFeatures::ARM::kSVE2) , 1 }, // HWCAP2_SVE2 - { uint8_t(CpuFeatures::ARM::kSVE2_AES) , 2 }, // HWCAP2_SVEAES - { uint8_t(CpuFeatures::ARM::kSVE_PMULL) , 3 }, // HWCAP2_SVEPMULL - { uint8_t(CpuFeatures::ARM::kSVE2_BITPERM), 4 }, // HWCAP2_SVEBITPERM - { uint8_t(CpuFeatures::ARM::kSVE2_SHA3) , 5 }, // HWCAP2_SVESHA3 - { uint8_t(CpuFeatures::ARM::kSVE2_SM4) , 6 }, // HWCAP2_SVESM4 - { uint8_t(CpuFeatures::ARM::kALTNZCV) , 7 }, // HWCAP2_FLAGM2 - { uint8_t(CpuFeatures::ARM::kFRINT) , 8 }, // HWCAP2_FRINT - { uint8_t(CpuFeatures::ARM::kSVE_I8MM) , 9 }, // HWCAP2_SVEI8MM - { uint8_t(CpuFeatures::ARM::kSVE_F32MM) , 10 }, // HWCAP2_SVEF32MM - { uint8_t(CpuFeatures::ARM::kSVE_F64MM) , 11 }, // HWCAP2_SVEF64MM - { uint8_t(CpuFeatures::ARM::kSVE_BF16) , 12 }, // HWCAP2_SVEBF16 - { uint8_t(CpuFeatures::ARM::kI8MM) , 13 }, // HWCAP2_I8MM - { uint8_t(CpuFeatures::ARM::kBF16) , 14 }, // HWCAP2_BF16 - { uint8_t(CpuFeatures::ARM::kDGH) , 15 }, // HWCAP2_DGH - { uint8_t(CpuFeatures::ARM::kRNG) , 16 }, // HWCAP2_RNG - { uint8_t(CpuFeatures::ARM::kBTI) , 17 }, // HWCAP2_BTI - { uint8_t(CpuFeatures::ARM::kMTE) , 18 } // HWCAP2_MTE +static const HWCapMapping hwCap2Mapping[] = { + { uint8_t(Ext::kDPB2) , 0 }, // HWCAP2_DCPODP + { uint8_t(Ext::kSVE2) , 1 }, // HWCAP2_SVE2 + { uint8_t(Ext::kSVE_AES) , 2 }, // HWCAP2_SVEAES + { uint8_t(Ext::kSVE_PMULL128) , 3 }, // HWCAP2_SVEPMULL + { uint8_t(Ext::kSVE_BITPERM) , 4 }, // HWCAP2_SVEBITPERM + { uint8_t(Ext::kSVE_SHA3) , 5 }, // HWCAP2_SVESHA3 + { uint8_t(Ext::kSVE_SM4) , 6 }, // HWCAP2_SVESM4 + { uint8_t(Ext::kFLAGM2) , 7 }, // HWCAP2_FLAGM2 + { uint8_t(Ext::kFRINTTS) , 8 }, // HWCAP2_FRINT + { uint8_t(Ext::kSVE_I8MM) , 9 }, // HWCAP2_SVEI8MM + { uint8_t(Ext::kSVE_F32MM) , 10 }, // HWCAP2_SVEF32MM + { uint8_t(Ext::kSVE_F64MM) , 11 }, // HWCAP2_SVEF64MM + { uint8_t(Ext::kSVE_BF16) , 12 }, // HWCAP2_SVEBF16 + { uint8_t(Ext::kI8MM) , 13 }, // HWCAP2_I8MM + { uint8_t(Ext::kBF16) , 14 }, // HWCAP2_BF16 + { uint8_t(Ext::kDGH) , 15 }, // HWCAP2_DGH + { uint8_t(Ext::kRNG) , 16 }, // HWCAP2_RNG + { uint8_t(Ext::kBTI) , 17 }, // HWCAP2_BTI + { uint8_t(Ext::kMTE) , 18 }, // HWCAP2_MTE + { uint8_t(Ext::kECV) , 19 }, // HWCAP2_ECV + { uint8_t(Ext::kAFP) , 20 }, // HWCAP2_AFP + { uint8_t(Ext::kRPRES) , 21 }, // HWCAP2_RPRES + { uint8_t(Ext::kMTE3) , 22 }, // HWCAP2_MTE3 + { uint8_t(Ext::kSME) , 23 }, // HWCAP2_SME + { uint8_t(Ext::kSME_I16I64) , 24 }, // HWCAP2_SME_I16I64 + { uint8_t(Ext::kSME_F64F64) , 25 }, // HWCAP2_SME_F64F64 + { uint8_t(Ext::kSME_I8I32) , 26 }, // HWCAP2_SME_I8I32 + { uint8_t(Ext::kSME_F16F32) , 27 }, // HWCAP2_SME_F16F32 + { uint8_t(Ext::kSME_B16F32) , 28 }, // HWCAP2_SME_B16F32 + { uint8_t(Ext::kSME_F32F32) , 29 }, // HWCAP2_SME_F32F32 + { uint8_t(Ext::kSME_FA64) , 30 }, // HWCAP2_SME_FA64 + { uint8_t(Ext::kWFXT) , 31 }, // HWCAP2_WFXT + { uint8_t(Ext::kEBF16) , 32 }, // HWCAP2_EBF16 + { uint8_t(Ext::kSVE_EBF16) , 33 }, // HWCAP2_SVE_EBF16 + { uint8_t(Ext::kCSSC) , 34 }, // HWCAP2_CSSC + { uint8_t(Ext::kRPRFM) , 35 }, // HWCAP2_RPRFM + { uint8_t(Ext::kSVE2_1) , 36 }, // HWCAP2_SVE2P1 + { uint8_t(Ext::kSME2) , 37 }, // HWCAP2_SME2 + { uint8_t(Ext::kSME2_1) , 38 }, // HWCAP2_SME2P1 + { uint8_t(Ext::kSME_I16I32) , 39 }, // HWCAP2_SME_I16I32 + { uint8_t(Ext::kSME_BI32I32) , 40 }, // HWCAP2_SME_BI32I32 + { uint8_t(Ext::kSME_B16B16) , 41 }, // HWCAP2_SME_B16B16 + { uint8_t(Ext::kSME_F16F16) , 42 }, // HWCAP2_SME_F16F16 + { uint8_t(Ext::kMOPS) , 43 }, // HWCAP2_MOPS + { uint8_t(Ext::kHBC) , 44 }, // HWCAP2_HBC + { uint8_t(Ext::kSVE_B16B16) , 45 }, // HWCAP2_SVE_B16B16 + { uint8_t(Ext::kLRCPC3) , 46 }, // HWCAP2_LRCPC3 + { uint8_t(Ext::kLSE128) , 47 }, // HWCAP2_LSE128 }; static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept { cpu._wasDetected = true; populateBaseARMFeatures(cpu); - detectHWCaps(cpu, AT_HWCAP, hwCapMapping, ASMJIT_ARRAY_SIZE(hwCapMapping)); - detectHWCaps(cpu, AT_HWCAP2, hwCapMapping2, ASMJIT_ARRAY_SIZE(hwCapMapping2)); -} + unsigned long hwCapMasks[2] {}; + getAuxValues(hwCapMasks, hwCapTags, 2u); -#endif + mergeHWCaps(cpu, hwCapMasks[0], hwCapMapping, ASMJIT_ARRAY_SIZE(hwCapMapping)); + mergeHWCaps(cpu, hwCapMasks[1], hwCap2Mapping, ASMJIT_ARRAY_SIZE(hwCap2Mapping)); -// CpuInfo - Detect - ARM [Apple] -// ============================== +#if defined(ASMJIT_ARM_DETECT_VIA_CPUID) + if (cpu.features().arm().hasCPUID()) { + detectAArch64FeaturesViaCPUID(cpu); + return; + } +#endif // ASMJIT_ARM_DETECT_VIA_CPUID -#elif defined(__APPLE__) + postProcessARMCpuInfo(cpu); +} -namespace AppleHWId { - enum CpuFamily : uint32_t { - // Generic ARM. - kCpuFamily_ARM_9 = 0xE73283AEu, - kCpuFamily_ARM_11 = 0x8FF620D8u, - kCpuFamily_ARM_12 = 0xBD1B0AE9u, - kCpuFamily_ARM_13 = 0x0CC90E64u, - kCpuFamily_ARM_14 = 0x96077EF1u, - kCpuFamily_ARM_15 = 0xA8511BCAu, - - // Apple design. - kCpuFamily_SWIFT = 0x1E2D6381u, - kCpuFamily_CYCLONE = 0x37A09642u, - kCpuFamily_TYPHOON = 0x2C91A47Eu, - kCpuFamily_TWISTER = 0x92FB37C8u, - kCpuFamily_HURRICANE = 0x67CEEE93u, - kCpuFamily_MONSOON_MISTRAL = 0xE81E7EF6u, - kCpuFamily_VORTEX_TEMPEST = 0x07D34B9Fu, - kCpuFamily_LIGHTNING_THUNDER = 0x462504D2u, - kCpuFamily_FIRESTORM_ICESTORM = 0x1B588BB3u - }; +#endif // ASMJIT_ARCH_ARM + +// CpuInfo - Detect - ARM - Detect by OpenBSD API That Reads CPUID +// =============================================================== + +#elif defined(__OpenBSD__) && ASMJIT_ARCH_ARM >= 64 + +// Supported CPUID registers on OpenBSD (CTL_MACHDEP definitions): +// - https://github.com/openbsd/src/blob/master/sys/arch/arm64/include/cpu.h +enum class OpenBSDAArch64CPUID { + kAA64ISAR0 = 2, + kAA64ISAR1 = 3, + kAA64ISAR2 = 4, + kAA64MMFR0 = 5, + kAA64MMFR1 = 6, + kAA64MMFR2 = 7, + kAA64PFR0 = 8, + kAA64PFR1 = 9, + kAA64SMFR0 = 10, + kAA64ZFR0 = 11 }; -static ASMJIT_FAVOR_SIZE uint32_t queryARMCpuFamilyId() noexcept { - uint32_t result = 0; - size_t size = sizeof(result); +static uint64_t openbsdReadAArch64CPUID(OpenBSDAArch64CPUID id) noexcept { + uint64_t bits = 0; + size_t size = sizeof(bits); + int name[2] = { CTL_MACHDEP, int(id) }; - int res = sysctlbyname("hw.cpufamily", &result, &size, nullptr, 0); - if (res != 0) - return 0; - else - return result; + return (sysctl(name, 2, &bits, &size, NULL, 0) < 0) ? uint64_t(0) : bits; } static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept { - cpu._wasDetected = true; + typedef OpenBSDAArch64CPUID ID; + populateBaseARMFeatures(cpu); - uint32_t cpuFamilyId = queryARMCpuFamilyId(); - CpuFeatures::ARM& features = cpu.features().arm(); + detectAArch64FeaturesViaCPUID_AA64PFR0_AA64PFR1(cpu, + openbsdReadAArch64CPUID(ID::kAA64PFR0), + openbsdReadAArch64CPUID(ID::kAA64PFR1)); - switch (cpuFamilyId) { - case AppleHWId::kCpuFamily_ARM_9: - case AppleHWId::kCpuFamily_ARM_11: - case AppleHWId::kCpuFamily_ARM_12: - break; + detectAArch64FeaturesViaCPUID_AA64ISAR0_AA64ISAR1(cpu, + openbsdReadAArch64CPUID(ID::kAA64ISAR0), + openbsdReadAArch64CPUID(ID::kAA64ISAR1)); - // ARM Cortex A8. - case AppleHWId::kCpuFamily_ARM_13: - break; + detectAArch64FeaturesViaCPUID_AA64ISAR2(cpu, openbsdReadAArch64CPUID(ID::kAA64ISAR2)); + detectAArch64FeaturesViaCPUID_AA64MMFR0(cpu, openbsdReadAArch64CPUID(ID::kAA64MMFR0)); + detectAArch64FeaturesViaCPUID_AA64MMFR1(cpu, openbsdReadAArch64CPUID(ID::kAA64MMFR1)); + detectAArch64FeaturesViaCPUID_AA64MMFR2(cpu, openbsdReadAArch64CPUID(ID::kAA64MMFR2)); - // ARM Cortex A9. - case AppleHWId::kCpuFamily_ARM_14: - break; + // Only read CPU_ID_AA64ZFR0 when either SVE or SME is available. + if (cpu.features().arm().hasAny(Ext::kSVE, Ext::kSME)) { + detectAArch64FeaturesViaCPUID_AA64ZFR0(cpu, openbsdReadAArch64CPUID(ID::kAA64ZFR0)); - // ARM Cortex A7 - ARMv7k. - case AppleHWId::kCpuFamily_ARM_15: - features.add(CpuFeatures::ARM::kARMv7); - break; + if (cpu.features().arm().hasSME()) + detectAArch64FeaturesViaCPUID_AA64SMFR0(cpu, openbsdReadAArch64CPUID(ID::kAA64SMFR0)); + } - // Apple A6/A6X - ARMv7s. - case AppleHWId::kCpuFamily_SWIFT: - features.add(CpuFeatures::ARM::kARMv7); - break; + postProcessARMCpuInfo(cpu); +} - // Apple A7 - ARMv8.0-A. - case AppleHWId::kCpuFamily_CYCLONE: - features.add(CpuFeatures::ARM::kARMv8a, - CpuFeatures::ARM::kAES, - CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2); - break; +// CpuInfo - Detect - ARM - Detect by Apple API (sysctlbyname) +// =========================================================== - // Apple A8 - ARMv8.0-A. - case AppleHWId::kCpuFamily_TYPHOON: - features.add(CpuFeatures::ARM::kARMv8a, - CpuFeatures::ARM::kAES, - CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2); - break; +#elif defined(__APPLE__) - // Apple A9 - ARMv8.0-A. - case AppleHWId::kCpuFamily_TWISTER: - features.add(CpuFeatures::ARM::kARMv8a, - CpuFeatures::ARM::kAES, - CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2); - break; +enum class AppleFeatureType : uint8_t { + kHWOptional, + kHWOptionalArmFEAT +}; - // Apple A10 - ARMv8.1-A. - case AppleHWId::kCpuFamily_HURRICANE: - features.add(CpuFeatures::ARM::kARMv8_1a, - CpuFeatures::ARM::kAES, - CpuFeatures::ARM::kRDM, - CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2); +struct AppleFeatureMapping { + AppleFeatureType type; + char name[18]; + uint8_t featureId; +}; - break; +template +static inline bool appleSysctlByName(const char* sysctlName, T* dst, size_t size = sizeof(T)) noexcept { + return sysctlbyname(sysctlName, dst, &size, nullptr, 0) == 0; +} - // Apple A11 - ARMv8.2-A. - case AppleHWId::kCpuFamily_MONSOON_MISTRAL: - features.add(CpuFeatures::ARM::kARMv8_2a, - CpuFeatures::ARM::kAES, - CpuFeatures::ARM::kFP16FULL, - CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2); - break; +static ASMJIT_FAVOR_SIZE long appleDetectARMFeatureViaSysctl(AppleFeatureType type, const char* featureName) noexcept { + static const char hwOptionalPrefix[] = "hw.optional."; + static const char hwOptionalArmFeatPrefix[] = "hw.optional.arm.FEAT_"; - // Apple A12 - ARMv8.3-A. - case AppleHWId::kCpuFamily_VORTEX_TEMPEST: - features.add(CpuFeatures::ARM::kARMv8_3a, - CpuFeatures::ARM::kAES, - CpuFeatures::ARM::kFP16FULL, - CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2); - break; + char sysctlName[128]; - // Apple A13 - ARMv8.4-A. - case AppleHWId::kCpuFamily_LIGHTNING_THUNDER: - features.add(CpuFeatures::ARM::kARMv8_4a, - CpuFeatures::ARM::kAES, - CpuFeatures::ARM::kFP16FML, - CpuFeatures::ARM::kFP16FULL, - CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2, - CpuFeatures::ARM::kSHA3, - CpuFeatures::ARM::kSHA512); - break; + const char* prefix = type == AppleFeatureType::kHWOptional ? hwOptionalPrefix : hwOptionalArmFeatPrefix; + size_t prefixSize = (type == AppleFeatureType::kHWOptional ? sizeof(hwOptionalPrefix) : sizeof(hwOptionalArmFeatPrefix)) - 1u; + size_t featureNameSize = strlen(featureName); - // Apple A14/M1 - ARMv8.5-A. - case AppleHWId::kCpuFamily_FIRESTORM_ICESTORM: - features.add(CpuFeatures::ARM::kARMv8_4a, - CpuFeatures::ARM::kAES, - CpuFeatures::ARM::kALTNZCV, - CpuFeatures::ARM::kFP16FML, - CpuFeatures::ARM::kFP16FULL, - CpuFeatures::ARM::kFRINT, - CpuFeatures::ARM::kSB, - CpuFeatures::ARM::kSHA1, - CpuFeatures::ARM::kSHA2, - CpuFeatures::ARM::kSHA3, - CpuFeatures::ARM::kSHA512, - CpuFeatures::ARM::kSSBS); - break; + if (featureNameSize < 128 - prefixSize) { + memcpy(sysctlName, prefix, prefixSize); + memcpy(sysctlName + prefixSize, featureName, featureNameSize + 1u); // Include NULL terminator. - default: - cpu._wasDetected = false; - break; + long val = 0; + if (appleSysctlByName(sysctlName, &val)) + return val; } - expandARMFeaturesByVersion(cpu); + return 0; } -// CpuInfo - Detect - ARM [Unknown] -// ================================ +static ASMJIT_FAVOR_SIZE void appleDetectARMFeaturesViaSysctl(CpuInfo& cpu) noexcept { + typedef AppleFeatureType FT; + + // Based on: + // - https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics + static const AppleFeatureMapping mappings[] = { + // Determine Advanced SIMD and Floating Point Capabilities: + { FT::kHWOptional , "AdvSIMD_HPFPCvt", uint8_t(Ext::kFP16CONV) }, + { FT::kHWOptional , "neon_hpfp" , uint8_t(Ext::kFP16CONV) }, + { FT::kHWOptionalArmFEAT, "BF16" , uint8_t(Ext::kBF16) }, + { FT::kHWOptionalArmFEAT, "DotProd" , uint8_t(Ext::kDOTPROD) }, + { FT::kHWOptionalArmFEAT, "FCMA" , uint8_t(Ext::kFCMA) }, + { FT::kHWOptional , "armv8_3_compnum", uint8_t(Ext::kFCMA) }, + { FT::kHWOptionalArmFEAT, "FHM" , uint8_t(Ext::kFHM) }, + { FT::kHWOptional , "armv8_2_fhm" , uint8_t(Ext::kFHM) }, + { FT::kHWOptionalArmFEAT, "FP16" , uint8_t(Ext::kFP16) }, + { FT::kHWOptional , "neon_fp16" , uint8_t(Ext::kFP16) }, + { FT::kHWOptionalArmFEAT, "FRINTTS" , uint8_t(Ext::kFRINTTS) }, + { FT::kHWOptionalArmFEAT, "I8MM" , uint8_t(Ext::kI8MM) }, + { FT::kHWOptionalArmFEAT, "JSCVT" , uint8_t(Ext::kJSCVT) }, + { FT::kHWOptionalArmFEAT, "RDM" , uint8_t(Ext::kRDM) }, + + // Determine Integer Capabilities: + { FT::kHWOptional , "armv8_crc32" , uint8_t(Ext::kCRC32) }, + { FT::kHWOptionalArmFEAT, "FlagM" , uint8_t(Ext::kFLAGM) }, + { FT::kHWOptionalArmFEAT, "FlagM2" , uint8_t(Ext::kFLAGM2) }, + + // Determine Atomic and Memory Ordering Instruction Capabilities: + { FT::kHWOptionalArmFEAT, "LRCPC" , uint8_t(Ext::kLRCPC) }, + { FT::kHWOptionalArmFEAT, "LRCPC2" , uint8_t(Ext::kLRCPC2) }, + { FT::kHWOptional , "armv8_1_atomics", uint8_t(Ext::kLSE) }, + { FT::kHWOptionalArmFEAT, "LSE" , uint8_t(Ext::kLSE) }, + { FT::kHWOptionalArmFEAT, "LSE2" , uint8_t(Ext::kLSE2) }, + + // Determine Encryption Capabilities: + { FT::kHWOptionalArmFEAT, "AES" , uint8_t(Ext::kAES) }, + { FT::kHWOptionalArmFEAT, "PMULL" , uint8_t(Ext::kPMULL) }, + { FT::kHWOptionalArmFEAT, "SHA1" , uint8_t(Ext::kSHA1) }, + { FT::kHWOptionalArmFEAT, "SHA256" , uint8_t(Ext::kSHA256) }, + { FT::kHWOptionalArmFEAT, "SHA512" , uint8_t(Ext::kSHA512) }, + { FT::kHWOptional , "armv8_2_sha512" , uint8_t(Ext::kSHA512) }, + { FT::kHWOptionalArmFEAT, "SHA3" , uint8_t(Ext::kSHA3) }, + { FT::kHWOptional , "armv8_2_sha3" , uint8_t(Ext::kSHA3) }, + + // Determine General Capabilities: + { FT::kHWOptionalArmFEAT, "BTI" , uint8_t(Ext::kBTI) }, + { FT::kHWOptionalArmFEAT, "DPB" , uint8_t(Ext::kDPB) }, + { FT::kHWOptionalArmFEAT, "DPB2" , uint8_t(Ext::kDPB2) }, + { FT::kHWOptionalArmFEAT, "ECV" , uint8_t(Ext::kECV) }, + { FT::kHWOptionalArmFEAT, "SB" , uint8_t(Ext::kSB) }, + { FT::kHWOptionalArmFEAT, "SSBS" , uint8_t(Ext::kSSBS) } + }; + + for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(mappings); i++) { + const AppleFeatureMapping& mapping = mappings[i]; + if (!cpu.features().arm().has(mapping.featureId) && appleDetectARMFeatureViaSysctl(mapping.type, mapping.name)) { + cpu.features().arm().add(mapping.featureId); + } + } +} + +static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept { + cpu._wasDetected = true; + populateBaseARMFeatures(cpu); + + appleSysctlByName("hw.cpufamily", &cpu._familyId); + appleSysctlByName("hw.cachelinesize", &cpu._cacheLineSize); + appleSysctlByName("machdep.cpu.logical_per_package", &cpu._maxLogicalProcessors); + appleSysctlByName("machdep.cpu.brand_string", cpu._brand.str, sizeof(cpu._brand.str)); + + memcpy(cpu._vendor.str, "APPLE", 6); + + bool cpuFeaturesPopulated = detectARMFeaturesViaAppleFamilyId(cpu); + if (!cpuFeaturesPopulated) + appleDetectARMFeaturesViaSysctl(cpu); + postProcessARMCpuInfo(cpu); +} + +// CpuInfo - Detect - ARM - Detect by Fallback (Using Compiler Flags) +// ================================================================== #else -#if ASMJIT_ARCH_ARM == 64 - #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with AArch64 CPU)") +#if ASMJIT_ARCH_ARM == 32 + #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with AArch32 CPU)") #else - #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with ARM CPU)") + #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with AArch64 CPU)") #endif static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept { populateBaseARMFeatures(cpu); detectARMFeaturesViaCompilerFlags(cpu); - expandARMFeaturesByVersion(cpu); + postProcessARMCpuInfo(cpu); } #endif +} // {arm} + #endif // CpuInfo - Detect - Host // ======================= -static uint32_t cpuInfoInitialized; -static CpuInfo cpuInfoGlobal(Globals::NoInit); - const CpuInfo& CpuInfo::host() noexcept { - // This should never cause a problem as the resulting information should always be the same. In the worst case we - // would just overwrite it non-atomically. - if (!cpuInfoInitialized) { + static std::atomic cpuInfoInitialized; + static CpuInfo cpuInfoGlobal(Globals::NoInit); + + // This should never cause a problem as the resulting information should always + // be the same. In the worst case it would just be overwritten non-atomically. + if (!cpuInfoInitialized.load(std::memory_order_relaxed)) { CpuInfo cpuInfoLocal; cpuInfoLocal._arch = Arch::kHost; cpuInfoLocal._subArch = SubArch::kHost; #if ASMJIT_ARCH_X86 - detectX86Cpu(cpuInfoLocal); + x86::detectX86Cpu(cpuInfoLocal); #elif ASMJIT_ARCH_ARM - detectARMCpu(cpuInfoLocal); -#else - #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown CPU)") + arm::detectARMCpu(cpuInfoLocal); #endif cpuInfoLocal._hwThreadCount = detectHWThreadCount(); cpuInfoGlobal = cpuInfoLocal; - cpuInfoInitialized = 1; + cpuInfoInitialized.store(1, std::memory_order_seq_cst); } return cpuInfoGlobal; diff --git a/3rdparty/asmjit/src/asmjit/core/cpuinfo.h b/3rdparty/asmjit/src/asmjit/core/cpuinfo.h index 4af5c3a82f939..2638146a4cc41 100644 --- a/3rdparty/asmjit/src/asmjit/core/cpuinfo.h +++ b/3rdparty/asmjit/src/asmjit/core/cpuinfo.h @@ -22,11 +22,6 @@ ASMJIT_BEGIN_NAMESPACE //! Each feature is represented by a single bit in an embedded bit array. class CpuFeatures { public: - //! A word that is used to represents feature bits. - typedef Support::BitWord BitWord; - //! Iterator that can iterate all CPU features set. - typedef Support::BitVectorIterator Iterator; - //! \name Constants //! \{ @@ -37,6 +32,13 @@ class CpuFeatures { }; //! \endcond + //! A word that is used to represents feature bits. + typedef Support::BitWord BitWord; + //! Iterator that can iterate all CPU features set. + typedef Support::BitVectorIterator Iterator; + + typedef Support::Array Bits; + //! \} //! \name Data @@ -48,15 +50,15 @@ class CpuFeatures { //! \{ //! Data bits. - Support::Array _bits; + Bits _bits; //! \} //! \name Overloaded Operators //! \{ - inline bool operator==(const Data& other) noexcept { return eq(other); } - inline bool operator!=(const Data& other) noexcept { return !eq(other); } + ASMJIT_INLINE_NODEBUG bool operator==(const Data& other) const noexcept { return equals(other); } + ASMJIT_INLINE_NODEBUG bool operator!=(const Data& other) const noexcept { return !equals(other); } //! \} @@ -64,22 +66,22 @@ class CpuFeatures { //! \{ //! Returns true if there are no features set. - inline bool empty() const noexcept { return _bits.aggregate(0) == 0; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _bits.aggregate(0) == 0; } //! Returns all features as array of bitwords (see \ref Support::BitWord). - inline BitWord* bits() noexcept { return _bits.data(); } + ASMJIT_INLINE_NODEBUG BitWord* bits() noexcept { return _bits.data(); } //! Returns all features as array of bitwords (const). - inline const BitWord* bits() const noexcept { return _bits.data(); } + ASMJIT_INLINE_NODEBUG const BitWord* bits() const noexcept { return _bits.data(); } //! Returns the number of BitWords returned by \ref bits(). - inline size_t bitWordCount() const noexcept { return kNumBitWords; } + ASMJIT_INLINE_NODEBUG size_t bitWordCount() const noexcept { return kNumBitWords; } //! Returns \ref Support::BitVectorIterator, that can be used to iterate over all features efficiently. - inline Iterator iterator() const noexcept { return Iterator(_bits.data(), kNumBitWords); } + ASMJIT_INLINE_NODEBUG Iterator iterator() const noexcept { return Iterator(_bits.data(), kNumBitWords); } //! Tests whether the feature `featureId` is present. template - ASMJIT_FORCE_INLINE bool has(const FeatureId& featureId) const noexcept { + ASMJIT_INLINE_NODEBUG bool has(const FeatureId& featureId) const noexcept { ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures); uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits; @@ -88,12 +90,27 @@ class CpuFeatures { return bool((_bits[idx] >> bit) & 0x1); } + //! \cond NONE + template + ASMJIT_INLINE_NODEBUG bool hasAny(const FeatureId& featureId) const noexcept { + return has(featureId); + } + //! \endcond + + //! Tests whether any feature given is present. + //! + //! \note This is a variadic function template that can be used with multiple features. + template + ASMJIT_INLINE_NODEBUG bool hasAny(const FeatureId& featureId, Args&&... otherFeatureIds) const noexcept { + return bool(unsigned(has(featureId)) | unsigned(hasAny(std::forward(otherFeatureIds)...))); + } + //! Tests whether all features as defined by `other` are present. - ASMJIT_FORCE_INLINE bool hasAll(const Data& other) const noexcept { + ASMJIT_INLINE_NODEBUG bool hasAll(const Data& other) const noexcept { + uint32_t result = 1; for (uint32_t i = 0; i < kNumBitWords; i++) - if ((_bits[i] & other._bits[i]) != other._bits[i]) - return false; - return true; + result &= uint32_t((_bits[i] & other._bits[i]) == other._bits[i]); + return bool(result); } //! \} @@ -101,11 +118,12 @@ class CpuFeatures { //! \name Manipulation //! \{ - inline void reset() noexcept { _bits.fill(0); } + //! Clears all features set. + ASMJIT_INLINE_NODEBUG void reset() noexcept { _bits.fill(0); } //! Adds the given CPU `featureId` to the list of features. template - ASMJIT_FORCE_INLINE void add(const FeatureId& featureId) noexcept { + ASMJIT_INLINE_NODEBUG void add(const FeatureId& featureId) noexcept { ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures); uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits; @@ -115,13 +133,13 @@ class CpuFeatures { } template - ASMJIT_FORCE_INLINE void add(const FeatureId& featureId, Args&&... otherFeatureIds) noexcept { + ASMJIT_INLINE_NODEBUG void add(const FeatureId& featureId, Args&&... otherFeatureIds) noexcept { add(featureId); add(std::forward(otherFeatureIds)...); } template - ASMJIT_FORCE_INLINE void addIf(bool condition, const FeatureId& featureId) noexcept { + ASMJIT_INLINE_NODEBUG void addIf(bool condition, const FeatureId& featureId) noexcept { ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures); uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits; @@ -131,14 +149,14 @@ class CpuFeatures { } template - ASMJIT_FORCE_INLINE void addIf(bool condition, const FeatureId& featureId, Args&&... otherFeatureIds) noexcept { + ASMJIT_INLINE_NODEBUG void addIf(bool condition, const FeatureId& featureId, Args&&... otherFeatureIds) noexcept { addIf(condition, featureId); addIf(condition, std::forward(otherFeatureIds)...); } //! Removes the given CPU `featureId` from the list of features. template - ASMJIT_FORCE_INLINE void remove(const FeatureId& featureId) noexcept { + ASMJIT_INLINE_NODEBUG void remove(const FeatureId& featureId) noexcept { ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures); uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits; @@ -148,17 +166,21 @@ class CpuFeatures { } template - ASMJIT_FORCE_INLINE void remove(const FeatureId& featureId, Args&&... otherFeatureIds) noexcept { + ASMJIT_INLINE_NODEBUG void remove(const FeatureId& featureId, Args&&... otherFeatureIds) noexcept { remove(featureId); remove(std::forward(otherFeatureIds)...); } //! Tests whether this CPU features data matches `other`. - ASMJIT_FORCE_INLINE bool eq(const Data& other) const noexcept { return _bits == other._bits; } + ASMJIT_INLINE_NODEBUG bool equals(const Data& other) const noexcept { return _bits == other._bits; } - //! \} +#if !defined(ASMJIT_NO_DEPRECATED) + ASMJIT_DEPRECATED("Use CpuFeatures::Data::equals() instead") + ASMJIT_INLINE_NODEBUG bool eq(const Data& other) const noexcept { return equals(other); } +#endif // !ASMJIT_NO_DEPRECATED - }; + //! \} + }; //! X86 specific features data. struct X86 : public Data { @@ -169,68 +191,83 @@ class CpuFeatures { kMT, //!< CPU has multi-threading capabilities. kNX, //!< CPU has Not-Execute-Bit aka DEP (data-execution prevention). - k3DNOW, //!< CPU has 3DNOW (3DNOW base instructions) [AMD]. - k3DNOW2, //!< CPU has 3DNOW2 (enhanced 3DNOW) [AMD]. + k3DNOW, //!< CPU has 3DNOW (3DNOW base instructions) {AMD} (deprecated). + k3DNOW2, //!< CPU has 3DNOW2 (enhanced 3DNOW) {AMD} (deprecated). kADX, //!< CPU has ADX (multi-precision add-carry instruction extensions). kAESNI, //!< CPU has AESNI (AES encode/decode instructions). - kALTMOVCR8, //!< CPU has LOCK MOV R<->CR0 (supports `MOV R<->CR8` via `LOCK MOV R<->CR0` in 32-bit mode) [AMD]. - kAMX_BF16, //!< CPU has AMX_BF16 (advanced matrix extensions - BF16 instructions). - kAMX_INT8, //!< CPU has AMX_INT8 (advanced matrix extensions - INT8 instructions). + kALTMOVCR8, //!< CPU has LOCK MOV R<->CR0 (supports `MOV R<->CR8` via `LOCK MOV R<->CR0` in 32-bit mode) {AMD}. + kAMX_BF16, //!< CPU has AMX_BF16 (AMX-BF16 instructions). + kAMX_COMPLEX, //!< CPU has AMX_COMPLEX (AMX-COMPLEX instructions). + kAMX_FP16, //!< CPU has AMX_FP16 (AMX-FP16 instructions). + kAMX_INT8, //!< CPU has AMX_INT8 (AMX-INT8 instructions). kAMX_TILE, //!< CPU has AMX_TILE (advanced matrix extensions). + kAPX_F, //!< CPU has APX_F (advanced performance extensions - 32 GP registers, REX2 prefix, ...) {X86_64}. kAVX, //!< CPU has AVX (advanced vector extensions). kAVX2, //!< CPU has AVX2 (advanced vector extensions 2). kAVX512_4FMAPS, //!< CPU has AVX512_FMAPS (FMA packed single). kAVX512_4VNNIW, //!< CPU has AVX512_VNNIW (vector NN instructions word variable precision). - kAVX512_BF16, //!< CPU has AVX512_BF16 (BFLOAT16 support instruction). - kAVX512_BITALG, //!< CPU has AVX512_BITALG (VPOPCNT[B|W], VPSHUFBITQMB). - kAVX512_BW, //!< CPU has AVX512_BW (packed BYTE|WORD). - kAVX512_CDI, //!< CPU has AVX512_CDI (conflict detection). - kAVX512_DQ, //!< CPU has AVX512_DQ (packed DWORD|QWORD). - kAVX512_ERI, //!< CPU has AVX512_ERI (exponential and reciprocal). + kAVX512_BF16, //!< CPU has AVX512_BF16 (AVX512 BFLOAT16 support instructions). + kAVX512_BITALG, //!< CPU has AVX512_BITALG (AVX512 VPOPCNT[B|W] and VPSHUFBITQMB instructions). + kAVX512_BW, //!< CPU has AVX512_BW (AVX512 integer BYTE|WORD instructions). + kAVX512_CD, //!< CPU has AVX512_CD (AVX512 conflict detection DWORD|QWORD instructions). + kAVX512_DQ, //!< CPU has AVX512_DQ (AVX512 integer DWORD|QWORD instructions). + kAVX512_ER, //!< CPU has AVX512_ER (AVX512 exponential and reciprocal instructions). kAVX512_F, //!< CPU has AVX512_F (AVX512 foundation). - kAVX512_FP16, //!< CPU has AVX512_FP16 (FP16 extensions). - kAVX512_IFMA, //!< CPU has AVX512_IFMA (integer fused-multiply-add using 52-bit precision). - kAVX512_PFI, //!< CPU has AVX512_PFI (prefetch instructions). - kAVX512_VBMI, //!< CPU has AVX512_VBMI (vector byte manipulation). - kAVX512_VBMI2, //!< CPU has AVX512_VBMI2 (vector byte manipulation 2). - kAVX512_VL, //!< CPU has AVX512_VL (vector length extensions). - kAVX512_VNNI, //!< CPU has AVX512_VNNI (vector neural network instructions). + kAVX512_FP16, //!< CPU has AVX512_FP16 (AVX512 FP16 instructions). + kAVX512_IFMA, //!< CPU has AVX512_IFMA (AVX512 integer fused-multiply-add using 52-bit precision). + kAVX512_PF, //!< CPU has AVX512_PF (AVX512 prefetch instructions). + kAVX512_VBMI, //!< CPU has AVX512_VBMI (AVX152 vector byte manipulation instructions). + kAVX512_VBMI2, //!< CPU has AVX512_VBMI2 (AVX512 vector byte manipulation instructions v2). + kAVX512_VL, //!< CPU has AVX512_VL (AVX512 vector length extensions). + kAVX512_VNNI, //!< CPU has AVX512_VNNI (AVX512 vector neural network instructions). kAVX512_VP2INTERSECT, //!< CPU has AVX512_VP2INTERSECT - kAVX512_VPOPCNTDQ, //!< CPU has AVX512_VPOPCNTDQ (VPOPCNT[D|Q] instructions). - kAVX_VNNI, //!< CPU has AVX_VNNI (VEX encoding of vpdpbusd/vpdpbusds/vpdpwssd/vpdpwssds). + kAVX512_VPOPCNTDQ, //!< CPU has AVX512_VPOPCNTDQ (AVX512 VPOPCNT[D|Q] instructions). + kAVX_IFMA, //!< CPU has AVX_IFMA (AVX/VEX encoding of vpmadd52huq/vpmadd52luq). + kAVX_NE_CONVERT, //!< CPU has AVX_NE_CONVERT. + kAVX_VNNI, //!< CPU has AVX_VNNI (AVX/VEX encoding of vpdpbusd/vpdpbusds/vpdpwssd/vpdpwssds). + kAVX_VNNI_INT16, //!< CPU has AVX_VNNI_INT16. + kAVX_VNNI_INT8, //!< CPU has AVX_VNNI_INT8. kBMI, //!< CPU has BMI (bit manipulation instructions #1). kBMI2, //!< CPU has BMI2 (bit manipulation instructions #2). kCET_IBT, //!< CPU has CET-IBT (indirect branch tracking). kCET_SS, //!< CPU has CET-SS. + kCET_SSS, //!< CPU has CET-SSS. kCLDEMOTE, //!< CPU has CLDEMOTE (cache line demote). - kCLFLUSH, //!< CPU has CLFUSH (Cache Line flush). - kCLFLUSHOPT, //!< CPU has CLFUSHOPT (Cache Line flush - optimized). + kCLFLUSH, //!< CPU has CLFUSH (cache Line flush). + kCLFLUSHOPT, //!< CPU has CLFUSHOPT (cache Line flush - optimized). kCLWB, //!< CPU has CLWB. kCLZERO, //!< CPU has CLZERO. kCMOV, //!< CPU has CMOV (CMOV and FCMOV instructions). - kCMPXCHG16B, //!< CPU has CMPXCHG16B (compare-exchange 16 bytes) [X86_64]. + kCMPCCXADD, //!< CPU has CMPCCXADD. + kCMPXCHG16B, //!< CPU has CMPXCHG16B (compare-exchange 16 bytes) {X86_64}. kCMPXCHG8B, //!< CPU has CMPXCHG8B (compare-exchange 8 bytes). kENCLV, //!< CPU has ENCLV. kENQCMD, //!< CPU has ENQCMD (enqueue stores). kERMS, //!< CPU has ERMS (enhanced REP MOVSB/STOSB). - kF16C, //!< CPU has F16C. - kFMA, //!< CPU has FMA (fused-multiply-add 3 operand form). - kFMA4, //!< CPU has FMA4 (fused-multiply-add 4 operand form). + kF16C, //!< CPU has F16C (AVX FP16 conversion instructions). + kFMA, //!< CPU has FMA (AVX fused-multiply-add - 3 operand form). + kFMA4, //!< CPU has FMA4 (AVX fused-multiply-add - 4 operand form) (deprecated). kFPU, //!< CPU has FPU (FPU support). kFSGSBASE, //!< CPU has FSGSBASE. + kFSRM, //!< CPU has FSRM (fast short REP MOVSB). + kFSRC, //!< CPU has FSRC (fast short REP CMPSB|SCASB). + kFSRS, //!< CPU has FSRS (fast short REP STOSB) kFXSR, //!< CPU has FXSR (FXSAVE/FXRSTOR instructions). kFXSROPT, //!< CPU has FXSROTP (FXSAVE/FXRSTOR is optimized). - kGEODE, //!< CPU has GEODE extensions (3DNOW additions). - kGFNI, //!< CPU has GFNI (Galois field instructions). + kFZRM, //!< CPU has FZRM (fast zero-length REP MOVSB). + kGEODE, //!< CPU has GEODE extensions (GEODE 3DNOW additions) (deprecated). + kGFNI, //!< CPU has GFNI (galois field instructions). kHLE, //!< CPU has HLE. kHRESET, //!< CPU has HRESET. kI486, //!< CPU has I486 features (I486+ support). - kLAHFSAHF, //!< CPU has LAHF/SAHF (LAHF/SAHF in 64-bit mode) [X86_64]. - kLWP, //!< CPU has LWP (lightweight profiling) [AMD]. + kINVLPGB, //!< CPU has INVLPGB. + kLAHFSAHF, //!< CPU has LAHF/SAHF (LAHF/SAHF in 64-bit mode) {X86_64}. + kLAM, //!< CPU has LAM (linear address masking) {X86_64}. + kLWP, //!< CPU has LWP (lightweight profiling) {AMD}. kLZCNT, //!< CPU has LZCNT (LZCNT instruction). kMCOMMIT, //!< CPU has MCOMMIT (MCOMMIT instruction). - kMMX, //!< CPU has MMX (MMX base instructions). - kMMX2, //!< CPU has MMX2 (MMX extensions or MMX2). + kMMX, //!< CPU has MMX (MMX base instructions) (deprecated). + kMMX2, //!< CPU has MMX2 (MMX2 extensions or initial SSE extensions) (deprecated). kMONITOR, //!< CPU has MONITOR (MONITOR/MWAIT instructions). kMONITORX, //!< CPU has MONITORX (MONITORX/MWAITX instructions). kMOVBE, //!< CPU has MOVBE (move with byte-order swap). @@ -238,58 +275,78 @@ class CpuFeatures { kMOVDIRI, //!< CPU has MOVDIRI (move dword/qword as direct store). kMPX, //!< CPU has MPX (memory protection extensions). kMSR, //!< CPU has MSR (RDMSR/WRMSR instructions). + kMSRLIST, //!< CPU has MSRLIST. kMSSE, //!< CPU has MSSE (misaligned SSE support). kOSXSAVE, //!< CPU has OSXSAVE (XSAVE enabled by OS). kOSPKE, //!< CPU has OSPKE (PKE enabled by OS). kPCLMULQDQ, //!< CPU has PCLMULQDQ (packed carry-less multiplication). kPCONFIG, //!< CPU has PCONFIG (PCONFIG instruction). kPOPCNT, //!< CPU has POPCNT (POPCNT instruction). + kPREFETCHI, //!< CPU has PREFETCHI. kPREFETCHW, //!< CPU has PREFETCHW. kPREFETCHWT1, //!< CPU has PREFETCHWT1. kPTWRITE, //!< CPU has PTWRITE. - kRDPID, //!< CPU has RDPID. - kRDPRU, //!< CPU has RDPRU. - kRDRAND, //!< CPU has RDRAND. - kRDSEED, //!< CPU has RDSEED. + kRAO_INT, //!< CPU has RAO_INT (AADD, AAND, AOR, AXOR instructions). + kRMPQUERY, //!< CPU has RMPQUERY (RMPQUERY instruction). + kRDPID, //!< CPU has RDPID (RDPID instruction). + kRDPRU, //!< CPU has RDPRU (RDPRU instruction). + kRDRAND, //!< CPU has RDRAND (RDRAND instruction). + kRDSEED, //!< CPU has RDSEED (RDSEED instruction). kRDTSC, //!< CPU has RDTSC. kRDTSCP, //!< CPU has RDTSCP. kRTM, //!< CPU has RTM. + kSEAM, //!< CPU has SEAM. kSERIALIZE, //!< CPU has SERIALIZE. + kSEV, //!< CPU has SEV (secure encrypted virtualization). + kSEV_ES, //!< CPU has SEV_ES (SEV encrypted state). + kSEV_SNP, //!< CPU has SEV_SNP (SEV secure nested paging). kSHA, //!< CPU has SHA (SHA-1 and SHA-256 instructions). - kSKINIT, //!< CPU has SKINIT (SKINIT/STGI instructions) [AMD]. + kSHA512, //!< CPU has SHA512 (SHA-512 instructions). + kSKINIT, //!< CPU has SKINIT (SKINIT/STGI instructions) {AMD}. + kSM3, //!< CPU has SM3 (SM3 hash extensions). + kSM4, //!< CPU has SM4 (SM4 cipher extensions). kSMAP, //!< CPU has SMAP (supervisor-mode access prevention). + kSME , //!< CPU has SME (secure memory encryption). kSMEP, //!< CPU has SMEP (supervisor-mode execution prevention). kSMX, //!< CPU has SMX (safer mode extensions). - kSNP, //!< CPU has SNP. - kSSE, //!< CPU has SSE. - kSSE2, //!< CPU has SSE2. - kSSE3, //!< CPU has SSE3. - kSSE4_1, //!< CPU has SSE4.1. - kSSE4_2, //!< CPU has SSE4.2. - kSSE4A, //!< CPU has SSE4A [AMD]. - kSSSE3, //!< CPU has SSSE3. - kSVM, //!< CPU has SVM (virtualization) [AMD]. - kTBM, //!< CPU has TBM (trailing bit manipulation) [AMD]. + kSSE, //!< CPU has SSE (SSE instructions). + kSSE2, //!< CPU has SSE2 (SSE2 instructions). + kSSE3, //!< CPU has SSE3 (SSE3 instructions). + kSSE4_1, //!< CPU has SSE4.1 (SSE4.1 instructions). + kSSE4_2, //!< CPU has SSE4.2 (SSE4.2 instructions). + kSSE4A, //!< CPU has SSE4A (SSE4.A instructions) {AMD} (deprecated). + kSSSE3, //!< CPU has SSSE3 (SSSE3 instructions). + kSVM, //!< CPU has SVM (virtualization) {AMD}. + kTBM, //!< CPU has TBM (trailing bit manipulation) {AMD}. + kTSE, //!< CPU has TSE. kTSX, //!< CPU has TSX. kTSXLDTRK, //!< CPU has TSXLDTRK. kUINTR, //!< CPU has UINTR (user interrupts). kVAES, //!< CPU has VAES (vector AES 256|512 bit support). - kVMX, //!< CPU has VMX (virtualization) [INTEL]. + kVMX, //!< CPU has VMX (virtualization) {INTEL}. kVPCLMULQDQ, //!< CPU has VPCLMULQDQ (vector PCLMULQDQ 256|512-bit support). kWAITPKG, //!< CPU has WAITPKG (UMONITOR, UMWAIT, TPAUSE). kWBNOINVD, //!< CPU has WBNOINVD. - kXOP, //!< CPU has XOP (XOP instructions) [AMD]. + kWRMSRNS, //!< CPU has WRMSRNS. + kXOP, //!< CPU has XOP (XOP instructions) {AMD} (deprecated). kXSAVE, //!< CPU has XSAVE. kXSAVEC, //!< CPU has XSAVEC. kXSAVEOPT, //!< CPU has XSAVEOPT. kXSAVES, //!< CPU has XSAVES. // @EnumValuesEnd@ +#ifndef ASMJIT_NO_DEPRECATED + kAVX512_CDI = kAVX512_CD, + kAVX512_ERI = kAVX512_ER, + kAVX512_PFI = kAVX512_PF, +#endif + kMaxValue = kXSAVES }; #define ASMJIT_X86_FEATURE(FEATURE) \ - inline bool has##FEATURE() const noexcept { return has(X86::k##FEATURE); } + /*! Tests whether FEATURE is present. */ \ + ASMJIT_INLINE_NODEBUG bool has##FEATURE() const noexcept { return has(X86::k##FEATURE); } ASMJIT_X86_FEATURE(MT) ASMJIT_X86_FEATURE(NX) @@ -299,8 +356,11 @@ class CpuFeatures { ASMJIT_X86_FEATURE(AESNI) ASMJIT_X86_FEATURE(ALTMOVCR8) ASMJIT_X86_FEATURE(AMX_BF16) + ASMJIT_X86_FEATURE(AMX_COMPLEX) + ASMJIT_X86_FEATURE(AMX_FP16) ASMJIT_X86_FEATURE(AMX_INT8) ASMJIT_X86_FEATURE(AMX_TILE) + ASMJIT_X86_FEATURE(APX_F) ASMJIT_X86_FEATURE(AVX) ASMJIT_X86_FEATURE(AVX2) ASMJIT_X86_FEATURE(AVX512_4FMAPS) @@ -308,24 +368,29 @@ class CpuFeatures { ASMJIT_X86_FEATURE(AVX512_BF16) ASMJIT_X86_FEATURE(AVX512_BITALG) ASMJIT_X86_FEATURE(AVX512_BW) - ASMJIT_X86_FEATURE(AVX512_CDI) + ASMJIT_X86_FEATURE(AVX512_CD) ASMJIT_X86_FEATURE(AVX512_DQ) - ASMJIT_X86_FEATURE(AVX512_ERI) + ASMJIT_X86_FEATURE(AVX512_ER) ASMJIT_X86_FEATURE(AVX512_F) ASMJIT_X86_FEATURE(AVX512_FP16) ASMJIT_X86_FEATURE(AVX512_IFMA) - ASMJIT_X86_FEATURE(AVX512_PFI) + ASMJIT_X86_FEATURE(AVX512_PF) ASMJIT_X86_FEATURE(AVX512_VBMI) ASMJIT_X86_FEATURE(AVX512_VBMI2) ASMJIT_X86_FEATURE(AVX512_VL) ASMJIT_X86_FEATURE(AVX512_VNNI) ASMJIT_X86_FEATURE(AVX512_VP2INTERSECT) ASMJIT_X86_FEATURE(AVX512_VPOPCNTDQ) + ASMJIT_X86_FEATURE(AVX_IFMA) + ASMJIT_X86_FEATURE(AVX_NE_CONVERT) ASMJIT_X86_FEATURE(AVX_VNNI) + ASMJIT_X86_FEATURE(AVX_VNNI_INT16) + ASMJIT_X86_FEATURE(AVX_VNNI_INT8) ASMJIT_X86_FEATURE(BMI) ASMJIT_X86_FEATURE(BMI2) ASMJIT_X86_FEATURE(CET_IBT) ASMJIT_X86_FEATURE(CET_SS) + ASMJIT_X86_FEATURE(CET_SSS) ASMJIT_X86_FEATURE(CLDEMOTE) ASMJIT_X86_FEATURE(CLFLUSH) ASMJIT_X86_FEATURE(CLFLUSHOPT) @@ -342,14 +407,20 @@ class CpuFeatures { ASMJIT_X86_FEATURE(FMA4) ASMJIT_X86_FEATURE(FPU) ASMJIT_X86_FEATURE(FSGSBASE) + ASMJIT_X86_FEATURE(FSRM) + ASMJIT_X86_FEATURE(FSRC) + ASMJIT_X86_FEATURE(FSRS) ASMJIT_X86_FEATURE(FXSR) ASMJIT_X86_FEATURE(FXSROPT) + ASMJIT_X86_FEATURE(FZRM) ASMJIT_X86_FEATURE(GEODE) ASMJIT_X86_FEATURE(GFNI) ASMJIT_X86_FEATURE(HLE) ASMJIT_X86_FEATURE(HRESET) ASMJIT_X86_FEATURE(I486) + ASMJIT_X86_FEATURE(INVLPGB) ASMJIT_X86_FEATURE(LAHFSAHF) + ASMJIT_X86_FEATURE(LAM) ASMJIT_X86_FEATURE(LWP) ASMJIT_X86_FEATURE(LZCNT) ASMJIT_X86_FEATURE(MCOMMIT) @@ -362,15 +433,19 @@ class CpuFeatures { ASMJIT_X86_FEATURE(MOVDIRI) ASMJIT_X86_FEATURE(MPX) ASMJIT_X86_FEATURE(MSR) + ASMJIT_X86_FEATURE(MSRLIST) ASMJIT_X86_FEATURE(MSSE) ASMJIT_X86_FEATURE(OSXSAVE) ASMJIT_X86_FEATURE(OSPKE) ASMJIT_X86_FEATURE(PCLMULQDQ) ASMJIT_X86_FEATURE(PCONFIG) ASMJIT_X86_FEATURE(POPCNT) + ASMJIT_X86_FEATURE(PREFETCHI) ASMJIT_X86_FEATURE(PREFETCHW) ASMJIT_X86_FEATURE(PREFETCHWT1) ASMJIT_X86_FEATURE(PTWRITE) + ASMJIT_X86_FEATURE(RAO_INT) + ASMJIT_X86_FEATURE(RMPQUERY) ASMJIT_X86_FEATURE(RDPID) ASMJIT_X86_FEATURE(RDPRU) ASMJIT_X86_FEATURE(RDRAND) @@ -378,13 +453,16 @@ class CpuFeatures { ASMJIT_X86_FEATURE(RDTSC) ASMJIT_X86_FEATURE(RDTSCP) ASMJIT_X86_FEATURE(RTM) + ASMJIT_X86_FEATURE(SEAM) ASMJIT_X86_FEATURE(SERIALIZE) + ASMJIT_X86_FEATURE(SEV) + ASMJIT_X86_FEATURE(SEV_ES) + ASMJIT_X86_FEATURE(SEV_SNP) ASMJIT_X86_FEATURE(SHA) ASMJIT_X86_FEATURE(SKINIT) ASMJIT_X86_FEATURE(SMAP) ASMJIT_X86_FEATURE(SMEP) ASMJIT_X86_FEATURE(SMX) - ASMJIT_X86_FEATURE(SNP) ASMJIT_X86_FEATURE(SSE) ASMJIT_X86_FEATURE(SSE2) ASMJIT_X86_FEATURE(SSE3) @@ -394,6 +472,7 @@ class CpuFeatures { ASMJIT_X86_FEATURE(SSSE3) ASMJIT_X86_FEATURE(SVM) ASMJIT_X86_FEATURE(TBM) + ASMJIT_X86_FEATURE(TSE) ASMJIT_X86_FEATURE(TSX) ASMJIT_X86_FEATURE(TSXLDTRK) ASMJIT_X86_FEATURE(UINTR) @@ -402,95 +481,248 @@ class CpuFeatures { ASMJIT_X86_FEATURE(VPCLMULQDQ) ASMJIT_X86_FEATURE(WAITPKG) ASMJIT_X86_FEATURE(WBNOINVD) + ASMJIT_X86_FEATURE(WRMSRNS) ASMJIT_X86_FEATURE(XOP) ASMJIT_X86_FEATURE(XSAVE) ASMJIT_X86_FEATURE(XSAVEC) ASMJIT_X86_FEATURE(XSAVEOPT) ASMJIT_X86_FEATURE(XSAVES) +#ifndef ASMJIT_NO_DEPRECATED + ASMJIT_DEPRECATED("Use hasAVX512_CD() instead") + ASMJIT_X86_FEATURE(AVX512_CDI) + + ASMJIT_DEPRECATED("Use hasAVX512_ER() instead") + ASMJIT_X86_FEATURE(AVX512_ERI) + + ASMJIT_DEPRECATED("Use hasAVX512_PF() instead") + ASMJIT_X86_FEATURE(AVX512_PFI) +#endif + #undef ASMJIT_X86_FEATURE }; //! ARM specific features data. + //! + //! Naming reference: + //! - https://developer.arm.com/downloads/-/exploration-tools/feature-names-for-a-profile struct ARM : public Data { //! ARM CPU feature identifiers. enum Id : uint8_t { // @EnumValuesBegin{"enum": "CpuFeatures::ARM"}@ kNone = 0, //!< No feature (never set, used internally). - kTHUMB, //!< THUMB v1 ISA. - kTHUMBv2, //!< THUMB v2 ISA. - - kARMv6, //!< ARMv6 ISA. - kARMv7, //!< ARMv7 ISA. - kARMv8a, //!< ARMv8-A ISA. - kARMv8_1a, //!< ARMv8.1-A ISA. - kARMv8_2a, //!< ARMv8.2-A ISA. - kARMv8_3a, //!< ARMv8.3-A ISA. - kARMv8_4a, //!< ARMv8.4-A ISA. - kARMv8_5a, //!< ARMv8.5-A ISA. - kARMv8_6a, //!< ARMv8.6-A ISA. - kARMv8_7a, //!< ARMv8.7-A ISA. - - kVFPv2, //!< CPU has VFPv2 instruction set. - kVFPv3, //!< CPU has VFPv3 instruction set. - kVFPv4, //!< CPU has VFPv4 instruction set. - kVFP_D32, //!< CPU has 32 VFP-D (64-bit) registers. - - kAES, //!< CPU has AES (AArch64 only). - kALTNZCV, //!< CPU has ALTNZCV (AArch64 only). - kASIMD, //!< CPU has Advanced SIMD (NEON on ARM/THUMB). - kBF16, //!< CPU has BF16 (AArch64 only). - kBTI, //!< CPU has BTI (branch target identification). - kCPUID, //!< CPU has accessible CPUID register (ID_AA64ZFR0_EL1). - kCRC32, //!< CPU has CRC32 . - kDGH, //!< CPU has DGH (AArch64 only). - kDIT, //!< CPU has data independent timing instructions (DIT). - kDOTPROD, //!< CPU has DOTPROD (SDOT/UDOT). - kEDSP, //!< CPU has EDSP (ARM/THUMB only). - kFCMA, //!< CPU has FCMA (FCADD/FCMLA). - kFJCVTZS, //!< CPU has FJCVTZS (AArch64 only). - kFLAGM, //!< CPU has FLAGM (AArch64 only). - kFP16CONV, //!< CPU has FP16 (half-float) conversion. - kFP16FML, //!< CPU has FMLAL{2}/FMLSL{2} - kFP16FULL, //!< CPU has full support for FP16. - kFRINT, //!< CPU has FRINT[32|64][X|Z] (AArch64 only). - kI8MM, //!< CPU has I8MM (AArch64 only). - kIDIVA, //!< CPU has hardware SDIV and UDIV (ARM mode). - kIDIVT, //!< CPU has hardware SDIV and UDIV (THUMB mode). - kLSE, //!< CPU has large system extensions (LSE) (AArch64 only). - kMTE, //!< CPU has MTE (AArch64 only). - kRCPC_IMMO, //!< CPU has RCPC_IMMO (AArch64 only). - kRDM, //!< CPU has RDM (AArch64 only). - kPMU, //!< CPU has PMU (AArch64 only). - kPMULL, //!< CPU has PMULL (AArch64 only). - kRNG, //!< CPU has random number generation (RNG). - kSB, //!< CPU has speculative barrier SB (AArch64 only). - kSHA1, //!< CPU has SHA1. - kSHA2, //!< CPU has SHA2. - kSHA3, //!< CPU has SHA3. - kSHA512, //!< CPU has SHA512. - kSM3, //!< CPU has SM3. - kSM4, //!< CPU has SM4. - kSSBS, //!< CPU has SSBS. - kSVE, //!< CPU has SVE (AArch64 only). - kSVE_BF16, //!< CPU has SVE-BF16 (AArch64 only). - kSVE_F32MM, //!< CPU has SVE-F32MM (AArch64 only). - kSVE_F64MM, //!< CPU has SVE-F64MM (AArch64 only). - kSVE_I8MM, //!< CPU has SVE-I8MM (AArch64 only). - kSVE_PMULL, //!< CPU has SVE-PMULL (AArch64 only). - kSVE2, //!< CPU has SVE2 (AArch64 only). - kSVE2_AES, //!< CPU has SVE2-AES (AArch64 only). - kSVE2_BITPERM, //!< CPU has SVE2-BITPERM (AArch64 only). - kSVE2_SHA3, //!< CPU has SVE2-SHA3 (AArch64 only). - kSVE2_SM4, //!< CPU has SVE2-SM4 (AArch64 only). - kTME, //!< CPU has transactional memory extensions (TME). + + kARMv6, //!< CPU is at least ARMv6 {A32}. + kARMv7, //!< CPU is at least ARMv7 {A32}. + kARMv8a, //!< CPU is at least ARMv8A. + kTHUMB, //!< CPU has THUMB (16-bit THUMB encoding) {A32}. + kTHUMBv2, //!< CPU has THUMBv2 (32-bit THUMB encoding) {A32}. + + kABLE, //!< CPU has ABLE (address breakpoint linking extension) {A64}. + kADERR, //!< CPU has ADERR (asynchronous device error exceptions) {A64}. + kAES, //!< CPU has AES (ASIMD AES instructions). + kAFP, //!< CPU has AFP (alternate floating-point behavior) {A64}. + kAIE, //!< CPU has AIE (memory attribute index enhancement) {A64}. + kAMU1, //!< CPU has AMUv1 (activity monitors extension version 1) {A64}. + kAMU1_1, //!< CPU has AMUv1p1 (activity monitors extension version 1.1) {A64}. + kANERR, //!< CPU has ANERR (asynchronous normal error exception) {A64}. + kASIMD, //!< CPU has ASIMD (NEON on ARM/THUMB). + kBF16, //!< CPU has BF16 (BFloat16 instructions) {A64}. + kBRBE, //!< CPU has BRBE (branch record buffer extension) {A64}. + kBTI, //!< CPU has BTI (branch target identification). + kBWE, //!< CPU has BWE (breakpoint mismatch and range extension) {A64}. + kCCIDX, //!< CPU has CCIDX (extend of the CCSIDR number of sets). + kCHK, //!< CPU has CHK (check feature status - CHKFEAT instruction) {A64}. + kCLRBHB, //!< CPU has CLRBHB (clear BHB instruction). + kCMOW, //!< CPU has CMOW (control for cache maintenance permission) {A64}. + kCONSTPACFIELD, //!< CPU has CONSTPACFIELD (PAC algorithm enhancement) {A64}. + kCPA, //!< CPU has CPA (instruction-only Checked Pointer Arithmetic) {A64}. + kCPA2, //!< CPU has CPA2 (checked Pointer Arithmetic) {A64}. + kCPUID, //!< CPU has CPUID (CPUID registers accessible in user-space). + kCRC32, //!< CPU has CRC32 (CRC32 instructions). + kCSSC, //!< CPU has CSSC (common short sequence compression) {A64}. + kCSV2, //!< CPU has CSV2 (cache speculation variant 2 version 2.1) {A64}. + kCSV2_3, //!< CPU has CSV2_3 (cache speculation variant 2 version 3) {A64}. + kCSV3, //!< CPU has CSV3 (cache speculation Variant 3) {A64}. + kD128, //!< CPU has D128 (128-bit translation tables, 56 bit PA) {A64}. + kDGH, //!< CPU has DGH (data gathering hint) {A64}. + kDIT, //!< CPU has DIT (data independent timing of instructions). + kDOTPROD, //!< CPU has DOTPROD (ASIMD Int8 dot product instructions). + kDPB, //!< CPU has DPB (DC CVAP instruction) {A64}. + kDPB2, //!< CPU has DPB2 (DC CVADP instruction) {A64}. + kEBEP, //!< CPU has EBEP (exception-based event profiling) {A64}. + kEBF16, //!< CPU has EBF16 (extended BFloat16 mode) {A64}. + kECBHB, //!< CPU has ECBHB (exploitative control using branch history information) {A64}. + kECV, //!< CPU has ECV (enhanced counter virtualization). + kEDHSR, //!< CPU has EDHSR (support for EDHSR) {A64}. + kEDSP, //!< CPU has EDSP (ARM/THUMB only). + kFAMINMAX, //!< CPU has FAMINMAX (floating-point maximum and minimum absolute value instructions) {A64}. + kFCMA, //!< CPU has FCMA (FCADD/FCMLA). + kFGT, //!< CPU has FGT (fine-grained traps). + kFGT2, //!< CPU has FGT2 (fine-grained traps 2). + kFHM, //!< CPU has FHM (half-precision floating-point FMLAL instructions). + kFLAGM, //!< CPU has FLAGM (condition flag manipulation) {A64}. + kFLAGM2, //!< CPU has FLAGM2 (condition flag manipulation version v2) {A64}. + kFMAC, //!< CPU has FMAC (ARM/THUMB only). + kFP, //!< CPU has FP (floating-point) (on 32-bit ARM this means VFPv3). + kFP16, //!< CPU has FP16 (half-precision floating-point data processing). + kFP16CONV, //!< CPU has FP16CONV (half-precision float conversion). + kFP8, //!< CPU has FP8 (FP8 convert instructions) {A64}. + kFP8DOT2, //!< CPU has FP8DOT2 (FP8 2-way dot product to half-precision instructions) {A64}. + kFP8DOT4, //!< CPU has FP8DOT4 (FP8 4-way dot product to single-precision instructions) {A64}. + kFP8FMA, //!< CPU has FP8FMA (FP8 multiply-accumulate to half-precision and single-precision instructions) {A64}. + kFPMR, //!< CPU has FPMR (floating-point Mode Register) {A64}. + kFRINTTS, //!< CPU has FRINTTS (FRINT[32|64][X|Z] instructions) {A64}. + kGCS, //!< CPU has GCS (guarded control stack extension) {A64}. + kHACDBS, //!< CPU has HACDBS (hardware accelerator for cleaning Dirty state) {A64}. + kHAFDBS, //!< CPU has HAFDBS (hardware management of the access flag and dirty state) {A64}. + kHAFT, //!< CPU has HAFT (hardware managed access flag for table descriptors) {A64}. + kHDBSS, //!< CPU has HDBSS (hardware Dirty state tracking Structure) {A64}. + kHBC, //!< CPU has HBC (hinted conditional branches) {A64}. + kHCX, //!< CPU has HCX (support for the HCRX_EL2 register) {A64}. + kHPDS, //!< CPU has HPDS (hierarchical permission disables in translation tables ) {A64}. + kHPDS2, //!< CPU has HPDS2 (hierarchical permission disables) {A64}. + kI8MM, //!< CPU has I8MM (int8 matrix multiplication) {A64}. + kIDIVA, //!< CPU has IDIV (hardware SDIV and UDIV in ARM mode). + kIDIVT, //!< CPU has IDIV (hardware SDIV and UDIV in THUMB mode). + kITE, //!< CPU has ITE (instrumentation extension) {A64}. + kJSCVT, //!< CPU has JSCVT (JavaScript FJCVTS conversion instruction) {A64}. + kLOR, //!< CPU has LOR (limited ordering regions extension). + kLRCPC, //!< CPU has LRCPC (load-acquire RCpc instructions) {A64}. + kLRCPC2, //!< CPU has LRCPC2 (load-acquire RCpc instructions v2) {A64}. + kLRCPC3, //!< CPU has LRCPC3 (load-Acquire RCpc instructions v3) {A64}. + kLS64, //!< CPU has LS64 (64 byte loads/stores without return) {A64}. + kLS64_ACCDATA, //!< CPU has LS64_ACCDATA (64-byte EL0 stores with return) {A64}. + kLS64_V, //!< CPU has LS64_V (64-byte stores with return) {A64}. + kLSE, //!< CPU has LSE (large system extensions) {A64}. + kLSE128, //!< CPU has LSE128 (128-bit atomics) {A64}. + kLSE2, //!< CPU has LSE2 (large system extensions v2) {A64}. + kLUT, //!< CPU has LUT (lookup table instructions with 2-bit and 4-bit indices) {A64}. + kLVA, //!< CPU has LVA (large VA support) {A64}. + kLVA3, //!< CPU has LVA3 (56-bit VA) {A64}. + kMEC, //!< CPU has MEC (memory encryption contexts) {A64}. + kMOPS, //!< CPU has MOPS (memcpy and memset acceleration instructions) {A64}. + kMPAM, //!< CPU has MPAM (memory system partitioning and monitoring extension) {A64}. + kMTE, //!< CPU has MTE (instruction-only memory tagging extension) {A64}. + kMTE2, //!< CPU has MTE2 (full memory tagging extension) {A64}. + kMTE3, //!< CPU has MTE3 (MTE asymmetric fault handling) {A64}. + kMTE4, //!< CPU has MTE4 (MTE v4) {A64}. + kMTE_ASYM_FAULT, //!< CPU has MTE_ASYM_FAULT (memory tagging asymmetric faults) {A64}. + kMTE_ASYNC, //!< CPU has MTE_ASYNC (memory tagging asynchronous faulting) {A64}. + kMTE_CANONICAL_TAGS, //!< CPU has MTE_CANONICAL_TAGS (canonical tag checking for untagged memory) {A64}. + kMTE_NO_ADDRESS_TAGS, //!< CPU has MTE_NO_ADDRESS_TAGS (memory tagging with address tagging disabled) {A64}. + kMTE_PERM_S1, //!< CPU has MTE_PERM_S1 (allocation tag access permission) {A64}. + kMTE_STORE_ONLY, //!< CPU has MTE_STORE_ONLY (store-only tag checking) {A64}. + kMTE_TAGGED_FAR, //!< CPU has MTE_TAGGED_FAR (FAR_ELx on a tag check fault) {A64}. + kMTPMU, //!< CPU has MTPMU (multi-threaded PMU extensions) {A64}. + kNMI, //!< CPU has NMI (non-maskable Interrupt) {A64}. + kNV, //!< CPU has NV (nested virtualization enchancement) {A64}. + kNV2, //!< CPU has NV2 (enhanced support for nested virtualization) {A64}. + kPAN, //!< CPU has PAN (privileged access-never extension) {A64}. + kPAN2, //!< CPU has PAN2 (PAN s1e1R and s1e1W variants) {A64}. + kPAN3, //!< CPU has PAN3 (support for SCTLR_ELx.EPAN) {A64}. + kPAUTH, //!< CPU has PAUTH (pointer authentication extension) {A64}. + kPFAR, //!< CPU has PFAR (physical fault address registers) {A64}. + kPMU, //!< CPU has PMU {A64}. + kPMULL, //!< CPU has PMULL (ASIMD PMULL instructions) {A64}. + kPRFMSLC, //!< CPU has PRFMSLC (PRFM instructions support the SLC target) {A64}. + kRAS, //!< CPU has RAS (reliability, availability and serviceability extensions). + kRAS1_1, //!< CPU has RASv1p1 (RAS v1.1). + kRAS2, //!< CPU has RASv2 (RAS v2). + kRASSA2, //!< CPU has RASSAv2 (RAS v2 system architecture). + kRDM, //!< CPU has RDM (rounding double multiply accumulate) {A64}. + kRME, //!< CPU has RME (memory encryption contexts extension) {A64}. + kRNG, //!< CPU has RNG (random number generation). + kRNG_TRAP, //!< CPU has RNG_TRAP (random number trap to EL3 field) {A64}. + kRPRES, //!< CPU has RPRES (increased precision of reciprocal estimate and RSQRT estimate) {A64}. + kRPRFM, //!< CPU has RPRFM (range prefetch hint instruction). + kS1PIE, //!< CPU has S1PIE (permission model enhancements) {A64}. + kS1POE, //!< CPU has S1POE (permission model enhancements) {A64}. + kS2PIE, //!< CPU has S2PIE (permission model enhancements) {A64}. + kS2POE, //!< CPU has S2POE (permission model enhancements) {A64}. + kSB, //!< CPU has SB (speculative barrier). + kSCTLR2, //!< CPU has SCTLR2 (extension to SCTLR_ELx) {A64}. + kSEBEP, //!< CPU has SEBEP (synchronous exception-based event profiling) {A64}. + kSEL2, //!< CPU has SEL2 (secure EL2) {A64}. + kSHA1, //!< CPU has SHA1 (ASIMD SHA1 instructions). + kSHA256, //!< CPU has SHA256 (ASIMD SHA256 instructions). + kSHA3, //!< CPU has SHA3 (ASIMD EOR3, RAX1, XAR, and BCAX instructions). + kSHA512, //!< CPU has SHA512 (ASIMD SHA512 instructions). + kSM3, //!< CPU has SM3 (ASIMD SM3 instructions). + kSM4, //!< CPU has SM4 (ASIMD SM4 instructions). + kSME, //!< CPU has SME (SME v1 - scalable matrix extension) {A64}. + kSME2, //!< CPU has SME2 (SME v2) {A64}. + kSME2_1, //!< CPU has SME2p1 (SME v2.1) {A64}. + kSME_B16B16, //!< CPU has SME_B16B16 (SME non-widening BFloat16 to BFloat16 arithmetic) {A64}. + kSME_B16F32, //!< CPU has SME_B16F32 (BFMOPA and BFMOPS instructions that accumulate BFloat16 outer products into single-precision tiles) {A64}. + kSME_BI32I32, //!< CPU has SME_BI32I32 (BMOPA and BMOPS instructions that accumulate 1-bit binary outer products into 32-bit integer tiles) {A64}. + kSME_F16F16, //!< CPU has SME_F16F16 (SME2.1 non-widening half-precision FP16 to FP16 arithmetic) {A64}. + kSME_F16F32, //!< CPU has SME_F16F32 {A64}. + kSME_F32F32, //!< CPU has SME_F32F32 {A64}. + kSME_F64F64, //!< CPU has SME_F64F64 {A64}. + kSME_F8F16, //!< CPU has SME_F8F16 (SME2 ZA-targeting FP8 multiply-accumulate, dot product, and outer product to half-precision instructions) {A64}. + kSME_F8F32, //!< CPU has SME_F8F32 (SME2 ZA-targeting FP8 multiply-accumulate, dot product, and outer product to single-precision instructions) {A64}. + kSME_FA64, //!< CPU has SME_FA64 {A64}. + kSME_I16I32, //!< CPU has SME_I16I32 {A64}. + kSME_I16I64, //!< CPU has SME_I16I64 {A64}. + kSME_I8I32, //!< CPU has SME_I8I32 {A64}. + kSME_LUTv2, //!< CPU has SME_LUTv2 (lookup table instructions with 4-bit indices and 8-bit elements) {A64}. + kSPE, //!< CPU has SPE (statistical profiling extension) {A64}. + kSPE1_1, //!< CPU has SPEv1p1 (statistical profiling extensions version 1.1) {A64}. + kSPE1_2, //!< CPU has SPEv1p2 (statistical profiling extensions version 1.2) {A64}. + kSPE1_3, //!< CPU has SPEv1p3 (statistical profiling extensions version 1.3) {A64}. + kSPE1_4, //!< CPU has SPEv1p4 (statistical profiling extensions version 1.4) {A64}. + kSPE_ALTCLK, //!< CPU has SPE_ALTCLK (statistical profiling alternate clock domain extension) {A64}. + kSPE_CRR, //!< CPU has SPE_CRR (statistical profiling call return branch records) {A64}. + kSPE_EFT, //!< CPU has SPE_EFT (statistical profiling extended filtering by type) {A64}. + kSPE_FDS, //!< CPU has SPE_FDS (statistical profiling data source filtering) {A64}. + kSPE_FPF, //!< CPU has SPE_FPF (statistical profiling floating-point flag extension) {A64}. + kSPE_SME, //!< CPU has SPE_SME (statistical profiling extensions for SME) {A64}. + kSPECRES, //!< CPU has SPECRES (speculation restriction instructions). + kSPECRES2, //!< CPU has SPECRES2 (clear other speculative predictions). + kSPMU, //!< CPU has SPMU (system performance monitors extension) {A64}. + kSSBS, //!< CPU has SSBS (speculative store bypass safe instruction). + kSSBS2, //!< CPU has SSBS2 (MRS and MSR instructions for SSBS). + kSSVE_FP8DOT2, //!< CPU has SSVE_FP8DOT2 (SVE2 FP8 2-way dot product to half-precision instructions in Streaming SVE mode) {A64}. + kSSVE_FP8DOT4, //!< CPU has SSVE_FP8DOT4 (SVE2 FP8 4-way dot product to single-precision instructions in Streaming SVE mode) {A64}. + kSSVE_FP8FMA, //!< CPU has SSVE_FP8FMA (SVE2 FP8 multiply-accumulate to half-precision and single-precision instructions in Streaming SVE mode) {A64}. + kSVE, //!< CPU has SVE (SVE v1 - scalable vector extension) {A64}. + kSVE2, //!< CPU has SVE2 (SVE v2) {A64}. + kSVE2_1, //!< CPU has SVE2p1 (SVE v2.1) {A64}. + kSVE_AES, //!< CPU has SVE_AES (SVE AES instructions) {A64}. + kSVE_B16B16, //!< CPU has SVE_B16B16 (SVE non-widening BFloat16 to BFloat16 arithmetic) {A64}. + kSVE_BF16, //!< CPU has SVE_BF16 (SVE BF16 instructions) {A64}. + kSVE_BITPERM, //!< CPU has SVE_BITPERM (SVE bit permute) {A64}. + kSVE_EBF16, //!< CPU has SVE_EBF16 (SVE extended BFloat16 mode) {A64}. + kSVE_F32MM, //!< CPU has SVE_F32MM (SVE single-precision floating-point matrix multiply instruction) {A64}. + kSVE_F64MM, //!< CPU has SVE_F64MM (SVE double-precision floating-point matrix multiply instruction) {A64}. + kSVE_I8MM, //!< CPU has SVE_I8MM (SVE int8 matrix multiplication) {A64}. + kSVE_PMULL128, //!< CPU has SVE_PMULL128 (SVE PMULL instructions) {A64}. + kSVE_SHA3, //!< CPU has SVE_SHA3 (SVE SHA-3 instructions) {A64}. + kSVE_SM4, //!< CPU has SVE_SM4 (SVE SM4 instructions {A64}. + kSYSINSTR128, //!< CPU has SYSINSTR128 (128-bit system instructions) {A64}. + kSYSREG128, //!< CPU has SYSREG128 (128-bit system registers) {A64}. + kTHE, //!< CPU has THE (translation hardening extension). + kTLBIOS, //!< CPU has TLBIOS (TLBI instructions in Outer Shareable domain) {A64}. + kTLBIRANGE, //!< CPU has TLBIRANGE (TLBI range instructions) {A64}. + kTLBIW, //!< CPU has TLBIW (TLBI VMALL for dirty state) {A64}. + kTME, //!< CPU has TME (transactional memory extensions). + kTRF, //!< CPU has TRF (self-hosted trace extensions). + kUAO, //!< CPU has UAO (AArch64 v8.2 UAO PState) {A64}. + kVFP_D32, //!< CPU has VFP_D32 (32 VFP-D registers) (ARM/THUMB only). + kVHE, //!< CPU has VHE (virtual host extension). + kVMID16, //!< CPU has VMID16 (16-bit VMID) {A64}. + kWFXT, //!< CPU has WFxT (WFE and WFI instructions with timeout) {A64}. + kXNX, //!< CPU has XNX (translation table stage 2 unprivileged execute-never) {A64}. + kXS, //!< CPU has XS (XS attribute in TLBI and DSB instructions) {A64}. // @EnumValuesEnd@ - kMaxValue = kTME + kMaxValue = kXS }; #define ASMJIT_ARM_FEATURE(FEATURE) \ - inline bool has##FEATURE() const noexcept { return has(ARM::k##FEATURE); } + /*! Tests whether FEATURE is present. */ \ + ASMJIT_INLINE_NODEBUG bool has##FEATURE() const noexcept { return has(ARM::k##FEATURE); } ASMJIT_ARM_FEATURE(THUMB) ASMJIT_ARM_FEATURE(THUMBv2) @@ -498,67 +730,204 @@ class CpuFeatures { ASMJIT_ARM_FEATURE(ARMv6) ASMJIT_ARM_FEATURE(ARMv7) ASMJIT_ARM_FEATURE(ARMv8a) - ASMJIT_ARM_FEATURE(ARMv8_1a) - ASMJIT_ARM_FEATURE(ARMv8_2a) - ASMJIT_ARM_FEATURE(ARMv8_3a) - ASMJIT_ARM_FEATURE(ARMv8_4a) - ASMJIT_ARM_FEATURE(ARMv8_5a) - ASMJIT_ARM_FEATURE(ARMv8_6a) - ASMJIT_ARM_FEATURE(ARMv8_7a) - - ASMJIT_ARM_FEATURE(VFPv2) - ASMJIT_ARM_FEATURE(VFPv3) - ASMJIT_ARM_FEATURE(VFPv4) - ASMJIT_ARM_FEATURE(VFP_D32) + ASMJIT_ARM_FEATURE(ABLE) + ASMJIT_ARM_FEATURE(ADERR) ASMJIT_ARM_FEATURE(AES) - ASMJIT_ARM_FEATURE(ALTNZCV) + ASMJIT_ARM_FEATURE(AFP) + ASMJIT_ARM_FEATURE(AIE) + ASMJIT_ARM_FEATURE(AMU1) + ASMJIT_ARM_FEATURE(AMU1_1) + ASMJIT_ARM_FEATURE(ANERR) ASMJIT_ARM_FEATURE(ASIMD) ASMJIT_ARM_FEATURE(BF16) + ASMJIT_ARM_FEATURE(BRBE) ASMJIT_ARM_FEATURE(BTI) + ASMJIT_ARM_FEATURE(BWE) + ASMJIT_ARM_FEATURE(CCIDX) + ASMJIT_ARM_FEATURE(CHK) + ASMJIT_ARM_FEATURE(CLRBHB) + ASMJIT_ARM_FEATURE(CMOW) + ASMJIT_ARM_FEATURE(CONSTPACFIELD) + ASMJIT_ARM_FEATURE(CPA) + ASMJIT_ARM_FEATURE(CPA2) ASMJIT_ARM_FEATURE(CPUID) ASMJIT_ARM_FEATURE(CRC32) + ASMJIT_ARM_FEATURE(CSSC) + ASMJIT_ARM_FEATURE(CSV2) + ASMJIT_ARM_FEATURE(CSV2_3) + ASMJIT_ARM_FEATURE(CSV3) + ASMJIT_ARM_FEATURE(D128) ASMJIT_ARM_FEATURE(DGH) ASMJIT_ARM_FEATURE(DIT) ASMJIT_ARM_FEATURE(DOTPROD) + ASMJIT_ARM_FEATURE(DPB) + ASMJIT_ARM_FEATURE(DPB2) + ASMJIT_ARM_FEATURE(EBEP) + ASMJIT_ARM_FEATURE(EBF16) + ASMJIT_ARM_FEATURE(ECBHB) + ASMJIT_ARM_FEATURE(ECV) + ASMJIT_ARM_FEATURE(EDHSR) ASMJIT_ARM_FEATURE(EDSP) + ASMJIT_ARM_FEATURE(FAMINMAX) ASMJIT_ARM_FEATURE(FCMA) + ASMJIT_ARM_FEATURE(FGT) + ASMJIT_ARM_FEATURE(FGT2) + ASMJIT_ARM_FEATURE(FHM) ASMJIT_ARM_FEATURE(FLAGM) + ASMJIT_ARM_FEATURE(FLAGM2) + ASMJIT_ARM_FEATURE(FMAC) + ASMJIT_ARM_FEATURE(FP) + ASMJIT_ARM_FEATURE(FP16) ASMJIT_ARM_FEATURE(FP16CONV) - ASMJIT_ARM_FEATURE(FP16FML) - ASMJIT_ARM_FEATURE(FP16FULL) - ASMJIT_ARM_FEATURE(FRINT) + ASMJIT_ARM_FEATURE(FP8) + ASMJIT_ARM_FEATURE(FP8DOT2) + ASMJIT_ARM_FEATURE(FP8DOT4) + ASMJIT_ARM_FEATURE(FP8FMA) + ASMJIT_ARM_FEATURE(FPMR) + ASMJIT_ARM_FEATURE(FRINTTS) + ASMJIT_ARM_FEATURE(GCS) + ASMJIT_ARM_FEATURE(HACDBS) + ASMJIT_ARM_FEATURE(HAFDBS) + ASMJIT_ARM_FEATURE(HAFT) + ASMJIT_ARM_FEATURE(HDBSS) + ASMJIT_ARM_FEATURE(HBC) + ASMJIT_ARM_FEATURE(HCX) + ASMJIT_ARM_FEATURE(HPDS) + ASMJIT_ARM_FEATURE(HPDS2) + ASMJIT_ARM_FEATURE(I8MM) ASMJIT_ARM_FEATURE(IDIVA) ASMJIT_ARM_FEATURE(IDIVT) + ASMJIT_ARM_FEATURE(ITE) + ASMJIT_ARM_FEATURE(JSCVT) + ASMJIT_ARM_FEATURE(LOR) + ASMJIT_ARM_FEATURE(LRCPC) + ASMJIT_ARM_FEATURE(LRCPC2) + ASMJIT_ARM_FEATURE(LRCPC3) + ASMJIT_ARM_FEATURE(LS64) + ASMJIT_ARM_FEATURE(LS64_ACCDATA) + ASMJIT_ARM_FEATURE(LS64_V) ASMJIT_ARM_FEATURE(LSE) + ASMJIT_ARM_FEATURE(LSE128) + ASMJIT_ARM_FEATURE(LSE2) + ASMJIT_ARM_FEATURE(LUT) + ASMJIT_ARM_FEATURE(LVA) + ASMJIT_ARM_FEATURE(LVA3) + ASMJIT_ARM_FEATURE(MEC) + ASMJIT_ARM_FEATURE(MOPS) + ASMJIT_ARM_FEATURE(MPAM) ASMJIT_ARM_FEATURE(MTE) - ASMJIT_ARM_FEATURE(FJCVTZS) - ASMJIT_ARM_FEATURE(I8MM) - ASMJIT_ARM_FEATURE(RCPC_IMMO) - ASMJIT_ARM_FEATURE(RDM) + ASMJIT_ARM_FEATURE(MTE2) + ASMJIT_ARM_FEATURE(MTE3) + ASMJIT_ARM_FEATURE(MTE4) + ASMJIT_ARM_FEATURE(MTE_ASYM_FAULT) + ASMJIT_ARM_FEATURE(MTE_ASYNC) + ASMJIT_ARM_FEATURE(MTE_CANONICAL_TAGS) + ASMJIT_ARM_FEATURE(MTE_NO_ADDRESS_TAGS) + ASMJIT_ARM_FEATURE(MTE_PERM_S1) + ASMJIT_ARM_FEATURE(MTE_STORE_ONLY) + ASMJIT_ARM_FEATURE(MTE_TAGGED_FAR) + ASMJIT_ARM_FEATURE(MTPMU) + ASMJIT_ARM_FEATURE(NMI) + ASMJIT_ARM_FEATURE(NV) + ASMJIT_ARM_FEATURE(NV2) + ASMJIT_ARM_FEATURE(PAN) + ASMJIT_ARM_FEATURE(PAN2) + ASMJIT_ARM_FEATURE(PAN3) + ASMJIT_ARM_FEATURE(PAUTH) + ASMJIT_ARM_FEATURE(PFAR) ASMJIT_ARM_FEATURE(PMU) ASMJIT_ARM_FEATURE(PMULL) + ASMJIT_ARM_FEATURE(PRFMSLC) + ASMJIT_ARM_FEATURE(RAS) + ASMJIT_ARM_FEATURE(RAS1_1) + ASMJIT_ARM_FEATURE(RAS2) + ASMJIT_ARM_FEATURE(RASSA2) + ASMJIT_ARM_FEATURE(RDM) + ASMJIT_ARM_FEATURE(RME) ASMJIT_ARM_FEATURE(RNG) + ASMJIT_ARM_FEATURE(RNG_TRAP) + ASMJIT_ARM_FEATURE(RPRES) + ASMJIT_ARM_FEATURE(RPRFM) + ASMJIT_ARM_FEATURE(S1PIE) + ASMJIT_ARM_FEATURE(S1POE) + ASMJIT_ARM_FEATURE(S2PIE) + ASMJIT_ARM_FEATURE(S2POE) ASMJIT_ARM_FEATURE(SB) + ASMJIT_ARM_FEATURE(SCTLR2) + ASMJIT_ARM_FEATURE(SEBEP) + ASMJIT_ARM_FEATURE(SEL2) ASMJIT_ARM_FEATURE(SHA1) - ASMJIT_ARM_FEATURE(SHA2) + ASMJIT_ARM_FEATURE(SHA256) ASMJIT_ARM_FEATURE(SHA3) ASMJIT_ARM_FEATURE(SHA512) ASMJIT_ARM_FEATURE(SM3) ASMJIT_ARM_FEATURE(SM4) + ASMJIT_ARM_FEATURE(SME) + ASMJIT_ARM_FEATURE(SME2) + ASMJIT_ARM_FEATURE(SME2_1) + ASMJIT_ARM_FEATURE(SME_B16B16) + ASMJIT_ARM_FEATURE(SME_B16F32) + ASMJIT_ARM_FEATURE(SME_BI32I32) + ASMJIT_ARM_FEATURE(SME_F16F16) + ASMJIT_ARM_FEATURE(SME_F16F32) + ASMJIT_ARM_FEATURE(SME_F32F32) + ASMJIT_ARM_FEATURE(SME_F64F64) + ASMJIT_ARM_FEATURE(SME_F8F16) + ASMJIT_ARM_FEATURE(SME_F8F32) + ASMJIT_ARM_FEATURE(SME_FA64) + ASMJIT_ARM_FEATURE(SME_I16I32) + ASMJIT_ARM_FEATURE(SME_I16I64) + ASMJIT_ARM_FEATURE(SME_I8I32) + ASMJIT_ARM_FEATURE(SME_LUTv2) + ASMJIT_ARM_FEATURE(SPE) + ASMJIT_ARM_FEATURE(SPE1_1) + ASMJIT_ARM_FEATURE(SPE1_2) + ASMJIT_ARM_FEATURE(SPE1_3) + ASMJIT_ARM_FEATURE(SPE1_4) + ASMJIT_ARM_FEATURE(SPE_ALTCLK) + ASMJIT_ARM_FEATURE(SPE_CRR) + ASMJIT_ARM_FEATURE(SPE_EFT) + ASMJIT_ARM_FEATURE(SPE_FDS) + ASMJIT_ARM_FEATURE(SPE_FPF) + ASMJIT_ARM_FEATURE(SPE_SME) + ASMJIT_ARM_FEATURE(SPECRES) + ASMJIT_ARM_FEATURE(SPECRES2) + ASMJIT_ARM_FEATURE(SPMU) ASMJIT_ARM_FEATURE(SSBS) + ASMJIT_ARM_FEATURE(SSBS2) + ASMJIT_ARM_FEATURE(SSVE_FP8DOT2) + ASMJIT_ARM_FEATURE(SSVE_FP8DOT4) + ASMJIT_ARM_FEATURE(SSVE_FP8FMA) ASMJIT_ARM_FEATURE(SVE) + ASMJIT_ARM_FEATURE(SVE2) + ASMJIT_ARM_FEATURE(SVE2_1) + ASMJIT_ARM_FEATURE(SVE_AES) + ASMJIT_ARM_FEATURE(SVE_B16B16) ASMJIT_ARM_FEATURE(SVE_BF16) + ASMJIT_ARM_FEATURE(SVE_BITPERM) + ASMJIT_ARM_FEATURE(SVE_EBF16) ASMJIT_ARM_FEATURE(SVE_F32MM) ASMJIT_ARM_FEATURE(SVE_F64MM) ASMJIT_ARM_FEATURE(SVE_I8MM) - ASMJIT_ARM_FEATURE(SVE_PMULL) - ASMJIT_ARM_FEATURE(SVE2) - ASMJIT_ARM_FEATURE(SVE2_AES) - ASMJIT_ARM_FEATURE(SVE2_BITPERM) - ASMJIT_ARM_FEATURE(SVE2_SHA3) - ASMJIT_ARM_FEATURE(SVE2_SM4) + ASMJIT_ARM_FEATURE(SVE_PMULL128) + ASMJIT_ARM_FEATURE(SVE_SHA3) + ASMJIT_ARM_FEATURE(SVE_SM4) + ASMJIT_ARM_FEATURE(SYSINSTR128) + ASMJIT_ARM_FEATURE(SYSREG128) + ASMJIT_ARM_FEATURE(THE) + ASMJIT_ARM_FEATURE(TLBIOS) + ASMJIT_ARM_FEATURE(TLBIRANGE) + ASMJIT_ARM_FEATURE(TLBIW) ASMJIT_ARM_FEATURE(TME) + ASMJIT_ARM_FEATURE(TRF) + ASMJIT_ARM_FEATURE(UAO) + ASMJIT_ARM_FEATURE(VFP_D32) + ASMJIT_ARM_FEATURE(VHE) + ASMJIT_ARM_FEATURE(VMID16) + ASMJIT_ARM_FEATURE(WFXT) + ASMJIT_ARM_FEATURE(XNX) + ASMJIT_ARM_FEATURE(XS) #undef ASMJIT_ARM_FEATURE }; @@ -578,19 +947,20 @@ class CpuFeatures { //! \name Construction & Destruction //! \{ - inline CpuFeatures() noexcept {} - inline CpuFeatures(const CpuFeatures& other) noexcept = default; - inline explicit CpuFeatures(Globals::NoInit_) noexcept {} + ASMJIT_INLINE_NODEBUG CpuFeatures() noexcept {} + ASMJIT_INLINE_NODEBUG CpuFeatures(const CpuFeatures& other) noexcept = default; + ASMJIT_INLINE_NODEBUG explicit CpuFeatures(const Data& other) noexcept : _data{other._bits} {} + ASMJIT_INLINE_NODEBUG explicit CpuFeatures(Globals::NoInit_) noexcept {} //! \} //! \name Overloaded Operators //! \{ - inline CpuFeatures& operator=(const CpuFeatures& other) noexcept = default; + ASMJIT_INLINE_NODEBUG CpuFeatures& operator=(const CpuFeatures& other) noexcept = default; - inline bool operator==(const CpuFeatures& other) noexcept { return eq(other); } - inline bool operator!=(const CpuFeatures& other) noexcept { return !eq(other); } + ASMJIT_INLINE_NODEBUG bool operator==(const CpuFeatures& other) const noexcept { return equals(other); } + ASMJIT_INLINE_NODEBUG bool operator!=(const CpuFeatures& other) const noexcept { return !equals(other); } //! \} @@ -598,64 +968,74 @@ class CpuFeatures { //! \{ //! Returns true if there are no features set. - inline bool empty() const noexcept { return _data.empty(); } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _data.empty(); } //! Casts this base class into a derived type `T`. template - inline T& data() noexcept { return static_cast(_data); } + ASMJIT_INLINE_NODEBUG T& data() noexcept { return static_cast(_data); } //! Casts this base class into a derived type `T` (const). template - inline const T& data() const noexcept { return static_cast(_data); } + ASMJIT_INLINE_NODEBUG const T& data() const noexcept { return static_cast(_data); } //! Returns CpuFeatures::Data as \ref CpuFeatures::X86. - inline X86& x86() noexcept { return data(); } + ASMJIT_INLINE_NODEBUG X86& x86() noexcept { return data(); } //! Returns CpuFeatures::Data as \ref CpuFeatures::X86 (const). - inline const X86& x86() const noexcept { return data(); } + ASMJIT_INLINE_NODEBUG const X86& x86() const noexcept { return data(); } //! Returns CpuFeatures::Data as \ref CpuFeatures::ARM. - inline ARM& arm() noexcept { return data(); } + ASMJIT_INLINE_NODEBUG ARM& arm() noexcept { return data(); } //! Returns CpuFeatures::Data as \ref CpuFeatures::ARM (const). - inline const ARM& arm() const noexcept { return data(); } + ASMJIT_INLINE_NODEBUG const ARM& arm() const noexcept { return data(); } //! Returns all features as array of bitwords (see \ref Support::BitWord). - inline BitWord* bits() noexcept { return _data.bits(); } + ASMJIT_INLINE_NODEBUG BitWord* bits() noexcept { return _data.bits(); } //! Returns all features as array of bitwords (const). - inline const BitWord* bits() const noexcept { return _data.bits(); } + ASMJIT_INLINE_NODEBUG const BitWord* bits() const noexcept { return _data.bits(); } //! Returns the number of BitWords returned by \ref bits(). - inline size_t bitWordCount() const noexcept { return _data.bitWordCount(); } + ASMJIT_INLINE_NODEBUG size_t bitWordCount() const noexcept { return _data.bitWordCount(); } //! Returns \ref Support::BitVectorIterator, that can be used to iterate over all features efficiently. - inline Iterator iterator() const noexcept { return _data.iterator(); } + ASMJIT_INLINE_NODEBUG Iterator iterator() const noexcept { return _data.iterator(); } //! Tests whether the feature `featureId` is present. template - inline bool has(const FeatureId& featureId) const noexcept { return _data.has(featureId); } + ASMJIT_INLINE_NODEBUG bool has(const FeatureId& featureId) const noexcept { return _data.has(featureId); } + + //! Tests whether any of the features is present. + template + ASMJIT_INLINE_NODEBUG bool hasAny(Args&&... args) const noexcept { return _data.hasAny(std::forward(args)...); } //! Tests whether all features as defined by `other` are present. - inline bool hasAll(const CpuFeatures& other) const noexcept { return _data.hasAll(other._data); } + ASMJIT_INLINE_NODEBUG bool hasAll(const CpuFeatures& other) const noexcept { return _data.hasAll(other._data); } //! \} //! \name Manipulation //! \{ - inline void reset() noexcept { _data.reset(); } + //! Clears all features set. + ASMJIT_INLINE_NODEBUG void reset() noexcept { _data.reset(); } //! Adds the given CPU `featureId` to the list of features. template - inline void add(Args&&... args) noexcept { return _data.add(std::forward(args)...); } + ASMJIT_INLINE_NODEBUG void add(Args&&... args) noexcept { return _data.add(std::forward(args)...); } //! Adds the given CPU `featureId` to the list of features if `condition` is true. template - inline void addIf(bool condition, Args&&... args) noexcept { return _data.addIf(condition, std::forward(args)...); } + ASMJIT_INLINE_NODEBUG void addIf(bool condition, Args&&... args) noexcept { return _data.addIf(condition, std::forward(args)...); } //! Removes the given CPU `featureId` from the list of features. template - inline void remove(Args&&... args) noexcept { return _data.remove(std::forward(args)...); } + ASMJIT_INLINE_NODEBUG void remove(Args&&... args) noexcept { return _data.remove(std::forward(args)...); } //! Tests whether this CPU features matches `other`. - inline bool eq(const CpuFeatures& other) const noexcept { return _data.eq(other._data); } + ASMJIT_INLINE_NODEBUG bool equals(const CpuFeatures& other) const noexcept { return _data.equals(other._data); } + +#if !defined(ASMJIT_NO_DEPRECATED) + ASMJIT_DEPRECATED("Use CpuFeatures::equals() instead") + ASMJIT_INLINE_NODEBUG bool eq(const CpuFeatures& other) const noexcept { return equals(other); } +#endif // !ASMJIT_NO_DEPRECATED //! \} }; @@ -667,65 +1047,82 @@ class CpuInfo { //! \{ //! Architecture. - Arch _arch; + Arch _arch {}; //! Sub-architecture. - SubArch _subArch; + SubArch _subArch {}; //! True if the CPU was detected, false if the detection failed or it's not available. - bool _wasDetected; + bool _wasDetected {}; //! Reserved for future use. - uint8_t _reserved; + uint8_t _reserved {}; //! CPU family ID. - uint32_t _familyId; + uint32_t _familyId {}; //! CPU model ID. - uint32_t _modelId; + uint32_t _modelId {}; //! CPU brand ID. - uint32_t _brandId; + uint32_t _brandId {}; //! CPU stepping. - uint32_t _stepping; + uint32_t _stepping {}; //! Processor type. - uint32_t _processorType; + uint32_t _processorType {}; //! Maximum number of addressable IDs for logical processors. - uint32_t _maxLogicalProcessors; + uint32_t _maxLogicalProcessors {}; //! Cache line size (in bytes). - uint32_t _cacheLineSize; + uint32_t _cacheLineSize {}; //! Number of hardware threads. - uint32_t _hwThreadCount; + uint32_t _hwThreadCount {}; //! CPU vendor string. - FixedString<16> _vendor; + FixedString<16> _vendor {}; //! CPU brand string. - FixedString<64> _brand; + FixedString<64> _brand {}; //! CPU features. - CpuFeatures _features; + CpuFeatures _features {}; //! \} //! \name Construction & Destruction //! \{ - inline CpuInfo() noexcept { reset(); } - inline CpuInfo(const CpuInfo& other) noexcept = default; + //! Creates a new CpuInfo instance. + ASMJIT_INLINE_NODEBUG CpuInfo() noexcept {} + //! Creates a copy of `other` instance. + ASMJIT_INLINE_NODEBUG CpuInfo(const CpuInfo& other) noexcept = default; - inline explicit CpuInfo(Globals::NoInit_) noexcept + //! Creates an unitialized `CpuInfo` instance. + ASMJIT_INLINE_NODEBUG explicit CpuInfo(Globals::NoInit_) noexcept : _features(Globals::NoInit) {}; + //! \} + + //! \name CPU Information Detection + //! \{ + //! Returns the host CPU information. + //! + //! \note The returned reference is global - it's setup only once and then shared. ASMJIT_API static const CpuInfo& host() noexcept; - //! Initializes CpuInfo architecture and sub-architecture members to `arch` and `subArch`, respectively. - inline void initArch(Arch arch, SubArch subArch = SubArch::kUnknown) noexcept { - _arch = arch; - _subArch = subArch; - } + //! \} + + //! \name Overloaded Operators + //! \{ - inline void reset() noexcept { memset(this, 0, sizeof(*this)); } + //! Copy assignment. + ASMJIT_INLINE_NODEBUG CpuInfo& operator=(const CpuInfo& other) noexcept = default; //! \} - //! \name Overloaded Operators + //! \name Initialization & Reset //! \{ - inline CpuInfo& operator=(const CpuInfo& other) noexcept = default; + //! Initializes CpuInfo architecture and sub-architecture members to `arch` and `subArch`, respectively. + ASMJIT_INLINE_NODEBUG void initArch(Arch arch, SubArch subArch = SubArch::kUnknown) noexcept { + _arch = arch; + _subArch = subArch; + } + + //! Resets this \ref CpuInfo to a default constructed state. + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = CpuInfo{}; } //! \} @@ -733,75 +1130,89 @@ class CpuInfo { //! \{ //! Returns the CPU architecture this information relates to. - inline Arch arch() const noexcept { return _arch; } + ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; } //! Returns the CPU sub-architecture this information relates to. - inline SubArch subArch() const noexcept { return _subArch; } + ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return _subArch; } //! Returns whether the CPU was detected successfully. //! //! If the returned value is false it means that AsmJit either failed to detect the CPU or it doesn't have //! implementation targeting the host architecture and operating system. - inline bool wasDetected() const noexcept { return _wasDetected; } + ASMJIT_INLINE_NODEBUG bool wasDetected() const noexcept { return _wasDetected; } //! Returns the CPU family ID. //! - //! Family identifier matches the FamilyId read by using CPUID on X86 architecture. - inline uint32_t familyId() const noexcept { return _familyId; } + //! The information provided depends on architecture and OS: + //! - X86: + //! - Family identifier matches the FamilyId read by using CPUID. + //! - ARM: + //! - Apple - returns Apple Family identifier returned by sysctlbyname("hw.cpufamily"). + ASMJIT_INLINE_NODEBUG uint32_t familyId() const noexcept { return _familyId; } //! Returns the CPU model ID. //! - //! Family identifier matches the ModelId read by using CPUID on X86 architecture. + //! The information provided depends on architecture and OS: + //! - X86: + //! - Model identifier matches the ModelId read by using CPUID. + ASMJIT_INLINE_NODEBUG uint32_t modelId() const noexcept { return _modelId; } - inline uint32_t modelId() const noexcept { return _modelId; } //! Returns the CPU brand id. //! - //! Family identifier matches the BrandId read by using CPUID on X86 architecture. - inline uint32_t brandId() const noexcept { return _brandId; } + //! The information provided depends on architecture and OS: + //! - X86: + //! - Brand identifier matches the BrandId read by using CPUID. + ASMJIT_INLINE_NODEBUG uint32_t brandId() const noexcept { return _brandId; } //! Returns the CPU stepping. //! - //! Family identifier matches the Stepping information read by using CPUID on X86 architecture. - inline uint32_t stepping() const noexcept { return _stepping; } + //! The information provided depends on architecture and OS: + //! - X86: + //! - Stepping identifier matches the Stepping information read by using CPUID. + ASMJIT_INLINE_NODEBUG uint32_t stepping() const noexcept { return _stepping; } //! Returns the processor type. //! - //! Family identifier matches the ProcessorType read by using CPUID on X86 architecture. - inline uint32_t processorType() const noexcept { return _processorType; } + //! The information provided depends on architecture and OS: + //! - X86: + //! - Processor type identifier matches the ProcessorType read by using CPUID. + ASMJIT_INLINE_NODEBUG uint32_t processorType() const noexcept { return _processorType; } //! Returns the maximum number of logical processors. - inline uint32_t maxLogicalProcessors() const noexcept { return _maxLogicalProcessors; } + ASMJIT_INLINE_NODEBUG uint32_t maxLogicalProcessors() const noexcept { return _maxLogicalProcessors; } - //! Returns the size of a cache line flush. - inline uint32_t cacheLineSize() const noexcept { return _cacheLineSize; } + //! Returns the size of a CPU cache line. + //! + //! On a multi-architecture system this should return the smallest cache line of all CPUs. + ASMJIT_INLINE_NODEBUG uint32_t cacheLineSize() const noexcept { return _cacheLineSize; } //! Returns number of hardware threads available. - inline uint32_t hwThreadCount() const noexcept { return _hwThreadCount; } + ASMJIT_INLINE_NODEBUG uint32_t hwThreadCount() const noexcept { return _hwThreadCount; } //! Returns a CPU vendor string. - inline const char* vendor() const noexcept { return _vendor.str; } + ASMJIT_INLINE_NODEBUG const char* vendor() const noexcept { return _vendor.str; } //! Tests whether the CPU vendor string is equal to `s`. - inline bool isVendor(const char* s) const noexcept { return _vendor.eq(s); } + ASMJIT_INLINE_NODEBUG bool isVendor(const char* s) const noexcept { return _vendor.equals(s); } //! Returns a CPU brand string. - inline const char* brand() const noexcept { return _brand.str; } + ASMJIT_INLINE_NODEBUG const char* brand() const noexcept { return _brand.str; } //! Returns CPU features. - inline CpuFeatures& features() noexcept { return _features; } + ASMJIT_INLINE_NODEBUG CpuFeatures& features() noexcept { return _features; } //! Returns CPU features (const). - inline const CpuFeatures& features() const noexcept { return _features; } + ASMJIT_INLINE_NODEBUG const CpuFeatures& features() const noexcept { return _features; } //! Tests whether the CPU has the given `feature`. template - inline bool hasFeature(const FeatureId& featureId) const noexcept { return _features.has(featureId); } + ASMJIT_INLINE_NODEBUG bool hasFeature(const FeatureId& featureId) const noexcept { return _features.has(featureId); } //! Adds the given CPU `featureId` to the list of features. template - inline void addFeature(Args&&... args) noexcept { return _features.add(std::forward(args)...); } + ASMJIT_INLINE_NODEBUG void addFeature(Args&&... args) noexcept { return _features.add(std::forward(args)...); } //! Removes the given CPU `featureId` from the list of features. template - inline void removeFeature(Args&&... args) noexcept { return _features.remove(std::forward(args)...); } + ASMJIT_INLINE_NODEBUG void removeFeature(Args&&... args) noexcept { return _features.remove(std::forward(args)...); } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/emithelper.cpp b/3rdparty/asmjit/src/asmjit/core/emithelper.cpp index bcdf098f48b72..36b984f832fa6 100644 --- a/3rdparty/asmjit/src/asmjit/core/emithelper.cpp +++ b/3rdparty/asmjit/src/asmjit/core/emithelper.cpp @@ -61,6 +61,24 @@ static void dumpAssignment(String& sb, const FuncArgsContext& ctx) noexcept { } #endif +// BaseEmitHelper - Abstract +// ========================= + +Error BaseEmitHelper::emitRegMove(const Operand_& dst_, const Operand_& src_, TypeId typeId, const char* comment) { + DebugUtils::unused(dst_, src_, typeId, comment); + return DebugUtils::errored(kErrorInvalidState); +} + +Error BaseEmitHelper::emitRegSwap(const BaseReg& a, const BaseReg& b, const char* comment) { + DebugUtils::unused(a, b, comment); + return DebugUtils::errored(kErrorInvalidState); +} + +Error BaseEmitHelper::emitArgMove(const BaseReg& dst_, TypeId dstTypeId, const Operand_& src_, TypeId srcTypeId, const char* comment) { + DebugUtils::unused(dst_, dstTypeId, src_, srcTypeId, comment); + return DebugUtils::errored(kErrorInvalidState); +} + // BaseEmitHelper - EmitArgsAssignment // =================================== @@ -198,14 +216,17 @@ ASMJIT_FAVOR_SIZE Error BaseEmitHelper::emitArgsAssignment(const FuncFrame& fram } else { WorkData& wd = workData[outGroup]; - if (!wd.isAssigned(outId)) { + if (!wd.isAssigned(outId) || curId == outId) { EmitMove: ASMJIT_PROPAGATE( emitArgMove( BaseReg(archTraits.regTypeToSignature(out.regType()), outId), out.typeId(), BaseReg(archTraits.regTypeToSignature(cur.regType()), curId), cur.typeId())); - wd.reassign(varId, outId, curId); + // Only reassign if this is not a sign/zero extension that happens on the same in/out register. + if (curId != outId) + wd.reassign(varId, outId, curId); + cur.initReg(out.regType(), outId, out.typeId()); if (outId == out.regId()) diff --git a/3rdparty/asmjit/src/asmjit/core/emithelper_p.h b/3rdparty/asmjit/src/asmjit/core/emithelper_p.h index 0333959e144df..0f4a2f3ece419 100644 --- a/3rdparty/asmjit/src/asmjit/core/emithelper_p.h +++ b/3rdparty/asmjit/src/asmjit/core/emithelper_p.h @@ -21,22 +21,22 @@ class BaseEmitHelper { public: BaseEmitter* _emitter; - inline explicit BaseEmitHelper(BaseEmitter* emitter = nullptr) noexcept + ASMJIT_INLINE_NODEBUG explicit BaseEmitHelper(BaseEmitter* emitter = nullptr) noexcept : _emitter(emitter) {} - inline BaseEmitter* emitter() const noexcept { return _emitter; } - inline void setEmitter(BaseEmitter* emitter) noexcept { _emitter = emitter; } + ASMJIT_INLINE_NODEBUG BaseEmitter* emitter() const noexcept { return _emitter; } + ASMJIT_INLINE_NODEBUG void setEmitter(BaseEmitter* emitter) noexcept { _emitter = emitter; } //! Emits a pure move operation between two registers or the same type or between a register and its home //! slot. This function does not handle register conversion. virtual Error emitRegMove( const Operand_& dst_, - const Operand_& src_, TypeId typeId, const char* comment = nullptr) = 0; + const Operand_& src_, TypeId typeId, const char* comment = nullptr); //! Emits swap between two registers. virtual Error emitRegSwap( const BaseReg& a, - const BaseReg& b, const char* comment = nullptr) = 0; + const BaseReg& b, const char* comment = nullptr); //! Emits move from a function argument (either register or stack) to a register. //! @@ -45,7 +45,7 @@ class BaseEmitHelper { //! (for example conversion from K to MMX on X86/X64) will fail. virtual Error emitArgMove( const BaseReg& dst_, TypeId dstTypeId, - const Operand_& src_, TypeId srcTypeId, const char* comment = nullptr) = 0; + const Operand_& src_, TypeId srcTypeId, const char* comment = nullptr); Error emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args); }; diff --git a/3rdparty/asmjit/src/asmjit/core/emitter.cpp b/3rdparty/asmjit/src/asmjit/core/emitter.cpp index 92d67a7e5b548..4c855ea5688ce 100644 --- a/3rdparty/asmjit/src/asmjit/core/emitter.cpp +++ b/3rdparty/asmjit/src/asmjit/core/emitter.cpp @@ -125,13 +125,39 @@ Error BaseEmitter::reportError(Error err, const char* message) { return err; } +// BaseEmitter - Sections +// ====================== + +// [[pure virtual]] +Error BaseEmitter::section(Section* section) { + DebugUtils::unused(section); + return DebugUtils::errored(kErrorInvalidState); +} + // BaseEmitter - Labels // ==================== +// [[pure virtual]] +Label BaseEmitter::newLabel() { + return Label(Globals::kInvalidId); +} + +// [[pure virtual]] +Label BaseEmitter::newNamedLabel(const char* name, size_t nameSize, LabelType type, uint32_t parentId) { + DebugUtils::unused(name, nameSize, type, parentId); + return Label(Globals::kInvalidId); +} + Label BaseEmitter::labelByName(const char* name, size_t nameSize, uint32_t parentId) noexcept { return Label(_code ? _code->labelIdByName(name, nameSize, parentId) : Globals::kInvalidId); } +// [[pure virtual]] +Error BaseEmitter::bind(const Label& label) { + DebugUtils::unused(label); + return DebugUtils::errored(kErrorInvalidState); +} + bool BaseEmitter::isLabelValid(uint32_t labelId) const noexcept { return _code && labelId < _code->labelCount(); } @@ -172,6 +198,12 @@ Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1, return _emit(instId, o0, o1, o2, opExt); } +// [[pure virtual]] +Error BaseEmitter::_emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* oExt) { + DebugUtils::unused(instId, o0, o1, o2, oExt); + return DebugUtils::errored(kErrorInvalidState); +} + Error BaseEmitter::_emitOpArray(InstId instId, const Operand_* operands, size_t opCount) { const Operand_* op = operands; Operand_ opExt[3]; @@ -233,9 +265,57 @@ Error BaseEmitter::emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssi return _funcs.emitArgsAssignment(this, frame, args); } +// BaseEmitter - Align +// =================== + +// [[pure virtual]] +Error BaseEmitter::align(AlignMode alignMode, uint32_t alignment) { + DebugUtils::unused(alignMode, alignment); + return DebugUtils::errored(kErrorInvalidState); +} + +// BaseEmitter - Embed +// =================== + +// [[pure virtual]] +Error BaseEmitter::embed(const void* data, size_t dataSize) { + DebugUtils::unused(data, dataSize); + return DebugUtils::errored(kErrorInvalidState); +} + +// [[pure virtual]] +Error BaseEmitter::embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount) { + DebugUtils::unused(typeId, data, itemCount, repeatCount); + return DebugUtils::errored(kErrorInvalidState); +} + +// [[pure virtual]] +Error BaseEmitter::embedConstPool(const Label& label, const ConstPool& pool) { + DebugUtils::unused(label, pool); + return DebugUtils::errored(kErrorInvalidState); +} + +// [[pure virtual]] +Error BaseEmitter::embedLabel(const Label& label, size_t dataSize) { + DebugUtils::unused(label, dataSize); + return DebugUtils::errored(kErrorInvalidState); +} + +// [[pure virtual]] +Error BaseEmitter::embedLabelDelta(const Label& label, const Label& base, size_t dataSize) { + DebugUtils::unused(label, base, dataSize); + return DebugUtils::errored(kErrorInvalidState); +} + // BaseEmitter - Comment // ===================== +// [[pure virtual]] +Error BaseEmitter::comment(const char* data, size_t size) { + DebugUtils::unused(data, size); + return DebugUtils::errored(kErrorInvalidState); +} + Error BaseEmitter::commentf(const char* fmt, ...) { if (!hasEmitterFlag(EmitterFlags::kLogComments)) { if (!hasEmitterFlag(EmitterFlags::kAttached)) @@ -304,6 +384,7 @@ Error BaseEmitter::onDetach(CodeHolder* code) noexcept { _errorHandler = nullptr; _clearEmitterFlags(~kEmitterPreservedFlags); + _instructionAlignment = uint8_t(0); _forcedInstOptions = InstOptions::kReserved; _privateData = 0; @@ -313,6 +394,7 @@ Error BaseEmitter::onDetach(CodeHolder* code) noexcept { _instOptions = InstOptions::kNone; _extraReg.reset(); _inlineComment = nullptr; + _funcs.reset(); return kErrorOk; } diff --git a/3rdparty/asmjit/src/asmjit/core/emitter.h b/3rdparty/asmjit/src/asmjit/core/emitter.h index b8afd6b8e0689..09c72a68eae77 100644 --- a/3rdparty/asmjit/src/asmjit/core/emitter.h +++ b/3rdparty/asmjit/src/asmjit/core/emitter.h @@ -194,6 +194,7 @@ ASMJIT_DEFINE_ENUM_FLAGS(DiagnosticOptions) class ASMJIT_VIRTAPI BaseEmitter { public: ASMJIT_BASE_CLASS(BaseEmitter) + ASMJIT_NONCOPYABLE(BaseEmitter) //! \name Members //! \{ @@ -202,6 +203,11 @@ class ASMJIT_VIRTAPI BaseEmitter { EmitterType _emitterType = EmitterType::kNone; //! See \ref EmitterFlags. EmitterFlags _emitterFlags = EmitterFlags::kNone; + //! Instruction alignment. + uint8_t _instructionAlignment = 0u; + //! \cond + uint8_t _reservedBaseEmitter = 0u; + //! \endcond //! Validation flags in case validation is used. //! //! \note Validation flags are specific to the emitter and they are setup at construction time and then never @@ -233,6 +239,13 @@ class ASMJIT_VIRTAPI BaseEmitter { //! Native GP register signature and signature related information. OperandSignature _gpSignature {}; + //! Emitter state that can be used to specify options and inline comment of a next node or instruction. + struct State { + InstOptions options; + RegOnly extraReg; + const char* comment; + }; + //! Next instruction options (affects the next instruction). InstOptions _instOptions = InstOptions::kNone; //! Extra register (op-mask {k} on AVX-512) (affects the next instruction). @@ -255,7 +268,7 @@ class ASMJIT_VIRTAPI BaseEmitter { Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount) ASMJIT_NOEXCEPT_TYPE; - typedef Error (ASMJIT_CDECL* ValidateFunc)(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) ASMJIT_NOEXCEPT_TYPE; + typedef Error (ASMJIT_CDECL* ValidateFunc)(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) ASMJIT_NOEXCEPT_TYPE; //! Emit prolog implementation. EmitProlog emitProlog; @@ -269,7 +282,7 @@ class ASMJIT_VIRTAPI BaseEmitter { ValidateFunc validate; //! Resets all functions to nullptr. - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { emitProlog = nullptr; emitEpilog = nullptr; emitArgsAssignment = nullptr; @@ -293,10 +306,10 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ template - inline T* as() noexcept { return reinterpret_cast(this); } + ASMJIT_INLINE_NODEBUG T* as() noexcept { return reinterpret_cast(this); } template - inline const T* as() const noexcept { return reinterpret_cast(this); } + ASMJIT_INLINE_NODEBUG const T* as() const noexcept { return reinterpret_cast(this); } //! \} @@ -304,54 +317,69 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Returns the type of this emitter, see `EmitterType`. - inline EmitterType emitterType() const noexcept { return _emitterType; } + ASMJIT_INLINE_NODEBUG EmitterType emitterType() const noexcept { return _emitterType; } //! Returns emitter flags , see `Flags`. - inline EmitterFlags emitterFlags() const noexcept { return _emitterFlags; } + ASMJIT_INLINE_NODEBUG EmitterFlags emitterFlags() const noexcept { return _emitterFlags; } //! Tests whether the emitter inherits from `BaseAssembler`. - inline bool isAssembler() const noexcept { return _emitterType == EmitterType::kAssembler; } + ASMJIT_INLINE_NODEBUG bool isAssembler() const noexcept { return _emitterType == EmitterType::kAssembler; } //! Tests whether the emitter inherits from `BaseBuilder`. //! //! \note Both Builder and Compiler emitters would return `true`. - inline bool isBuilder() const noexcept { return uint32_t(_emitterType) >= uint32_t(EmitterType::kBuilder); } + ASMJIT_INLINE_NODEBUG bool isBuilder() const noexcept { return uint32_t(_emitterType) >= uint32_t(EmitterType::kBuilder); } //! Tests whether the emitter inherits from `BaseCompiler`. - inline bool isCompiler() const noexcept { return _emitterType == EmitterType::kCompiler; } + ASMJIT_INLINE_NODEBUG bool isCompiler() const noexcept { return _emitterType == EmitterType::kCompiler; } //! Tests whether the emitter has the given `flag` enabled. - inline bool hasEmitterFlag(EmitterFlags flag) const noexcept { return Support::test(_emitterFlags, flag); } + ASMJIT_INLINE_NODEBUG bool hasEmitterFlag(EmitterFlags flag) const noexcept { return Support::test(_emitterFlags, flag); } //! Tests whether the emitter is finalized. - inline bool isFinalized() const noexcept { return hasEmitterFlag(EmitterFlags::kFinalized); } + ASMJIT_INLINE_NODEBUG bool isFinalized() const noexcept { return hasEmitterFlag(EmitterFlags::kFinalized); } //! Tests whether the emitter is destroyed (only used during destruction). - inline bool isDestroyed() const noexcept { return hasEmitterFlag(EmitterFlags::kDestroyed); } + ASMJIT_INLINE_NODEBUG bool isDestroyed() const noexcept { return hasEmitterFlag(EmitterFlags::kDestroyed); } + + //! \} + + //! \cond INTERNAL + //! \name Internal Functions + //! \{ - inline void _addEmitterFlags(EmitterFlags flags) noexcept { _emitterFlags |= flags; } - inline void _clearEmitterFlags(EmitterFlags flags) noexcept { _emitterFlags &= _emitterFlags & ~flags; } + ASMJIT_INLINE_NODEBUG void _addEmitterFlags(EmitterFlags flags) noexcept { _emitterFlags |= flags; } + ASMJIT_INLINE_NODEBUG void _clearEmitterFlags(EmitterFlags flags) noexcept { _emitterFlags &= _emitterFlags & ~flags; } //! \} + //! \endcond //! \name Target Information //! \{ //! Returns the CodeHolder this emitter is attached to. - inline CodeHolder* code() const noexcept { return _code; } + ASMJIT_INLINE_NODEBUG CodeHolder* code() const noexcept { return _code; } //! Returns the target environment. //! //! The returned \ref Environment reference matches \ref CodeHolder::environment(). - inline const Environment& environment() const noexcept { return _environment; } + ASMJIT_INLINE_NODEBUG const Environment& environment() const noexcept { return _environment; } //! Tests whether the target architecture is 32-bit. - inline bool is32Bit() const noexcept { return environment().is32Bit(); } + ASMJIT_INLINE_NODEBUG bool is32Bit() const noexcept { return environment().is32Bit(); } //! Tests whether the target architecture is 64-bit. - inline bool is64Bit() const noexcept { return environment().is64Bit(); } + ASMJIT_INLINE_NODEBUG bool is64Bit() const noexcept { return environment().is64Bit(); } //! Returns the target architecture type. - inline Arch arch() const noexcept { return environment().arch(); } + ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return environment().arch(); } //! Returns the target architecture sub-type. - inline SubArch subArch() const noexcept { return environment().subArch(); } + ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return environment().subArch(); } //! Returns the target architecture's GP register size (4 or 8 bytes). - inline uint32_t registerSize() const noexcept { return environment().registerSize(); } + ASMJIT_INLINE_NODEBUG uint32_t registerSize() const noexcept { return environment().registerSize(); } + + //! Returns instruction alignment. + //! + //! The following values are returned based on the target architecture: + //! - X86 and X86_64 - instruction alignment is 1 + //! - AArch32 - instruction alignment is 4 in A32 mode and 2 in THUMB mode. + //! - AArch64 - instruction alignment is 4 + ASMJIT_INLINE_NODEBUG uint32_t instructionAlignment() const noexcept { return _instructionAlignment; } //! \} @@ -359,7 +387,7 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Tests whether the emitter is initialized (i.e. attached to \ref CodeHolder). - inline bool isInitialized() const noexcept { return _code != nullptr; } + ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _code != nullptr; } //! Finalizes this emitter. //! @@ -376,19 +404,19 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Tests whether the emitter has a logger. - inline bool hasLogger() const noexcept { return _logger != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasLogger() const noexcept { return _logger != nullptr; } //! Tests whether the emitter has its own logger. //! //! Own logger means that it overrides the possible logger that may be used by \ref CodeHolder this emitter is //! attached to. - inline bool hasOwnLogger() const noexcept { return hasEmitterFlag(EmitterFlags::kOwnLogger); } + ASMJIT_INLINE_NODEBUG bool hasOwnLogger() const noexcept { return hasEmitterFlag(EmitterFlags::kOwnLogger); } //! Returns the logger this emitter uses. //! //! The returned logger is either the emitter's own logger or it's logger used by \ref CodeHolder this emitter //! is attached to. - inline Logger* logger() const noexcept { return _logger; } + ASMJIT_INLINE_NODEBUG Logger* logger() const noexcept { return _logger; } //! Sets or resets the logger of the emitter. //! @@ -401,7 +429,7 @@ class ASMJIT_VIRTAPI BaseEmitter { //! //! The emitter will bail to using a logger attached to \ref CodeHolder this emitter is attached to, or no logger //! at all if \ref CodeHolder doesn't have one. - inline void resetLogger() noexcept { return setLogger(nullptr); } + ASMJIT_INLINE_NODEBUG void resetLogger() noexcept { return setLogger(nullptr); } //! \} @@ -409,25 +437,25 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Tests whether the emitter has an error handler attached. - inline bool hasErrorHandler() const noexcept { return _errorHandler != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasErrorHandler() const noexcept { return _errorHandler != nullptr; } //! Tests whether the emitter has its own error handler. //! //! Own error handler means that it overrides the possible error handler that may be used by \ref CodeHolder this //! emitter is attached to. - inline bool hasOwnErrorHandler() const noexcept { return hasEmitterFlag(EmitterFlags::kOwnErrorHandler); } + ASMJIT_INLINE_NODEBUG bool hasOwnErrorHandler() const noexcept { return hasEmitterFlag(EmitterFlags::kOwnErrorHandler); } //! Returns the error handler this emitter uses. //! //! The returned error handler is either the emitter's own error handler or it's error handler used by //! \ref CodeHolder this emitter is attached to. - inline ErrorHandler* errorHandler() const noexcept { return _errorHandler; } + ASMJIT_INLINE_NODEBUG ErrorHandler* errorHandler() const noexcept { return _errorHandler; } //! Sets or resets the error handler of the emitter. ASMJIT_API void setErrorHandler(ErrorHandler* errorHandler) noexcept; //! Resets the error handler. - inline void resetErrorHandler() noexcept { setErrorHandler(nullptr); } + ASMJIT_INLINE_NODEBUG void resetErrorHandler() noexcept { setErrorHandler(nullptr); } //! Handles the given error in the following way: //! 1. If the emitter has \ref ErrorHandler attached, it calls its \ref ErrorHandler::handleError() member function @@ -441,14 +469,14 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Returns encoding options. - inline EncodingOptions encodingOptions() const noexcept { return _encodingOptions; } + ASMJIT_INLINE_NODEBUG EncodingOptions encodingOptions() const noexcept { return _encodingOptions; } //! Tests whether the encoding `option` is set. - inline bool hasEncodingOption(EncodingOptions option) const noexcept { return Support::test(_encodingOptions, option); } + ASMJIT_INLINE_NODEBUG bool hasEncodingOption(EncodingOptions option) const noexcept { return Support::test(_encodingOptions, option); } //! Enables the given encoding `options`. - inline void addEncodingOptions(EncodingOptions options) noexcept { _encodingOptions |= options; } + ASMJIT_INLINE_NODEBUG void addEncodingOptions(EncodingOptions options) noexcept { _encodingOptions |= options; } //! Disables the given encoding `options`. - inline void clearEncodingOptions(EncodingOptions options) noexcept { _encodingOptions &= ~options; } + ASMJIT_INLINE_NODEBUG void clearEncodingOptions(EncodingOptions options) noexcept { _encodingOptions &= ~options; } //! \} @@ -456,10 +484,10 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Returns the emitter's diagnostic options. - inline DiagnosticOptions diagnosticOptions() const noexcept { return _diagnosticOptions; } + ASMJIT_INLINE_NODEBUG DiagnosticOptions diagnosticOptions() const noexcept { return _diagnosticOptions; } //! Tests whether the given `option` is present in the emitter's diagnostic options. - inline bool hasDiagnosticOption(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option); } + ASMJIT_INLINE_NODEBUG bool hasDiagnosticOption(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option); } //! Activates the given diagnostic `options`. //! @@ -496,44 +524,76 @@ class ASMJIT_VIRTAPI BaseEmitter { //! Forced instruction options are merged with next instruction options before the instruction is encoded. These //! options have some bits reserved that are used by error handling, logging, and instruction validation purposes. //! Other options are globals that affect each instruction. - inline InstOptions forcedInstOptions() const noexcept { return _forcedInstOptions; } + ASMJIT_INLINE_NODEBUG InstOptions forcedInstOptions() const noexcept { return _forcedInstOptions; } //! Returns options of the next instruction. - inline InstOptions instOptions() const noexcept { return _instOptions; } + ASMJIT_INLINE_NODEBUG InstOptions instOptions() const noexcept { return _instOptions; } //! Returns options of the next instruction. - inline void setInstOptions(InstOptions options) noexcept { _instOptions = options; } + ASMJIT_INLINE_NODEBUG void setInstOptions(InstOptions options) noexcept { _instOptions = options; } //! Adds options of the next instruction. - inline void addInstOptions(InstOptions options) noexcept { _instOptions |= options; } + ASMJIT_INLINE_NODEBUG void addInstOptions(InstOptions options) noexcept { _instOptions |= options; } //! Resets options of the next instruction. - inline void resetInstOptions() noexcept { _instOptions = InstOptions::kNone; } + ASMJIT_INLINE_NODEBUG void resetInstOptions() noexcept { _instOptions = InstOptions::kNone; } //! Tests whether the extra register operand is valid. - inline bool hasExtraReg() const noexcept { return _extraReg.isReg(); } + ASMJIT_INLINE_NODEBUG bool hasExtraReg() const noexcept { return _extraReg.isReg(); } //! Returns an extra operand that will be used by the next instruction (architecture specific). - inline const RegOnly& extraReg() const noexcept { return _extraReg; } + ASMJIT_INLINE_NODEBUG const RegOnly& extraReg() const noexcept { return _extraReg; } //! Sets an extra operand that will be used by the next instruction (architecture specific). - inline void setExtraReg(const BaseReg& reg) noexcept { _extraReg.init(reg); } + ASMJIT_INLINE_NODEBUG void setExtraReg(const BaseReg& reg) noexcept { _extraReg.init(reg); } //! Sets an extra operand that will be used by the next instruction (architecture specific). - inline void setExtraReg(const RegOnly& reg) noexcept { _extraReg.init(reg); } + ASMJIT_INLINE_NODEBUG void setExtraReg(const RegOnly& reg) noexcept { _extraReg.init(reg); } //! Resets an extra operand that will be used by the next instruction (architecture specific). - inline void resetExtraReg() noexcept { _extraReg.reset(); } + ASMJIT_INLINE_NODEBUG void resetExtraReg() noexcept { _extraReg.reset(); } //! Returns comment/annotation of the next instruction. - inline const char* inlineComment() const noexcept { return _inlineComment; } + ASMJIT_INLINE_NODEBUG const char* inlineComment() const noexcept { return _inlineComment; } //! Sets comment/annotation of the next instruction. //! //! \note This string is set back to null by `_emit()`, but until that it has to remain valid as the Emitter is not //! required to make a copy of it (and it would be slow to do that for each instruction). - inline void setInlineComment(const char* s) noexcept { _inlineComment = s; } + ASMJIT_INLINE_NODEBUG void setInlineComment(const char* s) noexcept { _inlineComment = s; } //! Resets the comment/annotation to nullptr. - inline void resetInlineComment() noexcept { _inlineComment = nullptr; } + ASMJIT_INLINE_NODEBUG void resetInlineComment() noexcept { _inlineComment = nullptr; } + + //! \} + + //! \name Emitter State + //! \{ + + //! Resets the emitter state, which contains instruction options, extra register, and inline comment. + //! + //! Emitter can have a state that describes instruction options and extra register used by the instruction. Most + //! instructions don't need nor use the state, however, if an instruction uses a prefix such as REX or REP prefix, + //! which is set explicitly, then the state would contain it. This allows to mimic the syntax of assemblers such + //! as X86. For example `rep().movs(...)` would map to a `REP MOVS` instuction on X86. The same applies to various + //! hints and the use of a mask register in AVX-512 mode. + ASMJIT_INLINE_NODEBUG void resetState() noexcept { + resetInstOptions(); + resetExtraReg(); + resetInlineComment(); + } + + //! \cond INTERNAL + + //! Grabs the current emitter state and resets the emitter state at the same time, returning the state the emitter + //! had before the state was reset. + ASMJIT_INLINE_NODEBUG State _grabState() noexcept { + State s{_instOptions | _forcedInstOptions, _extraReg, _inlineComment}; + resetState(); + return s; + } + //! \endcond //! \} //! \name Sections //! \{ - virtual Error section(Section* section) = 0; + //! Switches the given `section`. + //! + //! Once switched, everything is added to the given `section`. + ASMJIT_API virtual Error section(Section* section); //! \} @@ -541,14 +601,14 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Creates a new label. - virtual Label newLabel() = 0; + ASMJIT_API virtual Label newLabel(); //! Creates a new named label. - virtual Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parentId = Globals::kInvalidId) = 0; + ASMJIT_API virtual Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parentId = Globals::kInvalidId); //! Creates a new anonymous label with a name, which can only be used for debugging purposes. - inline Label newAnonymousLabel(const char* name, size_t nameSize = SIZE_MAX) { return newNamedLabel(name, nameSize, LabelType::kAnonymous); } + ASMJIT_INLINE_NODEBUG Label newAnonymousLabel(const char* name, size_t nameSize = SIZE_MAX) { return newNamedLabel(name, nameSize, LabelType::kAnonymous); } //! Creates a new external label. - inline Label newExternalLabel(const char* name, size_t nameSize = SIZE_MAX) { return newNamedLabel(name, nameSize, LabelType::kExternal); } + ASMJIT_INLINE_NODEBUG Label newExternalLabel(const char* name, size_t nameSize = SIZE_MAX) { return newNamedLabel(name, nameSize, LabelType::kExternal); } //! Returns `Label` by `name`. //! @@ -561,12 +621,12 @@ class ASMJIT_VIRTAPI BaseEmitter { //! Binds the `label` to the current position of the current section. //! //! \note Attempt to bind the same label multiple times will return an error. - virtual Error bind(const Label& label) = 0; + ASMJIT_API virtual Error bind(const Label& label); //! Tests whether the label `id` is valid (i.e. registered). ASMJIT_API bool isLabelValid(uint32_t labelId) const noexcept; //! Tests whether the `label` is valid (i.e. registered). - inline bool isLabelValid(const Label& label) const noexcept { return isLabelValid(label.id()); } + ASMJIT_INLINE_NODEBUG bool isLabelValid(const Label& label) const noexcept { return isLabelValid(label.id()); } //! \} @@ -596,35 +656,51 @@ class ASMJIT_VIRTAPI BaseEmitter { ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4, const Operand_& o5); //! Emits an instruction `instId` with the given `operands`. + //! + //! This is the most universal way of emitting code, which accepts an instruction identifier and instruction + //! operands. This is called an "unchecked" API as emit doesn't provide any type checks at compile-time. This + //! allows to emit instruction with just \ref Operand instances, which could be handy in some cases - for + //! example emitting generic code where you don't know whether some operand is register, memory, or immediate. template - ASMJIT_FORCE_INLINE Error emit(InstId instId, Args&&... operands) { + ASMJIT_INLINE_NODEBUG Error emit(InstId instId, Args&&... operands) { return _emitI(instId, Support::ForwardOp::forward(operands)...); } - ASMJIT_FORCE_INLINE Error emitOpArray(InstId instId, const Operand_* operands, size_t opCount) { + //! Similar to \ref emit(), but uses array of `operands` instead. + ASMJIT_INLINE_NODEBUG Error emitOpArray(InstId instId, const Operand_* operands, size_t opCount) { return _emitOpArray(instId, operands, opCount); } + //! Similar to \ref emit(), but emits instruction with both instruction options and extra register, followed + //! by an array of `operands`. ASMJIT_FORCE_INLINE Error emitInst(const BaseInst& inst, const Operand_* operands, size_t opCount) { setInstOptions(inst.options()); setExtraReg(inst.extraReg()); return _emitOpArray(inst.id(), operands, opCount); } + //! \} + //! \cond INTERNAL + //! \name Emit Internals + //! \{ + //! Emits an instruction - all 6 operands must be defined. - virtual Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* oExt) = 0; + ASMJIT_API virtual Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* oExt); //! Emits instruction having operands stored in array. ASMJIT_API virtual Error _emitOpArray(InstId instId, const Operand_* operands, size_t opCount); - //! \endcond //! \} + //! \endcond //! \name Emit Utilities //! \{ + //! Emits a function prolog described by the given function `frame`. ASMJIT_API Error emitProlog(const FuncFrame& frame); + //! Emits a function epilog described by the given function `frame`. ASMJIT_API Error emitEpilog(const FuncFrame& frame); + //! Emits code that reassigns function `frame` arguments to the given `args`. ASMJIT_API Error emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args); //! \} @@ -637,7 +713,7 @@ class ASMJIT_VIRTAPI BaseEmitter { //! The sequence that is used to fill the gap between the aligned location and the current location depends on the //! align `mode`, see \ref AlignMode. The `alignment` argument specifies alignment in bytes, so for example when //! it's `32` it means that the code buffer will be aligned to `32` bytes. - virtual Error align(AlignMode alignMode, uint32_t alignment) = 0; + ASMJIT_API virtual Error align(AlignMode alignMode, uint32_t alignment); //! \} @@ -645,7 +721,7 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Embeds raw data into the \ref CodeBuffer. - virtual Error embed(const void* data, size_t dataSize) = 0; + ASMJIT_API virtual Error embed(const void* data, size_t dataSize); //! Embeds a typed data array. //! @@ -656,44 +732,44 @@ class ASMJIT_VIRTAPI BaseEmitter { //! //! - Repeat the given data `repeatCount` times, so the data can be used as a fill pattern for example, or as a //! pattern used by SIMD instructions. - virtual Error embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1) = 0; + ASMJIT_API virtual Error embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1); //! Embeds int8_t `value` repeated by `repeatCount`. - inline Error embedInt8(int8_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt8, &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedInt8(int8_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt8, &value, 1, repeatCount); } //! Embeds uint8_t `value` repeated by `repeatCount`. - inline Error embedUInt8(uint8_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt8, &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedUInt8(uint8_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt8, &value, 1, repeatCount); } //! Embeds int16_t `value` repeated by `repeatCount`. - inline Error embedInt16(int16_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt16, &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedInt16(int16_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt16, &value, 1, repeatCount); } //! Embeds uint16_t `value` repeated by `repeatCount`. - inline Error embedUInt16(uint16_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt16, &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedUInt16(uint16_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt16, &value, 1, repeatCount); } //! Embeds int32_t `value` repeated by `repeatCount`. - inline Error embedInt32(int32_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt32, &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedInt32(int32_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt32, &value, 1, repeatCount); } //! Embeds uint32_t `value` repeated by `repeatCount`. - inline Error embedUInt32(uint32_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt32, &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedUInt32(uint32_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt32, &value, 1, repeatCount); } //! Embeds int64_t `value` repeated by `repeatCount`. - inline Error embedInt64(int64_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt64, &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedInt64(int64_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt64, &value, 1, repeatCount); } //! Embeds uint64_t `value` repeated by `repeatCount`. - inline Error embedUInt64(uint64_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt64, &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedUInt64(uint64_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt64, &value, 1, repeatCount); } //! Embeds a floating point `value` repeated by `repeatCount`. - inline Error embedFloat(float value, size_t repeatCount = 1) { return embedDataArray(TypeId(TypeUtils::TypeIdOfT::kTypeId), &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedFloat(float value, size_t repeatCount = 1) { return embedDataArray(TypeId(TypeUtils::TypeIdOfT::kTypeId), &value, 1, repeatCount); } //! Embeds a floating point `value` repeated by `repeatCount`. - inline Error embedDouble(double value, size_t repeatCount = 1) { return embedDataArray(TypeId(TypeUtils::TypeIdOfT::kTypeId), &value, 1, repeatCount); } + ASMJIT_INLINE_NODEBUG Error embedDouble(double value, size_t repeatCount = 1) { return embedDataArray(TypeId(TypeUtils::TypeIdOfT::kTypeId), &value, 1, repeatCount); } //! Embeds a constant pool at the current offset by performing the following: //! 1. Aligns by using AlignMode::kData to the minimum `pool` alignment. //! 2. Binds the ConstPool label so it's bound to an aligned location. //! 3. Emits ConstPool content. - virtual Error embedConstPool(const Label& label, const ConstPool& pool) = 0; + ASMJIT_API virtual Error embedConstPool(const Label& label, const ConstPool& pool); //! Embeds an absolute `label` address as data. //! //! The `dataSize` is an optional argument that can be used to specify the size of the address data. If it's zero //! (default) the address size is deduced from the target architecture (either 4 or 8 bytes). - virtual Error embedLabel(const Label& label, size_t dataSize = 0) = 0; + ASMJIT_API virtual Error embedLabel(const Label& label, size_t dataSize = 0); //! Embeds a delta (distance) between the `label` and `base` calculating it as `label - base`. This function was //! designed to make it easier to embed lookup tables where each index is a relative distance of two labels. - virtual Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize = 0) = 0; + ASMJIT_API virtual Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize = 0); //! \} @@ -701,7 +777,7 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Emits a comment stored in `data` with an optional `size` parameter. - virtual Error comment(const char* data, size_t size = SIZE_MAX) = 0; + ASMJIT_API virtual Error comment(const char* data, size_t size = SIZE_MAX); //! Emits a formatted comment specified by `fmt` and variable number of arguments. ASMJIT_API Error commentf(const char* fmt, ...); @@ -714,9 +790,9 @@ class ASMJIT_VIRTAPI BaseEmitter { //! \{ //! Called after the emitter was attached to `CodeHolder`. - virtual Error onAttach(CodeHolder* ASMJIT_NONNULL(code)) noexcept = 0; + ASMJIT_API virtual Error onAttach(CodeHolder* ASMJIT_NONNULL(code)) noexcept; //! Called after the emitter was detached from `CodeHolder`. - virtual Error onDetach(CodeHolder* ASMJIT_NONNULL(code)) noexcept = 0; + ASMJIT_API virtual Error onDetach(CodeHolder* ASMJIT_NONNULL(code)) noexcept; //! Called when \ref CodeHolder has updated an important setting, which involves the following: //! diff --git a/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp b/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp index f36a1b3774554..d0a687244b359 100644 --- a/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp +++ b/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp @@ -96,7 +96,7 @@ void logInstructionEmitted( } Error logInstructionFailed( - BaseAssembler* self, + BaseEmitter* self, Error err, InstId instId, InstOptions options, @@ -109,16 +109,14 @@ Error logInstructionFailed( Operand_ opArray[Globals::kMaxOpCount]; opArrayFromEmitArgs(opArray, o0, o1, o2, opExt); - self->_funcs.formatInstruction(sb, FormatFlags::kNone, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount); + self->_funcs.formatInstruction(sb, FormatFlags::kRegType, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount); if (self->inlineComment()) { sb.append(" ; "); sb.append(self->inlineComment()); } - self->resetInstOptions(); - self->resetExtraReg(); - self->resetInlineComment(); + self->resetState(); return self->reportError(err, sb.data()); } diff --git a/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h b/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h index b7610e702618f..8b6e1e0547e3a 100644 --- a/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h +++ b/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h @@ -23,7 +23,7 @@ namespace EmitterUtils { //! Default paddings used by Emitter utils and Formatter. -static constexpr Operand noExt[3]; +static constexpr Operand noExt[3] = { {}, {}, {} }; enum kOpIndex : uint32_t { kOp3 = 0, @@ -71,7 +71,7 @@ void logInstructionEmitted( uint32_t relSize, uint32_t immSize, uint8_t* afterCursor); Error logInstructionFailed( - BaseAssembler* self, + BaseEmitter* self, Error err, InstId instId, InstOptions options, diff --git a/3rdparty/asmjit/src/asmjit/core/environment.h b/3rdparty/asmjit/src/asmjit/core/environment.h index 7e328a97c8e6b..c3678dc65bca4 100644 --- a/3rdparty/asmjit/src/asmjit/core/environment.h +++ b/3rdparty/asmjit/src/asmjit/core/environment.h @@ -24,7 +24,7 @@ enum class Vendor : uint8_t { //! Unknown or uninitialized platform vendor. kUnknown = 0, - //! Maximum value of `PlatformVendor`. + //! Maximum value of `Vendor`. kMaxValue = kUnknown, //! Platform vendor detected at compile-time. @@ -116,7 +116,7 @@ enum class Platform : uint8_t { //! Platform ABI (application binary interface). enum class PlatformABI : uint8_t { - //! Unknown or uninitialied environment. + //! Unknown or uninitialized environment. kUnknown = 0, //! Microsoft ABI. kMSVC, @@ -126,6 +126,8 @@ enum class PlatformABI : uint8_t { kAndroid, //! Cygwin ABI. kCygwin, + //! Darwin ABI. + kDarwin, //! Maximum value of `PlatformABI`. kMaxValue, @@ -142,11 +144,26 @@ enum class PlatformABI : uint8_t { kGNU #elif defined(__ANDROID__) kAndroid +#elif defined(__APPLE__) + kDarwin #else kUnknown #endif }; +//! Floating point ABI (ARM). +enum class FloatABI : uint8_t { + kHardFloat = 0, + kSoftFloat, + + kHost = +#if ASMJIT_ARCH_ARM == 32 && defined(__SOFTFP__) + kSoftFloat +#else + kHardFloat +#endif +}; + //! Object format. //! //! \note AsmJit doesn't really use anything except \ref ObjectFormat::kUnknown and \ref ObjectFormat::kJIT at @@ -186,53 +203,56 @@ class Environment { //! \{ //! Architecture. - Arch _arch; + Arch _arch = Arch::kUnknown; //! Sub-architecture type. - SubArch _subArch; + SubArch _subArch = SubArch::kUnknown; //! Vendor type. - Vendor _vendor; + Vendor _vendor = Vendor::kUnknown; //! Platform. - Platform _platform; + Platform _platform = Platform::kUnknown; //! Platform ABI. - PlatformABI _platformABI; + PlatformABI _platformABI = PlatformABI::kUnknown; //! Object format. - ObjectFormat _objectFormat; + ObjectFormat _objectFormat = ObjectFormat::kUnknown; + //! Floating point ABI. + FloatABI _floatABI = FloatABI::kHardFloat; //! Reserved for future use, must be zero. - uint8_t _reserved[2]; + uint8_t _reserved = 0; //! \} //! \name Construction & Destruction //! \{ - inline Environment() noexcept : - _arch(Arch::kUnknown), - _subArch(SubArch::kUnknown), - _vendor(Vendor::kUnknown), - _platform(Platform::kUnknown), - _platformABI(PlatformABI::kUnknown), - _objectFormat(ObjectFormat::kUnknown), - _reserved { 0, 0 } {} + //! Creates a default initialized environment (all values either unknown or set to safe defaults). + ASMJIT_INLINE_NODEBUG constexpr Environment() noexcept = default; + //! Creates a copy of `other` instance. + ASMJIT_INLINE_NODEBUG constexpr Environment(const Environment& other) noexcept = default; - inline explicit Environment( + //! Creates \ref Environment initialized to `arch`, `subArch`, `vendor`, `platform`, `platformABI`, `objectFormat`, + //! and `floatABI`. + ASMJIT_INLINE_NODEBUG constexpr explicit Environment( Arch arch, SubArch subArch = SubArch::kUnknown, Vendor vendor = Vendor::kUnknown, Platform platform = Platform::kUnknown, - PlatformABI abi = PlatformABI::kUnknown, - ObjectFormat objectFormat = ObjectFormat::kUnknown) noexcept { - - init(arch, subArch, vendor, platform, abi, objectFormat); - } - - inline Environment(const Environment& other) noexcept = default; + PlatformABI platformABI = PlatformABI::kUnknown, + ObjectFormat objectFormat = ObjectFormat::kUnknown, + FloatABI floatABI = FloatABI::kHardFloat) noexcept + : _arch(arch), + _subArch(subArch), + _vendor(vendor), + _platform(platform), + _platformABI(platformABI), + _objectFormat(objectFormat), + _floatABI(floatABI) {} //! Returns the host environment constructed from preprocessor macros defined by the compiler. //! //! The returned environment should precisely match the target host architecture, sub-architecture, platform, //! and ABI. - static inline Environment host() noexcept { - return Environment(Arch::kHost, SubArch::kHost, Vendor::kHost, Platform::kHost, PlatformABI::kHost, ObjectFormat::kUnknown); + static ASMJIT_INLINE_NODEBUG Environment host() noexcept { + return Environment(Arch::kHost, SubArch::kHost, Vendor::kHost, Platform::kHost, PlatformABI::kHost, ObjectFormat::kUnknown, FloatABI::kHost); } //! \} @@ -240,10 +260,10 @@ class Environment { //! \name Overloaded Operators //! \{ - inline Environment& operator=(const Environment& other) noexcept = default; + ASMJIT_INLINE_NODEBUG Environment& operator=(const Environment& other) noexcept = default; - inline bool operator==(const Environment& other) const noexcept { return equals(other); } - inline bool operator!=(const Environment& other) const noexcept { return !equals(other); } + ASMJIT_INLINE_NODEBUG bool operator==(const Environment& other) const noexcept { return equals(other); } + ASMJIT_INLINE_NODEBUG bool operator!=(const Environment& other) const noexcept { return !equals(other); } //! \} @@ -253,59 +273,54 @@ class Environment { //! Tests whether the environment is not set up. //! //! Returns true if all members are zero, and thus unknown. - inline bool empty() const noexcept { + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { // Unfortunately compilers won't optimize fields are checked one by one... return _packed() == 0; } //! Tests whether the environment is initialized, which means it must have //! a valid architecture. - inline bool isInitialized() const noexcept { + ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _arch != Arch::kUnknown; } - inline uint64_t _packed() const noexcept { + ASMJIT_INLINE_NODEBUG uint64_t _packed() const noexcept { uint64_t x; memcpy(&x, this, 8); return x; } //! Resets all members of the environment to zero / unknown. - inline void reset() noexcept { - _arch = Arch::kUnknown; - _subArch = SubArch::kUnknown; - _vendor = Vendor::kUnknown; - _platform = Platform::kUnknown; - _platformABI = PlatformABI::kUnknown; - _objectFormat = ObjectFormat::kUnknown; - _reserved[0] = 0; - _reserved[1] = 0; - } + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Environment{}; } - inline bool equals(const Environment& other) const noexcept { - return _packed() == other._packed(); - } + //! Tests whether this environment is equal to `other`. + ASMJIT_INLINE_NODEBUG bool equals(const Environment& other) const noexcept { return _packed() == other._packed(); } //! Returns the architecture. - inline Arch arch() const noexcept { return _arch; } + ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; } //! Returns the sub-architecture. - inline SubArch subArch() const noexcept { return _subArch; } + ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return _subArch; } //! Returns vendor. - inline Vendor vendor() const noexcept { return _vendor; } + ASMJIT_INLINE_NODEBUG Vendor vendor() const noexcept { return _vendor; } //! Returns target's platform or operating system. - inline Platform platform() const noexcept { return _platform; } + ASMJIT_INLINE_NODEBUG Platform platform() const noexcept { return _platform; } //! Returns target's ABI. - inline PlatformABI platformABI() const noexcept { return _platformABI; } + ASMJIT_INLINE_NODEBUG PlatformABI platformABI() const noexcept { return _platformABI; } //! Returns target's object format. - inline ObjectFormat objectFormat() const noexcept { return _objectFormat; } + ASMJIT_INLINE_NODEBUG ObjectFormat objectFormat() const noexcept { return _objectFormat; } + //! Returns floating point ABI. + ASMJIT_INLINE_NODEBUG FloatABI floatABI() const noexcept { return _floatABI; } + //! Initializes \ref Environment to `arch`, `subArch`, `vendor`, `platform`, `platformABI`, `objectFormat`, + //! and `floatABI`. inline void init( Arch arch, SubArch subArch = SubArch::kUnknown, Vendor vendor = Vendor::kUnknown, Platform platform = Platform::kUnknown, PlatformABI platformABI = PlatformABI::kUnknown, - ObjectFormat objectFormat = ObjectFormat::kUnknown) noexcept { + ObjectFormat objectFormat = ObjectFormat::kUnknown, + FloatABI floatABI = FloatABI::kHardFloat) noexcept { _arch = arch; _subArch = subArch; @@ -313,57 +328,63 @@ class Environment { _platform = platform; _platformABI = platformABI; _objectFormat = objectFormat; - _reserved[0] = 0; - _reserved[1] = 0; + _floatABI = floatABI; + _reserved = 0; } - inline bool isArchX86() const noexcept { return _arch == Arch::kX86; } - inline bool isArchX64() const noexcept { return _arch == Arch::kX64; } - inline bool isArchARM() const noexcept { return isArchARM(_arch); } - inline bool isArchThumb() const noexcept { return isArchThumb(_arch); } - inline bool isArchAArch64() const noexcept { return isArchAArch64(_arch); } - inline bool isArchMIPS32() const noexcept { return isArchMIPS32(_arch); } - inline bool isArchMIPS64() const noexcept { return isArchMIPS64(_arch); } - inline bool isArchRISCV32() const noexcept { return _arch == Arch::kRISCV32; } - inline bool isArchRISCV64() const noexcept { return _arch == Arch::kRISCV64; } + //! Tests whether this environment describes a 32-bit X86. + ASMJIT_INLINE_NODEBUG bool isArchX86() const noexcept { return _arch == Arch::kX86; } + //! Tests whether this environment describes a 64-bit X86. + ASMJIT_INLINE_NODEBUG bool isArchX64() const noexcept { return _arch == Arch::kX64; } + //! Tests whether this environment describes a 32-bit ARM. + ASMJIT_INLINE_NODEBUG bool isArchARM() const noexcept { return isArchARM(_arch); } + //! Tests whether this environment describes a 32-bit ARM in THUMB mode. + ASMJIT_INLINE_NODEBUG bool isArchThumb() const noexcept { return isArchThumb(_arch); } + //! Tests whether this environment describes a 64-bit X86. + ASMJIT_INLINE_NODEBUG bool isArchAArch64() const noexcept { return isArchAArch64(_arch); } + //! Tests whether this environment describes a 32-bit MIPS. + ASMJIT_INLINE_NODEBUG bool isArchMIPS32() const noexcept { return isArchMIPS32(_arch); } + //! Tests whether this environment describes a 64-bit MIPS. + ASMJIT_INLINE_NODEBUG bool isArchMIPS64() const noexcept { return isArchMIPS64(_arch); } + //! Tests whether this environment describes a 32-bit RISC-V. + ASMJIT_INLINE_NODEBUG bool isArchRISCV32() const noexcept { return _arch == Arch::kRISCV32; } + //! Tests whether this environment describes a 64-bit RISC-V. + ASMJIT_INLINE_NODEBUG bool isArchRISCV64() const noexcept { return _arch == Arch::kRISCV64; } //! Tests whether the architecture is 32-bit. - inline bool is32Bit() const noexcept { return is32Bit(_arch); } + ASMJIT_INLINE_NODEBUG bool is32Bit() const noexcept { return is32Bit(_arch); } //! Tests whether the architecture is 64-bit. - inline bool is64Bit() const noexcept { return is64Bit(_arch); } + ASMJIT_INLINE_NODEBUG bool is64Bit() const noexcept { return is64Bit(_arch); } //! Tests whether the architecture is little endian. - inline bool isLittleEndian() const noexcept { return isLittleEndian(_arch); } + ASMJIT_INLINE_NODEBUG bool isLittleEndian() const noexcept { return isLittleEndian(_arch); } //! Tests whether the architecture is big endian. - inline bool isBigEndian() const noexcept { return isBigEndian(_arch); } + ASMJIT_INLINE_NODEBUG bool isBigEndian() const noexcept { return isBigEndian(_arch); } //! Tests whether this architecture is of X86 family. - inline bool isFamilyX86() const noexcept { return isFamilyX86(_arch); } + ASMJIT_INLINE_NODEBUG bool isFamilyX86() const noexcept { return isFamilyX86(_arch); } //! Tests whether this architecture family is ARM, THUMB, or AArch64. - inline bool isFamilyARM() const noexcept { return isFamilyARM(_arch); } + ASMJIT_INLINE_NODEBUG bool isFamilyARM() const noexcept { return isFamilyARM(_arch); } //! Tests whether this architecture family is AArch32 (ARM or THUMB). - inline bool isFamilyAArch32() const noexcept { return isFamilyAArch32(_arch); } + ASMJIT_INLINE_NODEBUG bool isFamilyAArch32() const noexcept { return isFamilyAArch32(_arch); } //! Tests whether this architecture family is AArch64. - inline bool isFamilyAArch64() const noexcept { return isFamilyAArch64(_arch); } + ASMJIT_INLINE_NODEBUG bool isFamilyAArch64() const noexcept { return isFamilyAArch64(_arch); } //! Tests whether this architecture family is MISP or MIPS64. - inline bool isFamilyMIPS() const noexcept { return isFamilyMIPS(_arch); } + ASMJIT_INLINE_NODEBUG bool isFamilyMIPS() const noexcept { return isFamilyMIPS(_arch); } //! Tests whether this architecture family is RISC-V (both 32-bit and 64-bit). - inline bool isFamilyRISCV() const noexcept { return isFamilyRISCV(_arch); } + ASMJIT_INLINE_NODEBUG bool isFamilyRISCV() const noexcept { return isFamilyRISCV(_arch); } //! Tests whether the environment platform is Windows. - inline bool isPlatformWindows() const noexcept { return _platform == Platform::kWindows; } - + ASMJIT_INLINE_NODEBUG bool isPlatformWindows() const noexcept { return _platform == Platform::kWindows; } //! Tests whether the environment platform is Linux. - inline bool isPlatformLinux() const noexcept { return _platform == Platform::kLinux; } - + ASMJIT_INLINE_NODEBUG bool isPlatformLinux() const noexcept { return _platform == Platform::kLinux; } //! Tests whether the environment platform is Hurd. - inline bool isPlatformHurd() const noexcept { return _platform == Platform::kHurd; } - + ASMJIT_INLINE_NODEBUG bool isPlatformHurd() const noexcept { return _platform == Platform::kHurd; } //! Tests whether the environment platform is Haiku. - inline bool isPlatformHaiku() const noexcept { return _platform == Platform::kHaiku; } + ASMJIT_INLINE_NODEBUG bool isPlatformHaiku() const noexcept { return _platform == Platform::kHaiku; } //! Tests whether the environment platform is any BSD. - inline bool isPlatformBSD() const noexcept { + ASMJIT_INLINE_NODEBUG bool isPlatformBSD() const noexcept { return _platform == Platform::kFreeBSD || _platform == Platform::kOpenBSD || _platform == Platform::kNetBSD || @@ -371,7 +392,7 @@ class Environment { } //! Tests whether the environment platform is any Apple platform (OSX, iOS, TVOS, WatchOS). - inline bool isPlatformApple() const noexcept { + ASMJIT_INLINE_NODEBUG bool isPlatformApple() const noexcept { return _platform == Platform::kOSX || _platform == Platform::kIOS || _platform == Platform::kTVOS || @@ -379,119 +400,124 @@ class Environment { } //! Tests whether the ABI is MSVC. - inline bool isMSVC() const noexcept { return _platformABI == PlatformABI::kMSVC; } + ASMJIT_INLINE_NODEBUG bool isMSVC() const noexcept { return _platformABI == PlatformABI::kMSVC; } //! Tests whether the ABI is GNU. - inline bool isGNU() const noexcept { return _platformABI == PlatformABI::kGNU; } + ASMJIT_INLINE_NODEBUG bool isGNU() const noexcept { return _platformABI == PlatformABI::kGNU; } + //! Tests whether the ABI is GNU. + ASMJIT_INLINE_NODEBUG bool isDarwin() const noexcept { return _platformABI == PlatformABI::kDarwin; } //! Returns a calculated stack alignment for this environment. ASMJIT_API uint32_t stackAlignment() const noexcept; //! Returns a native register size of this architecture. - uint32_t registerSize() const noexcept { return registerSizeFromArch(_arch); } + ASMJIT_INLINE_NODEBUG uint32_t registerSize() const noexcept { return registerSizeFromArch(_arch); } //! Sets the architecture to `arch`. - inline void setArch(Arch arch) noexcept { _arch = arch; } + ASMJIT_INLINE_NODEBUG void setArch(Arch arch) noexcept { _arch = arch; } //! Sets the sub-architecture to `subArch`. - inline void setSubArch(SubArch subArch) noexcept { _subArch = subArch; } + ASMJIT_INLINE_NODEBUG void setSubArch(SubArch subArch) noexcept { _subArch = subArch; } //! Sets the vendor to `vendor`. - inline void setVendor(Vendor vendor) noexcept { _vendor = vendor; } + ASMJIT_INLINE_NODEBUG void setVendor(Vendor vendor) noexcept { _vendor = vendor; } //! Sets the platform to `platform`. - inline void setPlatform(Platform platform) noexcept { _platform = platform; } + ASMJIT_INLINE_NODEBUG void setPlatform(Platform platform) noexcept { _platform = platform; } //! Sets the ABI to `platformABI`. - inline void setPlatformABI(PlatformABI platformABI) noexcept { _platformABI = platformABI; } + ASMJIT_INLINE_NODEBUG void setPlatformABI(PlatformABI platformABI) noexcept { _platformABI = platformABI; } //! Sets the object format to `objectFormat`. - inline void setObjectFormat(ObjectFormat objectFormat) noexcept { _objectFormat = objectFormat; } + ASMJIT_INLINE_NODEBUG void setObjectFormat(ObjectFormat objectFormat) noexcept { _objectFormat = objectFormat; } + + //! Sets floating point ABI to `floatABI`. + ASMJIT_INLINE_NODEBUG void setFloatABI(FloatABI floatABI) noexcept { _floatABI = floatABI; } //! \} //! \name Static Utilities //! \{ - static inline bool isDefinedArch(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isDefinedArch(Arch arch) noexcept { return uint32_t(arch) <= uint32_t(Arch::kMaxValue); } - static inline bool isValidArch(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isValidArch(Arch arch) noexcept { return arch != Arch::kUnknown && uint32_t(arch) <= uint32_t(Arch::kMaxValue); } //! Tests whether the given architecture `arch` is 32-bit. - static inline bool is32Bit(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool is32Bit(Arch arch) noexcept { return (uint32_t(arch) & uint32_t(Arch::k32BitMask)) == uint32_t(Arch::k32BitMask); } //! Tests whether the given architecture `arch` is 64-bit. - static inline bool is64Bit(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool is64Bit(Arch arch) noexcept { return (uint32_t(arch) & uint32_t(Arch::k32BitMask)) == 0; } //! Tests whether the given architecture `arch` is little endian. - static inline bool isLittleEndian(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isLittleEndian(Arch arch) noexcept { return uint32_t(arch) < uint32_t(Arch::kBigEndian); } //! Tests whether the given architecture `arch` is big endian. - static inline bool isBigEndian(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isBigEndian(Arch arch) noexcept { return uint32_t(arch) >= uint32_t(Arch::kBigEndian); } //! Tests whether the given architecture is Thumb or Thumb_BE. - static inline bool isArchThumb(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isArchThumb(Arch arch) noexcept { return arch == Arch::kThumb || arch == Arch::kThumb_BE; } //! Tests whether the given architecture is ARM or ARM_BE. - static inline bool isArchARM(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isArchARM(Arch arch) noexcept { return arch == Arch::kARM || arch == Arch::kARM_BE; } //! Tests whether the given architecture is AArch64 or AArch64_BE. - static inline bool isArchAArch64(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isArchAArch64(Arch arch) noexcept { return arch == Arch::kAArch64 || arch == Arch::kAArch64_BE; } //! Tests whether the given architecture is MIPS32_LE or MIPS32_BE. - static inline bool isArchMIPS32(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isArchMIPS32(Arch arch) noexcept { return arch == Arch::kMIPS32_LE || arch == Arch::kMIPS32_BE; } //! Tests whether the given architecture is MIPS64_LE or MIPS64_BE. - static inline bool isArchMIPS64(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isArchMIPS64(Arch arch) noexcept { return arch == Arch::kMIPS64_LE || arch == Arch::kMIPS64_BE; } //! Tests whether the given architecture family is X86 or X64. - static inline bool isFamilyX86(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isFamilyX86(Arch arch) noexcept { return arch == Arch::kX86 || arch == Arch::kX64; } - //! Tests whether the given architecture family is ARM, THUMB, or AArch64. - static inline bool isFamilyARM(Arch arch) noexcept { - return isArchARM(arch) || isArchAArch64(arch) || isArchThumb(arch); - } - //! Tests whether the given architecture family is AArch32 (ARM or THUMB). - static inline bool isFamilyAArch32(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isFamilyAArch32(Arch arch) noexcept { return isArchARM(arch) || isArchThumb(arch); } //! Tests whether the given architecture family is AArch64. - static inline bool isFamilyAArch64(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isFamilyAArch64(Arch arch) noexcept { return isArchAArch64(arch); } - //! Tests whether the given architecture family is MISP or MIPS64. - static inline bool isFamilyMIPS(Arch arch) noexcept { + //! Tests whether the given architecture family is ARM, THUMB, or AArch64. + static ASMJIT_INLINE_NODEBUG bool isFamilyARM(Arch arch) noexcept { + return isFamilyAArch32(arch) || isFamilyAArch64(arch); + } + + //! Tests whether the given architecture family is MIPS or MIPS64. + static ASMJIT_INLINE_NODEBUG bool isFamilyMIPS(Arch arch) noexcept { return isArchMIPS32(arch) || isArchMIPS64(arch); } //! Tests whether the given architecture family is RISC-V (both 32-bit and 64-bit). - static inline bool isFamilyRISCV(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG bool isFamilyRISCV(Arch arch) noexcept { return arch == Arch::kRISCV32 || arch == Arch::kRISCV64; } //! Returns a native general purpose register size from the given architecture. - static inline uint32_t registerSizeFromArch(Arch arch) noexcept { + static ASMJIT_INLINE_NODEBUG uint32_t registerSizeFromArch(Arch arch) noexcept { return is32Bit(arch) ? 4u : 8u; } diff --git a/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp b/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp index 5a7dac5235617..ce2ad016af11c 100644 --- a/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp +++ b/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp @@ -11,4 +11,8 @@ ASMJIT_BEGIN_NAMESPACE ErrorHandler::ErrorHandler() noexcept {} ErrorHandler::~ErrorHandler() noexcept {} +void ErrorHandler::handleError(Error err, const char* message, BaseEmitter* origin) { + DebugUtils::unused(err, message, origin); +} + ASMJIT_END_NAMESPACE diff --git a/3rdparty/asmjit/src/asmjit/core/errorhandler.h b/3rdparty/asmjit/src/asmjit/core/errorhandler.h index 5151d43304e34..a1a2dd2d5dbee 100644 --- a/3rdparty/asmjit/src/asmjit/core/errorhandler.h +++ b/3rdparty/asmjit/src/asmjit/core/errorhandler.h @@ -61,7 +61,7 @@ class BaseEmitter; //! SimpleErrorHandler eh; //! //! CodeHolder code; -//! code.init(rt.environment()); +//! code.init(rt.environment(), rt.cpuFeatures()); //! code.setErrorHandler(&eh); //! //! // Try to emit instruction that doesn't exist. @@ -117,7 +117,7 @@ class BaseEmitter; //! ThrowableErrorHandler eh; //! //! CodeHolder code; -//! code.init(rt.environment()); +//! code.init(rt.environment(), rt.cpuFeatures()); //! code.setErrorHandler(&eh); //! //! x86::Assembler a(&code); @@ -166,7 +166,7 @@ class BaseEmitter; //! LongJmpErrorHandler eh; //! //! CodeHolder code; -//! code.init(rt.rt.environment()); +//! code.init(rt.environment(), rt.cpuFeatures()); //! code.setErrorHandler(&eh); //! //! x86::Assembler a(&code); @@ -215,7 +215,7 @@ class ASMJIT_VIRTAPI ErrorHandler { //! calling `handleError()` so `longjmp()` can be used without any issues to cancel the code generation if an //! error occurred. There is no difference between exceptions and `longjmp()` from AsmJit's perspective, however, //! never jump outside of `CodeHolder` and `BaseEmitter` scope as you would leak memory. - virtual void handleError(Error err, const char* message, BaseEmitter* origin) = 0; + ASMJIT_API virtual void handleError(Error err, const char* message, BaseEmitter* origin); //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/formatter.cpp b/3rdparty/asmjit/src/asmjit/core/formatter.cpp index 1a9a386e3f335..0f12e41636409 100644 --- a/3rdparty/asmjit/src/asmjit/core/formatter.cpp +++ b/3rdparty/asmjit/src/asmjit/core/formatter.cpp @@ -57,7 +57,7 @@ Error formatTypeId(String& sb, TypeId typeId) noexcept { if (!TypeUtils::isValid(typeId)) return sb.append("unknown"); - const char* typeName = "unknown"; + const char* typeName = nullptr; uint32_t typeSize = TypeUtils::sizeOf(typeId); TypeId scalarType = TypeUtils::scalarOf(typeId); @@ -107,7 +107,7 @@ Error formatFeature( return x86::FormatterInternal::formatFeature(sb, featureId); #endif -#if !defined(ASMJIT_NO_AARCH32) && !defined(ASMJIT_NO_AARCH64) +#if !defined(ASMJIT_NO_AARCH64) if (Environment::isFamilyARM(arch)) return arm::FormatterInternal::formatFeature(sb, featureId); #endif @@ -123,32 +123,33 @@ Error formatLabel( DebugUtils::unused(formatFlags); - const LabelEntry* le = emitter->code()->labelEntry(labelId); - if (ASMJIT_UNLIKELY(!le)) - return sb.appendFormat("", labelId); + if (emitter && emitter->code()) { + const LabelEntry* le = emitter->code()->labelEntry(labelId); + if (ASMJIT_UNLIKELY(!le)) + return sb.appendFormat("", labelId); - if (le->hasName()) { - if (le->hasParent()) { - uint32_t parentId = le->parentId(); - const LabelEntry* pe = emitter->code()->labelEntry(parentId); + if (le->hasName()) { + if (le->hasParent()) { + uint32_t parentId = le->parentId(); + const LabelEntry* pe = emitter->code()->labelEntry(parentId); - if (ASMJIT_UNLIKELY(!pe)) - ASMJIT_PROPAGATE(sb.appendFormat("", labelId)); - else if (ASMJIT_UNLIKELY(!pe->hasName())) - ASMJIT_PROPAGATE(sb.appendFormat("L%u", parentId)); - else - ASMJIT_PROPAGATE(sb.append(pe->name())); + if (ASMJIT_UNLIKELY(!pe)) + ASMJIT_PROPAGATE(sb.appendFormat("", labelId)); + else if (ASMJIT_UNLIKELY(!pe->hasName())) + ASMJIT_PROPAGATE(sb.appendFormat("L%u", parentId)); + else + ASMJIT_PROPAGATE(sb.append(pe->name())); - ASMJIT_PROPAGATE(sb.append('.')); - } + ASMJIT_PROPAGATE(sb.append('.')); + } - if (le->type() == LabelType::kAnonymous) - ASMJIT_PROPAGATE(sb.appendFormat("L%u@", labelId)); - return sb.append(le->name()); - } - else { - return sb.appendFormat("L%u", labelId); + if (le->type() == LabelType::kAnonymous) + ASMJIT_PROPAGATE(sb.appendFormat("L%u@", labelId)); + return sb.append(le->name()); + } } + + return sb.appendFormat("L%u", labelId); } Error formatRegister( @@ -165,8 +166,8 @@ Error formatRegister( #endif #if !defined(ASMJIT_NO_AARCH64) - if (Environment::isFamilyAArch64(arch)) - return a64::FormatterInternal::formatRegister(sb, formatFlags, emitter, arch, regType, regId); + if (Environment::isFamilyARM(arch)) + return arm::FormatterInternal::formatRegister(sb, formatFlags, emitter, arch, regType, regId); #endif return kErrorInvalidArch; @@ -185,8 +186,8 @@ Error formatOperand( #endif #if !defined(ASMJIT_NO_AARCH64) - if (Environment::isFamilyAArch64(arch)) - return a64::FormatterInternal::formatOperand(sb, formatFlags, emitter, arch, op); + if (Environment::isFamilyARM(arch)) + return arm::FormatterInternal::formatOperand(sb, formatFlags, emitter, arch, op); #endif return kErrorInvalidArch; @@ -283,7 +284,7 @@ Error formatInstruction( #endif #if !defined(ASMJIT_NO_AARCH64) - if (Environment::isFamilyARM(arch)) + if (Environment::isFamilyAArch64(arch)) return a64::FormatterInternal::formatInstruction(sb, formatFlags, emitter, arch, inst, operands, opCount); #endif @@ -471,8 +472,7 @@ Error formatNode( case NodeType::kComment: { const CommentNode* commentNode = node->as(); - ASMJIT_PROPAGATE(sb.appendFormat("; %s", commentNode->inlineComment())); - break; + return sb.appendFormat("; %s", commentNode->inlineComment()); } case NodeType::kSentinel: { @@ -514,7 +514,7 @@ Error formatNode( ASMJIT_PROPAGATE(sb.append("[FuncRet]")); for (uint32_t i = 0; i < 2; i++) { - const Operand_& op = retNode->_opArray[i]; + const Operand_& op = retNode->op(i); if (!op.isNone()) { ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", ")); ASMJIT_PROPAGATE(formatOperand(sb, formatOptions.flags(), builder, builder->arch(), op)); diff --git a/3rdparty/asmjit/src/asmjit/core/formatter.h b/3rdparty/asmjit/src/asmjit/core/formatter.h index d7a4b93476ac1..392e47873020f 100644 --- a/3rdparty/asmjit/src/asmjit/core/formatter.h +++ b/3rdparty/asmjit/src/asmjit/core/formatter.h @@ -37,7 +37,9 @@ enum class FormatFlags : uint32_t { //! Show casts between virtual register types (Compiler output). kRegCasts = 0x00000010u, //! Show positions associated with nodes (Compiler output). - kPositions = 0x00000020u + kPositions = 0x00000020u, + //! Always format a register type (Compiler output). + kRegType = 0x00000040u }; ASMJIT_DEFINE_ENUM_FLAGS(FormatFlags) @@ -89,7 +91,7 @@ class FormatOptions { //! \{ //! Resets FormatOptions to its default initialized state. - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _flags = FormatFlags::kNone; _indentation.fill(uint8_t(0)); _padding.fill(uint16_t(0)); @@ -101,31 +103,31 @@ class FormatOptions { //! \{ //! Returns format flags. - inline FormatFlags flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG FormatFlags flags() const noexcept { return _flags; } //! Tests whether the given `flag` is set in format flags. - inline bool hasFlag(FormatFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(FormatFlags flag) const noexcept { return Support::test(_flags, flag); } //! Resets all format flags to `flags`. - inline void setFlags(FormatFlags flags) noexcept { _flags = flags; } + ASMJIT_INLINE_NODEBUG void setFlags(FormatFlags flags) noexcept { _flags = flags; } //! Adds `flags` to format flags. - inline void addFlags(FormatFlags flags) noexcept { _flags |= flags; } + ASMJIT_INLINE_NODEBUG void addFlags(FormatFlags flags) noexcept { _flags |= flags; } //! Removes `flags` from format flags. - inline void clearFlags(FormatFlags flags) noexcept { _flags &= ~flags; } + ASMJIT_INLINE_NODEBUG void clearFlags(FormatFlags flags) noexcept { _flags &= ~flags; } //! Returns indentation for the given indentation `group`. - inline uint8_t indentation(FormatIndentationGroup group) const noexcept { return _indentation[group]; } + ASMJIT_INLINE_NODEBUG uint8_t indentation(FormatIndentationGroup group) const noexcept { return _indentation[group]; } //! Sets indentation for the given indentation `group`. - inline void setIndentation(FormatIndentationGroup group, uint32_t n) noexcept { _indentation[group] = uint8_t(n); } + ASMJIT_INLINE_NODEBUG void setIndentation(FormatIndentationGroup group, uint32_t n) noexcept { _indentation[group] = uint8_t(n); } //! Resets indentation for the given indentation `group` to zero. - inline void resetIndentation(FormatIndentationGroup group) noexcept { _indentation[group] = uint8_t(0); } + ASMJIT_INLINE_NODEBUG void resetIndentation(FormatIndentationGroup group) noexcept { _indentation[group] = uint8_t(0); } - //! Returns pading for the given padding `group`. - inline size_t padding(FormatPaddingGroup group) const noexcept { return _padding[group]; } - //! Sets pading for the given padding `group`. - inline void setPadding(FormatPaddingGroup group, size_t n) noexcept { _padding[group] = uint16_t(n); } - //! Resets pading for the given padding `group` to zero, which means that a default padding will be used + //! Returns padding for the given padding `group`. + ASMJIT_INLINE_NODEBUG size_t padding(FormatPaddingGroup group) const noexcept { return _padding[group]; } + //! Sets padding for the given padding `group`. + ASMJIT_INLINE_NODEBUG void setPadding(FormatPaddingGroup group, size_t n) noexcept { _padding[group] = uint16_t(n); } + //! Resets padding for the given padding `group` to zero, which means that a default padding will be used //! based on the target architecture properties. - inline void resetPadding(FormatPaddingGroup group) noexcept { _padding[group] = uint16_t(0); } + ASMJIT_INLINE_NODEBUG void resetPadding(FormatPaddingGroup group) noexcept { _padding[group] = uint16_t(0); } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/func.cpp b/3rdparty/asmjit/src/asmjit/core/func.cpp index 04dc2aaf20866..a8a6d3ab93211 100644 --- a/3rdparty/asmjit/src/asmjit/core/func.cpp +++ b/3rdparty/asmjit/src/asmjit/core/func.cpp @@ -20,8 +20,8 @@ ASMJIT_BEGIN_NAMESPACE -// CallConv - Init & Reset -// ======================= +// CallConv - Initialization & Reset +// ================================= ASMJIT_FAVOR_SIZE Error CallConv::init(CallConvId ccId, const Environment& environment) noexcept { reset(); @@ -75,7 +75,7 @@ ASMJIT_FAVOR_SIZE Error FuncDetail::init(const FuncSignature& signature, const E #if !defined(ASMJIT_NO_AARCH64) if (environment.isFamilyAArch64()) - return a64::FuncInternal::initFuncDetail(*this, signature, registerSize); + return a64::FuncInternal::initFuncDetail(*this, signature); #endif // We should never bubble here as if `cc.init()` succeeded then there has to be an implementation for the current @@ -283,4 +283,18 @@ ASMJIT_FAVOR_SIZE Error FuncArgsAssignment::updateFuncFrame(FuncFrame& frame) co return kErrorOk; } +// Func API - Tests +// ================ + +#if defined(ASMJIT_TEST) +UNIT(func_signature) { + FuncSignature signature; + signature.setRetT(); + signature.addArgT(); + signature.addArg(TypeId::kInt32); + + EXPECT_EQ(signature, FuncSignature::build()); +} +#endif + ASMJIT_END_NAMESPACE diff --git a/3rdparty/asmjit/src/asmjit/core/func.h b/3rdparty/asmjit/src/asmjit/core/func.h index 78a41f98f6566..695a23bbcf0d3 100644 --- a/3rdparty/asmjit/src/asmjit/core/func.h +++ b/3rdparty/asmjit/src/asmjit/core/func.h @@ -28,58 +28,45 @@ ASMJIT_BEGIN_NAMESPACE //! - Target specific - calling conventions that are used by a particular architecture and ABI. For example //! Windows 64-bit calling convention and AMD64 SystemV calling convention. enum class CallConvId : uint8_t { - //! None or invalid (can't be used). - kNone = 0, - // Universal Calling Conventions // ----------------------------- //! Standard function call or explicit `__cdecl` where it can be specified. //! - //! This is a universal calling convention, which is used to initialize specific calling connventions based on + //! This is a universal calling convention, which is used to initialize specific calling conventions based on //! architecture, platform, and its ABI. - kCDecl = 1, + kCDecl = 0, //! `__stdcall` on targets that support this calling convention (X86). //! //! \note This calling convention is only supported on 32-bit X86. If used on environment that doesn't support //! this calling convention it will be replaced by \ref CallConvId::kCDecl. - kStdCall = 2, + kStdCall = 1, //! `__fastcall` on targets that support this calling convention (X86). //! //! \note This calling convention is only supported on 32-bit X86. If used on environment that doesn't support //! this calling convention it will be replaced by \ref CallConvId::kCDecl. - kFastCall = 3, + kFastCall = 2, //! `__vectorcall` on targets that support this calling convention (X86/X64). //! //! \note This calling convention is only supported on 32-bit and 64-bit X86 architecture on Windows platform. //! If used on environment that doesn't support this calling it will be replaced by \ref CallConvId::kCDecl. - kVectorCall = 4, + kVectorCall = 3, //! `__thiscall` on targets that support this calling convention (X86). //! //! \note This calling convention is only supported on 32-bit X86 Windows platform. If used on environment that //! doesn't support this calling convention it will be replaced by \ref CallConvId::kCDecl. - kThisCall = 5, + kThisCall = 4, //! `__attribute__((regparm(1)))` convention (GCC and Clang). - kRegParm1 = 6, + kRegParm1 = 5, //! `__attribute__((regparm(2)))` convention (GCC and Clang). - kRegParm2 = 7, + kRegParm2 = 6, //! `__attribute__((regparm(3)))` convention (GCC and Clang). - kRegParm3 = 8, - - //! Soft-float calling convention (ARM). - //! - //! Floating point arguments are passed via general purpose registers. - kSoftFloat = 9, - - //! Hard-float calling convention (ARM). - //! - //! Floating point arguments are passed via SIMD registers. - kHardFloat = 10, + kRegParm3 = 7, //! AsmJit specific calling convention designed for calling functions inside a multimedia code that don't use many //! registers internally, but are long enough to be called and not inlined. These functions are usually used to @@ -91,28 +78,32 @@ enum class CallConvId : uint8_t { // ABI-Specific Calling Conventions // -------------------------------- + //! Soft-float calling convention (AArch32). + //! + //! Floating point arguments are passed via general purpose registers. + kSoftFloat = 30, + + //! Hard-float calling convention (AArch32). + //! + //! Floating point arguments are passed via SIMD registers. + kHardFloat = 31, + //! X64 System-V calling convention. kX64SystemV = 32, //! X64 Windows calling convention. kX64Windows = 33, //! Maximum value of `CallConvId`. - kMaxValue = kX64Windows, - - // Host Calling Conventions - // ------------------------ - - //! Host calling convention detected at compile-time. - kHost = -#if defined(_DOXYGEN) - DETECTED_AT_COMPILE_TIME -#elif ASMJIT_ARCH_ARM == 32 && defined(__SOFTFP__) - kSoftFloat -#elif ASMJIT_ARCH_ARM == 32 && !defined(__SOFTFP__) - kHardFloat -#else - kCDecl -#endif + kMaxValue = kX64Windows + + // Deprecated Aliases + // ------------------ + +#if !defined(ASMJIT_NO_DEPRECATED) + , + kNone = kCDecl, + kHost = kCDecl +#endif // !ASMJIT_NO_DEPRECATED }; //! Strategy used by calling conventions to assign registers to function arguments. @@ -128,6 +119,8 @@ enum class CallConvStrategy : uint8_t { kX64Windows = 1, //! Windows 64-bit __vectorcall register assignment strategy. kX64VectorCall = 2, + //! Apple's AArch64 calling convention (differs compared to AArch64 calling convention used by Linux). + kAArch64Apple = 3, //! Maximum value of `CallConvStrategy`. kMaxValue = kX64VectorCall @@ -163,14 +156,12 @@ struct CallConv { //! \name Constants //! \{ - enum : uint32_t { - //! Maximum number of register arguments per register group. - //! - //! \note This is not really AsmJit's limitatation, it's just the number that makes sense considering all common - //! calling conventions. Usually even conventions that use registers to pass function arguments are limited to 8 - //! and less arguments passed via registers per group. - kMaxRegArgsPerGroup = 16 - }; + //! Maximum number of register arguments per register group. + //! + //! \note This is not really AsmJit's limitation, it's just the number that makes sense considering all common + //! calling conventions. Usually even conventions that use registers to pass function arguments are limited to 8 + //! and less arguments passed via registers per group. + static constexpr uint32_t kMaxRegArgsPerGroup = 16; //! \} @@ -191,6 +182,11 @@ struct CallConv { //! Natural stack alignment as defined by OS/ABI. uint8_t _naturalStackAlignment; + //! \cond INTERNAL + //! Reserved for future use. + uint8_t _reserved[2]; + //! \endcond + //! Calling convention flags. CallConvFlags _flags; @@ -230,8 +226,8 @@ struct CallConv { //! It's recommended to reset the \ref CallConv struct in case you would like create a custom calling convention //! as it prevents from using an uninitialized data (CallConv doesn't have a constructor that would initialize it, //! it's just a struct). - inline void reset() noexcept { - memset(this, 0, sizeof(*this)); + ASMJIT_INLINE_NODEBUG void reset() noexcept { + *this = CallConv{}; memset(_passedOrder.data(), 0xFF, sizeof(_passedOrder)); } @@ -241,61 +237,61 @@ struct CallConv { //! \{ //! Returns the target architecture of this calling convention. - inline Arch arch() const noexcept { return _arch; } + ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; } //! Sets the target architecture of this calling convention. - inline void setArch(Arch arch) noexcept { _arch = arch; } + ASMJIT_INLINE_NODEBUG void setArch(Arch arch) noexcept { _arch = arch; } //! Returns the calling convention id. - inline CallConvId id() const noexcept { return _id; } + ASMJIT_INLINE_NODEBUG CallConvId id() const noexcept { return _id; } //! Sets the calling convention id. - inline void setId(CallConvId ccId) noexcept { _id = ccId; } + ASMJIT_INLINE_NODEBUG void setId(CallConvId ccId) noexcept { _id = ccId; } //! Returns the strategy used to assign registers to arguments. - inline CallConvStrategy strategy() const noexcept { return _strategy; } + ASMJIT_INLINE_NODEBUG CallConvStrategy strategy() const noexcept { return _strategy; } //! Sets the strategy used to assign registers to arguments. - inline void setStrategy(CallConvStrategy ccStrategy) noexcept { _strategy = ccStrategy; } + ASMJIT_INLINE_NODEBUG void setStrategy(CallConvStrategy ccStrategy) noexcept { _strategy = ccStrategy; } //! Tests whether the calling convention has the given `flag` set. - inline bool hasFlag(CallConvFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(CallConvFlags flag) const noexcept { return Support::test(_flags, flag); } //! Returns the calling convention flags, see `Flags`. - inline CallConvFlags flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG CallConvFlags flags() const noexcept { return _flags; } //! Adds the calling convention flags, see `Flags`. - inline void setFlags(CallConvFlags flag) noexcept { _flags = flag; }; + ASMJIT_INLINE_NODEBUG void setFlags(CallConvFlags flag) noexcept { _flags = flag; }; //! Adds the calling convention flags, see `Flags`. - inline void addFlags(CallConvFlags flags) noexcept { _flags |= flags; }; + ASMJIT_INLINE_NODEBUG void addFlags(CallConvFlags flags) noexcept { _flags |= flags; }; //! Tests whether this calling convention specifies 'RedZone'. - inline bool hasRedZone() const noexcept { return _redZoneSize != 0; } + ASMJIT_INLINE_NODEBUG bool hasRedZone() const noexcept { return _redZoneSize != 0; } //! Tests whether this calling convention specifies 'SpillZone'. - inline bool hasSpillZone() const noexcept { return _spillZoneSize != 0; } + ASMJIT_INLINE_NODEBUG bool hasSpillZone() const noexcept { return _spillZoneSize != 0; } //! Returns size of 'RedZone'. - inline uint32_t redZoneSize() const noexcept { return _redZoneSize; } + ASMJIT_INLINE_NODEBUG uint32_t redZoneSize() const noexcept { return _redZoneSize; } //! Returns size of 'SpillZone'. - inline uint32_t spillZoneSize() const noexcept { return _spillZoneSize; } + ASMJIT_INLINE_NODEBUG uint32_t spillZoneSize() const noexcept { return _spillZoneSize; } //! Sets size of 'RedZone'. - inline void setRedZoneSize(uint32_t size) noexcept { _redZoneSize = uint8_t(size); } + ASMJIT_INLINE_NODEBUG void setRedZoneSize(uint32_t size) noexcept { _redZoneSize = uint8_t(size); } //! Sets size of 'SpillZone'. - inline void setSpillZoneSize(uint32_t size) noexcept { _spillZoneSize = uint8_t(size); } + ASMJIT_INLINE_NODEBUG void setSpillZoneSize(uint32_t size) noexcept { _spillZoneSize = uint8_t(size); } //! Returns a natural stack alignment. - inline uint32_t naturalStackAlignment() const noexcept { return _naturalStackAlignment; } + ASMJIT_INLINE_NODEBUG uint32_t naturalStackAlignment() const noexcept { return _naturalStackAlignment; } //! Sets a natural stack alignment. //! //! This function can be used to override the default stack alignment in case that you know that it's alignment is //! different. For example it allows to implement custom calling conventions that guarantee higher stack alignment. - inline void setNaturalStackAlignment(uint32_t value) noexcept { _naturalStackAlignment = uint8_t(value); } + ASMJIT_INLINE_NODEBUG void setNaturalStackAlignment(uint32_t value) noexcept { _naturalStackAlignment = uint8_t(value); } //! Returns the size of a register (or its part) to be saved and restored of the given `group`. - inline uint32_t saveRestoreRegSize(RegGroup group) const noexcept { return _saveRestoreRegSize[group]; } + ASMJIT_INLINE_NODEBUG uint32_t saveRestoreRegSize(RegGroup group) const noexcept { return _saveRestoreRegSize[group]; } //! Sets the size of a vector register (or its part) to be saved and restored. - inline void setSaveRestoreRegSize(RegGroup group, uint32_t size) noexcept { _saveRestoreRegSize[group] = uint8_t(size); } + ASMJIT_INLINE_NODEBUG void setSaveRestoreRegSize(RegGroup group, uint32_t size) noexcept { _saveRestoreRegSize[group] = uint8_t(size); } //! Returns the alignment of a save-restore area of the given `group`. - inline uint32_t saveRestoreAlignment(RegGroup group) const noexcept { return _saveRestoreAlignment[group]; } + ASMJIT_INLINE_NODEBUG uint32_t saveRestoreAlignment(RegGroup group) const noexcept { return _saveRestoreAlignment[group]; } //! Sets the alignment of a save-restore area of the given `group`. - inline void setSaveRestoreAlignment(RegGroup group, uint32_t alignment) noexcept { _saveRestoreAlignment[group] = uint8_t(alignment); } + ASMJIT_INLINE_NODEBUG void setSaveRestoreAlignment(RegGroup group, uint32_t alignment) noexcept { _saveRestoreAlignment[group] = uint8_t(alignment); } //! Returns the order of passed registers of the given `group`. inline const uint8_t* passedOrder(RegGroup group) const noexcept { @@ -364,16 +360,21 @@ struct CallConv { //! Function signature. //! -//! Contains information about function return type, count of arguments and their TypeIds. Function signature is -//! a low level structure which doesn't contain platform specific or calling convention specific information. +//! Contains information about a function return type, count of arguments, and their TypeIds. Function signature +//! is a low level structure which doesn't contain platform specific or calling convention specific information. +//! It's typically used to describe function arguments in a C-API like form, which is then used to calculate a +//! \ref FuncDetail instance, which then maps function signature into a platform and calling convention specific +//! format. +//! +//! Function signature can be built either dynamically by using \ref addArg() and \ref addArgT() functionality, +//! or dynamically by using a template-based \ref FuncSignature::build() function, which maps template types +//! into a function signature. struct FuncSignature { //! \name Constants //! \{ - enum : uint8_t { - //! Doesn't have variable number of arguments (`...`). - kNoVarArgs = 0xFFu - }; + //! Doesn't have variable number of arguments (`...`). + static constexpr uint8_t kNoVarArgs = 0xFFu; //! \} @@ -381,90 +382,87 @@ struct FuncSignature { //! \{ //! Calling convention id. - CallConvId _ccId; + CallConvId _ccId = CallConvId::kCDecl; //! Count of arguments. - uint8_t _argCount; + uint8_t _argCount = 0; //! Index of a first VA or `kNoVarArgs`. - uint8_t _vaIndex; + uint8_t _vaIndex = kNoVarArgs; //! Return value TypeId. - TypeId _ret; - //! Function arguments TypeIds. - const TypeId* _args; + TypeId _ret = TypeId::kVoid; + //! Reserved for future use. + uint8_t _reserved[4] {}; + //! Function argument TypeIds. + TypeId _args[Globals::kMaxFuncArgs] {}; //! \} - //! \name Initializtion & Reset + //! \name Construction & Destruction //! \{ - //! Initializes the function signature. - inline void init(CallConvId ccId, uint32_t vaIndex, TypeId ret, const TypeId* args, uint32_t argCount) noexcept { - ASMJIT_ASSERT(argCount <= 0xFF); + //! Default constructed function signature, initialized to \ref CallConvId::kCDecl, having no return value and no arguments. + ASMJIT_FORCE_INLINE constexpr FuncSignature() = default; - _ccId = ccId; - _argCount = uint8_t(argCount); - _vaIndex = uint8_t(vaIndex); - _ret = ret; - _args = args; - } + //! Copy constructor, which is initialized to the same function signature as `other`. + ASMJIT_FORCE_INLINE constexpr FuncSignature(const FuncSignature& other) = default; + + //! Initializes the function signature with calling convention id `ccId` and variable argument's index `vaIndex`. + ASMJIT_FORCE_INLINE constexpr FuncSignature(CallConvId ccId, uint32_t vaIndex = kNoVarArgs) noexcept + : _ccId(ccId), + _vaIndex(uint8_t(vaIndex)) {} - inline void reset() noexcept { memset(this, 0, sizeof(*this)); } + //! Initializes the function signature with calling convention id `ccId`, `vaIndex`, return value, and function arguments. + template + ASMJIT_FORCE_INLINE constexpr FuncSignature(CallConvId ccId, uint32_t vaIndex, TypeId ret, Args&&...args) noexcept + : _ccId(ccId), + _argCount(uint8_t(sizeof...(args))), + _vaIndex(uint8_t(vaIndex)), + _ret(ret), + _args{std::forward(args)...} {} + + //! Builds a function signature based on `RetValueAndArgs`. The first template argument is a function return type, + //! and function arguments follow. + //! + //! \note This function returns a new function signature, which can be passed to functions where it's required. It's + //! a convenience function that allows to build function signature statically based on types known at compile time, + //! which is common in JIT code generation. + template + static ASMJIT_INLINE_NODEBUG constexpr FuncSignature build(CallConvId ccId = CallConvId::kCDecl, uint32_t vaIndex = kNoVarArgs) noexcept { + return FuncSignature(ccId, vaIndex, (TypeId(TypeUtils::TypeIdOfT::kTypeId))... ); + } //! \} - //! \name Accessors + //! \name Overloaded Operators //! \{ - //! Returns the calling convention. - inline CallConvId callConvId() const noexcept { return _ccId; } - //! Sets the calling convention to `ccId`; - inline void setCallConvId(CallConvId ccId) noexcept { _ccId = ccId; } + //! Copy assignment - function signature can be copied by value. + ASMJIT_FORCE_INLINE FuncSignature& operator=(const FuncSignature& other) noexcept = default; - //! Tests whether the function has variable number of arguments (...). - inline bool hasVarArgs() const noexcept { return _vaIndex != kNoVarArgs; } - //! Returns the variable arguments (...) index, `kNoVarArgs` if none. - inline uint32_t vaIndex() const noexcept { return _vaIndex; } - //! Sets the variable arguments (...) index to `index`. - inline void setVaIndex(uint32_t index) noexcept { _vaIndex = uint8_t(index); } - //! Resets the variable arguments index (making it a non-va function). - inline void resetVaIndex() noexcept { _vaIndex = kNoVarArgs; } + //! Compares this function signature with `other` for equality.. + ASMJIT_FORCE_INLINE bool operator==(const FuncSignature& other) const noexcept { return equals(other); } + //! Compares this function signature with `other` for inequality.. + ASMJIT_FORCE_INLINE bool operator!=(const FuncSignature& other) const noexcept { return !equals(other); } - //! Returns the number of function arguments. - inline uint32_t argCount() const noexcept { return _argCount; } + //! \} - inline bool hasRet() const noexcept { return _ret != TypeId::kVoid; } - //! Returns the return value type. - inline TypeId ret() const noexcept { return _ret; } + //! \name Initialization & Reset + //! \{ - //! Returns the type of the argument at index `i`. - inline TypeId arg(uint32_t i) const noexcept { - ASMJIT_ASSERT(i < _argCount); - return _args[i]; - } - //! Returns the array of function arguments' types. - inline const TypeId* args() const noexcept { return _args; } + //! Resets this function signature to a default constructed state. + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = FuncSignature{}; } //! \} -}; -template -class FuncSignatureT : public FuncSignature { -public: - inline FuncSignatureT(CallConvId ccId = CallConvId::kHost, uint32_t vaIndex = kNoVarArgs) noexcept { - static constexpr TypeId ret_args[] = { (TypeId(TypeUtils::TypeIdOfT::kTypeId))... }; - init(ccId, vaIndex, ret_args[0], ret_args + 1, uint32_t(ASMJIT_ARRAY_SIZE(ret_args) - 1)); - } -}; - -//! Function signature builder. -class FuncSignatureBuilder : public FuncSignature { -public: - TypeId _builderArgList[Globals::kMaxFuncArgs]; - - //! \name Initializtion & Reset + //! \name Equality & Comparison //! \{ - inline FuncSignatureBuilder(CallConvId ccId = CallConvId::kHost, uint32_t vaIndex = kNoVarArgs) noexcept { - init(ccId, vaIndex, TypeId::kVoid, _builderArgList, 0); + //! Compares this function signature with `other` for equality.. + ASMJIT_INLINE_NODEBUG bool equals(const FuncSignature& other) const noexcept { + return _ccId == other._ccId && + _argCount == other._argCount && + _vaIndex == other._vaIndex && + _ret == other._ret && + memcmp(_args, other._args, sizeof(_args)) == 0; } //! \} @@ -472,33 +470,85 @@ class FuncSignatureBuilder : public FuncSignature { //! \name Accessors //! \{ + //! Returns the calling convention. + ASMJIT_INLINE_NODEBUG CallConvId callConvId() const noexcept { return _ccId; } + //! Sets the calling convention to `ccId`; + ASMJIT_INLINE_NODEBUG void setCallConvId(CallConvId ccId) noexcept { _ccId = ccId; } + + //! Tests whether the function signature has a return value. + ASMJIT_INLINE_NODEBUG bool hasRet() const noexcept { return _ret != TypeId::kVoid; } + //! Returns the type of the return value. + ASMJIT_INLINE_NODEBUG TypeId ret() const noexcept { return _ret; } //! Sets the return type to `retType`. - inline void setRet(TypeId retType) noexcept { _ret = retType; } + ASMJIT_INLINE_NODEBUG void setRet(TypeId retType) noexcept { _ret = retType; } //! Sets the return type based on `T`. template - inline void setRetT() noexcept { setRet(TypeId(TypeUtils::TypeIdOfT::kTypeId)); } + ASMJIT_INLINE_NODEBUG void setRetT() noexcept { setRet(TypeId(TypeUtils::TypeIdOfT::kTypeId)); } + + + //! Returns the array of function arguments' types. + ASMJIT_INLINE_NODEBUG const TypeId* args() const noexcept { return _args; } + //! Returns the number of function arguments. + ASMJIT_INLINE_NODEBUG uint32_t argCount() const noexcept { return _argCount; } + + //! Returns the type of the argument at index `i`. + inline TypeId arg(uint32_t i) const noexcept { + ASMJIT_ASSERT(i < _argCount); + return _args[i]; + } //! Sets the argument at index `index` to `argType`. inline void setArg(uint32_t index, TypeId argType) noexcept { ASMJIT_ASSERT(index < _argCount); - _builderArgList[index] = argType; + _args[index] = argType; } //! Sets the argument at index `i` to the type based on `T`. template inline void setArgT(uint32_t index) noexcept { setArg(index, TypeId(TypeUtils::TypeIdOfT::kTypeId)); } + //! Tests whether an argument can be added to the signature, use before calling \ref addArg() and \ref addArgT(). + //! + //! \note If you know that you are not adding more arguments than \ref Globals::kMaxFuncArgs then it's not necessary + //! to use this function. However, if you are adding arguments based on user input, for example, then either check + //! the number of arguments before using function signature or use \ref canAddArg() before actually adding them to + //! the function signature. + inline bool canAddArg() const noexcept { return _argCount < Globals::kMaxFuncArgs; } + //! Appends an argument of `type` to the function prototype. inline void addArg(TypeId type) noexcept { ASMJIT_ASSERT(_argCount < Globals::kMaxFuncArgs); - _builderArgList[_argCount++] = type; + _args[_argCount++] = type; } + //! Appends an argument of type based on `T` to the function prototype. template inline void addArgT() noexcept { addArg(TypeId(TypeUtils::TypeIdOfT::kTypeId)); } + //! Tests whether the function has variable number of arguments (...). + ASMJIT_INLINE_NODEBUG bool hasVarArgs() const noexcept { return _vaIndex != kNoVarArgs; } + //! Returns the variable arguments (...) index, `kNoVarArgs` if none. + ASMJIT_INLINE_NODEBUG uint32_t vaIndex() const noexcept { return _vaIndex; } + //! Sets the variable arguments (...) index to `index`. + ASMJIT_INLINE_NODEBUG void setVaIndex(uint32_t index) noexcept { _vaIndex = uint8_t(index); } + //! Resets the variable arguments index (making it a non-va function). + ASMJIT_INLINE_NODEBUG void resetVaIndex() noexcept { _vaIndex = kNoVarArgs; } + //! \} }; +#if !defined(ASMJIT_NO_DEPRECATED) +template +class FuncSignatureT : public FuncSignature { +public: + ASMJIT_DEPRECATED("Use FuncSignature::build() instead") + ASMJIT_INLINE_NODEBUG constexpr FuncSignatureT(CallConvId ccId = CallConvId::kCDecl, uint32_t vaIndex = kNoVarArgs) noexcept + : FuncSignature(ccId, vaIndex, (TypeId(TypeUtils::TypeIdOfT::kTypeId))... ) {} +}; + +ASMJIT_DEPRECATED("Use FuncSignature instead of FuncSignatureBuilder") +typedef FuncSignature FuncSignatureBuilder; +#endif // !ASMJIT_NO_DEPRECATED + //! Argument or return value (or its part) as defined by `FuncSignature`, but with register or stack address //! (and other metadata) assigned. struct FuncValue { @@ -533,43 +583,47 @@ struct FuncValue { //! \} - //! \name Initializtion & Reset + //! \name Initialization & Reset //! //! These initialize the whole `FuncValue` to either register or stack. Useful when you know all of these //! properties and wanna just set it up. //! //! \{ - //! Initializes the `typeId` of this `FuncValue`. - inline void initTypeId(TypeId typeId) noexcept { + //! Initializes this `FuncValue` only to the `typeId` provided - the rest of the values will be cleared. + ASMJIT_INLINE_NODEBUG void initTypeId(TypeId typeId) noexcept { _data = uint32_t(typeId) << kTypeIdShift; } - inline void initReg(RegType regType, uint32_t regId, TypeId typeId, uint32_t flags = 0) noexcept { + //! Initializes this `FuncValue` to a register of `regType`, `regId`, and assigns its `typeId` and `flags`. + ASMJIT_INLINE_NODEBUG void initReg(RegType regType, uint32_t regId, TypeId typeId, uint32_t flags = 0) noexcept { _data = (uint32_t(regType) << kRegTypeShift) | (regId << kRegIdShift) | (uint32_t(typeId) << kTypeIdShift) | kFlagIsReg | flags; } - inline void initStack(int32_t offset, TypeId typeId) noexcept { + //! Initializes this `FuncValue` to a stack at the given `offset` and assigns its `typeId`. + ASMJIT_INLINE_NODEBUG void initStack(int32_t offset, TypeId typeId) noexcept { _data = (uint32_t(offset) << kStackOffsetShift) | (uint32_t(typeId) << kTypeIdShift) | kFlagIsStack; } //! Resets the value to its unassigned state. - inline void reset() noexcept { _data = 0; } + ASMJIT_INLINE_NODEBUG void reset() noexcept { _data = 0; } //! \} //! \name Assign //! //! These initialize only part of `FuncValue`, useful when building `FuncValue` incrementally. The caller - //! should first init the type-id by caliing `initTypeId` and then continue building either register or stack. + //! should first init the type-id by calling `initTypeId` and then continue building either register or stack. //! //! \{ + //! Assigns a register of `regType` and `regId`. inline void assignRegData(RegType regType, uint32_t regId) noexcept { ASMJIT_ASSERT((_data & (kRegTypeMask | kRegIdMask)) == 0); _data |= (uint32_t(regType) << kRegTypeShift) | (regId << kRegIdShift) | kFlagIsReg; } + //! Assigns a stack location at `offset`. inline void assignStackOffset(int32_t offset) noexcept { ASMJIT_ASSERT((_data & kStackOffsetMask) == 0); _data |= (uint32_t(offset) << kStackOffsetShift) | kFlagIsStack; @@ -581,52 +635,54 @@ struct FuncValue { //! \{ //! Returns true if the value is initialized (explicit bool cast). - inline explicit operator bool() const noexcept { return _data != 0; } + ASMJIT_INLINE_NODEBUG explicit operator bool() const noexcept { return _data != 0; } - inline void _replaceValue(uint32_t mask, uint32_t value) noexcept { _data = (_data & ~mask) | value; } + //! \cond INTERNAL + ASMJIT_INLINE_NODEBUG void _replaceValue(uint32_t mask, uint32_t value) noexcept { _data = (_data & ~mask) | value; } + //! \endcond //! Tests whether the `FuncValue` has a flag `flag` set. - inline bool hasFlag(uint32_t flag) const noexcept { return Support::test(_data, flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(uint32_t flag) const noexcept { return Support::test(_data, flag); } //! Adds `flags` to `FuncValue`. - inline void addFlags(uint32_t flags) noexcept { _data |= flags; } + ASMJIT_INLINE_NODEBUG void addFlags(uint32_t flags) noexcept { _data |= flags; } //! Clears `flags` of `FuncValue`. - inline void clearFlags(uint32_t flags) noexcept { _data &= ~flags; } + ASMJIT_INLINE_NODEBUG void clearFlags(uint32_t flags) noexcept { _data &= ~flags; } //! Tests whether the value is initialized (i.e. contains a valid data). - inline bool isInitialized() const noexcept { return _data != 0; } + ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _data != 0; } //! Tests whether the argument is passed by register. - inline bool isReg() const noexcept { return hasFlag(kFlagIsReg); } + ASMJIT_INLINE_NODEBUG bool isReg() const noexcept { return hasFlag(kFlagIsReg); } //! Tests whether the argument is passed by stack. - inline bool isStack() const noexcept { return hasFlag(kFlagIsStack); } + ASMJIT_INLINE_NODEBUG bool isStack() const noexcept { return hasFlag(kFlagIsStack); } //! Tests whether the argument is passed by register. - inline bool isAssigned() const noexcept { return hasFlag(kFlagIsReg | kFlagIsStack); } + ASMJIT_INLINE_NODEBUG bool isAssigned() const noexcept { return hasFlag(kFlagIsReg | kFlagIsStack); } //! Tests whether the argument is passed through a pointer (used by WIN64 to pass XMM|YMM|ZMM). - inline bool isIndirect() const noexcept { return hasFlag(kFlagIsIndirect); } + ASMJIT_INLINE_NODEBUG bool isIndirect() const noexcept { return hasFlag(kFlagIsIndirect); } //! Tests whether the argument was already processed (used internally). - inline bool isDone() const noexcept { return hasFlag(kFlagIsDone); } + ASMJIT_INLINE_NODEBUG bool isDone() const noexcept { return hasFlag(kFlagIsDone); } //! Returns a register type of the register used to pass function argument or return value. - inline RegType regType() const noexcept { return RegType((_data & kRegTypeMask) >> kRegTypeShift); } + ASMJIT_INLINE_NODEBUG RegType regType() const noexcept { return RegType((_data & kRegTypeMask) >> kRegTypeShift); } //! Sets a register type of the register used to pass function argument or return value. - inline void setRegType(RegType regType) noexcept { _replaceValue(kRegTypeMask, uint32_t(regType) << kRegTypeShift); } + ASMJIT_INLINE_NODEBUG void setRegType(RegType regType) noexcept { _replaceValue(kRegTypeMask, uint32_t(regType) << kRegTypeShift); } //! Returns a physical id of the register used to pass function argument or return value. - inline uint32_t regId() const noexcept { return (_data & kRegIdMask) >> kRegIdShift; } + ASMJIT_INLINE_NODEBUG uint32_t regId() const noexcept { return (_data & kRegIdMask) >> kRegIdShift; } //! Sets a physical id of the register used to pass function argument or return value. - inline void setRegId(uint32_t regId) noexcept { _replaceValue(kRegIdMask, regId << kRegIdShift); } + ASMJIT_INLINE_NODEBUG void setRegId(uint32_t regId) noexcept { _replaceValue(kRegIdMask, regId << kRegIdShift); } //! Returns a stack offset of this argument. - inline int32_t stackOffset() const noexcept { return int32_t(_data & kStackOffsetMask) >> kStackOffsetShift; } + ASMJIT_INLINE_NODEBUG int32_t stackOffset() const noexcept { return int32_t(_data & kStackOffsetMask) >> kStackOffsetShift; } //! Sets a stack offset of this argument. - inline void setStackOffset(int32_t offset) noexcept { _replaceValue(kStackOffsetMask, uint32_t(offset) << kStackOffsetShift); } + ASMJIT_INLINE_NODEBUG void setStackOffset(int32_t offset) noexcept { _replaceValue(kStackOffsetMask, uint32_t(offset) << kStackOffsetShift); } //! Tests whether the argument or return value has associated `TypeId`. - inline bool hasTypeId() const noexcept { return Support::test(_data, kTypeIdMask); } + ASMJIT_INLINE_NODEBUG bool hasTypeId() const noexcept { return Support::test(_data, kTypeIdMask); } //! Returns a TypeId of this argument or return value. - inline TypeId typeId() const noexcept { return TypeId((_data & kTypeIdMask) >> kTypeIdShift); } + ASMJIT_INLINE_NODEBUG TypeId typeId() const noexcept { return TypeId((_data & kTypeIdMask) >> kTypeIdShift); } //! Sets a TypeId of this argument or return value. - inline void setTypeId(TypeId typeId) noexcept { _replaceValue(kTypeIdMask, uint32_t(typeId) << kTypeIdShift); } + ASMJIT_INLINE_NODEBUG void setTypeId(TypeId typeId) noexcept { _replaceValue(kTypeIdMask, uint32_t(typeId) << kTypeIdShift); } //! \} }; @@ -665,40 +721,52 @@ struct FuncValuePack { return n; } - inline FuncValue* values() noexcept { return _values; } - inline const FuncValue* values() const noexcept { return _values; } + //! Returns values in this value in the pack. + //! + //! \note The returned array has exactly \ref Globals::kMaxValuePack elements. + ASMJIT_INLINE_NODEBUG FuncValue* values() noexcept { return _values; } + //! \overload + ASMJIT_INLINE_NODEBUG const FuncValue* values() const noexcept { return _values; } + //! Resets a value at the given `index` in the pack, which makes it unassigned. inline void resetValue(size_t index) noexcept { ASMJIT_ASSERT(index < Globals::kMaxValuePack); _values[index].reset(); } + //! Tests whether the value at the given `index` in the pack is assigned. inline bool hasValue(size_t index) noexcept { ASMJIT_ASSERT(index < Globals::kMaxValuePack); return _values[index].isInitialized(); } + //! Assigns a register at the given `index` to `reg` and an optional `typeId`. inline void assignReg(size_t index, const BaseReg& reg, TypeId typeId = TypeId::kVoid) noexcept { ASMJIT_ASSERT(index < Globals::kMaxValuePack); ASMJIT_ASSERT(reg.isPhysReg()); _values[index].initReg(reg.type(), reg.id(), typeId); } + //! Assigns a register at the given `index` to `regType`, `regId`, and an optional `typeId`. inline void assignReg(size_t index, RegType regType, uint32_t regId, TypeId typeId = TypeId::kVoid) noexcept { ASMJIT_ASSERT(index < Globals::kMaxValuePack); _values[index].initReg(regType, regId, typeId); } + //! Assigns a stack location at the given `index` to `offset` and an optional `typeId`. inline void assignStack(size_t index, int32_t offset, TypeId typeId = TypeId::kVoid) noexcept { ASMJIT_ASSERT(index < Globals::kMaxValuePack); _values[index].initStack(offset, typeId); } + //! Accesses the value in the pack at the given `index`. + //! + //! \note The maximum index value is `Globals::kMaxValuePack - 1`. inline FuncValue& operator[](size_t index) { ASMJIT_ASSERT(index < Globals::kMaxValuePack); return _values[index]; } - + //! \overload inline const FuncValue& operator[](size_t index) const { ASMJIT_ASSERT(index < Globals::kMaxValuePack); return _values[index]; @@ -721,6 +789,11 @@ enum class FuncAttributes : uint32_t { kHasFuncCalls = 0x00000020u, //! Function has aligned save/restore of vector registers. kAlignedVecSR = 0x00000040u, + //! Function must begin with an instruction that marks a start of a branch or function. + //! + //! * `ENDBR32/ENDBR64` instruction is inserted at the beginning of the function (X86, X86_64). + //! * `BTI` instruction is inserted at the beginning of the function (AArch64) + kIndirectBranchProtection = 0x00000080u, //! FuncFrame is finalized and can be used by prolog/epilog inserter (PEI). kIsFinalized = 0x00000800u, @@ -757,10 +830,8 @@ class FuncDetail { //! \name Constants //! \{ - enum : uint8_t { - //! Doesn't have variable number of arguments (`...`). - kNoVarArgs = 0xFFu - }; + //! Function doesn't have a variable number of arguments (`...`). + static constexpr uint8_t kNoVarArgs = 0xFFu; //! \} @@ -768,33 +839,53 @@ class FuncDetail { //! \{ //! Calling convention. - CallConv _callConv; + CallConv _callConv {}; //! Number of function arguments. - uint8_t _argCount; + uint8_t _argCount = 0; //! Variable arguments index of `kNoVarArgs`. - uint8_t _vaIndex; + uint8_t _vaIndex = 0; //! Reserved for future use. - uint16_t _reserved; + uint16_t _reserved = 0; //! Registers that contain arguments. - Support::Array _usedRegs; + Support::Array _usedRegs {}; //! Size of arguments passed by stack. - uint32_t _argStackSize; + uint32_t _argStackSize = 0; //! Function return value(s). - FuncValuePack _rets; + FuncValuePack _rets {}; //! Function arguments. - FuncValuePack _args[Globals::kMaxFuncArgs]; + FuncValuePack _args[Globals::kMaxFuncArgs] {}; //! \} //! \name Construction & Destruction //! \{ - inline FuncDetail() noexcept { reset(); } - inline FuncDetail(const FuncDetail& other) noexcept = default; + //! Creates a default constructed \ref FuncDetail. + ASMJIT_INLINE_NODEBUG FuncDetail() noexcept {} + + //! Copy constructor. + //! + //! Function details are copyable. + ASMJIT_INLINE_NODEBUG FuncDetail(const FuncDetail& other) noexcept = default; //! Initializes this `FuncDetail` to the given signature. ASMJIT_API Error init(const FuncSignature& signature, const Environment& environment) noexcept; - inline void reset() noexcept { memset(this, 0, sizeof(*this)); } + + //! \} + + //! \name Overloaded Operators + //! \{ + + //! Assignment operator, copies `other` to this \ref FuncDetail. + ASMJIT_INLINE_NODEBUG FuncDetail& operator=(const FuncDetail& other) noexcept = default; + + //! \} + + //! \name Reset + //! \{ + + //! Resets the function detail to its default constructed state. + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = FuncDetail{}; } //! \} @@ -802,32 +893,32 @@ class FuncDetail { //! \{ //! Returns the function's calling convention, see `CallConv`. - inline const CallConv& callConv() const noexcept { return _callConv; } + ASMJIT_INLINE_NODEBUG const CallConv& callConv() const noexcept { return _callConv; } //! Returns the associated calling convention flags, see `CallConv::Flags`. - inline CallConvFlags flags() const noexcept { return _callConv.flags(); } + ASMJIT_INLINE_NODEBUG CallConvFlags flags() const noexcept { return _callConv.flags(); } //! Checks whether a CallConv `flag` is set, see `CallConv::Flags`. - inline bool hasFlag(CallConvFlags ccFlag) const noexcept { return _callConv.hasFlag(ccFlag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(CallConvFlags ccFlag) const noexcept { return _callConv.hasFlag(ccFlag); } //! Tests whether the function has a return value. - inline bool hasRet() const noexcept { return bool(_rets[0]); } + ASMJIT_INLINE_NODEBUG bool hasRet() const noexcept { return bool(_rets[0]); } //! Returns the number of function arguments. - inline uint32_t argCount() const noexcept { return _argCount; } + ASMJIT_INLINE_NODEBUG uint32_t argCount() const noexcept { return _argCount; } //! Returns function return values. - inline FuncValuePack& retPack() noexcept { return _rets; } + ASMJIT_INLINE_NODEBUG FuncValuePack& retPack() noexcept { return _rets; } //! Returns function return values. - inline const FuncValuePack& retPack() const noexcept { return _rets; } + ASMJIT_INLINE_NODEBUG const FuncValuePack& retPack() const noexcept { return _rets; } //! Returns a function return value associated with the given `valueIndex`. - inline FuncValue& ret(size_t valueIndex = 0) noexcept { return _rets[valueIndex]; } + ASMJIT_INLINE_NODEBUG FuncValue& ret(size_t valueIndex = 0) noexcept { return _rets[valueIndex]; } //! Returns a function return value associated with the given `valueIndex` (const). - inline const FuncValue& ret(size_t valueIndex = 0) const noexcept { return _rets[valueIndex]; } + ASMJIT_INLINE_NODEBUG const FuncValue& ret(size_t valueIndex = 0) const noexcept { return _rets[valueIndex]; } //! Returns function argument packs array. - inline FuncValuePack* argPacks() noexcept { return _args; } + ASMJIT_INLINE_NODEBUG FuncValuePack* argPacks() noexcept { return _args; } //! Returns function argument packs array (const). - inline const FuncValuePack* argPacks() const noexcept { return _args; } + ASMJIT_INLINE_NODEBUG const FuncValuePack* argPacks() const noexcept { return _args; } //! Returns function argument pack at the given `argIndex`. inline FuncValuePack& argPack(size_t argIndex) noexcept { @@ -862,26 +953,26 @@ class FuncDetail { } //! Tests whether the function has variable arguments. - inline bool hasVarArgs() const noexcept { return _vaIndex != kNoVarArgs; } + ASMJIT_INLINE_NODEBUG bool hasVarArgs() const noexcept { return _vaIndex != kNoVarArgs; } //! Returns an index of a first variable argument. - inline uint32_t vaIndex() const noexcept { return _vaIndex; } + ASMJIT_INLINE_NODEBUG uint32_t vaIndex() const noexcept { return _vaIndex; } //! Tests whether the function passes one or more argument by stack. - inline bool hasStackArgs() const noexcept { return _argStackSize != 0; } + ASMJIT_INLINE_NODEBUG bool hasStackArgs() const noexcept { return _argStackSize != 0; } //! Returns stack size needed for function arguments passed on the stack. - inline uint32_t argStackSize() const noexcept { return _argStackSize; } + ASMJIT_INLINE_NODEBUG uint32_t argStackSize() const noexcept { return _argStackSize; } //! Returns red zone size. - inline uint32_t redZoneSize() const noexcept { return _callConv.redZoneSize(); } + ASMJIT_INLINE_NODEBUG uint32_t redZoneSize() const noexcept { return _callConv.redZoneSize(); } //! Returns spill zone size. - inline uint32_t spillZoneSize() const noexcept { return _callConv.spillZoneSize(); } + ASMJIT_INLINE_NODEBUG uint32_t spillZoneSize() const noexcept { return _callConv.spillZoneSize(); } //! Returns natural stack alignment. - inline uint32_t naturalStackAlignment() const noexcept { return _callConv.naturalStackAlignment(); } + ASMJIT_INLINE_NODEBUG uint32_t naturalStackAlignment() const noexcept { return _callConv.naturalStackAlignment(); } //! Returns a mask of all passed registers of the given register `group`. - inline RegMask passedRegs(RegGroup group) const noexcept { return _callConv.passedRegs(group); } + ASMJIT_INLINE_NODEBUG RegMask passedRegs(RegGroup group) const noexcept { return _callConv.passedRegs(group); } //! Returns a mask of all preserved registers of the given register `group`. - inline RegMask preservedRegs(RegGroup group) const noexcept { return _callConv.preservedRegs(group); } + ASMJIT_INLINE_NODEBUG RegMask preservedRegs(RegGroup group) const noexcept { return _callConv.preservedRegs(group); } //! Returns a mask of all used registers of the given register `group`. inline RegMask usedRegs(RegGroup group) const noexcept { @@ -901,7 +992,7 @@ class FuncDetail { //! Function frame. //! //! Function frame is used directly by prolog and epilog insertion (PEI) utils. It provides information necessary to -//! insert a proper and ABI comforming prolog and epilog. Function frame calculation is based on `CallConv` and +//! insert a proper and ABI conforming prolog and epilog. Function frame calculation is based on `CallConv` and //! other function attributes. //! //! SSE vs AVX vs AVX-512 @@ -954,87 +1045,98 @@ class FuncFrame { //! \{ //! Function attributes. - FuncAttributes _attributes; + FuncAttributes _attributes {}; //! Target architecture. - Arch _arch; + Arch _arch {}; //! SP register ID (to access call stack and local stack). - uint8_t _spRegId; + uint8_t _spRegId = uint8_t(BaseReg::kIdBad); //! SA register ID (to access stack arguments). - uint8_t _saRegId; + uint8_t _saRegId = uint8_t(BaseReg::kIdBad); //! Red zone size (copied from CallConv). - uint8_t _redZoneSize; + uint8_t _redZoneSize = 0; //! Spill zone size (copied from CallConv). - uint8_t _spillZoneSize; + uint8_t _spillZoneSize = 0; //! Natural stack alignment (copied from CallConv). - uint8_t _naturalStackAlignment; + uint8_t _naturalStackAlignment = 0; //! Minimum stack alignment to turn on dynamic alignment. - uint8_t _minDynamicAlignment; + uint8_t _minDynamicAlignment = 0; //! Call stack alignment. - uint8_t _callStackAlignment; + uint8_t _callStackAlignment = 0; //! Local stack alignment. - uint8_t _localStackAlignment; + uint8_t _localStackAlignment = 0; //! Final stack alignment. - uint8_t _finalStackAlignment; + uint8_t _finalStackAlignment = 0; //! Adjustment of the stack before returning (X86-STDCALL). - uint16_t _calleeStackCleanup; + uint16_t _calleeStackCleanup = 0; //! Call stack size. - uint32_t _callStackSize; + uint32_t _callStackSize = 0; //! Local stack size. - uint32_t _localStackSize; + uint32_t _localStackSize = 0; //! Final stack size (sum of call stack and local stack). - uint32_t _finalStackSize; + uint32_t _finalStackSize = 0; //! Local stack offset (non-zero only if call stack is used). - uint32_t _localStackOffset; + uint32_t _localStackOffset = 0; //! Offset relative to SP that contains previous SP (before alignment). - uint32_t _daOffset; + uint32_t _daOffset = 0; //! Offset of the first stack argument relative to SP. - uint32_t _saOffsetFromSP; + uint32_t _saOffsetFromSP = 0; //! Offset of the first stack argument relative to SA (_saRegId or FP). - uint32_t _saOffsetFromSA; + uint32_t _saOffsetFromSA = 0; //! Local stack adjustment in prolog/epilog. - uint32_t _stackAdjustment; + uint32_t _stackAdjustment = 0; //! Registers that are dirty. - Support::Array _dirtyRegs; + Support::Array _dirtyRegs {}; //! Registers that must be preserved (copied from CallConv). - Support::Array _preservedRegs; + Support::Array _preservedRegs {}; //! Size to save/restore per register group. - Support::Array _saveRestoreRegSize; + Support::Array _saveRestoreRegSize {}; //! Alignment of save/restore area per register group. - Support::Array _saveRestoreAlignment; + Support::Array _saveRestoreAlignment {}; //! Stack size required to save registers with push/pop. - uint16_t _pushPopSaveSize; + uint16_t _pushPopSaveSize = 0; //! Stack size required to save extra registers that cannot use push/pop. - uint16_t _extraRegSaveSize; + uint16_t _extraRegSaveSize = 0; //! Offset where registers saved/restored via push/pop are stored - uint32_t _pushPopSaveOffset; - //! Offset where extra ragisters that cannot use push/pop are stored. - uint32_t _extraRegSaveOffset; + uint32_t _pushPopSaveOffset = 0; + //! Offset where extra registers that cannot use push/pop are stored. + uint32_t _extraRegSaveOffset = 0; //! \} //! \name Construction & Destruction //! \{ - inline FuncFrame() noexcept { reset(); } - inline FuncFrame(const FuncFrame& other) noexcept = default; + //! Creates a default constructed function frame, which has initialized all members to their default values. + ASMJIT_INLINE_NODEBUG FuncFrame() noexcept = default; + //! Creates a copy of `other` function frame. + ASMJIT_INLINE_NODEBUG FuncFrame(const FuncFrame& other) noexcept = default; + //! \} + + //! \name Initialization & Reset + //! \{ + + //! Initializes the function frame based on `func` detail. ASMJIT_API Error init(const FuncDetail& func) noexcept; + //! Resets the function frame into its default constructed state. + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = FuncFrame{}; } - inline void reset() noexcept { - memset(this, 0, sizeof(FuncFrame)); - _spRegId = BaseReg::kIdBad; - _saRegId = BaseReg::kIdBad; - _daOffset = kTagInvalidOffset; - } + //! \} + + //! \name Overloaded Operators + //! \{ + + //! Copy assignment - function frame is copy assignable. + ASMJIT_INLINE_NODEBUG FuncFrame& operator=(const FuncFrame& other) noexcept = default; //! \} @@ -1042,100 +1144,116 @@ class FuncFrame { //! \{ //! Returns the target architecture of the function frame. - inline Arch arch() const noexcept { return _arch; } + ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; } //! Returns function frame attributes, see `Attributes`. - inline FuncAttributes attributes() const noexcept { return _attributes; } + ASMJIT_INLINE_NODEBUG FuncAttributes attributes() const noexcept { return _attributes; } //! Checks whether the FuncFame contains an attribute `attr`. - inline bool hasAttribute(FuncAttributes attr) const noexcept { return Support::test(_attributes, attr); } + ASMJIT_INLINE_NODEBUG bool hasAttribute(FuncAttributes attr) const noexcept { return Support::test(_attributes, attr); } //! Adds attributes `attrs` to the FuncFrame. - inline void addAttributes(FuncAttributes attrs) noexcept { _attributes |= attrs; } + ASMJIT_INLINE_NODEBUG void addAttributes(FuncAttributes attrs) noexcept { _attributes |= attrs; } //! Clears attributes `attrs` from the FrameFrame. - inline void clearAttributes(FuncAttributes attrs) noexcept { _attributes &= ~attrs; } + ASMJIT_INLINE_NODEBUG void clearAttributes(FuncAttributes attrs) noexcept { _attributes &= ~attrs; } //! Tests whether the function has variable number of arguments. - inline bool hasVarArgs() const noexcept { return hasAttribute(FuncAttributes::kHasVarArgs); } + ASMJIT_INLINE_NODEBUG bool hasVarArgs() const noexcept { return hasAttribute(FuncAttributes::kHasVarArgs); } //! Sets the variable arguments flag. - inline void setVarArgs() noexcept { addAttributes(FuncAttributes::kHasVarArgs); } + ASMJIT_INLINE_NODEBUG void setVarArgs() noexcept { addAttributes(FuncAttributes::kHasVarArgs); } //! Resets variable arguments flag. - inline void resetVarArgs() noexcept { clearAttributes(FuncAttributes::kHasVarArgs); } + ASMJIT_INLINE_NODEBUG void resetVarArgs() noexcept { clearAttributes(FuncAttributes::kHasVarArgs); } //! Tests whether the function preserves frame pointer (EBP|ESP on X86). - inline bool hasPreservedFP() const noexcept { return hasAttribute(FuncAttributes::kHasPreservedFP); } + ASMJIT_INLINE_NODEBUG bool hasPreservedFP() const noexcept { return hasAttribute(FuncAttributes::kHasPreservedFP); } //! Enables preserved frame pointer. - inline void setPreservedFP() noexcept { addAttributes(FuncAttributes::kHasPreservedFP); } + ASMJIT_INLINE_NODEBUG void setPreservedFP() noexcept { addAttributes(FuncAttributes::kHasPreservedFP); } //! Disables preserved frame pointer. - inline void resetPreservedFP() noexcept { clearAttributes(FuncAttributes::kHasPreservedFP); } + ASMJIT_INLINE_NODEBUG void resetPreservedFP() noexcept { clearAttributes(FuncAttributes::kHasPreservedFP); } //! Tests whether the function calls other functions. - inline bool hasFuncCalls() const noexcept { return hasAttribute(FuncAttributes::kHasFuncCalls); } - //! Sets `kFlagHasCalls` to true. - inline void setFuncCalls() noexcept { addAttributes(FuncAttributes::kHasFuncCalls); } - //! Sets `kFlagHasCalls` to false. - inline void resetFuncCalls() noexcept { clearAttributes(FuncAttributes::kHasFuncCalls); } + ASMJIT_INLINE_NODEBUG bool hasFuncCalls() const noexcept { return hasAttribute(FuncAttributes::kHasFuncCalls); } + //! Sets `FuncAttributes::kHasFuncCalls` to true. + ASMJIT_INLINE_NODEBUG void setFuncCalls() noexcept { addAttributes(FuncAttributes::kHasFuncCalls); } + //! Sets `FuncAttributes::kHasFuncCalls` to false. + ASMJIT_INLINE_NODEBUG void resetFuncCalls() noexcept { clearAttributes(FuncAttributes::kHasFuncCalls); } + + //! Tests whether the function uses indirect branch protection, see \ref FuncAttributes::kIndirectBranchProtection. + ASMJIT_INLINE_NODEBUG bool hasIndirectBranchProtection() const noexcept { return hasAttribute(FuncAttributes::kIndirectBranchProtection); } + //! Enabled indirect branch protection (sets `FuncAttributes::kIndirectBranchProtection` attribute to true). + ASMJIT_INLINE_NODEBUG void setIndirectBranchProtection() noexcept { addAttributes(FuncAttributes::kIndirectBranchProtection); } + //! Disables indirect branch protection (sets `FuncAttributes::kIndirectBranchProtection` attribute to false). + ASMJIT_INLINE_NODEBUG void resetIndirectBranchProtection() noexcept { clearAttributes(FuncAttributes::kIndirectBranchProtection); } //! Tests whether the function has AVX enabled. - inline bool isAvxEnabled() const noexcept { return hasAttribute(FuncAttributes::kX86_AVXEnabled); } + ASMJIT_INLINE_NODEBUG bool isAvxEnabled() const noexcept { return hasAttribute(FuncAttributes::kX86_AVXEnabled); } //! Enables AVX use. - inline void setAvxEnabled() noexcept { addAttributes(FuncAttributes::kX86_AVXEnabled); } + ASMJIT_INLINE_NODEBUG void setAvxEnabled() noexcept { addAttributes(FuncAttributes::kX86_AVXEnabled); } //! Disables AVX use. - inline void resetAvxEnabled() noexcept { clearAttributes(FuncAttributes::kX86_AVXEnabled); } + ASMJIT_INLINE_NODEBUG void resetAvxEnabled() noexcept { clearAttributes(FuncAttributes::kX86_AVXEnabled); } //! Tests whether the function has AVX-512 enabled. - inline bool isAvx512Enabled() const noexcept { return hasAttribute(FuncAttributes::kX86_AVX512Enabled); } + ASMJIT_INLINE_NODEBUG bool isAvx512Enabled() const noexcept { return hasAttribute(FuncAttributes::kX86_AVX512Enabled); } //! Enables AVX-512 use. - inline void setAvx512Enabled() noexcept { addAttributes(FuncAttributes::kX86_AVX512Enabled); } + ASMJIT_INLINE_NODEBUG void setAvx512Enabled() noexcept { addAttributes(FuncAttributes::kX86_AVX512Enabled); } //! Disables AVX-512 use. - inline void resetAvx512Enabled() noexcept { clearAttributes(FuncAttributes::kX86_AVX512Enabled); } + ASMJIT_INLINE_NODEBUG void resetAvx512Enabled() noexcept { clearAttributes(FuncAttributes::kX86_AVX512Enabled); } //! Tests whether the function has MMX cleanup - 'emms' instruction in epilog. - inline bool hasMmxCleanup() const noexcept { return hasAttribute(FuncAttributes::kX86_MMXCleanup); } + ASMJIT_INLINE_NODEBUG bool hasMmxCleanup() const noexcept { return hasAttribute(FuncAttributes::kX86_MMXCleanup); } //! Enables MMX cleanup. - inline void setMmxCleanup() noexcept { addAttributes(FuncAttributes::kX86_MMXCleanup); } + ASMJIT_INLINE_NODEBUG void setMmxCleanup() noexcept { addAttributes(FuncAttributes::kX86_MMXCleanup); } //! Disables MMX cleanup. - inline void resetMmxCleanup() noexcept { clearAttributes(FuncAttributes::kX86_MMXCleanup); } + ASMJIT_INLINE_NODEBUG void resetMmxCleanup() noexcept { clearAttributes(FuncAttributes::kX86_MMXCleanup); } //! Tests whether the function has AVX cleanup - 'vzeroupper' instruction in epilog. - inline bool hasAvxCleanup() const noexcept { return hasAttribute(FuncAttributes::kX86_AVXCleanup); } + ASMJIT_INLINE_NODEBUG bool hasAvxCleanup() const noexcept { return hasAttribute(FuncAttributes::kX86_AVXCleanup); } //! Enables AVX cleanup. - inline void setAvxCleanup() noexcept { addAttributes(FuncAttributes::kX86_AVXCleanup); } + ASMJIT_INLINE_NODEBUG void setAvxCleanup() noexcept { addAttributes(FuncAttributes::kX86_AVXCleanup); } //! Disables AVX cleanup. - inline void resetAvxCleanup() noexcept { clearAttributes(FuncAttributes::kX86_AVXCleanup); } + ASMJIT_INLINE_NODEBUG void resetAvxCleanup() noexcept { clearAttributes(FuncAttributes::kX86_AVXCleanup); } //! Tests whether the function uses call stack. - inline bool hasCallStack() const noexcept { return _callStackSize != 0; } + ASMJIT_INLINE_NODEBUG bool hasCallStack() const noexcept { return _callStackSize != 0; } //! Tests whether the function uses local stack. - inline bool hasLocalStack() const noexcept { return _localStackSize != 0; } + ASMJIT_INLINE_NODEBUG bool hasLocalStack() const noexcept { return _localStackSize != 0; } //! Tests whether vector registers can be saved and restored by using aligned reads and writes. - inline bool hasAlignedVecSR() const noexcept { return hasAttribute(FuncAttributes::kAlignedVecSR); } + ASMJIT_INLINE_NODEBUG bool hasAlignedVecSR() const noexcept { return hasAttribute(FuncAttributes::kAlignedVecSR); } //! Tests whether the function has to align stack dynamically. - inline bool hasDynamicAlignment() const noexcept { return _finalStackAlignment >= _minDynamicAlignment; } + ASMJIT_INLINE_NODEBUG bool hasDynamicAlignment() const noexcept { return _finalStackAlignment >= _minDynamicAlignment; } //! Tests whether the calling convention specifies 'RedZone'. - inline bool hasRedZone() const noexcept { return _redZoneSize != 0; } + ASMJIT_INLINE_NODEBUG bool hasRedZone() const noexcept { return _redZoneSize != 0; } //! Tests whether the calling convention specifies 'SpillZone'. - inline bool hasSpillZone() const noexcept { return _spillZoneSize != 0; } + ASMJIT_INLINE_NODEBUG bool hasSpillZone() const noexcept { return _spillZoneSize != 0; } //! Returns the size of 'RedZone'. - inline uint32_t redZoneSize() const noexcept { return _redZoneSize; } + ASMJIT_INLINE_NODEBUG uint32_t redZoneSize() const noexcept { return _redZoneSize; } //! Returns the size of 'SpillZone'. - inline uint32_t spillZoneSize() const noexcept { return _spillZoneSize; } + ASMJIT_INLINE_NODEBUG uint32_t spillZoneSize() const noexcept { return _spillZoneSize; } + + //! Resets the size of red zone, which would disable it entirely. + //! + //! \note Red zone is currently only used by an AMD64 SystemV calling convention, which expects 128 + //! bytes of stack to be accessible below stack pointer. These bytes are then accessible within the + //! function and Compiler can use this space as a spill area. However, sometimes it's better to + //! disallow the use of red zone in case that a user wants to use this stack for a custom purpose. + ASMJIT_INLINE_NODEBUG void resetRedZone() noexcept { _redZoneSize = 0; } + //! Returns natural stack alignment (guaranteed stack alignment upon entry). - inline uint32_t naturalStackAlignment() const noexcept { return _naturalStackAlignment; } + ASMJIT_INLINE_NODEBUG uint32_t naturalStackAlignment() const noexcept { return _naturalStackAlignment; } //! Returns natural stack alignment (guaranteed stack alignment upon entry). - inline uint32_t minDynamicAlignment() const noexcept { return _minDynamicAlignment; } + ASMJIT_INLINE_NODEBUG uint32_t minDynamicAlignment() const noexcept { return _minDynamicAlignment; } //! Tests whether the callee must adjust SP before returning (X86-STDCALL only) - inline bool hasCalleeStackCleanup() const noexcept { return _calleeStackCleanup != 0; } + ASMJIT_INLINE_NODEBUG bool hasCalleeStackCleanup() const noexcept { return _calleeStackCleanup != 0; } //! Returns home many bytes of the stack the callee must adjust before returning (X86-STDCALL only) - inline uint32_t calleeStackCleanup() const noexcept { return _calleeStackCleanup; } + ASMJIT_INLINE_NODEBUG uint32_t calleeStackCleanup() const noexcept { return _calleeStackCleanup; } //! Returns call stack alignment. - inline uint32_t callStackAlignment() const noexcept { return _callStackAlignment; } + ASMJIT_INLINE_NODEBUG uint32_t callStackAlignment() const noexcept { return _callStackAlignment; } //! Returns local stack alignment. - inline uint32_t localStackAlignment() const noexcept { return _localStackAlignment; } + ASMJIT_INLINE_NODEBUG uint32_t localStackAlignment() const noexcept { return _localStackAlignment; } //! Returns final stack alignment (the maximum value of call, local, and natural stack alignments). - inline uint32_t finalStackAlignment() const noexcept { return _finalStackAlignment; } + ASMJIT_INLINE_NODEBUG uint32_t finalStackAlignment() const noexcept { return _finalStackAlignment; } //! Sets call stack alignment. //! @@ -1170,38 +1288,38 @@ class FuncFrame { } //! Returns call stack size. - inline uint32_t callStackSize() const noexcept { return _callStackSize; } + ASMJIT_INLINE_NODEBUG uint32_t callStackSize() const noexcept { return _callStackSize; } //! Returns local stack size. - inline uint32_t localStackSize() const noexcept { return _localStackSize; } + ASMJIT_INLINE_NODEBUG uint32_t localStackSize() const noexcept { return _localStackSize; } //! Sets call stack size. - inline void setCallStackSize(uint32_t size) noexcept { _callStackSize = size; } + ASMJIT_INLINE_NODEBUG void setCallStackSize(uint32_t size) noexcept { _callStackSize = size; } //! Sets local stack size. - inline void setLocalStackSize(uint32_t size) noexcept { _localStackSize = size; } + ASMJIT_INLINE_NODEBUG void setLocalStackSize(uint32_t size) noexcept { _localStackSize = size; } //! Combines call stack size with `size`, updating it to the greater value. - inline void updateCallStackSize(uint32_t size) noexcept { _callStackSize = Support::max(_callStackSize, size); } + ASMJIT_INLINE_NODEBUG void updateCallStackSize(uint32_t size) noexcept { _callStackSize = Support::max(_callStackSize, size); } //! Combines local stack size with `size`, updating it to the greater value. - inline void updateLocalStackSize(uint32_t size) noexcept { _localStackSize = Support::max(_localStackSize, size); } + ASMJIT_INLINE_NODEBUG void updateLocalStackSize(uint32_t size) noexcept { _localStackSize = Support::max(_localStackSize, size); } //! Returns final stack size (only valid after the FuncFrame is finalized). - inline uint32_t finalStackSize() const noexcept { return _finalStackSize; } + ASMJIT_INLINE_NODEBUG uint32_t finalStackSize() const noexcept { return _finalStackSize; } //! Returns an offset to access the local stack (non-zero only if call stack is used). - inline uint32_t localStackOffset() const noexcept { return _localStackOffset; } + ASMJIT_INLINE_NODEBUG uint32_t localStackOffset() const noexcept { return _localStackOffset; } //! Tests whether the function prolog/epilog requires a memory slot for storing unaligned SP. - inline bool hasDAOffset() const noexcept { return _daOffset != kTagInvalidOffset; } + ASMJIT_INLINE_NODEBUG bool hasDAOffset() const noexcept { return _daOffset != kTagInvalidOffset; } //! Returns a memory offset used to store DA (dynamic alignment) slot (relative to SP). - inline uint32_t daOffset() const noexcept { return _daOffset; } + ASMJIT_INLINE_NODEBUG uint32_t daOffset() const noexcept { return _daOffset; } - inline uint32_t saOffset(uint32_t regId) const noexcept { + ASMJIT_INLINE_NODEBUG uint32_t saOffset(uint32_t regId) const noexcept { return regId == _spRegId ? saOffsetFromSP() : saOffsetFromSA(); } - inline uint32_t saOffsetFromSP() const noexcept { return _saOffsetFromSP; } - inline uint32_t saOffsetFromSA() const noexcept { return _saOffsetFromSA; } + ASMJIT_INLINE_NODEBUG uint32_t saOffsetFromSP() const noexcept { return _saOffsetFromSP; } + ASMJIT_INLINE_NODEBUG uint32_t saOffsetFromSA() const noexcept { return _saOffsetFromSA; } //! Returns mask of registers of the given register `group` that are modified by the function. The engine would //! then calculate which registers must be saved & restored by the function by using the data provided by the @@ -1239,11 +1357,16 @@ class FuncFrame { addDirtyRegs(std::forward(args)...); } - inline void setAllDirty() noexcept { + //! A helper function to set all registers from all register groups dirty. + //! + //! \note This should not be used in general as it's the most pessimistic case. However, it can be used for testing + //! or in cases in which all registers are considered clobbered. + ASMJIT_INLINE_NODEBUG void setAllDirty() noexcept { for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_dirtyRegs); i++) _dirtyRegs[i] = 0xFFFFFFFFu; } + //! A helper function to set all registers from the given register `group` dirty. inline void setAllDirty(RegGroup group) noexcept { ASMJIT_ASSERT(group <= RegGroup::kMaxVirt); _dirtyRegs[group] = 0xFFFFFFFFu; @@ -1260,12 +1383,13 @@ class FuncFrame { //! Returns the mask of preserved registers of the given register `group`. //! //! Preserved registers are those that must survive the function call unmodified. The function can only modify - //! preserved registers it they are saved and restored in funciton's prolog and epilog, respectively. + //! preserved registers it they are saved and restored in function's prolog and epilog, respectively. inline RegMask preservedRegs(RegGroup group) const noexcept { ASMJIT_ASSERT(group <= RegGroup::kMaxVirt); return _preservedRegs[group]; } + //! Returns the size of a save-restore are for the required register `group`. inline uint32_t saveRestoreRegSize(RegGroup group) const noexcept { ASMJIT_ASSERT(group <= RegGroup::kMaxVirt); return _saveRestoreRegSize[group]; @@ -1276,35 +1400,35 @@ class FuncFrame { return _saveRestoreAlignment[group]; } - inline bool hasSARegId() const noexcept { return _saRegId != BaseReg::kIdBad; } - inline uint32_t saRegId() const noexcept { return _saRegId; } - inline void setSARegId(uint32_t regId) { _saRegId = uint8_t(regId); } - inline void resetSARegId() { setSARegId(BaseReg::kIdBad); } + ASMJIT_INLINE_NODEBUG bool hasSARegId() const noexcept { return _saRegId != BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG uint32_t saRegId() const noexcept { return _saRegId; } + ASMJIT_INLINE_NODEBUG void setSARegId(uint32_t regId) { _saRegId = uint8_t(regId); } + ASMJIT_INLINE_NODEBUG void resetSARegId() { setSARegId(BaseReg::kIdBad); } //! Returns stack size required to save/restore registers via push/pop. - inline uint32_t pushPopSaveSize() const noexcept { return _pushPopSaveSize; } + ASMJIT_INLINE_NODEBUG uint32_t pushPopSaveSize() const noexcept { return _pushPopSaveSize; } //! Returns an offset to the stack where registers are saved via push/pop. - inline uint32_t pushPopSaveOffset() const noexcept { return _pushPopSaveOffset; } + ASMJIT_INLINE_NODEBUG uint32_t pushPopSaveOffset() const noexcept { return _pushPopSaveOffset; } //! Returns stack size required to save/restore extra registers that don't use push/pop/ //! //! \note On X86 this covers all registers except GP registers, on other architectures it can be always //! zero (for example AArch64 saves all registers via push/pop like instructions, so this would be zero). - inline uint32_t extraRegSaveSize() const noexcept { return _extraRegSaveSize; } + ASMJIT_INLINE_NODEBUG uint32_t extraRegSaveSize() const noexcept { return _extraRegSaveSize; } //! Returns an offset to the stack where extra registers are saved. - inline uint32_t extraRegSaveOffset() const noexcept { return _extraRegSaveOffset; } + ASMJIT_INLINE_NODEBUG uint32_t extraRegSaveOffset() const noexcept { return _extraRegSaveOffset; } //! Tests whether the functions contains stack adjustment. - inline bool hasStackAdjustment() const noexcept { return _stackAdjustment != 0; } + ASMJIT_INLINE_NODEBUG bool hasStackAdjustment() const noexcept { return _stackAdjustment != 0; } //! Returns function's stack adjustment used in function's prolog and epilog. //! //! If the returned value is zero it means that the stack is not adjusted. This can mean both that the stack //! is not used and/or the stack is only adjusted by instructions that pust/pop registers into/from stack. - inline uint32_t stackAdjustment() const noexcept { return _stackAdjustment; } + ASMJIT_INLINE_NODEBUG uint32_t stackAdjustment() const noexcept { return _stackAdjustment; } //! \} - //! \name Finaliztion + //! \name Finalization //! \{ ASMJIT_API Error finalize() noexcept; @@ -1320,25 +1444,27 @@ class FuncArgsAssignment { //! \{ //! Function detail. - const FuncDetail* _funcDetail; + const FuncDetail* _funcDetail {}; //! Register that can be used to access arguments passed by stack. - uint8_t _saRegId; + uint8_t _saRegId = uint8_t(BaseReg::kIdBad); //! Reserved for future use. - uint8_t _reserved[3]; + uint8_t _reserved[3] {}; //! Mapping of each function argument. - FuncValuePack _argPacks[Globals::kMaxFuncArgs]; + FuncValuePack _argPacks[Globals::kMaxFuncArgs] {}; //! \} //! \name Construction & Destruction //! \{ - inline explicit FuncArgsAssignment(const FuncDetail* fd = nullptr) noexcept { reset(fd); } + //! Creates either a default initialized `FuncArgsAssignment` or to assignment that links to `fd`, if non-null. + ASMJIT_INLINE_NODEBUG explicit FuncArgsAssignment(const FuncDetail* fd = nullptr) noexcept { reset(fd); } - inline FuncArgsAssignment(const FuncArgsAssignment& other) noexcept { - memcpy(this, &other, sizeof(*this)); - } + //! Copy constructor. + ASMJIT_INLINE_NODEBUG FuncArgsAssignment(const FuncArgsAssignment& other) noexcept = default; + //! Resets this `FuncArgsAssignment` to either default constructed state or to assignment that links to `fd`, + //! if non-null. inline void reset(const FuncDetail* fd = nullptr) noexcept { _funcDetail = fd; _saRegId = uint8_t(BaseReg::kIdBad); @@ -1348,58 +1474,80 @@ class FuncArgsAssignment { //! \} + //! \name Overloaded Operators + //! \{ + + //! Copy assignment. + ASMJIT_INLINE_NODEBUG FuncArgsAssignment& operator=(const FuncArgsAssignment& other) noexcept = default; + + //! \} + //! \name Accessors //! \{ - inline const FuncDetail* funcDetail() const noexcept { return _funcDetail; } - inline void setFuncDetail(const FuncDetail* fd) noexcept { _funcDetail = fd; } + //! Returns the associated \ref FuncDetail of this `FuncArgsAssignment`. + ASMJIT_INLINE_NODEBUG const FuncDetail* funcDetail() const noexcept { return _funcDetail; } + //! Associates \ref FuncDetails with this `FuncArgsAssignment`. + ASMJIT_INLINE_NODEBUG void setFuncDetail(const FuncDetail* fd) noexcept { _funcDetail = fd; } - inline bool hasSARegId() const noexcept { return _saRegId != BaseReg::kIdBad; } - inline uint32_t saRegId() const noexcept { return _saRegId; } - inline void setSARegId(uint32_t regId) { _saRegId = uint8_t(regId); } - inline void resetSARegId() { _saRegId = uint8_t(BaseReg::kIdBad); } + ASMJIT_INLINE_NODEBUG bool hasSARegId() const noexcept { return _saRegId != BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG uint32_t saRegId() const noexcept { return _saRegId; } + ASMJIT_INLINE_NODEBUG void setSARegId(uint32_t regId) { _saRegId = uint8_t(regId); } + ASMJIT_INLINE_NODEBUG void resetSARegId() { _saRegId = uint8_t(BaseReg::kIdBad); } + //! Returns assigned argument at `argIndex` and `valueIndex`. + //! + //! \note `argIndex` refers to he function argument and `valueIndex` refers to a value pack (in case multiple + //! values are passed as a single argument). inline FuncValue& arg(size_t argIndex, size_t valueIndex) noexcept { ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks)); return _argPacks[argIndex][valueIndex]; } + //! \overload inline const FuncValue& arg(size_t argIndex, size_t valueIndex) const noexcept { ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks)); return _argPacks[argIndex][valueIndex]; } + //! Tests whether argument at `argIndex` and `valueIndex` has been assigned. inline bool isAssigned(size_t argIndex, size_t valueIndex) const noexcept { ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks)); return _argPacks[argIndex][valueIndex].isAssigned(); } + //! Assigns register at `argIndex` and value index of 0 to `reg` and an optional `typeId`. inline void assignReg(size_t argIndex, const BaseReg& reg, TypeId typeId = TypeId::kVoid) noexcept { ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks)); ASMJIT_ASSERT(reg.isPhysReg()); _argPacks[argIndex][0].initReg(reg.type(), reg.id(), typeId); } + //! Assigns register at `argIndex` and value index of 0 to `regType`, `regId`, and an optional `typeId`. inline void assignReg(size_t argIndex, RegType regType, uint32_t regId, TypeId typeId = TypeId::kVoid) noexcept { ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks)); _argPacks[argIndex][0].initReg(regType, regId, typeId); } + //! Assigns stack at `argIndex` and value index of 0 to `offset` and an optional `typeId`. inline void assignStack(size_t argIndex, int32_t offset, TypeId typeId = TypeId::kVoid) noexcept { ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks)); _argPacks[argIndex][0].initStack(offset, typeId); } + //! Assigns register at `argIndex` and `valueIndex` to `reg` and an optional `typeId`. inline void assignRegInPack(size_t argIndex, size_t valueIndex, const BaseReg& reg, TypeId typeId = TypeId::kVoid) noexcept { ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks)); ASMJIT_ASSERT(reg.isPhysReg()); _argPacks[argIndex][valueIndex].initReg(reg.type(), reg.id(), typeId); } + //! Assigns register at `argIndex` and `valueIndex` to `regType`, `regId`, and an optional `typeId`. inline void assignRegInPack(size_t argIndex, size_t valueIndex, RegType regType, uint32_t regId, TypeId typeId = TypeId::kVoid) noexcept { ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks)); _argPacks[argIndex][valueIndex].initReg(regType, regId, typeId); } + //! Assigns stack at `argIndex` and `valueIndex` to `offset` and an optional `typeId`. inline void assignStackInPack(size_t argIndex, size_t valueIndex, int32_t offset, TypeId typeId = TypeId::kVoid) noexcept { ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks)); _argPacks[argIndex][valueIndex].initStack(offset, typeId); @@ -1418,6 +1566,9 @@ class FuncArgsAssignment { _assignAllInternal(argIndex + 1, std::forward(args)...); } + //! Assigns all argument at once. + //! + //! \note This function can be only used if the arguments don't contain value packs (multiple values per argument). template inline void assignAll(Args&&... args) noexcept { _assignAllInternal(0, std::forward(args)...); @@ -1430,8 +1581,8 @@ class FuncArgsAssignment { //! Update `FuncFrame` based on function's arguments assignment. //! - //! \note You MUST call this in orher to use `BaseEmitter::emitArgsAssignment()`, otherwise the FuncFrame would - //! not contain the information necessary to assign all arguments into the registers and/or stack specified. + //! \note This function must be called in order to use `BaseEmitter::emitArgsAssignment()`, otherwise the \ref FuncFrame + //! would not contain the information necessary to assign all arguments into the registers and/or stack specified. ASMJIT_API Error updateFuncFrame(FuncFrame& frame) const noexcept; //! \} @@ -1442,4 +1593,3 @@ class FuncArgsAssignment { ASMJIT_END_NAMESPACE #endif // ASMJIT_CORE_FUNC_H_INCLUDED - diff --git a/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp b/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp index 1db50a7082ae4..a6580874089f5 100644 --- a/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp +++ b/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp @@ -102,9 +102,23 @@ ASMJIT_FAVOR_SIZE Error FuncArgsContext::initWorkData(const FuncFrame& frame, co ASMJIT_ASSERT(dstWd != nullptr); dstWd->assign(varId, srcId); - // The best case, register is allocated where it is expected to be. - if (dstId == srcId) - var.markDone(); + // The best case, register is allocated where it is expected to be. However, we should + // not mark this as done if both registers are GP and sign or zero extension is required. + if (dstId == srcId) { + if (dstGroup != RegGroup::kGp) { + var.markDone(); + } + else { + TypeId dt = dst.typeId(); + TypeId st = src.typeId(); + + uint32_t dstSize = TypeUtils::sizeOf(dt); + uint32_t srcSize = TypeUtils::sizeOf(st); + + if (dt == TypeId::kVoid || st == TypeId::kVoid || dstSize <= srcSize) + var.markDone(); + } + } } else { if (ASMJIT_UNLIKELY(srcGroup > RegGroup::kMaxVirt)) diff --git a/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h b/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h index 72ee10585a48c..a8ad6b47dcd34 100644 --- a/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h +++ b/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h @@ -176,14 +176,14 @@ class FuncArgsContext { FuncArgsContext() noexcept; - inline const ArchTraits& archTraits() const noexcept { return *_archTraits; } - inline Arch arch() const noexcept { return _arch; } + ASMJIT_INLINE_NODEBUG const ArchTraits& archTraits() const noexcept { return *_archTraits; } + ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; } - inline uint32_t varCount() const noexcept { return _varCount; } - inline size_t indexOf(const Var* var) const noexcept { return (size_t)(var - _vars); } + ASMJIT_INLINE_NODEBUG uint32_t varCount() const noexcept { return _varCount; } + ASMJIT_INLINE_NODEBUG size_t indexOf(const Var* var) const noexcept { return (size_t)(var - _vars); } - inline Var& var(size_t varId) noexcept { return _vars[varId]; } - inline const Var& var(size_t varId) const noexcept { return _vars[varId]; } + ASMJIT_INLINE_NODEBUG Var& var(size_t varId) noexcept { return _vars[varId]; } + ASMJIT_INLINE_NODEBUG const Var& var(size_t varId) const noexcept { return _vars[varId]; } Error initWorkData(const FuncFrame& frame, const FuncArgsAssignment& args, const RAConstraints* constraints) noexcept; Error markScratchRegs(FuncFrame& frame) noexcept; diff --git a/3rdparty/asmjit/src/asmjit/core/globals.cpp b/3rdparty/asmjit/src/asmjit/core/globals.cpp index 2bbd0c0577d73..4a98431b6d586 100644 --- a/3rdparty/asmjit/src/asmjit/core/globals.cpp +++ b/3rdparty/asmjit/src/asmjit/core/globals.cpp @@ -86,6 +86,8 @@ ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept { "ExpressionLabelNotBound\0" "ExpressionOverflow\0" "FailedToOpenAnonymousMemory\0" + "FailedToOpenFile\0" + "ProtectionFailure\0" "\0"; static const uint16_t sErrorIndex[] = { @@ -93,7 +95,7 @@ ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept { 247, 264, 283, 298, 314, 333, 352, 370, 392, 410, 429, 444, 460, 474, 488, 508, 533, 551, 573, 595, 612, 629, 645, 661, 677, 694, 709, 724, 744, 764, 784, 817, 837, 852, 869, 888, 909, 929, 943, 964, 978, 996, 1012, 1028, 1047, - 1073, 1088, 1104, 1119, 1134, 1164, 1188, 1207, 1235 + 1073, 1088, 1104, 1119, 1134, 1164, 1188, 1207, 1235, 1252, 1270 }; // @EnumStringEnd@ diff --git a/3rdparty/asmjit/src/asmjit/core/globals.h b/3rdparty/asmjit/src/asmjit/core/globals.h index f2d3c6e63df0f..db921cfc6e1c4 100644 --- a/3rdparty/asmjit/src/asmjit/core/globals.h +++ b/3rdparty/asmjit/src/asmjit/core/globals.h @@ -14,9 +14,14 @@ ASMJIT_BEGIN_NAMESPACE //! \addtogroup asmjit_utilities //! \{ namespace Support { - //! Cast designed to cast between function and void* pointers. - template - static inline Dst ptr_cast_impl(Src p) noexcept { return (Dst)p; } + +//! Cast designed to cast between function and void* pointers. +template +static inline Dst ptr_cast_impl(Src p) noexcept { return (Dst)p; } + +//! Helper to implement placement new/delete without relying on `` header. +struct PlacementNew { void* ptr; }; + } // {Support} #if defined(ASMJIT_NO_STDCXX) @@ -25,17 +30,15 @@ namespace Support { ASMJIT_FORCE_INLINE void operatorDelete(void* p) noexcept { if (p) free(p); } } // {Support} -#define ASMJIT_BASE_CLASS(TYPE) \ - ASMJIT_FORCE_INLINE void* operator new(size_t n) noexcept { \ - return Support::operatorNew(n); \ - } \ - \ - ASMJIT_FORCE_INLINE void operator delete(void* p) noexcept { \ - Support::operatorDelete(p); \ - } \ - \ - ASMJIT_FORCE_INLINE void* operator new(size_t, void* p) noexcept { return p; } \ - ASMJIT_FORCE_INLINE void operator delete(void*, void*) noexcept {} +#define ASMJIT_BASE_CLASS(TYPE) \ + ASMJIT_FORCE_INLINE void* operator new(size_t n) noexcept { return Support::operatorNew(n); } \ + ASMJIT_FORCE_INLINE void operator delete(void* ptr) noexcept { Support::operatorDelete(ptr); } \ + \ + ASMJIT_FORCE_INLINE void* operator new(size_t, void* ptr) noexcept { return ptr; } \ + ASMJIT_FORCE_INLINE void operator delete(void*, void*) noexcept {} \ + \ + ASMJIT_FORCE_INLINE void* operator new(size_t, Support::PlacementNew ptr) noexcept { return ptr.ptr; } \ + ASMJIT_FORCE_INLINE void operator delete(void*, Support::PlacementNew) noexcept {} #else #define ASMJIT_BASE_CLASS(TYPE) #endif @@ -93,10 +96,9 @@ static constexpr uint32_t kMaxTreeHeight = (ASMJIT_ARCH_BITS == 32 ? 30 : 61) + static constexpr uint32_t kMaxOpCount = 6; //! Maximum arguments of a function supported by the Compiler / Function API. -static constexpr uint32_t kMaxFuncArgs = 16; +static constexpr uint32_t kMaxFuncArgs = 32; -//! The number of values that can be assigned to a single function argument or -//! return value. +//! The number of values that can be assigned to a single function argument or return value. static constexpr uint32_t kMaxValuePack = 4; //! Maximum number of physical registers AsmJit can use per register group. @@ -129,16 +131,20 @@ static constexpr uint32_t kNumVirtGroups = 4; struct Init_ {}; struct NoInit_ {}; +//! A decorator used to initialize. static const constexpr Init_ Init {}; +//! A decorator used to not initialize. static const constexpr NoInit_ NoInit {}; } // {Globals} +//! Casts a `void*` pointer `func` to a function pointer `Func`. template -static inline Func ptr_as_func(void* func) noexcept { return Support::ptr_cast_impl(func); } +static ASMJIT_INLINE_NODEBUG Func ptr_as_func(void* func) noexcept { return Support::ptr_cast_impl(func); } +//! Casts a function pointer `func` to a void pointer `void*`. template -static inline void* func_as_ptr(Func func) noexcept { return Support::ptr_cast_impl(func); } +static ASMJIT_INLINE_NODEBUG void* func_as_ptr(Func func) noexcept { return Support::ptr_cast_impl(func); } //! \} @@ -175,7 +181,10 @@ enum ErrorCode : uint32_t { //! The object is already initialized. kErrorAlreadyInitialized, - //! Built-in feature was disabled at compile time and it's not available. + //! Either a built-in feature was disabled at compile time and it's not available or the feature is not + //! available on the target platform. + //! + //! For example trying to allocate large pages on unsupported platform would return this error. kErrorFeatureNotEnabled, //! Too many handles (Windows) or file descriptors (Unix/Posix). @@ -320,6 +329,15 @@ enum ErrorCode : uint32_t { //! Failed to open anonymous memory handle or file descriptor. kErrorFailedToOpenAnonymousMemory, + //! Failed to open a file. + //! + //! \note This is a generic error that is used by internal filesystem API. + kErrorFailedToOpenFile, + + //! Protection failure can be returned from a virtual memory allocator or when trying to change memory access + //! permissions. + kErrorProtectionFailure, + // @EnumValuesEnd@ //! Count of AsmJit error codes. @@ -332,7 +350,7 @@ namespace DebugUtils { //! \cond INTERNAL //! Used to silence warnings about unused arguments or variables. template -static inline void unused(Args&&...) noexcept {} +static ASMJIT_INLINE_NODEBUG void unused(Args&&...) noexcept {} //! \endcond //! Returns the error `err` passed. @@ -390,4 +408,14 @@ ASMJIT_API void ASMJIT_NORETURN assertionFailed(const char* file, int line, cons ASMJIT_END_NAMESPACE +//! Implementation of a placement new so we don't have to depend on ``. +ASMJIT_INLINE_NODEBUG void* operator new(size_t, const asmjit::Support::PlacementNew& p) noexcept { +#if defined(_MSC_VER) && !defined(__clang__) + __assume(p.ptr != nullptr); // Otherwise MSVC would emit a nullptr check. +#endif + return p.ptr; +} + +ASMJIT_INLINE_NODEBUG void operator delete(void*, const asmjit::Support::PlacementNew&) noexcept {} + #endif // ASMJIT_CORE_GLOBALS_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/core/inst.cpp b/3rdparty/asmjit/src/asmjit/core/inst.cpp index 8f29d8b7585d2..ade4ae001f281 100644 --- a/3rdparty/asmjit/src/asmjit/core/inst.cpp +++ b/3rdparty/asmjit/src/asmjit/core/inst.cpp @@ -24,12 +24,12 @@ ASMJIT_BEGIN_NAMESPACE Error InstAPI::instIdToString(Arch arch, InstId instId, String& output) noexcept { #if !defined(ASMJIT_NO_X86) if (Environment::isFamilyX86(arch)) - return x86::InstInternal::instIdToString(arch, instId, output); + return x86::InstInternal::instIdToString(instId, output); #endif #if !defined(ASMJIT_NO_AARCH64) if (Environment::isFamilyAArch64(arch)) - return a64::InstInternal::instIdToString(arch, instId, output); + return a64::InstInternal::instIdToString(instId, output); #endif return DebugUtils::errored(kErrorInvalidArch); @@ -38,12 +38,12 @@ Error InstAPI::instIdToString(Arch arch, InstId instId, String& output) noexcept InstId InstAPI::stringToInstId(Arch arch, const char* s, size_t len) noexcept { #if !defined(ASMJIT_NO_X86) if (Environment::isFamilyX86(arch)) - return x86::InstInternal::stringToInstId(arch, s, len); + return x86::InstInternal::stringToInstId(s, len); #endif #if !defined(ASMJIT_NO_AARCH64) if (Environment::isFamilyAArch64(arch)) - return a64::InstInternal::stringToInstId(arch, s, len); + return a64::InstInternal::stringToInstId(s, len); #endif return 0; @@ -56,13 +56,17 @@ InstId InstAPI::stringToInstId(Arch arch, const char* s, size_t len) noexcept { #ifndef ASMJIT_NO_VALIDATION Error InstAPI::validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept { #if !defined(ASMJIT_NO_X86) - if (Environment::isFamilyX86(arch)) - return x86::InstInternal::validate(arch, inst, operands, opCount, validationFlags); + if (Environment::isFamilyX86(arch)) { + if (arch == Arch::kX86) + return x86::InstInternal::validateX86(inst, operands, opCount, validationFlags); + else + return x86::InstInternal::validateX64(inst, operands, opCount, validationFlags); + } #endif #if !defined(ASMJIT_NO_AARCH64) if (Environment::isFamilyAArch64(arch)) - return a64::InstInternal::validate(arch, inst, operands, opCount, validationFlags); + return a64::InstInternal::validate(inst, operands, opCount, validationFlags); #endif return DebugUtils::errored(kErrorInvalidArch); @@ -84,7 +88,7 @@ Error InstAPI::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* oper #if !defined(ASMJIT_NO_AARCH64) if (Environment::isFamilyAArch64(arch)) - return a64::InstInternal::queryRWInfo(arch, inst, operands, opCount, out); + return a64::InstInternal::queryRWInfo(inst, operands, opCount, out); #endif return DebugUtils::errored(kErrorInvalidArch); @@ -103,7 +107,7 @@ Error InstAPI::queryFeatures(Arch arch, const BaseInst& inst, const Operand_* op #if !defined(ASMJIT_NO_AARCH64) if (Environment::isFamilyAArch64(arch)) - return a64::InstInternal::queryFeatures(arch, inst, operands, opCount, out); + return a64::InstInternal::queryFeatures(inst, operands, opCount, out); #endif return DebugUtils::errored(kErrorInvalidArch); diff --git a/3rdparty/asmjit/src/asmjit/core/inst.h b/3rdparty/asmjit/src/asmjit/core/inst.h index 643678971a7b1..a653fe8e4ccfc 100644 --- a/3rdparty/asmjit/src/asmjit/core/inst.h +++ b/3rdparty/asmjit/src/asmjit/core/inst.h @@ -20,7 +20,7 @@ ASMJIT_BEGIN_NAMESPACE //! //! Each architecture has a set of valid instructions indexed from 0. Instruction with 0 id is, however, a special //! instruction that describes a "no instruction" or "invalid instruction". Different architectures can assign a. -//! different instruction to the same id, each architecture typicall has its own instructions indexed from 1. +//! different instruction to the same id, each architecture typically has its own instructions indexed from 1. //! //! Instruction identifiers listed by architecture: //! @@ -189,7 +189,7 @@ enum class InstControlFlow : uint32_t { //! Hint that is used when both input operands to the instruction are the same. //! -//! Provides hints to the instrution RW query regarding special cases in which two or more operands are the same +//! Provides hints to the instruction RW query regarding special cases in which two or more operands are the same //! registers. This is required by instructions such as XOR, AND, OR, SUB, etc... These hints will influence the //! RW operations query. enum class InstSameRegHint : uint8_t { @@ -231,17 +231,17 @@ class BaseInst { //! //! Default values of `id` and `options` are zero, which means 'none' instruction. Such instruction is guaranteed //! to never exist for any architecture supported by AsmJit. - inline explicit BaseInst(InstId instId = 0, InstOptions options = InstOptions::kNone) noexcept + ASMJIT_INLINE_NODEBUG explicit BaseInst(InstId instId = 0, InstOptions options = InstOptions::kNone) noexcept : _id(instId), _options(options), _extraReg() {} - inline BaseInst(InstId instId, InstOptions options, const RegOnly& extraReg) noexcept + ASMJIT_INLINE_NODEBUG BaseInst(InstId instId, InstOptions options, const RegOnly& extraReg) noexcept : _id(instId), _options(options), _extraReg(extraReg) {} - inline BaseInst(InstId instId, InstOptions options, const BaseReg& extraReg) noexcept + ASMJIT_INLINE_NODEBUG BaseInst(InstId instId, InstOptions options, const BaseReg& extraReg) noexcept : _id(instId), _options(options), _extraReg { extraReg.signature(), extraReg.id() } {} @@ -252,22 +252,22 @@ class BaseInst { //! \{ //! Returns the instruction id with modifiers. - inline InstId id() const noexcept { return _id; } + ASMJIT_INLINE_NODEBUG InstId id() const noexcept { return _id; } //! Sets the instruction id and modiiers from `id`. - inline void setId(InstId id) noexcept { _id = id; } + ASMJIT_INLINE_NODEBUG void setId(InstId id) noexcept { _id = id; } //! Resets the instruction id and modifiers to zero, see \ref kIdNone. - inline void resetId() noexcept { _id = 0; } + ASMJIT_INLINE_NODEBUG void resetId() noexcept { _id = 0; } //! Returns a real instruction id that doesn't contain any modifiers. - inline InstId realId() const noexcept { return _id & uint32_t(InstIdParts::kRealId); } + ASMJIT_INLINE_NODEBUG InstId realId() const noexcept { return _id & uint32_t(InstIdParts::kRealId); } template - inline uint32_t getInstIdPart() const noexcept { + ASMJIT_INLINE_NODEBUG uint32_t getInstIdPart() const noexcept { return (uint32_t(_id) & uint32_t(kPart)) >> Support::ConstCTZ::value; } template - inline void setInstIdPart(uint32_t value) noexcept { + ASMJIT_INLINE_NODEBUG void setInstIdPart(uint32_t value) noexcept { _id = (_id & ~uint32_t(kPart)) | (value << Support::ConstCTZ::value); } @@ -276,47 +276,61 @@ class BaseInst { //! \name Instruction Options //! \{ - inline InstOptions options() const noexcept { return _options; } - inline bool hasOption(InstOptions option) const noexcept { return Support::test(_options, option); } - inline void setOptions(InstOptions options) noexcept { _options = options; } - inline void addOptions(InstOptions options) noexcept { _options |= options; } - inline void clearOptions(InstOptions options) noexcept { _options &= ~options; } - inline void resetOptions() noexcept { _options = InstOptions::kNone; } + ASMJIT_INLINE_NODEBUG InstOptions options() const noexcept { return _options; } + ASMJIT_INLINE_NODEBUG bool hasOption(InstOptions option) const noexcept { return Support::test(_options, option); } + ASMJIT_INLINE_NODEBUG void setOptions(InstOptions options) noexcept { _options = options; } + ASMJIT_INLINE_NODEBUG void addOptions(InstOptions options) noexcept { _options |= options; } + ASMJIT_INLINE_NODEBUG void clearOptions(InstOptions options) noexcept { _options &= ~options; } + ASMJIT_INLINE_NODEBUG void resetOptions() noexcept { _options = InstOptions::kNone; } //! \} //! \name Extra Register //! \{ - inline bool hasExtraReg() const noexcept { return _extraReg.isReg(); } - inline RegOnly& extraReg() noexcept { return _extraReg; } - inline const RegOnly& extraReg() const noexcept { return _extraReg; } - inline void setExtraReg(const BaseReg& reg) noexcept { _extraReg.init(reg); } - inline void setExtraReg(const RegOnly& reg) noexcept { _extraReg.init(reg); } - inline void resetExtraReg() noexcept { _extraReg.reset(); } + ASMJIT_INLINE_NODEBUG bool hasExtraReg() const noexcept { return _extraReg.isReg(); } + ASMJIT_INLINE_NODEBUG RegOnly& extraReg() noexcept { return _extraReg; } + ASMJIT_INLINE_NODEBUG const RegOnly& extraReg() const noexcept { return _extraReg; } + ASMJIT_INLINE_NODEBUG void setExtraReg(const BaseReg& reg) noexcept { _extraReg.init(reg); } + ASMJIT_INLINE_NODEBUG void setExtraReg(const RegOnly& reg) noexcept { _extraReg.init(reg); } + ASMJIT_INLINE_NODEBUG void resetExtraReg() noexcept { _extraReg.reset(); } //! \} //! \name ARM Specific //! \{ - inline arm::CondCode armCondCode() const noexcept { return (arm::CondCode)getInstIdPart(); } - inline void setArmCondCode(arm::CondCode cc) noexcept { setInstIdPart(uint32_t(cc)); } + ASMJIT_INLINE_NODEBUG arm::CondCode armCondCode() const noexcept { return (arm::CondCode)getInstIdPart(); } + ASMJIT_INLINE_NODEBUG void setArmCondCode(arm::CondCode cc) noexcept { setInstIdPart(uint32_t(cc)); } + + ASMJIT_INLINE_NODEBUG a32::DataType armDt() const noexcept { return (a32::DataType)getInstIdPart(); } + ASMJIT_INLINE_NODEBUG a32::DataType armDt2() const noexcept { return (a32::DataType)getInstIdPart(); } //! \} //! \name Statics //! \{ - static inline constexpr InstId composeARMInstId(uint32_t id, arm::CondCode cc) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr InstId composeARMInstId(uint32_t id, arm::CondCode cc) noexcept { return id | (uint32_t(cc) << Support::ConstCTZ::value); } - static inline constexpr InstId extractRealId(uint32_t id) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr InstId composeARMInstId(uint32_t id, a32::DataType dt, arm::CondCode cc = arm::CondCode::kAL) noexcept { + return id | (uint32_t(dt) << Support::ConstCTZ::value) + | (uint32_t(cc) << Support::ConstCTZ::value); + } + + static ASMJIT_INLINE_NODEBUG constexpr InstId composeARMInstId(uint32_t id, a32::DataType dt, a32::DataType dt2, arm::CondCode cc = arm::CondCode::kAL) noexcept { + return id | (uint32_t(dt) << Support::ConstCTZ::value) + | (uint32_t(dt2) << Support::ConstCTZ::value) + | (uint32_t(cc) << Support::ConstCTZ::value); + } + + static ASMJIT_INLINE_NODEBUG constexpr InstId extractRealId(uint32_t id) noexcept { return id & uint32_t(InstIdParts::kRealId); } - static inline constexpr arm::CondCode extractARMCondCode(uint32_t id) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr arm::CondCode extractARMCondCode(uint32_t id) noexcept { return (arm::CondCode)((uint32_t(id) & uint32_t(InstIdParts::kARM_Cond)) >> Support::ConstCTZ::value); } @@ -333,16 +347,16 @@ enum class CpuRWFlags : uint32_t { // Common RW Flags (0x000000FF) // ---------------------------- - //! Carry flag. - kCF = 0x00000001u, //! Signed overflow flag. - kOF = 0x00000002u, - //! Sign flag (negative/sign, if set). - kSF = 0x00000004u, + kOF = 0x00000001u, + //! Carry flag. + kCF = 0x00000002u, //! Zero and/or equality flag (1 if zero/equal). - kZF = 0x00000008u, + kZF = 0x00000004u, + //! Sign flag (negative/sign, if set). + kSF = 0x00000008u, - // X86 Specific RW Flags (0xFFFFFF00) + // X86 Specific RW Flags // ---------------------------------- //! Carry flag (X86, X86_64). @@ -373,12 +387,22 @@ enum class CpuRWFlags : uint32_t { //! FPU C2 status flag (X86, X86_64). kX86_C2 = 0x00040000u, //! FPU C3 status flag (X86, X86_64). - kX86_C3 = 0x00080000u + kX86_C3 = 0x00080000u, + + // ARM Specific RW Flags + // ---------------------------------- + + kARM_V = kOF, + kARM_C = kCF, + kARM_Z = kZF, + kARM_N = kSF, + kARM_Q = 0x00000100u, + kARM_GE = 0x00000200u }; ASMJIT_DEFINE_ENUM_FLAGS(CpuRWFlags) //! Operand read/write flags describe how the operand is accessed and some additional features. -enum class OpRWFlags { +enum class OpRWFlags : uint32_t { //! No flags. kNone = 0, @@ -406,6 +430,9 @@ enum class OpRWFlags { //! The `extendByteMask()` represents a zero extension. kZExt = 0x00000010u, + //! The register must have assigned a unique physical ID, which cannot be assigned to any other register. + kUnique = 0x00000080u, + //! Register operand must use \ref OpRWInfo::physId(). kRegPhysId = 0x00000100u, //! Base register of a memory operand must use \ref OpRWInfo::physId(). @@ -474,7 +501,7 @@ struct OpRWInfo { //! \{ //! Resets this operand information to all zeros. - inline void reset() noexcept { memset(this, 0, sizeof(*this)); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = OpRWInfo{}; } //! Resets this operand info (resets all members) and set common information //! to the given `opFlags`, `regSize`, and possibly `physId`. @@ -485,13 +512,14 @@ struct OpRWInfo { _consecutiveLeadCount = 0; _resetReserved(); - uint64_t mask = Support::lsbMask(regSize); + uint64_t mask = Support::lsbMask(Support::min(regSize, 64)); + _readByteMask = Support::test(opFlags, OpRWFlags::kRead) ? mask : uint64_t(0); _writeByteMask = Support::test(opFlags, OpRWFlags::kWrite) ? mask : uint64_t(0); _extendByteMask = 0; } - inline void _resetReserved() noexcept { + ASMJIT_INLINE_NODEBUG void _resetReserved() noexcept { _reserved[0] = 0; } @@ -501,36 +529,40 @@ struct OpRWInfo { //! \{ //! Returns operand flags. - inline OpRWFlags opFlags() const noexcept { return _opFlags; } + ASMJIT_INLINE_NODEBUG OpRWFlags opFlags() const noexcept { return _opFlags; } //! Tests whether operand flags contain the given `flag`. - inline bool hasOpFlag(OpRWFlags flag) const noexcept { return Support::test(_opFlags, flag); } + ASMJIT_INLINE_NODEBUG bool hasOpFlag(OpRWFlags flag) const noexcept { return Support::test(_opFlags, flag); } //! Adds the given `flags` to operand flags. - inline void addOpFlags(OpRWFlags flags) noexcept { _opFlags |= flags; } + ASMJIT_INLINE_NODEBUG void addOpFlags(OpRWFlags flags) noexcept { _opFlags |= flags; } //! Removes the given `flags` from operand flags. - inline void clearOpFlags(OpRWFlags flags) noexcept { _opFlags &= ~flags; } + ASMJIT_INLINE_NODEBUG void clearOpFlags(OpRWFlags flags) noexcept { _opFlags &= ~flags; } //! Tests whether this operand is read from. - inline bool isRead() const noexcept { return hasOpFlag(OpRWFlags::kRead); } + ASMJIT_INLINE_NODEBUG bool isRead() const noexcept { return hasOpFlag(OpRWFlags::kRead); } //! Tests whether this operand is written to. - inline bool isWrite() const noexcept { return hasOpFlag(OpRWFlags::kWrite); } + ASMJIT_INLINE_NODEBUG bool isWrite() const noexcept { return hasOpFlag(OpRWFlags::kWrite); } //! Tests whether this operand is both read and write. - inline bool isReadWrite() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kRW; } + ASMJIT_INLINE_NODEBUG bool isReadWrite() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kRW; } //! Tests whether this operand is read only. - inline bool isReadOnly() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kRead; } + ASMJIT_INLINE_NODEBUG bool isReadOnly() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kRead; } //! Tests whether this operand is write only. - inline bool isWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kWrite; } + ASMJIT_INLINE_NODEBUG bool isWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kWrite; } //! Returns the type of a lead register, which is followed by consecutive registers. - inline uint32_t consecutiveLeadCount() const noexcept { return _consecutiveLeadCount; } + ASMJIT_INLINE_NODEBUG uint32_t consecutiveLeadCount() const noexcept { return _consecutiveLeadCount; } //! Tests whether this operand is Reg/Mem //! //! Reg/Mem operands can use either register or memory. - inline bool isRm() const noexcept { return hasOpFlag(OpRWFlags::kRegMem); } + ASMJIT_INLINE_NODEBUG bool isRm() const noexcept { return hasOpFlag(OpRWFlags::kRegMem); } //! Tests whether the operand will be zero extended. - inline bool isZExt() const noexcept { return hasOpFlag(OpRWFlags::kZExt); } + ASMJIT_INLINE_NODEBUG bool isZExt() const noexcept { return hasOpFlag(OpRWFlags::kZExt); } + + //! Tests whether the operand must have allocated a unique physical id that cannot be shared with other register + //! operands. + ASMJIT_INLINE_NODEBUG bool isUnique() const noexcept { return hasOpFlag(OpRWFlags::kUnique); } //! \} @@ -539,38 +571,38 @@ struct OpRWInfo { //! Tests whether this is a fake memory operand, which is only used, because of encoding. Fake memory operands do //! not access any memory, they are only used to encode registers. - inline bool isMemFake() const noexcept { return hasOpFlag(OpRWFlags::kMemFake); } + ASMJIT_INLINE_NODEBUG bool isMemFake() const noexcept { return hasOpFlag(OpRWFlags::kMemFake); } //! Tests whether the instruction's memory BASE register is used. - inline bool isMemBaseUsed() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseRW); } + ASMJIT_INLINE_NODEBUG bool isMemBaseUsed() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseRW); } //! Tests whether the instruction reads from its BASE registers. - inline bool isMemBaseRead() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseRead); } + ASMJIT_INLINE_NODEBUG bool isMemBaseRead() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseRead); } //! Tests whether the instruction writes to its BASE registers. - inline bool isMemBaseWrite() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseWrite); } + ASMJIT_INLINE_NODEBUG bool isMemBaseWrite() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseWrite); } //! Tests whether the instruction reads and writes from/to its BASE registers. - inline bool isMemBaseReadWrite() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRW; } + ASMJIT_INLINE_NODEBUG bool isMemBaseReadWrite() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRW; } //! Tests whether the instruction only reads from its BASE registers. - inline bool isMemBaseReadOnly() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRead; } + ASMJIT_INLINE_NODEBUG bool isMemBaseReadOnly() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRead; } //! Tests whether the instruction only writes to its BASE registers. - inline bool isMemBaseWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseWrite; } + ASMJIT_INLINE_NODEBUG bool isMemBaseWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseWrite; } //! Tests whether the instruction modifies the BASE register before it uses it to calculate the target address. - inline bool isMemBasePreModify() const noexcept { return hasOpFlag(OpRWFlags::kMemBasePreModify); } + ASMJIT_INLINE_NODEBUG bool isMemBasePreModify() const noexcept { return hasOpFlag(OpRWFlags::kMemBasePreModify); } //! Tests whether the instruction modifies the BASE register after it uses it to calculate the target address. - inline bool isMemBasePostModify() const noexcept { return hasOpFlag(OpRWFlags::kMemBasePostModify); } + ASMJIT_INLINE_NODEBUG bool isMemBasePostModify() const noexcept { return hasOpFlag(OpRWFlags::kMemBasePostModify); } //! Tests whether the instruction's memory INDEX register is used. - inline bool isMemIndexUsed() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexRW); } + ASMJIT_INLINE_NODEBUG bool isMemIndexUsed() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexRW); } //! Tests whether the instruction reads the INDEX registers. - inline bool isMemIndexRead() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexRead); } + ASMJIT_INLINE_NODEBUG bool isMemIndexRead() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexRead); } //! Tests whether the instruction writes to its INDEX registers. - inline bool isMemIndexWrite() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexWrite); } + ASMJIT_INLINE_NODEBUG bool isMemIndexWrite() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexWrite); } //! Tests whether the instruction reads and writes from/to its INDEX registers. - inline bool isMemIndexReadWrite() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRW; } + ASMJIT_INLINE_NODEBUG bool isMemIndexReadWrite() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRW; } //! Tests whether the instruction only reads from its INDEX registers. - inline bool isMemIndexReadOnly() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRead; } + ASMJIT_INLINE_NODEBUG bool isMemIndexReadOnly() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRead; } //! Tests whether the instruction only writes to its INDEX registers. - inline bool isMemIndexWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexWrite; } + ASMJIT_INLINE_NODEBUG bool isMemIndexWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexWrite; } //! \} @@ -580,11 +612,11 @@ struct OpRWInfo { //! Returns a physical id of the register that is fixed for this operand. //! //! Returns \ref BaseReg::kIdBad if any register can be used. - inline uint32_t physId() const noexcept { return _physId; } + ASMJIT_INLINE_NODEBUG uint32_t physId() const noexcept { return _physId; } //! Tests whether \ref physId() would return a valid physical register id. - inline bool hasPhysId() const noexcept { return _physId != BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG bool hasPhysId() const noexcept { return _physId != BaseReg::kIdBad; } //! Sets physical register id, which would be fixed for this operand. - inline void setPhysId(uint32_t physId) noexcept { _physId = uint8_t(physId); } + ASMJIT_INLINE_NODEBUG void setPhysId(uint32_t physId) noexcept { _physId = uint8_t(physId); } //! \} @@ -592,9 +624,9 @@ struct OpRWInfo { //! \{ //! Returns Reg/Mem size of the operand. - inline uint32_t rmSize() const noexcept { return _rmSize; } + ASMJIT_INLINE_NODEBUG uint32_t rmSize() const noexcept { return _rmSize; } //! Sets Reg/Mem size of the operand. - inline void setRmSize(uint32_t rmSize) noexcept { _rmSize = uint8_t(rmSize); } + ASMJIT_INLINE_NODEBUG void setRmSize(uint32_t rmSize) noexcept { _rmSize = uint8_t(rmSize); } //! \} @@ -602,18 +634,18 @@ struct OpRWInfo { //! \{ //! Returns read mask. - inline uint64_t readByteMask() const noexcept { return _readByteMask; } + ASMJIT_INLINE_NODEBUG uint64_t readByteMask() const noexcept { return _readByteMask; } //! Returns write mask. - inline uint64_t writeByteMask() const noexcept { return _writeByteMask; } + ASMJIT_INLINE_NODEBUG uint64_t writeByteMask() const noexcept { return _writeByteMask; } //! Returns extend mask. - inline uint64_t extendByteMask() const noexcept { return _extendByteMask; } + ASMJIT_INLINE_NODEBUG uint64_t extendByteMask() const noexcept { return _extendByteMask; } //! Sets read mask. - inline void setReadByteMask(uint64_t mask) noexcept { _readByteMask = mask; } + ASMJIT_INLINE_NODEBUG void setReadByteMask(uint64_t mask) noexcept { _readByteMask = mask; } //! Sets write mask. - inline void setWriteByteMask(uint64_t mask) noexcept { _writeByteMask = mask; } - //! Sets externd mask. - inline void setExtendByteMask(uint64_t mask) noexcept { _extendByteMask = mask; } + ASMJIT_INLINE_NODEBUG void setWriteByteMask(uint64_t mask) noexcept { _writeByteMask = mask; } + //! Sets extend mask. + ASMJIT_INLINE_NODEBUG void setExtendByteMask(uint64_t mask) noexcept { _extendByteMask = mask; } //! \} }; @@ -647,7 +679,7 @@ struct InstRWInfo { uint8_t _rmFeature; //! Reserved for future use. uint8_t _reserved[18]; - //! Read/Write onfo of extra register (rep{} or kz{}). + //! Read/Write info of extra register (rep{} or kz{}). OpRWInfo _extraReg; //! Read/Write info of instruction operands. OpRWInfo _operands[Globals::kMaxOpCount]; @@ -658,7 +690,7 @@ struct InstRWInfo { //! \{ //! Resets this RW information to all zeros. - inline void reset() noexcept { memset(this, 0, sizeof(*this)); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = InstRWInfo{}; } //! \} @@ -666,13 +698,13 @@ struct InstRWInfo { //! \{ //! Returns flags associated with the instruction, see \ref InstRWFlags. - inline InstRWFlags instFlags() const noexcept { return _instFlags; } + ASMJIT_INLINE_NODEBUG InstRWFlags instFlags() const noexcept { return _instFlags; } //! Tests whether the instruction flags contain `flag`. - inline bool hasInstFlag(InstRWFlags flag) const noexcept { return Support::test(_instFlags, flag); } + ASMJIT_INLINE_NODEBUG bool hasInstFlag(InstRWFlags flag) const noexcept { return Support::test(_instFlags, flag); } //! Tests whether the instruction flags contain \ref InstRWFlags::kMovOp. - inline bool isMovOp() const noexcept { return hasInstFlag(InstRWFlags::kMovOp); } + ASMJIT_INLINE_NODEBUG bool isMovOp() const noexcept { return hasInstFlag(InstRWFlags::kMovOp); } //! \} @@ -680,9 +712,9 @@ struct InstRWInfo { //! \{ //! Returns a mask of CPU flags read. - inline CpuRWFlags readFlags() const noexcept { return _readFlags; } + ASMJIT_INLINE_NODEBUG CpuRWFlags readFlags() const noexcept { return _readFlags; } //! Returns a mask of CPU flags written. - inline CpuRWFlags writeFlags() const noexcept { return _writeFlags; } + ASMJIT_INLINE_NODEBUG CpuRWFlags writeFlags() const noexcept { return _writeFlags; } //! \} @@ -699,7 +731,7 @@ struct InstRWInfo { //! Some AVX+ instructions may require extra features for replacing registers with memory operands, for example //! VPSLLDQ instruction only supports `vpslldq reg, reg, imm` combination on AVX/AVX2 capable CPUs and requires //! AVX-512 for `vpslldq reg, mem, imm` combination. - inline uint32_t rmFeature() const noexcept { return _rmFeature; } + ASMJIT_INLINE_NODEBUG uint32_t rmFeature() const noexcept { return _rmFeature; } //! \} @@ -707,10 +739,10 @@ struct InstRWInfo { //! \{ //! Returns RW information of extra register operand (extraReg). - inline const OpRWInfo& extraReg() const noexcept { return _extraReg; } + ASMJIT_INLINE_NODEBUG const OpRWInfo& extraReg() const noexcept { return _extraReg; } //! Returns RW information of all instruction's operands. - inline const OpRWInfo* operands() const noexcept { return _operands; } + ASMJIT_INLINE_NODEBUG const OpRWInfo* operands() const noexcept { return _operands; } //! Returns RW information of the operand at the given `index`. inline const OpRWInfo& operand(size_t index) const noexcept { @@ -719,7 +751,7 @@ struct InstRWInfo { } //! Returns the number of operands this instruction has. - inline uint32_t opCount() const noexcept { return _opCount; } + ASMJIT_INLINE_NODEBUG uint32_t opCount() const noexcept { return _opCount; } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/instdb.cpp b/3rdparty/asmjit/src/asmjit/core/instdb.cpp new file mode 100644 index 0000000000000..cde369f6a1808 --- /dev/null +++ b/3rdparty/asmjit/src/asmjit/core/instdb.cpp @@ -0,0 +1,101 @@ +// This file is part of AsmJit project +// +// See asmjit.h or LICENSE.md for license and copyright information +// SPDX-License-Identifier: Zlib + +#include "../core/api-build_p.h" +#include "../core/instdb_p.h" + +ASMJIT_BEGIN_NAMESPACE + +namespace InstNameUtils { + +static constexpr uint32_t kBufferSize = 32; + +static ASMJIT_FORCE_INLINE char decode5BitChar(uint32_t c) noexcept { + uint32_t base = c <= 26 ? uint32_t('a') - 1u : uint32_t('0') - 27u; + return char(base + c); +} + +static ASMJIT_FORCE_INLINE size_t decodeToBuffer(char nameOut[kBufferSize], uint32_t nameValue, const char* stringTable) noexcept { + size_t i; + + if (nameValue & 0x80000000u) { + // Small string of 5-bit characters. + for (i = 0; i < 6; i++, nameValue >>= 5) { + uint32_t c = nameValue & 0x1F; + if (c == 0) + break; + nameOut[i] = decode5BitChar(c); + } + return i; + } + else { + size_t prefixBase = nameValue & 0xFFFu; + size_t prefixSize = (nameValue >> 12) & 0xFu; + + size_t suffixBase = (nameValue >> 16) & 0xFFFu; + size_t suffixSize = (nameValue >> 28) & 0x7u; + + for (i = 0; i < prefixSize; i++) + nameOut[i] = stringTable[prefixBase + i]; + + char* suffixOut = nameOut + prefixSize; + for (i = 0; i < suffixSize; i++) + suffixOut[i] = stringTable[suffixBase + i]; + + return prefixSize + suffixSize; + } +} + +Error decode(String& output, uint32_t nameValue, const char* stringTable) noexcept { + char nameData[kBufferSize]; + size_t nameSize = decodeToBuffer(nameData, nameValue, stringTable); + + return output.append(nameData, nameSize); +} + +InstId find(const char* s, size_t len, const InstNameIndex& nameIndex, const uint32_t* nameTable, const char* stringTable) noexcept { + if (ASMJIT_UNLIKELY(!s)) + return BaseInst::kIdNone; + + if (len == SIZE_MAX) + len = strlen(s); + + if (ASMJIT_UNLIKELY(len == 0 || len > nameIndex.maxNameLength)) + return BaseInst::kIdNone; + + uint32_t prefix = uint32_t(s[0]) - 'a'; + if (ASMJIT_UNLIKELY(prefix > 'z' - 'a')) + return BaseInst::kIdNone; + + size_t base = nameIndex.data[prefix].start; + size_t end = nameIndex.data[prefix].end; + + if (ASMJIT_UNLIKELY(!base)) + return BaseInst::kIdNone; + + char nameData[kBufferSize]; + for (size_t lim = end - base; lim != 0; lim >>= 1) { + size_t instId = base + (lim >> 1); + size_t nameSize = decodeToBuffer(nameData, nameTable[instId], stringTable); + + int result = Support::compareStringViews(s, len, nameData, nameSize); + if (result < 0) + continue; + + if (result > 0) { + base = instId + 1; + lim--; + continue; + } + + return InstId(instId); + } + + return BaseInst::kIdNone; +} + +} // {InstNameUtils} + +ASMJIT_END_NAMESPACE diff --git a/3rdparty/asmjit/src/asmjit/core/instdb_p.h b/3rdparty/asmjit/src/asmjit/core/instdb_p.h new file mode 100644 index 0000000000000..b5afb72cb3670 --- /dev/null +++ b/3rdparty/asmjit/src/asmjit/core/instdb_p.h @@ -0,0 +1,40 @@ +// This file is part of AsmJit project +// +// See asmjit.h or LICENSE.md for license and copyright information +// SPDX-License-Identifier: Zlib + +#ifndef ASMJIT_CORE_INSTDB_P_H_INCLUDED +#define ASMJIT_CORE_INSTDB_P_H_INCLUDED + +#include "../core/inst.h" +#include "../core/string.h" + +ASMJIT_BEGIN_NAMESPACE + +//! \cond INTERNAL +//! \addtogroup asmjit_instruction_db +//! \{ + +struct InstNameIndex { + struct Span { + uint16_t start; + uint16_t end; + }; + + Span data[26]; + uint16_t maxNameLength; +}; + +namespace InstNameUtils { + +Error decode(String& output, uint32_t nameValue, const char* stringTable) noexcept; +InstId find(const char* s, size_t len, const InstNameIndex& nameIndex, const uint32_t* nameTable, const char* stringTable) noexcept; + +} // {InstNameUtils} + +//! \} +//! \endcond + +ASMJIT_END_NAMESPACE + +#endif // ASMJIT_CORE_INSTDB_P_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp b/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp index 19fbe4b233878..760826b03720e 100644 --- a/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp +++ b/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp @@ -31,18 +31,19 @@ static constexpr uint32_t kJitAllocatorMultiPoolCount = 3; static constexpr uint32_t kJitAllocatorBaseGranularity = 64; //! Maximum block size (32MB). -static constexpr uint32_t kJitAllocatorMaxBlockSize = 1024 * 1024 * 32; +static constexpr uint32_t kJitAllocatorMaxBlockSize = 1024 * 1024 * 64; // JitAllocator - Fill Pattern // =========================== static inline uint32_t JitAllocator_defaultFillPattern() noexcept { +#if ASMJIT_ARCH_X86 // X86 and X86_64 - 4x 'int3' instruction. - if (ASMJIT_ARCH_X86) - return 0xCCCCCCCCu; - + return 0xCCCCCCCCu; +#else // Unknown... return 0u; +#endif } // JitAllocator - BitVectorRangeIterator @@ -146,42 +147,38 @@ class JitAllocatorPool { //! Double linked list of blocks. ZoneList blocks; //! Where to start looking first. - JitAllocatorBlock* cursor; + JitAllocatorBlock* cursor = nullptr; //! Count of blocks. - uint32_t blockCount; + uint32_t blockCount = 0; //! Allocation granularity. - uint16_t granularity; + uint16_t granularity = 0; //! Log2(granularity). - uint8_t granularityLog2; + uint8_t granularityLog2 = 0; //! Count of empty blocks (either 0 or 1 as we won't keep more blocks empty). - uint8_t emptyBlockCount; + uint8_t emptyBlockCount = 0; //! Number of bits reserved across all blocks. - size_t totalAreaSize; + size_t totalAreaSize[2] {}; //! Number of bits used across all blocks. - size_t totalAreaUsed; + size_t totalAreaUsed[2] {}; //! Overhead of all blocks (in bytes). - size_t totalOverheadBytes; + size_t totalOverheadBytes = 0; inline JitAllocatorPool(uint32_t granularity) noexcept : blocks(), - cursor(nullptr), - blockCount(0), granularity(uint16_t(granularity)), - granularityLog2(uint8_t(Support::ctz(granularity))), - emptyBlockCount(0), - totalAreaSize(0), - totalAreaUsed(0), - totalOverheadBytes(0) {} + granularityLog2(uint8_t(Support::ctz(granularity))) {} inline void reset() noexcept { blocks.reset(); cursor = nullptr; - blockCount = 0; - totalAreaSize = 0; - totalAreaUsed = 0; - totalOverheadBytes = 0; + blockCount = 0u; + totalAreaSize[0] = 0u; + totalAreaSize[1] = 0u; + totalAreaUsed[0] = 0u; + totalAreaUsed[1] = 0u; + totalOverheadBytes = 0u; } inline size_t byteSizeFromAreaSize(uint32_t areaSize) const noexcept { return size_t(areaSize) * granularity; } @@ -202,39 +199,47 @@ class JitAllocatorBlock : public ZoneTreeNodeT, ASMJIT_NONCOPYABLE(JitAllocatorBlock) enum Flags : uint32_t { + //! Block has initial padding, see \ref JitAllocatorOptions::kDisableInitialPadding. + kFlagInitialPadding = 0x00000001u, //! Block is empty. - kFlagEmpty = 0x00000001u, + kFlagEmpty = 0x00000002u, //! Block is dirty (largestUnusedArea, searchStart, searchEnd). - kFlagDirty = 0x00000002u, - //! Block is dual-mapped. - kFlagDualMapped = 0x00000004u + kFlagDirty = 0x00000004u, + //! Block represents memory that is using large pages. + kFlagLargePages = 0x00000008u, + //! Block represents memory that is dual-mapped. + kFlagDualMapped = 0x00000010u }; + static_assert(kFlagInitialPadding == 1, "JitAllocatorBlock::kFlagInitialPadding must be equal to 1"); + + static inline uint32_t initialAreaStartByFlags(uint32_t flags) noexcept { return flags & kFlagInitialPadding; } + //! Link to the pool that owns this block. - JitAllocatorPool* _pool; + JitAllocatorPool* _pool {}; //! Virtual memory mapping - either single mapping (both pointers equal) or //! dual mapping, where one pointer is Read+Execute and the second Read+Write. - VirtMem::DualMapping _mapping; + VirtMem::DualMapping _mapping {}; //! Virtual memory size (block size) [bytes]. - size_t _blockSize; + size_t _blockSize = 0; //! Block flags. - uint32_t _flags; + uint32_t _flags = 0; //! Size of the whole block area (bit-vector size). - uint32_t _areaSize; + uint32_t _areaSize = 0; //! Used area (number of bits in bit-vector used). - uint32_t _areaUsed; + uint32_t _areaUsed = 0; //! The largest unused continuous area in the bit-vector (or `areaSize` to initiate rescan). - uint32_t _largestUnusedArea; + uint32_t _largestUnusedArea = 0; //! Start of a search range (for unused bits). - uint32_t _searchStart; + uint32_t _searchStart = 0; //! End of a search range (for unused bits). - uint32_t _searchEnd; + uint32_t _searchEnd = 0; //! Used bit-vector (0 = unused, 1 = used). - Support::BitWord* _usedBitVector; + Support::BitWord* _usedBitVector {}; //! Stop bit-vector (0 = don't care, 1 = stop). - Support::BitWord* _stopBitVector; + Support::BitWord* _stopBitVector {}; inline JitAllocatorBlock( JitAllocatorPool* pool, @@ -250,12 +255,15 @@ class JitAllocatorBlock : public ZoneTreeNodeT, _blockSize(blockSize), _flags(blockFlags), _areaSize(areaSize), - _areaUsed(0), - _largestUnusedArea(areaSize), - _searchStart(0), - _searchEnd(areaSize), + _areaUsed(0), // Will be initialized by clearBlock(). + _largestUnusedArea(0), // Will be initialized by clearBlock(). + _searchStart(0), // Will be initialized by clearBlock(). + _searchEnd(0), // Will be initialized by clearBlock(). _usedBitVector(usedBitVector), - _stopBitVector(stopBitVector) {} + _stopBitVector(stopBitVector) { + + clearBlock(); + } inline JitAllocatorPool* pool() const noexcept { return _pool; } @@ -266,9 +274,15 @@ class JitAllocatorBlock : public ZoneTreeNodeT, inline void addFlags(uint32_t f) noexcept { _flags |= f; } inline void clearFlags(uint32_t f) noexcept { _flags &= ~f; } + inline bool empty() const noexcept { return hasFlag(kFlagEmpty); } inline bool isDirty() const noexcept { return hasFlag(kFlagDirty); } inline void makeDirty() noexcept { addFlags(kFlagDirty); } + inline bool hasLargePages() const noexcept { return hasFlag(kFlagLargePages); } + inline bool hasInitialPadding() const noexcept { return hasFlag(kFlagInitialPadding); } + + inline uint32_t initialAreaStart() const noexcept { return initialAreaStartByFlags(_flags); } + inline size_t blockSize() const noexcept { return _blockSize; } inline uint32_t areaSize() const noexcept { return _areaSize; } @@ -278,7 +292,27 @@ class JitAllocatorBlock : public ZoneTreeNodeT, inline void decreaseUsedArea(uint32_t value) noexcept { _areaUsed -= value; - _pool->totalAreaUsed -= value; + _pool->totalAreaUsed[size_t(hasLargePages())] -= value; + } + + inline void clearBlock() noexcept { + bool bit = hasInitialPadding(); + size_t numBitWords = _pool->bitWordCountFromAreaSize(_areaSize); + + memset(_usedBitVector, 0, numBitWords * sizeof(Support::BitWord)); + memset(_stopBitVector, 0, numBitWords * sizeof(Support::BitWord)); + + Support::bitVectorSetBit(_usedBitVector, 0, bit); + Support::bitVectorSetBit(_stopBitVector, 0, bit); + + uint32_t start = initialAreaStartByFlags(_flags); + _areaUsed = start; + _largestUnusedArea = _areaSize - start; + _searchStart = start; + _searchEnd = _areaSize; + + addFlags(JitAllocatorBlock::kFlagEmpty); + clearFlags(JitAllocatorBlock::kFlagDirty); } inline void markAllocatedArea(uint32_t allocatedAreaStart, uint32_t allocatedAreaEnd) noexcept { @@ -289,21 +323,24 @@ class JitAllocatorBlock : public ZoneTreeNodeT, Support::bitVectorSetBit(_stopBitVector, allocatedAreaEnd - 1, true); // Update search region and statistics. - _pool->totalAreaUsed += allocatedAreaSize; + _pool->totalAreaUsed[size_t(hasLargePages())] += allocatedAreaSize; _areaUsed += allocatedAreaSize; if (areaAvailable() == 0) { _searchStart = _areaSize; _searchEnd = 0; _largestUnusedArea = 0; - clearFlags(kFlagDirty); + + clearFlags(kFlagDirty | kFlagEmpty); } else { if (_searchStart == allocatedAreaStart) _searchStart = allocatedAreaEnd; if (_searchEnd == allocatedAreaEnd) _searchEnd = allocatedAreaStart; + addFlags(kFlagDirty); + clearFlags(kFlagEmpty); } } @@ -311,7 +348,7 @@ class JitAllocatorBlock : public ZoneTreeNodeT, uint32_t releasedAreaSize = releasedAreaEnd - releasedAreaStart; // Update the search region and statistics. - _pool->totalAreaUsed -= releasedAreaSize; + _pool->totalAreaUsed[size_t(hasLargePages())] -= releasedAreaSize; _areaUsed -= releasedAreaSize; _searchStart = Support::min(_searchStart, releasedAreaStart); _searchEnd = Support::max(_searchEnd, releasedAreaEnd); @@ -320,10 +357,10 @@ class JitAllocatorBlock : public ZoneTreeNodeT, Support::bitVectorClear(_usedBitVector, releasedAreaStart, releasedAreaSize); Support::bitVectorSetBit(_stopBitVector, releasedAreaEnd - 1, false); - if (areaUsed() == 0) { - _searchStart = 0; + if (areaUsed() == initialAreaStart()) { + _searchStart = initialAreaStart(); _searchEnd = _areaSize; - _largestUnusedArea = _areaSize; + _largestUnusedArea = _areaSize - initialAreaStart(); addFlags(kFlagEmpty); clearFlags(kFlagDirty); } @@ -341,7 +378,7 @@ class JitAllocatorBlock : public ZoneTreeNodeT, ASMJIT_ASSERT(shrunkAreaSize != 0); // Update the search region and statistics. - _pool->totalAreaUsed -= shrunkAreaSize; + _pool->totalAreaUsed[size_t(hasLargePages())] -= shrunkAreaSize; _areaUsed -= shrunkAreaSize; _searchStart = Support::min(_searchStart, shrunkAreaStart); _searchEnd = Support::max(_searchEnd, shrunkAreaEnd); @@ -411,7 +448,7 @@ static inline JitAllocatorPrivateImpl* JitAllocatorImpl_new(const JitAllocator:: // Setup pool count to [1..3]. size_t poolCount = 1; if (Support::test(options, JitAllocatorOptions::kUseMultiplePools)) - poolCount = kJitAllocatorMultiPoolCount;; + poolCount = kJitAllocatorMultiPoolCount; // Setup block size [64kB..256MB]. if (blockSize < 64 * 1024 || blockSize > 256 * 1024 * 1024 || !Support::isPowerOf2(blockSize)) @@ -430,8 +467,17 @@ static inline JitAllocatorPrivateImpl* JitAllocatorImpl_new(const JitAllocator:: if (ASMJIT_UNLIKELY(!p)) return nullptr; + VirtMem::HardenedRuntimeInfo hardenedRtInfo = VirtMem::hardenedRuntimeInfo(); + if (Support::test(hardenedRtInfo.flags, VirtMem::HardenedRuntimeFlags::kEnabled)) { + // If we are running within a hardened environment (mapping RWX is not allowed) then we have to use dual mapping + // or other runtime capabilities like Apple specific MAP_JIT. There is no point in not enabling these as otherwise + // the allocation would fail and JitAllocator would not be able to allocate memory. + if (!Support::test(hardenedRtInfo.flags, VirtMem::HardenedRuntimeFlags::kMapJit)) + options |= JitAllocatorOptions::kUseDualMapping; + } + JitAllocatorPool* pools = reinterpret_cast((uint8_t*)p + sizeof(JitAllocatorPrivateImpl)); - JitAllocatorPrivateImpl* impl = new(p) JitAllocatorPrivateImpl(pools, poolCount); + JitAllocatorPrivateImpl* impl = new(Support::PlacementNew{p}) JitAllocatorPrivateImpl(pools, poolCount); impl->options = options; impl->blockSize = blockSize; @@ -440,7 +486,7 @@ static inline JitAllocatorPrivateImpl* JitAllocatorImpl_new(const JitAllocator:: impl->pageSize = vmInfo.pageSize; for (size_t poolId = 0; poolId < poolCount; poolId++) - new(&pools[poolId]) JitAllocatorPool(granularity << poolId); + new(Support::PlacementNew{&pools[poolId]}) JitAllocatorPool(granularity << poolId); return impl; } @@ -473,6 +519,14 @@ static inline size_t JitAllocatorImpl_calculateIdealBlockSize(JitAllocatorPrivat JitAllocatorBlock* last = pool->blocks.last(); size_t blockSize = last ? last->blockSize() : size_t(impl->blockSize); + // We have to increase the allocationSize if we know that the block must provide padding. + if (!Support::test(impl->options, JitAllocatorOptions::kDisableInitialPadding)) { + size_t granularity = pool->granularity; + if (SIZE_MAX - allocationSize < granularity) + return 0; // Overflown + allocationSize += granularity; + } + if (blockSize < kJitAllocatorMaxBlockSize) blockSize *= 2u; @@ -485,64 +539,102 @@ static inline size_t JitAllocatorImpl_calculateIdealBlockSize(JitAllocatorPrivat return blockSize; } -ASMJIT_FAVOR_SPEED static void JitAllocatorImpl_fillPattern(void* mem, uint32_t pattern, size_t sizeInBytes) noexcept { - size_t n = sizeInBytes / 4u; - uint32_t* p = static_cast(mem); +ASMJIT_NOINLINE +ASMJIT_FAVOR_SPEED static void JitAllocatorImpl_fillPattern(void* mem, uint32_t pattern, size_t byteSize) noexcept { + // NOTE: This is always used to fill a pattern in allocated / freed memory. The allocation has always + // a granularity that is greater than the pattern, however, when shrink() is used, we may end up having + // an unaligned start, so deal with it here and then copy aligned pattern in the loop. + if ((uintptr_t(mem) & 0x1u) && byteSize >= 1u) { + static_cast(mem)[0] = uint8_t(pattern & 0xFF); + mem = static_cast(mem) + 1; + byteSize--; + } + + if ((uintptr_t(mem) & 0x2u) && byteSize >= 2u) { + static_cast(mem)[0] = uint16_t(pattern & 0xFFFF); + mem = static_cast(mem) + 1; + byteSize -= 2; + } + + // Something would be seriously broken if we end up with aligned `mem`, but unaligned `byteSize`. + ASMJIT_ASSERT((byteSize & 0x3u) == 0u); + + uint32_t* mem32 = static_cast(mem); + size_t n = byteSize / 4u; for (size_t i = 0; i < n; i++) - p[i] = pattern; + mem32[i] = pattern; } // Allocate a new `JitAllocatorBlock` for the given `blockSize`. // // NOTE: The block doesn't have `kFlagEmpty` flag set, because the new block // is only allocated when it's actually needed, so it would be cleared anyway. -static JitAllocatorBlock* JitAllocatorImpl_newBlock(JitAllocatorPrivateImpl* impl, JitAllocatorPool* pool, size_t blockSize) noexcept { +static Error JitAllocatorImpl_newBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock** dst, JitAllocatorPool* pool, size_t blockSize) noexcept { using Support::BitWord; using Support::kBitWordSizeInBits; - uint32_t areaSize = uint32_t((blockSize + pool->granularity - 1) >> pool->granularityLog2); - uint32_t numBitWords = (areaSize + kBitWordSizeInBits - 1u) / kBitWordSizeInBits; + uint32_t blockFlags = 0; + if (!Support::test(impl->options, JitAllocatorOptions::kDisableInitialPadding)) + blockFlags |= JitAllocatorBlock::kFlagInitialPadding; - JitAllocatorBlock* block = static_cast(::malloc(sizeof(JitAllocatorBlock))); - BitWord* bitWords = nullptr; VirtMem::DualMapping virtMem {}; - Error err = kErrorOutOfMemory; + VirtMem::MemoryFlags memFlags = VirtMem::MemoryFlags::kAccessRWX; - if (block != nullptr) - bitWords = static_cast(::malloc(size_t(numBitWords) * 2 * sizeof(BitWord))); - - uint32_t blockFlags = 0; - if (bitWords != nullptr) { - if (Support::test(impl->options, JitAllocatorOptions::kUseDualMapping)) { - err = VirtMem::allocDualMapping(&virtMem, blockSize, VirtMem::MemoryFlags::kAccessRWX); - blockFlags |= JitAllocatorBlock::kFlagDualMapped; - } - else { - err = VirtMem::alloc(&virtMem.rx, blockSize, VirtMem::MemoryFlags::kAccessRWX); - virtMem.rw = virtMem.rx; - } + if (Support::test(impl->options, JitAllocatorOptions::kUseDualMapping)) { + ASMJIT_PROPAGATE(VirtMem::allocDualMapping(&virtMem, blockSize, memFlags)); + blockFlags |= JitAllocatorBlock::kFlagDualMapped; } + else { + bool allocateRegularPages = true; + if (Support::test(impl->options, JitAllocatorOptions::kUseLargePages)) { + size_t largePageSize = VirtMem::largePageSize(); + bool tryLargePage = blockSize >= largePageSize || Support::test(impl->options, JitAllocatorOptions::kAlignBlockSizeToLargePage); + + // Only proceed if we can actually allocate large pages. + if (largePageSize && tryLargePage) { + size_t largeBlockSize = Support::alignUp(blockSize, largePageSize); + Error err = VirtMem::alloc(&virtMem.rx, largeBlockSize, memFlags | VirtMem::MemoryFlags::kMMapLargePages); + + // Fallback to regular pages if large page(s) allocation failed. + if (err == kErrorOk) { + allocateRegularPages = false; + blockSize = largeBlockSize; + blockFlags |= JitAllocatorBlock::kFlagLargePages; + } + } + } - // Out of memory. - if (ASMJIT_UNLIKELY(!block || !bitWords || err != kErrorOk)) { - if (bitWords) - ::free(bitWords); + // Called either if large pages were not requested or large page(s) allocation failed. + if (allocateRegularPages) { + ASMJIT_PROPAGATE(VirtMem::alloc(&virtMem.rx, blockSize, memFlags)); + } - if (block) - ::free(block); + virtMem.rw = virtMem.rx; + } - return nullptr; + uint32_t areaSize = uint32_t((blockSize + pool->granularity - 1) >> pool->granularityLog2); + uint32_t numBitWords = (areaSize + kBitWordSizeInBits - 1u) / kBitWordSizeInBits; + uint8_t* blockPtr = static_cast(::malloc(sizeof(JitAllocatorBlock) + size_t(numBitWords) * 2u * sizeof(BitWord))); + + // Out of memory... + if (ASMJIT_UNLIKELY(blockPtr == nullptr)) { + if (Support::test(impl->options, JitAllocatorOptions::kUseDualMapping)) + VirtMem::releaseDualMapping(&virtMem, blockSize); + else + VirtMem::release(virtMem.rx, blockSize); + return DebugUtils::errored(kErrorOutOfMemory); } - // Fill the memory if the secure mode is enabled. + // Fill the allocated virtual memory if secure mode is enabled. if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) { VirtMem::ProtectJitReadWriteScope scope(virtMem.rw, blockSize); JitAllocatorImpl_fillPattern(virtMem.rw, impl->fillPattern, blockSize); } - memset(bitWords, 0, size_t(numBitWords) * 2 * sizeof(BitWord)); - return new(block) JitAllocatorBlock(pool, virtMem, blockSize, blockFlags, bitWords, bitWords + numBitWords, areaSize); + BitWord* bitWords = reinterpret_cast(blockPtr + sizeof(JitAllocatorBlock)); + *dst = new(Support::PlacementNew{blockPtr}) JitAllocatorBlock(pool, virtMem, blockSize, blockFlags, bitWords, bitWords + numBitWords, areaSize); + return kErrorOk; } static void JitAllocatorImpl_deleteBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept { @@ -553,7 +645,6 @@ static void JitAllocatorImpl_deleteBlock(JitAllocatorPrivateImpl* impl, JitAlloc else VirtMem::release(block->rxPtr(), block->blockSize()); - ::free(block->_usedBitVector); ::free(block); } @@ -568,8 +659,10 @@ static void JitAllocatorImpl_insertBlock(JitAllocatorPrivateImpl* impl, JitAlloc pool->blocks.append(block); // Update statistics. + size_t statIndex = size_t(block->hasLargePages()); pool->blockCount++; - pool->totalAreaSize += block->areaSize(); + pool->totalAreaSize[statIndex] += block->areaSize(); + pool->totalAreaUsed[statIndex] += block->areaUsed(); pool->totalOverheadBytes += sizeof(JitAllocatorBlock) + JitAllocatorImpl_bitVectorSizeToByteSize(block->areaSize()) * 2u; } @@ -584,8 +677,10 @@ static void JitAllocatorImpl_removeBlock(JitAllocatorPrivateImpl* impl, JitAlloc pool->blocks.unlink(block); // Update statistics. + size_t statIndex = size_t(block->hasLargePages()); pool->blockCount--; - pool->totalAreaSize -= block->areaSize(); + pool->totalAreaSize[statIndex] -= block->areaSize(); + pool->totalAreaUsed[statIndex] -= block->areaUsed(); pool->totalOverheadBytes -= sizeof(JitAllocatorBlock) + JitAllocatorImpl_bitVectorSizeToByteSize(block->areaSize()) * 2u; } @@ -594,12 +689,10 @@ static void JitAllocatorImpl_wipeOutBlock(JitAllocatorPrivateImpl* impl, JitAllo return; JitAllocatorPool* pool = block->pool(); - uint32_t areaSize = block->areaSize(); - uint32_t granularity = pool->granularity; - size_t numBitWords = pool->bitWordCountFromAreaSize(areaSize); - - VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite); if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) { + VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite); + + uint32_t granularity = pool->granularity; uint8_t* rwPtr = block->rwPtr(); BitVectorRangeIterator it(block->_usedBitVector, pool->bitWordCountFromAreaSize(block->areaSize())); @@ -613,18 +706,10 @@ static void JitAllocatorImpl_wipeOutBlock(JitAllocatorPrivateImpl* impl, JitAllo JitAllocatorImpl_fillPattern(spanPtr, impl->fillPattern, spanSize); VirtMem::flushInstructionCache(spanPtr, spanSize); } + VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute); } - VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute); - memset(block->_usedBitVector, 0, size_t(numBitWords) * sizeof(Support::BitWord)); - memset(block->_stopBitVector, 0, size_t(numBitWords) * sizeof(Support::BitWord)); - - block->_areaUsed = 0; - block->_largestUnusedArea = areaSize; - block->_searchStart = 0; - block->_searchEnd = areaSize; - block->addFlags(JitAllocatorBlock::kFlagEmpty); - block->clearFlags(JitAllocatorBlock::kFlagDirty); + block->clearBlock(); } // JitAllocator - Construction & Destruction @@ -698,8 +783,8 @@ JitAllocator::Statistics JitAllocator::statistics() const noexcept { for (size_t poolId = 0; poolId < poolCount; poolId++) { const JitAllocatorPool& pool = impl->pools[poolId]; statistics._blockCount += size_t(pool.blockCount); - statistics._reservedSize += size_t(pool.totalAreaSize) * pool.granularity; - statistics._usedSize += size_t(pool.totalAreaUsed) * pool.granularity; + statistics._reservedSize += size_t(pool.totalAreaSize[0] + pool.totalAreaSize[1]) * pool.granularity; + statistics._usedSize += size_t(pool.totalAreaUsed[0] + pool.totalAreaUsed[1]) * pool.granularity; statistics._overheadSize += size_t(pool.totalOverheadBytes); } @@ -712,16 +797,15 @@ JitAllocator::Statistics JitAllocator::statistics() const noexcept { // JitAllocator - Alloc & Release // ============================== -Error JitAllocator::alloc(void** rxPtrOut, void** rwPtrOut, size_t size) noexcept { +Error JitAllocator::alloc(Span& out, size_t size) noexcept { + out = Span{}; + if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none)) return DebugUtils::errored(kErrorNotInitialized); JitAllocatorPrivateImpl* impl = static_cast(_impl); constexpr uint32_t kNoIndex = std::numeric_limits::max(); - *rxPtrOut = nullptr; - *rwPtrOut = nullptr; - // Align to the minimum granularity by default. size = Support::alignUp(size, impl->granularity); if (ASMJIT_UNLIKELY(size == 0)) @@ -783,21 +867,18 @@ Error JitAllocator::alloc(void** rxPtrOut, void** rwPtrOut, size_t size) noexcep } while (block != initial); } - // Allocate a new block if there is no region of a required width. + // Allocate a new block if there is no region of a required size. if (areaIndex == kNoIndex) { size_t blockSize = JitAllocatorImpl_calculateIdealBlockSize(impl, pool, size); if (ASMJIT_UNLIKELY(!blockSize)) return DebugUtils::errored(kErrorOutOfMemory); - block = JitAllocatorImpl_newBlock(impl, pool, blockSize); - areaIndex = 0; - - if (ASMJIT_UNLIKELY(!block)) - return DebugUtils::errored(kErrorOutOfMemory); + ASMJIT_PROPAGATE(JitAllocatorImpl_newBlock(impl, &block, pool, blockSize)); + areaIndex = block->initialAreaStart(); JitAllocatorImpl_insertBlock(impl, block); - block->_searchStart = areaSize; - block->_largestUnusedArea = block->areaSize() - areaSize; + block->_searchStart += areaSize; + block->_largestUnusedArea -= areaSize; } else if (block->hasFlag(JitAllocatorBlock::kFlagEmpty)) { pool->emptyBlockCount--; @@ -808,32 +889,35 @@ Error JitAllocator::alloc(void** rxPtrOut, void** rwPtrOut, size_t size) noexcep impl->allocationCount++; block->markAllocatedArea(areaIndex, areaIndex + areaSize); - // Return a pointer to the allocated memory. + // Return a span referencing the allocated memory. size_t offset = pool->byteSizeFromAreaSize(areaIndex); ASMJIT_ASSERT(offset <= block->blockSize() - size); - *rxPtrOut = block->rxPtr() + offset; - *rwPtrOut = block->rwPtr() + offset; + out._rx = block->rxPtr() + offset; + out._rw = block->rwPtr() + offset; + out._size = size; + out._block = static_cast(block); + return kErrorOk; } -Error JitAllocator::release(void* rxPtr) noexcept { +Error JitAllocator::release(void* rx) noexcept { if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none)) return DebugUtils::errored(kErrorNotInitialized); - if (ASMJIT_UNLIKELY(!rxPtr)) + if (ASMJIT_UNLIKELY(!rx)) return DebugUtils::errored(kErrorInvalidArgument); JitAllocatorPrivateImpl* impl = static_cast(_impl); LockGuard guard(impl->lock); - JitAllocatorBlock* block = impl->tree.get(static_cast(rxPtr)); + JitAllocatorBlock* block = impl->tree.get(static_cast(rx)); if (ASMJIT_UNLIKELY(!block)) return DebugUtils::errored(kErrorInvalidState); // Offset relative to the start of the block. JitAllocatorPool* pool = block->pool(); - size_t offset = (size_t)((uint8_t*)rxPtr - block->rxPtr()); + size_t offset = (size_t)((uint8_t*)rx - block->rxPtr()); // The first bit representing the allocated area and its size. uint32_t areaIndex = uint32_t(offset >> pool->granularityLog2); @@ -853,7 +937,7 @@ Error JitAllocator::release(void* rxPtr) noexcept { } // Release the whole block if it became empty. - if (block->areaUsed() == 0) { + if (block->empty()) { if (pool->emptyBlockCount || Support::test(impl->options, JitAllocatorOptions::kImmediateRelease)) { JitAllocatorImpl_removeBlock(impl, block); JitAllocatorImpl_deleteBlock(impl, block); @@ -866,49 +950,196 @@ Error JitAllocator::release(void* rxPtr) noexcept { return kErrorOk; } -Error JitAllocator::shrink(void* rxPtr, size_t newSize) noexcept { +static Error JitAllocatorImpl_shrink(JitAllocatorPrivateImpl* impl, JitAllocator::Span& span, size_t newSize, bool alreadyUnderWriteScope) noexcept { + JitAllocatorBlock* block = static_cast(span._block); + if (ASMJIT_UNLIKELY(!block)) + return DebugUtils::errored(kErrorInvalidArgument); + + LockGuard guard(impl->lock); + + // Offset relative to the start of the block. + JitAllocatorPool* pool = block->pool(); + size_t offset = (size_t)((uint8_t*)span.rx() - block->rxPtr()); + + // The first bit representing the allocated area and its size. + uint32_t areaStart = uint32_t(offset >> pool->granularityLog2); + + // Don't trust `span.size()` - if it has been already truncated we would be off... + bool isUsed = Support::bitVectorGetBit(block->_usedBitVector, areaStart); + if (ASMJIT_UNLIKELY(!isUsed)) + return DebugUtils::errored(kErrorInvalidArgument); + + uint32_t areaEnd = uint32_t(Support::bitVectorIndexOf(block->_stopBitVector, areaStart, true)) + 1; + uint32_t areaPrevSize = areaEnd - areaStart; + uint32_t spanPrevSize = areaPrevSize * pool->granularity; + uint32_t areaShrunkSize = pool->areaSizeFromByteSize(newSize); + + if (ASMJIT_UNLIKELY(areaShrunkSize > areaPrevSize)) + return DebugUtils::errored(kErrorInvalidArgument); + + uint32_t areaDiff = areaPrevSize - areaShrunkSize; + if (areaDiff) { + block->markShrunkArea(areaStart + areaShrunkSize, areaEnd); + span._size = pool->byteSizeFromAreaSize(areaShrunkSize); + } + + // Fill released memory if the secure mode is enabled. + if (newSize < spanPrevSize && Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) { + uint8_t* spanPtr = block->rwPtr() + (areaStart + areaShrunkSize) * pool->granularity; + size_t spanSize = areaDiff * pool->granularity; + + if (!alreadyUnderWriteScope) { + VirtMem::ProtectJitReadWriteScope scope(spanPtr, spanSize, VirtMem::CachePolicy::kNeverFlush); + JitAllocatorImpl_fillPattern(spanPtr, impl->fillPattern, spanSize); + } + else { + JitAllocatorImpl_fillPattern(spanPtr, impl->fillPattern, spanSize); + } + } + + return kErrorOk; +} + +Error JitAllocator::shrink(Span& span, size_t newSize) noexcept { if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none)) return DebugUtils::errored(kErrorNotInitialized); - if (ASMJIT_UNLIKELY(!rxPtr)) + if (ASMJIT_UNLIKELY(!span.rx())) return DebugUtils::errored(kErrorInvalidArgument); - if (ASMJIT_UNLIKELY(newSize == 0)) - return release(rxPtr); + if (ASMJIT_UNLIKELY(newSize == 0)) { + Error err = release(span.rx()); + span = Span{}; + return err; + } + + return JitAllocatorImpl_shrink(static_cast(_impl), span, newSize, false); +} + +Error JitAllocator::query(Span& out, void* rx) const noexcept { + out = Span{}; + + if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none)) + return DebugUtils::errored(kErrorNotInitialized); JitAllocatorPrivateImpl* impl = static_cast(_impl); LockGuard guard(impl->lock); - JitAllocatorBlock* block = impl->tree.get(static_cast(rxPtr)); + JitAllocatorBlock* block = impl->tree.get(static_cast(rx)); if (ASMJIT_UNLIKELY(!block)) return DebugUtils::errored(kErrorInvalidArgument); // Offset relative to the start of the block. JitAllocatorPool* pool = block->pool(); - size_t offset = (size_t)((uint8_t*)rxPtr - block->rxPtr()); + size_t offset = (size_t)((uint8_t*)rx - block->rxPtr()); // The first bit representing the allocated area and its size. uint32_t areaStart = uint32_t(offset >> pool->granularityLog2); + + bool isUsed = Support::bitVectorGetBit(block->_usedBitVector, areaStart); + if (ASMJIT_UNLIKELY(!isUsed)) + return DebugUtils::errored(kErrorInvalidArgument); + uint32_t areaEnd = uint32_t(Support::bitVectorIndexOf(block->_stopBitVector, areaStart, true)) + 1; + size_t byteOffset = pool->byteSizeFromAreaSize(areaStart); + size_t byteSize = pool->byteSizeFromAreaSize(areaEnd - areaStart); - uint32_t areaPrevSize = areaEnd - areaStart; - uint32_t areaShrunkSize = pool->areaSizeFromByteSize(newSize); + out._rx = static_cast(block->_mapping.rx) + byteOffset; + out._rw = static_cast(block->_mapping.rw) + byteOffset; + out._size = byteSize; + out._block = static_cast(block); - if (ASMJIT_UNLIKELY(areaShrunkSize > areaPrevSize)) - return DebugUtils::errored(kErrorInvalidState); + return kErrorOk; +} - uint32_t areaDiff = areaPrevSize - areaShrunkSize; - if (areaDiff) { - block->markShrunkArea(areaStart + areaShrunkSize, areaEnd); +// JitAllocator - Write +// ==================== + +static ASMJIT_FORCE_INLINE VirtMem::CachePolicy JitAllocator_defaultPolicyForSpan(const JitAllocator::Span& span) noexcept { + if (Support::test(span.flags(), JitAllocator::Span::Flags::kInstructionCacheClean)) + return VirtMem::CachePolicy::kNeverFlush; + else + return VirtMem::CachePolicy::kFlushAfterWrite; +} + +Error JitAllocator::write(Span& span, size_t offset, const void* src, size_t size, VirtMem::CachePolicy policy) noexcept { + if (ASMJIT_UNLIKELY(span._block == nullptr || offset > span.size() || span.size() - offset < size)) + return DebugUtils::errored(kErrorInvalidArgument); + + if (ASMJIT_UNLIKELY(size == 0)) + return kErrorOk; + + if (policy == VirtMem::CachePolicy::kDefault) + policy = JitAllocator_defaultPolicyForSpan(span); + + VirtMem::ProtectJitReadWriteScope writeScope(span.rx(), span.size(), policy); + memcpy(static_cast(span.rw()) + offset, src, size); + return kErrorOk; +} + +Error JitAllocator::write(Span& span, WriteFunc writeFunc, void* userData, VirtMem::CachePolicy policy) noexcept { + if (ASMJIT_UNLIKELY(span._block == nullptr) || span.size() == 0) + return DebugUtils::errored(kErrorInvalidArgument); + + size_t size = span.size(); + if (ASMJIT_UNLIKELY(size == 0)) + return kErrorOk; - // Fill released memory if the secure mode is enabled. - if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) - JitAllocatorImpl_fillPattern(block->rwPtr() + (areaStart + areaShrunkSize) * pool->granularity, fillPattern(), areaDiff * pool->granularity); + if (policy == VirtMem::CachePolicy::kDefault) + policy = JitAllocator_defaultPolicyForSpan(span); + + VirtMem::ProtectJitReadWriteScope writeScope(span.rx(), span.size(), policy); + ASMJIT_PROPAGATE(writeFunc(span, userData)); + + // Check whether span.truncate() has been called. + if (span.size() != size) { + // OK, this is a bit awkward... However, shrink wants the original span and newSize, so we have to swap. + std::swap(span._size, size); + return JitAllocatorImpl_shrink(static_cast(_impl), span, size, true); } return kErrorOk; } +// JitAllocator - Write Scope +// ========================== + +Error JitAllocator::beginWriteScope(WriteScopeData& scope, VirtMem::CachePolicy policy) noexcept { + scope._allocator = this; + scope._data[0] = size_t(policy); + return kErrorOk; +} + +Error JitAllocator::endWriteScope(WriteScopeData& scope) noexcept { + if (ASMJIT_UNLIKELY(!scope._allocator)) + return DebugUtils::errored(kErrorInvalidArgument); + + return kErrorOk; +} + +Error JitAllocator::flushWriteScope(WriteScopeData& scope) noexcept { + if (ASMJIT_UNLIKELY(!scope._allocator)) + return DebugUtils::errored(kErrorInvalidArgument); + + return kErrorOk; +} + +Error JitAllocator::scopedWrite(WriteScopeData& scope, Span& span, size_t offset, const void* src, size_t size) noexcept { + if (ASMJIT_UNLIKELY(!scope._allocator)) + return DebugUtils::errored(kErrorInvalidArgument); + + VirtMem::CachePolicy policy = VirtMem::CachePolicy(scope._data[0]); + return scope._allocator->write(span, offset, src, size, policy); +} + +Error JitAllocator::scopedWrite(WriteScopeData& scope, Span& span, WriteFunc writeFunc, void* userData) noexcept { + if (ASMJIT_UNLIKELY(!scope._allocator)) + return DebugUtils::errored(kErrorInvalidArgument); + + VirtMem::CachePolicy policy = VirtMem::CachePolicy(scope._data[0]); + return scope._allocator->write(span, writeFunc, userData, policy); +} + // JitAllocator - Tests // ==================== @@ -963,6 +1194,34 @@ class Random { uint64_t _state[2]; }; +namespace JitAllocatorUtils { + static void fillPattern64(void* p_, uint64_t pattern, size_t sizeInBytes) noexcept { + uint64_t* p = static_cast(p_); + size_t n = sizeInBytes / 8u; + + for (size_t i = 0; i < n; i++) + p[i] = pattern; + } + + static bool verifyPattern64(const void* p_, uint64_t pattern, size_t sizeInBytes) noexcept { + const uint64_t* p = static_cast(p_); + size_t n = sizeInBytes / 8u; + + for (size_t i = 0; i < n; i++) { + if (p[i] != pattern) { + INFO("Pattern verification failed at 0x%p [%zu * 8]: value(0x%016llX) != expected(0x%016llX)", + p, + i, + (unsigned long long)p[i], + (unsigned long long)pattern); + return false; + } + } + + return true; + } +} + // Helper class to verify that JitAllocator doesn't return addresses that overlap. class JitAllocatorWrapper { public: @@ -980,9 +1239,19 @@ class JitAllocatorWrapper { class Record : public ZoneTreeNodeT, public Range { public: - inline Record(uint8_t* addr, size_t size) + //! Read/write address, in case this is a dual mapping. + void* _rw; + //! Describes a pattern used to fill the allocated memory. + uint64_t pattern; + + inline Record(void* rx, void* rw, size_t size, uint64_t pattern) : ZoneTreeNodeT(), - Range(addr, size) {} + Range(static_cast(rx), size), + _rw(rw), + pattern(pattern) {} + + inline void* rx() const noexcept { return addr; } + inline void* rw() const noexcept { return _rw; } inline bool operator<(const Record& other) const noexcept { return addr < other.addr; } inline bool operator>(const Record& other) const noexcept { return addr > other.addr; } @@ -995,65 +1264,82 @@ class JitAllocatorWrapper { ZoneAllocator _heap; ZoneTree _records; JitAllocator _allocator; + Random _rng; explicit JitAllocatorWrapper(const JitAllocator::CreateParams* params) noexcept : _zone(1024 * 1024), _heap(&_zone), - _allocator(params) {} + _allocator(params), + _rng(0x123456789u) {} - void _insert(void* p_, size_t size) noexcept { - uint8_t* p = static_cast(p_); + void _insert(void* pRX, void* pRW, size_t size) noexcept { + uint8_t* p = static_cast(pRX); uint8_t* pEnd = p + size - 1; Record* record; record = _records.get(p); - if (record) - EXPECT(record == nullptr, "Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size); + EXPECT_NULL(record) + .message("Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size); record = _records.get(pEnd); - if (record) - EXPECT(record == nullptr, "Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size); + EXPECT_NULL(record) + .message("Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size); - record = _heap.newT(p, size); - EXPECT(record != nullptr, "Out of memory, cannot allocate 'Record'"); + uint64_t pattern = _rng.nextUInt64(); + record = _heap.newT(pRX, pRW, size, pattern); + EXPECT_NOT_NULL(record); + + { + VirtMem::ProtectJitReadWriteScope scope(pRW, size); + JitAllocatorUtils::fillPattern64(pRW, pattern, size); + } + + VirtMem::flushInstructionCache(pRX, size); + EXPECT_TRUE(JitAllocatorUtils::verifyPattern64(pRX, pattern, size)); _records.insert(record); } void _remove(void* p) noexcept { Record* record = _records.get(static_cast(p)); - EXPECT(record != nullptr, "Address [%p] doesn't exist\n", p); + EXPECT_NOT_NULL(record); + + EXPECT_TRUE(JitAllocatorUtils::verifyPattern64(record->rx(), record->pattern, record->size)); + EXPECT_TRUE(JitAllocatorUtils::verifyPattern64(record->rw(), record->pattern, record->size)); _records.remove(record); _heap.release(record, sizeof(Record)); } void* alloc(size_t size) noexcept { - void* rxPtr; - void* rwPtr; + JitAllocator::Span span; + Error err = _allocator.alloc(span, size); + EXPECT_EQ(err, kErrorOk) + .message("JitAllocator failed to allocate %zu bytes\n", size); - Error err = _allocator.alloc(&rxPtr, &rwPtr, size); - EXPECT(err == kErrorOk, "JitAllocator failed to allocate %zu bytes\n", size); - - _insert(rxPtr, size); - return rxPtr; + _insert(span.rx(), span.rw(), size); + return span.rx(); } void release(void* p) noexcept { _remove(p); - EXPECT(_allocator.release(p) == kErrorOk, "JitAllocator failed to release '%p'\n", p); + EXPECT_EQ(_allocator.release(p), kErrorOk) + .message("JitAllocator failed to release '%p'\n", p); } void shrink(void* p, size_t newSize) noexcept { Record* record = _records.get(static_cast(p)); - EXPECT(record != nullptr, "Address [%p] doesn't exist\n", p); + EXPECT_NOT_NULL(record); if (!newSize) return release(p); - Error err = _allocator.shrink(p, newSize); - EXPECT(err == kErrorOk, "JitAllocator failed to shrink %p to %zu bytes\n", p, newSize); + JitAllocator::Span span; + EXPECT_EQ(_allocator.query(span, p), kErrorOk); + Error err = _allocator.shrink(span, newSize); + EXPECT_EQ(err, kErrorOk) + .message("JitAllocator failed to shrink %p to %zu bytes\n", p, newSize); record->size = newSize; } @@ -1095,13 +1381,14 @@ static void BitVectorRangeIterator_testRandom(Random& rnd, size_t count) noexcep } for (size_t j = 0; j < kPatternSize; j++) { - EXPECT(in[j] == out[j], "Invalid pattern detected at [%zu] (%llX != %llX)", j, (unsigned long long)in[j], (unsigned long long)out[j]); + EXPECT_EQ(in[j], out[j]) + .message("Invalid pattern detected at [%zu] (%llX != %llX)", j, (unsigned long long)in[j], (unsigned long long)out[j]); } } } -UNIT(jit_allocator) { - size_t kCount = BrokenAPI::hasArg("--quick") ? 1000 : 100000; +static void test_jit_allocator_alloc_release() noexcept { + size_t kCount = BrokenAPI::hasArg("--quick") ? 20000 : 100000; struct TestParams { const char* name; @@ -1110,15 +1397,23 @@ UNIT(jit_allocator) { uint32_t granularity; }; - static TestParams testParams[] = { - { "Default", JitAllocatorOptions::kNone, 0, 0 }, - { "16MB blocks", JitAllocatorOptions::kNone, 16 * 1024 * 1024, 0 }, - { "256B granularity", JitAllocatorOptions::kNone, 0, 256 }, - { "kUseDualMapping", JitAllocatorOptions::kUseDualMapping, 0, 0 }, - { "kUseMultiplePools", JitAllocatorOptions::kUseMultiplePools, 0, 0 }, - { "kFillUnusedMemory", JitAllocatorOptions::kFillUnusedMemory, 0, 0 }, - { "kImmediateRelease", JitAllocatorOptions::kImmediateRelease, 0, 0 }, - { "kUseDualMapping | kFillUnusedMemory", JitAllocatorOptions::kUseDualMapping | JitAllocatorOptions::kFillUnusedMemory, 0, 0 } + using Opt = JitAllocatorOptions; + + VirtMem::HardenedRuntimeInfo hri = VirtMem::hardenedRuntimeInfo(); + + TestParams testParams[] = { + { "Default" , Opt::kNone, 0, 0 }, + { "16MB blocks" , Opt::kNone, 16 * 1024 * 1024, 0 }, + { "256B granularity" , Opt::kNone, 0, 256 }, + { "kUseMultiplePools" , Opt::kUseMultiplePools, 0, 0 }, + { "kFillUnusedMemory" , Opt::kFillUnusedMemory, 0, 0 }, + { "kImmediateRelease" , Opt::kImmediateRelease, 0, 0 }, + { "kDisableInitialPadding" , Opt::kDisableInitialPadding, 0, 0 }, + { "kUseLargePages" , Opt::kUseLargePages, 0, 0 }, + { "kUseLargePages | kFillUnusedMemory" , Opt::kUseLargePages | Opt::kFillUnusedMemory, 0, 0 }, + { "kUseLargePages | kAlignBlockSizeToLargePage", Opt::kUseLargePages | Opt::kAlignBlockSizeToLargePage, 0, 0 }, + { "kUseDualMapping" , Opt::kUseDualMapping , 0, 0 }, + { "kUseDualMapping | kFillUnusedMemory" , Opt::kUseDualMapping | Opt::kFillUnusedMemory, 0, 0 } }; INFO("BitVectorRangeIterator"); @@ -1134,6 +1429,12 @@ UNIT(jit_allocator) { } for (uint32_t testId = 0; testId < ASMJIT_ARRAY_SIZE(testParams); testId++) { + // Don't try to allocate dual-mapping if dual mapping is not possible - it would fail the test. + if (Support::test(testParams[testId].options, JitAllocatorOptions::kUseDualMapping) && + !Support::test(hri.flags, VirtMem::HardenedRuntimeFlags::kDualMapping)) { + continue; + } + INFO("JitAllocator(%s)", testParams[testId].name); JitAllocator::CreateParams params {}; @@ -1151,8 +1452,7 @@ UNIT(jit_allocator) { INFO(" Memory alloc/release test - %d allocations", kCount); void** ptrArray = (void**)::malloc(sizeof(void*) * size_t(kCount)); - EXPECT(ptrArray != nullptr, - "Couldn't allocate '%u' bytes for pointer-array", unsigned(sizeof(void*) * size_t(kCount))); + EXPECT_NOT_NULL(ptrArray); // Random blocks tests... INFO(" Allocating random blocks..."); @@ -1235,8 +1535,29 @@ UNIT(jit_allocator) { ::free(ptrArray); } } -#endif + +static void test_jit_allocator_query() noexcept { + JitAllocator allocator; + size_t allocatedSize = 100; + + JitAllocator::Span allocatedSpan; + EXPECT_EQ(allocator.alloc(allocatedSpan, allocatedSize), kErrorOk); + EXPECT_NOT_NULL(allocatedSpan.rx()); + EXPECT_GE(allocatedSpan.size(), allocatedSize); + + JitAllocator::Span queriedSpan; + EXPECT_EQ(allocator.query(queriedSpan, allocatedSpan.rx()), kErrorOk); + EXPECT_EQ(allocatedSpan.rx(), queriedSpan.rx()); + EXPECT_EQ(allocatedSpan.rw(), queriedSpan.rw()); + EXPECT_EQ(allocatedSpan.size(), queriedSpan.size()); +} + +UNIT(jit_allocator) { + test_jit_allocator_alloc_release(); + test_jit_allocator_query(); +} +#endif // ASMJIT_TEST ASMJIT_END_NAMESPACE -#endif +#endif // !ASMJIT_NO_JIT diff --git a/3rdparty/asmjit/src/asmjit/core/jitallocator.h b/3rdparty/asmjit/src/asmjit/core/jitallocator.h index e8fe69519eebe..b694f8cd535da 100644 --- a/3rdparty/asmjit/src/asmjit/core/jitallocator.h +++ b/3rdparty/asmjit/src/asmjit/core/jitallocator.h @@ -10,6 +10,7 @@ #ifndef ASMJIT_NO_JIT #include "../core/globals.h" +#include "../core/support.h" #include "../core/virtmem.h" ASMJIT_BEGIN_NAMESPACE @@ -26,6 +27,10 @@ enum class JitAllocatorOptions : uint32_t { //! The first buffer has read and execute permissions and the second buffer has read+write permissions. //! //! See \ref VirtMem::allocDualMapping() for more details about this feature. + //! + //! \remarks Dual mapping would be automatically turned on by \ref JitAllocator in case of hardened runtime that + //! enforces `W^X` policy, so specifying this flag is essentially forcing to use dual mapped pages even when RWX + //! pages can be allocated and dual mapping is not necessary. kUseDualMapping = 0x00000001u, //! Enables the use of multiple pools with increasing granularity instead of a single pool. This flag would enable @@ -50,6 +55,40 @@ enum class JitAllocatorOptions : uint32_t { //! or have all blocks fully occupied. kImmediateRelease = 0x00000008u, + //! This flag enables placing functions (or allocating memory) at the very beginning of each memory mapped region. + //! + //! Initially, this was the default behavior. However, LLVM developers working on undefined behavior sanitizer + //! (UBSAN) decided that they want to store metadata before each function and to access such metadata before an + //! indirect function call. This means that the instrumented code always reads from `[fnPtr - 8]` to decode whether + //! the function has his metadata present. However, reading 8 bytes below a function means that if a function is + //! placed at the very beginning of a memory mapped region, it could try to read bytes that are inaccessible. And + //! since AsmJit can be compiled as a shared library and used by applications instrumented by UBSAN, it's not + //! possible to conditionally compile the support only when necessary. + //! + //! \remarks This flag controls a workaround to make it possible to use LLVM UBSAN with AsmJit's \ref JitAllocator. + //! There is no undefined behavior even when `kDisableInitialPadding` is used, however, that doesn't really matter + //! as LLVM's UBSAN introduces one, and according to LLVM developers it's a "trade-off". This flag is safe to use + //! when the code is not instrumented with LLVM's UBSAN. + kDisableInitialPadding = 0x00000010u, + + //! Enables the use of large pages, if they are supported and the process can actually allocate them. + //! + //! \remarks This flag is a hint - if large pages can be allocated, JitAllocator would try to allocate them. + //! However, if the allocation fails, it will still try to fallback to use regular pages as \ref JitAllocator + //! is designed to minimize allocation failures, so a regular page is better than no page at all. Also, if a + //! block \ref JitAllocator wants to allocate is too small to consume a whole large page, regular page(s) will + //! be allocated as well. + kUseLargePages = 0x00000020u, + + //! Forces \ref JitAllocator to always align block size to be at least as big as a large page, if large pages are + //! enabled. This option does nothing if large pages are disabled. + //! + //! \remarks If \ref kUseLargePages option is used, the allocator would prefer large pages only when allocating a + //! block that has a sufficient size. Usually the allocator first allocates smaller block and when more requests + //! come it will start increasing the block size of next allocations. This option makes it sure that even the first + //! allocation would be the same as a minimum large page when large pages are enabled and can be allocated. + kAlignBlockSizeToLargePage = 0x00000040u, + //! Use a custom fill pattern, must be combined with `kFlagFillUnusedMemory`. kCustomFillPattern = 0x10000000u }; @@ -75,6 +114,7 @@ class JitAllocator { public: ASMJIT_NONCOPYABLE(JitAllocator) + //! Visible \ref JitAllocator implementation data. struct Impl { //! Allocator options. JitAllocatorOptions options; @@ -86,9 +126,14 @@ class JitAllocator { uint32_t fillPattern; }; + //! \name Members + //! \{ + //! Allocator implementation (private). Impl* _impl; + //! \} + //! \name Construction & Destruction //! \{ @@ -129,7 +174,7 @@ class JitAllocator { uint32_t fillPattern = 0; // Reset the content of `CreateParams`. - inline void reset() noexcept { memset(this, 0, sizeof(*this)); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = CreateParams{}; } }; //! Creates a `JitAllocator` instance. @@ -137,7 +182,7 @@ class JitAllocator { //! Destroys the `JitAllocator` instance and release all blocks held. ASMJIT_API ~JitAllocator() noexcept; - inline bool isInitialized() const noexcept { return _impl->blockSize == 0; } + ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _impl->blockSize == 0; } //! Free all allocated memory - makes all pointers returned by `alloc()` invalid. //! @@ -151,47 +196,315 @@ class JitAllocator { //! \{ //! Returns allocator options, see `Flags`. - inline JitAllocatorOptions options() const noexcept { return _impl->options; } + ASMJIT_INLINE_NODEBUG JitAllocatorOptions options() const noexcept { return _impl->options; } //! Tests whether the allocator has the given `option` set. - inline bool hasOption(JitAllocatorOptions option) const noexcept { return uint32_t(_impl->options & option) != 0; } + ASMJIT_INLINE_NODEBUG bool hasOption(JitAllocatorOptions option) const noexcept { return uint32_t(_impl->options & option) != 0; } //! Returns a base block size (a minimum size of block that the allocator would allocate). - inline uint32_t blockSize() const noexcept { return _impl->blockSize; } + ASMJIT_INLINE_NODEBUG uint32_t blockSize() const noexcept { return _impl->blockSize; } //! Returns granularity of the allocator. - inline uint32_t granularity() const noexcept { return _impl->granularity; } + ASMJIT_INLINE_NODEBUG uint32_t granularity() const noexcept { return _impl->granularity; } //! Returns pattern that is used to fill unused memory if `kFlagUseFillPattern` is set. - inline uint32_t fillPattern() const noexcept { return _impl->fillPattern; } + ASMJIT_INLINE_NODEBUG uint32_t fillPattern() const noexcept { return _impl->fillPattern; } //! \} //! \name Alloc & Release //! \{ - //! Allocates a new memory block of the requested `size`. + //! A memory reference returned by \ref JitAllocator::alloc(). //! - //! When the function is successful it stores two pointers in `rxPtrOut` and `rwPtrOut`. The pointers will be - //! different only if `kOptionUseDualMapping` was used to setup the allocator (in that case the `rxPtrOut` would - //! point to a Read+Execute region and `rwPtrOut` would point to a Read+Write region of the same memory-mapped block. - ASMJIT_API Error alloc(void** rxPtrOut, void** rwPtrOut, size_t size) noexcept; + //! Span contains everything needed to actually write new code to the memory chunk it references. + class Span { + public: + //! \name Constants + //! \{ + + //! Span flags + enum class Flags : uint32_t { + //! No flags. + kNone = 0u, + + //! The process has never executed the region of the span. + //! + //! If this flag is set on a \ref Span it would mean that the allocator can avoid flushing + //! instruction cache after a code has been written to it. + kInstructionCacheClean = 0x00000001u + }; + + //! \} + + //! \name Members + //! \{ + + //! Address of memory that has Read and Execute permissions. + void* _rx = nullptr; + + //! Address of memory that has Read and Write permissions. + void* _rw = nullptr; + + //! Size of the span in bytes (rounded up to the allocation granularity). + size_t _size = 0; + + //! Pointer that references a memory block maintained by \ref JitAllocator. + //! + //! This pointer is considered private and should never be used nor inspected outside of AsmJit. + void* _block = nullptr; + + //! Span flags. + Flags _flags = Flags::kNone; + + //! Reserved for future use. + uint32_t _reserved = 0; + + //! \} + + //! \name Accessors + //! \{ + + //! Returns a pointer having Read & Execute permissions (references executable memory). + //! + //! This pointer is never NULL if the allocation succeeded, it points to an executable memory. + ASMJIT_INLINE_NODEBUG void* rx() const noexcept { return _rx; } + + //! Returns a pointer having Read & Write permissions (references writable memory). + //! + //! Depending on the type of the allocation strategy this could either be: + //! + //! - the same address as returned by `rx()` if the allocator uses RWX mapping (pages have all of Read, Write, + //! and Execute permissions) or MAP_JIT, which requires either \ref VirtMem::ProtectJitReadWriteScope or to + //! call \ref VirtMem::protectJitMemory() manually. + //! - a valid pointer, but not the same as `rx` - this would be valid if dual mapping is used. + //! - NULL pointer, in case that the allocation strategy doesn't use RWX, MAP_JIT, or dual mapping. In this + //! case only \ref JitAllocator can copy new code into the executable memory referenced by \ref Span. + //! + //! \note If `rw()` returns a non-null pointer it's important to use either VirtMem::protectJitMemory() or + //! \ref VirtMem::ProtectJitReadWriteScope to guard the write, because in case of `MAP_JIT` it would temporarily + //! switch the permissions of the pointer to RW (that's per thread permissions). + //! + //! If \ref VirtMem::ProtectJitReadWriteScope is not used it's important to clear the instruction cache via + //! \ref VirtMem::flushInstructionCache() after the write is done. + ASMJIT_INLINE_NODEBUG void* rw() const noexcept { return _rw; } + + //! Returns size of this span, aligned to the allocator granularity. + ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; } + + //! Returns span flags. + ASMJIT_INLINE_NODEBUG Flags flags() const noexcept { return _flags; } + + //! Shrinks this span to `newSize`. + //! + //! \note This is the only function that is able to change the size of a span, and it's only use case is to + //! shrink the span size during \ref JitAllocator::write(). When the writer detects that the span size shrunk, + //! it will automatically shrink the memory used by the span, and propagate the new aligned size to the caller. + ASMJIT_INLINE_NODEBUG void shrink(size_t newSize) noexcept { _size = Support::min(_size, newSize); } + + //! Returns whether \ref rw() returns a non-null pointer. + ASMJIT_INLINE_NODEBUG bool isDirectlyWritable() const noexcept { return _rw != nullptr; } + + //! \} + }; + + //! Allocates a new memory span of the requested `size`. + ASMJIT_API Error alloc(Span& out, size_t size) noexcept; //! Releases a memory block returned by `alloc()`. //! //! \remarks This function is thread-safe. - ASMJIT_API Error release(void* rxPtr) noexcept; + ASMJIT_API Error release(void* rx) noexcept; - //! Frees extra memory allocated with `rxPtr` by shrinking it to the given `newSize`. + //! Frees extra memory allocated with `rx` by shrinking it to the given `newSize`. //! //! \remarks This function is thread-safe. - ASMJIT_API Error shrink(void* rxPtr, size_t newSize) noexcept; + ASMJIT_API Error shrink(Span& span, size_t newSize) noexcept; - //! Queries information about an allocated memory block that contains the given `rxPtr`. + //! Queries information about an allocated memory block that contains the given `rx`, and writes it to `out`. //! - //! The function returns `kErrorOk` when `rxPtr` is matched and fills `rxPtrOut`, `rwPtrOut`, and `sizeOut` output - //! arguments. The returned `rxPtrOut` and `rwPtrOut` pointers point to the beginning of the block, and `sizeOut` - //! describes the total amount of bytes this allocation uses - `sizeOut` will always be aligned to the allocation - //! granularity, so for example if an allocation was 1 byte and the size granularity is 64, the returned `sizeOut` - //! will be 64 bytes, because that's what the allocator sees. - ASMJIT_API Error query(void* rxPtr, void** rxPtrOut, void** rwPtrOut, size_t* sizeOut) const noexcept; + //! If the pointer is matched, the function returns `kErrorOk` and fills `out` with the corresponding span. + ASMJIT_API Error query(Span& out, void* rx) const noexcept; + +#if !defined(ASMJIT_NO_DEPRECATED) + //! Allocates a new memory block of the requested `size`. + ASMJIT_DEPRECATED("Use alloc(Span& out, size_t size) instead") + ASMJIT_FORCE_INLINE Error alloc(void** rxPtrOut, void** rwPtrOut, size_t size) noexcept { + Span span; + Error err = alloc(span, size); + *rwPtrOut = span.rw(); + *rxPtrOut = span.rx(); + return err; + } + + ASMJIT_DEPRECATED("Use shrink(Span& span, size_t newSize) instead") + ASMJIT_FORCE_INLINE Error shrink(void* rxPtr, size_t newSize) noexcept { + Span span; + ASMJIT_PROPAGATE(query(span, rxPtr)); + return (span.size() > newSize) ? shrink(span, newSize) : Error(kErrorOk); + } + + ASMJIT_DEPRECATED("Use query(Span& out, void* rx) instead") + ASMJIT_FORCE_INLINE Error query(void* rxPtr, void** rxPtrOut, void** rwPtrOut, size_t* sizeOut) const noexcept { + Span span; + Error err = query(span, rxPtr); + *rxPtrOut = span.rx(); + *rwPtrOut = span.rw(); + *sizeOut = span.size(); + return err; + } +#endif + + //! \} + + //! \name Write Operations + //! \{ + + typedef Error (ASMJIT_CDECL* WriteFunc)(Span& span, void* userData) ASMJIT_NOEXCEPT_TYPE; + + ASMJIT_API Error write( + Span& span, + size_t offset, + const void* src, + size_t size, + VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept; + + ASMJIT_API Error write( + Span& span, + WriteFunc writeFunc, + void* userData, + VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept; + + template + ASMJIT_FORCE_INLINE Error write( + Span& span, + Lambda&& lambdaFunc, + VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept { + + WriteFunc wrapperFunc = [](Span& span, void* userData) noexcept -> Error { + Lambda& lambdaFunc = *static_cast(userData); + return lambdaFunc(span); + }; + return write(span, wrapperFunc, (void*)(&lambdaFunc), policy); + } + + //! \} + + //! \name Write Operations with Scope + //! \{ + + //! \cond INTERNAL + + //! Write scope data. + //! + //! This is mostly for internal purposes, please use \ref WriteScope instead. + struct WriteScopeData { + //! \name Members + //! \{ + + //! Link to the allocator. + JitAllocator* _allocator; + //! Cache policy passed to \ref JitAllocator::beginWriteScope(). + VirtMem::CachePolicy _policy; + //! Internal flags used by the implementation. + uint32_t _flags; + //! Internal data used by the implementation. + size_t _data[64]; + + //! \} + }; + + //! Begins a write `scope`. + //! + //! This is mostly for internal purposes, please use \ref WriteScope constructor instead. + ASMJIT_API Error beginWriteScope(WriteScopeData& scope, VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept; + + //! Ends a write `scope`. + //! + //! This is mostly for internal purposes, please use \ref WriteScope destructor instead. + ASMJIT_API Error endWriteScope(WriteScopeData& scope) noexcept; + + //! Flushes accumulated changes in a write `scope`. + //! + //! This is mostly for internal purposes, please use \ref WriteScope destructor or \ref WriteScope::flush() instead. + ASMJIT_API Error flushWriteScope(WriteScopeData& scope) noexcept; + + //! Alternative to `JitAllocator::write(span, offset, src, size)`, but under a write `scope`. + //! + //! This is mostly for internal purposes, please use \ref WriteScope::write() instead. + ASMJIT_API Error scopedWrite(WriteScopeData& scope, Span& span, size_t offset, const void* src, size_t size) noexcept; + + //! Alternative to `JitAllocator::write(span, writeFunc, userData)`, but under a write `scope`. + //! + //! This is mostly for internal purposes, please use \ref WriteScope::write() instead. + ASMJIT_API Error scopedWrite(WriteScopeData& scope, Span& span, WriteFunc writeFunc, void* userData) noexcept; + + //! Alternative to `JitAllocator::write(span, [lambda])`, but under a write `scope`. + //! + //! This is mostly for internal purposes, please use \ref WriteScope::write() instead. + template + inline Error scopedWrite(WriteScopeData& scope, Span& span, Lambda&& lambdaFunc) noexcept { + WriteFunc wrapperFunc = [](Span& span, void* userData) noexcept -> Error { + Lambda& lambdaFunc = *static_cast(userData); + return lambdaFunc(span); + }; + return scopedWrite(scope, span, wrapperFunc, (void*)(&lambdaFunc)); + } + + //! \endcond + + //! Write scope can be used to create a single scope that is optimized for writing multiple spans. + class WriteScope : public WriteScopeData { + public: + ASMJIT_NONCOPYABLE(WriteScope) + + //! \name Construction & Destruction + //! \{ + + // Begins a write scope. + inline explicit WriteScope(JitAllocator* allocator, VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept { + allocator->beginWriteScope(*this, policy); + } + + // Ends a write scope. + inline ~WriteScope() noexcept { + if (_allocator) + _allocator->endWriteScope(*this); + } + + //! \} + + //! \name Accessors + //! \{ + + ASMJIT_INLINE_NODEBUG JitAllocator* allocator() const noexcept { return _allocator; } + ASMJIT_INLINE_NODEBUG VirtMem::CachePolicy policy() const noexcept { return _policy; } + + //! \} + + //! \name Operations + //! \{ + + //! Similar to `JitAllocator::write(span, offset, src, size)`, but under a write scope. + ASMJIT_INLINE_NODEBUG Error write(Span& span, size_t offset, const void* src, size_t size) noexcept { + return _allocator->scopedWrite(*this, span, offset, src, size); + } + + //! Similar to `JitAllocator::write(span, writeFunc, userData)`, but under a write scope. + ASMJIT_INLINE_NODEBUG Error write(Span& span, WriteFunc writeFunc, void* userData) noexcept { + return _allocator->scopedWrite(*this, span, writeFunc, userData); + } + + //! Similar to `JitAllocator::write(span, )`, but under a write scope. + template + ASMJIT_INLINE_NODEBUG Error write(Span& span, Lambda&& lambdaFunc) noexcept { + return _allocator->scopedWrite(*this, span, lambdaFunc); + } + + //! Flushes accumulated changes in this write scope. + ASMJIT_INLINE_NODEBUG Error flush() noexcept { + return _allocator->flushWriteScope(*this); + } + + //! \} + }; //! \} @@ -211,36 +524,32 @@ class JitAllocator { //! Allocation overhead (in bytes) required to maintain all blocks. size_t _overheadSize; - inline void reset() noexcept { - _blockCount = 0; - _usedSize = 0; - _reservedSize = 0; - _overheadSize = 0; - } + //! Resets the statistics to all zeros. + ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Statistics{}; } //! Returns count of blocks managed by `JitAllocator` at the moment. - inline size_t blockCount() const noexcept { return _blockCount; } + ASMJIT_INLINE_NODEBUG size_t blockCount() const noexcept { return _blockCount; } //! Returns the number of active allocations. - inline size_t allocationCount() const noexcept { return _allocationCount; } + ASMJIT_INLINE_NODEBUG size_t allocationCount() const noexcept { return _allocationCount; } //! Returns how many bytes are currently used. - inline size_t usedSize() const noexcept { return _usedSize; } + ASMJIT_INLINE_NODEBUG size_t usedSize() const noexcept { return _usedSize; } //! Returns the number of bytes unused by the allocator at the moment. - inline size_t unusedSize() const noexcept { return _reservedSize - _usedSize; } - //! Returns the total number of bytes bytes reserved by the allocator (sum of sizes of all blocks). - inline size_t reservedSize() const noexcept { return _reservedSize; } + ASMJIT_INLINE_NODEBUG size_t unusedSize() const noexcept { return _reservedSize - _usedSize; } + //! Returns the total number of bytes reserved by the allocator (sum of sizes of all blocks). + ASMJIT_INLINE_NODEBUG size_t reservedSize() const noexcept { return _reservedSize; } //! Returns the number of bytes the allocator needs to manage the allocated memory. - inline size_t overheadSize() const noexcept { return _overheadSize; } + ASMJIT_INLINE_NODEBUG size_t overheadSize() const noexcept { return _overheadSize; } - inline double usedSizeAsPercent() const noexcept { + ASMJIT_INLINE_NODEBUG double usedSizeAsPercent() const noexcept { return (double(usedSize()) / (double(reservedSize()) + 1e-16)) * 100.0; } - inline double unusedSizeAsPercent() const noexcept { + ASMJIT_INLINE_NODEBUG double unusedSizeAsPercent() const noexcept { return (double(unusedSize()) / (double(reservedSize()) + 1e-16)) * 100.0; } - inline double overheadSizeAsPercent() const noexcept { + ASMJIT_INLINE_NODEBUG double overheadSizeAsPercent() const noexcept { return (double(overheadSize()) / (double(reservedSize()) + 1e-16)) * 100.0; } }; diff --git a/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp b/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp index 491c2040fbe5a..0cc026987a26e 100644 --- a/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp +++ b/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp @@ -15,6 +15,7 @@ JitRuntime::JitRuntime(const JitAllocator::CreateParams* params) noexcept : _allocator(params) { _environment = Environment::host(); _environment.setObjectFormat(ObjectFormat::kJIT); + _cpuFeatures = CpuInfo::host().features(); } JitRuntime::~JitRuntime() noexcept {} @@ -29,45 +30,43 @@ Error JitRuntime::_add(void** dst, CodeHolder* code) noexcept { if (ASMJIT_UNLIKELY(estimatedCodeSize == 0)) return DebugUtils::errored(kErrorNoCodeGenerated); - uint8_t* rx; - uint8_t* rw; - ASMJIT_PROPAGATE(_allocator.alloc((void**)&rx, (void**)&rw, estimatedCodeSize)); + JitAllocator::Span span; + ASMJIT_PROPAGATE(_allocator.alloc(span, estimatedCodeSize)); // Relocate the code. - Error err = code->relocateToBase(uintptr_t((void*)rx)); + Error err = code->relocateToBase(uintptr_t(span.rx())); if (ASMJIT_UNLIKELY(err)) { - _allocator.release(rx); + _allocator.release(span.rx()); return err; } // Recalculate the final code size and shrink the memory we allocated for it // in case that some relocations didn't require records in an address table. size_t codeSize = code->codeSize(); - if (codeSize < estimatedCodeSize) - _allocator.shrink(rx, codeSize); + ASMJIT_ASSERT(codeSize <= estimatedCodeSize); - if (codeSize < estimatedCodeSize) - _allocator.shrink(rx, codeSize); - - { - VirtMem::ProtectJitReadWriteScope rwScope(rx, codeSize); + _allocator.write(span, [&](JitAllocator::Span& span) noexcept -> Error { + uint8_t* rw = static_cast(span.rw()); for (Section* section : code->_sections) { size_t offset = size_t(section->offset()); size_t bufferSize = size_t(section->bufferSize()); size_t virtualSize = size_t(section->virtualSize()); - ASMJIT_ASSERT(offset + bufferSize <= codeSize); + ASMJIT_ASSERT(offset + bufferSize <= span.size()); memcpy(rw + offset, section->data(), bufferSize); if (virtualSize > bufferSize) { - ASMJIT_ASSERT(offset + virtualSize <= codeSize); + ASMJIT_ASSERT(offset + virtualSize <= span.size()); memset(rw + offset + bufferSize, 0, virtualSize - bufferSize); } } - } - *dst = rx; + span.shrink(codeSize); + return kErrorOk; + }); + + *dst = span.rx(); return kErrorOk; } diff --git a/3rdparty/asmjit/src/asmjit/core/jitruntime.h b/3rdparty/asmjit/src/asmjit/core/jitruntime.h index 6f35e21277ab9..717a6b58d6bb2 100644 --- a/3rdparty/asmjit/src/asmjit/core/jitruntime.h +++ b/3rdparty/asmjit/src/asmjit/core/jitruntime.h @@ -20,8 +20,10 @@ class CodeHolder; //! \addtogroup asmjit_virtual_memory //! \{ -//! JIT execution runtime is a special `Target` that is designed to store and -//! execute the generated code. +//! JIT execution runtime is a special `Target` that is designed to store and execute a generated code. +//! +//! JIT runtime is the easiest way of using AsmJit as it abstracts allocation and deallocation of virtual memory +//! where executable code can be placed and from which it can be executed as well. class ASMJIT_VIRTAPI JitRuntime : public Target { public: ASMJIT_NONCOPYABLE(JitRuntime) @@ -35,9 +37,19 @@ class ASMJIT_VIRTAPI JitRuntime : public Target { //! Creates a `JitRuntime` instance. ASMJIT_API explicit JitRuntime(const JitAllocator::CreateParams* params = nullptr) noexcept; //! Destroys the `JitRuntime` instance. - ASMJIT_API virtual ~JitRuntime() noexcept; + ASMJIT_API ~JitRuntime() noexcept override; - inline void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept { + //! \} + + //! \name Accessors + //! \{ + + //! Resets the \ref JitRuntime, freeing everything that was allocated by it. + //! + //! Depending on `resetPolicy` the currently held memory can be either freed entirely when ResetPolicy::kHard is used, + //! or the allocator can keep some of it for next allocations when ResetPolicy::kSoft is used, which is the default + //! behavior. + ASMJIT_INLINE_NODEBUG void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept { _allocator.reset(resetPolicy); } @@ -47,7 +59,7 @@ class ASMJIT_VIRTAPI JitRuntime : public Target { //! \{ //! Returns the associated `JitAllocator`. - inline JitAllocator* allocator() const noexcept { return const_cast(&_allocator); } + ASMJIT_INLINE_NODEBUG JitAllocator* allocator() const noexcept { return const_cast(&_allocator); } //! \} @@ -62,13 +74,13 @@ class ASMJIT_VIRTAPI JitRuntime : public Target { //! The beginning of the memory allocated for the function is returned in `dst`. If failed `Error` code is returned //! and `dst` is explicitly set to `nullptr` (this means that you don't have to set it to null before calling `add()`). template - inline Error add(Func* dst, CodeHolder* code) noexcept { + ASMJIT_INLINE_NODEBUG Error add(Func* dst, CodeHolder* code) noexcept { return _add(Support::ptr_cast_impl(dst), code); } //! Releases `p` which was obtained by calling `add()`. template - inline Error release(Func p) noexcept { + ASMJIT_INLINE_NODEBUG Error release(Func p) noexcept { return _release(Support::ptr_cast_impl(p)); } diff --git a/3rdparty/asmjit/src/asmjit/core/logger.cpp b/3rdparty/asmjit/src/asmjit/core/logger.cpp index 4567b3c93892d..9bc14bae5fd7e 100644 --- a/3rdparty/asmjit/src/asmjit/core/logger.cpp +++ b/3rdparty/asmjit/src/asmjit/core/logger.cpp @@ -19,6 +19,14 @@ Logger::Logger() noexcept : _options() {} Logger::~Logger() noexcept {} +// [[pure virtual]] +Error Logger::_log(const char* data, size_t size) noexcept { + DebugUtils::unused(data, size); + + // Do not error in this case - the logger would just sink to /dev/null. + return kErrorOk; +} + Error Logger::logf(const char* fmt, ...) noexcept { Error err; va_list ap; diff --git a/3rdparty/asmjit/src/asmjit/core/logger.h b/3rdparty/asmjit/src/asmjit/core/logger.h index d416a50d84d62..54c169f52fed2 100644 --- a/3rdparty/asmjit/src/asmjit/core/logger.h +++ b/3rdparty/asmjit/src/asmjit/core/logger.h @@ -47,38 +47,38 @@ class ASMJIT_VIRTAPI Logger { //! \{ //! Returns \ref FormatOptions of this logger. - inline FormatOptions& options() noexcept { return _options; } + ASMJIT_INLINE_NODEBUG FormatOptions& options() noexcept { return _options; } //! \overload - inline const FormatOptions& options() const noexcept { return _options; } + ASMJIT_INLINE_NODEBUG const FormatOptions& options() const noexcept { return _options; } //! Sets formatting options of this Logger to `options`. - inline void setOptions(const FormatOptions& options) noexcept { _options = options; } + ASMJIT_INLINE_NODEBUG void setOptions(const FormatOptions& options) noexcept { _options = options; } //! Resets formatting options of this Logger to defaults. - inline void resetOptions() noexcept { _options.reset(); } + ASMJIT_INLINE_NODEBUG void resetOptions() noexcept { _options.reset(); } //! Returns formatting flags. - inline FormatFlags flags() const noexcept { return _options.flags(); } + ASMJIT_INLINE_NODEBUG FormatFlags flags() const noexcept { return _options.flags(); } //! Tests whether the logger has the given `flag` enabled. - inline bool hasFlag(FormatFlags flag) const noexcept { return _options.hasFlag(flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(FormatFlags flag) const noexcept { return _options.hasFlag(flag); } //! Sets formatting flags to `flags`. - inline void setFlags(FormatFlags flags) noexcept { _options.setFlags(flags); } + ASMJIT_INLINE_NODEBUG void setFlags(FormatFlags flags) noexcept { _options.setFlags(flags); } //! Enables the given formatting `flags`. - inline void addFlags(FormatFlags flags) noexcept { _options.addFlags(flags); } + ASMJIT_INLINE_NODEBUG void addFlags(FormatFlags flags) noexcept { _options.addFlags(flags); } //! Disables the given formatting `flags`. - inline void clearFlags(FormatFlags flags) noexcept { _options.clearFlags(flags); } + ASMJIT_INLINE_NODEBUG void clearFlags(FormatFlags flags) noexcept { _options.clearFlags(flags); } //! Returns indentation of a given indentation `group`. - inline uint32_t indentation(FormatIndentationGroup type) const noexcept { return _options.indentation(type); } + ASMJIT_INLINE_NODEBUG uint32_t indentation(FormatIndentationGroup type) const noexcept { return _options.indentation(type); } //! Sets indentation of the given indentation `group` to `n` spaces. - inline void setIndentation(FormatIndentationGroup type, uint32_t n) noexcept { _options.setIndentation(type, n); } + ASMJIT_INLINE_NODEBUG void setIndentation(FormatIndentationGroup type, uint32_t n) noexcept { _options.setIndentation(type, n); } //! Resets indentation of the given indentation `group` to 0 spaces. - inline void resetIndentation(FormatIndentationGroup type) noexcept { _options.resetIndentation(type); } + ASMJIT_INLINE_NODEBUG void resetIndentation(FormatIndentationGroup type) noexcept { _options.resetIndentation(type); } //! Returns padding of a given padding `group`. - inline size_t padding(FormatPaddingGroup type) const noexcept { return _options.padding(type); } + ASMJIT_INLINE_NODEBUG size_t padding(FormatPaddingGroup type) const noexcept { return _options.padding(type); } //! Sets padding of a given padding `group` to `n`. - inline void setPadding(FormatPaddingGroup type, uint32_t n) noexcept { _options.setPadding(type, n); } + ASMJIT_INLINE_NODEBUG void setPadding(FormatPaddingGroup type, uint32_t n) noexcept { _options.setPadding(type, n); } //! Resets padding of a given padding `group` to 0, which means that a default will be used. - inline void resetPadding(FormatPaddingGroup type) noexcept { _options.resetPadding(type); } + ASMJIT_INLINE_NODEBUG void resetPadding(FormatPaddingGroup type) noexcept { _options.resetPadding(type); } //! \} @@ -90,12 +90,12 @@ class ASMJIT_VIRTAPI Logger { //! The function can accept either a null terminated string if `size` is `SIZE_MAX` or a non-null terminated //! string of the given `size`. The function cannot assume that the data is null terminated and must handle //! non-null terminated inputs. - virtual Error _log(const char* data, size_t size) noexcept = 0; + ASMJIT_API virtual Error _log(const char* data, size_t size) noexcept; //! Logs string `str`, which is either null terminated or having size `size`. - inline Error log(const char* data, size_t size = SIZE_MAX) noexcept { return _log(data, size); } + ASMJIT_INLINE_NODEBUG Error log(const char* data, size_t size = SIZE_MAX) noexcept { return _log(data, size); } //! Logs content of a string `str`. - inline Error log(const String& str) noexcept { return _log(str.data(), str.size()); } + ASMJIT_INLINE_NODEBUG Error log(const String& str) noexcept { return _log(str.data(), str.size()); } //! Formats the message by using `snprintf()` and then passes the formatted string to \ref _log(). ASMJIT_API Error logf(const char* fmt, ...) noexcept; @@ -119,7 +119,7 @@ class ASMJIT_VIRTAPI FileLogger : public Logger { //! Creates a new `FileLogger` that logs to `FILE*`. ASMJIT_API FileLogger(FILE* file = nullptr) noexcept; //! Destroys the `FileLogger`. - ASMJIT_API virtual ~FileLogger() noexcept; + ASMJIT_API ~FileLogger() noexcept override; //! \} @@ -127,14 +127,14 @@ class ASMJIT_VIRTAPI FileLogger : public Logger { //! \{ //! Returns the logging output stream or null if the logger has no output stream. - inline FILE* file() const noexcept { return _file; } + ASMJIT_INLINE_NODEBUG FILE* file() const noexcept { return _file; } //! Sets the logging output stream to `stream` or null. //! //! \note If the `file` is null the logging will be disabled. When a logger is attached to `CodeHolder` or any //! emitter the logging API will always be called regardless of the output file. This means that if you really //! want to disable logging at emitter level you must not attach a logger to it. - inline void setFile(FILE* file) noexcept { _file = file; } + ASMJIT_INLINE_NODEBUG void setFile(FILE* file) noexcept { _file = file; } //! \} @@ -155,7 +155,7 @@ class ASMJIT_VIRTAPI StringLogger : public Logger { //! Create new `StringLogger`. ASMJIT_API StringLogger() noexcept; //! Destroys the `StringLogger`. - ASMJIT_API virtual ~StringLogger() noexcept; + ASMJIT_API ~StringLogger() noexcept override; //! \} @@ -165,16 +165,16 @@ class ASMJIT_VIRTAPI StringLogger : public Logger { //! Returns the content of the logger as \ref String. //! //! It can be moved, if desired. - inline String& content() noexcept { return _content; } + ASMJIT_INLINE_NODEBUG String& content() noexcept { return _content; } //! \overload - inline const String& content() const noexcept { return _content; } + ASMJIT_INLINE_NODEBUG const String& content() const noexcept { return _content; } //! Returns aggregated logger data as `char*` pointer. //! //! The pointer is owned by `StringLogger`, it can't be modified or freed. - inline const char* data() const noexcept { return _content.data(); } + ASMJIT_INLINE_NODEBUG const char* data() const noexcept { return _content.data(); } //! Returns size of the data returned by `data()`. - inline size_t dataSize() const noexcept { return _content.size(); } + ASMJIT_INLINE_NODEBUG size_t dataSize() const noexcept { return _content.size(); } //! \} @@ -182,7 +182,7 @@ class ASMJIT_VIRTAPI StringLogger : public Logger { //! \{ //! Clears the accumulated logger data. - inline void clear() noexcept { _content.clear(); } + ASMJIT_INLINE_NODEBUG void clear() noexcept { _content.clear(); } //! \} diff --git a/3rdparty/asmjit/src/asmjit/core/operand.cpp b/3rdparty/asmjit/src/asmjit/core/operand.cpp index ee026817f8ece..b78dc54678ac2 100644 --- a/3rdparty/asmjit/src/asmjit/core/operand.cpp +++ b/3rdparty/asmjit/src/asmjit/core/operand.cpp @@ -19,36 +19,36 @@ enum class StrongEnumForImmTests : uint32_t { UNIT(operand) { INFO("Checking operand sizes"); - EXPECT(sizeof(Operand) == 16); - EXPECT(sizeof(BaseReg) == 16); - EXPECT(sizeof(BaseMem) == 16); - EXPECT(sizeof(Imm) == 16); - EXPECT(sizeof(Label) == 16); + EXPECT_EQ(sizeof(Operand), 16u); + EXPECT_EQ(sizeof(BaseReg), 16u); + EXPECT_EQ(sizeof(BaseMem), 16u); + EXPECT_EQ(sizeof(Imm), 16u); + EXPECT_EQ(sizeof(Label), 16u); INFO("Checking basic functionality of Operand"); Operand a, b; Operand dummy; - EXPECT(a.isNone() == true); - EXPECT(a.isReg() == false); - EXPECT(a.isMem() == false); - EXPECT(a.isImm() == false); - EXPECT(a.isLabel() == false); - EXPECT(a == b); - EXPECT(a._data[0] == 0); - EXPECT(a._data[1] == 0); + EXPECT_TRUE(a.isNone()); + EXPECT_FALSE(a.isReg()); + EXPECT_FALSE(a.isMem()); + EXPECT_FALSE(a.isImm()); + EXPECT_FALSE(a.isLabel()); + EXPECT_EQ(a, b); + EXPECT_EQ(a._data[0], 0u); + EXPECT_EQ(a._data[1], 0u); INFO("Checking basic functionality of Label"); Label label; - EXPECT(label.isValid() == false); - EXPECT(label.id() == Globals::kInvalidId); + EXPECT_FALSE(label.isValid()); + EXPECT_EQ(label.id(), Globals::kInvalidId); INFO("Checking basic functionality of BaseReg"); - EXPECT(BaseReg().isReg() == true); - EXPECT(BaseReg().isValid() == false); - EXPECT(BaseReg()._data[0] == 0); - EXPECT(BaseReg()._data[1] == 0); - EXPECT(dummy.as().isValid() == false); + EXPECT_TRUE(BaseReg().isReg()); + EXPECT_FALSE(BaseReg().isValid()); + EXPECT_EQ(BaseReg()._data[0], 0u); + EXPECT_EQ(BaseReg()._data[1], 0u); + EXPECT_FALSE(dummy.as().isValid()); // Create some register (not specific to any architecture). OperandSignature rSig = OperandSignature::fromOpType(OperandType::kReg) | @@ -57,75 +57,75 @@ UNIT(operand) { OperandSignature::fromSize(8); BaseReg r1(rSig, 5); - EXPECT(r1.isValid() == true); - EXPECT(r1.isReg() == true); - EXPECT(r1.isReg(RegType::kVec128) == true); - EXPECT(r1.isPhysReg() == true); - EXPECT(r1.isVirtReg() == false); - EXPECT(r1.signature() == rSig); - EXPECT(r1.type() == RegType::kVec128); - EXPECT(r1.group() == RegGroup::kVec); - EXPECT(r1.size() == 8); - EXPECT(r1.id() == 5); - EXPECT(r1.isReg(RegType::kVec128, 5) == true); // RegType and Id. - EXPECT(r1._data[0] == 0); - EXPECT(r1._data[1] == 0); + EXPECT_TRUE(r1.isValid()); + EXPECT_TRUE(r1.isReg()); + EXPECT_TRUE(r1.isReg(RegType::kVec128)); + EXPECT_TRUE(r1.isPhysReg()); + EXPECT_FALSE(r1.isVirtReg()); + EXPECT_EQ(r1.signature(), rSig); + EXPECT_EQ(r1.type(), RegType::kVec128); + EXPECT_EQ(r1.group(), RegGroup::kVec); + EXPECT_EQ(r1.size(), 8u); + EXPECT_EQ(r1.id(), 5u); + EXPECT_TRUE(r1.isReg(RegType::kVec128, 5)); // RegType and Id. + EXPECT_EQ(r1._data[0], 0u); + EXPECT_EQ(r1._data[1], 0u); // The same type of register having different id. BaseReg r2(r1, 6); - EXPECT(r2.isValid() == true); - EXPECT(r2.isReg() == true); - EXPECT(r2.isReg(RegType::kVec128) == true); - EXPECT(r2.isPhysReg() == true); - EXPECT(r2.isVirtReg() == false); - EXPECT(r2.signature() == rSig); - EXPECT(r2.type() == r1.type()); - EXPECT(r2.group() == r1.group()); - EXPECT(r2.size() == r1.size()); - EXPECT(r2.id() == 6); - EXPECT(r2.isReg(RegType::kVec128, 6) == true); + EXPECT_TRUE(r2.isValid()); + EXPECT_TRUE(r2.isReg()); + EXPECT_TRUE(r2.isReg(RegType::kVec128)); + EXPECT_TRUE(r2.isPhysReg()); + EXPECT_FALSE(r2.isVirtReg()); + EXPECT_EQ(r2.signature(), rSig); + EXPECT_EQ(r2.type(), r1.type()); + EXPECT_EQ(r2.group(), r1.group()); + EXPECT_EQ(r2.size(), r1.size()); + EXPECT_EQ(r2.id(), 6u); + EXPECT_TRUE(r2.isReg(RegType::kVec128, 6)); r1.reset(); - EXPECT(!r1.isReg()); - EXPECT(!r1.isValid()); + EXPECT_FALSE(r1.isReg()); + EXPECT_FALSE(r1.isValid()); INFO("Checking basic functionality of BaseMem"); BaseMem m; - EXPECT(m.isMem()); - EXPECT(m == BaseMem()); - EXPECT(m.hasBase() == false); - EXPECT(m.hasIndex() == false); - EXPECT(m.hasOffset() == false); - EXPECT(m.isOffset64Bit() == true); - EXPECT(m.offset() == 0); + EXPECT_TRUE(m.isMem()); + EXPECT_EQ(m, BaseMem()); + EXPECT_FALSE(m.hasBase()); + EXPECT_FALSE(m.hasIndex()); + EXPECT_FALSE(m.hasOffset()); + EXPECT_TRUE(m.isOffset64Bit()); + EXPECT_EQ(m.offset(), 0); m.setOffset(-1); - EXPECT(m.offsetLo32() == -1); - EXPECT(m.offset() == -1); + EXPECT_EQ(m.offsetLo32(), -1); + EXPECT_EQ(m.offset(), -1); int64_t x = int64_t(0xFF00FF0000000001u); int32_t xHi = int32_t(0xFF00FF00u); m.setOffset(x); - EXPECT(m.offset() == x); - EXPECT(m.offsetLo32() == 1); - EXPECT(m.offsetHi32() == xHi); + EXPECT_EQ(m.offset(), x); + EXPECT_EQ(m.offsetLo32(), 1); + EXPECT_EQ(m.offsetHi32(), xHi); INFO("Checking basic functionality of Imm"); Imm immValue(-42); - EXPECT(immValue.type() == ImmType::kInt); - EXPECT(Imm(-1).value() == -1); - EXPECT(imm(-1).value() == -1); - EXPECT(immValue.value() == -42); - EXPECT(imm(0xFFFFFFFF).value() == int64_t(0xFFFFFFFF)); + EXPECT_EQ(immValue.type(), ImmType::kInt); + EXPECT_EQ(Imm(-1).value(), -1); + EXPECT_EQ(imm(-1).value(), -1); + EXPECT_EQ(immValue.value(), -42); + EXPECT_EQ(imm(0xFFFFFFFF).value(), int64_t(0xFFFFFFFF)); Imm immDouble(0.4); - EXPECT(immDouble.type() == ImmType::kDouble); - EXPECT(immDouble.valueAs() == 0.4); - EXPECT(immDouble == imm(0.4)); + EXPECT_EQ(immDouble.type(), ImmType::kDouble); + EXPECT_EQ(immDouble.valueAs(), 0.4); + EXPECT_EQ(immDouble, imm(0.4)); - EXPECT(Imm(StrongEnumForImmTests::kValue0).value() == 0); - EXPECT(Imm(StrongEnumForImmTests::kValue0xFFFFFFFF).value() == 0xFFFFFFFFu); + EXPECT_EQ(Imm(StrongEnumForImmTests::kValue0).value(), 0); + EXPECT_EQ(Imm(StrongEnumForImmTests::kValue0xFFFFFFFF).value(), 0xFFFFFFFFu); } #endif diff --git a/3rdparty/asmjit/src/asmjit/core/operand.h b/3rdparty/asmjit/src/asmjit/core/operand.h index 2f81a217f1bd8..8a1eee79b2ff5 100644 --- a/3rdparty/asmjit/src/asmjit/core/operand.h +++ b/3rdparty/asmjit/src/asmjit/core/operand.h @@ -23,13 +23,15 @@ enum class OperandType : uint32_t { kReg = 1, //! Operand is a memory. kMem = 2, + //! Operand is a register-list. + kRegList = 3, //! Operand is an immediate value. - kImm = 3, + kImm = 4, //! Operand is a label. - kLabel = 4, + kLabel = 5, //! Maximum value of `OperandType`. - kMaxValue = kLabel + kMaxValue = kRegList }; static_assert(uint32_t(OperandType::kMem) == uint32_t(OperandType::kReg) + 1, @@ -47,7 +49,7 @@ enum class RegType : uint8_t { //! No register - unused, invalid, multiple meanings. kNone = 0, - //! This is not a register type. This value is reserved for a \ref Label that used in \ref BaseMem as a base. + //! This is not a register type. This value is reserved for a \ref Label that's used in \ref BaseMem as a base. //! //! Label tag is used as a sub-type, forming a unique signature across all operand types as 0x1 is never associated //! with any register type. This means that a memory operand's BASE register can be constructed from virtually any @@ -55,7 +57,7 @@ enum class RegType : uint8_t { kLabelTag = 1, //! Universal type describing program counter (PC) or instruction pointer (IP) register, if the target architecture - //! actually exposes it as a separate register type, which most modern targets do. + //! actually exposes it as a separate register type, which most modern architectures do. kPC = 2, //! 8-bit low general purpose register (X86). @@ -64,21 +66,21 @@ enum class RegType : uint8_t { kGp8Hi = 4, //! 16-bit general purpose register (X86). kGp16 = 5, - //! 32-bit general purpose register (X86|ARM). + //! 32-bit general purpose register (X86|AArch32|AArch64). kGp32 = 6, - //! 64-bit general purpose register (X86|ARM). + //! 64-bit general purpose register (X86|AArch64). kGp64 = 7, - //! 8-bit view of a vector register (ARM). + //! 8-bit view of a vector register (AArch64). kVec8 = 8, - //! 16-bit view of a vector register (ARM). + //! 16-bit view of a vector register (AArch64). kVec16 = 9, - //! 32-bit view of a vector register (ARM). + //! 32-bit view of a vector register (AArch32|AArch64). kVec32 = 10, - //! 64-bit view of a vector register (ARM). + //! 64-bit view of a vector register (AArch32|AArch64). //! //! \note This is never used for MMX registers on X86, MMX registers have its own category. kVec64 = 11, - //! 128-bit view of a vector register (X86|ARM). + //! 128-bit view of a vector register (X86|AArch32|AArch64). kVec128 = 12, //! 256-bit view of a vector register (X86). kVec256 = 13, @@ -98,9 +100,6 @@ enum class RegType : uint8_t { // X86 Specific Register Types // --------------------------- - // X86 Specific Register Types - // =========================== - //! Instruction pointer (RIP), only addressable in \ref x86::Mem in 64-bit targets. kX86_Rip = kPC, //! Low GPB register (AL, BL, CL, DL, ...). @@ -137,7 +136,7 @@ enum class RegType : uint8_t { kX86_Tmm = kExtra + 6, // ARM Specific Register Types - // =========================== + // --------------------------- //! Program pointer (PC) register (AArch64). kARM_PC = kPC, @@ -153,7 +152,9 @@ enum class RegType : uint8_t { kARM_VecS = kVec32, //! 64-bit view of VFP/ASIMD register (D). kARM_VecD = kVec64, - //! 128-bit view of VFP/ASIMD register (Q|V). + //! 128-bit view of VFP/ASIMD register (Q). + kARM_VecQ = kVec128, + //! 128-bit view of VFP/ASIMD register (V). kARM_VecV = kVec128, //! Maximum value of `RegType`. @@ -172,8 +173,8 @@ enum class RegGroup : uint8_t { //! Describes X86 XMM|YMM|ZMM registers ARM/AArch64 V registers. kVec = 1, - //! Extra virtual group #2 that can be used by Compiler for register allocation. - kExtraVirt2 = 2, + //! Mask register group compatible with all backends that can use masking. + kMask = 2, //! Extra virtual group #3 that can be used by Compiler for register allocation. kExtraVirt3 = 3, @@ -186,8 +187,8 @@ enum class RegGroup : uint8_t { // X86 Specific Register Groups // ---------------------------- - //! K register group (KReg) - maps to \ref RegGroup::kExtraVirt2 (X86, X86_64). - kX86_K = kExtraVirt2, + //! K register group (KReg) - maps to \ref RegGroup::kMask (X86, X86_64). + kX86_K = kMask, //! MMX register group (MM) - maps to \ref RegGroup::kExtraVirt3 (X86, X86_64). kX86_MM = kExtraVirt3, @@ -294,147 +295,150 @@ struct OperandSignature { //! //! \{ - inline constexpr bool operator!() const noexcept { return _bits != 0; } - inline constexpr explicit operator bool() const noexcept { return _bits != 0; } + ASMJIT_INLINE_NODEBUG constexpr bool operator!() const noexcept { return _bits == 0; } + ASMJIT_INLINE_NODEBUG constexpr explicit operator bool() const noexcept { return _bits != 0; } - inline OperandSignature& operator|=(uint32_t x) noexcept { _bits |= x; return *this; } - inline OperandSignature& operator&=(uint32_t x) noexcept { _bits &= x; return *this; } - inline OperandSignature& operator^=(uint32_t x) noexcept { _bits ^= x; return *this; } + ASMJIT_INLINE_NODEBUG OperandSignature& operator|=(uint32_t x) noexcept { _bits |= x; return *this; } + ASMJIT_INLINE_NODEBUG OperandSignature& operator&=(uint32_t x) noexcept { _bits &= x; return *this; } + ASMJIT_INLINE_NODEBUG OperandSignature& operator^=(uint32_t x) noexcept { _bits ^= x; return *this; } - inline OperandSignature& operator|=(const OperandSignature& other) noexcept { return operator|=(other._bits); } - inline OperandSignature& operator&=(const OperandSignature& other) noexcept { return operator&=(other._bits); } - inline OperandSignature& operator^=(const OperandSignature& other) noexcept { return operator^=(other._bits); } + ASMJIT_INLINE_NODEBUG OperandSignature& operator|=(const OperandSignature& other) noexcept { return operator|=(other._bits); } + ASMJIT_INLINE_NODEBUG OperandSignature& operator&=(const OperandSignature& other) noexcept { return operator&=(other._bits); } + ASMJIT_INLINE_NODEBUG OperandSignature& operator^=(const OperandSignature& other) noexcept { return operator^=(other._bits); } - inline constexpr OperandSignature operator~() const noexcept { return OperandSignature{~_bits}; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator~() const noexcept { return OperandSignature{~_bits}; } - inline constexpr OperandSignature operator|(uint32_t x) const noexcept { return OperandSignature{_bits | x}; } - inline constexpr OperandSignature operator&(uint32_t x) const noexcept { return OperandSignature{_bits & x}; } - inline constexpr OperandSignature operator^(uint32_t x) const noexcept { return OperandSignature{_bits ^ x}; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator|(uint32_t x) const noexcept { return OperandSignature{_bits | x}; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator&(uint32_t x) const noexcept { return OperandSignature{_bits & x}; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator^(uint32_t x) const noexcept { return OperandSignature{_bits ^ x}; } - inline constexpr OperandSignature operator|(const OperandSignature& other) const noexcept { return OperandSignature{_bits | other._bits}; } - inline constexpr OperandSignature operator&(const OperandSignature& other) const noexcept { return OperandSignature{_bits & other._bits}; } - inline constexpr OperandSignature operator^(const OperandSignature& other) const noexcept { return OperandSignature{_bits ^ other._bits}; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator|(const OperandSignature& other) const noexcept { return OperandSignature{_bits | other._bits}; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator&(const OperandSignature& other) const noexcept { return OperandSignature{_bits & other._bits}; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator^(const OperandSignature& other) const noexcept { return OperandSignature{_bits ^ other._bits}; } - inline constexpr bool operator==(uint32_t x) const noexcept { return _bits == x; } - inline constexpr bool operator!=(uint32_t x) const noexcept { return _bits != x; } + ASMJIT_INLINE_NODEBUG constexpr bool operator==(uint32_t x) const noexcept { return _bits == x; } + ASMJIT_INLINE_NODEBUG constexpr bool operator!=(uint32_t x) const noexcept { return _bits != x; } - inline constexpr bool operator==(const OperandSignature& other) const noexcept { return _bits == other._bits; } - inline constexpr bool operator!=(const OperandSignature& other) const noexcept { return _bits != other._bits; } + ASMJIT_INLINE_NODEBUG constexpr bool operator==(const OperandSignature& other) const noexcept { return _bits == other._bits; } + ASMJIT_INLINE_NODEBUG constexpr bool operator!=(const OperandSignature& other) const noexcept { return _bits != other._bits; } //! \} //! \name Accessors //! \{ - inline void reset() noexcept { _bits = 0; } + ASMJIT_INLINE_NODEBUG void reset() noexcept { _bits = 0; } - inline constexpr uint32_t bits() const noexcept { return _bits; } - inline void setBits(uint32_t bits) noexcept { _bits = bits; } + ASMJIT_INLINE_NODEBUG constexpr uint32_t bits() const noexcept { return _bits; } + ASMJIT_INLINE_NODEBUG void setBits(uint32_t bits) noexcept { _bits = bits; } - template::value> - inline constexpr bool hasField() const noexcept { + template + ASMJIT_INLINE_NODEBUG constexpr bool hasField() const noexcept { return (_bits & kFieldMask) != 0; } - template::value> - inline constexpr bool hasField(uint32_t value) const noexcept { - return (_bits & kFieldMask) != value << kFieldShift; + template + ASMJIT_INLINE_NODEBUG constexpr bool hasField(uint32_t value) const noexcept { + return (_bits & kFieldMask) != value << Support::ConstCTZ::value; } - template::value> - inline constexpr uint32_t getField() const noexcept { - return (_bits >> kFieldShift) & (kFieldMask >> kFieldShift); + template + ASMJIT_INLINE_NODEBUG constexpr uint32_t getField() const noexcept { + return (_bits >> Support::ConstCTZ::value) & (kFieldMask >> Support::ConstCTZ::value); } - template::value> - inline void setField(uint32_t value) noexcept { - ASMJIT_ASSERT((value & ~(kFieldMask >> kFieldShift)) == 0); - _bits = (_bits & ~kFieldMask) | (value << kFieldShift); + template + ASMJIT_INLINE_NODEBUG void setField(uint32_t value) noexcept { + ASMJIT_ASSERT(((value << Support::ConstCTZ::value) & ~kFieldMask) == 0); + _bits = (_bits & ~kFieldMask) | (value << Support::ConstCTZ::value); } - inline constexpr OperandSignature subset(uint32_t mask) const noexcept { return OperandSignature{_bits & mask}; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature subset(uint32_t mask) const noexcept { return OperandSignature{_bits & mask}; } + + template::value> + ASMJIT_INLINE_NODEBUG constexpr OperandSignature replacedValue(uint32_t value) const noexcept { return OperandSignature{(_bits & ~kFieldMask) | (value << kFieldShift)}; } template - inline constexpr bool matchesSignature(const OperandSignature& signature) const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool matchesSignature(const OperandSignature& signature) const noexcept { return (_bits & kFieldMask) == signature._bits; } template - inline constexpr bool matchesFields(uint32_t bits) const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool matchesFields(uint32_t bits) const noexcept { return (_bits & kFieldMask) == bits; } template - inline constexpr bool matchesFields(const OperandSignature& fields) const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool matchesFields(const OperandSignature& fields) const noexcept { return (_bits & kFieldMask) == fields._bits; } - inline constexpr bool isValid() const noexcept { return _bits != 0; } + ASMJIT_INLINE_NODEBUG constexpr bool isValid() const noexcept { return _bits != 0; } - inline constexpr OperandType opType() const noexcept { return (OperandType)getField(); } + ASMJIT_INLINE_NODEBUG constexpr OperandType opType() const noexcept { return (OperandType)getField(); } - inline constexpr RegType regType() const noexcept { return (RegType)getField(); } - inline constexpr RegGroup regGroup() const noexcept { return (RegGroup)getField(); } + ASMJIT_INLINE_NODEBUG constexpr RegType regType() const noexcept { return (RegType)getField(); } + ASMJIT_INLINE_NODEBUG constexpr RegGroup regGroup() const noexcept { return (RegGroup)getField(); } - inline constexpr RegType memBaseType() const noexcept { return (RegType)getField(); } - inline constexpr RegType memIndexType() const noexcept { return (RegType)getField(); } + ASMJIT_INLINE_NODEBUG constexpr RegType memBaseType() const noexcept { return (RegType)getField(); } + ASMJIT_INLINE_NODEBUG constexpr RegType memIndexType() const noexcept { return (RegType)getField(); } - inline constexpr uint32_t predicate() const noexcept { return getField(); } - inline constexpr uint32_t size() const noexcept { return getField(); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t predicate() const noexcept { return getField(); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return getField(); } - inline void setOpType(OperandType opType) noexcept { setField(uint32_t(opType)); } - inline void setRegType(RegType regType) noexcept { setField(uint32_t(regType)); } - inline void setRegGroup(RegGroup regGroup) noexcept { setField(uint32_t(regGroup)); } + ASMJIT_INLINE_NODEBUG void setOpType(OperandType opType) noexcept { setField(uint32_t(opType)); } + ASMJIT_INLINE_NODEBUG void setRegType(RegType regType) noexcept { setField(uint32_t(regType)); } + ASMJIT_INLINE_NODEBUG void setRegGroup(RegGroup regGroup) noexcept { setField(uint32_t(regGroup)); } - inline void setMemBaseType(RegGroup baseType) noexcept { setField(uint32_t(baseType)); } - inline void setMemIndexType(RegGroup indexType) noexcept { setField(uint32_t(indexType)); } + ASMJIT_INLINE_NODEBUG void setMemBaseType(RegType baseType) noexcept { setField(uint32_t(baseType)); } + ASMJIT_INLINE_NODEBUG void setMemIndexType(RegType indexType) noexcept { setField(uint32_t(indexType)); } - inline void setPredicate(uint32_t predicate) noexcept { setField(predicate); } - inline void setSize(uint32_t size) noexcept { setField(size); } + ASMJIT_INLINE_NODEBUG void setPredicate(uint32_t predicate) noexcept { setField(predicate); } + ASMJIT_INLINE_NODEBUG void setSize(uint32_t size) noexcept { setField(size); } //! \} //! \name Static Constructors //! \{ - static inline constexpr OperandSignature fromBits(uint32_t bits) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromBits(uint32_t bits) noexcept { return OperandSignature{bits}; } template - static inline constexpr OperandSignature fromValue(const T& value) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromValue(const T& value) noexcept { return OperandSignature{uint32_t(value) << Support::ConstCTZ::value}; } - static inline constexpr OperandSignature fromOpType(OperandType opType) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromOpType(OperandType opType) noexcept { return OperandSignature{uint32_t(opType) << kOpTypeShift}; } - static inline constexpr OperandSignature fromRegType(RegType regType) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromRegType(RegType regType) noexcept { return OperandSignature{uint32_t(regType) << kRegTypeShift}; } - static inline constexpr OperandSignature fromRegGroup(RegGroup regGroup) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromRegGroup(RegGroup regGroup) noexcept { return OperandSignature{uint32_t(regGroup) << kRegGroupShift}; } - static inline constexpr OperandSignature fromRegTypeAndGroup(RegType regType, RegGroup regGroup) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromRegTypeAndGroup(RegType regType, RegGroup regGroup) noexcept { return fromRegType(regType) | fromRegGroup(regGroup); } - static inline constexpr OperandSignature fromMemBaseType(RegType baseType) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromMemBaseType(RegType baseType) noexcept { return OperandSignature{uint32_t(baseType) << kMemBaseTypeShift}; } - static inline constexpr OperandSignature fromMemIndexType(RegType indexType) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromMemIndexType(RegType indexType) noexcept { return OperandSignature{uint32_t(indexType) << kMemIndexTypeShift}; } - static inline constexpr OperandSignature fromPredicate(uint32_t predicate) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromPredicate(uint32_t predicate) noexcept { return OperandSignature{predicate << kPredicateShift}; } - static inline constexpr OperandSignature fromSize(uint32_t size) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromSize(uint32_t size) noexcept { return OperandSignature{size << kSizeShift}; } @@ -506,18 +510,18 @@ struct Operand_ { //! Tests whether the given `id` is a valid virtual register id. Since AsmJit supports both physical and virtual //! registers it must be able to distinguish between these two. The idea is that physical registers are always //! limited in size, so virtual identifiers start from `kVirtIdMin` and end at `kVirtIdMax`. - static inline bool isVirtId(uint32_t id) noexcept { return id - kVirtIdMin < uint32_t(kVirtIdCount); } + static ASMJIT_INLINE_NODEBUG bool isVirtId(uint32_t id) noexcept { return id - kVirtIdMin < uint32_t(kVirtIdCount); } //! Converts a real-id into a packed-id that can be stored in Operand. - static inline uint32_t indexToVirtId(uint32_t id) noexcept { return id + kVirtIdMin; } + static ASMJIT_INLINE_NODEBUG uint32_t indexToVirtId(uint32_t id) noexcept { return id + kVirtIdMin; } //! Converts a packed-id back to real-id. - static inline uint32_t virtIdToIndex(uint32_t id) noexcept { return id - kVirtIdMin; } + static ASMJIT_INLINE_NODEBUG uint32_t virtIdToIndex(uint32_t id) noexcept { return id - kVirtIdMin; } //! \name Construction & Destruction //! \{ //! \cond INTERNAL //! Initializes a `BaseReg` operand from `signature` and register `id`. - inline void _initReg(const Signature& signature, uint32_t id) noexcept { + ASMJIT_INLINE_NODEBUG void _initReg(const Signature& signature, uint32_t id) noexcept { _signature = signature; _baseId = id; _data[0] = 0; @@ -526,7 +530,12 @@ struct Operand_ { //! \endcond //! Initializes the operand from `other` operand (used by operator overloads). - inline void copyFrom(const Operand_& other) noexcept { memcpy(this, &other, sizeof(Operand_)); } + ASMJIT_INLINE_NODEBUG void copyFrom(const Operand_& other) noexcept { + _signature._bits = other._signature._bits; + _baseId = other._baseId; + _data[0] = other._data[0]; + _data[1] = other._data[1]; + } //! Resets the `Operand` to none. //! @@ -555,7 +564,7 @@ struct Operand_ { //! memset(&b, 0, sizeof(Operand)); //! assert(a == b); //! ``` - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _signature.reset(); _baseId = 0; _data[0] = 0; @@ -568,9 +577,9 @@ struct Operand_ { //! \{ //! Tests whether this operand is the same as `other`. - inline constexpr bool operator==(const Operand_& other) const noexcept { return equals(other); } + ASMJIT_INLINE_NODEBUG constexpr bool operator==(const Operand_& other) const noexcept { return equals(other); } //! Tests whether this operand is not the same as `other`. - inline constexpr bool operator!=(const Operand_& other) const noexcept { return !equals(other); } + ASMJIT_INLINE_NODEBUG constexpr bool operator!=(const Operand_& other) const noexcept { return !equals(other); } //! \} @@ -579,11 +588,27 @@ struct Operand_ { //! Casts this operand to `T` type. template - inline T& as() noexcept { return static_cast(*this); } + ASMJIT_INLINE_NODEBUG T& as() noexcept { return static_cast(*this); } //! Casts this operand to `T` type (const). template - inline const T& as() const noexcept { return static_cast(*this); } + ASMJIT_INLINE_NODEBUG const T& as() const noexcept { return static_cast(*this); } + + //! \} + + //! \name Equality + //! \{ + + //! Tests whether the operand is 100% equal to `other` operand. + //! + //! \note This basically performs a binary comparison, if aby bit is + //! different the operands are not equal. + ASMJIT_INLINE_NODEBUG constexpr bool equals(const Operand_& other) const noexcept { + return bool(unsigned(_signature == other._signature) & + unsigned(_baseId == other._baseId ) & + unsigned(_data[0] == other._data[0] ) & + unsigned(_data[1] == other._data[1] )); + } //! \} @@ -591,55 +616,44 @@ struct Operand_ { //! \{ //! Tests whether the operand's signature matches the signature of the `other` operand. - inline constexpr bool hasSignature(const Operand_& other) const noexcept { return _signature == other._signature; } + ASMJIT_INLINE_NODEBUG constexpr bool hasSignature(const Operand_& other) const noexcept { return _signature == other._signature; } //! Tests whether the operand's signature matches the given signature `sign`. - inline constexpr bool hasSignature(const Signature& other) const noexcept { return _signature == other; } + ASMJIT_INLINE_NODEBUG constexpr bool hasSignature(const Signature& other) const noexcept { return _signature == other; } //! Returns operand signature as unsigned 32-bit integer. //! //! Signature is first 4 bytes of the operand data. It's used mostly for operand checking as it's //! much faster to check packed 4 bytes at once than having to check these bytes individually. - inline constexpr Signature signature() const noexcept { return _signature; } + ASMJIT_INLINE_NODEBUG constexpr Signature signature() const noexcept { return _signature; } //! Sets the operand signature, see `signature()`. //! //! \note Improper use of `setSignature()` can lead to hard-to-debug errors. - inline void setSignature(const Signature& signature) noexcept { _signature = signature; } + ASMJIT_INLINE_NODEBUG void setSignature(const Signature& signature) noexcept { _signature = signature; } + //! \overload + ASMJIT_INLINE_NODEBUG void setSignature(uint32_t signature) noexcept { _signature._bits = signature; } //! Returns the type of the operand, see `OpType`. - inline constexpr OperandType opType() const noexcept { return _signature.opType(); } + ASMJIT_INLINE_NODEBUG constexpr OperandType opType() const noexcept { return _signature.opType(); } //! Tests whether the operand is none (`OperandType::kNone`). - inline constexpr bool isNone() const noexcept { return _signature == Signature::fromBits(0); } + ASMJIT_INLINE_NODEBUG constexpr bool isNone() const noexcept { return _signature == Signature::fromBits(0); } //! Tests whether the operand is a register (`OperandType::kReg`). - inline constexpr bool isReg() const noexcept { return opType() == OperandType::kReg; } + ASMJIT_INLINE_NODEBUG constexpr bool isReg() const noexcept { return opType() == OperandType::kReg; } + //! Tests whether the operand is a register-list. + //! + //! \note Register-list is currently only used by 32-bit ARM architecture. + ASMJIT_INLINE_NODEBUG constexpr bool isRegList() const noexcept { return opType() == OperandType::kRegList; } //! Tests whether the operand is a memory location (`OperandType::kMem`). - inline constexpr bool isMem() const noexcept { return opType() == OperandType::kMem; } + ASMJIT_INLINE_NODEBUG constexpr bool isMem() const noexcept { return opType() == OperandType::kMem; } //! Tests whether the operand is an immediate (`OperandType::kImm`). - inline constexpr bool isImm() const noexcept { return opType() == OperandType::kImm; } + ASMJIT_INLINE_NODEBUG constexpr bool isImm() const noexcept { return opType() == OperandType::kImm; } //! Tests whether the operand is a label (`OperandType::kLabel`). - inline constexpr bool isLabel() const noexcept { return opType() == OperandType::kLabel; } + ASMJIT_INLINE_NODEBUG constexpr bool isLabel() const noexcept { return opType() == OperandType::kLabel; } //! Tests whether the operand is a physical register. - inline constexpr bool isPhysReg() const noexcept { return isReg() && _baseId < 0xFFu; } + ASMJIT_INLINE_NODEBUG constexpr bool isPhysReg() const noexcept { return isReg() && _baseId < 0xFFu; } //! Tests whether the operand is a virtual register. - inline constexpr bool isVirtReg() const noexcept { return isReg() && _baseId > 0xFFu; } - - //! Tests whether the operand specifies a size (i.e. the size is not zero). - inline constexpr bool hasSize() const noexcept { return _signature.hasField(); } - //! Tests whether the size of the operand matches `size`. - inline constexpr bool hasSize(uint32_t s) const noexcept { return size() == s; } - - //! Returns the size of the operand in bytes. - //! - //! The value returned depends on the operand type: - //! * None - Should always return zero size. - //! * Reg - Should always return the size of the register. If the register size depends on architecture - //! (like `x86::CReg` and `x86::DReg`) the size returned should be the greatest possible (so it - //! should return 64-bit size in such case). - //! * Mem - Size is optional and will be in most cases zero. - //! * Imm - Should always return zero size. - //! * Label - Should always return zero size. - inline constexpr uint32_t size() const noexcept { return _signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr bool isVirtReg() const noexcept { return isReg() && _baseId > 0xFFu; } //! Returns the operand id. //! @@ -650,34 +664,99 @@ struct Operand_ { //! * Imm - Should be `0`. //! * Label - Label id if it was created by using `newLabel()` or `Globals::kInvalidId` if the label is invalid or //! not initialized. - inline constexpr uint32_t id() const noexcept { return _baseId; } - - //! Tests whether the operand is 100% equal to `other` operand. - //! - //! \note This basically performs a binary comparison, if aby bit is - //! different the operands are not equal. - inline constexpr bool equals(const Operand_& other) const noexcept { - return (_signature == other._signature) & - (_baseId == other._baseId ) & - (_data[0] == other._data[0] ) & - (_data[1] == other._data[1] ) ; - } + ASMJIT_INLINE_NODEBUG constexpr uint32_t id() const noexcept { return _baseId; } //! Tests whether the operand is a register matching the given register `type`. - inline constexpr bool isReg(RegType type) const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegType type) const noexcept { return _signature.subset(Signature::kOpTypeMask | Signature::kRegTypeMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegType(type)); } - //! Tests whether the operand is register and of register `type` and `id`. - inline constexpr bool isReg(RegType type, uint32_t id) const noexcept { - return isReg(type) && this->id() == id; + //! Tests whether the operand is a register of the provided register group `regGroup`. + ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegGroup regGroup) const noexcept { + return _signature.subset(Signature::kOpTypeMask | Signature::kRegGroupMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(regGroup)); + } + + //! Tests whether the operand is register and of register type `regType` and `regId`. + ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegType regType, uint32_t regId) const noexcept { return isReg(regType) && _baseId == regId; } + //! Tests whether the operand is register and of register group `regGroup` and `regId`. + ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegGroup regGroup, uint32_t regId) const noexcept { return isReg(regGroup) && _baseId == regId; } + + //! Tests whether the register is a general purpose register (any size). + ASMJIT_INLINE_NODEBUG constexpr bool isGp() const noexcept { return isReg(RegGroup::kGp); } + //! Tests whether the register is a 32-bit general purpose register. + ASMJIT_INLINE_NODEBUG constexpr bool isGp32() const noexcept { return isReg(RegType::kGp32); } + //! Tests whether the register is a 64-bit general purpose register. + ASMJIT_INLINE_NODEBUG constexpr bool isGp64() const noexcept { return isReg(RegType::kGp64); } + + //! Tests whether the register is a vector register of any size. + ASMJIT_INLINE_NODEBUG constexpr bool isVec() const noexcept { return isReg(RegGroup::kVec); } + //! Tests whether the register is an 8-bit vector register or view (AArch64). + ASMJIT_INLINE_NODEBUG constexpr bool isVec8() const noexcept { return isReg(RegType::kVec8); } + //! Tests whether the register is a 16-bit vector register or view (AArch64). + ASMJIT_INLINE_NODEBUG constexpr bool isVec16() const noexcept { return isReg(RegType::kVec16); } + //! Tests whether the register is a 32-bit vector register or view (AArch32, AArch64). + ASMJIT_INLINE_NODEBUG constexpr bool isVec32() const noexcept { return isReg(RegType::kVec32); } + //! Tests whether the register is a 64-bit vector register or view (AArch32, AArch64). + ASMJIT_INLINE_NODEBUG constexpr bool isVec64() const noexcept { return isReg(RegType::kVec64); } + //! Tests whether the register is a 128-bit vector register or view (AArch32, AArch64, X86, X86_64). + ASMJIT_INLINE_NODEBUG constexpr bool isVec128() const noexcept { return isReg(RegType::kVec128); } + //! Tests whether the register is a 256-bit vector register or view (X86, X86_64). + ASMJIT_INLINE_NODEBUG constexpr bool isVec256() const noexcept { return isReg(RegType::kVec256); } + //! Tests whether the register is a 512-bit vector register or view (X86, X86_64). + ASMJIT_INLINE_NODEBUG constexpr bool isVec512() const noexcept { return isReg(RegType::kVec512); } + + //! Tests whether the register is a mask register of any size. + ASMJIT_INLINE_NODEBUG constexpr bool isMask() const noexcept { return isReg(RegGroup::kMask); } + + //! Tests whether the operand is a register matching the given register `type`. + ASMJIT_INLINE_NODEBUG constexpr bool isRegList(RegType type) const noexcept { + return _signature.subset(Signature::kOpTypeMask | Signature::kRegTypeMask) == (Signature::fromOpType(OperandType::kRegList) | Signature::fromRegType(type)); } //! Tests whether the operand is a register or memory. - inline constexpr bool isRegOrMem() const noexcept { + //! + //! \note This is useful on X86 and X86_64 architectures as many instructions support Reg/Mem operand combination. + //! So if the user code works with just \ref Operand, it's possible to check whether the operand is either a register + //! or memory location with a single check. + ASMJIT_INLINE_NODEBUG constexpr bool isRegOrMem() const noexcept { return Support::isBetween(uint32_t(opType()), uint32_t(OperandType::kReg), uint32_t(OperandType::kMem)); } + //! Tests whether the operand is a register, register-list, or memory. + //! + //! \note This is useful on 32-bit ARM architecture to check whether an operand references a register. It can be + //! used in other architectures too, but it would work identically to \ref isRegOrMem() as other architectures + //! don't provide register lists. + ASMJIT_INLINE_NODEBUG constexpr bool isRegOrRegListOrMem() const noexcept { + return Support::isBetween(uint32_t(opType()), uint32_t(OperandType::kReg), uint32_t(OperandType::kRegList)); + } + + //! \} + + //! \name Accessors (X86 Specific) + //! \{ + + //! Returns a size of a register or an X86 memory operand. + //! + //! At the moment only X86 and X86_64 memory operands have a size - other memory operands can use bits that represent + //! size as an additional payload. This means that memory size is architecture specific and should be accessed via + //! \ref x86::Mem::size(). Sometimes when the user knows that the operand is either a register or memory operand this + //! function can be helpful as it avoids casting. + ASMJIT_INLINE_NODEBUG constexpr uint32_t x86RmSize() const noexcept { + return _signature.size(); + } + +#if !defined(ASMJIT_NO_DEPRECATED) + ASMJIT_DEPRECATED("hasSize() is no longer portable - use x86RmSize() instead, if your target is X86/X86_64") + ASMJIT_INLINE_NODEBUG constexpr bool hasSize() const noexcept { return x86RmSize() != 0u; } + + ASMJIT_DEPRECATED("hasSize() is no longer portable - use x86RmSize() instead, if your target is X86/X86_64") + ASMJIT_INLINE_NODEBUG constexpr bool hasSize(uint32_t s) const noexcept { return x86RmSize() == s; } + + ASMJIT_DEPRECATED("size() is no longer portable - use x86RmSize() instead, if your target is X86/X86_64") + ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return _signature.getField(); } +#endif + //! \} }; @@ -688,30 +767,30 @@ class Operand : public Operand_ { //! \{ //! Creates `kOpNone` operand having all members initialized to zero. - inline constexpr Operand() noexcept + ASMJIT_INLINE_NODEBUG constexpr Operand() noexcept : Operand_{ Signature::fromOpType(OperandType::kNone), 0u, { 0u, 0u }} {} //! Creates a cloned `other` operand. - inline constexpr Operand(const Operand& other) noexcept = default; + ASMJIT_INLINE_NODEBUG constexpr Operand(const Operand& other) noexcept = default; //! Creates a cloned `other` operand. - inline constexpr explicit Operand(const Operand_& other) + ASMJIT_INLINE_NODEBUG constexpr explicit Operand(const Operand_& other) : Operand_(other) {} //! Creates an operand initialized to raw `[u0, u1, u2, u3]` values. - inline constexpr Operand(Globals::Init_, const Signature& u0, uint32_t u1, uint32_t u2, uint32_t u3) noexcept - : Operand_{ u0, u1, { u2, u3 }} {} + ASMJIT_INLINE_NODEBUG constexpr Operand(Globals::Init_, const Signature& u0, uint32_t u1, uint32_t u2, uint32_t u3) noexcept + : Operand_{{u0._bits}, u1, {u2, u3}} {} //! Creates an uninitialized operand (dangerous). - inline explicit Operand(Globals::NoInit_) noexcept {} + ASMJIT_INLINE_NODEBUG explicit Operand(Globals::NoInit_) noexcept {} //! \} //! \name Overloaded Operators //! \{ - inline Operand& operator=(const Operand& other) noexcept = default; - inline Operand& operator=(const Operand_& other) noexcept { return operator=(static_cast(other)); } + ASMJIT_INLINE_NODEBUG Operand& operator=(const Operand& other) noexcept = default; + ASMJIT_INLINE_NODEBUG Operand& operator=(const Operand_& other) noexcept { return operator=(static_cast(other)); } //! \} @@ -719,7 +798,7 @@ class Operand : public Operand_ { //! \{ //! Clones this operand and returns its copy. - inline constexpr Operand clone() const noexcept { return Operand(*this); } + ASMJIT_INLINE_NODEBUG constexpr Operand clone() const noexcept { return Operand(*this); } //! \} }; @@ -756,22 +835,22 @@ class Label : public Operand { //! \{ //! Creates a label operand without ID (you must set the ID to make it valid). - inline constexpr Label() noexcept + ASMJIT_INLINE_NODEBUG constexpr Label() noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kLabel), Globals::kInvalidId, 0, 0) {} //! Creates a cloned label operand of `other`. - inline constexpr Label(const Label& other) noexcept + ASMJIT_INLINE_NODEBUG constexpr Label(const Label& other) noexcept : Operand(other) {} //! Creates a label operand of the given `id`. - inline constexpr explicit Label(uint32_t id) noexcept + ASMJIT_INLINE_NODEBUG constexpr explicit Label(uint32_t id) noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kLabel), id, 0, 0) {} - inline explicit Label(Globals::NoInit_) noexcept + ASMJIT_INLINE_NODEBUG explicit Label(Globals::NoInit_) noexcept : Operand(Globals::NoInit) {} //! Resets the label, will reset all properties and set its ID to `Globals::kInvalidId`. - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _signature = Signature::fromOpType(OperandType::kLabel); _baseId = Globals::kInvalidId; _data[0] = 0; @@ -783,7 +862,7 @@ class Label : public Operand { //! \name Overloaded Operators //! \{ - inline Label& operator=(const Label& other) noexcept = default; + ASMJIT_INLINE_NODEBUG Label& operator=(const Label& other) noexcept = default; //! \} @@ -791,9 +870,9 @@ class Label : public Operand { //! \{ //! Tests whether the label was created by CodeHolder and/or an attached emitter. - inline constexpr bool isValid() const noexcept { return _baseId != Globals::kInvalidId; } + ASMJIT_INLINE_NODEBUG constexpr bool isValid() const noexcept { return _baseId != Globals::kInvalidId; } //! Sets the label `id`. - inline void setId(uint32_t id) noexcept { _baseId = id; } + ASMJIT_INLINE_NODEBUG void setId(uint32_t id) noexcept { _baseId = id; } //! \} }; @@ -806,10 +885,8 @@ struct BaseRegTraits { kTypeId = uint32_t(TypeId::kVoid), //! RegType is not valid by default. kValid = 0, - //! Count of registers (0 if none). - kCount = 0, - //! Zero type by default (defeaults to None). + //! Zero type by default (defaults to None). kType = uint32_t(RegType::kNone), //! Zero group by default (defaults to GP). kGroup = uint32_t(RegGroup::kGp), @@ -822,7 +899,7 @@ struct BaseRegTraits { }; //! \endcond -//! Physical or virtual register operand. +//! Physical or virtual register operand (base). class BaseReg : public Operand { public: //! \name Constants @@ -848,22 +925,22 @@ class BaseReg : public Operand { //! \{ //! Creates a dummy register operand. - inline constexpr BaseReg() noexcept + ASMJIT_INLINE_NODEBUG constexpr BaseReg() noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kReg), kIdBad, 0, 0) {} //! Creates a new register operand which is the same as `other` . - inline constexpr BaseReg(const BaseReg& other) noexcept + ASMJIT_INLINE_NODEBUG constexpr BaseReg(const BaseReg& other) noexcept : Operand(other) {} //! Creates a new register operand compatible with `other`, but with a different `id`. - inline constexpr BaseReg(const BaseReg& other, uint32_t id) noexcept + ASMJIT_INLINE_NODEBUG constexpr BaseReg(const BaseReg& other, uint32_t id) noexcept : Operand(Globals::Init, other._signature, id, 0, 0) {} //! Creates a register initialized to the given `signature` and `id`. - inline constexpr BaseReg(const Signature& signature, uint32_t id) noexcept + ASMJIT_INLINE_NODEBUG constexpr BaseReg(const Signature& signature, uint32_t id) noexcept : Operand(Globals::Init, signature, id, 0, 0) {} - inline explicit BaseReg(Globals::NoInit_) noexcept + ASMJIT_INLINE_NODEBUG explicit BaseReg(Globals::NoInit_) noexcept : Operand(Globals::NoInit) {} //! \} @@ -871,7 +948,7 @@ class BaseReg : public Operand { //! \name Overloaded Operators //! \{ - inline BaseReg& operator=(const BaseReg& other) noexcept = default; + ASMJIT_INLINE_NODEBUG BaseReg& operator=(const BaseReg& other) noexcept = default; //! \} @@ -883,14 +960,14 @@ class BaseReg : public Operand { //! Base signature only contains the operand type, register type, register group, and register size. It doesn't //! contain element type, predicate, or other architecture-specific data. Base signature is a signature that is //! provided by architecture-specific `RegTraits`, like \ref x86::RegTraits. - inline constexpr OperandSignature baseSignature() const noexcept { return _signature & kBaseSignatureMask; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature baseSignature() const noexcept { return _signature & kBaseSignatureMask; } //! Tests whether the operand's base signature matches the given signature `sign`. - inline constexpr bool hasBaseSignature(uint32_t signature) const noexcept { return baseSignature() == signature; } + ASMJIT_INLINE_NODEBUG constexpr bool hasBaseSignature(uint32_t signature) const noexcept { return baseSignature() == signature; } //! Tests whether the operand's base signature matches the given signature `sign`. - inline constexpr bool hasBaseSignature(const OperandSignature& signature) const noexcept { return baseSignature() == signature; } + ASMJIT_INLINE_NODEBUG constexpr bool hasBaseSignature(const OperandSignature& signature) const noexcept { return baseSignature() == signature; } //! Tests whether the operand's base signature matches the base signature of the `other` operand. - inline constexpr bool hasBaseSignature(const BaseReg& other) const noexcept { return baseSignature() == other.baseSignature(); } + ASMJIT_INLINE_NODEBUG constexpr bool hasBaseSignature(const BaseReg& other) const noexcept { return baseSignature() == other.baseSignature(); } //! Tests whether this register is the same as `other`. //! @@ -899,79 +976,90 @@ class BaseReg : public Operand { //! both \ref equals() and \ref isSame() should give the same answer, however, if any of these two contains garbage //! or other metadata in the upper 8 bytes then \ref isSame() may return `true` in cases in which \ref equals() //! returns false. - inline constexpr bool isSame(const BaseReg& other) const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool isSame(const BaseReg& other) const noexcept { return (_signature == other._signature) & (_baseId == other._baseId); } //! Tests whether the register is valid (either virtual or physical). - inline constexpr bool isValid() const noexcept { return (_signature != 0) & (_baseId != kIdBad); } + ASMJIT_INLINE_NODEBUG constexpr bool isValid() const noexcept { return bool(unsigned(_signature != 0) & unsigned(_baseId != kIdBad)); } //! Tests whether this is a physical register. - inline constexpr bool isPhysReg() const noexcept { return _baseId < kIdBad; } + ASMJIT_INLINE_NODEBUG constexpr bool isPhysReg() const noexcept { return _baseId < kIdBad; } //! Tests whether this is a virtual register. - inline constexpr bool isVirtReg() const noexcept { return _baseId > kIdBad; } + ASMJIT_INLINE_NODEBUG constexpr bool isVirtReg() const noexcept { return _baseId > kIdBad; } //! Tests whether the register type matches `type` - same as `isReg(type)`, provided for convenience. - inline constexpr bool isType(RegType type) const noexcept { return _signature.subset(Signature::kRegTypeMask) == Signature::fromRegType(type); } + ASMJIT_INLINE_NODEBUG constexpr bool isType(RegType type) const noexcept { return _signature.subset(Signature::kRegTypeMask) == Signature::fromRegType(type); } //! Tests whether the register group matches `group`. - inline constexpr bool isGroup(RegGroup group) const noexcept { return _signature.subset(Signature::kRegGroupMask) == Signature::fromRegGroup(group); } + ASMJIT_INLINE_NODEBUG constexpr bool isGroup(RegGroup group) const noexcept { return _signature.subset(Signature::kRegGroupMask) == Signature::fromRegGroup(group); } //! Tests whether the register is a general purpose register (any size). - inline constexpr bool isGp() const noexcept { return isGroup(RegGroup::kGp); } - //! Tests whether the register is a vector register. - inline constexpr bool isVec() const noexcept { return isGroup(RegGroup::kVec); } + ASMJIT_INLINE_NODEBUG constexpr bool isGp() const noexcept { return isGroup(RegGroup::kGp); } + //! Tests whether the register is a vector register of any size. + ASMJIT_INLINE_NODEBUG constexpr bool isVec() const noexcept { return isGroup(RegGroup::kVec); } + //! Tests whether the register is a mask register of any size. + ASMJIT_INLINE_NODEBUG constexpr bool isMask() const noexcept { return isGroup(RegGroup::kMask); } using Operand_::isReg; //! Same as `isType()`, provided for convenience. - inline constexpr bool isReg(RegType rType) const noexcept { return isType(rType); } + ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegType rType) const noexcept { return isType(rType); } //! Tests whether the register type matches `type` and register id matches `id`. - inline constexpr bool isReg(RegType rType, uint32_t id) const noexcept { return isType(rType) && this->id() == id; } + ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegType rType, uint32_t id) const noexcept { return isType(rType) && this->id() == id; } //! Returns the register type. - inline constexpr RegType type() const noexcept { return _signature.regType(); } + ASMJIT_INLINE_NODEBUG constexpr RegType type() const noexcept { return _signature.regType(); } //! Returns the register group. - inline constexpr RegGroup group() const noexcept { return _signature.regGroup(); } + ASMJIT_INLINE_NODEBUG constexpr RegGroup group() const noexcept { return _signature.regGroup(); } + + //! Tests whether the register specifies a size (i.e. the size is not zero). + ASMJIT_INLINE_NODEBUG constexpr bool hasSize() const noexcept { return _signature.hasField(); } + //! Tests whether the register size matches size `s`. + ASMJIT_INLINE_NODEBUG constexpr bool hasSize(uint32_t s) const noexcept { return size() == s; } + + //! Returns the size of the register in bytes. If the register size depends on architecture (like `x86::CReg` and + //! `x86::DReg`) the size returned should be the greatest possible (so it should return 64-bit size in such case). + ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return _signature.getField(); } //! Returns operation predicate of the register (ARM/AArch64). //! //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp //! of the register. - inline constexpr uint32_t predicate() const noexcept { return _signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t predicate() const noexcept { return _signature.getField(); } //! Sets operation predicate of the register to `predicate` (ARM/AArch64). //! //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp //! of the register. - inline void setPredicate(uint32_t predicate) noexcept { _signature.setField(predicate); } + ASMJIT_INLINE_NODEBUG void setPredicate(uint32_t predicate) noexcept { _signature.setField(predicate); } //! Resets shift operation type of the register to the default value (ARM/AArch64). - inline void resetPredicate() noexcept { _signature.setField(0); } + ASMJIT_INLINE_NODEBUG void resetPredicate() noexcept { _signature.setField(0); } //! Clones the register operand. - inline constexpr BaseReg clone() const noexcept { return BaseReg(*this); } + ASMJIT_INLINE_NODEBUG constexpr BaseReg clone() const noexcept { return BaseReg(*this); } //! Casts this register to `RegT` by also changing its signature. //! //! \note Improper use of `cloneAs()` can lead to hard-to-debug errors. template - inline constexpr RegT cloneAs() const noexcept { return RegT(Signature(RegT::kSignature), id()); } + ASMJIT_INLINE_NODEBUG constexpr RegT cloneAs() const noexcept { return RegT(Signature(RegT::kSignature), id()); } //! Casts this register to `other` by also changing its signature. //! //! \note Improper use of `cloneAs()` can lead to hard-to-debug errors. template - inline constexpr RegT cloneAs(const RegT& other) const noexcept { return RegT(other.signature(), id()); } + ASMJIT_INLINE_NODEBUG constexpr RegT cloneAs(const RegT& other) const noexcept { return RegT(other.signature(), id()); } //! Sets the register id to `id`. - inline void setId(uint32_t id) noexcept { _baseId = id; } + ASMJIT_INLINE_NODEBUG void setId(uint32_t id) noexcept { _baseId = id; } //! Sets a 32-bit operand signature based on traits of `RegT`. template - inline void setSignatureT() noexcept { _signature = RegT::kSignature; } + ASMJIT_INLINE_NODEBUG void setSignatureT() noexcept { _signature = RegT::kSignature; } //! Sets the register `signature` and `id`. - inline void setSignatureAndId(const OperandSignature& signature, uint32_t id) noexcept { + ASMJIT_INLINE_NODEBUG void setSignatureAndId(const OperandSignature& signature, uint32_t id) noexcept { _signature = signature; _baseId = id; } @@ -982,21 +1070,21 @@ class BaseReg : public Operand { //! \{ //! Tests whether the `op` operand is a general purpose register. - static inline bool isGp(const Operand_& op) noexcept { + static ASMJIT_INLINE_NODEBUG bool isGp(const Operand_& op) noexcept { // Check operand type and register group. Not interested in register type and size. return op.signature().subset(Signature::kOpTypeMask | Signature::kRegGroupMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(RegGroup::kGp)); } //! Tests whether the `op` operand is a vector register. - static inline bool isVec(const Operand_& op) noexcept { + static ASMJIT_INLINE_NODEBUG bool isVec(const Operand_& op) noexcept { // Check operand type and register group. Not interested in register type and size. return op.signature().subset(Signature::kOpTypeMask | Signature::kRegGroupMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(RegGroup::kVec)); } //! Tests whether the `op` is a general purpose register of the given `id`. - static inline bool isGp(const Operand_& op, uint32_t id) noexcept { return isGp(op) & (op.id() == id); } + static ASMJIT_INLINE_NODEBUG bool isGp(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isGp(op)) & unsigned(op.id() == id)); } //! Tests whether the `op` is a vector register of the given `id`. - static inline bool isVec(const Operand_& op, uint32_t id) noexcept { return isVec(op) & (op.id() == id); } + static ASMJIT_INLINE_NODEBUG bool isVec(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVec(op)) & unsigned(op.id() == id)); } //! \} }; @@ -1021,16 +1109,16 @@ struct RegOnly { //! \{ //! Initializes the `RegOnly` instance to hold register `signature` and `id`. - inline void init(const OperandSignature& signature, uint32_t id) noexcept { + ASMJIT_INLINE_NODEBUG void init(const OperandSignature& signature, uint32_t id) noexcept { _signature = signature; _id = id; } - inline void init(const BaseReg& reg) noexcept { init(reg.signature(), reg.id()); } - inline void init(const RegOnly& reg) noexcept { init(reg.signature(), reg.id()); } + ASMJIT_INLINE_NODEBUG void init(const BaseReg& reg) noexcept { init(reg.signature(), reg.id()); } + ASMJIT_INLINE_NODEBUG void init(const RegOnly& reg) noexcept { init(reg.signature(), reg.id()); } //! Resets the `RegOnly` members to zeros (none). - inline void reset() noexcept { init(Signature::fromBits(0), 0); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { init(Signature::fromBits(0), 0); } //! \} @@ -1038,30 +1126,30 @@ struct RegOnly { //! \{ //! Tests whether this ExtraReg is none (same as calling `Operand_::isNone()`). - inline constexpr bool isNone() const noexcept { return _signature == 0; } + ASMJIT_INLINE_NODEBUG constexpr bool isNone() const noexcept { return _signature == 0; } //! Tests whether the register is valid (either virtual or physical). - inline constexpr bool isReg() const noexcept { return _signature != 0; } + ASMJIT_INLINE_NODEBUG constexpr bool isReg() const noexcept { return _signature != 0; } //! Tests whether this is a physical register. - inline constexpr bool isPhysReg() const noexcept { return _id < BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG constexpr bool isPhysReg() const noexcept { return _id < BaseReg::kIdBad; } //! Tests whether this is a virtual register (used by `BaseCompiler`). - inline constexpr bool isVirtReg() const noexcept { return _id > BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG constexpr bool isVirtReg() const noexcept { return _id > BaseReg::kIdBad; } //! Returns the register signature or 0 if no register is assigned. - inline constexpr OperandSignature signature() const noexcept { return _signature; } + ASMJIT_INLINE_NODEBUG constexpr OperandSignature signature() const noexcept { return _signature; } //! Returns the register id. //! //! \note Always check whether the register is assigned before using the returned identifier as //! non-assigned `RegOnly` instance would return zero id, which is still a valid register id. - inline constexpr uint32_t id() const noexcept { return _id; } + ASMJIT_INLINE_NODEBUG constexpr uint32_t id() const noexcept { return _id; } //! Sets the register id. - inline void setId(uint32_t id) noexcept { _id = id; } + ASMJIT_INLINE_NODEBUG void setId(uint32_t id) noexcept { _id = id; } //! Returns the register type. - inline constexpr RegType type() const noexcept { return _signature.regType(); } + ASMJIT_INLINE_NODEBUG constexpr RegType type() const noexcept { return _signature.regType(); } //! Returns the register group. - inline constexpr RegGroup group() const noexcept { return _signature.regGroup(); } + ASMJIT_INLINE_NODEBUG constexpr RegGroup group() const noexcept { return _signature.regGroup(); } //! \} @@ -1070,85 +1158,270 @@ struct RegOnly { //! Converts this ExtraReg to a real `RegT` operand. template - inline constexpr RegT toReg() const noexcept { return RegT(_signature, _id); } + ASMJIT_INLINE_NODEBUG constexpr RegT toReg() const noexcept { return RegT(_signature, _id); } //! \} }; //! \cond INTERNAL //! Adds a template specialization for `REG_TYPE` into the local `RegTraits`. -#define ASMJIT_DEFINE_REG_TRAITS(REG, REG_TYPE, GROUP, SIZE, COUNT, TYPE_ID) \ -template<> \ -struct RegTraits { \ - typedef REG RegT; \ - \ - enum : uint32_t { \ - kValid = uint32_t(true), \ - kCount = uint32_t(COUNT), \ - kType = uint32_t(REG_TYPE), \ - kGroup = uint32_t(GROUP), \ - kSize = uint32_t(SIZE), \ - kTypeId = uint32_t(TYPE_ID), \ - \ - kSignature = (OperandSignature::fromOpType(OperandType::kReg) | \ - OperandSignature::fromRegType(REG_TYPE) | \ - OperandSignature::fromRegGroup(GROUP) | \ - OperandSignature::fromSize(kSize)).bits(), \ - }; \ +#define ASMJIT_DEFINE_REG_TRAITS(REG_TYPE, GROUP, SIZE, TYPE_ID) \ +template<> \ +struct RegTraits { \ + static constexpr uint32_t kValid = 1; \ + static constexpr RegType kType = REG_TYPE; \ + static constexpr RegGroup kGroup = GROUP; \ + static constexpr uint32_t kSize = SIZE; \ + static constexpr TypeId kTypeId = TYPE_ID; \ + \ + static constexpr uint32_t kSignature = \ + (OperandSignature::fromOpType(OperandType::kReg) | \ + OperandSignature::fromRegType(kType) | \ + OperandSignature::fromRegGroup(kGroup) | \ + OperandSignature::fromSize(kSize)).bits(); \ + \ } //! Adds constructors and member functions to a class that implements abstract register. Abstract register is register //! that doesn't have type or signature yet, it's a base class like `x86::Reg` or `arm::Reg`. -#define ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \ -public: \ - /*! Default constructor that only setups basics. */ \ - inline constexpr REG() noexcept \ - : BASE(Signature{kSignature}, kIdBad) {} \ - \ - /*! Makes a copy of the `other` register operand. */ \ - inline constexpr REG(const REG& other) noexcept \ - : BASE(other) {} \ - \ - /*! Makes a copy of the `other` register having id set to `id` */ \ - inline constexpr REG(const BaseReg& other, uint32_t id) noexcept \ - : BASE(other, id) {} \ - \ - /*! Creates a register based on `signature` and `id`. */ \ - inline constexpr REG(const OperandSignature& sgn, uint32_t id) noexcept \ - : BASE(sgn, id) {} \ - \ - /*! Creates a completely uninitialized REG register operand (garbage). */ \ - inline explicit REG(Globals::NoInit_) noexcept \ - : BASE(Globals::NoInit) {} \ - \ - /*! Creates a new register from register type and id. */ \ - static inline REG fromTypeAndId(RegType type, uint32_t id) noexcept { \ - return REG(signatureOf(type), id); \ - } \ - \ - /*! Clones the register operand. */ \ - inline constexpr REG clone() const noexcept { return REG(*this); } \ - \ - inline REG& operator=(const REG& other) noexcept = default; +#define ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \ +public: \ + /*! Default constructor that only setups basics. */ \ + ASMJIT_INLINE_NODEBUG constexpr REG() noexcept \ + : BASE(Signature{kSignature}, kIdBad) {} \ + \ + /*! Makes a copy of the `other` register operand. */ \ + ASMJIT_INLINE_NODEBUG constexpr REG(const REG& other) noexcept \ + : BASE(other) {} \ + \ + /*! Makes a copy of the `other` register having id set to `id` */ \ + ASMJIT_INLINE_NODEBUG constexpr REG(const BaseReg& other, uint32_t id) noexcept \ + : BASE(other, id) {} \ + \ + /*! Creates a register based on `signature` and `id`. */ \ + ASMJIT_INLINE_NODEBUG constexpr REG(const OperandSignature& sgn, uint32_t id) noexcept \ + : BASE(sgn, id) {} \ + \ + /*! Creates a completely uninitialized REG register operand (garbage). */ \ + ASMJIT_INLINE_NODEBUG explicit REG(Globals::NoInit_) noexcept \ + : BASE(Globals::NoInit) {} \ + \ + /*! Creates a new register from register type and id. */ \ + static ASMJIT_INLINE_NODEBUG REG fromTypeAndId(RegType type, uint32_t id) noexcept { \ + return REG(signatureOf(type), id); \ + } \ + \ + /*! Clones the register operand. */ \ + ASMJIT_INLINE_NODEBUG constexpr REG clone() const noexcept { return REG(*this); } \ + \ + ASMJIT_INLINE_NODEBUG REG& operator=(const REG& other) noexcept = default; //! Adds constructors and member functions to a class that implements final register. Final registers MUST HAVE a valid //! signature. -#define ASMJIT_DEFINE_FINAL_REG(REG, BASE, TRAITS) \ -public: \ - enum : uint32_t { \ - kThisType = TRAITS::kType, \ - kThisGroup = TRAITS::kGroup, \ - kThisSize = TRAITS::kSize, \ - kSignature = TRAITS::kSignature \ - }; \ - \ - ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \ - \ - /*! Creates a register operand having its id set to `id`. */ \ - inline constexpr explicit REG(uint32_t id) noexcept \ +#define ASMJIT_DEFINE_FINAL_REG(REG, BASE, TRAITS) \ +public: \ + static constexpr RegType kThisType = TRAITS::kType; \ + static constexpr RegGroup kThisGroup = TRAITS::kGroup; \ + static constexpr uint32_t kThisSize = TRAITS::kSize; \ + static constexpr uint32_t kSignature = TRAITS::kSignature; \ + \ + ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \ + \ + /*! Creates a register operand having its id set to `id`. */ \ + ASMJIT_INLINE_NODEBUG constexpr explicit REG(uint32_t id) noexcept \ : BASE(Signature{kSignature}, id) {} //! \endcond +//! List of physical registers (base). +//! +//! \note List of registers is only used by some ARM instructions at the moment. +class BaseRegList : public Operand { +public: + //! \name Constants + //! \{ + + enum : uint32_t { + kSignature = Signature::fromOpType(OperandType::kRegList).bits() + }; + + //! \} + + //! \name Construction & Destruction + //! \{ + + //! Creates a dummy register operand. + ASMJIT_INLINE_NODEBUG constexpr BaseRegList() noexcept + : Operand(Globals::Init, Signature::fromOpType(OperandType::kRegList), 0, 0, 0) {} + + //! Creates a new register operand which is the same as `other` . + ASMJIT_INLINE_NODEBUG constexpr BaseRegList(const BaseRegList& other) noexcept + : Operand(other) {} + + //! Creates a new register operand compatible with `other`, but with a different `id`. + ASMJIT_INLINE_NODEBUG constexpr BaseRegList(const BaseRegList& other, RegMask regMask) noexcept + : Operand(Globals::Init, other._signature, regMask, 0, 0) {} + + //! Creates a register initialized to the given `signature` and `id`. + ASMJIT_INLINE_NODEBUG constexpr BaseRegList(const Signature& signature, RegMask regMask) noexcept + : Operand(Globals::Init, signature, regMask, 0, 0) {} + + ASMJIT_INLINE_NODEBUG explicit BaseRegList(Globals::NoInit_) noexcept + : Operand(Globals::NoInit) {} + + //! \} + + //! \name Overloaded Operators + //! \{ + + ASMJIT_INLINE_NODEBUG BaseRegList& operator=(const BaseRegList& other) noexcept = default; + + //! \} + + //! \name Accessors + //! \{ + + //! Tests whether the register-list is valid, which means it has a type and at least a single register in the list. + ASMJIT_INLINE_NODEBUG constexpr bool isValid() const noexcept { return bool(unsigned(_signature != 0u) & unsigned(_baseId != 0u)); } + + //! Tests whether the register type matches `type` - same as `isReg(type)`, provided for convenience. + ASMJIT_INLINE_NODEBUG constexpr bool isType(RegType type) const noexcept { return _signature.subset(Signature::kRegTypeMask) == Signature::fromRegType(type); } + //! Tests whether the register group matches `group`. + ASMJIT_INLINE_NODEBUG constexpr bool isGroup(RegGroup group) const noexcept { return _signature.subset(Signature::kRegGroupMask) == Signature::fromRegGroup(group); } + + //! Tests whether the register is a general purpose register (any size). + ASMJIT_INLINE_NODEBUG constexpr bool isGp() const noexcept { return isGroup(RegGroup::kGp); } + //! Tests whether the register is a vector register. + ASMJIT_INLINE_NODEBUG constexpr bool isVec() const noexcept { return isGroup(RegGroup::kVec); } + + //! Returns the register type. + ASMJIT_INLINE_NODEBUG constexpr RegType type() const noexcept { return _signature.regType(); } + //! Returns the register group. + ASMJIT_INLINE_NODEBUG constexpr RegGroup group() const noexcept { return _signature.regGroup(); } + //! Returns the size of a single register in this register-list or 0 if unspecified. + ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return _signature.getField(); } + + //! Returns the register list as a mask, where each bit represents one physical register. + ASMJIT_INLINE_NODEBUG constexpr RegMask list() const noexcept { return _baseId; } + //! Sets the register list to `mask`. + ASMJIT_INLINE_NODEBUG void setList(RegMask mask) noexcept { _baseId = mask; } + //! Remoes all registers from the register-list by making the underlying register-mask zero. + ASMJIT_INLINE_NODEBUG void resetList() noexcept { _baseId = 0; } + + //! Adds registers passed by a register `mask` to the register-list. + ASMJIT_INLINE_NODEBUG void addList(RegMask mask) noexcept { _baseId |= mask; } + //! Removes registers passed by a register `mask` to the register-list. + ASMJIT_INLINE_NODEBUG void clearList(RegMask mask) noexcept { _baseId &= ~mask; } + //! Uses AND operator to combine the current register-list with other register `mask`. + ASMJIT_INLINE_NODEBUG void andList(RegMask mask) noexcept { _baseId &= mask; } + //! Uses XOR operator to combine the current register-list with other register `mask`. + ASMJIT_INLINE_NODEBUG void xorList(RegMask mask) noexcept { _baseId ^= mask; } + + //! Checks whether a physical register `physId` is in the register-list. + ASMJIT_INLINE_NODEBUG bool hasReg(uint32_t physId) const noexcept { return physId < 32u ? (_baseId & (1u << physId)) != 0 : false; } + //! Adds a physical register `physId` to the register-list. + ASMJIT_INLINE_NODEBUG void addReg(uint32_t physId) noexcept { addList(1u << physId); } + //! Removes a physical register `physId` from the register-list. + ASMJIT_INLINE_NODEBUG void clearReg(uint32_t physId) noexcept { clearList(1u << physId); } + + //! Clones the register-list operand. + ASMJIT_INLINE_NODEBUG constexpr BaseRegList clone() const noexcept { return BaseRegList(*this); } + + //! Casts this register to `RegT` by also changing its signature. + //! + //! \note Improper use of `cloneAs()` can lead to hard-to-debug errors. + template + ASMJIT_INLINE_NODEBUG constexpr RegListT cloneAs() const noexcept { return RegListT(Signature(RegListT::kSignature), list()); } + + //! Casts this register to `other` by also changing its signature. + //! + //! \note Improper use of `cloneAs()` can lead to hard-to-debug errors. + template + ASMJIT_INLINE_NODEBUG constexpr RegListT cloneAs(const RegListT& other) const noexcept { return RegListT(other.signature(), list()); } + + //! \} +}; + +template +class RegListT : public BaseRegList { +public: + //! \name Construction & Destruction + //! \{ + + //! Creates a dummy register operand. + ASMJIT_INLINE_NODEBUG constexpr RegListT() noexcept + : BaseRegList() {} + + //! Creates a new register operand which is the same as `other` . + ASMJIT_INLINE_NODEBUG constexpr RegListT(const RegListT& other) noexcept + : BaseRegList(other) {} + + //! Creates a new register operand compatible with `other`, but with a different `id`. + ASMJIT_INLINE_NODEBUG constexpr RegListT(const RegListT& other, RegMask regMask) noexcept + : BaseRegList(other, regMask) {} + + //! Creates a register initialized to the given `signature` and `id`. + ASMJIT_INLINE_NODEBUG constexpr RegListT(const Signature& signature, RegMask regMask) noexcept + : BaseRegList(signature, regMask) {} + + //! Creates a register initialized to the given `signature` and `regs`. + ASMJIT_INLINE_NODEBUG RegListT(const Signature& signature, std::initializer_list regs) noexcept + : BaseRegList(signature, RegMask(0)) { addRegs(regs); } + + ASMJIT_INLINE_NODEBUG explicit RegListT(Globals::NoInit_) noexcept + : BaseRegList(Globals::NoInit) {} + + //! \} + + //! \name Overloaded Operators + //! \{ + + ASMJIT_INLINE_NODEBUG RegListT& operator=(const RegListT& other) noexcept = default; + + //! \} + + //! \name Accessors + //! \{ + + using BaseRegList::addList; + using BaseRegList::clearList; + using BaseRegList::andList; + using BaseRegList::xorList; + + //! Adds registers to this register-list as provided by `other` register-list. + ASMJIT_INLINE_NODEBUG void addList(const RegListT& other) noexcept { addList(other.list()); } + //! Removes registers contained in `other` register-list. + ASMJIT_INLINE_NODEBUG void clearList(const RegListT& other) noexcept { clearList(other.list()); } + //! Uses AND operator to combine the current register-list with `other` register-list. + ASMJIT_INLINE_NODEBUG void andList(const RegListT& other) noexcept { andList(other.list()); } + //! Uses XOR operator to combine the current register-list with `other` register-list. + ASMJIT_INLINE_NODEBUG void xorList(const RegListT& other) noexcept { xorList(other.list()); } + + using BaseRegList::addReg; + using BaseRegList::clearReg; + + ASMJIT_INLINE_NODEBUG void addReg(const RegT& reg) noexcept { + if (reg.id() < 32u) + addReg(reg.id()); + } + + ASMJIT_INLINE_NODEBUG void addRegs(std::initializer_list regs) noexcept { + for (const RegT& reg : regs) + addReg(reg); + } + + ASMJIT_INLINE_NODEBUG void clearReg(const RegT& reg) noexcept { + if (reg.id() < 32u) + clearReg(reg.id()); + } + + ASMJIT_INLINE_NODEBUG void clearRegs(std::initializer_list regs) noexcept { + for (const RegT& reg : regs) + clearReg(reg); + } + + //! \} +}; + //! Base class for all memory operands. //! //! The data is split into the following parts: @@ -1174,18 +1447,18 @@ class BaseMem : public Operand { //! \{ //! Creates a default `BaseMem` operand, that points to [0]. - inline constexpr BaseMem() noexcept + ASMJIT_INLINE_NODEBUG constexpr BaseMem() noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kMem), 0, 0, 0) {} //! Creates a `BaseMem` operand that is a clone of `other`. - inline constexpr BaseMem(const BaseMem& other) noexcept + ASMJIT_INLINE_NODEBUG constexpr BaseMem(const BaseMem& other) noexcept : Operand(other) {} //! Creates a `BaseMem` operand from `baseReg` and `offset`. //! //! \note This is an architecture independent constructor that can be used to create an architecture //! independent memory operand to be used in portable code that can handle multiple architectures. - inline constexpr explicit BaseMem(const BaseReg& baseReg, int32_t offset = 0) noexcept + ASMJIT_INLINE_NODEBUG constexpr explicit BaseMem(const BaseReg& baseReg, int32_t offset = 0) noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(baseReg.type()), baseReg.id(), @@ -1194,16 +1467,16 @@ class BaseMem : public Operand { //! \cond INTERNAL //! Creates a `BaseMem` operand from 4 integers as used by `Operand_` struct. - inline constexpr BaseMem(const OperandSignature& u0, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept + ASMJIT_INLINE_NODEBUG constexpr BaseMem(const OperandSignature& u0, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept : Operand(Globals::Init, u0, baseId, indexId, uint32_t(offset)) {} //! \endcond //! Creates a completely uninitialized `BaseMem` operand. - inline explicit BaseMem(Globals::NoInit_) noexcept + ASMJIT_INLINE_NODEBUG explicit BaseMem(Globals::NoInit_) noexcept : Operand(Globals::NoInit) {} //! Resets the memory operand - after the reset the memory points to [0]. - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _signature = Signature::fromOpType(OperandType::kMem); _baseId = 0; _data[0] = 0; @@ -1215,7 +1488,7 @@ class BaseMem : public Operand { //! \name Overloaded Operators //! \{ - inline BaseMem& operator=(const BaseMem& other) noexcept { copyFrom(other); return *this; } + ASMJIT_INLINE_NODEBUG BaseMem& operator=(const BaseMem& other) noexcept { copyFrom(other); return *this; } //! \} @@ -1223,54 +1496,54 @@ class BaseMem : public Operand { //! \{ //! Clones the memory operand. - inline constexpr BaseMem clone() const noexcept { return BaseMem(*this); } + ASMJIT_INLINE_NODEBUG constexpr BaseMem clone() const noexcept { return BaseMem(*this); } //! Creates a new copy of this memory operand adjusted by `off`. - inline BaseMem cloneAdjusted(int64_t off) const noexcept { + ASMJIT_INLINE_NODEBUG BaseMem cloneAdjusted(int64_t off) const noexcept { BaseMem result(*this); result.addOffset(off); return result; } //! Tests whether this memory operand is a register home (only used by \ref asmjit_compiler) - inline constexpr bool isRegHome() const noexcept { return _signature.hasField(); } + ASMJIT_INLINE_NODEBUG constexpr bool isRegHome() const noexcept { return _signature.hasField(); } //! Mark this memory operand as register home (only used by \ref asmjit_compiler). - inline void setRegHome() noexcept { _signature |= Signature::kMemRegHomeFlag; } + ASMJIT_INLINE_NODEBUG void setRegHome() noexcept { _signature |= Signature::kMemRegHomeFlag; } //! Marks this operand to not be a register home (only used by \ref asmjit_compiler). - inline void clearRegHome() noexcept { _signature &= ~Signature::kMemRegHomeFlag; } + ASMJIT_INLINE_NODEBUG void clearRegHome() noexcept { _signature &= ~Signature::kMemRegHomeFlag; } //! Tests whether the memory operand has a BASE register or label specified. - inline constexpr bool hasBase() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool hasBase() const noexcept { return (_signature & Signature::kMemBaseTypeMask) != 0; } //! Tests whether the memory operand has an INDEX register specified. - inline constexpr bool hasIndex() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool hasIndex() const noexcept { return (_signature & Signature::kMemIndexTypeMask) != 0; } //! Tests whether the memory operand has BASE or INDEX register. - inline constexpr bool hasBaseOrIndex() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool hasBaseOrIndex() const noexcept { return (_signature & Signature::kMemBaseIndexMask) != 0; } //! Tests whether the memory operand has BASE and INDEX register. - inline constexpr bool hasBaseAndIndex() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool hasBaseAndIndex() const noexcept { return (_signature & Signature::kMemBaseTypeMask) != 0 && (_signature & Signature::kMemIndexTypeMask) != 0; } //! Tests whether the BASE operand is a label. - inline constexpr bool hasBaseLabel() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool hasBaseLabel() const noexcept { return _signature.subset(Signature::kMemBaseTypeMask) == Signature::fromMemBaseType(RegType::kLabelTag); } //! Tests whether the BASE operand is a register (registers start after `RegType::kLabelTag`). - inline constexpr bool hasBaseReg() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool hasBaseReg() const noexcept { return _signature.subset(Signature::kMemBaseTypeMask).bits() > Signature::fromMemBaseType(RegType::kLabelTag).bits(); } //! Tests whether the INDEX operand is a register (registers start after `RegType::kLabelTag`). - inline constexpr bool hasIndexReg() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool hasIndexReg() const noexcept { return _signature.subset(Signature::kMemIndexTypeMask).bits() > Signature::fromMemIndexType(RegType::kLabelTag).bits(); } @@ -1278,76 +1551,81 @@ class BaseMem : public Operand { //! //! \note If the returned type is one (a value never associated to a register type) the BASE is not register, but it //! is a label. One equals to `kLabelTag`. You should always check `hasBaseLabel()` before using `baseId()` result. - inline constexpr RegType baseType() const noexcept { return _signature.memBaseType(); } + ASMJIT_INLINE_NODEBUG constexpr RegType baseType() const noexcept { return _signature.memBaseType(); } //! Returns the type of an INDEX register (0 if this memory operand doesn't //! use the INDEX register). - inline constexpr RegType indexType() const noexcept { return _signature.memIndexType(); } + ASMJIT_INLINE_NODEBUG constexpr RegType indexType() const noexcept { return _signature.memIndexType(); } //! This is used internally for BASE+INDEX validation. - inline constexpr uint32_t baseAndIndexTypes() const noexcept { return _signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t baseAndIndexTypes() const noexcept { return _signature.getField(); } //! Returns both BASE (4:0 bits) and INDEX (9:5 bits) types combined into a single value. //! //! \remarks Returns id of the BASE register or label (if the BASE was specified as label). - inline constexpr uint32_t baseId() const noexcept { return _baseId; } + ASMJIT_INLINE_NODEBUG constexpr uint32_t baseId() const noexcept { return _baseId; } //! Returns the id of the INDEX register. - inline constexpr uint32_t indexId() const noexcept { return _data[kDataMemIndexId]; } + ASMJIT_INLINE_NODEBUG constexpr uint32_t indexId() const noexcept { return _data[kDataMemIndexId]; } //! Sets the id of the BASE register (without modifying its type). - inline void setBaseId(uint32_t id) noexcept { _baseId = id; } + ASMJIT_INLINE_NODEBUG void setBaseId(uint32_t id) noexcept { _baseId = id; } + //! Sets the register type of the BASE register (without modifying its id). + ASMJIT_INLINE_NODEBUG void setBaseType(RegType regType) noexcept { _signature.setMemBaseType(regType); } + //! Sets the id of the INDEX register (without modifying its type). - inline void setIndexId(uint32_t id) noexcept { _data[kDataMemIndexId] = id; } + ASMJIT_INLINE_NODEBUG void setIndexId(uint32_t id) noexcept { _data[kDataMemIndexId] = id; } + //! Sets the register type of the INDEX register (without modifying its id). + ASMJIT_INLINE_NODEBUG void setIndexType(RegType regType) noexcept { _signature.setMemIndexType(regType); } //! Sets the base register to type and id of the given `base` operand. - inline void setBase(const BaseReg& base) noexcept { return _setBase(base.type(), base.id()); } + ASMJIT_INLINE_NODEBUG void setBase(const BaseReg& base) noexcept { return _setBase(base.type(), base.id()); } //! Sets the index register to type and id of the given `index` operand. - inline void setIndex(const BaseReg& index) noexcept { return _setIndex(index.type(), index.id()); } + ASMJIT_INLINE_NODEBUG void setIndex(const BaseReg& index) noexcept { return _setIndex(index.type(), index.id()); } //! \cond INTERNAL - inline void _setBase(RegType type, uint32_t id) noexcept { + ASMJIT_INLINE_NODEBUG void _setBase(RegType type, uint32_t id) noexcept { _signature.setField(uint32_t(type)); _baseId = id; } - inline void _setIndex(RegType type, uint32_t id) noexcept { + ASMJIT_INLINE_NODEBUG void _setIndex(RegType type, uint32_t id) noexcept { _signature.setField(uint32_t(type)); _data[kDataMemIndexId] = id; } //! \endcond //! Resets the memory operand's BASE register or label. - inline void resetBase() noexcept { _setBase(RegType::kNone, 0); } + ASMJIT_INLINE_NODEBUG void resetBase() noexcept { _setBase(RegType::kNone, 0); } //! Resets the memory operand's INDEX register. - inline void resetIndex() noexcept { _setIndex(RegType::kNone, 0); } + ASMJIT_INLINE_NODEBUG void resetIndex() noexcept { _setIndex(RegType::kNone, 0); } //! Sets the memory operand size (in bytes). - inline void setSize(uint32_t size) noexcept { _signature.setField(size); } + ASMJIT_INLINE_NODEBUG void setSize(uint32_t size) noexcept { _signature.setField(size); } //! Tests whether the memory operand has a 64-bit offset or absolute address. //! //! If this is true then `hasBase()` must always report false. - inline constexpr bool isOffset64Bit() const noexcept { return baseType() == RegType::kNone; } + ASMJIT_INLINE_NODEBUG constexpr bool isOffset64Bit() const noexcept { return baseType() == RegType::kNone; } //! Tests whether the memory operand has a non-zero offset or absolute address. - inline constexpr bool hasOffset() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr bool hasOffset() const noexcept { return (_data[kDataMemOffsetLo] | uint32_t(_baseId & Support::bitMaskFromBool(isOffset64Bit()))) != 0; } //! Returns either relative offset or absolute address as 64-bit integer. - inline constexpr int64_t offset() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr int64_t offset() const noexcept { return isOffset64Bit() ? int64_t(uint64_t(_data[kDataMemOffsetLo]) | (uint64_t(_baseId) << 32)) : int64_t(int32_t(_data[kDataMemOffsetLo])); // Sign extend 32-bit offset. } //! Returns a 32-bit low part of a 64-bit offset or absolute address. - inline constexpr int32_t offsetLo32() const noexcept { return int32_t(_data[kDataMemOffsetLo]); } + ASMJIT_INLINE_NODEBUG constexpr int32_t offsetLo32() const noexcept { return int32_t(_data[kDataMemOffsetLo]); } //! Returns a 32-but high part of a 64-bit offset or absolute address. //! //! \note This function is UNSAFE and returns garbage if `isOffset64Bit()` //! returns false. Never use it blindly without checking it first. - inline constexpr int32_t offsetHi32() const noexcept { return int32_t(_baseId); } + ASMJIT_INLINE_NODEBUG constexpr int32_t offsetHi32() const noexcept { return int32_t(_baseId); } //! Sets a 64-bit offset or an absolute address to `offset`. //! @@ -1383,13 +1661,13 @@ class BaseMem : public Operand { } //! Adds `offset` to a low 32-bit offset part (don't use without knowing how BaseMem works). - inline void addOffsetLo32(int32_t offset) noexcept { _data[kDataMemOffsetLo] += uint32_t(offset); } + ASMJIT_INLINE_NODEBUG void addOffsetLo32(int32_t offset) noexcept { _data[kDataMemOffsetLo] += uint32_t(offset); } //! Resets the memory offset to zero. - inline void resetOffset() noexcept { setOffset(0); } + ASMJIT_INLINE_NODEBUG void resetOffset() noexcept { setOffset(0); } //! Resets the lo part of the memory offset to zero (don't use without knowing how BaseMem works). - inline void resetOffsetLo32() noexcept { setOffsetLo32(0); } + ASMJIT_INLINE_NODEBUG void resetOffsetLo32() noexcept { setOffsetLo32(0); } //! \} }; @@ -1423,15 +1701,15 @@ class Imm : public Operand { //! \{ //! Creates a new immediate value (initial value is 0). - inline constexpr Imm() noexcept + ASMJIT_INLINE_NODEBUG constexpr Imm() noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kImm), 0, 0, 0) {} //! Creates a new immediate value from `other`. - inline constexpr Imm(const Imm& other) noexcept + ASMJIT_INLINE_NODEBUG constexpr Imm(const Imm& other) noexcept : Operand(other) {} //! Creates a new immediate value from ARM/AArch64 specific `shift`. - inline constexpr Imm(const arm::Shift& shift) noexcept + ASMJIT_INLINE_NODEBUG constexpr Imm(const arm::Shift& shift) noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(uint32_t(shift.op())), 0, @@ -1443,28 +1721,28 @@ class Imm : public Operand { //! //! \note Predicate is currently only used by ARM architectures. template::type>::value>::type> - inline constexpr Imm(const T& val, const uint32_t predicate = 0) noexcept + ASMJIT_INLINE_NODEBUG constexpr Imm(const T& val, const uint32_t predicate = 0) noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(predicate), 0, Support::unpackU32At0(int64_t(val)), Support::unpackU32At1(int64_t(val))) {} - inline Imm(const float& val, const uint32_t predicate = 0) noexcept + ASMJIT_INLINE_NODEBUG Imm(const float& val, const uint32_t predicate = 0) noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(predicate), 0, 0, 0) { setValue(val); } - inline Imm(const double& val, const uint32_t predicate = 0) noexcept + ASMJIT_INLINE_NODEBUG Imm(const double& val, const uint32_t predicate = 0) noexcept : Operand(Globals::Init, Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(predicate), 0, 0, 0) { setValue(val); } - inline explicit Imm(Globals::NoInit_) noexcept + ASMJIT_INLINE_NODEBUG explicit Imm(Globals::NoInit_) noexcept : Operand(Globals::NoInit) {} //! \} @@ -1473,7 +1751,7 @@ class Imm : public Operand { //! \{ //! Assigns the value of the `other` operand to this immediate. - inline Imm& operator=(const Imm& other) noexcept { copyFrom(other); return *this; } + ASMJIT_INLINE_NODEBUG Imm& operator=(const Imm& other) noexcept { copyFrom(other); return *this; } //! \} @@ -1481,73 +1759,73 @@ class Imm : public Operand { //! \{ //! Returns immediate type. - inline constexpr ImmType type() const noexcept { return (ImmType)_signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr ImmType type() const noexcept { return (ImmType)_signature.getField(); } //! Sets the immediate type to `type`. - inline void setType(ImmType type) noexcept { _signature.setField(uint32_t(type)); } + ASMJIT_INLINE_NODEBUG void setType(ImmType type) noexcept { _signature.setField(uint32_t(type)); } //! Resets immediate type to \ref ImmType::kInt. - inline void resetType() noexcept { setType(ImmType::kInt); } + ASMJIT_INLINE_NODEBUG void resetType() noexcept { setType(ImmType::kInt); } //! Returns operation predicate of the immediate. //! //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp //! of the immediate. - inline constexpr uint32_t predicate() const noexcept { return _signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t predicate() const noexcept { return _signature.getField(); } //! Sets operation predicate of the immediate to `predicate`. //! //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp //! of the immediate. - inline void setPredicate(uint32_t predicate) noexcept { _signature.setField(predicate); } + ASMJIT_INLINE_NODEBUG void setPredicate(uint32_t predicate) noexcept { _signature.setField(predicate); } //! Resets the shift operation type of the immediate to the default value (no operation). - inline void resetPredicate() noexcept { _signature.setField(0); } + ASMJIT_INLINE_NODEBUG void resetPredicate() noexcept { _signature.setField(0); } //! Returns the immediate value as `int64_t`, which is the internal format Imm uses. - inline constexpr int64_t value() const noexcept { + ASMJIT_INLINE_NODEBUG constexpr int64_t value() const noexcept { return int64_t((uint64_t(_data[kDataImmValueHi]) << 32) | _data[kDataImmValueLo]); } //! Tests whether this immediate value is integer of any size. - inline constexpr uint32_t isInt() const noexcept { return type() == ImmType::kInt; } + ASMJIT_INLINE_NODEBUG constexpr uint32_t isInt() const noexcept { return type() == ImmType::kInt; } //! Tests whether this immediate value is a double precision floating point value. - inline constexpr uint32_t isDouble() const noexcept { return type() == ImmType::kDouble; } + ASMJIT_INLINE_NODEBUG constexpr uint32_t isDouble() const noexcept { return type() == ImmType::kDouble; } //! Tests whether the immediate can be casted to 8-bit signed integer. - inline constexpr bool isInt8() const noexcept { return type() == ImmType::kInt && Support::isInt8(value()); } + ASMJIT_INLINE_NODEBUG constexpr bool isInt8() const noexcept { return type() == ImmType::kInt && Support::isInt8(value()); } //! Tests whether the immediate can be casted to 8-bit unsigned integer. - inline constexpr bool isUInt8() const noexcept { return type() == ImmType::kInt && Support::isUInt8(value()); } + ASMJIT_INLINE_NODEBUG constexpr bool isUInt8() const noexcept { return type() == ImmType::kInt && Support::isUInt8(value()); } //! Tests whether the immediate can be casted to 16-bit signed integer. - inline constexpr bool isInt16() const noexcept { return type() == ImmType::kInt && Support::isInt16(value()); } + ASMJIT_INLINE_NODEBUG constexpr bool isInt16() const noexcept { return type() == ImmType::kInt && Support::isInt16(value()); } //! Tests whether the immediate can be casted to 16-bit unsigned integer. - inline constexpr bool isUInt16() const noexcept { return type() == ImmType::kInt && Support::isUInt16(value()); } + ASMJIT_INLINE_NODEBUG constexpr bool isUInt16() const noexcept { return type() == ImmType::kInt && Support::isUInt16(value()); } //! Tests whether the immediate can be casted to 32-bit signed integer. - inline constexpr bool isInt32() const noexcept { return type() == ImmType::kInt && Support::isInt32(value()); } + ASMJIT_INLINE_NODEBUG constexpr bool isInt32() const noexcept { return type() == ImmType::kInt && Support::isInt32(value()); } //! Tests whether the immediate can be casted to 32-bit unsigned integer. - inline constexpr bool isUInt32() const noexcept { return type() == ImmType::kInt && _data[kDataImmValueHi] == 0; } + ASMJIT_INLINE_NODEBUG constexpr bool isUInt32() const noexcept { return type() == ImmType::kInt && _data[kDataImmValueHi] == 0; } //! Returns the immediate value casted to `T`. //! //! The value is masked before it's casted to `T` so the returned value is simply the representation of `T` //! considering the original value's lowest bits. template - inline T valueAs() const noexcept { return Support::immediateToT(value()); } + ASMJIT_INLINE_NODEBUG T valueAs() const noexcept { return Support::immediateToT(value()); } //! Returns low 32-bit signed integer. - inline constexpr int32_t int32Lo() const noexcept { return int32_t(_data[kDataImmValueLo]); } + ASMJIT_INLINE_NODEBUG constexpr int32_t int32Lo() const noexcept { return int32_t(_data[kDataImmValueLo]); } //! Returns high 32-bit signed integer. - inline constexpr int32_t int32Hi() const noexcept { return int32_t(_data[kDataImmValueHi]); } + ASMJIT_INLINE_NODEBUG constexpr int32_t int32Hi() const noexcept { return int32_t(_data[kDataImmValueHi]); } //! Returns low 32-bit signed integer. - inline constexpr uint32_t uint32Lo() const noexcept { return _data[kDataImmValueLo]; } + ASMJIT_INLINE_NODEBUG constexpr uint32_t uint32Lo() const noexcept { return _data[kDataImmValueLo]; } //! Returns high 32-bit signed integer. - inline constexpr uint32_t uint32Hi() const noexcept { return _data[kDataImmValueHi]; } + ASMJIT_INLINE_NODEBUG constexpr uint32_t uint32Hi() const noexcept { return _data[kDataImmValueHi]; } //! Sets immediate value to `val`, the value is casted to a signed 64-bit integer. template - inline void setValue(const T& val) noexcept { + ASMJIT_INLINE_NODEBUG void setValue(const T& val) noexcept { _setValueInternal(Support::immediateFromT(val), std::is_floating_point::value ? ImmType::kDouble : ImmType::kInt); } - inline void _setValueInternal(int64_t val, ImmType type) noexcept { + ASMJIT_INLINE_NODEBUG void _setValueInternal(int64_t val, ImmType type) noexcept { setType(type); _data[kDataImmValueHi] = uint32_t(uint64_t(val) >> 32); _data[kDataImmValueLo] = uint32_t(uint64_t(val) & 0xFFFFFFFFu); @@ -1559,22 +1837,22 @@ class Imm : public Operand { //! \{ //! Clones the immediate operand. - inline constexpr Imm clone() const noexcept { return Imm(*this); } + ASMJIT_INLINE_NODEBUG constexpr Imm clone() const noexcept { return Imm(*this); } - inline void signExtend8Bits() noexcept { setValue(int64_t(valueAs())); } - inline void signExtend16Bits() noexcept { setValue(int64_t(valueAs())); } - inline void signExtend32Bits() noexcept { setValue(int64_t(valueAs())); } + ASMJIT_INLINE_NODEBUG void signExtend8Bits() noexcept { setValue(int64_t(valueAs())); } + ASMJIT_INLINE_NODEBUG void signExtend16Bits() noexcept { setValue(int64_t(valueAs())); } + ASMJIT_INLINE_NODEBUG void signExtend32Bits() noexcept { setValue(int64_t(valueAs())); } - inline void zeroExtend8Bits() noexcept { setValue(valueAs()); } - inline void zeroExtend16Bits() noexcept { setValue(valueAs()); } - inline void zeroExtend32Bits() noexcept { _data[kDataImmValueHi] = 0u; } + ASMJIT_INLINE_NODEBUG void zeroExtend8Bits() noexcept { setValue(valueAs()); } + ASMJIT_INLINE_NODEBUG void zeroExtend16Bits() noexcept { setValue(valueAs()); } + ASMJIT_INLINE_NODEBUG void zeroExtend32Bits() noexcept { _data[kDataImmValueHi] = 0u; } //! \} }; //! Creates a new immediate operand. template -static inline constexpr Imm imm(const T& val) noexcept { return Imm(val); } +static ASMJIT_INLINE_NODEBUG constexpr Imm imm(const T& val) noexcept { return Imm(val); } //! \} @@ -1590,12 +1868,12 @@ namespace Support { template struct ForwardOpImpl { - static inline const T& forward(const T& value) noexcept { return value; } + static ASMJIT_INLINE_NODEBUG const T& forward(const T& value) noexcept { return value; } }; template struct ForwardOpImpl { - static inline Imm forward(const T& value) noexcept { return Imm(value); } + static ASMJIT_INLINE_NODEBUG Imm forward(const T& value) noexcept { return Imm(value); } }; //! Either forwards operand T or returns a new operand that wraps it if T is a type convertible to operand. diff --git a/3rdparty/asmjit/src/asmjit/core/osutils.cpp b/3rdparty/asmjit/src/asmjit/core/osutils.cpp index fa900bfbb4ce3..2d390697f8954 100644 --- a/3rdparty/asmjit/src/asmjit/core/osutils.cpp +++ b/3rdparty/asmjit/src/asmjit/core/osutils.cpp @@ -4,81 +4,37 @@ // SPDX-License-Identifier: Zlib #include "../core/api-build_p.h" -#include "../core/osutils.h" +#include "../core/osutils_p.h" #include "../core/support.h" -#if defined(_WIN32) - #include -#elif defined(__APPLE__) - #include -#else - #include +#if !defined(_WIN32) + #include #include #endif ASMJIT_BEGIN_NAMESPACE -uint32_t OSUtils::getTickCount() noexcept { -#if defined(_WIN32) - enum HiResStatus : uint32_t { - kHiResUnknown = 0, - kHiResAvailable = 1, - kHiResNotAvailable = 2 - }; +#if !defined(_WIN32) +Error OSUtils::readFile(const char* name, String& dst, size_t maxSize) noexcept { + char* buffer = dst.prepare(String::ModifyOp::kAssign, maxSize); + if (ASMJIT_UNLIKELY(!buffer)) + return DebugUtils::errored(kErrorOutOfMemory); - static std::atomic _hiResStatus(kHiResUnknown); - static volatile double _hiResFreq(0); - - uint32_t status = _hiResStatus.load(); - LARGE_INTEGER now, qpf; - - if (status != kHiResNotAvailable && ::QueryPerformanceCounter(&now)) { - double freq = _hiResFreq; - if (status == kHiResUnknown) { - // Detects the availability of high resolution counter. - if (::QueryPerformanceFrequency(&qpf)) { - freq = double(qpf.QuadPart) / 1000.0; - _hiResFreq = freq; - _hiResStatus.compare_exchange_strong(status, kHiResAvailable); - status = kHiResAvailable; - } - else { - // High resolution not available. - _hiResStatus.compare_exchange_strong(status, kHiResNotAvailable); - } - } - - if (status == kHiResAvailable) - return uint32_t(uint64_t(int64_t(double(now.QuadPart) / freq)) & 0xFFFFFFFFu); + int fd = ASMJIT_FILE64_API(::open)(name, O_RDONLY); + if (fd < 0) { + dst.clear(); + return DebugUtils::errored(kErrorFailedToOpenFile); } - // Bail to `GetTickCount()` if we cannot use high resolution. - return ::GetTickCount(); -#elif defined(__APPLE__) - // See Apple's QA1398. - static mach_timebase_info_data_t _machTime; - - uint32_t denom = _machTime.denom; - if (ASMJIT_UNLIKELY(!denom)) { - if (mach_timebase_info(&_machTime) != KERN_SUCCESS || !(denom = _machTime.denom)) - return 0; + intptr_t len = ::read(fd, buffer, maxSize); + if (len >= 0) { + buffer[len] = '\0'; + dst._setSize(size_t(len)); } - // `mach_absolute_time()` returns nanoseconds, we want milliseconds. - uint64_t t = mach_absolute_time() / 1000000u; - t = (t * _machTime.numer) / _machTime.denom; - return uint32_t(t & 0xFFFFFFFFu); -#elif defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0 - struct timespec ts; - if (ASMJIT_UNLIKELY(clock_gettime(CLOCK_MONOTONIC, &ts) != 0)) - return 0; - - uint64_t t = (uint64_t(ts.tv_sec ) * 1000u) + (uint64_t(ts.tv_nsec) / 1000000u); - return uint32_t(t & 0xFFFFFFFFu); -#else - #pragma message("asmjit::OSUtils::getTickCount() doesn't have implementation for the target OS.") - return 0; -#endif + ::close(fd); + return kErrorOk; } +#endif ASMJIT_END_NAMESPACE diff --git a/3rdparty/asmjit/src/asmjit/core/osutils.h b/3rdparty/asmjit/src/asmjit/core/osutils.h index 3c5c3d94c1ed6..c6588373425f7 100644 --- a/3rdparty/asmjit/src/asmjit/core/osutils.h +++ b/3rdparty/asmjit/src/asmjit/core/osutils.h @@ -13,13 +13,6 @@ ASMJIT_BEGIN_NAMESPACE //! \addtogroup asmjit_utilities //! \{ -//! Operating system utilities. -namespace OSUtils { - //! Gets the current CPU tick count, used for benchmarking (1ms resolution). - ASMJIT_API uint32_t getTickCount() noexcept; -}; - - //! \cond INTERNAL //! Lock. //! @@ -46,11 +39,11 @@ class Lock { Handle _handle; #endif - ASMJIT_FORCE_INLINE Lock() noexcept; - ASMJIT_FORCE_INLINE ~Lock() noexcept; + ASMJIT_INLINE_NODEBUG Lock() noexcept; + ASMJIT_INLINE_NODEBUG ~Lock() noexcept; - ASMJIT_FORCE_INLINE void lock() noexcept; - ASMJIT_FORCE_INLINE void unlock() noexcept; + ASMJIT_INLINE_NODEBUG void lock() noexcept; + ASMJIT_INLINE_NODEBUG void unlock() noexcept; }; //! \endcond diff --git a/3rdparty/asmjit/src/asmjit/core/osutils_p.h b/3rdparty/asmjit/src/asmjit/core/osutils_p.h index fd87e73112367..0d9d36909e846 100644 --- a/3rdparty/asmjit/src/asmjit/core/osutils_p.h +++ b/3rdparty/asmjit/src/asmjit/core/osutils_p.h @@ -7,6 +7,7 @@ #define ASMJIT_CORE_OSUTILS_P_H_INCLUDED #include "../core/osutils.h" +#include "../core/string.h" ASMJIT_BEGIN_NAMESPACE @@ -20,30 +21,30 @@ ASMJIT_BEGIN_NAMESPACE static_assert(sizeof(Lock::Handle) == sizeof(CRITICAL_SECTION), "asmjit::Lock::Handle layout must match CRITICAL_SECTION"); static_assert(alignof(Lock::Handle) == alignof(CRITICAL_SECTION), "asmjit::Lock::Handle alignment must match CRITICAL_SECTION"); -ASMJIT_FORCE_INLINE Lock::Lock() noexcept { InitializeCriticalSection(reinterpret_cast(&_handle)); } -ASMJIT_FORCE_INLINE Lock::~Lock() noexcept { DeleteCriticalSection(reinterpret_cast(&_handle)); } -ASMJIT_FORCE_INLINE void Lock::lock() noexcept { EnterCriticalSection(reinterpret_cast(&_handle)); } -ASMJIT_FORCE_INLINE void Lock::unlock() noexcept { LeaveCriticalSection(reinterpret_cast(&_handle)); } +ASMJIT_INLINE_NODEBUG Lock::Lock() noexcept { InitializeCriticalSection(reinterpret_cast(&_handle)); } +ASMJIT_INLINE_NODEBUG Lock::~Lock() noexcept { DeleteCriticalSection(reinterpret_cast(&_handle)); } +ASMJIT_INLINE_NODEBUG void Lock::lock() noexcept { EnterCriticalSection(reinterpret_cast(&_handle)); } +ASMJIT_INLINE_NODEBUG void Lock::unlock() noexcept { LeaveCriticalSection(reinterpret_cast(&_handle)); } #elif !defined(__EMSCRIPTEN__) // PThread implementation. #ifdef PTHREAD_MUTEX_INITIALIZER -ASMJIT_FORCE_INLINE Lock::Lock() noexcept : _handle(PTHREAD_MUTEX_INITIALIZER) {} +ASMJIT_INLINE_NODEBUG Lock::Lock() noexcept : _handle(PTHREAD_MUTEX_INITIALIZER) {} #else -ASMJIT_FORCE_INLINE Lock::Lock() noexcept { pthread_mutex_init(&_handle, nullptr); } +ASMJIT_INLINE_NODEBUG Lock::Lock() noexcept { pthread_mutex_init(&_handle, nullptr); } #endif -ASMJIT_FORCE_INLINE Lock::~Lock() noexcept { pthread_mutex_destroy(&_handle); } -ASMJIT_FORCE_INLINE void Lock::lock() noexcept { pthread_mutex_lock(&_handle); } -ASMJIT_FORCE_INLINE void Lock::unlock() noexcept { pthread_mutex_unlock(&_handle); } +ASMJIT_INLINE_NODEBUG Lock::~Lock() noexcept { pthread_mutex_destroy(&_handle); } +ASMJIT_INLINE_NODEBUG void Lock::lock() noexcept { pthread_mutex_lock(&_handle); } +ASMJIT_INLINE_NODEBUG void Lock::unlock() noexcept { pthread_mutex_unlock(&_handle); } #else // Dummy implementation - Emscripten or other unsupported platform. -ASMJIT_FORCE_INLINE Lock::Lock() noexcept {} -ASMJIT_FORCE_INLINE Lock::~Lock() noexcept {} -ASMJIT_FORCE_INLINE void Lock::lock() noexcept {} -ASMJIT_FORCE_INLINE void Lock::unlock() noexcept {} +ASMJIT_INLINE_NODEBUG Lock::Lock() noexcept {} +ASMJIT_INLINE_NODEBUG Lock::~Lock() noexcept {} +ASMJIT_INLINE_NODEBUG void Lock::lock() noexcept {} +ASMJIT_INLINE_NODEBUG void Lock::unlock() noexcept {} #endif @@ -54,11 +55,20 @@ class LockGuard { Lock& _target; - inline LockGuard(Lock& target) noexcept + ASMJIT_INLINE_NODEBUG LockGuard(Lock& target) noexcept : _target(target) { _target.lock(); } - inline ~LockGuard() noexcept { _target.unlock(); } + ASMJIT_INLINE_NODEBUG ~LockGuard() noexcept { _target.unlock(); } }; +#if !defined(_WIN32) +namespace OSUtils { + +//! Reads a file, only used on non-Windows platforms to access /sys or other files when necessary. +Error readFile(const char* name, String& dst, size_t maxSize) noexcept; + +} // {OSUtils} +#endif + //! \} //! \endcond diff --git a/3rdparty/asmjit/src/asmjit/core/raassignment_p.h b/3rdparty/asmjit/src/asmjit/core/raassignment_p.h index 54183293111ad..0865ece754868 100644 --- a/3rdparty/asmjit/src/asmjit/core/raassignment_p.h +++ b/3rdparty/asmjit/src/asmjit/core/raassignment_p.h @@ -66,7 +66,7 @@ class RAAssignment { //! PhysReg to WorkReg mapping. uint32_t workIds[1 /* ... */]; - static inline size_t sizeOf(size_t count) noexcept { + static ASMJIT_INLINE_NODEBUG size_t sizeOf(size_t count) noexcept { return sizeof(PhysToWorkMap) - sizeof(uint32_t) + count * sizeof(uint32_t); } @@ -163,16 +163,16 @@ class RAAssignment { //! \name Accessors //! \{ - inline PhysToWorkMap* physToWorkMap() const noexcept { return _physToWorkMap; } - inline WorkToPhysMap* workToPhysMap() const noexcept { return _workToPhysMap; } + ASMJIT_INLINE_NODEBUG PhysToWorkMap* physToWorkMap() const noexcept { return _physToWorkMap; } + ASMJIT_INLINE_NODEBUG WorkToPhysMap* workToPhysMap() const noexcept { return _workToPhysMap; } - inline RARegMask& assigned() noexcept { return _physToWorkMap->assigned; } - inline const RARegMask& assigned() const noexcept { return _physToWorkMap->assigned; } - inline uint32_t assigned(RegGroup group) const noexcept { return _physToWorkMap->assigned[group]; } + ASMJIT_INLINE_NODEBUG RARegMask& assigned() noexcept { return _physToWorkMap->assigned; } + ASMJIT_INLINE_NODEBUG const RARegMask& assigned() const noexcept { return _physToWorkMap->assigned; } + ASMJIT_INLINE_NODEBUG uint32_t assigned(RegGroup group) const noexcept { return _physToWorkMap->assigned[group]; } - inline RARegMask& dirty() noexcept { return _physToWorkMap->dirty; } - inline const RARegMask& dirty() const noexcept { return _physToWorkMap->dirty; } - inline RegMask dirty(RegGroup group) const noexcept { return _physToWorkMap->dirty[group]; } + ASMJIT_INLINE_NODEBUG RARegMask& dirty() noexcept { return _physToWorkMap->dirty; } + ASMJIT_INLINE_NODEBUG const RARegMask& dirty() const noexcept { return _physToWorkMap->dirty; } + ASMJIT_INLINE_NODEBUG RegMask dirty(RegGroup group) const noexcept { return _physToWorkMap->dirty[group]; } inline uint32_t workToPhysId(RegGroup group, uint32_t workId) const noexcept { DebugUtils::unused(group); diff --git a/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h b/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h index 1b763030c455e..9d9b4282d2bb3 100644 --- a/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h +++ b/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h @@ -401,7 +401,7 @@ class RACFGBuilderT { if (node->type() == NodeType::kSentinel) { if (node == _funcNode->endNode()) { // Make sure we didn't flow here if this is the end of the function sentinel. - if (ASMJIT_UNLIKELY(_curBlock)) + if (ASMJIT_UNLIKELY(_curBlock && _hasCode)) return DebugUtils::errored(kErrorInvalidState); break; } diff --git a/3rdparty/asmjit/src/asmjit/core/radefs_p.h b/3rdparty/asmjit/src/asmjit/core/radefs_p.h index 15c50ff728cd2..99e79be3ebbcd 100644 --- a/3rdparty/asmjit/src/asmjit/core/radefs_p.h +++ b/3rdparty/asmjit/src/asmjit/core/radefs_p.h @@ -67,7 +67,7 @@ class RAConstraints { uint32_t registerCount = arch == Arch::kX86 ? 8 : 16; _availableRegs[RegGroup::kGp] = Support::lsbMask(registerCount) & ~Support::bitMask(4u); _availableRegs[RegGroup::kVec] = Support::lsbMask(registerCount); - _availableRegs[RegGroup::kExtraVirt2] = Support::lsbMask(8); + _availableRegs[RegGroup::kMask] = Support::lsbMask(8); _availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask(8); return kErrorOk; } @@ -75,7 +75,7 @@ class RAConstraints { case Arch::kAArch64: { _availableRegs[RegGroup::kGp] = 0xFFFFFFFFu & ~Support::bitMask(18, 31u); _availableRegs[RegGroup::kVec] = 0xFFFFFFFFu; - _availableRegs[RegGroup::kExtraVirt2] = 0; + _availableRegs[RegGroup::kMask] = 0; _availableRegs[RegGroup::kExtraVirt3] = 0; return kErrorOk; } @@ -115,20 +115,20 @@ struct RAStrategy { //! \name Accessors //! \{ - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _type = RAStrategyType::kSimple; _flags = RAStrategyFlags::kNone; } - inline RAStrategyType type() const noexcept { return _type; } - inline void setType(RAStrategyType type) noexcept { _type = type; } + ASMJIT_INLINE_NODEBUG RAStrategyType type() const noexcept { return _type; } + ASMJIT_INLINE_NODEBUG void setType(RAStrategyType type) noexcept { _type = type; } - inline bool isSimple() const noexcept { return _type == RAStrategyType::kSimple; } - inline bool isComplex() const noexcept { return _type >= RAStrategyType::kComplex; } + ASMJIT_INLINE_NODEBUG bool isSimple() const noexcept { return _type == RAStrategyType::kSimple; } + ASMJIT_INLINE_NODEBUG bool isComplex() const noexcept { return _type >= RAStrategyType::kComplex; } - inline RAStrategyFlags flags() const noexcept { return _flags; } - inline bool hasFlag(RAStrategyFlags flag) const noexcept { return Support::test(_flags, flag); } - inline void addFlags(RAStrategyFlags flags) noexcept { _flags |= flags; } + ASMJIT_INLINE_NODEBUG RAStrategyFlags flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG bool hasFlag(RAStrategyFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG void addFlags(RAStrategyFlags flags) noexcept { _flags |= flags; } //! \} }; @@ -153,7 +153,7 @@ struct RARegCount { //! \{ //! Resets all counters to zero. - inline void reset() noexcept { _packed = 0; } + ASMJIT_INLINE_NODEBUG void reset() noexcept { _packed = 0; } //! \} @@ -170,8 +170,8 @@ struct RARegCount { return _regs[size_t(group)]; } - inline bool operator==(const RARegCount& other) const noexcept { return _packed == other._packed; } - inline bool operator!=(const RARegCount& other) const noexcept { return _packed != other._packed; } + ASMJIT_INLINE_NODEBUG bool operator==(const RARegCount& other) const noexcept { return _packed == other._packed; } + ASMJIT_INLINE_NODEBUG bool operator!=(const RARegCount& other) const noexcept { return _packed != other._packed; } //! \} @@ -233,17 +233,17 @@ struct RARegMask { //! \name Construction & Destruction //! \{ - inline void init(const RARegMask& other) noexcept { _masks = other._masks; } + ASMJIT_INLINE_NODEBUG void init(const RARegMask& other) noexcept { _masks = other._masks; } //! Reset all register masks to zero. - inline void reset() noexcept { _masks.fill(0); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { _masks.fill(0); } //! \} //! \name Overloaded Operators //! \{ - inline bool operator==(const RARegMask& other) const noexcept { return _masks == other._masks; } - inline bool operator!=(const RARegMask& other) const noexcept { return _masks != other._masks; } + ASMJIT_INLINE_NODEBUG bool operator==(const RARegMask& other) const noexcept { return _masks == other._masks; } + ASMJIT_INLINE_NODEBUG bool operator!=(const RARegMask& other) const noexcept { return _masks != other._masks; } template inline uint32_t& operator[](const Index& index) noexcept { return _masks[index]; } @@ -315,20 +315,20 @@ class RARegsStats { //! \name Accessors //! \{ - inline void reset() noexcept { _packed = 0; } - inline void combineWith(const RARegsStats& other) noexcept { _packed |= other._packed; } + ASMJIT_INLINE_NODEBUG void reset() noexcept { _packed = 0; } + ASMJIT_INLINE_NODEBUG void combineWith(const RARegsStats& other) noexcept { _packed |= other._packed; } - inline bool hasUsed() const noexcept { return (_packed & kMaskUsed) != 0u; } - inline bool hasUsed(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexUsed + uint32_t(group))) != 0u; } - inline void makeUsed(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexUsed + uint32_t(group)); } + ASMJIT_INLINE_NODEBUG bool hasUsed() const noexcept { return (_packed & kMaskUsed) != 0u; } + ASMJIT_INLINE_NODEBUG bool hasUsed(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexUsed + uint32_t(group))) != 0u; } + ASMJIT_INLINE_NODEBUG void makeUsed(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexUsed + uint32_t(group)); } - inline bool hasFixed() const noexcept { return (_packed & kMaskFixed) != 0u; } - inline bool hasFixed(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexFixed + uint32_t(group))) != 0u; } - inline void makeFixed(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexFixed + uint32_t(group)); } + ASMJIT_INLINE_NODEBUG bool hasFixed() const noexcept { return (_packed & kMaskFixed) != 0u; } + ASMJIT_INLINE_NODEBUG bool hasFixed(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexFixed + uint32_t(group))) != 0u; } + ASMJIT_INLINE_NODEBUG void makeFixed(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexFixed + uint32_t(group)); } - inline bool hasClobbered() const noexcept { return (_packed & kMaskClobbered) != 0u; } - inline bool hasClobbered(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexClobbered + uint32_t(group))) != 0u; } - inline void makeClobbered(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexClobbered + uint32_t(group)); } + ASMJIT_INLINE_NODEBUG bool hasClobbered() const noexcept { return (_packed & kMaskClobbered) != 0u; } + ASMJIT_INLINE_NODEBUG bool hasClobbered(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexClobbered + uint32_t(group))) != 0u; } + ASMJIT_INLINE_NODEBUG void makeClobbered(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexClobbered + uint32_t(group)); } //! \} }; @@ -346,18 +346,18 @@ class RALiveCount { //! \name Construction & Destruction //! \{ - inline RALiveCount() noexcept = default; - inline RALiveCount(const RALiveCount& other) noexcept = default; + ASMJIT_INLINE_NODEBUG RALiveCount() noexcept = default; + ASMJIT_INLINE_NODEBUG RALiveCount(const RALiveCount& other) noexcept = default; - inline void init(const RALiveCount& other) noexcept { n = other.n; } - inline void reset() noexcept { n.fill(0); } + ASMJIT_INLINE_NODEBUG void init(const RALiveCount& other) noexcept { n = other.n; } + ASMJIT_INLINE_NODEBUG void reset() noexcept { n.fill(0); } //! \} //! \name Overloaded Operators //! \{ - inline RALiveCount& operator=(const RALiveCount& other) noexcept = default; + ASMJIT_INLINE_NODEBUG RALiveCount& operator=(const RALiveCount& other) noexcept = default; inline uint32_t& operator[](RegGroup group) noexcept { return n[group]; } inline const uint32_t& operator[](RegGroup group) const noexcept { return n[group]; } @@ -394,31 +394,31 @@ struct RALiveInterval { //! \name Construction & Destruction //! \{ - inline RALiveInterval() noexcept : a(0), b(0) {} - inline RALiveInterval(uint32_t a, uint32_t b) noexcept : a(a), b(b) {} - inline RALiveInterval(const RALiveInterval& other) noexcept : a(other.a), b(other.b) {} + ASMJIT_INLINE_NODEBUG RALiveInterval() noexcept : a(0), b(0) {} + ASMJIT_INLINE_NODEBUG RALiveInterval(uint32_t a, uint32_t b) noexcept : a(a), b(b) {} + ASMJIT_INLINE_NODEBUG RALiveInterval(const RALiveInterval& other) noexcept : a(other.a), b(other.b) {} - inline void init(uint32_t aVal, uint32_t bVal) noexcept { + ASMJIT_INLINE_NODEBUG void init(uint32_t aVal, uint32_t bVal) noexcept { a = aVal; b = bVal; } - inline void init(const RALiveInterval& other) noexcept { init(other.a, other.b); } - inline void reset() noexcept { init(0, 0); } + ASMJIT_INLINE_NODEBUG void init(const RALiveInterval& other) noexcept { init(other.a, other.b); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { init(0, 0); } //! \} //! \name Overloaded Operators //! \{ - inline RALiveInterval& operator=(const RALiveInterval& other) = default; + ASMJIT_INLINE_NODEBUG RALiveInterval& operator=(const RALiveInterval& other) = default; //! \} //! \name Accessors //! \{ - inline bool isValid() const noexcept { return a < b; } - inline uint32_t width() const noexcept { return b - a; } + ASMJIT_INLINE_NODEBUG bool isValid() const noexcept { return a < b; } + ASMJIT_INLINE_NODEBUG uint32_t width() const noexcept { return b - a; } //! \} }; @@ -437,23 +437,23 @@ class RALiveSpan : public RALiveInterval, public T { //! \name Construction & Destruction //! \{ - inline RALiveSpan() noexcept : RALiveInterval(), T() {} - inline RALiveSpan(const RALiveSpan& other) noexcept : RALiveInterval(other), T() {} - inline RALiveSpan(const RALiveInterval& interval, const T& data) noexcept : RALiveInterval(interval), T(data) {} - inline RALiveSpan(uint32_t a, uint32_t b) noexcept : RALiveInterval(a, b), T() {} - inline RALiveSpan(uint32_t a, uint32_t b, const T& data) noexcept : RALiveInterval(a, b), T(data) {} + ASMJIT_INLINE_NODEBUG RALiveSpan() noexcept : RALiveInterval(), T() {} + ASMJIT_INLINE_NODEBUG RALiveSpan(const RALiveSpan& other) noexcept : RALiveInterval(other), T() {} + ASMJIT_INLINE_NODEBUG RALiveSpan(const RALiveInterval& interval, const T& data) noexcept : RALiveInterval(interval), T(data) {} + ASMJIT_INLINE_NODEBUG RALiveSpan(uint32_t a, uint32_t b) noexcept : RALiveInterval(a, b), T() {} + ASMJIT_INLINE_NODEBUG RALiveSpan(uint32_t a, uint32_t b, const T& data) noexcept : RALiveInterval(a, b), T(data) {} - inline void init(const RALiveSpan& other) noexcept { + ASMJIT_INLINE_NODEBUG void init(const RALiveSpan& other) noexcept { RALiveInterval::init(static_cast(other)); T::init(static_cast(other)); } - inline void init(const RALiveSpan& span, const T& data) noexcept { + ASMJIT_INLINE_NODEBUG void init(const RALiveSpan& span, const T& data) noexcept { RALiveInterval::init(static_cast(span)); T::init(data); } - inline void init(const RALiveInterval& interval, const T& data) noexcept { + ASMJIT_INLINE_NODEBUG void init(const RALiveInterval& interval, const T& data) noexcept { RALiveInterval::init(interval); T::init(data); } @@ -463,7 +463,7 @@ class RALiveSpan : public RALiveInterval, public T { //! \name Overloaded Operators //! \{ - inline RALiveSpan& operator=(const RALiveSpan& other) { + ASMJIT_INLINE_NODEBUG RALiveSpan& operator=(const RALiveSpan& other) { init(other); return *this; } @@ -483,23 +483,23 @@ class RALiveSpans { //! \name Construction & Destruction //! \{ - inline RALiveSpans() noexcept : _data() {} + ASMJIT_INLINE_NODEBUG RALiveSpans() noexcept : _data() {} - inline void reset() noexcept { _data.reset(); } - inline void release(ZoneAllocator* allocator) noexcept { _data.release(allocator); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { _data.reset(); } + ASMJIT_INLINE_NODEBUG void release(ZoneAllocator* allocator) noexcept { _data.release(allocator); } //! \} //! \name Accessors //! \{ - inline bool empty() const noexcept { return _data.empty(); } - inline uint32_t size() const noexcept { return _data.size(); } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _data.empty(); } + ASMJIT_INLINE_NODEBUG uint32_t size() const noexcept { return _data.size(); } - inline T* data() noexcept { return _data.data(); } - inline const T* data() const noexcept { return _data.data(); } + ASMJIT_INLINE_NODEBUG T* data() noexcept { return _data.data(); } + ASMJIT_INLINE_NODEBUG const T* data() const noexcept { return _data.data(); } - inline bool isOpen() const noexcept { + ASMJIT_INLINE_NODEBUG bool isOpen() const noexcept { uint32_t size = _data.size(); return size > 0 && _data[size - 1].b == RALiveInterval::kInf; } @@ -509,7 +509,7 @@ class RALiveSpans { //! \name Utilities //! \{ - inline void swap(RALiveSpans& other) noexcept { _data.swap(other._data); } + ASMJIT_INLINE_NODEBUG void swap(RALiveSpans& other) noexcept { _data.swap(other._data); } //! Open the current live span. ASMJIT_FORCE_INLINE Error openAt(ZoneAllocator* allocator, uint32_t start, uint32_t end) noexcept { @@ -550,10 +550,10 @@ class RALiveSpans { return width; } - inline T& operator[](uint32_t index) noexcept { return _data[index]; } - inline const T& operator[](uint32_t index) const noexcept { return _data[index]; } + ASMJIT_INLINE_NODEBUG T& operator[](uint32_t index) noexcept { return _data[index]; } + ASMJIT_INLINE_NODEBUG const T& operator[](uint32_t index) const noexcept { return _data[index]; } - inline bool intersects(const RALiveSpans& other) const noexcept { + ASMJIT_INLINE_NODEBUG bool intersects(const RALiveSpans& other) const noexcept { return intersects(*this, other); } @@ -655,9 +655,9 @@ class RALiveStats { //! \name Accessors //! \{ - inline uint32_t width() const noexcept { return _width; } - inline float freq() const noexcept { return _freq; } - inline float priority() const noexcept { return _priority; } + ASMJIT_INLINE_NODEBUG uint32_t width() const noexcept { return _width; } + ASMJIT_INLINE_NODEBUG float freq() const noexcept { return _freq; } + ASMJIT_INLINE_NODEBUG float priority() const noexcept { return _priority; } //! \} }; @@ -665,13 +665,13 @@ class RALiveStats { struct LiveRegData { uint32_t id; - inline explicit LiveRegData(uint32_t id = BaseReg::kIdBad) noexcept : id(id) {} - inline LiveRegData(const LiveRegData& other) noexcept : id(other.id) {} + ASMJIT_INLINE_NODEBUG explicit LiveRegData(uint32_t id = BaseReg::kIdBad) noexcept : id(id) {} + ASMJIT_INLINE_NODEBUG LiveRegData(const LiveRegData& other) noexcept = default; - inline void init(const LiveRegData& other) noexcept { id = other.id; } + ASMJIT_INLINE_NODEBUG void init(const LiveRegData& other) noexcept { id = other.id; } - inline bool operator==(const LiveRegData& other) const noexcept { return id == other.id; } - inline bool operator!=(const LiveRegData& other) const noexcept { return id != other.id; } + ASMJIT_INLINE_NODEBUG bool operator==(const LiveRegData& other) const noexcept { return id == other.id; } + ASMJIT_INLINE_NODEBUG bool operator!=(const LiveRegData& other) const noexcept { return id != other.id; } }; typedef RALiveSpan LiveRegSpan; @@ -740,6 +740,11 @@ enum class RATiedFlags : uint32_t { kLeadConsecutive = 0x00001000u, kConsecutiveData = 0x00006000u, + // Other Constraints + // ----------------- + + kUnique = 0x00008000u, + // Liveness Flags // -------------- @@ -853,51 +858,54 @@ struct RATiedReg { //! \{ //! Returns the associated WorkReg id. - inline uint32_t workId() const noexcept { return _workId; } + ASMJIT_INLINE_NODEBUG uint32_t workId() const noexcept { return _workId; } - inline bool hasConsecutiveParent() const noexcept { return _consecutiveParent != Globals::kInvalidId; } - inline uint32_t consecutiveParent() const noexcept { return _consecutiveParent; } - inline uint32_t consecutiveData() const noexcept { return consecutiveDataFromFlags(_flags); } + ASMJIT_INLINE_NODEBUG bool hasConsecutiveParent() const noexcept { return _consecutiveParent != Globals::kInvalidId; } + ASMJIT_INLINE_NODEBUG uint32_t consecutiveParent() const noexcept { return _consecutiveParent; } + ASMJIT_INLINE_NODEBUG uint32_t consecutiveData() const noexcept { return consecutiveDataFromFlags(_flags); } //! Returns TiedReg flags. - inline RATiedFlags flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG RATiedFlags flags() const noexcept { return _flags; } //! Checks if the given `flag` is set. - inline bool hasFlag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); } //! Adds tied register flags. - inline void addFlags(RATiedFlags flags) noexcept { _flags |= flags; } + ASMJIT_INLINE_NODEBUG void addFlags(RATiedFlags flags) noexcept { _flags |= flags; } //! Tests whether the register is read (writes `true` also if it's Read/Write). - inline bool isRead() const noexcept { return hasFlag(RATiedFlags::kRead); } + ASMJIT_INLINE_NODEBUG bool isRead() const noexcept { return hasFlag(RATiedFlags::kRead); } //! Tests whether the register is written (writes `true` also if it's Read/Write). - inline bool isWrite() const noexcept { return hasFlag(RATiedFlags::kWrite); } + ASMJIT_INLINE_NODEBUG bool isWrite() const noexcept { return hasFlag(RATiedFlags::kWrite); } //! Tests whether the register is read only. - inline bool isReadOnly() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRead; } + ASMJIT_INLINE_NODEBUG bool isReadOnly() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRead; } //! Tests whether the register is write only. - inline bool isWriteOnly() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kWrite; } + ASMJIT_INLINE_NODEBUG bool isWriteOnly() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kWrite; } //! Tests whether the register is read and written. - inline bool isReadWrite() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRW; } + ASMJIT_INLINE_NODEBUG bool isReadWrite() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRW; } //! Tests whether the tied register has use operand (Read/ReadWrite). - inline bool isUse() const noexcept { return hasFlag(RATiedFlags::kUse); } + ASMJIT_INLINE_NODEBUG bool isUse() const noexcept { return hasFlag(RATiedFlags::kUse); } //! Tests whether the tied register has out operand (Write). - inline bool isOut() const noexcept { return hasFlag(RATiedFlags::kOut); } + ASMJIT_INLINE_NODEBUG bool isOut() const noexcept { return hasFlag(RATiedFlags::kOut); } //! Tests whether the tied register has \ref RATiedFlags::kLeadConsecutive flag set. - inline bool isLeadConsecutive() const noexcept { return hasFlag(RATiedFlags::kLeadConsecutive); } + ASMJIT_INLINE_NODEBUG bool isLeadConsecutive() const noexcept { return hasFlag(RATiedFlags::kLeadConsecutive); } //! Tests whether the tied register has \ref RATiedFlags::kUseConsecutive flag set. - inline bool isUseConsecutive() const noexcept { return hasFlag(RATiedFlags::kUseConsecutive); } + ASMJIT_INLINE_NODEBUG bool isUseConsecutive() const noexcept { return hasFlag(RATiedFlags::kUseConsecutive); } //! Tests whether the tied register has \ref RATiedFlags::kOutConsecutive flag set. - inline bool isOutConsecutive() const noexcept { return hasFlag(RATiedFlags::kOutConsecutive); } + ASMJIT_INLINE_NODEBUG bool isOutConsecutive() const noexcept { return hasFlag(RATiedFlags::kOutConsecutive); } + + //! Tests whether the tied register must be unique (cannot be allocated to any other allocated register). + ASMJIT_INLINE_NODEBUG bool isUnique() const noexcept { return hasFlag(RATiedFlags::kUnique); } //! Tests whether the tied register has any consecutive flag. - inline bool hasAnyConsecutiveFlag() const noexcept { return hasFlag(RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive); } + ASMJIT_INLINE_NODEBUG bool hasAnyConsecutiveFlag() const noexcept { return hasFlag(RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive); } //! Tests whether the USE slot can be patched to memory operand. - inline bool hasUseRM() const noexcept { return hasFlag(RATiedFlags::kUseRM); } + ASMJIT_INLINE_NODEBUG bool hasUseRM() const noexcept { return hasFlag(RATiedFlags::kUseRM); } //! Tests whether the OUT slot can be patched to memory operand. - inline bool hasOutRM() const noexcept { return hasFlag(RATiedFlags::kOutRM); } + ASMJIT_INLINE_NODEBUG bool hasOutRM() const noexcept { return hasFlag(RATiedFlags::kOutRM); } - inline uint32_t rmSize() const noexcept { return _rmSize; } + ASMJIT_INLINE_NODEBUG uint32_t rmSize() const noexcept { return _rmSize; } inline void makeReadOnly() noexcept { _flags = (_flags & ~(RATiedFlags::kOut | RATiedFlags::kWrite)) | RATiedFlags::kUse; @@ -912,47 +920,47 @@ struct RATiedReg { } //! Tests whether the register would duplicate. - inline bool isDuplicate() const noexcept { return hasFlag(RATiedFlags::kDuplicate); } + ASMJIT_INLINE_NODEBUG bool isDuplicate() const noexcept { return hasFlag(RATiedFlags::kDuplicate); } //! Tests whether the register (and the instruction it's part of) appears last in the basic block. - inline bool isLast() const noexcept { return hasFlag(RATiedFlags::kLast); } + ASMJIT_INLINE_NODEBUG bool isLast() const noexcept { return hasFlag(RATiedFlags::kLast); } //! Tests whether the register should be killed after USEd and/or OUTed. - inline bool isKill() const noexcept { return hasFlag(RATiedFlags::kKill); } + ASMJIT_INLINE_NODEBUG bool isKill() const noexcept { return hasFlag(RATiedFlags::kKill); } //! Tests whether the register is OUT or KILL (used internally by local register allocator). - inline bool isOutOrKill() const noexcept { return hasFlag(RATiedFlags::kOut | RATiedFlags::kKill); } + ASMJIT_INLINE_NODEBUG bool isOutOrKill() const noexcept { return hasFlag(RATiedFlags::kOut | RATiedFlags::kKill); } //! Returns a register mask that describes allocable USE registers (Read/ReadWrite access). - inline RegMask useRegMask() const noexcept { return _useRegMask; } + ASMJIT_INLINE_NODEBUG RegMask useRegMask() const noexcept { return _useRegMask; } //! Returns a register mask that describes allocable OUT registers (WriteOnly access). - inline RegMask outRegMask() const noexcept { return _outRegMask; } + ASMJIT_INLINE_NODEBUG RegMask outRegMask() const noexcept { return _outRegMask; } - inline uint32_t refCount() const noexcept { return _refCount; } - inline void addRefCount(uint32_t n = 1) noexcept { _refCount = uint8_t(_refCount + n); } + ASMJIT_INLINE_NODEBUG uint32_t refCount() const noexcept { return _refCount; } + ASMJIT_INLINE_NODEBUG void addRefCount(uint32_t n = 1) noexcept { _refCount = uint8_t(_refCount + n); } //! Tests whether the register must be allocated to a fixed physical register before it's used. - inline bool hasUseId() const noexcept { return _useId != BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG bool hasUseId() const noexcept { return _useId != BaseReg::kIdBad; } //! Tests whether the register must be allocated to a fixed physical register before it's written. - inline bool hasOutId() const noexcept { return _outId != BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG bool hasOutId() const noexcept { return _outId != BaseReg::kIdBad; } //! Returns a physical register id used for 'use' operation. - inline uint32_t useId() const noexcept { return _useId; } + ASMJIT_INLINE_NODEBUG uint32_t useId() const noexcept { return _useId; } //! Returns a physical register id used for 'out' operation. - inline uint32_t outId() const noexcept { return _outId; } + ASMJIT_INLINE_NODEBUG uint32_t outId() const noexcept { return _outId; } - inline uint32_t useRewriteMask() const noexcept { return _useRewriteMask; } - inline uint32_t outRewriteMask() const noexcept { return _outRewriteMask; } + ASMJIT_INLINE_NODEBUG uint32_t useRewriteMask() const noexcept { return _useRewriteMask; } + ASMJIT_INLINE_NODEBUG uint32_t outRewriteMask() const noexcept { return _outRewriteMask; } //! Sets a physical register used for 'use' operation. - inline void setUseId(uint32_t index) noexcept { _useId = uint8_t(index); } + ASMJIT_INLINE_NODEBUG void setUseId(uint32_t index) noexcept { _useId = uint8_t(index); } //! Sets a physical register used for 'out' operation. - inline void setOutId(uint32_t index) noexcept { _outId = uint8_t(index); } + ASMJIT_INLINE_NODEBUG void setOutId(uint32_t index) noexcept { _outId = uint8_t(index); } - inline bool isUseDone() const noexcept { return hasFlag(RATiedFlags::kUseDone); } - inline bool isOutDone() const noexcept { return hasFlag(RATiedFlags::kUseDone); } + ASMJIT_INLINE_NODEBUG bool isUseDone() const noexcept { return hasFlag(RATiedFlags::kUseDone); } + ASMJIT_INLINE_NODEBUG bool isOutDone() const noexcept { return hasFlag(RATiedFlags::kUseDone); } - inline void markUseDone() noexcept { addFlags(RATiedFlags::kUseDone); } - inline void markOutDone() noexcept { addFlags(RATiedFlags::kUseDone); } + ASMJIT_INLINE_NODEBUG void markUseDone() noexcept { addFlags(RATiedFlags::kUseDone); } + ASMJIT_INLINE_NODEBUG void markOutDone() noexcept { addFlags(RATiedFlags::kUseDone); } //! \} }; @@ -1082,7 +1090,7 @@ class RAWorkReg { //! \name Construction & Destruction //! \{ - inline RAWorkReg(VirtReg* vReg, uint32_t workId) noexcept + ASMJIT_INLINE_NODEBUG RAWorkReg(VirtReg* vReg, uint32_t workId) noexcept : _workId(workId), _virtId(vReg->id()), _virtReg(vReg), @@ -1093,97 +1101,97 @@ class RAWorkReg { //! \name Accessors //! \{ - inline uint32_t workId() const noexcept { return _workId; } - inline uint32_t virtId() const noexcept { return _virtId; } + ASMJIT_INLINE_NODEBUG uint32_t workId() const noexcept { return _workId; } + ASMJIT_INLINE_NODEBUG uint32_t virtId() const noexcept { return _virtId; } - inline const char* name() const noexcept { return _virtReg->name(); } - inline uint32_t nameSize() const noexcept { return _virtReg->nameSize(); } + ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _virtReg->name(); } + ASMJIT_INLINE_NODEBUG uint32_t nameSize() const noexcept { return _virtReg->nameSize(); } - inline TypeId typeId() const noexcept { return _virtReg->typeId(); } + ASMJIT_INLINE_NODEBUG TypeId typeId() const noexcept { return _virtReg->typeId(); } - inline RAWorkRegFlags flags() const noexcept { return _flags; } - inline bool hasFlag(RAWorkRegFlags flag) const noexcept { return Support::test(_flags, flag); } - inline void addFlags(RAWorkRegFlags flags) noexcept { _flags |= flags; } + ASMJIT_INLINE_NODEBUG RAWorkRegFlags flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG bool hasFlag(RAWorkRegFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG void addFlags(RAWorkRegFlags flags) noexcept { _flags |= flags; } - inline bool isAllocated() const noexcept { return hasFlag(RAWorkRegFlags::kAllocated); } - inline void markAllocated() noexcept { addFlags(RAWorkRegFlags::kAllocated); } + ASMJIT_INLINE_NODEBUG bool isAllocated() const noexcept { return hasFlag(RAWorkRegFlags::kAllocated); } + ASMJIT_INLINE_NODEBUG void markAllocated() noexcept { addFlags(RAWorkRegFlags::kAllocated); } - inline bool isLeadConsecutive() const noexcept { return hasFlag(RAWorkRegFlags::kLeadConsecutive); } - inline void markLeadConsecutive() noexcept { addFlags(RAWorkRegFlags::kLeadConsecutive); } + ASMJIT_INLINE_NODEBUG bool isLeadConsecutive() const noexcept { return hasFlag(RAWorkRegFlags::kLeadConsecutive); } + ASMJIT_INLINE_NODEBUG void markLeadConsecutive() noexcept { addFlags(RAWorkRegFlags::kLeadConsecutive); } - inline bool isProcessedConsecutive() const noexcept { return hasFlag(RAWorkRegFlags::kProcessedConsecutive); } - inline void markProcessedConsecutive() noexcept { addFlags(RAWorkRegFlags::kProcessedConsecutive); } + ASMJIT_INLINE_NODEBUG bool isProcessedConsecutive() const noexcept { return hasFlag(RAWorkRegFlags::kProcessedConsecutive); } + ASMJIT_INLINE_NODEBUG void markProcessedConsecutive() noexcept { addFlags(RAWorkRegFlags::kProcessedConsecutive); } - inline bool isStackUsed() const noexcept { return hasFlag(RAWorkRegFlags::kStackUsed); } - inline void markStackUsed() noexcept { addFlags(RAWorkRegFlags::kStackUsed); } + ASMJIT_INLINE_NODEBUG bool isStackUsed() const noexcept { return hasFlag(RAWorkRegFlags::kStackUsed); } + ASMJIT_INLINE_NODEBUG void markStackUsed() noexcept { addFlags(RAWorkRegFlags::kStackUsed); } - inline bool isStackPreferred() const noexcept { return hasFlag(RAWorkRegFlags::kStackPreferred); } - inline void markStackPreferred() noexcept { addFlags(RAWorkRegFlags::kStackPreferred); } + ASMJIT_INLINE_NODEBUG bool isStackPreferred() const noexcept { return hasFlag(RAWorkRegFlags::kStackPreferred); } + ASMJIT_INLINE_NODEBUG void markStackPreferred() noexcept { addFlags(RAWorkRegFlags::kStackPreferred); } //! Tests whether this RAWorkReg has been coalesced with another one (cannot be used anymore). - inline bool isCoalesced() const noexcept { return hasFlag(RAWorkRegFlags::kCoalesced); } + ASMJIT_INLINE_NODEBUG bool isCoalesced() const noexcept { return hasFlag(RAWorkRegFlags::kCoalesced); } - inline OperandSignature signature() const noexcept { return _signature; } - inline RegType type() const noexcept { return _signature.regType(); } - inline RegGroup group() const noexcept { return _signature.regGroup(); } + ASMJIT_INLINE_NODEBUG OperandSignature signature() const noexcept { return _signature; } + ASMJIT_INLINE_NODEBUG RegType type() const noexcept { return _signature.regType(); } + ASMJIT_INLINE_NODEBUG RegGroup group() const noexcept { return _signature.regGroup(); } - inline VirtReg* virtReg() const noexcept { return _virtReg; } + ASMJIT_INLINE_NODEBUG VirtReg* virtReg() const noexcept { return _virtReg; } - inline bool hasTiedReg() const noexcept { return _tiedReg != nullptr; } - inline RATiedReg* tiedReg() const noexcept { return _tiedReg; } - inline void setTiedReg(RATiedReg* tiedReg) noexcept { _tiedReg = tiedReg; } - inline void resetTiedReg() noexcept { _tiedReg = nullptr; } + ASMJIT_INLINE_NODEBUG bool hasTiedReg() const noexcept { return _tiedReg != nullptr; } + ASMJIT_INLINE_NODEBUG RATiedReg* tiedReg() const noexcept { return _tiedReg; } + ASMJIT_INLINE_NODEBUG void setTiedReg(RATiedReg* tiedReg) noexcept { _tiedReg = tiedReg; } + ASMJIT_INLINE_NODEBUG void resetTiedReg() noexcept { _tiedReg = nullptr; } - inline bool hasStackSlot() const noexcept { return _stackSlot != nullptr; } - inline RAStackSlot* stackSlot() const noexcept { return _stackSlot; } + ASMJIT_INLINE_NODEBUG bool hasStackSlot() const noexcept { return _stackSlot != nullptr; } + ASMJIT_INLINE_NODEBUG RAStackSlot* stackSlot() const noexcept { return _stackSlot; } - inline LiveRegSpans& liveSpans() noexcept { return _liveSpans; } - inline const LiveRegSpans& liveSpans() const noexcept { return _liveSpans; } + ASMJIT_INLINE_NODEBUG LiveRegSpans& liveSpans() noexcept { return _liveSpans; } + ASMJIT_INLINE_NODEBUG const LiveRegSpans& liveSpans() const noexcept { return _liveSpans; } - inline RALiveStats& liveStats() noexcept { return _liveStats; } - inline const RALiveStats& liveStats() const noexcept { return _liveStats; } + ASMJIT_INLINE_NODEBUG RALiveStats& liveStats() noexcept { return _liveStats; } + ASMJIT_INLINE_NODEBUG const RALiveStats& liveStats() const noexcept { return _liveStats; } - inline bool hasArgIndex() const noexcept { return _argIndex != kNoArgIndex; } - inline uint32_t argIndex() const noexcept { return _argIndex; } - inline uint32_t argValueIndex() const noexcept { return _argValueIndex; } + ASMJIT_INLINE_NODEBUG bool hasArgIndex() const noexcept { return _argIndex != kNoArgIndex; } + ASMJIT_INLINE_NODEBUG uint32_t argIndex() const noexcept { return _argIndex; } + ASMJIT_INLINE_NODEBUG uint32_t argValueIndex() const noexcept { return _argValueIndex; } inline void setArgIndex(uint32_t argIndex, uint32_t valueIndex) noexcept { _argIndex = uint8_t(argIndex); _argValueIndex = uint8_t(valueIndex); } - inline bool hasHomeRegId() const noexcept { return _homeRegId != BaseReg::kIdBad; } - inline uint32_t homeRegId() const noexcept { return _homeRegId; } - inline void setHomeRegId(uint32_t physId) noexcept { _homeRegId = uint8_t(physId); } + ASMJIT_INLINE_NODEBUG bool hasHomeRegId() const noexcept { return _homeRegId != BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG uint32_t homeRegId() const noexcept { return _homeRegId; } + ASMJIT_INLINE_NODEBUG void setHomeRegId(uint32_t physId) noexcept { _homeRegId = uint8_t(physId); } - inline bool hasHintRegId() const noexcept { return _hintRegId != BaseReg::kIdBad; } - inline uint32_t hintRegId() const noexcept { return _hintRegId; } - inline void setHintRegId(uint32_t physId) noexcept { _hintRegId = uint8_t(physId); } + ASMJIT_INLINE_NODEBUG bool hasHintRegId() const noexcept { return _hintRegId != BaseReg::kIdBad; } + ASMJIT_INLINE_NODEBUG uint32_t hintRegId() const noexcept { return _hintRegId; } + ASMJIT_INLINE_NODEBUG void setHintRegId(uint32_t physId) noexcept { _hintRegId = uint8_t(physId); } - inline RegMask useIdMask() const noexcept { return _useIdMask; } - inline bool hasUseIdMask() const noexcept { return _useIdMask != 0u; } - inline bool hasMultipleUseIds() const noexcept { return _useIdMask != 0u && !Support::isPowerOf2(_useIdMask); } - inline void addUseIdMask(RegMask mask) noexcept { _useIdMask |= mask; } + ASMJIT_INLINE_NODEBUG RegMask useIdMask() const noexcept { return _useIdMask; } + ASMJIT_INLINE_NODEBUG bool hasUseIdMask() const noexcept { return _useIdMask != 0u; } + ASMJIT_INLINE_NODEBUG bool hasMultipleUseIds() const noexcept { return _useIdMask != 0u && !Support::isPowerOf2(_useIdMask); } + ASMJIT_INLINE_NODEBUG void addUseIdMask(RegMask mask) noexcept { _useIdMask |= mask; } - inline RegMask preferredMask() const noexcept { return _preferredMask; } - inline bool hasPrereffedMask() const noexcept { return _preferredMask != 0xFFFFFFFFu; } - inline void restrictPreferredMask(RegMask mask) noexcept { _preferredMask &= mask; } + ASMJIT_INLINE_NODEBUG RegMask preferredMask() const noexcept { return _preferredMask; } + ASMJIT_INLINE_NODEBUG bool hasPreferredMask() const noexcept { return _preferredMask != 0xFFFFFFFFu; } + ASMJIT_INLINE_NODEBUG void restrictPreferredMask(RegMask mask) noexcept { _preferredMask &= mask; } - inline RegMask consecutiveMask() const noexcept { return _consecutiveMask; } - inline bool hasConsecutiveMask() const noexcept { return _consecutiveMask != 0xFFFFFFFFu; } - inline void restrictConsecutiveMask(RegMask mask) noexcept { _consecutiveMask &= mask; } + ASMJIT_INLINE_NODEBUG RegMask consecutiveMask() const noexcept { return _consecutiveMask; } + ASMJIT_INLINE_NODEBUG bool hasConsecutiveMask() const noexcept { return _consecutiveMask != 0xFFFFFFFFu; } + ASMJIT_INLINE_NODEBUG void restrictConsecutiveMask(RegMask mask) noexcept { _consecutiveMask &= mask; } - inline RegMask clobberSurvivalMask() const noexcept { return _clobberSurvivalMask; } - inline void addClobberSurvivalMask(RegMask mask) noexcept { _clobberSurvivalMask |= mask; } + ASMJIT_INLINE_NODEBUG RegMask clobberSurvivalMask() const noexcept { return _clobberSurvivalMask; } + ASMJIT_INLINE_NODEBUG void addClobberSurvivalMask(RegMask mask) noexcept { _clobberSurvivalMask |= mask; } - inline RegMask allocatedMask() const noexcept { return _allocatedMask; } - inline void addAllocatedMask(RegMask mask) noexcept { _allocatedMask |= mask; } + ASMJIT_INLINE_NODEBUG RegMask allocatedMask() const noexcept { return _allocatedMask; } + ASMJIT_INLINE_NODEBUG void addAllocatedMask(RegMask mask) noexcept { _allocatedMask |= mask; } - inline uint64_t regByteMask() const noexcept { return _regByteMask; } - inline void setRegByteMask(uint64_t mask) noexcept { _regByteMask = mask; } + ASMJIT_INLINE_NODEBUG uint64_t regByteMask() const noexcept { return _regByteMask; } + ASMJIT_INLINE_NODEBUG void setRegByteMask(uint64_t mask) noexcept { _regByteMask = mask; } - inline bool hasImmediateConsecutives() const noexcept { return !_immediateConsecutives.empty(); } - inline const ZoneBitVector& immediateConsecutives() const noexcept { return _immediateConsecutives; } + ASMJIT_INLINE_NODEBUG bool hasImmediateConsecutives() const noexcept { return !_immediateConsecutives.empty(); } + ASMJIT_INLINE_NODEBUG const ZoneBitVector& immediateConsecutives() const noexcept { return _immediateConsecutives; } inline Error addImmediateConsecutive(ZoneAllocator* allocator, uint32_t workId) noexcept { if (_immediateConsecutives.size() <= workId) diff --git a/3rdparty/asmjit/src/asmjit/core/ralocal.cpp b/3rdparty/asmjit/src/asmjit/core/ralocal.cpp index b4d92446b3c86..16f11a800c5dd 100644 --- a/3rdparty/asmjit/src/asmjit/core/ralocal.cpp +++ b/3rdparty/asmjit/src/asmjit/core/ralocal.cpp @@ -21,8 +21,8 @@ static ASMJIT_FORCE_INLINE RATiedReg* RALocal_findTiedRegByWorkId(RATiedReg* tie return nullptr; } -// RALocalAllocator - Init & Reset -// =============================== +// RALocalAllocator - Initialization & Reset +// ========================================= Error RALocalAllocator::init() noexcept { PhysToWorkMap* physToWorkMap; @@ -927,6 +927,10 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept { if (!tiedReg->isOut()) continue; + RegMask avoidOut = avoidRegs; + if (tiedReg->isUnique()) + avoidOut |= willUse; + uint32_t workId = tiedReg->workId(); uint32_t assignedId = _curAssignment.workToPhysId(group, workId); @@ -935,7 +939,7 @@ Error RALocalAllocator::allocInst(InstNode* node) noexcept { uint32_t physId = tiedReg->outId(); if (physId == RAAssignment::kPhysNone) { - RegMask allocableRegs = tiedReg->outRegMask() & ~(outRegs | avoidRegs); + RegMask allocableRegs = tiedReg->outRegMask() & ~(outRegs | avoidOut); if (!(allocableRegs & ~liveRegs)) { // There are no more registers, decide which one to spill. diff --git a/3rdparty/asmjit/src/asmjit/core/ralocal_p.h b/3rdparty/asmjit/src/asmjit/core/ralocal_p.h index b40e8674274da..63fd1b78abab3 100644 --- a/3rdparty/asmjit/src/asmjit/core/ralocal_p.h +++ b/3rdparty/asmjit/src/asmjit/core/ralocal_p.h @@ -29,52 +29,45 @@ class RALocalAllocator { typedef RAAssignment::WorkToPhysMap WorkToPhysMap; //! Link to `BaseRAPass`. - BaseRAPass* _pass; + BaseRAPass* _pass {}; //! Link to `BaseCompiler`. - BaseCompiler* _cc; + BaseCompiler* _cc {}; //! Architecture traits. - const ArchTraits* _archTraits; + const ArchTraits* _archTraits {}; //! Registers available to the allocator. - RARegMask _availableRegs; + RARegMask _availableRegs {}; //! Registers clobbered by the allocator. - RARegMask _clobberedRegs; + RARegMask _clobberedRegs {}; //! Register assignment (current). - RAAssignment _curAssignment; + RAAssignment _curAssignment {}; //! Register assignment used temporarily during assignment switches. - RAAssignment _tmpAssignment; + RAAssignment _tmpAssignment {}; //! Link to the current `RABlock`. - RABlock* _block; + RABlock* _block {}; //! InstNode. - InstNode* _node; + InstNode* _node {}; //! RA instruction. - RAInst* _raInst; + RAInst* _raInst {}; //! Count of all TiedReg's. - uint32_t _tiedTotal; + uint32_t _tiedTotal {}; //! TiedReg's total counter. - RARegCount _tiedCount; + RARegCount _tiedCount {}; //! Temporary workToPhysMap that can be used freely by the allocator. - WorkToPhysMap* _tmpWorkToPhysMap; + WorkToPhysMap* _tmpWorkToPhysMap {}; //! \name Construction & Destruction //! \{ - inline RALocalAllocator(BaseRAPass* pass) noexcept + inline explicit RALocalAllocator(BaseRAPass* pass) noexcept : _pass(pass), _cc(pass->cc()), _archTraits(pass->_archTraits), - _availableRegs(pass->_availableRegs), - _clobberedRegs(), - _curAssignment(), - _block(nullptr), - _node(nullptr), - _raInst(nullptr), - _tiedTotal(), - _tiedCount() {} + _availableRegs(pass->_availableRegs) {} Error init() noexcept; @@ -83,31 +76,31 @@ class RALocalAllocator { //! \name Accessors //! \{ - inline RAWorkReg* workRegById(uint32_t workId) const noexcept { return _pass->workRegById(workId); } - inline PhysToWorkMap* physToWorkMap() const noexcept { return _curAssignment.physToWorkMap(); } - inline WorkToPhysMap* workToPhysMap() const noexcept { return _curAssignment.workToPhysMap(); } + ASMJIT_INLINE_NODEBUG RAWorkReg* workRegById(uint32_t workId) const noexcept { return _pass->workRegById(workId); } + ASMJIT_INLINE_NODEBUG PhysToWorkMap* physToWorkMap() const noexcept { return _curAssignment.physToWorkMap(); } + ASMJIT_INLINE_NODEBUG WorkToPhysMap* workToPhysMap() const noexcept { return _curAssignment.workToPhysMap(); } //! Returns the currently processed block. - inline RABlock* block() const noexcept { return _block; } + ASMJIT_INLINE_NODEBUG RABlock* block() const noexcept { return _block; } //! Sets the currently processed block. - inline void setBlock(RABlock* block) noexcept { _block = block; } + ASMJIT_INLINE_NODEBUG void setBlock(RABlock* block) noexcept { _block = block; } //! Returns the currently processed `InstNode`. - inline InstNode* node() const noexcept { return _node; } + ASMJIT_INLINE_NODEBUG InstNode* node() const noexcept { return _node; } //! Returns the currently processed `RAInst`. - inline RAInst* raInst() const noexcept { return _raInst; } + ASMJIT_INLINE_NODEBUG RAInst* raInst() const noexcept { return _raInst; } //! Returns all tied regs as `RATiedReg` array. - inline RATiedReg* tiedRegs() const noexcept { return _raInst->tiedRegs(); } + ASMJIT_INLINE_NODEBUG RATiedReg* tiedRegs() const noexcept { return _raInst->tiedRegs(); } //! Returns tied registers grouped by the given `group`. - inline RATiedReg* tiedRegs(RegGroup group) const noexcept { return _raInst->tiedRegs(group); } + ASMJIT_INLINE_NODEBUG RATiedReg* tiedRegs(RegGroup group) const noexcept { return _raInst->tiedRegs(group); } //! Returns count of all TiedRegs used by the instruction. - inline uint32_t tiedCount() const noexcept { return _tiedTotal; } + ASMJIT_INLINE_NODEBUG uint32_t tiedCount() const noexcept { return _tiedTotal; } //! Returns count of TiedRegs used by the given register `group`. - inline uint32_t tiedCount(RegGroup group) const noexcept { return _tiedCount.get(group); } + ASMJIT_INLINE_NODEBUG uint32_t tiedCount(RegGroup group) const noexcept { return _tiedCount.get(group); } - inline bool isGroupUsed(RegGroup group) const noexcept { return _tiedCount[group] != 0; } + ASMJIT_INLINE_NODEBUG bool isGroupUsed(RegGroup group) const noexcept { return _tiedCount[group] != 0; } //! \} @@ -126,7 +119,7 @@ class RALocalAllocator { //! a code sequence that is always executed regardless of the flow. Error switchToAssignment(PhysToWorkMap* dstPhysToWorkMap, const ZoneBitVector& liveIn, bool dstReadOnly, bool tryMode) noexcept; - inline Error spillRegsBeforeEntry(RABlock* block) noexcept { + ASMJIT_INLINE_NODEBUG Error spillRegsBeforeEntry(RABlock* block) noexcept { return spillScratchGpRegsBeforeEntry(block->entryScratchGpRegs()); } @@ -153,7 +146,7 @@ class RALocalAllocator { kCostOfDirtyFlag = kCostOfFrequency / 4 }; - inline uint32_t costByFrequency(float freq) const noexcept { + ASMJIT_INLINE_NODEBUG uint32_t costByFrequency(float freq) const noexcept { return uint32_t(int32_t(freq * float(kCostOfFrequency))); } diff --git a/3rdparty/asmjit/src/asmjit/core/rapass.cpp b/3rdparty/asmjit/src/asmjit/core/rapass.cpp index 0e87ab6a259a9..837cbe291cd21 100644 --- a/3rdparty/asmjit/src/asmjit/core/rapass.cpp +++ b/3rdparty/asmjit/src/asmjit/core/rapass.cpp @@ -114,11 +114,14 @@ Error BaseRAPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) { #ifndef ASMJIT_NO_LOGGING _logger = logger; _formatOptions.reset(); - _diagnosticOptions = DiagnosticOptions::kNone; + _diagnosticOptions = _cb->diagnosticOptions(); if (logger) { _formatOptions = logger->options(); - _diagnosticOptions = _cb->diagnosticOptions(); + } + else { + _diagnosticOptions &= ~(DiagnosticOptions::kRADebugCFG | + DiagnosticOptions::kRADebugUnreachable); } #else DebugUtils::unused(logger); @@ -193,6 +196,12 @@ Error BaseRAPass::onPerformAllSteps() noexcept { return kErrorOk; } +// BaseRAPass - Events +// =================== + +void BaseRAPass::onInit() noexcept {} +void BaseRAPass::onDone() noexcept {} + // BaseRAPass - CFG - Basic Block Management // ========================================= @@ -304,6 +313,11 @@ Error BaseRAPass::addBlock(RABlock* block) noexcept { // BaseRAPass - CFG - Build // ======================== +// [[pure virtual]] +Error BaseRAPass::buildCFG() noexcept { + return DebugUtils::errored(kErrorInvalidState); +} + Error BaseRAPass::initSharedAssignments(const ZoneVector& sharedAssignmentsMap) noexcept { if (sharedAssignmentsMap.empty()) return kErrorOk; @@ -328,9 +342,14 @@ Error BaseRAPass::initSharedAssignments(const ZoneVector& sharedAssign RABlock* firstSuccessor = successors[0]; // NOTE: Shared assignments connect all possible successors so we only need the first to propagate exit scratch // GP registers. - ASMJIT_ASSERT(firstSuccessor->hasSharedAssignmentId()); - RASharedAssignment& sa = _sharedAssignments[firstSuccessor->sharedAssignmentId()]; - sa.addEntryScratchGpRegs(block->exitScratchGpRegs()); + if (firstSuccessor->hasSharedAssignmentId()) { + RASharedAssignment& sa = _sharedAssignments[firstSuccessor->sharedAssignmentId()]; + sa.addEntryScratchGpRegs(block->exitScratchGpRegs()); + } + else { + // This is only allowed if there is a single successor - in that case shared assignment is not necessary. + ASMJIT_ASSERT(successors.size() == 1u); + } } } if (block->hasSharedAssignmentId()) { @@ -347,21 +366,18 @@ Error BaseRAPass::initSharedAssignments(const ZoneVector& sharedAssign class RABlockVisitItem { public: + RABlock* _block {}; + uint32_t _index {}; + inline RABlockVisitItem(RABlock* block, uint32_t index) noexcept : _block(block), _index(index) {} - inline RABlockVisitItem(const RABlockVisitItem& other) noexcept - : _block(other._block), - _index(other._index) {} - + inline RABlockVisitItem(const RABlockVisitItem& other) noexcept = default; inline RABlockVisitItem& operator=(const RABlockVisitItem& other) noexcept = default; inline RABlock* block() const noexcept { return _block; } inline uint32_t index() const noexcept { return _index; } - - RABlock* _block; - uint32_t _index; }; Error BaseRAPass::buildCFGViews() noexcept { @@ -460,12 +476,18 @@ Error BaseRAPass::buildCFGDominators() noexcept { entryBlock->setIDom(entryBlock); bool changed = true; - uint32_t nIters = 0; + +#ifndef ASMJIT_NO_LOGGING + uint32_t numIters = 0; +#endif while (changed) { - nIters++; changed = false; +#ifndef ASMJIT_NO_LOGGING + numIters++; +#endif + uint32_t i = _pov.size(); while (i) { RABlock* block = _pov[--i]; @@ -492,7 +514,7 @@ Error BaseRAPass::buildCFGDominators() noexcept { } } - ASMJIT_RA_LOG_FORMAT(" Done (%u iterations)\n", nIters); + ASMJIT_RA_LOG_FORMAT(" Done (%u iterations)\n", numIters); return kErrorOk; } @@ -740,6 +762,13 @@ namespace LiveOps { static ASMJIT_FORCE_INLINE bool op(BitWord* dst, const BitWord* a, const BitWord* b, const BitWord* c, uint32_t n) noexcept { BitWord changed = 0; +#if defined(_MSC_VER) && _MSC_VER <= 1938 + // MSVC workaround (see #427). + // + // MSVC incorrectly auto-vectorizes this loop when used with operator. For some reason it trashes a content + // of a register, which causes the result to be incorrect. It's a compiler bug we have to prevent unfortunately. + #pragma loop(no_vector) +#endif for (uint32_t i = 0; i < n; i++) { BitWord before = dst[i]; BitWord after = Operator::op(before, a[i], b[i], c[i]); @@ -751,7 +780,7 @@ namespace LiveOps { return changed != 0; } - static ASMJIT_FORCE_INLINE bool recalcInOut(RABlock* block, uint32_t numBitWords, bool initial = false) noexcept { + static ASMJIT_NOINLINE bool recalcInOut(RABlock* block, uint32_t numBitWords, bool initial = false) noexcept { bool changed = initial; const RABlocks& successors = block->successors(); @@ -782,7 +811,6 @@ ASMJIT_FAVOR_SPEED Error BaseRAPass::buildLiveness() noexcept { uint32_t numAllBlocks = blockCount(); uint32_t numReachableBlocks = reachableBlockCount(); - uint32_t numVisits = numReachableBlocks; uint32_t numWorkRegs = workRegCount(); uint32_t numBitWords = ZoneBitVector::_wordsPerBits(numWorkRegs); @@ -852,7 +880,7 @@ ASMJIT_FAVOR_SPEED Error BaseRAPass::buildLiveness() noexcept { if (tiedReg->hasConsecutiveParent()) { RAWorkReg* consecutiveParentReg = workRegById(tiedReg->consecutiveParent()); - consecutiveParentReg->addImmediateConsecutive(allocator(), workId); + ASMJIT_PROPAGATE(consecutiveParentReg->addImmediateConsecutive(allocator(), workId)); } } @@ -872,6 +900,10 @@ ASMJIT_FAVOR_SPEED Error BaseRAPass::buildLiveness() noexcept { // Calculate IN/OUT of Each Block // ------------------------------ +#ifndef ASMJIT_NO_LOGGING + uint32_t numVisits = numReachableBlocks; +#endif + { ZoneStack workList; ZoneBitVector workBits; @@ -902,7 +934,9 @@ ASMJIT_FAVOR_SPEED Error BaseRAPass::buildLiveness() noexcept { } } } +#ifndef ASMJIT_NO_LOGGING numVisits++; +#endif } workList.reset(); @@ -1146,7 +1180,7 @@ ASMJIT_FAVOR_SPEED Error BaseRAPass::initGlobalLiveSpans() noexcept { return DebugUtils::errored(kErrorOutOfMemory); for (size_t physId = 0; physId < physCount; physId++) - new(&liveSpans[physId]) LiveRegSpans(); + new(Support::PlacementNew{&liveSpans[physId]}) LiveRegSpans(); } _globalLiveSpans[group] = liveSpans; @@ -1189,6 +1223,7 @@ ASMJIT_FAVOR_SPEED Error BaseRAPass::binPack(RegGroup group) noexcept { uint32_t numWorkRegs = workRegs.size(); RegMask availableRegs = _availableRegs[group]; + RegMask preservedRegs = func()->frame().preservedRegs(group); // First try to pack everything that provides register-id hint as these are most likely function arguments and fixed // (precolored) virtual registers. @@ -1320,18 +1355,30 @@ ASMJIT_FAVOR_SPEED Error BaseRAPass::binPack(RegGroup group) noexcept { if (workReg->isAllocated()) continue; - RegMask physRegs = availableRegs; - if (physRegs & workReg->preferredMask()) - physRegs &= workReg->preferredMask(); + RegMask remainingPhysRegs = availableRegs; + if (remainingPhysRegs & workReg->preferredMask()) + remainingPhysRegs &= workReg->preferredMask(); - while (physRegs) { - RegMask preferredMask = physRegs; - uint32_t physId = Support::ctz(preferredMask); + RegMask physRegs = remainingPhysRegs & ~preservedRegs; + remainingPhysRegs &= preservedRegs; + + for (;;) { + if (!physRegs) { + if (!remainingPhysRegs) + break; + physRegs = remainingPhysRegs; + remainingPhysRegs = 0; + } + + uint32_t physId = Support::ctz(physRegs); if (workReg->clobberSurvivalMask()) { - preferredMask &= workReg->clobberSurvivalMask(); - if (preferredMask) + RegMask preferredMask = (physRegs | remainingPhysRegs) & workReg->clobberSurvivalMask(); + if (preferredMask) { + if (preferredMask & ~remainingPhysRegs) + preferredMask &= ~remainingPhysRegs; physId = Support::ctz(preferredMask); + } } LiveRegSpans& live = _globalLiveSpans[group][physId]; @@ -1347,7 +1394,8 @@ ASMJIT_FAVOR_SPEED Error BaseRAPass::binPack(RegGroup group) noexcept { if (ASMJIT_UNLIKELY(err != 0xFFFFFFFFu)) return err; - physRegs ^= Support::bitMask(physId); + physRegs &= ~Support::bitMask(physId); + remainingPhysRegs &= ~Support::bitMask(physId); } // Keep it in `workRegs` if it was not allocated. @@ -1806,6 +1854,50 @@ Error BaseRAPass::rewrite() noexcept { return _rewrite(_func, _stop); } +// [[pure virtual]] +Error BaseRAPass::_rewrite(BaseNode* first, BaseNode* stop) noexcept { + DebugUtils::unused(first, stop); + return DebugUtils::errored(kErrorInvalidState); +} + +// BaseRAPass - Emit +// ================= + +// [[pure virtual]] +Error BaseRAPass::emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept { + DebugUtils::unused(workId, dstPhysId, srcPhysId); + return DebugUtils::errored(kErrorInvalidState); +} + +// [[pure virtual]] +Error BaseRAPass::emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept { + DebugUtils::unused(aWorkId, aPhysId, bWorkId, bPhysId); + return DebugUtils::errored(kErrorInvalidState); +} + +// [[pure virtual]] +Error BaseRAPass::emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept { + DebugUtils::unused(workId, dstPhysId); + return DebugUtils::errored(kErrorInvalidState); +} + +// [[pure virtual]] +Error BaseRAPass::emitSave(uint32_t workId, uint32_t srcPhysId) noexcept { + DebugUtils::unused(workId, srcPhysId); + return DebugUtils::errored(kErrorInvalidState); +} + +// [[pure virtual]] +Error BaseRAPass::emitJump(const Label& label) noexcept { + DebugUtils::unused(label); + return DebugUtils::errored(kErrorInvalidState); +} + +Error BaseRAPass::emitPreCall(InvokeNode* invokeNode) noexcept { + DebugUtils::unused(invokeNode); + return DebugUtils::errored(kErrorOk); +} + // BaseRAPass - Logging // ==================== diff --git a/3rdparty/asmjit/src/asmjit/core/rapass_p.h b/3rdparty/asmjit/src/asmjit/core/rapass_p.h index 94738293667f7..90d4ae49be564 100644 --- a/3rdparty/asmjit/src/asmjit/core/rapass_p.h +++ b/3rdparty/asmjit/src/asmjit/core/rapass_p.h @@ -137,7 +137,7 @@ class RABlock { //! \name Construction & Destruction //! \{ - inline RABlock(BaseRAPass* ra) noexcept + ASMJIT_INLINE_NODEBUG RABlock(BaseRAPass* ra) noexcept : _ra(ra) {} //! \} @@ -145,96 +145,96 @@ class RABlock { //! \name Accessors //! \{ - inline BaseRAPass* pass() const noexcept { return _ra; } - inline ZoneAllocator* allocator() const noexcept; + ASMJIT_INLINE_NODEBUG BaseRAPass* pass() const noexcept { return _ra; } + ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept; - inline uint32_t blockId() const noexcept { return _blockId; } - inline RABlockFlags flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG uint32_t blockId() const noexcept { return _blockId; } + ASMJIT_INLINE_NODEBUG RABlockFlags flags() const noexcept { return _flags; } - inline bool hasFlag(RABlockFlags flag) const noexcept { return Support::test(_flags, flag); } - inline void addFlags(RABlockFlags flags) noexcept { _flags |= flags; } + ASMJIT_INLINE_NODEBUG bool hasFlag(RABlockFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG void addFlags(RABlockFlags flags) noexcept { _flags |= flags; } - inline bool isAssigned() const noexcept { return _blockId != kUnassignedId; } + ASMJIT_INLINE_NODEBUG bool isAssigned() const noexcept { return _blockId != kUnassignedId; } - inline bool isConstructed() const noexcept { return hasFlag(RABlockFlags::kIsConstructed); } - inline bool isReachable() const noexcept { return hasFlag(RABlockFlags::kIsReachable); } - inline bool isTargetable() const noexcept { return hasFlag(RABlockFlags::kIsTargetable); } - inline bool isAllocated() const noexcept { return hasFlag(RABlockFlags::kIsAllocated); } - inline bool isFuncExit() const noexcept { return hasFlag(RABlockFlags::kIsFuncExit); } - inline bool hasTerminator() const noexcept { return hasFlag(RABlockFlags::kHasTerminator); } - inline bool hasConsecutive() const noexcept { return hasFlag(RABlockFlags::kHasConsecutive); } - inline bool hasJumpTable() const noexcept { return hasFlag(RABlockFlags::kHasJumpTable); } + ASMJIT_INLINE_NODEBUG bool isConstructed() const noexcept { return hasFlag(RABlockFlags::kIsConstructed); } + ASMJIT_INLINE_NODEBUG bool isReachable() const noexcept { return hasFlag(RABlockFlags::kIsReachable); } + ASMJIT_INLINE_NODEBUG bool isTargetable() const noexcept { return hasFlag(RABlockFlags::kIsTargetable); } + ASMJIT_INLINE_NODEBUG bool isAllocated() const noexcept { return hasFlag(RABlockFlags::kIsAllocated); } + ASMJIT_INLINE_NODEBUG bool isFuncExit() const noexcept { return hasFlag(RABlockFlags::kIsFuncExit); } + ASMJIT_INLINE_NODEBUG bool hasTerminator() const noexcept { return hasFlag(RABlockFlags::kHasTerminator); } + ASMJIT_INLINE_NODEBUG bool hasConsecutive() const noexcept { return hasFlag(RABlockFlags::kHasConsecutive); } + ASMJIT_INLINE_NODEBUG bool hasJumpTable() const noexcept { return hasFlag(RABlockFlags::kHasJumpTable); } - inline void makeConstructed(const RARegsStats& regStats) noexcept { + ASMJIT_INLINE_NODEBUG void makeConstructed(const RARegsStats& regStats) noexcept { _flags |= RABlockFlags::kIsConstructed; _regsStats.combineWith(regStats); } - inline void makeReachable() noexcept { _flags |= RABlockFlags::kIsReachable; } - inline void makeTargetable() noexcept { _flags |= RABlockFlags::kIsTargetable; } - inline void makeAllocated() noexcept { _flags |= RABlockFlags::kIsAllocated; } + ASMJIT_INLINE_NODEBUG void makeReachable() noexcept { _flags |= RABlockFlags::kIsReachable; } + ASMJIT_INLINE_NODEBUG void makeTargetable() noexcept { _flags |= RABlockFlags::kIsTargetable; } + ASMJIT_INLINE_NODEBUG void makeAllocated() noexcept { _flags |= RABlockFlags::kIsAllocated; } - inline const RARegsStats& regsStats() const noexcept { return _regsStats; } + ASMJIT_INLINE_NODEBUG const RARegsStats& regsStats() const noexcept { return _regsStats; } - inline bool hasPredecessors() const noexcept { return !_predecessors.empty(); } - inline bool hasSuccessors() const noexcept { return !_successors.empty(); } + ASMJIT_INLINE_NODEBUG bool hasPredecessors() const noexcept { return !_predecessors.empty(); } + ASMJIT_INLINE_NODEBUG bool hasSuccessors() const noexcept { return !_successors.empty(); } - inline bool hasSuccessor(RABlock* block) noexcept { + ASMJIT_INLINE_NODEBUG bool hasSuccessor(RABlock* block) noexcept { if (block->_predecessors.size() < _successors.size()) return block->_predecessors.contains(this); else return _successors.contains(block); } - inline const RABlocks& predecessors() const noexcept { return _predecessors; } - inline const RABlocks& successors() const noexcept { return _successors; } + ASMJIT_INLINE_NODEBUG const RABlocks& predecessors() const noexcept { return _predecessors; } + ASMJIT_INLINE_NODEBUG const RABlocks& successors() const noexcept { return _successors; } - inline BaseNode* first() const noexcept { return _first; } - inline BaseNode* last() const noexcept { return _last; } + ASMJIT_INLINE_NODEBUG BaseNode* first() const noexcept { return _first; } + ASMJIT_INLINE_NODEBUG BaseNode* last() const noexcept { return _last; } - inline void setFirst(BaseNode* node) noexcept { _first = node; } - inline void setLast(BaseNode* node) noexcept { _last = node; } + ASMJIT_INLINE_NODEBUG void setFirst(BaseNode* node) noexcept { _first = node; } + ASMJIT_INLINE_NODEBUG void setLast(BaseNode* node) noexcept { _last = node; } - inline uint32_t firstPosition() const noexcept { return _firstPosition; } - inline void setFirstPosition(uint32_t position) noexcept { _firstPosition = position; } + ASMJIT_INLINE_NODEBUG uint32_t firstPosition() const noexcept { return _firstPosition; } + ASMJIT_INLINE_NODEBUG void setFirstPosition(uint32_t position) noexcept { _firstPosition = position; } - inline uint32_t endPosition() const noexcept { return _endPosition; } - inline void setEndPosition(uint32_t position) noexcept { _endPosition = position; } + ASMJIT_INLINE_NODEBUG uint32_t endPosition() const noexcept { return _endPosition; } + ASMJIT_INLINE_NODEBUG void setEndPosition(uint32_t position) noexcept { _endPosition = position; } - inline uint32_t povOrder() const noexcept { return _povOrder; } + ASMJIT_INLINE_NODEBUG uint32_t povOrder() const noexcept { return _povOrder; } - inline RegMask entryScratchGpRegs() const noexcept; - inline RegMask exitScratchGpRegs() const noexcept { return _exitScratchGpRegs; } + ASMJIT_INLINE_NODEBUG RegMask entryScratchGpRegs() const noexcept; + ASMJIT_INLINE_NODEBUG RegMask exitScratchGpRegs() const noexcept { return _exitScratchGpRegs; } - inline void addEntryScratchGpRegs(RegMask regMask) noexcept { _entryScratchGpRegs |= regMask; } - inline void addExitScratchGpRegs(RegMask regMask) noexcept { _exitScratchGpRegs |= regMask; } + ASMJIT_INLINE_NODEBUG void addEntryScratchGpRegs(RegMask regMask) noexcept { _entryScratchGpRegs |= regMask; } + ASMJIT_INLINE_NODEBUG void addExitScratchGpRegs(RegMask regMask) noexcept { _exitScratchGpRegs |= regMask; } - inline bool hasSharedAssignmentId() const noexcept { return _sharedAssignmentId != Globals::kInvalidId; } - inline uint32_t sharedAssignmentId() const noexcept { return _sharedAssignmentId; } - inline void setSharedAssignmentId(uint32_t id) noexcept { _sharedAssignmentId = id; } + ASMJIT_INLINE_NODEBUG bool hasSharedAssignmentId() const noexcept { return _sharedAssignmentId != Globals::kInvalidId; } + ASMJIT_INLINE_NODEBUG uint32_t sharedAssignmentId() const noexcept { return _sharedAssignmentId; } + ASMJIT_INLINE_NODEBUG void setSharedAssignmentId(uint32_t id) noexcept { _sharedAssignmentId = id; } - inline uint64_t timestamp() const noexcept { return _timestamp; } - inline bool hasTimestamp(uint64_t ts) const noexcept { return _timestamp == ts; } - inline void setTimestamp(uint64_t ts) const noexcept { _timestamp = ts; } - inline void resetTimestamp() const noexcept { _timestamp = 0; } + ASMJIT_INLINE_NODEBUG uint64_t timestamp() const noexcept { return _timestamp; } + ASMJIT_INLINE_NODEBUG bool hasTimestamp(uint64_t ts) const noexcept { return _timestamp == ts; } + ASMJIT_INLINE_NODEBUG void setTimestamp(uint64_t ts) const noexcept { _timestamp = ts; } + ASMJIT_INLINE_NODEBUG void resetTimestamp() const noexcept { _timestamp = 0; } - inline RABlock* consecutive() const noexcept { return hasConsecutive() ? _successors[0] : nullptr; } + ASMJIT_INLINE_NODEBUG RABlock* consecutive() const noexcept { return hasConsecutive() ? _successors[0] : nullptr; } - inline RABlock* iDom() noexcept { return _idom; } - inline const RABlock* iDom() const noexcept { return _idom; } - inline void setIDom(RABlock* block) noexcept { _idom = block; } + ASMJIT_INLINE_NODEBUG RABlock* iDom() noexcept { return _idom; } + ASMJIT_INLINE_NODEBUG const RABlock* iDom() const noexcept { return _idom; } + ASMJIT_INLINE_NODEBUG void setIDom(RABlock* block) noexcept { _idom = block; } - inline ZoneBitVector& liveIn() noexcept { return _liveBits[kLiveIn]; } - inline const ZoneBitVector& liveIn() const noexcept { return _liveBits[kLiveIn]; } + ASMJIT_INLINE_NODEBUG ZoneBitVector& liveIn() noexcept { return _liveBits[kLiveIn]; } + ASMJIT_INLINE_NODEBUG const ZoneBitVector& liveIn() const noexcept { return _liveBits[kLiveIn]; } - inline ZoneBitVector& liveOut() noexcept { return _liveBits[kLiveOut]; } - inline const ZoneBitVector& liveOut() const noexcept { return _liveBits[kLiveOut]; } + ASMJIT_INLINE_NODEBUG ZoneBitVector& liveOut() noexcept { return _liveBits[kLiveOut]; } + ASMJIT_INLINE_NODEBUG const ZoneBitVector& liveOut() const noexcept { return _liveBits[kLiveOut]; } - inline ZoneBitVector& gen() noexcept { return _liveBits[kLiveGen]; } - inline const ZoneBitVector& gen() const noexcept { return _liveBits[kLiveGen]; } + ASMJIT_INLINE_NODEBUG ZoneBitVector& gen() noexcept { return _liveBits[kLiveGen]; } + ASMJIT_INLINE_NODEBUG const ZoneBitVector& gen() const noexcept { return _liveBits[kLiveGen]; } - inline ZoneBitVector& kill() noexcept { return _liveBits[kLiveKill]; } - inline const ZoneBitVector& kill() const noexcept { return _liveBits[kLiveKill]; } + ASMJIT_INLINE_NODEBUG ZoneBitVector& kill() noexcept { return _liveBits[kLiveKill]; } + ASMJIT_INLINE_NODEBUG const ZoneBitVector& kill() const noexcept { return _liveBits[kLiveKill]; } inline Error resizeLiveBits(uint32_t size) noexcept { ASMJIT_PROPAGATE(_liveBits[kLiveIn ].resize(allocator(), size)); @@ -244,9 +244,9 @@ class RABlock { return kErrorOk; } - inline bool hasEntryAssignment() const noexcept { return _entryPhysToWorkMap != nullptr; } - inline PhysToWorkMap* entryPhysToWorkMap() const noexcept { return _entryPhysToWorkMap; } - inline void setEntryAssignment(PhysToWorkMap* physToWorkMap) noexcept { _entryPhysToWorkMap = physToWorkMap; } + ASMJIT_INLINE_NODEBUG bool hasEntryAssignment() const noexcept { return _entryPhysToWorkMap != nullptr; } + ASMJIT_INLINE_NODEBUG PhysToWorkMap* entryPhysToWorkMap() const noexcept { return _entryPhysToWorkMap; } + ASMJIT_INLINE_NODEBUG void setEntryAssignment(PhysToWorkMap* physToWorkMap) noexcept { _entryPhysToWorkMap = physToWorkMap; } //! \} @@ -318,38 +318,38 @@ class RAInst { //! \{ //! Returns instruction RW flags. - inline InstRWFlags instRWFlags() const noexcept { return _instRWFlags; }; + ASMJIT_INLINE_NODEBUG InstRWFlags instRWFlags() const noexcept { return _instRWFlags; }; //! Tests whether the given `flag` is present in instruction RW flags. - inline bool hasInstRWFlag(InstRWFlags flag) const noexcept { return Support::test(_instRWFlags, flag); } + ASMJIT_INLINE_NODEBUG bool hasInstRWFlag(InstRWFlags flag) const noexcept { return Support::test(_instRWFlags, flag); } //! Adds `flags` to instruction RW flags. - inline void addInstRWFlags(InstRWFlags flags) noexcept { _instRWFlags |= flags; } + ASMJIT_INLINE_NODEBUG void addInstRWFlags(InstRWFlags flags) noexcept { _instRWFlags |= flags; } //! Returns the instruction flags. - inline RATiedFlags flags() const noexcept { return _flags; } + ASMJIT_INLINE_NODEBUG RATiedFlags flags() const noexcept { return _flags; } //! Tests whether the instruction has flag `flag`. - inline bool hasFlag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); } //! Replaces the existing instruction flags with `flags`. - inline void setFlags(RATiedFlags flags) noexcept { _flags = flags; } + ASMJIT_INLINE_NODEBUG void setFlags(RATiedFlags flags) noexcept { _flags = flags; } //! Adds instruction `flags` to this RAInst. - inline void addFlags(RATiedFlags flags) noexcept { _flags |= flags; } + ASMJIT_INLINE_NODEBUG void addFlags(RATiedFlags flags) noexcept { _flags |= flags; } //! Clears instruction `flags` from this RAInst. - inline void clearFlags(RATiedFlags flags) noexcept { _flags &= ~flags; } + ASMJIT_INLINE_NODEBUG void clearFlags(RATiedFlags flags) noexcept { _flags &= ~flags; } //! Tests whether this instruction can be transformed to another instruction if necessary. - inline bool isTransformable() const noexcept { return hasFlag(RATiedFlags::kInst_IsTransformable); } + ASMJIT_INLINE_NODEBUG bool isTransformable() const noexcept { return hasFlag(RATiedFlags::kInst_IsTransformable); } //! Returns the associated block with this RAInst. - inline RABlock* block() const noexcept { return _block; } + ASMJIT_INLINE_NODEBUG RABlock* block() const noexcept { return _block; } //! Returns tied registers (all). - inline RATiedReg* tiedRegs() const noexcept { return const_cast(_tiedRegs); } + ASMJIT_INLINE_NODEBUG RATiedReg* tiedRegs() const noexcept { return const_cast(_tiedRegs); } //! Returns tied registers for a given `group`. - inline RATiedReg* tiedRegs(RegGroup group) const noexcept { return const_cast(_tiedRegs) + _tiedIndex.get(group); } + ASMJIT_INLINE_NODEBUG RATiedReg* tiedRegs(RegGroup group) const noexcept { return const_cast(_tiedRegs) + _tiedIndex.get(group); } //! Returns count of all tied registers. - inline uint32_t tiedCount() const noexcept { return _tiedTotal; } + ASMJIT_INLINE_NODEBUG uint32_t tiedCount() const noexcept { return _tiedTotal; } //! Returns count of tied registers of a given `group`. - inline uint32_t tiedCount(RegGroup group) const noexcept { return _tiedCount[group]; } + ASMJIT_INLINE_NODEBUG uint32_t tiedCount(RegGroup group) const noexcept { return _tiedCount[group]; } //! Returns `RATiedReg` at the given `index`. inline RATiedReg* tiedAt(uint32_t index) const noexcept { @@ -371,7 +371,7 @@ class RAInst { //! \name Static Functions //! \{ - static inline size_t sizeOf(uint32_t tiedRegCount) noexcept { + static ASMJIT_INLINE_NODEBUG size_t sizeOf(uint32_t tiedRegCount) noexcept { return sizeof(RAInst) - sizeof(RATiedReg) + tiedRegCount * sizeof(RATiedReg); } @@ -409,10 +409,10 @@ class RAInstBuilder { //! \name Construction & Destruction //! \{ - inline RAInstBuilder() noexcept { reset(); } + ASMJIT_INLINE_NODEBUG RAInstBuilder() noexcept { reset(); } - inline void init() noexcept { reset(); } - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void init() noexcept { reset(); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { _instRWFlags = InstRWFlags::kNone; _aggregatedFlags = RATiedFlags::kNone; _forbiddenFlags = RATiedFlags::kNone; @@ -428,25 +428,25 @@ class RAInstBuilder { //! \name Accessors //! \{ - inline InstRWFlags instRWFlags() const noexcept { return _instRWFlags; } - inline bool hasInstRWFlag(InstRWFlags flag) const noexcept { return Support::test(_instRWFlags, flag); } - inline void addInstRWFlags(InstRWFlags flags) noexcept { _instRWFlags |= flags; } - inline void clearInstRWFlags(InstRWFlags flags) noexcept { _instRWFlags &= ~flags; } + ASMJIT_INLINE_NODEBUG InstRWFlags instRWFlags() const noexcept { return _instRWFlags; } + ASMJIT_INLINE_NODEBUG bool hasInstRWFlag(InstRWFlags flag) const noexcept { return Support::test(_instRWFlags, flag); } + ASMJIT_INLINE_NODEBUG void addInstRWFlags(InstRWFlags flags) noexcept { _instRWFlags |= flags; } + ASMJIT_INLINE_NODEBUG void clearInstRWFlags(InstRWFlags flags) noexcept { _instRWFlags &= ~flags; } - inline RATiedFlags aggregatedFlags() const noexcept { return _aggregatedFlags; } - inline void addAggregatedFlags(RATiedFlags flags) noexcept { _aggregatedFlags |= flags; } + ASMJIT_INLINE_NODEBUG RATiedFlags aggregatedFlags() const noexcept { return _aggregatedFlags; } + ASMJIT_INLINE_NODEBUG void addAggregatedFlags(RATiedFlags flags) noexcept { _aggregatedFlags |= flags; } - inline RATiedFlags forbiddenFlags() const noexcept { return _forbiddenFlags; } - inline void addForbiddenFlags(RATiedFlags flags) noexcept { _forbiddenFlags |= flags; } + ASMJIT_INLINE_NODEBUG RATiedFlags forbiddenFlags() const noexcept { return _forbiddenFlags; } + ASMJIT_INLINE_NODEBUG void addForbiddenFlags(RATiedFlags flags) noexcept { _forbiddenFlags |= flags; } //! Returns the number of tied registers added to the builder. - inline uint32_t tiedRegCount() const noexcept { return uint32_t((size_t)(_cur - _tiedRegs)); } + ASMJIT_INLINE_NODEBUG uint32_t tiedRegCount() const noexcept { return uint32_t((size_t)(_cur - _tiedRegs)); } - inline RATiedReg* begin() noexcept { return _tiedRegs; } - inline RATiedReg* end() noexcept { return _cur; } + ASMJIT_INLINE_NODEBUG RATiedReg* begin() noexcept { return _tiedRegs; } + ASMJIT_INLINE_NODEBUG RATiedReg* end() noexcept { return _cur; } - inline const RATiedReg* begin() const noexcept { return _tiedRegs; } - inline const RATiedReg* end() const noexcept { return _cur; } + ASMJIT_INLINE_NODEBUG const RATiedReg* begin() const noexcept { return _tiedRegs; } + ASMJIT_INLINE_NODEBUG const RATiedReg* end() const noexcept { return _cur; } //! Returns `RATiedReg` at the given `index`. inline RATiedReg* operator[](uint32_t index) noexcept { @@ -634,15 +634,15 @@ class RASharedAssignment { //! \name Accessors //! \{ - inline bool empty() const noexcept { return _physToWorkMap == nullptr; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _physToWorkMap == nullptr; } - inline RegMask entryScratchGpRegs() const noexcept { return _entryScratchGpRegs; } - inline void addEntryScratchGpRegs(RegMask mask) noexcept { _entryScratchGpRegs |= mask; } + ASMJIT_INLINE_NODEBUG RegMask entryScratchGpRegs() const noexcept { return _entryScratchGpRegs; } + ASMJIT_INLINE_NODEBUG void addEntryScratchGpRegs(RegMask mask) noexcept { _entryScratchGpRegs |= mask; } - inline const ZoneBitVector& liveIn() const noexcept { return _liveIn; } + ASMJIT_INLINE_NODEBUG const ZoneBitVector& liveIn() const noexcept { return _liveIn; } - inline PhysToWorkMap* physToWorkMap() const noexcept { return _physToWorkMap; } - inline void assignPhysToWorkMap(PhysToWorkMap* physToWorkMap) noexcept { _physToWorkMap = physToWorkMap; } + ASMJIT_INLINE_NODEBUG PhysToWorkMap* physToWorkMap() const noexcept { return _physToWorkMap; } + ASMJIT_INLINE_NODEBUG void assignPhysToWorkMap(PhysToWorkMap* physToWorkMap) noexcept { _physToWorkMap = physToWorkMap; } //! \} }; @@ -754,7 +754,7 @@ class BaseRAPass : public FuncPass { //! \{ BaseRAPass() noexcept; - virtual ~BaseRAPass() noexcept; + ~BaseRAPass() noexcept override; //! \} @@ -762,38 +762,38 @@ class BaseRAPass : public FuncPass { //! \{ //! Returns \ref Logger passed to \ref runOnFunction(). - inline Logger* logger() const noexcept { return _logger; } + ASMJIT_INLINE_NODEBUG Logger* logger() const noexcept { return _logger; } //! Returns either a valid logger if the given `option` is set and logging is enabled, or nullptr. - inline Logger* getLoggerIf(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option) ? _logger : nullptr; } + ASMJIT_INLINE_NODEBUG Logger* getLoggerIf(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option) ? _logger : nullptr; } //! Returns whether the diagnostic `option` is enabled. //! //! \note Returns false if there is no logger (as diagnostics without logging make no sense). - inline bool hasDiagnosticOption(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option); } + ASMJIT_INLINE_NODEBUG bool hasDiagnosticOption(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option); } //! Returns \ref Zone passed to \ref runOnFunction(). - inline Zone* zone() const noexcept { return _allocator.zone(); } + ASMJIT_INLINE_NODEBUG Zone* zone() const noexcept { return _allocator.zone(); } //! Returns \ref ZoneAllocator used by the register allocator. - inline ZoneAllocator* allocator() const noexcept { return const_cast(&_allocator); } + ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept { return const_cast(&_allocator); } - inline const ZoneVector& sharedAssignments() const { return _sharedAssignments; } - inline uint32_t sharedAssignmentCount() const noexcept { return _sharedAssignments.size(); } + ASMJIT_INLINE_NODEBUG const ZoneVector& sharedAssignments() const { return _sharedAssignments; } + ASMJIT_INLINE_NODEBUG uint32_t sharedAssignmentCount() const noexcept { return _sharedAssignments.size(); } //! Returns the current function node. - inline FuncNode* func() const noexcept { return _func; } + ASMJIT_INLINE_NODEBUG FuncNode* func() const noexcept { return _func; } //! Returns the stop of the current function. - inline BaseNode* stop() const noexcept { return _stop; } + ASMJIT_INLINE_NODEBUG BaseNode* stop() const noexcept { return _stop; } //! Returns an extra block used by the current function being processed. - inline BaseNode* extraBlock() const noexcept { return _extraBlock; } + ASMJIT_INLINE_NODEBUG BaseNode* extraBlock() const noexcept { return _extraBlock; } //! Sets an extra block, see `extraBlock()`. - inline void setExtraBlock(BaseNode* node) noexcept { _extraBlock = node; } + ASMJIT_INLINE_NODEBUG void setExtraBlock(BaseNode* node) noexcept { _extraBlock = node; } - inline uint32_t endPosition() const noexcept { return _instructionCount * 2; } + ASMJIT_INLINE_NODEBUG uint32_t endPosition() const noexcept { return _instructionCount * 2; } - inline const RARegMask& availableRegs() const noexcept { return _availableRegs; } - inline const RARegMask& cloberredRegs() const noexcept { return _clobberedRegs; } + ASMJIT_INLINE_NODEBUG const RARegMask& availableRegs() const noexcept { return _availableRegs; } + ASMJIT_INLINE_NODEBUG const RARegMask& clobberedRegs() const noexcept { return _clobberedRegs; } //! \} @@ -818,11 +818,11 @@ class BaseRAPass : public FuncPass { //! Called by \ref runOnFunction() before the register allocation to initialize //! architecture-specific data and constraints. - virtual void onInit() noexcept = 0; + virtual void onInit() noexcept; //! Called by \ref runOnFunction(` after register allocation to clean everything //! up. Called even if the register allocation failed. - virtual void onDone() noexcept = 0; + virtual void onDone() noexcept; //! \} @@ -842,26 +842,26 @@ class BaseRAPass : public FuncPass { } //! Returns all basic blocks of this function. - inline RABlocks& blocks() noexcept { return _blocks; } + ASMJIT_INLINE_NODEBUG RABlocks& blocks() noexcept { return _blocks; } //! \overload - inline const RABlocks& blocks() const noexcept { return _blocks; } + ASMJIT_INLINE_NODEBUG const RABlocks& blocks() const noexcept { return _blocks; } //! Returns the count of basic blocks (returns size of `_blocks` array). - inline uint32_t blockCount() const noexcept { return _blocks.size(); } + ASMJIT_INLINE_NODEBUG uint32_t blockCount() const noexcept { return _blocks.size(); } //! Returns the count of reachable basic blocks (returns size of `_pov` array). - inline uint32_t reachableBlockCount() const noexcept { return _pov.size(); } + ASMJIT_INLINE_NODEBUG uint32_t reachableBlockCount() const noexcept { return _pov.size(); } //! Tests whether the CFG has dangling blocks - these were created by `newBlock()`, but not added to CFG through //! `addBlocks()`. If `true` is returned and the CFG is constructed it means that something is missing and it's //! incomplete. //! //! \note This is only used to check if the number of created blocks matches the number of added blocks. - inline bool hasDanglingBlocks() const noexcept { return _createdBlockCount != blockCount(); } + ASMJIT_INLINE_NODEBUG bool hasDanglingBlocks() const noexcept { return _createdBlockCount != blockCount(); } //! Gest a next timestamp to be used to mark CFG blocks. - inline uint64_t nextTimestamp() const noexcept { return ++_lastTimestamp; } + ASMJIT_INLINE_NODEBUG uint64_t nextTimestamp() const noexcept { return ++_lastTimestamp; } - //! Createss a new `RABlock` instance. + //! Creates a new `RABlock` instance. //! //! \note New blocks don't have ID assigned until they are added to the block array by calling `addBlock()`. RABlock* newBlock(BaseNode* initialNode = nullptr) noexcept; @@ -882,7 +882,7 @@ class BaseRAPass : public FuncPass { void* p = zone()->alloc(RAInst::sizeOf(tiedRegCount)); if (ASMJIT_UNLIKELY(!p)) return nullptr; - return new(p) RAInst(block, instRWFlags, flags, tiedRegCount, clobberedRegs); + return new(Support::PlacementNew{p}) RAInst(block, instRWFlags, flags, tiedRegCount, clobberedRegs); } ASMJIT_FORCE_INLINE Error assignRAInst(BaseNode* node, RABlock* block, RAInstBuilder& ib) noexcept { @@ -945,7 +945,7 @@ class BaseRAPass : public FuncPass { //! analysis and register allocation. //! //! Use `RACFGBuilderT` template that provides the necessary boilerplate. - virtual Error buildCFG() noexcept = 0; + virtual Error buildCFG() noexcept; //! Called after the CFG is built. Error initSharedAssignments(const ZoneVector& sharedAssignmentsMap) noexcept; @@ -974,14 +974,14 @@ class BaseRAPass : public FuncPass { const RABlock* _nearestCommonDominator(const RABlock* a, const RABlock* b) const noexcept; //! Tests whether the basic block `a` dominates `b` - non-strict, returns true when `a == b`. - inline bool dominates(const RABlock* a, const RABlock* b) const noexcept { return a == b ? true : _strictlyDominates(a, b); } + ASMJIT_INLINE_NODEBUG bool dominates(const RABlock* a, const RABlock* b) const noexcept { return a == b ? true : _strictlyDominates(a, b); } //! Tests whether the basic block `a` dominates `b` - strict dominance check, returns false when `a == b`. - inline bool strictlyDominates(const RABlock* a, const RABlock* b) const noexcept { return a == b ? false : _strictlyDominates(a, b); } + ASMJIT_INLINE_NODEBUG bool strictlyDominates(const RABlock* a, const RABlock* b) const noexcept { return a == b ? false : _strictlyDominates(a, b); } //! Returns a nearest common dominator of `a` and `b`. - inline RABlock* nearestCommonDominator(RABlock* a, RABlock* b) const noexcept { return const_cast(_nearestCommonDominator(a, b)); } + ASMJIT_INLINE_NODEBUG RABlock* nearestCommonDominator(RABlock* a, RABlock* b) const noexcept { return const_cast(_nearestCommonDominator(a, b)); } //! Returns a nearest common dominator of `a` and `b` (const). - inline const RABlock* nearestCommonDominator(const RABlock* a, const RABlock* b) const noexcept { return _nearestCommonDominator(a, b); } + ASMJIT_INLINE_NODEBUG const RABlock* nearestCommonDominator(const RABlock* a, const RABlock* b) const noexcept { return _nearestCommonDominator(a, b); } //! \} @@ -1005,27 +1005,27 @@ class BaseRAPass : public FuncPass { //! \{ //! Returns a native size of the general-purpose register of the target architecture. - inline uint32_t registerSize() const noexcept { return _sp.size(); } - inline uint32_t availableRegCount(RegGroup group) const noexcept { return _availableRegCount[group]; } + ASMJIT_INLINE_NODEBUG uint32_t registerSize() const noexcept { return _sp.size(); } + ASMJIT_INLINE_NODEBUG uint32_t availableRegCount(RegGroup group) const noexcept { return _availableRegCount[group]; } - inline RAWorkReg* workRegById(uint32_t workId) const noexcept { return _workRegs[workId]; } + ASMJIT_INLINE_NODEBUG RAWorkReg* workRegById(uint32_t workId) const noexcept { return _workRegs[workId]; } - inline RAWorkRegs& workRegs() noexcept { return _workRegs; } - inline RAWorkRegs& workRegs(RegGroup group) noexcept { return _workRegsOfGroup[group]; } + ASMJIT_INLINE_NODEBUG RAWorkRegs& workRegs() noexcept { return _workRegs; } + ASMJIT_INLINE_NODEBUG RAWorkRegs& workRegs(RegGroup group) noexcept { return _workRegsOfGroup[group]; } - inline const RAWorkRegs& workRegs() const noexcept { return _workRegs; } - inline const RAWorkRegs& workRegs(RegGroup group) const noexcept { return _workRegsOfGroup[group]; } + ASMJIT_INLINE_NODEBUG const RAWorkRegs& workRegs() const noexcept { return _workRegs; } + ASMJIT_INLINE_NODEBUG const RAWorkRegs& workRegs(RegGroup group) const noexcept { return _workRegsOfGroup[group]; } - inline uint32_t workRegCount() const noexcept { return _workRegs.size(); } - inline uint32_t workRegCount(RegGroup group) const noexcept { return _workRegsOfGroup[group].size(); } + ASMJIT_INLINE_NODEBUG uint32_t workRegCount() const noexcept { return _workRegs.size(); } + ASMJIT_INLINE_NODEBUG uint32_t workRegCount(RegGroup group) const noexcept { return _workRegsOfGroup[group].size(); } inline void _buildPhysIndex() noexcept { _physRegIndex.buildIndexes(_physRegCount); _physRegTotal = uint32_t(_physRegIndex[RegGroup::kMaxVirt]) + uint32_t(_physRegCount[RegGroup::kMaxVirt]) ; } - inline uint32_t physRegIndex(RegGroup group) const noexcept { return _physRegIndex[group]; } - inline uint32_t physRegTotal() const noexcept { return _physRegTotal; } + ASMJIT_INLINE_NODEBUG uint32_t physRegIndex(RegGroup group) const noexcept { return _physRegIndex[group]; } + ASMJIT_INLINE_NODEBUG uint32_t physRegTotal() const noexcept { return _physRegTotal; } Error _asWorkReg(VirtReg* vReg, RAWorkReg** out) noexcept; @@ -1133,7 +1133,7 @@ class BaseRAPass : public FuncPass { //! \{ Error rewrite() noexcept; - virtual Error _rewrite(BaseNode* first, BaseNode* stop) noexcept = 0; + virtual Error _rewrite(BaseNode* first, BaseNode* stop) noexcept; //! \} @@ -1153,14 +1153,14 @@ class BaseRAPass : public FuncPass { //! \name Emit //! \{ - virtual Error emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept = 0; - virtual Error emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept = 0; + virtual Error emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept; + virtual Error emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept; - virtual Error emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept = 0; - virtual Error emitSave(uint32_t workId, uint32_t srcPhysId) noexcept = 0; + virtual Error emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept; + virtual Error emitSave(uint32_t workId, uint32_t srcPhysId) noexcept; - virtual Error emitJump(const Label& label) noexcept = 0; - virtual Error emitPreCall(InvokeNode* invokeNode) noexcept = 0; + virtual Error emitJump(const Label& label) noexcept; + virtual Error emitPreCall(InvokeNode* invokeNode) noexcept; //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/rastack.cpp b/3rdparty/asmjit/src/asmjit/core/rastack.cpp index 2b7ed592df5ec..318fbded4b37b 100644 --- a/3rdparty/asmjit/src/asmjit/core/rastack.cpp +++ b/3rdparty/asmjit/src/asmjit/core/rastack.cpp @@ -62,7 +62,7 @@ Error RAStackAllocator::calculateStackFrame() noexcept { // STEP 1: // - // Update usage based on the size of the slot. We boost smaller slots in a way that 32-bit register has higher + // Update usage based on the size of the slot. We boost smaller slots in a way that 32-bit register has a higher // priority than a 128-bit register, however, if one 128-bit register is used 4 times more than some other 32-bit // register it will overweight it. for (RAStackSlot* slot : _slots) { diff --git a/3rdparty/asmjit/src/asmjit/core/rastack_p.h b/3rdparty/asmjit/src/asmjit/core/rastack_p.h index 90640b4dea897..15db8e97948f8 100644 --- a/3rdparty/asmjit/src/asmjit/core/rastack_p.h +++ b/3rdparty/asmjit/src/asmjit/core/rastack_p.h @@ -104,13 +104,13 @@ class RAStackAllocator { //! \{ //! Allocator used to allocate internal data. - ZoneAllocator* _allocator; + ZoneAllocator* _allocator {}; //! Count of bytes used by all slots. - uint32_t _bytesUsed; + uint32_t _bytesUsed {}; //! Calculated stack size (can be a bit greater than `_bytesUsed`). - uint32_t _stackSize; + uint32_t _stackSize {}; //! Minimum stack alignment. - uint32_t _alignment; + uint32_t _alignment = 1; //! Stack slots vector. RAStackSlots _slots; @@ -119,14 +119,9 @@ class RAStackAllocator { //! \name Construction & Destruction //! \{ - inline RAStackAllocator() noexcept - : _allocator(nullptr), - _bytesUsed(0), - _stackSize(0), - _alignment(1), - _slots() {} + ASMJIT_INLINE_NODEBUG RAStackAllocator() noexcept {} - inline void reset(ZoneAllocator* allocator) noexcept { + ASMJIT_INLINE_NODEBUG void reset(ZoneAllocator* allocator) noexcept { _allocator = allocator; _bytesUsed = 0; _stackSize = 0; @@ -139,15 +134,15 @@ class RAStackAllocator { //! \name Accessors //! \{ - inline ZoneAllocator* allocator() const noexcept { return _allocator; } + ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept { return _allocator; } - inline uint32_t bytesUsed() const noexcept { return _bytesUsed; } - inline uint32_t stackSize() const noexcept { return _stackSize; } - inline uint32_t alignment() const noexcept { return _alignment; } + ASMJIT_INLINE_NODEBUG uint32_t bytesUsed() const noexcept { return _bytesUsed; } + ASMJIT_INLINE_NODEBUG uint32_t stackSize() const noexcept { return _stackSize; } + ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; } - inline RAStackSlots& slots() noexcept { return _slots; } - inline const RAStackSlots& slots() const noexcept { return _slots; } - inline uint32_t slotCount() const noexcept { return _slots.size(); } + ASMJIT_INLINE_NODEBUG RAStackSlots& slots() noexcept { return _slots; } + ASMJIT_INLINE_NODEBUG const RAStackSlots& slots() const noexcept { return _slots; } + ASMJIT_INLINE_NODEBUG uint32_t slotCount() const noexcept { return _slots.size(); } //! \} diff --git a/3rdparty/asmjit/src/asmjit/core/string.cpp b/3rdparty/asmjit/src/asmjit/core/string.cpp index 83dc6efdaac44..123e861983c0d 100644 --- a/3rdparty/asmjit/src/asmjit/core/string.cpp +++ b/3rdparty/asmjit/src/asmjit/core/string.cpp @@ -463,7 +463,7 @@ Error String::truncate(size_t newSize) noexcept { return kErrorOk; } -bool String::eq(const char* other, size_t size) const noexcept { +bool String::equals(const char* other, size_t size) const noexcept { const char* aData = data(); const char* bData = other; @@ -491,68 +491,68 @@ bool String::eq(const char* other, size_t size) const noexcept { UNIT(core_string) { String s; - EXPECT(s.isLargeOrExternal() == false); - EXPECT(s.isExternal() == false); - - EXPECT(s.assign('a') == kErrorOk); - EXPECT(s.size() == 1); - EXPECT(s.capacity() == String::kSSOCapacity); - EXPECT(s.data()[0] == 'a'); - EXPECT(s.data()[1] == '\0'); - EXPECT(s.eq("a") == true); - EXPECT(s.eq("a", 1) == true); - - EXPECT(s.assignChars('b', 4) == kErrorOk); - EXPECT(s.size() == 4); - EXPECT(s.capacity() == String::kSSOCapacity); - EXPECT(s.data()[0] == 'b'); - EXPECT(s.data()[1] == 'b'); - EXPECT(s.data()[2] == 'b'); - EXPECT(s.data()[3] == 'b'); - EXPECT(s.data()[4] == '\0'); - EXPECT(s.eq("bbbb") == true); - EXPECT(s.eq("bbbb", 4) == true); - - EXPECT(s.assign("abc") == kErrorOk); - EXPECT(s.size() == 3); - EXPECT(s.capacity() == String::kSSOCapacity); - EXPECT(s.data()[0] == 'a'); - EXPECT(s.data()[1] == 'b'); - EXPECT(s.data()[2] == 'c'); - EXPECT(s.data()[3] == '\0'); - EXPECT(s.eq("abc") == true); - EXPECT(s.eq("abc", 3) == true); + EXPECT_FALSE(s.isLargeOrExternal()); + EXPECT_FALSE(s.isExternal()); + + EXPECT_EQ(s.assign('a'), kErrorOk); + EXPECT_EQ(s.size(), 1u); + EXPECT_EQ(s.capacity(), String::kSSOCapacity); + EXPECT_EQ(s.data()[0], 'a'); + EXPECT_EQ(s.data()[1], '\0'); + EXPECT_TRUE(s.equals("a")); + EXPECT_TRUE(s.equals("a", 1)); + + EXPECT_EQ(s.assignChars('b', 4), kErrorOk); + EXPECT_EQ(s.size(), 4u); + EXPECT_EQ(s.capacity(), String::kSSOCapacity); + EXPECT_EQ(s.data()[0], 'b'); + EXPECT_EQ(s.data()[1], 'b'); + EXPECT_EQ(s.data()[2], 'b'); + EXPECT_EQ(s.data()[3], 'b'); + EXPECT_EQ(s.data()[4], '\0'); + EXPECT_TRUE(s.equals("bbbb")); + EXPECT_TRUE(s.equals("bbbb", 4)); + + EXPECT_EQ(s.assign("abc"), kErrorOk); + EXPECT_EQ(s.size(), 3u); + EXPECT_EQ(s.capacity(), String::kSSOCapacity); + EXPECT_EQ(s.data()[0], 'a'); + EXPECT_EQ(s.data()[1], 'b'); + EXPECT_EQ(s.data()[2], 'c'); + EXPECT_EQ(s.data()[3], '\0'); + EXPECT_TRUE(s.equals("abc")); + EXPECT_TRUE(s.equals("abc", 3)); const char* large = "Large string that will not fit into SSO buffer"; - EXPECT(s.assign(large) == kErrorOk); - EXPECT(s.isLargeOrExternal() == true); - EXPECT(s.size() == strlen(large)); - EXPECT(s.capacity() > String::kSSOCapacity); - EXPECT(s.eq(large) == true); - EXPECT(s.eq(large, strlen(large)) == true); + EXPECT_EQ(s.assign(large), kErrorOk); + EXPECT_TRUE(s.isLargeOrExternal()); + EXPECT_EQ(s.size(), strlen(large)); + EXPECT_GT(s.capacity(), String::kSSOCapacity); + EXPECT_TRUE(s.equals(large)); + EXPECT_TRUE(s.equals(large, strlen(large))); const char* additional = " (additional content)"; - EXPECT(s.isLargeOrExternal() == true); - EXPECT(s.append(additional) == kErrorOk); - EXPECT(s.size() == strlen(large) + strlen(additional)); + EXPECT_TRUE(s.isLargeOrExternal()); + EXPECT_EQ(s.append(additional), kErrorOk); + EXPECT_EQ(s.size(), strlen(large) + strlen(additional)); - EXPECT(s.clear() == kErrorOk); - EXPECT(s.size() == 0); - EXPECT(s.empty() == true); - EXPECT(s.data()[0] == '\0'); - EXPECT(s.isLargeOrExternal() == true); // Clear should never release the memory. + EXPECT_EQ(s.clear(), kErrorOk); + EXPECT_EQ(s.size(), 0u); + EXPECT_TRUE(s.empty()); + EXPECT_EQ(s.data()[0], '\0'); + EXPECT_TRUE(s.isLargeOrExternal()); // Clear should never release the memory. - EXPECT(s.appendUInt(1234) == kErrorOk); - EXPECT(s.eq("1234") == true); + EXPECT_EQ(s.appendUInt(1234), kErrorOk); + EXPECT_TRUE(s.equals("1234")); - EXPECT(s.assignUInt(0xFFFF, 16, 0, StringFormatFlags::kAlternate) == kErrorOk); - EXPECT(s.eq("0xFFFF")); + EXPECT_EQ(s.assignUInt(0xFFFF, 16, 0, StringFormatFlags::kAlternate), kErrorOk); + EXPECT_TRUE(s.equals("0xFFFF")); StringTmp<64> sTmp; - EXPECT(sTmp.isLargeOrExternal()); - EXPECT(sTmp.isExternal()); - EXPECT(sTmp.appendChars(' ', 1000) == kErrorOk); - EXPECT(!sTmp.isExternal()); + EXPECT_TRUE(sTmp.isLargeOrExternal()); + EXPECT_TRUE(sTmp.isExternal()); + EXPECT_EQ(sTmp.appendChars(' ', 1000), kErrorOk); + EXPECT_FALSE(sTmp.isExternal()); } #endif diff --git a/3rdparty/asmjit/src/asmjit/core/string.h b/3rdparty/asmjit/src/asmjit/core/string.h index 2562e66194ad1..c4dee14b00efa 100644 --- a/3rdparty/asmjit/src/asmjit/core/string.h +++ b/3rdparty/asmjit/src/asmjit/core/string.h @@ -53,9 +53,12 @@ union FixedString { //! \name Utilities //! \{ - inline bool eq(const char* other) const noexcept { - return strcmp(str, other) == 0; - } + inline bool equals(const char* other) const noexcept { return strcmp(str, other) == 0; } + +#if !defined(ASMJIT_NO_DEPRECATED) + ASMJIT_DEPRECATED("Use FixedString::equals() instead") + inline bool eq(const char* other) const noexcept { return equals(other); } +#endif // !ASMJIT_NO_DEPRECATED //! \} }; @@ -131,16 +134,16 @@ class String { //! \{ //! Creates a default-initialized string if zero length. - inline String() noexcept + ASMJIT_INLINE_NODEBUG String() noexcept : _small {} {} //! Creates a string that takes ownership of the content of the `other` string. - inline String(String&& other) noexcept { + ASMJIT_INLINE_NODEBUG String(String&& other) noexcept { _raw = other._raw; other._resetInternal(); } - inline ~String() noexcept { + ASMJIT_INLINE_NODEBUG ~String() noexcept { reset(); } @@ -158,37 +161,37 @@ class String { return *this; } - inline bool operator==(const char* other) const noexcept { return eq(other); } - inline bool operator!=(const char* other) const noexcept { return !eq(other); } + ASMJIT_INLINE_NODEBUG bool operator==(const char* other) const noexcept { return equals(other); } + ASMJIT_INLINE_NODEBUG bool operator!=(const char* other) const noexcept { return !equals(other); } - inline bool operator==(const String& other) const noexcept { return eq(other); } - inline bool operator!=(const String& other) const noexcept { return !eq(other); } + ASMJIT_INLINE_NODEBUG bool operator==(const String& other) const noexcept { return equals(other); } + ASMJIT_INLINE_NODEBUG bool operator!=(const String& other) const noexcept { return !equals(other); } //! \} //! \name Accessors //! \{ - inline bool isExternal() const noexcept { return _type == kTypeExternal; } - inline bool isLargeOrExternal() const noexcept { return _type >= kTypeLarge; } + ASMJIT_INLINE_NODEBUG bool isExternal() const noexcept { return _type == kTypeExternal; } + ASMJIT_INLINE_NODEBUG bool isLargeOrExternal() const noexcept { return _type >= kTypeLarge; } //! Tests whether the string is empty. - inline bool empty() const noexcept { return size() == 0; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return size() == 0; } //! Returns the size of the string. - inline size_t size() const noexcept { return isLargeOrExternal() ? size_t(_large.size) : size_t(_type); } + ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return isLargeOrExternal() ? size_t(_large.size) : size_t(_type); } //! Returns the capacity of the string. - inline size_t capacity() const noexcept { return isLargeOrExternal() ? _large.capacity : size_t(kSSOCapacity); } + ASMJIT_INLINE_NODEBUG size_t capacity() const noexcept { return isLargeOrExternal() ? _large.capacity : size_t(kSSOCapacity); } //! Returns the data of the string. - inline char* data() noexcept { return isLargeOrExternal() ? _large.data : _small.data; } + ASMJIT_INLINE_NODEBUG char* data() noexcept { return isLargeOrExternal() ? _large.data : _small.data; } //! \overload - inline const char* data() const noexcept { return isLargeOrExternal() ? _large.data : _small.data; } + ASMJIT_INLINE_NODEBUG const char* data() const noexcept { return isLargeOrExternal() ? _large.data : _small.data; } - inline char* start() noexcept { return data(); } - inline const char* start() const noexcept { return data(); } + ASMJIT_INLINE_NODEBUG char* start() noexcept { return data(); } + ASMJIT_INLINE_NODEBUG const char* start() const noexcept { return data(); } - inline char* end() noexcept { return data() + size(); } - inline const char* end() const noexcept { return data() + size(); } + ASMJIT_INLINE_NODEBUG char* end() noexcept { return data() + size(); } + ASMJIT_INLINE_NODEBUG const char* end() const noexcept { return data() + size(); } //! \} @@ -196,7 +199,7 @@ class String { //! \{ //! Swaps the content of this string with `other`. - inline void swap(String& other) noexcept { + ASMJIT_INLINE_NODEBUG void swap(String& other) noexcept { std::swap(_raw, other._raw); } @@ -219,91 +222,91 @@ class String { ASMJIT_API Error assign(const char* data, size_t size = SIZE_MAX) noexcept; //! Replaces the current of the string with `other` string. - inline Error assign(const String& other) noexcept { + ASMJIT_INLINE_NODEBUG Error assign(const String& other) noexcept { return assign(other.data(), other.size()); } //! Replaces the current of the string by a single `c` character. - inline Error assign(char c) noexcept { + ASMJIT_INLINE_NODEBUG Error assign(char c) noexcept { return _opChar(ModifyOp::kAssign, c); } //! Replaces the current of the string by a `c` character, repeated `n` times. - inline Error assignChars(char c, size_t n) noexcept { + ASMJIT_INLINE_NODEBUG Error assignChars(char c, size_t n) noexcept { return _opChars(ModifyOp::kAssign, c, n); } //! Replaces the current of the string by a formatted integer `i` (signed). - inline Error assignInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept { + ASMJIT_INLINE_NODEBUG Error assignInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept { return _opNumber(ModifyOp::kAssign, uint64_t(i), base, width, flags | StringFormatFlags::kSigned); } //! Replaces the current of the string by a formatted integer `i` (unsigned). - inline Error assignUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept { + ASMJIT_INLINE_NODEBUG Error assignUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept { return _opNumber(ModifyOp::kAssign, i, base, width, flags); } //! Replaces the current of the string by the given `data` converted to a HEX string. - inline Error assignHex(const void* data, size_t size, char separator = '\0') noexcept { + ASMJIT_INLINE_NODEBUG Error assignHex(const void* data, size_t size, char separator = '\0') noexcept { return _opHex(ModifyOp::kAssign, data, size, separator); } //! Replaces the current of the string by a formatted string `fmt`. template - inline Error assignFormat(const char* fmt, Args&&... args) noexcept { + ASMJIT_INLINE_NODEBUG Error assignFormat(const char* fmt, Args&&... args) noexcept { return _opFormat(ModifyOp::kAssign, fmt, std::forward(args)...); } //! Replaces the current of the string by a formatted string `fmt` (va_list version). - inline Error assignVFormat(const char* fmt, va_list ap) noexcept { + ASMJIT_INLINE_NODEBUG Error assignVFormat(const char* fmt, va_list ap) noexcept { return _opVFormat(ModifyOp::kAssign, fmt, ap); } //! Appends `str` having the given size `size` to the string. //! //! Null terminated strings can set `size` to `SIZE_MAX`. - inline Error append(const char* str, size_t size = SIZE_MAX) noexcept { + ASMJIT_INLINE_NODEBUG Error append(const char* str, size_t size = SIZE_MAX) noexcept { return _opString(ModifyOp::kAppend, str, size); } //! Appends `other` string to this string. - inline Error append(const String& other) noexcept { + ASMJIT_INLINE_NODEBUG Error append(const String& other) noexcept { return append(other.data(), other.size()); } //! Appends a single `c` character. - inline Error append(char c) noexcept { + ASMJIT_INLINE_NODEBUG Error append(char c) noexcept { return _opChar(ModifyOp::kAppend, c); } //! Appends `c` character repeated `n` times. - inline Error appendChars(char c, size_t n) noexcept { + ASMJIT_INLINE_NODEBUG Error appendChars(char c, size_t n) noexcept { return _opChars(ModifyOp::kAppend, c, n); } //! Appends a formatted integer `i` (signed). - inline Error appendInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept { + ASMJIT_INLINE_NODEBUG Error appendInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept { return _opNumber(ModifyOp::kAppend, uint64_t(i), base, width, flags | StringFormatFlags::kSigned); } //! Appends a formatted integer `i` (unsigned). - inline Error appendUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept { + ASMJIT_INLINE_NODEBUG Error appendUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept { return _opNumber(ModifyOp::kAppend, i, base, width, flags); } //! Appends the given `data` converted to a HEX string. - inline Error appendHex(const void* data, size_t size, char separator = '\0') noexcept { + ASMJIT_INLINE_NODEBUG Error appendHex(const void* data, size_t size, char separator = '\0') noexcept { return _opHex(ModifyOp::kAppend, data, size, separator); } //! Appends a formatted string `fmt` with `args`. template - inline Error appendFormat(const char* fmt, Args&&... args) noexcept { + ASMJIT_INLINE_NODEBUG Error appendFormat(const char* fmt, Args&&... args) noexcept { return _opFormat(ModifyOp::kAppend, fmt, std::forward(args)...); } //! Appends a formatted string `fmt` (va_list version). - inline Error appendVFormat(const char* fmt, va_list ap) noexcept { + ASMJIT_INLINE_NODEBUG Error appendVFormat(const char* fmt, va_list ap) noexcept { return _opVFormat(ModifyOp::kAppend, fmt, ap); } @@ -312,8 +315,16 @@ class String { //! Truncate the string length into `newSize`. ASMJIT_API Error truncate(size_t newSize) noexcept; - ASMJIT_API bool eq(const char* other, size_t size = SIZE_MAX) const noexcept; - inline bool eq(const String& other) const noexcept { return eq(other.data(), other.size()); } + ASMJIT_API bool equals(const char* other, size_t size = SIZE_MAX) const noexcept; + ASMJIT_INLINE_NODEBUG bool equals(const String& other) const noexcept { return equals(other.data(), other.size()); } + +#if !defined(ASMJIT_NO_DEPRECATED) + ASMJIT_DEPRECATED("Use String::equals() instead") + ASMJIT_INLINE_NODEBUG bool eq(const char* other, size_t size = SIZE_MAX) const noexcept { return equals(other, size); } + + ASMJIT_DEPRECATED("Use String::equals() instead") + ASMJIT_INLINE_NODEBUG bool eq(const String& other) const noexcept { return equals(other.data(), other.size()); } +#endif // !ASMJIT_NO_DEPRECATED //! \} @@ -351,7 +362,7 @@ class StringTmp : public String { //! \name Construction & Destruction //! \{ - inline StringTmp() noexcept { + ASMJIT_INLINE_NODEBUG StringTmp() noexcept { _resetToTemporary(); } diff --git a/3rdparty/asmjit/src/asmjit/core/support.cpp b/3rdparty/asmjit/src/asmjit/core/support.cpp index 245398fe73262..bebabbcc2dea0 100644 --- a/3rdparty/asmjit/src/asmjit/core/support.cpp +++ b/3rdparty/asmjit/src/asmjit/core/support.cpp @@ -15,74 +15,76 @@ ASMJIT_BEGIN_NAMESPACE template static void testArrays(const T* a, const T* b, size_t size) noexcept { for (size_t i = 0; i < size; i++) - EXPECT(a[i] == b[i], "Mismatch at %u", unsigned(i)); + EXPECT_EQ(a[i], b[i]) + .message("Mismatch at %u", unsigned(i)); } static void testAlignment() noexcept { INFO("Support::isAligned()"); - EXPECT(Support::isAligned(0xFFFF, 4) == false); - EXPECT(Support::isAligned(0xFFF4, 4) == true); - EXPECT(Support::isAligned(0xFFF8, 8) == true); - EXPECT(Support::isAligned(0xFFF0, 16) == true); + EXPECT_FALSE(Support::isAligned(0xFFFF, 4u)); + EXPECT_TRUE(Support::isAligned(0xFFF4, 4u)); + EXPECT_TRUE(Support::isAligned(0xFFF8, 8u)); + EXPECT_TRUE(Support::isAligned(0xFFF0, 16u)); INFO("Support::alignUp()"); - EXPECT(Support::alignUp(0xFFFF, 4) == 0x10000); - EXPECT(Support::alignUp(0xFFF4, 4) == 0x0FFF4); - EXPECT(Support::alignUp(0xFFF8, 8) == 0x0FFF8); - EXPECT(Support::alignUp(0xFFF0, 16) == 0x0FFF0); - EXPECT(Support::alignUp(0xFFF0, 32) == 0x10000); + EXPECT_EQ(Support::alignUp(0xFFFF, 4), 0x10000u); + EXPECT_EQ(Support::alignUp(0xFFF4, 4), 0x0FFF4u); + EXPECT_EQ(Support::alignUp(0xFFF8, 8), 0x0FFF8u); + EXPECT_EQ(Support::alignUp(0xFFF0, 16), 0x0FFF0u); + EXPECT_EQ(Support::alignUp(0xFFF0, 32), 0x10000u); INFO("Support::alignUpDiff()"); - EXPECT(Support::alignUpDiff(0xFFFF, 4) == 1); - EXPECT(Support::alignUpDiff(0xFFF4, 4) == 0); - EXPECT(Support::alignUpDiff(0xFFF8, 8) == 0); - EXPECT(Support::alignUpDiff(0xFFF0, 16) == 0); - EXPECT(Support::alignUpDiff(0xFFF0, 32) == 16); + EXPECT_EQ(Support::alignUpDiff(0xFFFF, 4), 1u); + EXPECT_EQ(Support::alignUpDiff(0xFFF4, 4), 0u); + EXPECT_EQ(Support::alignUpDiff(0xFFF8, 8), 0u); + EXPECT_EQ(Support::alignUpDiff(0xFFF0, 16), 0u); + EXPECT_EQ(Support::alignUpDiff(0xFFF0, 32), 16u); INFO("Support::alignUpPowerOf2()"); - EXPECT(Support::alignUpPowerOf2(0x0000) == 0x00000); - EXPECT(Support::alignUpPowerOf2(0xFFFF) == 0x10000); - EXPECT(Support::alignUpPowerOf2(0xF123) == 0x10000); - EXPECT(Support::alignUpPowerOf2(0x0F00) == 0x01000); - EXPECT(Support::alignUpPowerOf2(0x0100) == 0x00100); - EXPECT(Support::alignUpPowerOf2(0x1001) == 0x02000); + EXPECT_EQ(Support::alignUpPowerOf2(0x0000), 0x00000u); + EXPECT_EQ(Support::alignUpPowerOf2(0xFFFF), 0x10000u); + EXPECT_EQ(Support::alignUpPowerOf2(0xF123), 0x10000u); + EXPECT_EQ(Support::alignUpPowerOf2(0x0F00), 0x01000u); + EXPECT_EQ(Support::alignUpPowerOf2(0x0100), 0x00100u); + EXPECT_EQ(Support::alignUpPowerOf2(0x1001), 0x02000u); } static void testBitUtils() noexcept { uint32_t i; INFO("Support::shl() / shr()"); - EXPECT(Support::shl(int32_t(0x00001111), 16) == int32_t(0x11110000u)); - EXPECT(Support::shl(uint32_t(0x00001111), 16) == uint32_t(0x11110000u)); - EXPECT(Support::shr(int32_t(0x11110000u), 16) == int32_t(0x00001111u)); - EXPECT(Support::shr(uint32_t(0x11110000u), 16) == uint32_t(0x00001111u)); - EXPECT(Support::sar(int32_t(0xFFFF0000u), 16) == int32_t(0xFFFFFFFFu)); - EXPECT(Support::sar(uint32_t(0xFFFF0000u), 16) == uint32_t(0xFFFFFFFFu)); + EXPECT_EQ(Support::shl(int32_t(0x00001111), 16), int32_t(0x11110000u)); + EXPECT_EQ(Support::shl(uint32_t(0x00001111), 16), uint32_t(0x11110000u)); + EXPECT_EQ(Support::shr(int32_t(0x11110000u), 16), int32_t(0x00001111u)); + EXPECT_EQ(Support::shr(uint32_t(0x11110000u), 16), uint32_t(0x00001111u)); + EXPECT_EQ(Support::sar(int32_t(0xFFFF0000u), 16), int32_t(0xFFFFFFFFu)); + EXPECT_EQ(Support::sar(uint32_t(0xFFFF0000u), 16), uint32_t(0xFFFFFFFFu)); INFO("Support::blsi()"); - for (i = 0; i < 32; i++) EXPECT(Support::blsi(uint32_t(1) << i) == uint32_t(1) << i); - for (i = 0; i < 31; i++) EXPECT(Support::blsi(uint32_t(3) << i) == uint32_t(1) << i); - for (i = 0; i < 64; i++) EXPECT(Support::blsi(uint64_t(1) << i) == uint64_t(1) << i); - for (i = 0; i < 63; i++) EXPECT(Support::blsi(uint64_t(3) << i) == uint64_t(1) << i); + for (i = 0; i < 32; i++) EXPECT_EQ(Support::blsi(uint32_t(1) << i), uint32_t(1) << i); + for (i = 0; i < 31; i++) EXPECT_EQ(Support::blsi(uint32_t(3) << i), uint32_t(1) << i); + for (i = 0; i < 64; i++) EXPECT_EQ(Support::blsi(uint64_t(1) << i), uint64_t(1) << i); + for (i = 0; i < 63; i++) EXPECT_EQ(Support::blsi(uint64_t(3) << i), uint64_t(1) << i); INFO("Support::ctz()"); - for (i = 0; i < 32; i++) EXPECT(Support::Internal::clzFallback(uint32_t(1) << i) == 31 - i); - for (i = 0; i < 64; i++) EXPECT(Support::Internal::clzFallback(uint64_t(1) << i) == 63 - i); - for (i = 0; i < 32; i++) EXPECT(Support::Internal::ctzFallback(uint32_t(1) << i) == i); - for (i = 0; i < 64; i++) EXPECT(Support::Internal::ctzFallback(uint64_t(1) << i) == i); - for (i = 0; i < 32; i++) EXPECT(Support::clz(uint32_t(1) << i) == 31 - i); - for (i = 0; i < 64; i++) EXPECT(Support::clz(uint64_t(1) << i) == 63 - i); - for (i = 0; i < 32; i++) EXPECT(Support::ctz(uint32_t(1) << i) == i); - for (i = 0; i < 64; i++) EXPECT(Support::ctz(uint64_t(1) << i) == i); + for (i = 0; i < 32; i++) EXPECT_EQ(Support::Internal::clzFallback(uint32_t(1) << i), 31 - i); + for (i = 0; i < 64; i++) EXPECT_EQ(Support::Internal::clzFallback(uint64_t(1) << i), 63 - i); + for (i = 0; i < 32; i++) EXPECT_EQ(Support::Internal::ctzFallback(uint32_t(1) << i), i); + for (i = 0; i < 64; i++) EXPECT_EQ(Support::Internal::ctzFallback(uint64_t(1) << i), i); + for (i = 0; i < 32; i++) EXPECT_EQ(Support::clz(uint32_t(1) << i), 31 - i); + for (i = 0; i < 64; i++) EXPECT_EQ(Support::clz(uint64_t(1) << i), 63 - i); + for (i = 0; i < 32; i++) EXPECT_EQ(Support::ctz(uint32_t(1) << i), i); + for (i = 0; i < 64; i++) EXPECT_EQ(Support::ctz(uint64_t(1) << i), i); INFO("Support::bitMask()"); - EXPECT(Support::bitMask(0, 1, 7) == 0x83u); + EXPECT_EQ(Support::bitMask(0, 1, 7), 0x83u); for (i = 0; i < 32; i++) - EXPECT(Support::bitMask(i) == (1u << i)); + EXPECT_EQ(Support::bitMask(i), (1u << i)); INFO("Support::bitTest()"); for (i = 0; i < 32; i++) { - EXPECT(Support::bitTest((1 << i), i) == true, "Support::bitTest(%X, %u) should return true", (1 << i), i); + EXPECT_TRUE(Support::bitTest((1 << i), i)) + .message("Support::bitTest(%X, %u) should return true", (1 << i), i); } INFO("Support::lsbMask()"); @@ -90,7 +92,7 @@ static void testBitUtils() noexcept { uint32_t expectedBits = 0; for (uint32_t b = 0; b < i; b++) expectedBits |= uint32_t(1) << b; - EXPECT(Support::lsbMask(i) == expectedBits); + EXPECT_EQ(Support::lsbMask(i), expectedBits); } INFO("Support::lsbMask()"); @@ -98,31 +100,31 @@ static void testBitUtils() noexcept { uint64_t expectedBits = 0; for (uint32_t b = 0; b < i; b++) expectedBits |= uint64_t(1) << b; - EXPECT(Support::lsbMask(i) == expectedBits); + EXPECT_EQ(Support::lsbMask(i), expectedBits); } INFO("Support::popcnt()"); - for (i = 0; i < 32; i++) EXPECT(Support::popcnt((uint32_t(1) << i)) == 1); - for (i = 0; i < 64; i++) EXPECT(Support::popcnt((uint64_t(1) << i)) == 1); - EXPECT(Support::popcnt(0x000000F0) == 4); - EXPECT(Support::popcnt(0x10101010) == 4); - EXPECT(Support::popcnt(0xFF000000) == 8); - EXPECT(Support::popcnt(0xFFFFFFF7) == 31); - EXPECT(Support::popcnt(0x7FFFFFFF) == 31); + for (i = 0; i < 32; i++) EXPECT_EQ(Support::popcnt((uint32_t(1) << i)), 1u); + for (i = 0; i < 64; i++) EXPECT_EQ(Support::popcnt((uint64_t(1) << i)), 1u); + EXPECT_EQ(Support::popcnt(0x000000F0), 4u); + EXPECT_EQ(Support::popcnt(0x10101010), 4u); + EXPECT_EQ(Support::popcnt(0xFF000000), 8u); + EXPECT_EQ(Support::popcnt(0xFFFFFFF7), 31u); + EXPECT_EQ(Support::popcnt(0x7FFFFFFF), 31u); INFO("Support::isPowerOf2()"); for (i = 0; i < 64; i++) { - EXPECT(Support::isPowerOf2(uint64_t(1) << i) == true); - EXPECT(Support::isPowerOf2((uint64_t(1) << i) ^ 0x001101) == false); + EXPECT_TRUE(Support::isPowerOf2(uint64_t(1) << i)); + EXPECT_FALSE(Support::isPowerOf2((uint64_t(1) << i) ^ 0x001101)); } } static void testIntUtils() noexcept { INFO("Support::byteswap()"); - EXPECT(Support::byteswap16(int32_t(0x0102)) == int32_t(0x0201)); - EXPECT(Support::byteswap32(int32_t(0x01020304)) == int32_t(0x04030201)); - EXPECT(Support::byteswap32(uint32_t(0x01020304)) == uint32_t(0x04030201)); - EXPECT(Support::byteswap64(uint64_t(0x0102030405060708)) == uint64_t(0x0807060504030201)); + EXPECT_EQ(Support::byteswap16(0x0102), 0x0201u); + EXPECT_EQ(Support::byteswap32(0x01020304), 0x04030201u); + EXPECT_EQ(Support::byteswap32(0x01020304), 0x04030201u); + EXPECT_EQ(Support::byteswap64(uint64_t(0x0102030405060708)), uint64_t(0x0807060504030201)); INFO("Support::bytepack()"); union BytePackData { @@ -131,60 +133,60 @@ static void testIntUtils() noexcept { } bpdata; bpdata.u32 = Support::bytepack32_4x8(0x00, 0x11, 0x22, 0x33); - EXPECT(bpdata.bytes[0] == 0x00); - EXPECT(bpdata.bytes[1] == 0x11); - EXPECT(bpdata.bytes[2] == 0x22); - EXPECT(bpdata.bytes[3] == 0x33); + EXPECT_EQ(bpdata.bytes[0], 0x00); + EXPECT_EQ(bpdata.bytes[1], 0x11); + EXPECT_EQ(bpdata.bytes[2], 0x22); + EXPECT_EQ(bpdata.bytes[3], 0x33); INFO("Support::isBetween()"); - EXPECT(Support::isBetween(10 , 10, 20) == true); - EXPECT(Support::isBetween(11 , 10, 20) == true); - EXPECT(Support::isBetween(20 , 10, 20) == true); - EXPECT(Support::isBetween(9 , 10, 20) == false); - EXPECT(Support::isBetween(21 , 10, 20) == false); - EXPECT(Support::isBetween(101, 10, 20) == false); + EXPECT_TRUE(Support::isBetween(10 , 10, 20)); + EXPECT_TRUE(Support::isBetween(11 , 10, 20)); + EXPECT_TRUE(Support::isBetween(20 , 10, 20)); + EXPECT_FALSE(Support::isBetween(9 , 10, 20)); + EXPECT_FALSE(Support::isBetween(21 , 10, 20)); + EXPECT_FALSE(Support::isBetween(101, 10, 20)); INFO("Support::isInt8()"); - EXPECT(Support::isInt8(-128) == true); - EXPECT(Support::isInt8( 127) == true); - EXPECT(Support::isInt8(-129) == false); - EXPECT(Support::isInt8( 128) == false); + EXPECT_TRUE(Support::isInt8(-128)); + EXPECT_TRUE(Support::isInt8( 127)); + EXPECT_FALSE(Support::isInt8(-129)); + EXPECT_FALSE(Support::isInt8( 128)); INFO("Support::isInt16()"); - EXPECT(Support::isInt16(-32768) == true); - EXPECT(Support::isInt16( 32767) == true); - EXPECT(Support::isInt16(-32769) == false); - EXPECT(Support::isInt16( 32768) == false); + EXPECT_TRUE(Support::isInt16(-32768)); + EXPECT_TRUE(Support::isInt16( 32767)); + EXPECT_FALSE(Support::isInt16(-32769)); + EXPECT_FALSE(Support::isInt16( 32768)); INFO("Support::isInt32()"); - EXPECT(Support::isInt32( 2147483647 ) == true); - EXPECT(Support::isInt32(-2147483647 - 1) == true); - EXPECT(Support::isInt32(uint64_t(2147483648u)) == false); - EXPECT(Support::isInt32(uint64_t(0xFFFFFFFFu)) == false); - EXPECT(Support::isInt32(uint64_t(0xFFFFFFFFu) + 1) == false); + EXPECT_TRUE(Support::isInt32( 2147483647 )); + EXPECT_TRUE(Support::isInt32(-2147483647 - 1)); + EXPECT_FALSE(Support::isInt32(uint64_t(2147483648u))); + EXPECT_FALSE(Support::isInt32(uint64_t(0xFFFFFFFFu))); + EXPECT_FALSE(Support::isInt32(uint64_t(0xFFFFFFFFu) + 1)); INFO("Support::isUInt8()"); - EXPECT(Support::isUInt8(0) == true); - EXPECT(Support::isUInt8(255) == true); - EXPECT(Support::isUInt8(256) == false); - EXPECT(Support::isUInt8(-1) == false); + EXPECT_TRUE(Support::isUInt8(0) ); + EXPECT_TRUE(Support::isUInt8(255)); + EXPECT_FALSE(Support::isUInt8(256)); + EXPECT_FALSE(Support::isUInt8(-1) ); INFO("Support::isUInt12()"); - EXPECT(Support::isUInt12(0) == true); - EXPECT(Support::isUInt12(4095) == true); - EXPECT(Support::isUInt12(4096) == false); - EXPECT(Support::isUInt12(-1) == false); + EXPECT_TRUE(Support::isUInt12(0) ); + EXPECT_TRUE(Support::isUInt12(4095)); + EXPECT_FALSE(Support::isUInt12(4096)); + EXPECT_FALSE(Support::isUInt12(-1) ); INFO("Support::isUInt16()"); - EXPECT(Support::isUInt16(0) == true); - EXPECT(Support::isUInt16(65535) == true); - EXPECT(Support::isUInt16(65536) == false); - EXPECT(Support::isUInt16(-1) == false); + EXPECT_TRUE(Support::isUInt16(0) ); + EXPECT_TRUE(Support::isUInt16(65535)); + EXPECT_FALSE(Support::isUInt16(65536)); + EXPECT_FALSE(Support::isUInt16(-1) ); INFO("Support::isUInt32()"); - EXPECT(Support::isUInt32(uint64_t(0xFFFFFFFF)) == true); - EXPECT(Support::isUInt32(uint64_t(0xFFFFFFFF) + 1) == false); - EXPECT(Support::isUInt32(-1) == false); + EXPECT_TRUE(Support::isUInt32(uint64_t(0xFFFFFFFF))); + EXPECT_FALSE(Support::isUInt32(uint64_t(0xFFFFFFFF) + 1)); + EXPECT_FALSE(Support::isUInt32(-1)); } static void testReadWrite() noexcept { @@ -194,17 +196,17 @@ static void testReadWrite() noexcept { Support::writeU16uBE(arr + 1, 0x0102u); Support::writeU16uBE(arr + 3, 0x0304u); - EXPECT(Support::readU32uBE(arr + 1) == 0x01020304u); - EXPECT(Support::readU32uLE(arr + 1) == 0x04030201u); - EXPECT(Support::readU32uBE(arr + 2) == 0x02030400u); - EXPECT(Support::readU32uLE(arr + 2) == 0x00040302u); + EXPECT_EQ(Support::readU32uBE(arr + 1), 0x01020304u); + EXPECT_EQ(Support::readU32uLE(arr + 1), 0x04030201u); + EXPECT_EQ(Support::readU32uBE(arr + 2), 0x02030400u); + EXPECT_EQ(Support::readU32uLE(arr + 2), 0x00040302u); Support::writeU32uLE(arr + 5, 0x05060708u); - EXPECT(Support::readU64uBE(arr + 1) == 0x0102030408070605u); - EXPECT(Support::readU64uLE(arr + 1) == 0x0506070804030201u); + EXPECT_EQ(Support::readU64uBE(arr + 1), 0x0102030408070605u); + EXPECT_EQ(Support::readU64uLE(arr + 1), 0x0506070804030201u); Support::writeU64uLE(arr + 7, 0x1122334455667788u); - EXPECT(Support::readU32uBE(arr + 8) == 0x77665544u); + EXPECT_EQ(Support::readU32uBE(arr + 8), 0x77665544u); } static void testBitVector() noexcept { @@ -212,132 +214,132 @@ static void testBitVector() noexcept { { uint32_t vec[3] = { 0 }; Support::bitVectorFill(vec, 1, 64); - EXPECT(vec[0] == 0xFFFFFFFEu); - EXPECT(vec[1] == 0xFFFFFFFFu); - EXPECT(vec[2] == 0x00000001u); + EXPECT_EQ(vec[0], 0xFFFFFFFEu); + EXPECT_EQ(vec[1], 0xFFFFFFFFu); + EXPECT_EQ(vec[2], 0x00000001u); Support::bitVectorClear(vec, 1, 1); - EXPECT(vec[0] == 0xFFFFFFFCu); - EXPECT(vec[1] == 0xFFFFFFFFu); - EXPECT(vec[2] == 0x00000001u); + EXPECT_EQ(vec[0], 0xFFFFFFFCu); + EXPECT_EQ(vec[1], 0xFFFFFFFFu); + EXPECT_EQ(vec[2], 0x00000001u); Support::bitVectorFill(vec, 0, 32); - EXPECT(vec[0] == 0xFFFFFFFFu); - EXPECT(vec[1] == 0xFFFFFFFFu); - EXPECT(vec[2] == 0x00000001u); + EXPECT_EQ(vec[0], 0xFFFFFFFFu); + EXPECT_EQ(vec[1], 0xFFFFFFFFu); + EXPECT_EQ(vec[2], 0x00000001u); Support::bitVectorClear(vec, 0, 32); - EXPECT(vec[0] == 0x00000000u); - EXPECT(vec[1] == 0xFFFFFFFFu); - EXPECT(vec[2] == 0x00000001u); + EXPECT_EQ(vec[0], 0x00000000u); + EXPECT_EQ(vec[1], 0xFFFFFFFFu); + EXPECT_EQ(vec[2], 0x00000001u); Support::bitVectorFill(vec, 1, 30); - EXPECT(vec[0] == 0x7FFFFFFEu); - EXPECT(vec[1] == 0xFFFFFFFFu); - EXPECT(vec[2] == 0x00000001u); + EXPECT_EQ(vec[0], 0x7FFFFFFEu); + EXPECT_EQ(vec[1], 0xFFFFFFFFu); + EXPECT_EQ(vec[2], 0x00000001u); Support::bitVectorClear(vec, 1, 95); - EXPECT(vec[0] == 0x00000000u); - EXPECT(vec[1] == 0x00000000u); - EXPECT(vec[2] == 0x00000000u); + EXPECT_EQ(vec[0], 0x00000000u); + EXPECT_EQ(vec[1], 0x00000000u); + EXPECT_EQ(vec[2], 0x00000000u); Support::bitVectorFill(vec, 32, 64); - EXPECT(vec[0] == 0x00000000u); - EXPECT(vec[1] == 0xFFFFFFFFu); - EXPECT(vec[2] == 0xFFFFFFFFu); + EXPECT_EQ(vec[0], 0x00000000u); + EXPECT_EQ(vec[1], 0xFFFFFFFFu); + EXPECT_EQ(vec[2], 0xFFFFFFFFu); Support::bitVectorSetBit(vec, 1, true); - EXPECT(vec[0] == 0x00000002u); - EXPECT(vec[1] == 0xFFFFFFFFu); - EXPECT(vec[2] == 0xFFFFFFFFu); + EXPECT_EQ(vec[0], 0x00000002u); + EXPECT_EQ(vec[1], 0xFFFFFFFFu); + EXPECT_EQ(vec[2], 0xFFFFFFFFu); Support::bitVectorSetBit(vec, 95, false); - EXPECT(vec[0] == 0x00000002u); - EXPECT(vec[1] == 0xFFFFFFFFu); - EXPECT(vec[2] == 0x7FFFFFFFu); + EXPECT_EQ(vec[0], 0x00000002u); + EXPECT_EQ(vec[1], 0xFFFFFFFFu); + EXPECT_EQ(vec[2], 0x7FFFFFFFu); Support::bitVectorClear(vec, 33, 32); - EXPECT(vec[0] == 0x00000002u); - EXPECT(vec[1] == 0x00000001u); - EXPECT(vec[2] == 0x7FFFFFFEu); + EXPECT_EQ(vec[0], 0x00000002u); + EXPECT_EQ(vec[1], 0x00000001u); + EXPECT_EQ(vec[2], 0x7FFFFFFEu); } INFO("Support::bitVectorIndexOf"); { uint32_t vec1[1] = { 0x80000000 }; - EXPECT(Support::bitVectorIndexOf(vec1, 0, true) == 31); - EXPECT(Support::bitVectorIndexOf(vec1, 1, true) == 31); - EXPECT(Support::bitVectorIndexOf(vec1, 31, true) == 31); + EXPECT_EQ(Support::bitVectorIndexOf(vec1, 0, true), 31u); + EXPECT_EQ(Support::bitVectorIndexOf(vec1, 1, true), 31u); + EXPECT_EQ(Support::bitVectorIndexOf(vec1, 31, true), 31u); uint32_t vec2[2] = { 0x00000000, 0x80000000 }; - EXPECT(Support::bitVectorIndexOf(vec2, 0, true) == 63); - EXPECT(Support::bitVectorIndexOf(vec2, 1, true) == 63); - EXPECT(Support::bitVectorIndexOf(vec2, 31, true) == 63); - EXPECT(Support::bitVectorIndexOf(vec2, 32, true) == 63); - EXPECT(Support::bitVectorIndexOf(vec2, 33, true) == 63); - EXPECT(Support::bitVectorIndexOf(vec2, 63, true) == 63); + EXPECT_EQ(Support::bitVectorIndexOf(vec2, 0, true), 63u); + EXPECT_EQ(Support::bitVectorIndexOf(vec2, 1, true), 63u); + EXPECT_EQ(Support::bitVectorIndexOf(vec2, 31, true), 63u); + EXPECT_EQ(Support::bitVectorIndexOf(vec2, 32, true), 63u); + EXPECT_EQ(Support::bitVectorIndexOf(vec2, 33, true), 63u); + EXPECT_EQ(Support::bitVectorIndexOf(vec2, 63, true), 63u); uint32_t vec3[3] = { 0x00000001, 0x00000000, 0x80000000 }; - EXPECT(Support::bitVectorIndexOf(vec3, 0, true) == 0); - EXPECT(Support::bitVectorIndexOf(vec3, 1, true) == 95); - EXPECT(Support::bitVectorIndexOf(vec3, 2, true) == 95); - EXPECT(Support::bitVectorIndexOf(vec3, 31, true) == 95); - EXPECT(Support::bitVectorIndexOf(vec3, 32, true) == 95); - EXPECT(Support::bitVectorIndexOf(vec3, 63, true) == 95); - EXPECT(Support::bitVectorIndexOf(vec3, 64, true) == 95); - EXPECT(Support::bitVectorIndexOf(vec3, 95, true) == 95); + EXPECT_EQ(Support::bitVectorIndexOf(vec3, 0, true), 0u); + EXPECT_EQ(Support::bitVectorIndexOf(vec3, 1, true), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec3, 2, true), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec3, 31, true), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec3, 32, true), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec3, 63, true), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec3, 64, true), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec3, 95, true), 95u); uint32_t vec4[3] = { ~vec3[0], ~vec3[1], ~vec3[2] }; - EXPECT(Support::bitVectorIndexOf(vec4, 0, false) == 0); - EXPECT(Support::bitVectorIndexOf(vec4, 1, false) == 95); - EXPECT(Support::bitVectorIndexOf(vec4, 2, false) == 95); - EXPECT(Support::bitVectorIndexOf(vec4, 31, false) == 95); - EXPECT(Support::bitVectorIndexOf(vec4, 32, false) == 95); - EXPECT(Support::bitVectorIndexOf(vec4, 63, false) == 95); - EXPECT(Support::bitVectorIndexOf(vec4, 64, false) == 95); - EXPECT(Support::bitVectorIndexOf(vec4, 95, false) == 95); + EXPECT_EQ(Support::bitVectorIndexOf(vec4, 0, false), 0u); + EXPECT_EQ(Support::bitVectorIndexOf(vec4, 1, false), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec4, 2, false), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec4, 31, false), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec4, 32, false), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec4, 63, false), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec4, 64, false), 95u); + EXPECT_EQ(Support::bitVectorIndexOf(vec4, 95, false), 95u); } INFO("Support::BitWordIterator"); { Support::BitWordIterator it(0x80000F01u); - EXPECT(it.hasNext()); - EXPECT(it.next() == 0); - EXPECT(it.hasNext()); - EXPECT(it.next() == 8); - EXPECT(it.hasNext()); - EXPECT(it.next() == 9); - EXPECT(it.hasNext()); - EXPECT(it.next() == 10); - EXPECT(it.hasNext()); - EXPECT(it.next() == 11); - EXPECT(it.hasNext()); - EXPECT(it.next() == 31); - EXPECT(!it.hasNext()); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 0u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 8u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 9u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 10u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 11u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 31u); + EXPECT_FALSE(it.hasNext()); // No bits set. it.init(0x00000000u); - ASMJIT_ASSERT(!it.hasNext()); + EXPECT_FALSE(it.hasNext()); // Only first bit set. it.init(0x00000001u); - EXPECT(it.hasNext()); - EXPECT(it.next() == 0); - ASMJIT_ASSERT(!it.hasNext()); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 0u); + EXPECT_FALSE(it.hasNext()); // Only last bit set (special case). it.init(0x80000000u); - ASMJIT_ASSERT(it.hasNext()); - ASMJIT_ASSERT(it.next() == 31); - ASMJIT_ASSERT(!it.hasNext()); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 31u); + EXPECT_FALSE(it.hasNext()); } INFO("Support::BitWordIterator"); { Support::BitWordIterator it(uint64_t(1) << 63); - ASMJIT_ASSERT(it.hasNext()); - ASMJIT_ASSERT(it.next() == 63); - ASMJIT_ASSERT(!it.hasNext()); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 63u); + EXPECT_FALSE(it.hasNext()); } INFO("Support::BitVectorIterator"); @@ -346,63 +348,63 @@ static void testBitVector() noexcept { static const uint32_t bitsNone[] = { 0xFFFFFFFFu }; Support::BitVectorIterator it(bitsNone, 0); - EXPECT(!it.hasNext()); + EXPECT_FALSE(it.hasNext()); it.init(bitsNone, 0, 1); - EXPECT(!it.hasNext()); + EXPECT_FALSE(it.hasNext()); it.init(bitsNone, 0, 128); - EXPECT(!it.hasNext()); + EXPECT_FALSE(it.hasNext()); static const uint32_t bits1[] = { 0x80000008u, 0x80000001u, 0x00000000u, 0x80000000u, 0x00000000u, 0x00000000u, 0x00003000u }; it.init(bits1, ASMJIT_ARRAY_SIZE(bits1)); - EXPECT(it.hasNext()); - EXPECT(it.next() == 3); - EXPECT(it.hasNext()); - EXPECT(it.next() == 31); - EXPECT(it.hasNext()); - EXPECT(it.next() == 32); - EXPECT(it.hasNext()); - EXPECT(it.next() == 63); - EXPECT(it.hasNext()); - EXPECT(it.next() == 127); - EXPECT(it.hasNext()); - EXPECT(it.next() == 204); - EXPECT(it.hasNext()); - EXPECT(it.next() == 205); - EXPECT(!it.hasNext()); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 3u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 31u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 32u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 63u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 127u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 204u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 205u); + EXPECT_FALSE(it.hasNext()); it.init(bits1, ASMJIT_ARRAY_SIZE(bits1), 4); - EXPECT(it.hasNext()); - EXPECT(it.next() == 31); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 31u); it.init(bits1, ASMJIT_ARRAY_SIZE(bits1), 64); - EXPECT(it.hasNext()); - EXPECT(it.next() == 127); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 127u); it.init(bits1, ASMJIT_ARRAY_SIZE(bits1), 127); - EXPECT(it.hasNext()); - EXPECT(it.next() == 127); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 127u); static const uint32_t bits2[] = { 0x80000000u, 0x80000000u, 0x00000000u, 0x80000000u }; it.init(bits2, ASMJIT_ARRAY_SIZE(bits2)); - EXPECT(it.hasNext()); - EXPECT(it.next() == 31); - EXPECT(it.hasNext()); - EXPECT(it.next() == 63); - EXPECT(it.hasNext()); - EXPECT(it.next() == 127); - EXPECT(!it.hasNext()); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 31u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 63u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 127u); + EXPECT_FALSE(it.hasNext()); static const uint32_t bits3[] = { 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u }; it.init(bits3, ASMJIT_ARRAY_SIZE(bits3)); - EXPECT(!it.hasNext()); + EXPECT_FALSE(it.hasNext()); static const uint32_t bits4[] = { 0x00000000u, 0x00000000u, 0x00000000u, 0x80000000u }; it.init(bits4, ASMJIT_ARRAY_SIZE(bits4)); - EXPECT(it.hasNext()); - EXPECT(it.next() == 127); - EXPECT(!it.hasNext()); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 127u); + EXPECT_FALSE(it.hasNext()); } INFO("Support::BitVectorIterator"); @@ -410,20 +412,20 @@ static void testBitVector() noexcept { static const uint64_t bits1[] = { 0x80000000u, 0x80000000u, 0x00000000u, 0x80000000u }; Support::BitVectorIterator it(bits1, ASMJIT_ARRAY_SIZE(bits1)); - EXPECT(it.hasNext()); - EXPECT(it.next() == 31); - EXPECT(it.hasNext()); - EXPECT(it.next() == 95); - EXPECT(it.hasNext()); - EXPECT(it.next() == 223); - EXPECT(!it.hasNext()); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 31u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 95u); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 223u); + EXPECT_FALSE(it.hasNext()); static const uint64_t bits2[] = { 0x8000000000000000u, 0, 0, 0 }; it.init(bits2, ASMJIT_ARRAY_SIZE(bits2)); - EXPECT(it.hasNext()); - EXPECT(it.next() == 63); - EXPECT(!it.hasNext()); + EXPECT_TRUE(it.hasNext()); + EXPECT_EQ(it.next(), 63u); + EXPECT_FALSE(it.hasNext()); } } diff --git a/3rdparty/asmjit/src/asmjit/core/support.h b/3rdparty/asmjit/src/asmjit/core/support.h index e55b8084dbf37..345cf8cf4cdcb 100644 --- a/3rdparty/asmjit/src/asmjit/core/support.h +++ b/3rdparty/asmjit/src/asmjit/core/support.h @@ -68,29 +68,29 @@ namespace Internal { //! \endcond template -static constexpr bool isUnsigned() noexcept { return std::is_unsigned::value; } +static ASMJIT_INLINE_NODEBUG constexpr bool isUnsigned() noexcept { return std::is_unsigned::value; } //! Casts an integer `x` to either `int32_t` or `int64_t` depending on `T`. template -static constexpr typename Internal::Int32Or64::Type asInt(const T& x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr typename Internal::Int32Or64::Type asInt(const T& x) noexcept { return (typename Internal::Int32Or64::Type)x; } //! Casts an integer `x` to either `uint32_t` or `uint64_t` depending on `T`. template -static constexpr typename Internal::Int32Or64::Type asUInt(const T& x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr typename Internal::Int32Or64::Type asUInt(const T& x) noexcept { return (typename Internal::Int32Or64::Type)x; } //! Casts an integer `x` to either `int32_t`, uint32_t`, `int64_t`, or `uint64_t` depending on `T`. template -static constexpr typename Internal::Int32Or64::Type asNormalized(const T& x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr typename Internal::Int32Or64::Type asNormalized(const T& x) noexcept { return (typename Internal::Int32Or64::Type)x; } //! Casts an integer `x` to the same type as defined by ``. template -static constexpr typename Internal::StdInt()>::Type asStdInt(const T& x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr typename Internal::StdInt()>::Type asStdInt(const T& x) noexcept { return (typename Internal::StdInt()>::Type)x; } @@ -102,15 +102,15 @@ struct EnumValues { struct Iterator { ValueType value; - inline T operator*() const { return (T)value; } - inline void operator++() { ++value; } + ASMJIT_INLINE_NODEBUG T operator*() const { return (T)value; } + ASMJIT_INLINE_NODEBUG void operator++() { ++value; } - inline bool operator==(const Iterator& other) const noexcept { return value == other.value; } - inline bool operator!=(const Iterator& other) const noexcept { return value != other.value; } + ASMJIT_INLINE_NODEBUG bool operator==(const Iterator& other) const noexcept { return value == other.value; } + ASMJIT_INLINE_NODEBUG bool operator!=(const Iterator& other) const noexcept { return value != other.value; } }; - inline Iterator begin() const noexcept { return Iterator{ValueType(from)}; } - inline Iterator end() const noexcept { return Iterator{ValueType(to) + 1}; } + ASMJIT_INLINE_NODEBUG Iterator begin() const noexcept { return Iterator{ValueType(from)}; } + ASMJIT_INLINE_NODEBUG Iterator end() const noexcept { return Iterator{ValueType(to) + 1}; } }; // Support - BitCast @@ -120,7 +120,7 @@ struct EnumValues { namespace Internal { template union BitCastUnion { - inline BitCastUnion(SrcT src) noexcept : src(src) {} + ASMJIT_INLINE_NODEBUG BitCastUnion(SrcT src) noexcept : src(src) {} SrcT src; DstT dst; }; @@ -131,7 +131,7 @@ namespace Internal { //! //! Useful to bit-cast between integers and floating points. template -static inline Dst bitCast(const Src& x) noexcept { return Internal::BitCastUnion(x).dst; } +static ASMJIT_INLINE_NODEBUG Dst bitCast(const Src& x) noexcept { return Internal::BitCastUnion(x).dst; } // Support - BitOps // ================ @@ -140,62 +140,62 @@ static inline Dst bitCast(const Src& x) noexcept { return Internal::BitCastUnion typedef Internal::StdInt::Type BitWord; template -static constexpr uint32_t bitSizeOf() noexcept { return uint32_t(sizeof(T) * 8u); } +static ASMJIT_INLINE_NODEBUG constexpr uint32_t bitSizeOf() noexcept { return uint32_t(sizeof(T) * 8u); } //! Number of bits stored in a single `BitWord`. static constexpr uint32_t kBitWordSizeInBits = bitSizeOf(); //! Returns `0 - x` in a safe way (no undefined behavior), works for unsigned numbers as well. template -static constexpr T neg(const T& x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr T neg(const T& x) noexcept { typedef typename std::make_unsigned::type U; return T(U(0) - U(x)); } template -static constexpr T allOnes() noexcept { return neg(T(1)); } +static ASMJIT_INLINE_NODEBUG constexpr T allOnes() noexcept { return neg(T(1)); } //! Returns `x << y` (shift left logical) by explicitly casting `x` to an unsigned type and back. template -static constexpr X shl(const X& x, const Y& y) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr X shl(const X& x, const Y& y) noexcept { typedef typename std::make_unsigned::type U; return X(U(x) << y); } //! Returns `x >> y` (shift right logical) by explicitly casting `x` to an unsigned type and back. template -static constexpr X shr(const X& x, const Y& y) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr X shr(const X& x, const Y& y) noexcept { typedef typename std::make_unsigned::type U; return X(U(x) >> y); } //! Returns `x >> y` (shift right arithmetic) by explicitly casting `x` to a signed type and back. template -static constexpr X sar(const X& x, const Y& y) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr X sar(const X& x, const Y& y) noexcept { typedef typename std::make_signed::type S; return X(S(x) >> y); } template -static constexpr X ror(const X& x, const Y& y) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr X ror(const X& x, const Y& y) noexcept { typedef typename std::make_unsigned::type U; - return X((U(x) >> y) | (U(x) << (bitSizeOf() - y))); + return X((U(x) >> y) | (U(x) << (bitSizeOf() - U(y)))); } //! Returns `x | (x >> y)` - helper used by some bit manipulation helpers. template -static constexpr X or_shr(const X& x, const Y& y) noexcept { return X(x | shr(x, y)); } +static ASMJIT_INLINE_NODEBUG constexpr X or_shr(const X& x, const Y& y) noexcept { return X(x | shr(x, y)); } //! Returns `x & -x` - extracts lowest set isolated bit (like BLSI instruction). template -static constexpr T blsi(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr T blsi(T x) noexcept { typedef typename std::make_unsigned::type U; return T(U(x) & neg(U(x))); } //! Tests whether the given value `x` has `n`th bit set. template -static constexpr bool bitTest(T x, IndexT n) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool bitTest(T x, IndexT n) noexcept { typedef typename std::make_unsigned::type U; return (U(x) & (U(1) << asStdInt(n))) != 0; } @@ -203,7 +203,7 @@ static constexpr bool bitTest(T x, IndexT n) noexcept { // Tests whether the given `value` is a consecutive mask of bits that starts at // the least significant bit. template -static inline constexpr bool isLsbMask(const T& value) { +static ASMJIT_INLINE_NODEBUG constexpr bool isLsbMask(const T& value) { typedef typename std::make_unsigned::type U; return value && ((U(value) + 1u) & U(value)) == 0; } @@ -214,14 +214,14 @@ static inline constexpr bool isLsbMask(const T& value) { // This function is similar to \ref isLsbMask(), but the mask doesn't have to // start at a least significant bit. template -static inline constexpr bool isConsecutiveMask(const T& value) { +static ASMJIT_INLINE_NODEBUG constexpr bool isConsecutiveMask(const T& value) { typedef typename std::make_unsigned::type U; return value && isLsbMask((U(value) - 1u) | U(value)); } //! Generates a trailing bit-mask that has `n` least significant (trailing) bits set. template -static constexpr T lsbMask(const CountT& n) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr T lsbMask(const CountT& n) noexcept { typedef typename std::make_unsigned::type U; return (sizeof(U) < sizeof(uintptr_t)) // Prevent undefined behavior by using a larger type than T. @@ -230,9 +230,9 @@ static constexpr T lsbMask(const CountT& n) noexcept { : n ? T(shr(allOnes(), bitSizeOf() - size_t(n))) : T(0); } -//! Generats a leading bit-mask that has `n` most significant (leading) bits set. +//! Generates a leading bit-mask that has `n` most significant (leading) bits set. template -static constexpr T msbMask(const CountT& n) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr T msbMask(const CountT& n) noexcept { typedef typename std::make_unsigned::type U; return (sizeof(U) < sizeof(uintptr_t)) // Prevent undefined behavior by using a larger type than T. @@ -243,15 +243,15 @@ static constexpr T msbMask(const CountT& n) noexcept { //! Returns a bit-mask that has `x` bit set. template -static constexpr uint32_t bitMask(const Index& x) noexcept { return (1u << asUInt(x)); } +static ASMJIT_INLINE_NODEBUG constexpr uint32_t bitMask(const Index& x) noexcept { return (1u << asUInt(x)); } //! Returns a bit-mask that has `x` bit set (multiple arguments). template -static constexpr uint32_t bitMask(const Index& x, Args... args) noexcept { return bitMask(x) | bitMask(args...); } +static ASMJIT_INLINE_NODEBUG constexpr uint32_t bitMask(const Index& x, Args... args) noexcept { return bitMask(x) | bitMask(args...); } //! Converts a boolean value `b` to zero or full mask (all bits set). template -static constexpr DstT bitMaskFromBool(SrcT b) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr DstT bitMaskFromBool(SrcT b) noexcept { typedef typename std::make_unsigned::type U; return DstT(U(0) - U(b)); } @@ -263,19 +263,19 @@ static inline constexpr bool test(A a, B b) noexcept { return (asUInt(a) & asUIn //! \cond namespace Internal { // Fills all trailing bits right from the first most significant bit set. - static constexpr uint8_t fillTrailingBitsImpl(uint8_t x) noexcept { return or_shr(or_shr(or_shr(x, 1), 2), 4); } + static ASMJIT_INLINE_NODEBUG constexpr uint8_t fillTrailingBitsImpl(uint8_t x) noexcept { return or_shr(or_shr(or_shr(x, 1), 2), 4); } // Fills all trailing bits right from the first most significant bit set. - static constexpr uint16_t fillTrailingBitsImpl(uint16_t x) noexcept { return or_shr(or_shr(or_shr(or_shr(x, 1), 2), 4), 8); } + static ASMJIT_INLINE_NODEBUG constexpr uint16_t fillTrailingBitsImpl(uint16_t x) noexcept { return or_shr(or_shr(or_shr(or_shr(x, 1), 2), 4), 8); } // Fills all trailing bits right from the first most significant bit set. - static constexpr uint32_t fillTrailingBitsImpl(uint32_t x) noexcept { return or_shr(or_shr(or_shr(or_shr(or_shr(x, 1), 2), 4), 8), 16); } + static ASMJIT_INLINE_NODEBUG constexpr uint32_t fillTrailingBitsImpl(uint32_t x) noexcept { return or_shr(or_shr(or_shr(or_shr(or_shr(x, 1), 2), 4), 8), 16); } // Fills all trailing bits right from the first most significant bit set. - static constexpr uint64_t fillTrailingBitsImpl(uint64_t x) noexcept { return or_shr(or_shr(or_shr(or_shr(or_shr(or_shr(x, 1), 2), 4), 8), 16), 32); } + static ASMJIT_INLINE_NODEBUG constexpr uint64_t fillTrailingBitsImpl(uint64_t x) noexcept { return or_shr(or_shr(or_shr(or_shr(or_shr(or_shr(x, 1), 2), 4), 8), 16), 32); } } //! \endcond // Fills all trailing bits right from the first most significant bit set. template -static constexpr T fillTrailingBits(const T& x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr T fillTrailingBits(const T& x) noexcept { typedef typename std::make_unsigned::type U; return T(Internal::fillTrailingBitsImpl(U(x))); } @@ -292,59 +292,59 @@ struct BitScanData { T x; uint32_t n; }; template struct BitScanCalc { - static constexpr BitScanData advanceLeft(const BitScanData& data, uint32_t n) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr BitScanData advanceLeft(const BitScanData& data, uint32_t n) noexcept { return BitScanData { data.x << n, data.n + n }; } - static constexpr BitScanData advanceRight(const BitScanData& data, uint32_t n) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr BitScanData advanceRight(const BitScanData& data, uint32_t n) noexcept { return BitScanData { data.x >> n, data.n + n }; } - static constexpr BitScanData clz(const BitScanData& data) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr BitScanData clz(const BitScanData& data) noexcept { return BitScanCalc::clz(advanceLeft(data, data.x & (allOnes() << (bitSizeOf() - N)) ? uint32_t(0) : N)); } - static constexpr BitScanData ctz(const BitScanData& data) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr BitScanData ctz(const BitScanData& data) noexcept { return BitScanCalc::ctz(advanceRight(data, data.x & (allOnes() >> (bitSizeOf() - N)) ? uint32_t(0) : N)); } }; template struct BitScanCalc { - static constexpr BitScanData clz(const BitScanData& ctx) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr BitScanData clz(const BitScanData& ctx) noexcept { return BitScanData { 0, ctx.n - uint32_t(ctx.x >> (bitSizeOf() - 1)) }; } - static constexpr BitScanData ctz(const BitScanData& ctx) noexcept { + static ASMJIT_INLINE_NODEBUG constexpr BitScanData ctz(const BitScanData& ctx) noexcept { return BitScanData { 0, ctx.n - uint32_t(ctx.x & 0x1) }; } }; template -constexpr uint32_t clzFallback(const T& x) noexcept { +ASMJIT_INLINE_NODEBUG constexpr uint32_t clzFallback(const T& x) noexcept { return BitScanCalc() / 2u>::clz(BitScanData{x, 1}).n; } template -constexpr uint32_t ctzFallback(const T& x) noexcept { +ASMJIT_INLINE_NODEBUG constexpr uint32_t ctzFallback(const T& x) noexcept { return BitScanCalc() / 2u>::ctz(BitScanData{x, 1}).n; } -template inline uint32_t clzImpl(const T& x) noexcept { return clzFallback(asUInt(x)); } -template inline uint32_t ctzImpl(const T& x) noexcept { return ctzFallback(asUInt(x)); } +template ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const T& x) noexcept { return clzFallback(asUInt(x)); } +template ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const T& x) noexcept { return ctzFallback(asUInt(x)); } #if !defined(ASMJIT_NO_INTRINSICS) # if defined(__GNUC__) -template<> inline uint32_t clzImpl(const uint32_t& x) noexcept { return uint32_t(__builtin_clz(x)); } -template<> inline uint32_t clzImpl(const uint64_t& x) noexcept { return uint32_t(__builtin_clzll(x)); } -template<> inline uint32_t ctzImpl(const uint32_t& x) noexcept { return uint32_t(__builtin_ctz(x)); } -template<> inline uint32_t ctzImpl(const uint64_t& x) noexcept { return uint32_t(__builtin_ctzll(x)); } +template<> ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const uint32_t& x) noexcept { return uint32_t(__builtin_clz(x)); } +template<> ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const uint64_t& x) noexcept { return uint32_t(__builtin_clzll(x)); } +template<> ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const uint32_t& x) noexcept { return uint32_t(__builtin_ctz(x)); } +template<> ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const uint64_t& x) noexcept { return uint32_t(__builtin_ctzll(x)); } # elif defined(_MSC_VER) -template<> inline uint32_t clzImpl(const uint32_t& x) noexcept { unsigned long i; _BitScanReverse(&i, x); return uint32_t(i ^ 31); } -template<> inline uint32_t ctzImpl(const uint32_t& x) noexcept { unsigned long i; _BitScanForward(&i, x); return uint32_t(i); } +template<> ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const uint32_t& x) noexcept { unsigned long i; _BitScanReverse(&i, x); return uint32_t(i ^ 31); } +template<> ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const uint32_t& x) noexcept { unsigned long i; _BitScanForward(&i, x); return uint32_t(i); } # if ASMJIT_ARCH_X86 == 64 || ASMJIT_ARCH_ARM == 64 -template<> inline uint32_t clzImpl(const uint64_t& x) noexcept { unsigned long i; _BitScanReverse64(&i, x); return uint32_t(i ^ 63); } -template<> inline uint32_t ctzImpl(const uint64_t& x) noexcept { unsigned long i; _BitScanForward64(&i, x); return uint32_t(i); } +template<> ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const uint64_t& x) noexcept { unsigned long i; _BitScanReverse64(&i, x); return uint32_t(i ^ 63); } +template<> ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const uint64_t& x) noexcept { unsigned long i; _BitScanForward64(&i, x); return uint32_t(i); } # endif # endif #endif @@ -357,13 +357,13 @@ template<> inline uint32_t ctzImpl(const uint64_t& x) noexcept { unsigned long i //! //! \note The input MUST NOT be zero, otherwise the result is undefined. template -static inline uint32_t clz(T x) noexcept { return Internal::clzImpl(asUInt(x)); } +static ASMJIT_INLINE_NODEBUG uint32_t clz(T x) noexcept { return Internal::clzImpl(asUInt(x)); } //! Count trailing zeros in `x` (returns a position of a first bit set in `x`). //! //! \note The input MUST NOT be zero, otherwise the result is undefined. template -static inline uint32_t ctz(T x) noexcept { return Internal::ctzImpl(asUInt(x)); } +static ASMJIT_INLINE_NODEBUG uint32_t ctz(T x) noexcept { return Internal::ctzImpl(asUInt(x)); } template struct ConstCTZ { @@ -450,49 +450,48 @@ struct ConstCTZ { //! \cond namespace Internal { - static inline uint32_t constPopcntImpl(uint32_t x) noexcept { + static ASMJIT_INLINE_NODEBUG uint32_t constPopcntImpl(uint32_t x) noexcept { x = x - ((x >> 1) & 0x55555555u); x = (x & 0x33333333u) + ((x >> 2) & 0x33333333u); return (((x + (x >> 4)) & 0x0F0F0F0Fu) * 0x01010101u) >> 24; } - static inline uint32_t constPopcntImpl(uint64_t x) noexcept { - if (ASMJIT_ARCH_BITS >= 64) { - x = x - ((x >> 1) & 0x5555555555555555u); - x = (x & 0x3333333333333333u) + ((x >> 2) & 0x3333333333333333u); - return uint32_t((((x + (x >> 4)) & 0x0F0F0F0F0F0F0F0Fu) * 0x0101010101010101u) >> 56); - } - else { - return constPopcntImpl(uint32_t(x >> 32)) + - constPopcntImpl(uint32_t(x & 0xFFFFFFFFu)); - } + static ASMJIT_INLINE_NODEBUG uint32_t constPopcntImpl(uint64_t x) noexcept { +#if ASMJIT_ARCH_BITS >= 64 + x = x - ((x >> 1) & 0x5555555555555555u); + x = (x & 0x3333333333333333u) + ((x >> 2) & 0x3333333333333333u); + return uint32_t((((x + (x >> 4)) & 0x0F0F0F0F0F0F0F0Fu) * 0x0101010101010101u) >> 56); +#else + return constPopcntImpl(uint32_t(x >> 32)) + + constPopcntImpl(uint32_t(x & 0xFFFFFFFFu)); +#endif } - static inline uint32_t popcntImpl(uint32_t x) noexcept { - #if defined(__GNUC__) + static ASMJIT_INLINE_NODEBUG uint32_t popcntImpl(uint32_t x) noexcept { +#if defined(__GNUC__) return uint32_t(__builtin_popcount(x)); - #else +#else return constPopcntImpl(asUInt(x)); - #endif +#endif } - static inline uint32_t popcntImpl(uint64_t x) noexcept { - #if defined(__GNUC__) + static ASMJIT_INLINE_NODEBUG uint32_t popcntImpl(uint64_t x) noexcept { +#if defined(__GNUC__) return uint32_t(__builtin_popcountll(x)); - #else +#else return constPopcntImpl(asUInt(x)); - #endif +#endif } } //! \endcond //! Calculates count of bits in `x`. template -static inline uint32_t popcnt(T x) noexcept { return Internal::popcntImpl(asUInt(x)); } +static ASMJIT_INLINE_NODEBUG uint32_t popcnt(T x) noexcept { return Internal::popcntImpl(asUInt(x)); } //! Calculates count of bits in `x` (useful in constant expressions). template -static inline uint32_t constPopcnt(T x) noexcept { return Internal::constPopcntImpl(asUInt(x)); } +static ASMJIT_INLINE_NODEBUG uint32_t constPopcnt(T x) noexcept { return Internal::constPopcntImpl(asUInt(x)); } // Support - Min/Max // ================= @@ -502,16 +501,16 @@ static inline uint32_t constPopcnt(T x) noexcept { return Internal::constPopcntI // a reference to `a` or `b` but it's a new value instead. template -static constexpr T min(const T& a, const T& b) noexcept { return b < a ? b : a; } +static ASMJIT_INLINE_NODEBUG constexpr T min(const T& a, const T& b) noexcept { return b < a ? b : a; } template -static constexpr T min(const T& a, const T& b, Args&&... args) noexcept { return min(min(a, b), std::forward(args)...); } +static ASMJIT_INLINE_NODEBUG constexpr T min(const T& a, const T& b, Args&&... args) noexcept { return min(min(a, b), std::forward(args)...); } template -static constexpr T max(const T& a, const T& b) noexcept { return a < b ? b : a; } +static ASMJIT_INLINE_NODEBUG constexpr T max(const T& a, const T& b) noexcept { return a < b ? b : a; } template -static constexpr T max(const T& a, const T& b, Args&&... args) noexcept { return max(max(a, b), std::forward(args)...); } +static ASMJIT_INLINE_NODEBUG constexpr T max(const T& a, const T& b, Args&&... args) noexcept { return max(max(a, b), std::forward(args)...); } // Support - Immediate Helpers // =========================== @@ -519,22 +518,22 @@ static constexpr T max(const T& a, const T& b, Args&&... args) noexcept { return namespace Internal { template struct ImmConv { - static inline int64_t fromT(const T& x) noexcept { return int64_t(x); } - static inline T toT(int64_t x) noexcept { return T(uint64_t(x) & Support::allOnes::type>()); } + static ASMJIT_INLINE_NODEBUG int64_t fromT(const T& x) noexcept { return int64_t(x); } + static ASMJIT_INLINE_NODEBUG T toT(int64_t x) noexcept { return T(uint64_t(x) & Support::allOnes::type>()); } }; template struct ImmConv { - static inline int64_t fromT(const T& x) noexcept { return int64_t(bitCast(double(x))); } - static inline T toT(int64_t x) noexcept { return T(bitCast(x)); } + static ASMJIT_INLINE_NODEBUG int64_t fromT(const T& x) noexcept { return int64_t(bitCast(double(x))); } + static ASMJIT_INLINE_NODEBUG T toT(int64_t x) noexcept { return T(bitCast(x)); } }; } template -static inline int64_t immediateFromT(const T& x) noexcept { return Internal::ImmConv::value>::fromT(x); } +static ASMJIT_INLINE_NODEBUG int64_t immediateFromT(const T& x) noexcept { return Internal::ImmConv::value>::fromT(x); } template -static inline T immediateToT(int64_t x) noexcept { return Internal::ImmConv::value>::toT(x); } +static ASMJIT_INLINE_NODEBUG T immediateToT(int64_t x) noexcept { return Internal::ImmConv::value>::toT(x); } // Support - Overflow Arithmetic // ============================= @@ -596,9 +595,9 @@ namespace Internal { template inline T subOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return subOverflowFallback(x, y, of); } template inline T mulOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return mulOverflowFallback(x, y, of); } - #if defined(__GNUC__) && !defined(ASMJIT_NO_INTRINSICS) - #if defined(__clang__) || __GNUC__ >= 5 - #define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, RESULT_T, BUILTIN) \ +#if defined(__GNUC__) && !defined(ASMJIT_NO_INTRINSICS) +#if defined(__clang__) || __GNUC__ >= 5 +#define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, RESULT_T, BUILTIN) \ template<> \ inline T FUNC(const T& x, const T& y, FastUInt8* of) noexcept { \ RESULT_T result; \ @@ -617,13 +616,13 @@ namespace Internal { ASMJIT_ARITH_OVERFLOW_SPECIALIZE(mulOverflowImpl, uint32_t, unsigned int , __builtin_umul_overflow ) ASMJIT_ARITH_OVERFLOW_SPECIALIZE(mulOverflowImpl, int64_t , long long , __builtin_smulll_overflow) ASMJIT_ARITH_OVERFLOW_SPECIALIZE(mulOverflowImpl, uint64_t, unsigned long long, __builtin_umulll_overflow) - #undef ASMJIT_ARITH_OVERFLOW_SPECIALIZE - #endif - #endif +#undef ASMJIT_ARITH_OVERFLOW_SPECIALIZE +#endif +#endif // There is a bug in MSVC that makes these specializations unusable, maybe in the future... - #if defined(_MSC_VER) && 0 - #define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, ALT_T, BUILTIN) \ +#if defined(_MSC_VER) && 0 +#define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, ALT_T, BUILTIN) \ template<> \ inline T FUNC(T x, T y, FastUInt8* of) noexcept { \ ALT_T result; \ @@ -632,12 +631,12 @@ namespace Internal { } ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, uint32_t, unsigned int , _addcarry_u32 ) ASMJIT_ARITH_OVERFLOW_SPECIALIZE(subOverflowImpl, uint32_t, unsigned int , _subborrow_u32) - #if ARCH_BITS >= 64 +#if ARCH_BITS >= 64 ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, uint64_t, unsigned __int64 , _addcarry_u64 ) ASMJIT_ARITH_OVERFLOW_SPECIALIZE(subOverflowImpl, uint64_t, unsigned __int64 , _subborrow_u64) - #endif - #undef ASMJIT_ARITH_OVERFLOW_SPECIALIZE - #endif +#endif +#undef ASMJIT_ARITH_OVERFLOW_SPECIALIZE +#endif } // {Internal} //! \endcond @@ -654,26 +653,26 @@ static inline T mulOverflow(const T& x, const T& y, FastUInt8* of) noexcept { re // =================== template -static constexpr bool isAligned(X base, Y alignment) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isAligned(X base, Y alignment) noexcept { typedef typename Internal::StdInt::Type U; return ((U)base % (U)alignment) == 0; } //! Tests whether the `x` is a power of two (only one bit is set). template -static constexpr bool isPowerOf2(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isPowerOf2(T x) noexcept { typedef typename std::make_unsigned::type U; return x && !(U(x) & (U(x) - U(1))); } template -static constexpr X alignUp(X x, Y alignment) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr X alignUp(X x, Y alignment) noexcept { typedef typename Internal::StdInt::Type U; return (X)( ((U)x + ((U)(alignment) - 1u)) & ~((U)(alignment) - 1u) ); } template -static constexpr T alignUpPowerOf2(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr T alignUpPowerOf2(T x) noexcept { typedef typename Internal::StdInt::Type U; return (T)(fillTrailingBits(U(x) - 1u) + 1u); } @@ -681,13 +680,13 @@ static constexpr T alignUpPowerOf2(T x) noexcept { //! Returns either zero or a positive difference between `base` and `base` when //! aligned to `alignment`. template -static constexpr typename Internal::StdInt::Type alignUpDiff(X base, Y alignment) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr typename Internal::StdInt::Type alignUpDiff(X base, Y alignment) noexcept { typedef typename Internal::StdInt::Type U; return alignUp(U(base), alignment) - U(base); } template -static constexpr X alignDown(X x, Y alignment) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr X alignDown(X x, Y alignment) noexcept { typedef typename Internal::StdInt::Type U; return (X)( (U)x & ~((U)(alignment) - 1u) ); } @@ -699,7 +698,7 @@ static constexpr X alignDown(X x, Y alignment) noexcept { //! granularized by `granularity`. This function can be used to calculate //! the number of BitWords to represent N bits, for example. template -static constexpr X numGranularized(X base, Y granularity) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr X numGranularized(X base, Y granularity) noexcept { typedef typename Internal::StdInt::Type U; return X((U(base) + U(granularity) - 1) / U(granularity)); } @@ -709,7 +708,7 @@ static constexpr X numGranularized(X base, Y granularity) noexcept { //! Checks whether `x` is greater than or equal to `a` and lesser than or equal to `b`. template -static constexpr bool isBetween(const T& x, const T& a, const T& b) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isBetween(const T& x, const T& a, const T& b) noexcept { return x >= a && x <= b; } @@ -718,7 +717,7 @@ static constexpr bool isBetween(const T& x, const T& a, const T& b) noexcept { //! Checks whether the given integer `x` can be casted to a 4-bit signed integer. template -static constexpr bool isInt4(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isInt4(T x) noexcept { typedef typename std::make_signed::type S; typedef typename std::make_unsigned::type U; @@ -727,7 +726,7 @@ static constexpr bool isInt4(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 7-bit signed integer. template -static constexpr bool isInt7(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isInt7(T x) noexcept { typedef typename std::make_signed::type S; typedef typename std::make_unsigned::type U; @@ -736,7 +735,7 @@ static constexpr bool isInt7(T x) noexcept { //! Checks whether the given integer `x` can be casted to an 8-bit signed integer. template -static constexpr bool isInt8(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isInt8(T x) noexcept { typedef typename std::make_signed::type S; typedef typename std::make_unsigned::type U; @@ -745,7 +744,7 @@ static constexpr bool isInt8(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 9-bit signed integer. template -static constexpr bool isInt9(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isInt9(T x) noexcept { typedef typename std::make_signed::type S; typedef typename std::make_unsigned::type U; @@ -755,7 +754,7 @@ static constexpr bool isInt9(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 10-bit signed integer. template -static constexpr bool isInt10(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isInt10(T x) noexcept { typedef typename std::make_signed::type S; typedef typename std::make_unsigned::type U; @@ -765,7 +764,7 @@ static constexpr bool isInt10(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 16-bit signed integer. template -static constexpr bool isInt16(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isInt16(T x) noexcept { typedef typename std::make_signed::type S; typedef typename std::make_unsigned::type U; @@ -775,7 +774,7 @@ static constexpr bool isInt16(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 32-bit signed integer. template -static constexpr bool isInt32(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isInt32(T x) noexcept { typedef typename std::make_signed::type S; typedef typename std::make_unsigned::type U; @@ -785,7 +784,7 @@ static constexpr bool isInt32(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 4-bit unsigned integer. template -static constexpr bool isUInt4(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isUInt4(T x) noexcept { typedef typename std::make_unsigned::type U; return std::is_signed::value ? x >= T(0) && x <= T(15) @@ -794,7 +793,7 @@ static constexpr bool isUInt4(T x) noexcept { //! Checks whether the given integer `x` can be casted to an 8-bit unsigned integer. template -static constexpr bool isUInt8(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isUInt8(T x) noexcept { typedef typename std::make_unsigned::type U; return std::is_signed::value ? (sizeof(T) <= 1 || T(x) <= T(255)) && x >= T(0) @@ -803,7 +802,7 @@ static constexpr bool isUInt8(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 12-bit unsigned integer (ARM specific). template -static constexpr bool isUInt12(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isUInt12(T x) noexcept { typedef typename std::make_unsigned::type U; return std::is_signed::value ? (sizeof(T) <= 1 || T(x) <= T(4095)) && x >= T(0) @@ -812,7 +811,7 @@ static constexpr bool isUInt12(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 16-bit unsigned integer. template -static constexpr bool isUInt16(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isUInt16(T x) noexcept { typedef typename std::make_unsigned::type U; return std::is_signed::value ? (sizeof(T) <= 2 || T(x) <= T(65535)) && x >= T(0) @@ -821,7 +820,7 @@ static constexpr bool isUInt16(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 32-bit unsigned integer. template -static constexpr bool isUInt32(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isUInt32(T x) noexcept { typedef typename std::make_unsigned::type U; return std::is_signed::value ? (sizeof(T) <= 4 || T(x) <= T(4294967295u)) && x >= T(0) @@ -830,16 +829,16 @@ static constexpr bool isUInt32(T x) noexcept { //! Checks whether the given integer `x` can be casted to a 32-bit unsigned integer. template -static constexpr bool isIntOrUInt32(T x) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isIntOrUInt32(T x) noexcept { return sizeof(T) <= 4 ? true : (uint32_t(uint64_t(x) >> 32) + 1u) <= 1u; } -static bool inline isEncodableOffset32(int32_t offset, uint32_t nBits) noexcept { +static bool ASMJIT_INLINE_NODEBUG isEncodableOffset32(int32_t offset, uint32_t nBits) noexcept { uint32_t nRev = 32 - nBits; return Support::sar(Support::shl(offset, nRev), nRev) == offset; } -static bool inline isEncodableOffset64(int64_t offset, uint32_t nBits) noexcept { +static bool ASMJIT_INLINE_NODEBUG isEncodableOffset64(int64_t offset, uint32_t nBits) noexcept { uint32_t nRev = 64 - nBits; return Support::sar(Support::shl(offset, nRev), nRev) == offset; } @@ -847,15 +846,15 @@ static bool inline isEncodableOffset64(int64_t offset, uint32_t nBits) noexcept // Support - ByteSwap // ================== -static inline uint16_t byteswap16(uint16_t x) noexcept { +static ASMJIT_INLINE_NODEBUG uint16_t byteswap16(uint16_t x) noexcept { return uint16_t(((x >> 8) & 0xFFu) | ((x & 0xFFu) << 8)); } -static inline uint32_t byteswap32(uint32_t x) noexcept { +static ASMJIT_INLINE_NODEBUG uint32_t byteswap32(uint32_t x) noexcept { return (x << 24) | (x >> 24) | ((x << 8) & 0x00FF0000u) | ((x >> 8) & 0x0000FF00); } -static inline uint64_t byteswap64(uint64_t x) noexcept { +static ASMJIT_INLINE_NODEBUG uint64_t byteswap64(uint64_t x) noexcept { #if (defined(__GNUC__) || defined(__clang__)) && !defined(ASMJIT_NO_INTRINSICS) return uint64_t(__builtin_bswap64(uint64_t(x))); #elif defined(_MSC_VER) && !defined(ASMJIT_NO_INTRINSICS) @@ -870,20 +869,20 @@ static inline uint64_t byteswap64(uint64_t x) noexcept { // =========================== //! Pack four 8-bit integer into a 32-bit integer as it is an array of `{b0,b1,b2,b3}`. -static constexpr uint32_t bytepack32_4x8(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr uint32_t bytepack32_4x8(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept { return ASMJIT_ARCH_LE ? (a | (b << 8) | (c << 16) | (d << 24)) : (d | (c << 8) | (b << 16) | (a << 24)); } template -static constexpr uint32_t unpackU32At0(T x) noexcept { return ASMJIT_ARCH_LE ? uint32_t(uint64_t(x) & 0xFFFFFFFFu) : uint32_t(uint64_t(x) >> 32); } +static ASMJIT_INLINE_NODEBUG constexpr uint32_t unpackU32At0(T x) noexcept { return ASMJIT_ARCH_LE ? uint32_t(uint64_t(x) & 0xFFFFFFFFu) : uint32_t(uint64_t(x) >> 32); } template -static constexpr uint32_t unpackU32At1(T x) noexcept { return ASMJIT_ARCH_BE ? uint32_t(uint64_t(x) & 0xFFFFFFFFu) : uint32_t(uint64_t(x) >> 32); } +static ASMJIT_INLINE_NODEBUG constexpr uint32_t unpackU32At1(T x) noexcept { return ASMJIT_ARCH_BE ? uint32_t(uint64_t(x) & 0xFFFFFFFFu) : uint32_t(uint64_t(x) >> 32); } // Support - Position of byte (in bit-shift) // ========================================= -static inline uint32_t byteShiftOfDWordStruct(uint32_t index) noexcept { +static ASMJIT_INLINE_NODEBUG uint32_t byteShiftOfDWordStruct(uint32_t index) noexcept { return ASMJIT_ARCH_LE ? index * 8 : (uint32_t(sizeof(uint32_t)) - 1u - index) * 8; } @@ -891,31 +890,31 @@ static inline uint32_t byteShiftOfDWordStruct(uint32_t index) noexcept { // ========================== template -static constexpr T asciiToLower(T c) noexcept { return T(c ^ T(T(c >= T('A') && c <= T('Z')) << 5)); } +static ASMJIT_INLINE_NODEBUG constexpr T asciiToLower(T c) noexcept { return T(c ^ T(T(c >= T('A') && c <= T('Z')) << 5)); } template -static constexpr T asciiToUpper(T c) noexcept { return T(c ^ T(T(c >= T('a') && c <= T('z')) << 5)); } +static ASMJIT_INLINE_NODEBUG constexpr T asciiToUpper(T c) noexcept { return T(c ^ T(T(c >= T('a') && c <= T('z')) << 5)); } -static ASMJIT_FORCE_INLINE size_t strLen(const char* s, size_t maxSize) noexcept { +static ASMJIT_INLINE_NODEBUG size_t strLen(const char* s, size_t maxSize) noexcept { size_t i = 0; while (i < maxSize && s[i] != '\0') i++; return i; } -static constexpr uint32_t hashRound(uint32_t hash, uint32_t c) noexcept { return hash * 65599 + c; } +static ASMJIT_INLINE_NODEBUG constexpr uint32_t hashRound(uint32_t hash, uint32_t c) noexcept { return hash * 65599 + c; } // Gets a hash of the given string `data` of size `size`. Size must be valid // as this function doesn't check for a null terminator and allows it in the // middle of the string. -static inline uint32_t hashString(const char* data, size_t size) noexcept { +static ASMJIT_INLINE_NODEBUG uint32_t hashString(const char* data, size_t size) noexcept { uint32_t hashCode = 0; for (uint32_t i = 0; i < size; i++) hashCode = hashRound(hashCode, uint8_t(data[i])); return hashCode; } -static ASMJIT_FORCE_INLINE const char* findPackedString(const char* p, uint32_t id) noexcept { +static ASMJIT_INLINE_NODEBUG const char* findPackedString(const char* p, uint32_t id) noexcept { uint32_t i = 0; while (i < id) { while (p[0]) @@ -926,68 +925,68 @@ static ASMJIT_FORCE_INLINE const char* findPackedString(const char* p, uint32_t return p; } -//! Compares two instruction names. -//! -//! `a` is a null terminated instruction name from arch-specific `nameData[]` -//! table. `b` is a possibly non-null terminated instruction name passed to -//! `InstAPI::stringToInstId()`. -static ASMJIT_FORCE_INLINE int cmpInstName(const char* a, const char* b, size_t size) noexcept { +//! Compares two string views. +static ASMJIT_FORCE_INLINE int compareStringViews(const char* aData, size_t aSize, const char* bData, size_t bSize) noexcept { + size_t size = Support::min(aSize, bSize); + for (size_t i = 0; i < size; i++) { - int c = int(uint8_t(a[i])) - int(uint8_t(b[i])); - if (c != 0) return c; + int c = int(uint8_t(aData[i])) - int(uint8_t(bData[i])); + if (c != 0) + return c; } - return int(uint8_t(a[size])); + + return int(aSize) - int(bSize); } // Support - Memory Read Access - 8 Bits // ===================================== -static inline uint8_t readU8(const void* p) noexcept { return static_cast(p)[0]; } -static inline int8_t readI8(const void* p) noexcept { return static_cast(p)[0]; } +static ASMJIT_INLINE_NODEBUG uint8_t readU8(const void* p) noexcept { return static_cast(p)[0]; } +static ASMJIT_INLINE_NODEBUG int8_t readI8(const void* p) noexcept { return static_cast(p)[0]; } // Support - Memory Read Access - 16 Bits // ====================================== template -static inline uint16_t readU16x(const void* p) noexcept { +static ASMJIT_INLINE_NODEBUG uint16_t readU16x(const void* p) noexcept { typedef typename Internal::AliasedUInt::T U16AlignedToN; uint16_t x = static_cast(p)[0]; return BO == ByteOrder::kNative ? x : byteswap16(x); } template -static inline uint16_t readU16u(const void* p) noexcept { return readU16x(p); } +static ASMJIT_INLINE_NODEBUG uint16_t readU16u(const void* p) noexcept { return readU16x(p); } template -static inline uint16_t readU16uLE(const void* p) noexcept { return readU16x(p); } +static ASMJIT_INLINE_NODEBUG uint16_t readU16uLE(const void* p) noexcept { return readU16x(p); } template -static inline uint16_t readU16uBE(const void* p) noexcept { return readU16x(p); } +static ASMJIT_INLINE_NODEBUG uint16_t readU16uBE(const void* p) noexcept { return readU16x(p); } -static inline uint16_t readU16a(const void* p) noexcept { return readU16x(p); } -static inline uint16_t readU16aLE(const void* p) noexcept { return readU16x(p); } -static inline uint16_t readU16aBE(const void* p) noexcept { return readU16x(p); } +static ASMJIT_INLINE_NODEBUG uint16_t readU16a(const void* p) noexcept { return readU16x(p); } +static ASMJIT_INLINE_NODEBUG uint16_t readU16aLE(const void* p) noexcept { return readU16x(p); } +static ASMJIT_INLINE_NODEBUG uint16_t readU16aBE(const void* p) noexcept { return readU16x(p); } template -static inline int16_t readI16x(const void* p) noexcept { return int16_t(readU16x(p)); } +static ASMJIT_INLINE_NODEBUG int16_t readI16x(const void* p) noexcept { return int16_t(readU16x(p)); } template -static inline int16_t readI16u(const void* p) noexcept { return int16_t(readU16x(p)); } +static ASMJIT_INLINE_NODEBUG int16_t readI16u(const void* p) noexcept { return int16_t(readU16x(p)); } template -static inline int16_t readI16uLE(const void* p) noexcept { return int16_t(readU16x(p)); } +static ASMJIT_INLINE_NODEBUG int16_t readI16uLE(const void* p) noexcept { return int16_t(readU16x(p)); } template -static inline int16_t readI16uBE(const void* p) noexcept { return int16_t(readU16x(p)); } +static ASMJIT_INLINE_NODEBUG int16_t readI16uBE(const void* p) noexcept { return int16_t(readU16x(p)); } -static inline int16_t readI16a(const void* p) noexcept { return int16_t(readU16x(p)); } -static inline int16_t readI16aLE(const void* p) noexcept { return int16_t(readU16x(p)); } -static inline int16_t readI16aBE(const void* p) noexcept { return int16_t(readU16x(p)); } +static ASMJIT_INLINE_NODEBUG int16_t readI16a(const void* p) noexcept { return int16_t(readU16x(p)); } +static ASMJIT_INLINE_NODEBUG int16_t readI16aLE(const void* p) noexcept { return int16_t(readU16x(p)); } +static ASMJIT_INLINE_NODEBUG int16_t readI16aBE(const void* p) noexcept { return int16_t(readU16x(p)); } // Support - Memory Read Access - 24 Bits // ====================================== template static inline uint32_t readU24u(const void* p) noexcept { - uint32_t b0 = readU8(static_cast(p) + (BO == ByteOrder::kLE ? 2 : 0)); - uint32_t b1 = readU8(static_cast(p) + (BO == ByteOrder::kLE ? 1 : 1)); - uint32_t b2 = readU8(static_cast(p) + (BO == ByteOrder::kLE ? 0 : 2)); + uint32_t b0 = readU8(static_cast(p) + (BO == ByteOrder::kLE ? 2u : 0u)); + uint32_t b1 = readU8(static_cast(p) + 1u); + uint32_t b2 = readU8(static_cast(p) + (BO == ByteOrder::kLE ? 0u : 2u)); return (b0 << 16) | (b1 << 8) | b2; } @@ -998,108 +997,108 @@ static inline uint32_t readU24uBE(const void* p) noexcept { return readU24u -static inline uint32_t readU32x(const void* p) noexcept { +static ASMJIT_INLINE_NODEBUG uint32_t readU32x(const void* p) noexcept { typedef typename Internal::AliasedUInt::T U32AlignedToN; uint32_t x = static_cast(p)[0]; return BO == ByteOrder::kNative ? x : byteswap32(x); } template -static inline uint32_t readU32u(const void* p) noexcept { return readU32x(p); } +static ASMJIT_INLINE_NODEBUG uint32_t readU32u(const void* p) noexcept { return readU32x(p); } template -static inline uint32_t readU32uLE(const void* p) noexcept { return readU32x(p); } +static ASMJIT_INLINE_NODEBUG uint32_t readU32uLE(const void* p) noexcept { return readU32x(p); } template -static inline uint32_t readU32uBE(const void* p) noexcept { return readU32x(p); } +static ASMJIT_INLINE_NODEBUG uint32_t readU32uBE(const void* p) noexcept { return readU32x(p); } -static inline uint32_t readU32a(const void* p) noexcept { return readU32x(p); } -static inline uint32_t readU32aLE(const void* p) noexcept { return readU32x(p); } -static inline uint32_t readU32aBE(const void* p) noexcept { return readU32x(p); } +static ASMJIT_INLINE_NODEBUG uint32_t readU32a(const void* p) noexcept { return readU32x(p); } +static ASMJIT_INLINE_NODEBUG uint32_t readU32aLE(const void* p) noexcept { return readU32x(p); } +static ASMJIT_INLINE_NODEBUG uint32_t readU32aBE(const void* p) noexcept { return readU32x(p); } template -static inline uint32_t readI32x(const void* p) noexcept { return int32_t(readU32x(p)); } +static ASMJIT_INLINE_NODEBUG uint32_t readI32x(const void* p) noexcept { return int32_t(readU32x(p)); } template -static inline int32_t readI32u(const void* p) noexcept { return int32_t(readU32x(p)); } +static ASMJIT_INLINE_NODEBUG int32_t readI32u(const void* p) noexcept { return int32_t(readU32x(p)); } template -static inline int32_t readI32uLE(const void* p) noexcept { return int32_t(readU32x(p)); } +static ASMJIT_INLINE_NODEBUG int32_t readI32uLE(const void* p) noexcept { return int32_t(readU32x(p)); } template -static inline int32_t readI32uBE(const void* p) noexcept { return int32_t(readU32x(p)); } +static ASMJIT_INLINE_NODEBUG int32_t readI32uBE(const void* p) noexcept { return int32_t(readU32x(p)); } -static inline int32_t readI32a(const void* p) noexcept { return int32_t(readU32x(p)); } -static inline int32_t readI32aLE(const void* p) noexcept { return int32_t(readU32x(p)); } -static inline int32_t readI32aBE(const void* p) noexcept { return int32_t(readU32x(p)); } +static ASMJIT_INLINE_NODEBUG int32_t readI32a(const void* p) noexcept { return int32_t(readU32x(p)); } +static ASMJIT_INLINE_NODEBUG int32_t readI32aLE(const void* p) noexcept { return int32_t(readU32x(p)); } +static ASMJIT_INLINE_NODEBUG int32_t readI32aBE(const void* p) noexcept { return int32_t(readU32x(p)); } // Support - Memory Read Access - 64 Bits // ====================================== template -static inline uint64_t readU64x(const void* p) noexcept { +static ASMJIT_INLINE_NODEBUG uint64_t readU64x(const void* p) noexcept { typedef typename Internal::AliasedUInt::T U64AlignedToN; uint64_t x = static_cast(p)[0]; return BO == ByteOrder::kNative ? x : byteswap64(x); } template -static inline uint64_t readU64u(const void* p) noexcept { return readU64x(p); } +static ASMJIT_INLINE_NODEBUG uint64_t readU64u(const void* p) noexcept { return readU64x(p); } template -static inline uint64_t readU64uLE(const void* p) noexcept { return readU64x(p); } +static ASMJIT_INLINE_NODEBUG uint64_t readU64uLE(const void* p) noexcept { return readU64x(p); } template -static inline uint64_t readU64uBE(const void* p) noexcept { return readU64x(p); } +static ASMJIT_INLINE_NODEBUG uint64_t readU64uBE(const void* p) noexcept { return readU64x(p); } -static inline uint64_t readU64a(const void* p) noexcept { return readU64x(p); } -static inline uint64_t readU64aLE(const void* p) noexcept { return readU64x(p); } -static inline uint64_t readU64aBE(const void* p) noexcept { return readU64x(p); } +static ASMJIT_INLINE_NODEBUG uint64_t readU64a(const void* p) noexcept { return readU64x(p); } +static ASMJIT_INLINE_NODEBUG uint64_t readU64aLE(const void* p) noexcept { return readU64x(p); } +static ASMJIT_INLINE_NODEBUG uint64_t readU64aBE(const void* p) noexcept { return readU64x(p); } template -static inline int64_t readI64x(const void* p) noexcept { return int64_t(readU64x(p)); } +static ASMJIT_INLINE_NODEBUG int64_t readI64x(const void* p) noexcept { return int64_t(readU64x(p)); } template -static inline int64_t readI64u(const void* p) noexcept { return int64_t(readU64x(p)); } +static ASMJIT_INLINE_NODEBUG int64_t readI64u(const void* p) noexcept { return int64_t(readU64x(p)); } template -static inline int64_t readI64uLE(const void* p) noexcept { return int64_t(readU64x(p)); } +static ASMJIT_INLINE_NODEBUG int64_t readI64uLE(const void* p) noexcept { return int64_t(readU64x(p)); } template -static inline int64_t readI64uBE(const void* p) noexcept { return int64_t(readU64x(p)); } +static ASMJIT_INLINE_NODEBUG int64_t readI64uBE(const void* p) noexcept { return int64_t(readU64x(p)); } -static inline int64_t readI64a(const void* p) noexcept { return int64_t(readU64x(p)); } -static inline int64_t readI64aLE(const void* p) noexcept { return int64_t(readU64x(p)); } -static inline int64_t readI64aBE(const void* p) noexcept { return int64_t(readU64x(p)); } +static ASMJIT_INLINE_NODEBUG int64_t readI64a(const void* p) noexcept { return int64_t(readU64x(p)); } +static ASMJIT_INLINE_NODEBUG int64_t readI64aLE(const void* p) noexcept { return int64_t(readU64x(p)); } +static ASMJIT_INLINE_NODEBUG int64_t readI64aBE(const void* p) noexcept { return int64_t(readU64x(p)); } // Support - Memory Write Access - 8 Bits // ====================================== -static inline void writeU8(void* p, uint8_t x) noexcept { static_cast(p)[0] = x; } -static inline void writeI8(void* p, int8_t x) noexcept { static_cast(p)[0] = x; } +static ASMJIT_INLINE_NODEBUG void writeU8(void* p, uint8_t x) noexcept { static_cast(p)[0] = x; } +static ASMJIT_INLINE_NODEBUG void writeI8(void* p, int8_t x) noexcept { static_cast(p)[0] = x; } // Support - Memory Write Access - 16 Bits // ======================================= template -static inline void writeU16x(void* p, uint16_t x) noexcept { +static ASMJIT_INLINE_NODEBUG void writeU16x(void* p, uint16_t x) noexcept { typedef typename Internal::AliasedUInt::T U16AlignedToN; static_cast(p)[0] = BO == ByteOrder::kNative ? x : byteswap16(x); } template -static inline void writeU16uLE(void* p, uint16_t x) noexcept { writeU16x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU16uLE(void* p, uint16_t x) noexcept { writeU16x(p, x); } template -static inline void writeU16uBE(void* p, uint16_t x) noexcept { writeU16x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU16uBE(void* p, uint16_t x) noexcept { writeU16x(p, x); } -static inline void writeU16a(void* p, uint16_t x) noexcept { writeU16x(p, x); } -static inline void writeU16aLE(void* p, uint16_t x) noexcept { writeU16x(p, x); } -static inline void writeU16aBE(void* p, uint16_t x) noexcept { writeU16x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU16a(void* p, uint16_t x) noexcept { writeU16x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU16aLE(void* p, uint16_t x) noexcept { writeU16x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU16aBE(void* p, uint16_t x) noexcept { writeU16x(p, x); } template -static inline void writeI16x(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI16x(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } template -static inline void writeI16uLE(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI16uLE(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } template -static inline void writeI16uBE(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI16uBE(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } -static inline void writeI16a(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } -static inline void writeI16aLE(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } -static inline void writeI16aBE(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI16a(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI16aLE(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI16aBE(void* p, int16_t x) noexcept { writeU16x(p, uint16_t(x)); } // Support - Memory Write Access - 24 Bits // ======================================= @@ -1107,7 +1106,7 @@ static inline void writeI16aBE(void* p, int16_t x) noexcept { writeU16x static inline void writeU24u(void* p, uint32_t v) noexcept { static_cast(p)[0] = uint8_t((v >> (BO == ByteOrder::kLE ? 0 : 16)) & 0xFFu); - static_cast(p)[1] = uint8_t((v >> (BO == ByteOrder::kLE ? 8 : 8)) & 0xFFu); + static_cast(p)[1] = uint8_t((v >> 8) & 0xFFu); static_cast(p)[2] = uint8_t((v >> (BO == ByteOrder::kLE ? 16 : 0)) & 0xFFu); } @@ -1118,85 +1117,85 @@ static inline void writeU24uBE(void* p, uint32_t v) noexcept { writeU24u -static inline void writeU32x(void* p, uint32_t x) noexcept { +static ASMJIT_INLINE_NODEBUG void writeU32x(void* p, uint32_t x) noexcept { typedef typename Internal::AliasedUInt::T U32AlignedToN; static_cast(p)[0] = (BO == ByteOrder::kNative) ? x : Support::byteswap32(x); } template -static inline void writeU32u(void* p, uint32_t x) noexcept { writeU32x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU32u(void* p, uint32_t x) noexcept { writeU32x(p, x); } template -static inline void writeU32uLE(void* p, uint32_t x) noexcept { writeU32x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU32uLE(void* p, uint32_t x) noexcept { writeU32x(p, x); } template -static inline void writeU32uBE(void* p, uint32_t x) noexcept { writeU32x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU32uBE(void* p, uint32_t x) noexcept { writeU32x(p, x); } -static inline void writeU32a(void* p, uint32_t x) noexcept { writeU32x(p, x); } -static inline void writeU32aLE(void* p, uint32_t x) noexcept { writeU32x(p, x); } -static inline void writeU32aBE(void* p, uint32_t x) noexcept { writeU32x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU32a(void* p, uint32_t x) noexcept { writeU32x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU32aLE(void* p, uint32_t x) noexcept { writeU32x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU32aBE(void* p, uint32_t x) noexcept { writeU32x(p, x); } template -static inline void writeI32x(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI32x(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } template -static inline void writeI32u(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI32u(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } template -static inline void writeI32uLE(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI32uLE(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } template -static inline void writeI32uBE(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI32uBE(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } -static inline void writeI32a(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } -static inline void writeI32aLE(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } -static inline void writeI32aBE(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI32a(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI32aLE(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI32aBE(void* p, int32_t x) noexcept { writeU32x(p, uint32_t(x)); } // Support - Memory Write Access - 64 Bits // ======================================= template -static inline void writeU64x(void* p, uint64_t x) noexcept { +static ASMJIT_INLINE_NODEBUG void writeU64x(void* p, uint64_t x) noexcept { typedef typename Internal::AliasedUInt::T U64AlignedToN; static_cast(p)[0] = BO == ByteOrder::kNative ? x : byteswap64(x); } template -static inline void writeU64u(void* p, uint64_t x) noexcept { writeU64x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU64u(void* p, uint64_t x) noexcept { writeU64x(p, x); } template -static inline void writeU64uLE(void* p, uint64_t x) noexcept { writeU64x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU64uLE(void* p, uint64_t x) noexcept { writeU64x(p, x); } template -static inline void writeU64uBE(void* p, uint64_t x) noexcept { writeU64x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU64uBE(void* p, uint64_t x) noexcept { writeU64x(p, x); } -static inline void writeU64a(void* p, uint64_t x) noexcept { writeU64x(p, x); } -static inline void writeU64aLE(void* p, uint64_t x) noexcept { writeU64x(p, x); } -static inline void writeU64aBE(void* p, uint64_t x) noexcept { writeU64x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU64a(void* p, uint64_t x) noexcept { writeU64x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU64aLE(void* p, uint64_t x) noexcept { writeU64x(p, x); } +static ASMJIT_INLINE_NODEBUG void writeU64aBE(void* p, uint64_t x) noexcept { writeU64x(p, x); } template -static inline void writeI64x(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI64x(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } template -static inline void writeI64u(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI64u(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } template -static inline void writeI64uLE(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI64uLE(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } template -static inline void writeI64uBE(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI64uBE(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } -static inline void writeI64a(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } -static inline void writeI64aLE(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } -static inline void writeI64aBE(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI64a(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI64aLE(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } +static ASMJIT_INLINE_NODEBUG void writeI64aBE(void* p, int64_t x) noexcept { writeU64x(p, uint64_t(x)); } // Support - Operators // =================== //! \cond INTERNAL -struct Set { template static inline T op(T x, T y) noexcept { DebugUtils::unused(x); return y; } }; -struct SetNot { template static inline T op(T x, T y) noexcept { DebugUtils::unused(x); return ~y; } }; -struct And { template static inline T op(T x, T y) noexcept { return x & y; } }; -struct AndNot { template static inline T op(T x, T y) noexcept { return x & ~y; } }; -struct NotAnd { template static inline T op(T x, T y) noexcept { return ~x & y; } }; -struct Or { template static inline T op(T x, T y) noexcept { return x | y; } }; -struct Xor { template static inline T op(T x, T y) noexcept { return x ^ y; } }; -struct Add { template static inline T op(T x, T y) noexcept { return x + y; } }; -struct Sub { template static inline T op(T x, T y) noexcept { return x - y; } }; -struct Min { template static inline T op(T x, T y) noexcept { return min(x, y); } }; -struct Max { template static inline T op(T x, T y) noexcept { return max(x, y); } }; +struct Set { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { DebugUtils::unused(x); return y; } }; +struct SetNot { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { DebugUtils::unused(x); return ~y; } }; +struct And { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x & y; } }; +struct AndNot { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x & ~y; } }; +struct NotAnd { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return ~x & y; } }; +struct Or { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x | y; } }; +struct Xor { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x ^ y; } }; +struct Add { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x + y; } }; +struct Sub { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x - y; } }; +struct Min { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return min(x, y); } }; +struct Max { template static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return max(x, y); } }; //! \endcond // Support - BitWordIterator @@ -1218,43 +1217,20 @@ struct Max { template static inline T op(T x, T y) noexcept { ret template class BitWordIterator { public: - ASMJIT_FORCE_INLINE explicit BitWordIterator(T bitWord) noexcept + ASMJIT_INLINE_NODEBUG explicit BitWordIterator(T bitWord) noexcept : _bitWord(bitWord) {} - ASMJIT_FORCE_INLINE void init(T bitWord) noexcept { _bitWord = bitWord; } - ASMJIT_FORCE_INLINE bool hasNext() const noexcept { return _bitWord != 0; } + ASMJIT_INLINE_NODEBUG void init(T bitWord) noexcept { _bitWord = bitWord; } + ASMJIT_INLINE_NODEBUG bool hasNext() const noexcept { return _bitWord != 0; } ASMJIT_FORCE_INLINE uint32_t next() noexcept { ASMJIT_ASSERT(_bitWord != 0); uint32_t index = ctz(_bitWord); - _bitWord ^= T(1u) << index; - return index; - } - - T _bitWord; -}; - -// Support - BitWordFlipIterator -// ============================= - -template -class BitWordFlipIterator { -public: - ASMJIT_FORCE_INLINE explicit BitWordFlipIterator(T bitWord) noexcept - : _bitWord(bitWord) {} - - ASMJIT_FORCE_INLINE void init(T bitWord) noexcept { _bitWord = bitWord; } - ASMJIT_FORCE_INLINE bool hasNext() const noexcept { return _bitWord != 0; } - - ASMJIT_FORCE_INLINE uint32_t nextAndFlip() noexcept { - ASMJIT_ASSERT(_bitWord != 0); - uint32_t index = ctz(_bitWord); - _bitWord ^= T(1u) << index; + _bitWord &= T(_bitWord - 1); return index; } T _bitWord; - T _xorMask; }; // Support - BitVectorOps @@ -1263,7 +1239,7 @@ class BitWordFlipIterator { //! \cond namespace Internal { template - static inline void bitVectorOp(T* buf, size_t index, size_t count) noexcept { + static ASMJIT_FORCE_INLINE void bitVectorOp(T* buf, size_t index, size_t count) noexcept { if (count == 0) return; @@ -1297,7 +1273,7 @@ namespace Internal { //! Sets bit in a bit-vector `buf` at `index`. template -static inline bool bitVectorGetBit(T* buf, size_t index) noexcept { +static ASMJIT_INLINE_NODEBUG bool bitVectorGetBit(T* buf, size_t index) noexcept { const size_t kTSizeInBits = bitSizeOf(); size_t vecIndex = index / kTSizeInBits; @@ -1308,7 +1284,7 @@ static inline bool bitVectorGetBit(T* buf, size_t index) noexcept { //! Sets bit in a bit-vector `buf` at `index` to `value`. template -static inline void bitVectorSetBit(T* buf, size_t index, bool value) noexcept { +static ASMJIT_INLINE_NODEBUG void bitVectorSetBit(T* buf, size_t index, bool value) noexcept { const size_t kTSizeInBits = bitSizeOf(); size_t vecIndex = index / kTSizeInBits; @@ -1323,7 +1299,7 @@ static inline void bitVectorSetBit(T* buf, size_t index, bool value) noexcept { //! Sets bit in a bit-vector `buf` at `index` to `value`. template -static inline void bitVectorFlipBit(T* buf, size_t index) noexcept { +static ASMJIT_INLINE_NODEBUG void bitVectorFlipBit(T* buf, size_t index) noexcept { const size_t kTSizeInBits = bitSizeOf(); size_t vecIndex = index / kTSizeInBits; @@ -1335,14 +1311,14 @@ static inline void bitVectorFlipBit(T* buf, size_t index) noexcept { //! Fills `count` bits in bit-vector `buf` starting at bit-index `index`. template -static inline void bitVectorFill(T* buf, size_t index, size_t count) noexcept { Internal::bitVectorOp(buf, index, count); } +static ASMJIT_INLINE_NODEBUG void bitVectorFill(T* buf, size_t index, size_t count) noexcept { Internal::bitVectorOp(buf, index, count); } //! Clears `count` bits in bit-vector `buf` starting at bit-index `index`. template -static inline void bitVectorClear(T* buf, size_t index, size_t count) noexcept { Internal::bitVectorOp(buf, index, count); } +static ASMJIT_INLINE_NODEBUG void bitVectorClear(T* buf, size_t index, size_t count) noexcept { Internal::bitVectorOp(buf, index, count); } template -static inline size_t bitVectorIndexOf(T* buf, size_t start, bool value) noexcept { +static ASMJIT_FORCE_INLINE size_t bitVectorIndexOf(T* buf, size_t start, bool value) noexcept { const size_t kTSizeInBits = bitSizeOf(); size_t vecIndex = start / kTSizeInBits; // T[] size_t bitIndex = start % kTSizeInBits; // T[][] @@ -1373,9 +1349,9 @@ class BitVectorIterator { size_t _end; T _current; - ASMJIT_FORCE_INLINE BitVectorIterator(const BitVectorIterator& other) noexcept = default; + ASMJIT_INLINE_NODEBUG BitVectorIterator(const BitVectorIterator& other) noexcept = default; - ASMJIT_FORCE_INLINE BitVectorIterator(const T* data, size_t numBitWords, size_t start = 0) noexcept { + ASMJIT_INLINE_NODEBUG BitVectorIterator(const T* data, size_t numBitWords, size_t start = 0) noexcept { init(data, numBitWords, start); } @@ -1397,7 +1373,7 @@ class BitVectorIterator { _current = bitWord; } - ASMJIT_FORCE_INLINE bool hasNext() const noexcept { + ASMJIT_INLINE_NODEBUG bool hasNext() const noexcept { return _current != T(0); } @@ -1406,7 +1382,7 @@ class BitVectorIterator { ASMJIT_ASSERT(bitWord != T(0)); uint32_t bit = ctz(bitWord); - bitWord ^= T(1u) << bit; + bitWord &= T(bitWord - 1u); size_t n = _idx + bit; while (!bitWord && (_idx += bitSizeOf()) < _end) @@ -1438,7 +1414,7 @@ class BitVectorOpIterator { size_t _end; T _current; - ASMJIT_FORCE_INLINE BitVectorOpIterator(const T* aData, const T* bData, size_t numBitWords, size_t start = 0) noexcept { + ASMJIT_INLINE_NODEBUG BitVectorOpIterator(const T* aData, const T* bData, size_t numBitWords, size_t start = 0) noexcept { init(aData, bData, numBitWords, start); } @@ -1462,7 +1438,7 @@ class BitVectorOpIterator { _current = bitWord; } - ASMJIT_FORCE_INLINE bool hasNext() noexcept { + ASMJIT_INLINE_NODEBUG bool hasNext() noexcept { return _current != T(0); } @@ -1471,7 +1447,7 @@ class BitVectorOpIterator { ASMJIT_ASSERT(bitWord != T(0)); uint32_t bit = ctz(bitWord); - bitWord ^= T(1u) << bit; + bitWord &= T(bitWord - 1u); size_t n = _idx + bit; while (!bitWord && (_idx += kTSizeInBits) < _end) @@ -1498,7 +1474,7 @@ enum class SortOrder : uint32_t { template struct Compare { template - inline int operator()(const A& a, const B& b) const noexcept { + ASMJIT_INLINE_NODEBUG int operator()(const A& a, const B& b) const noexcept { return kOrder == SortOrder::kAscending ? int(a > b) - int(a < b) : int(a < b) - int(a > b); } }; @@ -1587,10 +1563,79 @@ namespace Internal { //! The main reason to provide a custom qsort implementation is that we needed something that will //! never throw `bad_alloc` exception. This implementation doesn't use dynamic memory allocation. template> -static inline void qSort(T* base, size_t size, const CompareT& cmp = CompareT()) noexcept { +static ASMJIT_INLINE_NODEBUG void qSort(T* base, size_t size, const CompareT& cmp = CompareT()) noexcept { Internal::QSortImpl::sort(base, size, cmp); } +// Support - ReverseIterator +// ========================= + +//! Reverse iterator to avoid including `` header for iteration over arrays, specialized for +//! AsmJit use (noexcept by design). +template +class ArrayReverseIterator { +public: + //! \name Members + //! \{ + + T* _ptr {}; + + //! \} + + //! \name Construction & Destruction + //! \{ + + ASMJIT_INLINE_NODEBUG constexpr ArrayReverseIterator() noexcept = default; + ASMJIT_INLINE_NODEBUG constexpr ArrayReverseIterator(const ArrayReverseIterator& other) noexcept = default; + ASMJIT_INLINE_NODEBUG constexpr ArrayReverseIterator(T* ptr) noexcept : _ptr(ptr) {} + + //! \} + + //! \name Overloaded Operators + //! \{ + + ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator=(const ArrayReverseIterator& other) noexcept = default; + + ASMJIT_INLINE_NODEBUG bool operator==(const T* other) const noexcept { return _ptr == other; } + ASMJIT_INLINE_NODEBUG bool operator==(const ArrayReverseIterator& other) const noexcept { return _ptr == other._ptr; } + + ASMJIT_INLINE_NODEBUG bool operator!=(const T* other) const noexcept { return _ptr != other; } + ASMJIT_INLINE_NODEBUG bool operator!=(const ArrayReverseIterator& other) const noexcept { return _ptr != other._ptr; } + + ASMJIT_INLINE_NODEBUG bool operator<(const T* other) const noexcept { return _ptr < other; } + ASMJIT_INLINE_NODEBUG bool operator<(const ArrayReverseIterator& other) const noexcept { return _ptr < other._ptr; } + + ASMJIT_INLINE_NODEBUG bool operator<=(const T* other) const noexcept { return _ptr <= other; } + ASMJIT_INLINE_NODEBUG bool operator<=(const ArrayReverseIterator& other) const noexcept { return _ptr <= other._ptr; } + + ASMJIT_INLINE_NODEBUG bool operator>(const T* other) const noexcept { return _ptr > other; } + ASMJIT_INLINE_NODEBUG bool operator>(const ArrayReverseIterator& other) const noexcept { return _ptr > other._ptr; } + + ASMJIT_INLINE_NODEBUG bool operator>=(const T* other) const noexcept { return _ptr >= other; } + ASMJIT_INLINE_NODEBUG bool operator>=(const ArrayReverseIterator& other) const noexcept { return _ptr >= other._ptr; } + + ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator++() noexcept { _ptr--; return *this; } + ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator++(int) noexcept { ArrayReverseIterator prev(*this); _ptr--; return prev; } + + ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator--() noexcept { _ptr++; return *this; } + ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator--(int) noexcept { ArrayReverseIterator prev(*this); _ptr++; return prev; } + + template ASMJIT_INLINE_NODEBUG ArrayReverseIterator operator+(const Diff& n) noexcept { return ArrayReverseIterator(_ptr -= n); } + template ASMJIT_INLINE_NODEBUG ArrayReverseIterator operator-(const Diff& n) noexcept { return ArrayReverseIterator(_ptr += n); } + + template ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator+=(const Diff& n) noexcept { _ptr -= n; return *this; } + template ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator-=(const Diff& n) noexcept { _ptr += n; return *this; } + + ASMJIT_INLINE_NODEBUG constexpr T& operator*() const noexcept { return _ptr[-1]; } + ASMJIT_INLINE_NODEBUG constexpr T* operator->() const noexcept { return &_ptr[-1]; } + + template ASMJIT_INLINE_NODEBUG T& operator[](const Diff& n) noexcept { return *(_ptr - n - 1); } + + ASMJIT_INLINE_NODEBUG operator T*() const noexcept { return _ptr; } + + //! \} +}; + // Support - Array // =============== @@ -1656,26 +1701,26 @@ struct Array { //! \name Accessors //! \{ - inline bool empty() const noexcept { return false; } - inline size_t size() const noexcept { return N; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return false; } + ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return N; } - inline T* data() noexcept { return _data; } - inline const T* data() const noexcept { return _data; } + ASMJIT_INLINE_NODEBUG T* data() noexcept { return _data; } + ASMJIT_INLINE_NODEBUG const T* data() const noexcept { return _data; } - inline T& front() noexcept { return _data[0]; } - inline const T& front() const noexcept { return _data[0]; } + ASMJIT_INLINE_NODEBUG T& front() noexcept { return _data[0]; } + ASMJIT_INLINE_NODEBUG const T& front() const noexcept { return _data[0]; } - inline T& back() noexcept { return _data[N - 1]; } - inline const T& back() const noexcept { return _data[N - 1]; } + ASMJIT_INLINE_NODEBUG T& back() noexcept { return _data[N - 1]; } + ASMJIT_INLINE_NODEBUG const T& back() const noexcept { return _data[N - 1]; } - inline T* begin() noexcept { return _data; } - inline T* end() noexcept { return _data + N; } + ASMJIT_INLINE_NODEBUG T* begin() noexcept { return _data; } + ASMJIT_INLINE_NODEBUG T* end() noexcept { return _data + N; } - inline const T* begin() const noexcept { return _data; } - inline const T* end() const noexcept { return _data + N; } + ASMJIT_INLINE_NODEBUG const T* begin() const noexcept { return _data; } + ASMJIT_INLINE_NODEBUG const T* end() const noexcept { return _data + N; } - inline const T* cbegin() const noexcept { return _data; } - inline const T* cend() const noexcept { return _data + N; } + ASMJIT_INLINE_NODEBUG const T* cbegin() const noexcept { return _data; } + ASMJIT_INLINE_NODEBUG const T* cend() const noexcept { return _data + N; } //! \} @@ -1738,8 +1783,8 @@ struct Temporary { //! \name Construction & Destruction //! \{ - inline constexpr Temporary(const Temporary& other) noexcept = default; - inline constexpr Temporary(void* data, size_t size) noexcept + ASMJIT_INLINE_NODEBUG constexpr Temporary(const Temporary& other) noexcept = default; + ASMJIT_INLINE_NODEBUG constexpr Temporary(void* data, size_t size) noexcept : _data(data), _size(size) {} @@ -1748,7 +1793,7 @@ struct Temporary { //! \name Overloaded Operators //! \{ - inline Temporary& operator=(const Temporary& other) noexcept = default; + ASMJIT_INLINE_NODEBUG Temporary& operator=(const Temporary& other) noexcept = default; //! \} @@ -1757,9 +1802,9 @@ struct Temporary { //! Returns the data storage. template - inline constexpr T* data() const noexcept { return static_cast(_data); } + ASMJIT_INLINE_NODEBUG constexpr T* data() const noexcept { return static_cast(_data); } //! Returns the data storage size in bytes. - inline constexpr size_t size() const noexcept { return _size; } + ASMJIT_INLINE_NODEBUG constexpr size_t size() const noexcept { return _size; } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/support_p.h b/3rdparty/asmjit/src/asmjit/core/support_p.h new file mode 100644 index 0000000000000..1caec9344a40f --- /dev/null +++ b/3rdparty/asmjit/src/asmjit/core/support_p.h @@ -0,0 +1,27 @@ +// This file is part of AsmJit project +// +// See asmjit.h or LICENSE.md for license and copyright information +// SPDX-License-Identifier: Zlib + +#ifndef ASMJIT_CORE_SUPPORT_P_H_INCLUDED +#define ASMJIT_CORE_SUPPORT_P_H_INCLUDED + +#include "../core/support.h" + +ASMJIT_BEGIN_NAMESPACE + +//! \addtogroup asmjit_utilities +//! \{ + +namespace Support { + +//! \cond INTERNAL +//! \endcond + +} // {Support} + +//! \} + +ASMJIT_END_NAMESPACE + +#endif // ASMJIT_CORE_SUPPORT_P_H_INCLUDED diff --git a/3rdparty/asmjit/src/asmjit/core/target.cpp b/3rdparty/asmjit/src/asmjit/core/target.cpp index fef025d709a1c..cbc6ab51092fd 100644 --- a/3rdparty/asmjit/src/asmjit/core/target.cpp +++ b/3rdparty/asmjit/src/asmjit/core/target.cpp @@ -8,7 +8,9 @@ ASMJIT_BEGIN_NAMESPACE -Target::Target() noexcept : _environment() {} +Target::Target() noexcept + : _environment{}, + _cpuFeatures{} {} Target::~Target() noexcept {} ASMJIT_END_NAMESPACE diff --git a/3rdparty/asmjit/src/asmjit/core/target.h b/3rdparty/asmjit/src/asmjit/core/target.h index 23b0c6294c98b..4365be1401169 100644 --- a/3rdparty/asmjit/src/asmjit/core/target.h +++ b/3rdparty/asmjit/src/asmjit/core/target.h @@ -7,6 +7,7 @@ #define ASMJIT_CORE_TARGET_H_INCLUDED #include "../core/archtraits.h" +#include "../core/cpuinfo.h" #include "../core/func.h" ASMJIT_BEGIN_NAMESPACE @@ -22,6 +23,8 @@ class ASMJIT_VIRTAPI Target { //! Target environment information. Environment _environment; + //! Target CPU features. + CpuFeatures _cpuFeatures; //! \name Construction & Destruction //! \{ @@ -37,11 +40,14 @@ class ASMJIT_VIRTAPI Target { //! \{ //! Returns target's environment. - inline const Environment& environment() const noexcept { return _environment; } + ASMJIT_INLINE_NODEBUG const Environment& environment() const noexcept { return _environment; } //! Returns the target architecture. - inline Arch arch() const noexcept { return _environment.arch(); } + ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _environment.arch(); } //! Returns the target sub-architecture. - inline SubArch subArch() const noexcept { return _environment.subArch(); } + ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return _environment.subArch(); } + + //! Returns target CPU features. + ASMJIT_INLINE_NODEBUG const CpuFeatures& cpuFeatures() const noexcept { return _cpuFeatures; } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/type.h b/3rdparty/asmjit/src/asmjit/core/type.h index 3754959e4c36c..415fe0a421dcd 100644 --- a/3rdparty/asmjit/src/asmjit/core/type.h +++ b/3rdparty/asmjit/src/asmjit/core/type.h @@ -164,74 +164,98 @@ struct TypeData { ASMJIT_VARAPI const TypeData _typeData; //! Returns the scalar type of `typeId`. -static inline TypeId scalarOf(TypeId typeId) noexcept { return _typeData.scalarOf[uint32_t(typeId)]; } +static ASMJIT_INLINE_NODEBUG TypeId scalarOf(TypeId typeId) noexcept { return _typeData.scalarOf[uint32_t(typeId)]; } //! Returns the size [in bytes] of `typeId`. -static inline uint32_t sizeOf(TypeId typeId) noexcept { return _typeData.sizeOf[uint32_t(typeId)]; } +static ASMJIT_INLINE_NODEBUG uint32_t sizeOf(TypeId typeId) noexcept { return _typeData.sizeOf[uint32_t(typeId)]; } //! Tests whether a given type `typeId` is between `a` and `b`. -static inline constexpr bool isBetween(TypeId typeId, TypeId a, TypeId b) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr bool isBetween(TypeId typeId, TypeId a, TypeId b) noexcept { return Support::isBetween(uint32_t(typeId), uint32_t(a), uint32_t(b)); } //! Tests whether a given type `typeId` is \ref TypeId::kVoid. -static inline constexpr bool isVoid(TypeId typeId) noexcept { return typeId == TypeId::kVoid; } +static ASMJIT_INLINE_NODEBUG constexpr bool isVoid(TypeId typeId) noexcept { return typeId == TypeId::kVoid; } //! Tests whether a given type `typeId` is a valid non-void type. -static inline constexpr bool isValid(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kIntStart, TypeId::_kVec512End); } +static ASMJIT_INLINE_NODEBUG constexpr bool isValid(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kIntStart, TypeId::_kVec512End); } //! Tests whether a given type `typeId` is scalar (has no vector part). -static inline constexpr bool isScalar(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kBaseStart, TypeId::_kBaseEnd); } +static ASMJIT_INLINE_NODEBUG constexpr bool isScalar(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kBaseStart, TypeId::_kBaseEnd); } //! Tests whether a given type `typeId` is abstract, which means that its size depends on register size. -static inline constexpr bool isAbstract(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kIntPtr, TypeId::kUIntPtr); } +static ASMJIT_INLINE_NODEBUG constexpr bool isAbstract(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kIntPtr, TypeId::kUIntPtr); } //! Tests whether a given type is a scalar integer (signed or unsigned) of any size. -static inline constexpr bool isInt(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kIntStart, TypeId::_kIntEnd); } +static ASMJIT_INLINE_NODEBUG constexpr bool isInt(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kIntStart, TypeId::_kIntEnd); } //! Tests whether a given type is a scalar 8-bit integer (signed). -static inline constexpr bool isInt8(TypeId typeId) noexcept { return typeId == TypeId::kInt8; } +static ASMJIT_INLINE_NODEBUG constexpr bool isInt8(TypeId typeId) noexcept { return typeId == TypeId::kInt8; } //! Tests whether a given type is a scalar 8-bit integer (unsigned). -static inline constexpr bool isUInt8(TypeId typeId) noexcept { return typeId == TypeId::kUInt8; } +static ASMJIT_INLINE_NODEBUG constexpr bool isUInt8(TypeId typeId) noexcept { return typeId == TypeId::kUInt8; } //! Tests whether a given type is a scalar 16-bit integer (signed). -static inline constexpr bool isInt16(TypeId typeId) noexcept { return typeId == TypeId::kInt16; } +static ASMJIT_INLINE_NODEBUG constexpr bool isInt16(TypeId typeId) noexcept { return typeId == TypeId::kInt16; } //! Tests whether a given type is a scalar 16-bit integer (unsigned). -static inline constexpr bool isUInt16(TypeId typeId) noexcept { return typeId == TypeId::kUInt16; } +static ASMJIT_INLINE_NODEBUG constexpr bool isUInt16(TypeId typeId) noexcept { return typeId == TypeId::kUInt16; } //! Tests whether a given type is a scalar 32-bit integer (signed). -static inline constexpr bool isInt32(TypeId typeId) noexcept { return typeId == TypeId::kInt32; } +static ASMJIT_INLINE_NODEBUG constexpr bool isInt32(TypeId typeId) noexcept { return typeId == TypeId::kInt32; } //! Tests whether a given type is a scalar 32-bit integer (unsigned). -static inline constexpr bool isUInt32(TypeId typeId) noexcept { return typeId == TypeId::kUInt32; } +static ASMJIT_INLINE_NODEBUG constexpr bool isUInt32(TypeId typeId) noexcept { return typeId == TypeId::kUInt32; } //! Tests whether a given type is a scalar 64-bit integer (signed). -static inline constexpr bool isInt64(TypeId typeId) noexcept { return typeId == TypeId::kInt64; } +static ASMJIT_INLINE_NODEBUG constexpr bool isInt64(TypeId typeId) noexcept { return typeId == TypeId::kInt64; } //! Tests whether a given type is a scalar 64-bit integer (unsigned). -static inline constexpr bool isUInt64(TypeId typeId) noexcept { return typeId == TypeId::kUInt64; } +static ASMJIT_INLINE_NODEBUG constexpr bool isUInt64(TypeId typeId) noexcept { return typeId == TypeId::kUInt64; } -static inline constexpr bool isGp8(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt8, TypeId::kUInt8); } -static inline constexpr bool isGp16(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt16, TypeId::kUInt16); } -static inline constexpr bool isGp32(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt32, TypeId::kUInt32); } -static inline constexpr bool isGp64(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt64, TypeId::kUInt64); } +//! Tests whether a given type is an 8-bit general purpose register representing either signed or unsigned 8-bit integer. +static ASMJIT_INLINE_NODEBUG constexpr bool isGp8(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt8, TypeId::kUInt8); } +//! Tests whether a given type is a 16-bit general purpose register representing either signed or unsigned 16-bit integer +static ASMJIT_INLINE_NODEBUG constexpr bool isGp16(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt16, TypeId::kUInt16); } +//! Tests whether a given type is a 32-bit general purpose register representing either signed or unsigned 32-bit integer +static ASMJIT_INLINE_NODEBUG constexpr bool isGp32(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt32, TypeId::kUInt32); } +//! Tests whether a given type is a 64-bit general purpose register representing either signed or unsigned 64-bit integer +static ASMJIT_INLINE_NODEBUG constexpr bool isGp64(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt64, TypeId::kUInt64); } //! Tests whether a given type is a scalar floating point of any size. -static inline constexpr bool isFloat(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kFloatStart, TypeId::_kFloatEnd); } +static ASMJIT_INLINE_NODEBUG constexpr bool isFloat(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kFloatStart, TypeId::_kFloatEnd); } //! Tests whether a given type is a scalar 32-bit float. -static inline constexpr bool isFloat32(TypeId typeId) noexcept { return typeId == TypeId::kFloat32; } +static ASMJIT_INLINE_NODEBUG constexpr bool isFloat32(TypeId typeId) noexcept { return typeId == TypeId::kFloat32; } //! Tests whether a given type is a scalar 64-bit float. -static inline constexpr bool isFloat64(TypeId typeId) noexcept { return typeId == TypeId::kFloat64; } +static ASMJIT_INLINE_NODEBUG constexpr bool isFloat64(TypeId typeId) noexcept { return typeId == TypeId::kFloat64; } //! Tests whether a given type is a scalar 80-bit float. -static inline constexpr bool isFloat80(TypeId typeId) noexcept { return typeId == TypeId::kFloat80; } - -static inline constexpr bool isMask(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kMaskStart, TypeId::_kMaskEnd); } -static inline constexpr bool isMask8(TypeId typeId) noexcept { return typeId == TypeId::kMask8; } -static inline constexpr bool isMask16(TypeId typeId) noexcept { return typeId == TypeId::kMask16; } -static inline constexpr bool isMask32(TypeId typeId) noexcept { return typeId == TypeId::kMask32; } -static inline constexpr bool isMask64(TypeId typeId) noexcept { return typeId == TypeId::kMask64; } - -static inline constexpr bool isMmx(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kMmxStart, TypeId::_kMmxEnd); } -static inline constexpr bool isMmx32(TypeId typeId) noexcept { return typeId == TypeId::kMmx32; } -static inline constexpr bool isMmx64(TypeId typeId) noexcept { return typeId == TypeId::kMmx64; } - -static inline constexpr bool isVec(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec32Start, TypeId::_kVec512End); } -static inline constexpr bool isVec32(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec32Start, TypeId::_kVec32End); } -static inline constexpr bool isVec64(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec64Start, TypeId::_kVec64End); } -static inline constexpr bool isVec128(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec128Start, TypeId::_kVec128End); } -static inline constexpr bool isVec256(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec256Start, TypeId::_kVec256End); } -static inline constexpr bool isVec512(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec512Start, TypeId::_kVec512End); } +static ASMJIT_INLINE_NODEBUG constexpr bool isFloat80(TypeId typeId) noexcept { return typeId == TypeId::kFloat80; } + +//! Tests whether a given type is a mask register of any size. +static ASMJIT_INLINE_NODEBUG constexpr bool isMask(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kMaskStart, TypeId::_kMaskEnd); } +//! Tests whether a given type is an 8-bit mask register. +static ASMJIT_INLINE_NODEBUG constexpr bool isMask8(TypeId typeId) noexcept { return typeId == TypeId::kMask8; } +//! Tests whether a given type is an 16-bit mask register. +static ASMJIT_INLINE_NODEBUG constexpr bool isMask16(TypeId typeId) noexcept { return typeId == TypeId::kMask16; } +//! Tests whether a given type is an 32-bit mask register. +static ASMJIT_INLINE_NODEBUG constexpr bool isMask32(TypeId typeId) noexcept { return typeId == TypeId::kMask32; } +//! Tests whether a given type is an 64-bit mask register. +static ASMJIT_INLINE_NODEBUG constexpr bool isMask64(TypeId typeId) noexcept { return typeId == TypeId::kMask64; } + +//! Tests whether a given type is an MMX register. +//! +//! \note MMX functionality is in general deprecated on X86 architecture. AsmJit provides it just for completeness. +static ASMJIT_INLINE_NODEBUG constexpr bool isMmx(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kMmxStart, TypeId::_kMmxEnd); } +//! Tests whether a given type is an MMX register, which only uses the low 32 bits of data (only specific cases). +//! +//! \note MMX functionality is in general deprecated on X86 architecture. AsmJit provides it just for completeness. +static ASMJIT_INLINE_NODEBUG constexpr bool isMmx32(TypeId typeId) noexcept { return typeId == TypeId::kMmx32; } +//! Tests whether a given type is an MMX register, which uses 64 bits of data (default). +//! +//! \note MMX functionality is in general deprecated on X86 architecture. AsmJit provides it just for completeness. +static ASMJIT_INLINE_NODEBUG constexpr bool isMmx64(TypeId typeId) noexcept { return typeId == TypeId::kMmx64; } + +//! Tests whether a given type is a vector register of any size. +static ASMJIT_INLINE_NODEBUG constexpr bool isVec(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec32Start, TypeId::_kVec512End); } +//! Tests whether a given type is a 32-bit or 32-bit view of a vector register. +static ASMJIT_INLINE_NODEBUG constexpr bool isVec32(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec32Start, TypeId::_kVec32End); } +//! Tests whether a given type is a 64-bit or 64-bit view of a vector register. +static ASMJIT_INLINE_NODEBUG constexpr bool isVec64(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec64Start, TypeId::_kVec64End); } +//! Tests whether a given type is a 128-bit or 128-bit view of a vector register. +static ASMJIT_INLINE_NODEBUG constexpr bool isVec128(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec128Start, TypeId::_kVec128End); } +//! Tests whether a given type is a 256-bit or 256-bit view of a vector register. +static ASMJIT_INLINE_NODEBUG constexpr bool isVec256(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec256Start, TypeId::_kVec256End); } +//! Tests whether a given type is a 512-bit or 512-bit view of a vector register. +static ASMJIT_INLINE_NODEBUG constexpr bool isVec512(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec512Start, TypeId::_kVec512End); } //! \cond enum TypeCategory : uint32_t { @@ -317,7 +341,7 @@ struct TypeIdOfT { //! Returns a corresponding \ref TypeId of `T` type. template -static inline constexpr TypeId typeIdOfT() noexcept { return TypeId(TypeIdOfT::kTypeId); } +static ASMJIT_INLINE_NODEBUG constexpr TypeId typeIdOfT() noexcept { return TypeId(TypeIdOfT::kTypeId); } //! Returns offset needed to convert a `kIntPtr` and `kUIntPtr` TypeId into a type that matches `registerSize` //! (general-purpose register size). If you find such TypeId it's then only about adding the offset to it. @@ -336,18 +360,18 @@ static inline constexpr TypeId typeIdOfT() noexcept { return TypeId(TypeIdOfT //! // The same, but by using TypeUtils::deabstract() function. //! typeId = TypeUtils::deabstract(typeId, deabstractDelta); //! ``` -static inline constexpr uint32_t deabstractDeltaOfSize(uint32_t registerSize) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr uint32_t deabstractDeltaOfSize(uint32_t registerSize) noexcept { return registerSize >= 8 ? uint32_t(TypeId::kInt64) - uint32_t(TypeId::kIntPtr) : uint32_t(TypeId::kInt32) - uint32_t(TypeId::kIntPtr); } //! Deabstracts a given `typeId` into a native type by using `deabstractDelta`, which was previously //! calculated by calling \ref deabstractDeltaOfSize() with a target native register size. -static inline constexpr TypeId deabstract(TypeId typeId, uint32_t deabstractDelta) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr TypeId deabstract(TypeId typeId, uint32_t deabstractDelta) noexcept { return isAbstract(typeId) ? TypeId(uint32_t(typeId) + deabstractDelta) : typeId; } -static inline constexpr TypeId scalarToVector(TypeId scalarTypeId, TypeId vecStartId) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr TypeId scalarToVector(TypeId scalarTypeId, TypeId vecStartId) noexcept { return TypeId(uint32_t(vecStartId) + uint32_t(scalarTypeId) - uint32_t(TypeId::kInt8)); } diff --git a/3rdparty/asmjit/src/asmjit/core/virtmem.cpp b/3rdparty/asmjit/src/asmjit/core/virtmem.cpp index 43766ef2cd23c..743847746af5b 100644 --- a/3rdparty/asmjit/src/asmjit/core/virtmem.cpp +++ b/3rdparty/asmjit/src/asmjit/core/virtmem.cpp @@ -6,7 +6,7 @@ #include "../core/api-build_p.h" #ifndef ASMJIT_NO_JIT -#include "../core/osutils.h" +#include "../core/osutils_p.h" #include "../core/string.h" #include "../core/support.h" #include "../core/virtmem.h" @@ -19,9 +19,42 @@ #include #include + #if !ASMJIT_ARCH_X86 + #include // required by gettimeofday() + #endif + // Linux has a `memfd_create` syscall that we would like to use, if available. #if defined(__linux__) #include + #include + + #ifndef MAP_HUGETLB + #define MAP_HUGETLB 0x40000 + #endif // MAP_HUGETLB + + #ifndef MAP_HUGE_SHIFT + #define MAP_HUGE_SHIFT 26 + #endif // MAP_HUGE_SHIFT + + #if !defined(MFD_CLOEXEC) + #define MFD_CLOEXEC 0x0001u + #endif // MFD_CLOEXEC + + #if !defined(MFD_NOEXEC_SEAL) + #define MFD_NOEXEC_SEAL 0x0008u + #endif // MFD_NOEXEC_SEAL + + #if !defined(MFD_EXEC) + #define MFD_EXEC 0x0010u + #endif // MFD_EXEC + + #ifndef MFD_HUGETLB + #define MFD_HUGETLB 0x0004 + #endif // MFD_HUGETLB + + #ifndef MFD_HUGE_SHIFT + #define MFD_HUGE_SHIFT 26 + #endif // MFD_HUGE_SHIFT #endif // Apple recently introduced MAP_JIT flag, which we want to use. @@ -42,25 +75,70 @@ #if !defined(MAP_ANONYMOUS) #define MAP_ANONYMOUS MAP_ANON #endif + + // Android NDK doesn't provide `shm_open()` and `shm_unlink()`. + #if !defined(__BIONIC__) && !defined(ASMJIT_NO_SHM_OPEN) + #define ASMJIT_HAS_SHM_OPEN + #endif + + #if defined(__APPLE__) || defined(__BIONIC__) || !defined(ASMJIT_HAS_SHM_OPEN) + #define ASMJIT_VM_SHM_DETECT 0 + #else + #define ASMJIT_VM_SHM_DETECT 1 + #endif + + #if defined(__APPLE__) && TARGET_OS_OSX + #if ASMJIT_ARCH_X86 != 0 + #define ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP + #endif + #if ASMJIT_ARCH_ARM >= 64 + #define ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP + #endif + #endif + + #if defined(__APPLE__) && ASMJIT_ARCH_X86 == 0 + #define ASMJIT_NO_DUAL_MAPPING + #endif + + #if defined(__NetBSD__) && defined(MAP_REMAPDUP) && defined(PROT_MPROTECT) + #define ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP + #endif + + #if !defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP) && \ + !defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP) && \ + !defined(ASMJIT_NO_DUAL_MAPPING) + #define ASMJIT_ANONYMOUS_MEMORY_USE_FD + #endif #endif #include -#if defined(__APPLE__) || defined(__BIONIC__) - #define ASMJIT_VM_SHM_DETECT 0 -#else - #define ASMJIT_VM_SHM_DETECT 1 -#endif +#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP) +#include +#include + +extern "C" { -// Android NDK doesn't provide `shm_open()` and `shm_unlink()`. -#if defined(__BIONIC__) - #define ASMJIT_VM_SHM_AVAILABLE 0 +#ifdef mig_external +mig_external #else - #define ASMJIT_VM_SHM_AVAILABLE 1 +extern #endif - -#if defined(__APPLE__) && ASMJIT_ARCH_ARM >= 64 - #define ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP +kern_return_t mach_vm_remap( + vm_map_t target_task, + mach_vm_address_t *target_address, + mach_vm_size_t size, + mach_vm_offset_t mask, + int flags, + vm_map_t src_task, + mach_vm_address_t src_address, + boolean_t copy, + vm_prot_t *cur_protection, + vm_prot_t *max_protection, + vm_inherit_t inheritance +); + +} // {extern "C"} #endif ASMJIT_BEGIN_SUB_NAMESPACE(VirtMem) @@ -68,7 +146,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(VirtMem) // Virtual Memory Utilities // ======================== -static const MemoryFlags dualMappingFilter[2] = { +ASMJIT_MAYBE_UNUSED +static const constexpr MemoryFlags dualMappingFilter[2] = { MemoryFlags::kAccessWrite | MemoryFlags::kMMapMaxAccessWrite, MemoryFlags::kAccessExecute | MemoryFlags::kMMapMaxAccessExecute }; @@ -90,7 +169,7 @@ struct ScopedHandle { HANDLE value; }; -static void getVMInfo(Info& vmInfo) noexcept { +static void detectVMInfo(Info& vmInfo) noexcept { SYSTEM_INFO systemInfo; ::GetSystemInfo(&systemInfo); @@ -98,6 +177,15 @@ static void getVMInfo(Info& vmInfo) noexcept { vmInfo.pageGranularity = systemInfo.dwAllocationGranularity; } +static size_t detectLargePageSize() noexcept { + return ::GetLargePageMinimum(); +} + +static bool hasDualMappingSupport() noexcept { + // TODO: This assumption works on X86 platforms, this may not work on AArch64. + return true; +} + // Returns windows-specific protectFlags from \ref MemoryFlags. static DWORD protectFlagsFromMemoryFlags(MemoryFlags memoryFlags) noexcept { DWORD protectFlags; @@ -122,7 +210,12 @@ static DWORD desiredAccessFromMemoryFlags(MemoryFlags memoryFlags) noexcept { } static HardenedRuntimeFlags getHardenedRuntimeFlags() noexcept { - return HardenedRuntimeFlags::kNone; + HardenedRuntimeFlags flags = HardenedRuntimeFlags::kNone; + + if (hasDualMappingSupport()) + flags |= HardenedRuntimeFlags::kDualMapping; + + return flags; } Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept { @@ -130,9 +223,23 @@ Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept { if (size == 0) return DebugUtils::errored(kErrorInvalidArgument); + DWORD allocationType = MEM_COMMIT | MEM_RESERVE; DWORD protectFlags = protectFlagsFromMemoryFlags(memoryFlags); - void* result = ::VirtualAlloc(nullptr, size, MEM_COMMIT | MEM_RESERVE, protectFlags); + if (Support::test(memoryFlags, MemoryFlags::kMMapLargePages)) { + size_t lpSize = largePageSize(); + + // Does it make sense to call VirtualAlloc() if we failed to query large page size? + if (lpSize == 0) + return DebugUtils::errored(kErrorFeatureNotEnabled); + + if (!Support::isAligned(size, lpSize)) + return DebugUtils::errored(kErrorInvalidArgument); + + allocationType |= MEM_LARGE_PAGES; + } + + void* result = ::VirtualAlloc(nullptr, size, allocationType, protectFlags); if (!result) return DebugUtils::errored(kErrorOutOfMemory); @@ -142,7 +249,9 @@ Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept { Error release(void* p, size_t size) noexcept { DebugUtils::unused(size); - if (ASMJIT_UNLIKELY(!::VirtualFree(p, 0, MEM_RELEASE))) + // NOTE: If the `dwFreeType` parameter is MEM_RELEASE, `size` parameter must be zero. + constexpr DWORD dwFreeType = MEM_RELEASE; + if (ASMJIT_UNLIKELY(!::VirtualFree(p, 0, dwFreeType))) return DebugUtils::errored(kErrorInvalidArgument); return kErrorOk; } @@ -183,7 +292,7 @@ Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) no ptr[i] = ::MapViewOfFile(handle.value, desiredAccess, 0, 0, size); if (ptr[i] == nullptr) { - if (i == 0) + if (i == 1u) ::UnmapViewOfFile(ptr[0]); return DebugUtils::errored(kErrorOutOfMemory); } @@ -214,26 +323,52 @@ Error releaseDualMapping(DualMapping* dm, size_t size) noexcept { #endif -// Virtual Memory [Posix] -// ====================== +// Virtual Memory [Unix] +// ===================== #if !defined(_WIN32) -static void getVMInfo(Info& vmInfo) noexcept { - uint32_t pageSize = uint32_t(::getpagesize()); +// Virtual Memory [Unix] - Utilities +// ================================= - vmInfo.pageSize = pageSize; - vmInfo.pageGranularity = Support::max(pageSize, 65536); -} +#if defined(__linux__) || (defined(__APPLE__) && TARGET_OS_OSX) +struct KernelVersion { + long ver[2]; -#if !defined(SHM_ANON) -static const char* getTmpDir() noexcept { - const char* tmpDir = getenv("TMPDIR"); - return tmpDir ? tmpDir : "/tmp"; + inline long major() const noexcept { return ver[0]; } + inline long minor() const noexcept { return ver[1]; } + + inline bool eq(long major, long minor) const noexcept { return ver[0] == major && ver[1] == minor; } + inline bool ge(long major, long minor) const noexcept { return ver[0] > major || (ver[0] == major && ver[1] >= minor); } +}; + +ASMJIT_MAYBE_UNUSED +static KernelVersion getKernelVersion() noexcept { + KernelVersion out {}; + struct utsname buf {}; + + uname(&buf); + + size_t i = 0; + char* p = buf.release; + + while (*p && i < 2u) { + uint8_t c = uint8_t(*p); + if (c >= uint8_t('0') && c <= uint8_t('9')) { + out.ver[i] = strtol(p, &p, 10); + i++; + continue; + } + + p++; + } + + return out; } -#endif +#endif // getKernelVersion // Translates libc errors specific to VirtualMemory mapping to `asmjit::Error`. +ASMJIT_MAYBE_UNUSED static Error asmjitErrorFromErrno(int e) noexcept { switch (e) { case EACCES: @@ -256,16 +391,149 @@ static Error asmjitErrorFromErrno(int e) noexcept { } } +ASMJIT_MAYBE_UNUSED +static MemoryFlags maxAccessFlagsToRegularAccessFlags(MemoryFlags memoryFlags) noexcept { + static constexpr uint32_t kMaxProtShift = Support::ConstCTZ::value; + return MemoryFlags(uint32_t(memoryFlags & MemoryFlags::kMMapMaxAccessRWX) >> kMaxProtShift); +} + +ASMJIT_MAYBE_UNUSED +static MemoryFlags regularAccessFlagsToMaxAccessFlags(MemoryFlags memoryFlags) noexcept { + static constexpr uint32_t kMaxProtShift = Support::ConstCTZ::value; + return MemoryFlags(uint32_t(memoryFlags & MemoryFlags::kAccessRWX) << kMaxProtShift); +} + +// Returns `mmap()` protection flags from \ref MemoryFlags. +ASMJIT_MAYBE_UNUSED +static int mmProtFromMemoryFlags(MemoryFlags memoryFlags) noexcept { + int protection = 0; + if (Support::test(memoryFlags, MemoryFlags::kAccessRead)) protection |= PROT_READ; + if (Support::test(memoryFlags, MemoryFlags::kAccessWrite)) protection |= PROT_READ | PROT_WRITE; + if (Support::test(memoryFlags, MemoryFlags::kAccessExecute)) protection |= PROT_READ | PROT_EXEC; + return protection; +} + +// Returns maximum protection flags from `memoryFlags`. +// +// Uses: +// - `PROT_MPROTECT()` on NetBSD. +// - `PROT_MAX()` when available on other BSDs. +ASMJIT_MAYBE_UNUSED +static inline int mmMaxProtFromMemoryFlags(MemoryFlags memoryFlags) noexcept { + MemoryFlags acc = maxAccessFlagsToRegularAccessFlags(memoryFlags); + if (acc != MemoryFlags::kNone) { +#if defined(__NetBSD__) && defined(PROT_MPROTECT) + return PROT_MPROTECT(mmProtFromMemoryFlags(acc)); +#elif defined(PROT_MAX) + return PROT_MAX(mmProtFromMemoryFlags(acc)); +#else + return 0; +#endif + } + + return 0; +} + +static void detectVMInfo(Info& vmInfo) noexcept { + uint32_t pageSize = uint32_t(::getpagesize()); + + vmInfo.pageSize = pageSize; + vmInfo.pageGranularity = Support::max(pageSize, 65536); +} + +static size_t detectLargePageSize() noexcept { +#if defined(__APPLE__) && defined(VM_FLAGS_SUPERPAGE_SIZE_2MB) && ASMJIT_ARCH_X86 + return 2u * 1024u * 1024u; +#elif defined(__FreeBSD__) + Support::Array pageSize; + // TODO: Does it return unsigned? + return (getpagesizes(pageSize.data(), 2) < 2) ? 0 : uint32_t(pageSize[1]); +#elif defined(__linux__) + StringTmp<128> storage; + if (OSUtils::readFile("/sys/kernel/mm/transparent_hugepage/hpage_pmd_size", storage, 16) != kErrorOk || storage.empty()) + return 0u; + + // The first value should be the size of the page (hpage_pmd_size). + size_t largePageSize = 0; + + const char* buf = storage.data(); + size_t bufSize = storage.size(); + + for (size_t i = 0; i < bufSize; i++) { + uint32_t digit = uint32_t(uint8_t(buf[i]) - uint8_t('0')); + if (digit >= 10u) + break; + largePageSize = largePageSize * 10 + digit; + } + + if (Support::isPowerOf2(largePageSize)) + return largePageSize; + else + return 0u; +#else + return 0u; +#endif +} + +// Virtual Memory [Posix] - Anonymous Memory +// ========================================= + +#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD) + // Some operating systems don't allow /dev/shm to be executable. On Linux this happens when /dev/shm is mounted with // 'noexec', which is enforced by systemd. Other operating systems like MacOS also restrict executable permissions // regarding /dev/shm, so we use a runtime detection before attempting to allocate executable memory. Sometimes we -// don't need the detection as we know it would always result in `ShmStrategy::kTmpDir`. -enum class ShmStrategy : uint32_t { +// don't need the detection as we know it would always result in `AnonymousMemoryStrategy::kTmpDir`. +enum class AnonymousMemoryStrategy : uint32_t { kUnknown = 0, kDevShm = 1, kTmpDir = 2 }; +#if !defined(SHM_ANON) +static const char* getTmpDir() noexcept { + const char* tmpDir = getenv("TMPDIR"); + return tmpDir ? tmpDir : "/tmp"; +} +#endif + +#if defined(__linux__) && defined(__NR_memfd_create) +static uint32_t getMfdExecFlag() noexcept { + static std::atomic cachedMfdExecSupported; + uint32_t val = cachedMfdExecSupported.load(); + + if (val == 0u) { + KernelVersion ver = getKernelVersion(); + val = uint32_t(ver.ge(6, 3)) + 1u; + cachedMfdExecSupported.store(val); + } + + return val == 2u ? uint32_t(MFD_EXEC) : uint32_t(0u); +} +#endif // __linux__ && __NR_memfd_create + + +// It's not fully random, just to avoid collisions when opening TMP or SHM file. +ASMJIT_MAYBE_UNUSED +static uint64_t generateRandomBits(uintptr_t stackPtr, uint32_t attempt) noexcept { + static std::atomic internalCounter; + +#if defined(__GNUC__) && ASMJIT_ARCH_X86 + // Use RDTSC instruction to avoid gettimeofday() as we just need some "random" bits. + uint64_t mix = __builtin_ia32_rdtsc(); +#else + struct timeval tm {}; + uint64_t mix = 1; // only used when gettimeofday() fails, which is unlikely. + if (gettimeofday(&tm, nullptr) == 0) { + mix = uint64_t(tm.tv_usec) ^ uint64_t(tm.tv_sec); + } +#endif + + uint64_t bits = (uint64_t(stackPtr) & 0x1010505000055590u) - mix * 773703683; + bits = (bits >> 33) ^ (bits << 7) ^ (attempt * 87178291199); + return bits + uint64_t(++internalCounter) * 10619863; +} + class AnonymousMemory { public: enum FileType : uint32_t { @@ -294,13 +562,17 @@ class AnonymousMemory { #if defined(__linux__) && defined(__NR_memfd_create) // Linux specific 'memfd_create' - if the syscall returns `ENOSYS` it means // it's not available and we will never call it again (would be pointless). + // + // NOTE: There is also memfd_create() libc function in FreeBSD, but it internally + // uses `shm_open(SHM_ANON, ...)` so it's not needed to add support for it (it's + // not a syscall as in Linux). // Zero initialized, if ever changed to '1' that would mean the syscall is not - // available and we must use `shm_open()` and `shm_unlink()`. + // available and we must use `shm_open()` and `shm_unlink()` (or regular `open()`). static volatile uint32_t memfd_create_not_supported; if (!memfd_create_not_supported) { - _fd = (int)syscall(__NR_memfd_create, "vmem", 0); + _fd = (int)syscall(__NR_memfd_create, "vmem", MFD_CLOEXEC | getMfdExecFlag()); if (ASMJIT_LIKELY(_fd >= 0)) return kErrorOk; @@ -310,9 +582,9 @@ class AnonymousMemory { else return DebugUtils::errored(asmjitErrorFromErrno(e)); } -#endif +#endif // __linux__ && __NR_memfd_create -#if defined(SHM_ANON) +#if defined(ASMJIT_HAS_SHM_OPEN) && defined(SHM_ANON) // Originally FreeBSD extension, apparently works in other BSDs too. DebugUtils::unused(preferTmpOverDevShm); _fd = ::shm_open(SHM_ANON, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); @@ -322,32 +594,26 @@ class AnonymousMemory { else return DebugUtils::errored(asmjitErrorFromErrno(errno)); #else - // POSIX API. We have to generate somehow a unique name. This is nothing cryptographic, just using a bit from - // the stack address to always have a different base for different threads (as threads have their own stack) - // and retries for avoiding collisions. We use `shm_open()` with flags that require creation of the file so we - // never open an existing shared memory. - static std::atomic internalCounter; - const char* kShmFormat = "/shm-id-%016llX"; - + // POSIX API. We have to generate somehow a unique name, so use `generateRandomBits()` helper. To prevent + // having file collisions we use `shm_open()` with flags that require creation of the file so we never open + // an existing shared memory. + static const char kShmFormat[] = "/shm-id-%016llX"; uint32_t kRetryCount = 100; - uint64_t bits = ((uintptr_t)(void*)this) & 0x55555555u; for (uint32_t i = 0; i < kRetryCount; i++) { - bits -= uint64_t(OSUtils::getTickCount()) * 773703683; - bits = ((bits >> 14) ^ (bits << 6)) + uint64_t(++internalCounter) * 10619863; - bool useTmp = !ASMJIT_VM_SHM_DETECT || preferTmpOverDevShm; + uint64_t bits = generateRandomBits((uintptr_t)this, i); if (useTmp) { _tmpName.assign(getTmpDir()); _tmpName.appendFormat(kShmFormat, (unsigned long long)bits); - _fd = ::open(_tmpName.data(), O_RDWR | O_CREAT | O_EXCL, 0); + _fd = ASMJIT_FILE64_API(::open)(_tmpName.data(), O_RDWR | O_CREAT | O_EXCL, 0); if (ASMJIT_LIKELY(_fd >= 0)) { _fileType = kFileTypeTmp; return kErrorOk; } } -#if ASMJIT_VM_SHM_AVAILABLE +#if defined(ASMJIT_HAS_SHM_OPEN) else { _tmpName.assignFormat(kShmFormat, (unsigned long long)bits); _fd = ::shm_open(_tmpName.data(), O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); @@ -371,7 +637,7 @@ class AnonymousMemory { FileType type = _fileType; _fileType = kFileTypeNone; -#if ASMJIT_VM_SHM_AVAILABLE +#ifdef ASMJIT_HAS_SHM_OPEN if (type == kFileTypeShm) { ::shm_unlink(_tmpName.data()); return; @@ -393,31 +659,71 @@ class AnonymousMemory { Error allocate(size_t size) noexcept { // TODO: Improve this by using `posix_fallocate()` when available. - if (ftruncate(_fd, off_t(size)) != 0) + if (ASMJIT_FILE64_API(ftruncate)(_fd, off_t(size)) != 0) return DebugUtils::errored(asmjitErrorFromErrno(errno)); return kErrorOk; } }; -// Returns `mmap()` protection flags from \ref MemoryFlags. -static int mmProtFromMemoryFlags(MemoryFlags memoryFlags) noexcept { - int protection = 0; - if (Support::test(memoryFlags, MemoryFlags::kAccessRead)) protection |= PROT_READ; - if (Support::test(memoryFlags, MemoryFlags::kAccessWrite)) protection |= PROT_READ | PROT_WRITE; - if (Support::test(memoryFlags, MemoryFlags::kAccessExecute)) protection |= PROT_READ | PROT_EXEC; - return protection; +#if ASMJIT_VM_SHM_DETECT +static Error detectAnonymousMemoryStrategy(AnonymousMemoryStrategy* strategyOut) noexcept { + AnonymousMemory anonMem; + Info vmInfo = info(); + + ASMJIT_PROPAGATE(anonMem.open(false)); + ASMJIT_PROPAGATE(anonMem.allocate(vmInfo.pageSize)); + + void* ptr = mmap(nullptr, vmInfo.pageSize, PROT_READ | PROT_EXEC, MAP_SHARED, anonMem.fd(), 0); + if (ptr == MAP_FAILED) { + int e = errno; + if (e == EINVAL) { + *strategyOut = AnonymousMemoryStrategy::kTmpDir; + return kErrorOk; + } + return DebugUtils::errored(asmjitErrorFromErrno(e)); + } + else { + munmap(ptr, vmInfo.pageSize); + *strategyOut = AnonymousMemoryStrategy::kDevShm; + return kErrorOk; + } } +#endif -#if defined(__APPLE__) -// Detects whether the current process is hardened, which means that pages that have WRITE and EXECUTABLE flags cannot -// be allocated without MAP_JIT flag. -static inline bool hasHardenedRuntimeMacOS() noexcept { -#if TARGET_OS_OSX && ASMJIT_ARCH_ARM >= 64 - // MacOS on AArch64 has always hardened runtime enabled. +static Error getAnonymousMemoryStrategy(AnonymousMemoryStrategy* strategyOut) noexcept { +#if ASMJIT_VM_SHM_DETECT + // Initially don't assume anything. It has to be tested whether '/dev/shm' was mounted with 'noexec' flag or not. + static std::atomic cachedStrategy; + + AnonymousMemoryStrategy strategy = static_cast(cachedStrategy.load()); + if (strategy == AnonymousMemoryStrategy::kUnknown) { + ASMJIT_PROPAGATE(detectAnonymousMemoryStrategy(&strategy)); + cachedStrategy.store(static_cast(strategy)); + } + + *strategyOut = strategy; + return kErrorOk; +#else + *strategyOut = AnonymousMemoryStrategy::kTmpDir; + return kErrorOk; +#endif +} + +#endif // ASMJIT_ANONYMOUS_MEMORY_USE_FD + +// Virtual Memory [Posix] - Hardened Runtime & MAP_JIT +// =================================================== + +// Detects whether the current process is hardened, which means that pages that have WRITE and EXECUTABLE flags +// cannot be normally allocated. On OSX + AArch64 such allocation requires MAP_JIT flag, other platforms don't +// support this combination. +static bool hasHardenedRuntime() noexcept { +#if defined(__APPLE__) && TARGET_OS_OSX && ASMJIT_ARCH_ARM >= 64 + // OSX on AArch64 has always hardened runtime enabled. return true; #else - static std::atomic globalHardenedFlag; + static std::atomic cachedHardenedFlag; enum HardenedFlag : uint32_t { kHardenedFlagUnknown = 0, @@ -425,11 +731,11 @@ static inline bool hasHardenedRuntimeMacOS() noexcept { kHardenedFlagEnabled = 2 }; - uint32_t flag = globalHardenedFlag.load(); + uint32_t flag = cachedHardenedFlag.load(); if (flag == kHardenedFlagUnknown) { - size_t pageSize = ::getpagesize(); + size_t pageSize = size_t(::getpagesize()); + void* ptr = mmap(nullptr, pageSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - void* ptr = mmap(nullptr, pageSize, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (ptr == MAP_FAILED) { flag = kHardenedFlagEnabled; } @@ -437,63 +743,49 @@ static inline bool hasHardenedRuntimeMacOS() noexcept { flag = kHardenedFlagDisabled; munmap(ptr, pageSize); } - globalHardenedFlag.store(flag); + + cachedHardenedFlag.store(flag); } return flag == kHardenedFlagEnabled; #endif } -static inline bool hasMapJitSupportMacOS() noexcept { -#if TARGET_OS_OSX && ASMJIT_ARCH_ARM >= 64 - // MacOS for 64-bit AArch architecture always uses hardened runtime. Some documentation can be found here: +// Detects whether MAP_JIT is available. +static inline bool hasMapJitSupport() noexcept { +#if defined(__APPLE__) && TARGET_OS_OSX && ASMJIT_ARCH_X86 == 0 + // Apple platforms always use hardened runtime + MAP_JIT on non-x86 hardware: // - https://developer.apple.com/documentation/apple_silicon/porting_just-in-time_compilers_to_apple_silicon return true; -#elif TARGET_OS_OSX - // MAP_JIT flag required to run unsigned JIT code is only supported by kernel version 10.14+ (Mojave) and IOS. - static std::atomic globalVersion; - - int ver = globalVersion.load(); - if (!ver) { - struct utsname osname {}; - uname(&osname); - ver = atoi(osname.release); - globalVersion.store(ver); +#elif defined(__APPLE__) && TARGET_OS_OSX + // MAP_JIT flag required to run unsigned JIT code is only supported by kernel version 10.14+ (Mojave). + static std::atomic cachedMapJitSupport; + uint32_t val = cachedMapJitSupport.load(); + + if (val == 0u) { + KernelVersion ver = getKernelVersion(); + val = uint32_t(ver.ge(18, 0)) + 1u; + cachedMapJitSupport.store(val); } - return ver >= 18; -#else - // Assume it's available. - return true; -#endif -} -#endif // __APPLE__ -// Detects whether the current process is hardened, which means that pages that have WRITE and EXECUTABLE flags -// cannot be normally allocated. On MacOS such allocation requires MAP_JIT flag. -static inline bool hasHardenedRuntime() noexcept { -#if defined(__APPLE__) - return hasHardenedRuntimeMacOS(); + return val == 2u; #else + // MAP_JIT is not available (it's only available on OSX). return false; #endif } -// Detects whether MAP_JIT is available. -static inline bool hasMapJitSupport() noexcept { -#if defined(__APPLE__) - return hasMapJitSupportMacOS(); -#else - return false; -#endif -} - -// Returns either MAP_JIT or 0 based on `flags` and the host operating system. +// Returns either MAP_JIT or 0 based on `memoryFlags` and the host operating system. static inline int mmMapJitFromMemoryFlags(MemoryFlags memoryFlags) noexcept { #if defined(__APPLE__) // Always use MAP_JIT flag if user asked for it (could be used for testing on non-hardened processes) and detect // whether it must be used when the process is actually hardened (in that case it doesn't make sense to rely on // user `memoryFlags`). - bool useMapJit = Support::test(memoryFlags, MemoryFlags::kMMapEnableMapJit) || hasHardenedRuntime(); + // + // MAP_JIT is not required when dual-mapping memory and is incompatible with MAP_SHARED, so it will not be + // added when the latter is enabled. + bool useMapJit = (Support::test(memoryFlags, MemoryFlags::kMMapEnableMapJit) || hasHardenedRuntime()) + && !Support::test(memoryFlags, MemoryFlags::kMapShared); if (useMapJit) return hasMapJitSupport() ? int(MAP_JIT) : 0; else @@ -504,121 +796,252 @@ static inline int mmMapJitFromMemoryFlags(MemoryFlags memoryFlags) noexcept { #endif } -// Returns BSD-specific `PROT_MAX()` flags. -static inline int mmMaxProtFromMemoryFlags(MemoryFlags memoryFlags) noexcept { -#if defined(PROT_MAX) - static constexpr uint32_t kMaxProtShift = Support::ConstCTZ::value; - - if (Support::test(memoryFlags, MemoryFlags::kMMapMaxAccessReadWrite | MemoryFlags::kMMapMaxAccessExecute)) - return PROT_MAX(mmProtFromMemoryFlags((MemoryFlags)(uint32_t(memoryFlags) >> kMaxProtShift))); - else - return 0; -#else - DebugUtils::unused(memoryFlags); - return 0; -#endif -} - -#if ASMJIT_VM_SHM_DETECT -static Error detectShmStrategy(ShmStrategy* strategyOut) noexcept { - AnonymousMemory anonMem; - Info vmInfo = info(); - - ASMJIT_PROPAGATE(anonMem.open(false)); - ASMJIT_PROPAGATE(anonMem.allocate(vmInfo.pageSize)); - - void* ptr = mmap(nullptr, vmInfo.pageSize, PROT_READ | PROT_EXEC, MAP_SHARED, anonMem.fd(), 0); - if (ptr == MAP_FAILED) { - int e = errno; - if (e == EINVAL) { - *strategyOut = ShmStrategy::kTmpDir; - return kErrorOk; - } - return DebugUtils::errored(asmjitErrorFromErrno(e)); - } - else { - munmap(ptr, vmInfo.pageSize); - *strategyOut = ShmStrategy::kDevShm; - return kErrorOk; - } -} -#endif - -static Error getShmStrategy(ShmStrategy* strategyOut) noexcept { -#if ASMJIT_VM_SHM_DETECT - // Initially don't assume anything. It has to be tested whether '/dev/shm' was mounted with 'noexec' flag or not. - static std::atomic globalShmStrategy; - - ShmStrategy strategy = static_cast(globalShmStrategy.load()); - if (strategy == ShmStrategy::kUnknown) { - ASMJIT_PROPAGATE(detectShmStrategy(&strategy)); - globalShmStrategy.store(static_cast(strategy)); - } - - *strategyOut = strategy; - return kErrorOk; +static inline bool hasDualMappingSupport() noexcept { +#if defined(ASMJIT_NO_DUAL_MAPPING) + return false; #else - *strategyOut = ShmStrategy::kTmpDir; - return kErrorOk; + return true; #endif } static HardenedRuntimeFlags getHardenedRuntimeFlags() noexcept { - HardenedRuntimeFlags hrFlags = HardenedRuntimeFlags::kNone; + HardenedRuntimeFlags flags = HardenedRuntimeFlags::kNone; if (hasHardenedRuntime()) - hrFlags |= HardenedRuntimeFlags::kEnabled; + flags |= HardenedRuntimeFlags::kEnabled; if (hasMapJitSupport()) - hrFlags |= HardenedRuntimeFlags::kMapJit; + flags |= HardenedRuntimeFlags::kMapJit; + + if (hasDualMappingSupport()) + flags |= HardenedRuntimeFlags::kDualMapping; - return hrFlags; + return flags; } -Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept { +static Error mapMemory(void** p, size_t size, MemoryFlags memoryFlags, int fd = -1, off_t offset = 0) noexcept { *p = nullptr; if (size == 0) return DebugUtils::errored(kErrorInvalidArgument); int protection = mmProtFromMemoryFlags(memoryFlags) | mmMaxProtFromMemoryFlags(memoryFlags); - int mmFlags = MAP_PRIVATE | MAP_ANONYMOUS | mmMapJitFromMemoryFlags(memoryFlags); + int mmFlags = mmMapJitFromMemoryFlags(memoryFlags); + + mmFlags |= Support::test(memoryFlags, MemoryFlags::kMapShared) ? MAP_SHARED : MAP_PRIVATE; + if (fd == -1) + mmFlags |= MAP_ANONYMOUS; - void* ptr = mmap(nullptr, size, protection, mmFlags, -1, 0); + bool useLargePages = Support::test(memoryFlags, VirtMem::MemoryFlags::kMMapLargePages); + + if (useLargePages) { +#if defined(__linux__) + size_t lpSize = largePageSize(); + if (lpSize == 0) + return DebugUtils::errored(kErrorFeatureNotEnabled); + + if (!Support::isAligned(size, lpSize)) + return DebugUtils::errored(kErrorInvalidArgument); + + unsigned lpSizeLog2 = Support::ctz(lpSize); + mmFlags |= int(unsigned(MAP_HUGETLB) | (lpSizeLog2 << MAP_HUGE_SHIFT)); +#else + return DebugUtils::errored(kErrorFeatureNotEnabled); +#endif // __linux__ + } + + void* ptr = mmap(nullptr, size, protection, mmFlags, fd, offset); if (ptr == MAP_FAILED) - return DebugUtils::errored(kErrorOutOfMemory); + return DebugUtils::errored(asmjitErrorFromErrno(errno)); + +#if defined(MADV_HUGEPAGE) + if (useLargePages) { + madvise(ptr, size, MADV_HUGEPAGE); + } +#endif *p = ptr; return kErrorOk; } -Error release(void* p, size_t size) noexcept { +static Error unmapMemory(void* p, size_t size) noexcept { if (ASMJIT_UNLIKELY(munmap(p, size) != 0)) - return DebugUtils::errored(kErrorInvalidArgument); + return DebugUtils::errored(asmjitErrorFromErrno(errno)); return kErrorOk; } +Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept { + return mapMemory(p, size, memoryFlags); +} + +Error release(void* p, size_t size) noexcept { + return unmapMemory(p, size); +} Error protect(void* p, size_t size, MemoryFlags memoryFlags) noexcept { int protection = mmProtFromMemoryFlags(memoryFlags); if (mprotect(p, size, protection) == 0) return kErrorOk; - return DebugUtils::errored(kErrorInvalidArgument); + return DebugUtils::errored(asmjitErrorFromErrno(errno)); } -Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept { +// Virtual Memory [Posix] - Dual Mapping +// ===================================== + +#if !defined(ASMJIT_NO_DUAL_MAPPING) +static Error unmapDualMapping(DualMapping* dm, size_t size) noexcept { + Error err1 = unmapMemory(dm->rx, size); + Error err2 = kErrorOk; + + if (dm->rx != dm->rw) + err2 = unmapMemory(dm->rw, size); + + // We can report only one error, so report the first... + if (err1 || err2) + return DebugUtils::errored(err1 ? err1 : err2); + dm->rx = nullptr; dm->rw = nullptr; + return kErrorOk; +} +#endif // !ASMJIT_NO_DUAL_MAPPING - if (off_t(size) <= 0) - return DebugUtils::errored(size == 0 ? kErrorInvalidArgument : kErrorTooLarge); +#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP) +static Error allocDualMappingUsingRemapdup(DualMapping* dmOut, size_t size, MemoryFlags memoryFlags) noexcept { + MemoryFlags maxAccessFlags = regularAccessFlagsToMaxAccessFlags(memoryFlags); + MemoryFlags finalFlags = memoryFlags | maxAccessFlags | MemoryFlags::kMapShared; + + MemoryFlags rxFlags = finalFlags & ~(MemoryFlags::kAccessWrite | MemoryFlags::kMMapMaxAccessWrite); + MemoryFlags rwFlags = finalFlags & ~(MemoryFlags::kAccessExecute); + + // Allocate RW mapping. + DualMapping dm {}; + ASMJIT_PROPAGATE(mapMemory(&dm.rw, size, rwFlags)); + + // Allocate RX mapping. + dm.rx = mremap(dm.rw, size, nullptr, size, MAP_REMAPDUP); + if (dm.rx == MAP_FAILED) { + int e = errno; + munmap(dm.rw, size); + return DebugUtils::errored(asmjitErrorFromErrno(e)); + } + + if (mprotect(dm.rx, size, mmProtFromMemoryFlags(rxFlags)) != 0) { + int e = errno; + unmapDualMapping(&dm, size); + return DebugUtils::errored(asmjitErrorFromErrno(e)); + } + + *dmOut = dm; + return kErrorOk; +} +#endif + +#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP) +static Error asmjitErrorFromKernResult(kern_return_t result) noexcept { + switch (result) { + case KERN_PROTECTION_FAILURE: + return DebugUtils::errored(kErrorProtectionFailure); + case KERN_NO_SPACE: + return DebugUtils::errored(kErrorOutOfMemory); + case KERN_INVALID_ARGUMENT: + return DebugUtils::errored(kErrorInvalidArgument); + default: + return DebugUtils::errored(kErrorInvalidState); + } +} + +static Error allocDualMappingUsingMachVmRemap(DualMapping* dmOut, size_t size, MemoryFlags memoryFlags) noexcept { + DualMapping dm {}; + + MemoryFlags mmapFlags = MemoryFlags::kAccessReadWrite | (memoryFlags & MemoryFlags::kMapShared); + ASMJIT_PROPAGATE(mapMemory(&dm.rx, size, mmapFlags)); + + vm_prot_t curProt; + vm_prot_t maxProt; + + int rwProtectFlags = VM_PROT_READ | VM_PROT_WRITE; + int rxProtectFlags = VM_PROT_READ; + + if (Support::test(memoryFlags, MemoryFlags::kAccessExecute)) + rxProtectFlags |= VM_PROT_EXECUTE; + + kern_return_t result {}; + do { + vm_map_t task = mach_task_self(); + mach_vm_address_t remappedAddr {}; + +#if defined(VM_FLAGS_RANDOM_ADDR) + int remapFlags = VM_FLAGS_ANYWHERE | VM_FLAGS_RANDOM_ADDR; +#else + int remapFlags = VM_FLAGS_ANYWHERE; +#endif + + // Try to remap the existing memory into a different address. + result = mach_vm_remap( + task, // target_task + &remappedAddr, // target_address + size, // size + 0, // mask + remapFlags, // flags + task, // src_task + (mach_vm_address_t)dm.rx, // src_address + false, // copy + &curProt, // cur_protection + &maxProt, // max_protection + VM_INHERIT_DEFAULT); // inheritance + + if (result != KERN_SUCCESS) + break; + + dm.rw = (void*)remappedAddr; + + // Now, try to change permissions of both map regions into RW and RX. The vm_protect() + // API is used twice as we also want to set maximum permissions, so nobody would be + // allowed to change the RX region back to RW or RWX (if RWX is allowed). + uint32_t i; + for (i = 0; i < 2; i++) { + bool setMaximum = (i == 0); + + result = vm_protect( + task, // target_task + (vm_address_t)dm.rx, // address + size, // size + setMaximum, // set_maximum + rxProtectFlags); // new_protection + + if (result != KERN_SUCCESS) + break; + + result = vm_protect(task, // target_task + (vm_address_t)dm.rw, // address + size, // size + setMaximum, // set_maximum + rwProtectFlags); // new_protection + + if (result != KERN_SUCCESS) + break; + } + } while (0); + + if (result != KERN_SUCCESS) { + unmapDualMapping(&dm, size); + return DebugUtils::errored(asmjitErrorFromKernResult(result)); + } + *dmOut = dm; + return kErrorOk; +} +#endif // ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP + +#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD) +static Error allocDualMappingUsingFile(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept { bool preferTmpOverDevShm = Support::test(memoryFlags, MemoryFlags::kMappingPreferTmp); if (!preferTmpOverDevShm) { - ShmStrategy strategy; - ASMJIT_PROPAGATE(getShmStrategy(&strategy)); - preferTmpOverDevShm = (strategy == ShmStrategy::kTmpDir); + AnonymousMemoryStrategy strategy; + ASMJIT_PROPAGATE(getAnonymousMemoryStrategy(&strategy)); + preferTmpOverDevShm = (strategy == AnonymousMemoryStrategy::kTmpDir); } AnonymousMemory anonMem; @@ -627,16 +1050,12 @@ Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) no void* ptr[2]; for (uint32_t i = 0; i < 2; i++) { - MemoryFlags accessFlags = memoryFlags & ~dualMappingFilter[i]; - int protection = mmProtFromMemoryFlags(accessFlags) | mmMaxProtFromMemoryFlags(accessFlags); - - ptr[i] = mmap(nullptr, size, protection, MAP_SHARED, anonMem.fd(), 0); - if (ptr[i] == MAP_FAILED) { - // Get the error now before `munmap()` has a chance to clobber it. - int e = errno; + MemoryFlags restrictedMemoryFlags = memoryFlags & ~dualMappingFilter[i]; + Error err = mapMemory(&ptr[i], size, restrictedMemoryFlags | MemoryFlags::kMapShared, anonMem.fd(), 0); + if (err != kErrorOk) { if (i == 1) - munmap(ptr[0], size); - return DebugUtils::errored(asmjitErrorFromErrno(e)); + unmapMemory(ptr[0], size); + return err; } } @@ -644,18 +1063,38 @@ Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) no dm->rw = ptr[1]; return kErrorOk; } +#endif // ASMJIT_ANONYMOUS_MEMORY_USE_FD -Error releaseDualMapping(DualMapping* dm, size_t size) noexcept { - Error err = release(dm->rx, size); - if (dm->rx != dm->rw) - err |= release(dm->rw, size); - - if (err) - return DebugUtils::errored(kErrorInvalidArgument); - +Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept { dm->rx = nullptr; dm->rw = nullptr; - return kErrorOk; + +#if defined(ASMJIT_NO_DUAL_MAPPING) + DebugUtils::unused(size, memoryFlags); + return DebugUtils::errored(kErrorFeatureNotEnabled); +#else + if (off_t(size) <= 0) + return DebugUtils::errored(size == 0 ? kErrorInvalidArgument : kErrorTooLarge); + +#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP) + return allocDualMappingUsingRemapdup(dm, size, memoryFlags); +#elif defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP) + return allocDualMappingUsingMachVmRemap(dm, size, memoryFlags); +#elif defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD) + return allocDualMappingUsingFile(dm, size, memoryFlags); +#else + #error "[asmjit] VirtMem::allocDualMapping() doesn't have implementation for the target OS or architecture" +#endif +#endif // ASMJIT_NO_DUAL_MAPPING +} + +Error releaseDualMapping(DualMapping* dm, size_t size) noexcept { +#if defined(ASMJIT_NO_DUAL_MAPPING) + DebugUtils::unused(dm, size); + return DebugUtils::errored(kErrorFeatureNotEnabled); +#else + return unmapDualMapping(dm, size); +#endif // ASMJIT_NO_DUAL_MAPPING } #endif @@ -663,7 +1102,7 @@ Error releaseDualMapping(DualMapping* dm, size_t size) noexcept { // ======================================== void flushInstructionCache(void* p, size_t size) noexcept { -#if ASMJIT_ARCH_X86 +#if ASMJIT_ARCH_X86 || defined(__EMSCRIPTEN__) // X86/X86_64 architecture doesn't require to do anything to flush instruction cache. DebugUtils::unused(p, size); #elif defined(__APPLE__) @@ -676,7 +1115,7 @@ void flushInstructionCache(void* p, size_t size) noexcept { char* end = start + size; __builtin___clear_cache(start, end); #else - #pragma message("asmjit::VirtMem::flushInstructionCache() doesn't have implementation for the target OS and compiler") + #pragma message("[asmjit] VirtMem::flushInstructionCache() doesn't have implementation for the target OS and compiler") DebugUtils::unused(p, size); #endif } @@ -690,7 +1129,7 @@ Info info() noexcept { if (!vmInfoInitialized.load()) { Info localMemInfo; - getVMInfo(localMemInfo); + detectVMInfo(localMemInfo); vmInfo = localMemInfo; vmInfoInitialized.store(1u); @@ -699,6 +1138,22 @@ Info info() noexcept { return vmInfo; } +size_t largePageSize() noexcept { + static std::atomic largePageSize; + static constexpr size_t kNotAvailable = 1; + + size_t size = largePageSize.load(); + if (ASMJIT_LIKELY(size > kNotAvailable)) + return size; + + if (size == kNotAvailable) + return 0; + + size = detectLargePageSize(); + largePageSize.store(size != 0 ? size : kNotAvailable); + return size; +} + // Virtual Memory - Hardened Runtime Info // ====================================== @@ -711,7 +1166,7 @@ HardenedRuntimeInfo hardenedRuntimeInfo() noexcept { void protectJitMemory(ProtectJitAccess access) noexcept { #if defined(ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP) - pthread_jit_write_protect_np(static_cast(access)); + pthread_jit_write_protect_np(static_cast(access)); #else DebugUtils::unused(access); #endif @@ -719,4 +1174,33 @@ void protectJitMemory(ProtectJitAccess access) noexcept { ASMJIT_END_SUB_NAMESPACE -#endif +// Virtual Memory - Tests +// ====================== + +#if defined(ASMJIT_TEST) +ASMJIT_BEGIN_NAMESPACE + +UNIT(virt_mem) { + VirtMem::Info vmInfo = VirtMem::info(); + + INFO("VirtMem::info():"); + INFO(" pageSize: %zu", size_t(vmInfo.pageSize)); + INFO(" pageGranularity: %zu", size_t(vmInfo.pageGranularity)); + + INFO("VirtMem::largePageSize():"); + INFO(" largePageSize: %zu", size_t(VirtMem::largePageSize())); + + VirtMem::HardenedRuntimeInfo hardenedRtInfo = VirtMem::hardenedRuntimeInfo(); + VirtMem::HardenedRuntimeFlags hardenedFlags = hardenedRtInfo.flags; + + INFO("VirtMem::hardenedRuntimeInfo():"); + INFO(" flags:"); + INFO(" kEnabled: %s" , Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kEnabled ) ? "true" : "false"); + INFO(" kMapJit: %s" , Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kMapJit ) ? "true" : "false"); + INFO(" kDualMapping: %s", Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kDualMapping) ? "true" : "false"); +} + +ASMJIT_END_NAMESPACE +#endif // ASMJIT_TEST + +#endif // !ASMJIT_NO_JIT diff --git a/3rdparty/asmjit/src/asmjit/core/virtmem.h b/3rdparty/asmjit/src/asmjit/core/virtmem.h index 50f09457eba73..17996dcb07e9d 100644 --- a/3rdparty/asmjit/src/asmjit/core/virtmem.h +++ b/3rdparty/asmjit/src/asmjit/core/virtmem.h @@ -10,6 +10,7 @@ #ifndef ASMJIT_NO_JIT #include "../core/globals.h" +#include "../core/support.h" ASMJIT_BEGIN_NAMESPACE @@ -19,6 +20,21 @@ ASMJIT_BEGIN_NAMESPACE //! Virtual memory management. namespace VirtMem { +//! Describes whether instruction cache should be flushed after a write operation. +enum class CachePolicy : uint32_t { + //! Default policy. + //! + //! In some places this would mean `kFlushAfterWrite` and in some places it would mean `kNeverFlush`. + //! For example if it's known that an address has never been used before to execute code. + kDefault = 0, + + //! Flush instruction cache after a write operation. + kFlushAfterWrite = 1, + + //! Avoid flushing instruction cache after a write operation. + kNeverFlush = 2 +}; + //! Flushes instruction cache in the given region. //! //! Only useful on non-x86 architectures, however, it's a good practice to call it on any platform to make your @@ -36,6 +52,15 @@ struct Info { //! Returns virtual memory information, see `VirtMem::Info` for more details. ASMJIT_API Info info() noexcept; +//! Returns the size of the smallest large page supported. +//! +//! AsmJit only uses the smallest large page at the moment as these are usually perfectly sized for executable +//! memory allocation (standard size is 2MB, but different sizes are possible). +//! +//! Returns either the detected large page size or 0, if large page support is either not supported by AsmJit +//! or not accessible to the process. +ASMJIT_API size_t largePageSize() noexcept; + //! Virtual memory access and mmap-specific flags. enum class MemoryFlags : uint32_t { //! No flags. @@ -50,52 +75,80 @@ enum class MemoryFlags : uint32_t { //! Memory is executable. kAccessExecute = 0x00000004u, - //! A combination of \ref MemoryFlags::kAccessRead and \ref MemoryFlags::kAccessWrite. + //! A combination of \ref kAccessRead and \ref kAccessWrite. kAccessReadWrite = kAccessRead | kAccessWrite, - //! A combination of \ref MemoryFlags::kAccessRead, \ref MemoryFlags::kAccessWrite. + //! A combination of \ref kAccessRead, \ref kAccessWrite. kAccessRW = kAccessRead | kAccessWrite, - //! A combination of \ref MemoryFlags::kAccessRead and \ref MemoryFlags::kAccessExecute. + //! A combination of \ref kAccessRead and \ref kAccessExecute. kAccessRX = kAccessRead | kAccessExecute, - //! A combination of \ref MemoryFlags::kAccessRead, \ref MemoryFlags::kAccessWrite, and - //! \ref MemoryFlags::kAccessExecute. + //! A combination of \ref kAccessRead, \ref kAccessWrite, and \ref kAccessExecute. kAccessRWX = kAccessRead | kAccessWrite | kAccessExecute, - //! Use a `MAP_JIT` flag available on Apple platforms (introduced by Mojave), which allows JIT code to be executed - //! in MAC bundles. This flag is not turned on by default, because when a process uses `fork()` the child process - //! has no access to the pages mapped with `MAP_JIT`, which could break code that doesn't expect this behavior. + //! Use a `MAP_JIT` flag available on Apple platforms (introduced by Mojave), which allows JIT code to be + //! executed in a MAC bundle. //! - //! \note This flag can only be used with \ref VirtMem::alloc(). + //! This flag may be turned on by the allocator if there is no other way of allocating executable memory. + //! + //! \note This flag can only be used with \ref VirtMem::alloc(), `MAP_JIT` only works on OSX and not on iOS. + //! When a process uses `fork()` the child process has no access to the pages mapped with `MAP_JIT`. kMMapEnableMapJit = 0x00000010u, - //! Pass `PROT_MAX(PROT_READ)` to mmap() on platforms that support `PROT_MAX`. + //! Pass `PROT_MAX(PROT_READ)` or `PROT_MPROTECT(PROT_READ)` to `mmap()` on platforms that support it. //! - //! \note This flag can only be used with \ref VirtMem::alloc(). + //! This flag allows to set a "maximum access" that the memory page can get during its lifetime. Use + //! \ref VirtMem::protect() to change the access flags. + //! + //! \note This flag can only be used with \ref VirtMem::alloc() and \ref VirtMem::allocDualMapping(). + //! However \ref VirtMem::allocDualMapping() may automatically use this if \ref kAccessRead is used. kMMapMaxAccessRead = 0x00000020u, - //! Pass `PROT_MAX(PROT_WRITE)` to mmap() on platforms that support `PROT_MAX`. + + //! Pass `PROT_MAX(PROT_WRITE)` or `PROT_MPROTECT(PROT_WRITE)` to `mmap()` on platforms that support it. //! - //! \note This flag can only be used with \ref VirtMem::alloc(). + //! This flag allows to set a "maximum access" that the memory page can get during its lifetime. Use + //! \ref VirtMem::protect() to change the access flags. + //! + //! \note This flag can only be used with \ref VirtMem::alloc() and \ref VirtMem::allocDualMapping(). + //! However \ref VirtMem::allocDualMapping() may automatically use this if \ref kAccessWrite is used. kMMapMaxAccessWrite = 0x00000040u, - //! Pass `PROT_MAX(PROT_EXEC)` to mmap() on platforms that support `PROT_MAX`. + + //! Pass `PROT_MAX(PROT_EXEC)` or `PROT_MPROTECT(PROT_EXEC)` to `mmap()` on platforms that support it. //! - //! \note This flag can only be used with \ref VirtMem::alloc(). + //! This flag allows to set a "maximum access" that the memory page can get during its lifetime. Use + //! \ref VirtMem::protect() to change the access flags. + //! + //! \note This flag can only be used with \ref VirtMem::alloc() and \ref VirtMem::allocDualMapping(). + //! However \ref VirtMem::allocDualMapping() may automatically use this if \ref kAccessExecute is used. kMMapMaxAccessExecute = 0x00000080u, - //! A combination of \ref MemoryFlags::kMMapMaxAccessRead and \ref MemoryFlags::kMMapMaxAccessWrite. + //! A combination of \ref kMMapMaxAccessRead and \ref kMMapMaxAccessWrite. kMMapMaxAccessReadWrite = kMMapMaxAccessRead | kMMapMaxAccessWrite, - //! A combination of \ref MemoryFlags::kMMapMaxAccessRead and \ref MemoryFlags::kMMapMaxAccessWrite. + //! A combination of \ref kMMapMaxAccessRead and \ref kMMapMaxAccessWrite. kMMapMaxAccessRW = kMMapMaxAccessRead | kMMapMaxAccessWrite, - //! A combination of \ref MemoryFlags::kMMapMaxAccessRead and \ref MemoryFlags::kMMapMaxAccessExecute. + //! A combination of \ref kMMapMaxAccessRead and \ref kMMapMaxAccessExecute. kMMapMaxAccessRX = kMMapMaxAccessRead | kMMapMaxAccessExecute, - //! A combination of \ref MemoryFlags::kMMapMaxAccessRead, \ref MemoryFlags::kMMapMaxAccessWrite, \ref - //! MemoryFlags::kMMapMaxAccessExecute. + //! A combination of \ref kMMapMaxAccessRead, \ref kMMapMaxAccessWrite, \ref kMMapMaxAccessExecute. kMMapMaxAccessRWX = kMMapMaxAccessRead | kMMapMaxAccessWrite | kMMapMaxAccessExecute, + //! Use `MAP_SHARED` when calling mmap(). + //! + //! \note In some cases `MAP_SHARED` may be set automatically. For example, some dual mapping implementations must + //! use `MAP_SHARED` instead of `MAP_PRIVATE` to ensure that the OS would not apply copy on write on RW page, which + //! would cause RX page not having the updated content. + kMapShared = 0x00000100u, + + //! Request large memory mapped pages. + //! + //! \remarks If this option is used and large page(s) cannot be mapped, the allocation will fail. Fallback to + //! regular pages must be done by the user in this case. Higher level API such as \ref JitAllocator provides an + //! additional mechanism to allocate regular page(s) when large page(s) allocation fails. + kMMapLargePages = 0x00000200u, + //! Not an access flag, only used by `allocDualMapping()` to override the default allocation strategy to always use //! a 'tmp' directory instead of "/dev/shm" (on POSIX platforms). Please note that this flag will be ignored if the //! operating system allows to allocate an executable memory by a different API than `open()` or `shm_open()`. For @@ -157,21 +210,37 @@ enum class HardenedRuntimeFlags : uint32_t { //! Hardened runtime is enabled - it's not possible to have "Write & Execute" memory protection. The runtime //! enforces W^X (either write or execute). //! - //! \note If the runtime is hardened it means that an operating system specific protection is used. For example on - //! MacOS platform it's possible to allocate memory with MAP_JIT flag and then use `pthread_jit_write_protect_np()` + //! \note If the runtime is hardened it means that an operating system specific protection is used. For example + //! on Apple OSX it's possible to allocate memory with MAP_JIT flag and then use `pthread_jit_write_protect_np()` //! to temporarily swap access permissions for the current thread. Dual mapping is also a possibility on X86/X64 //! architecture. kEnabled = 0x00000001u, - //! Read+Write+Execute can only be allocated with MAP_JIT flag (Apple specific). - kMapJit = 0x00000002u + //! Read+Write+Execute can only be allocated with MAP_JIT flag (Apple specific, only available on Apple platforms). + kMapJit = 0x00000002u, + + //! Read+Write+Execute can be allocated with dual mapping approach (one region with RW and the other with RX). + kDualMapping = 0x00000004u }; ASMJIT_DEFINE_ENUM_FLAGS(HardenedRuntimeFlags) //! Hardened runtime information. struct HardenedRuntimeInfo { + //! \name Members + //! \{ + //! Hardened runtime flags. HardenedRuntimeFlags flags; + + //! \} + + //! \name Accessors + //! \{ + + //! Tests whether the hardened runtime `flag` is set. + ASMJIT_INLINE_NODEBUG bool hasFlag(HardenedRuntimeFlags flag) const noexcept { return Support::test(flags, flag); } + + //! \} }; //! Returns runtime features provided by the OS. @@ -187,7 +256,7 @@ enum class ProtectJitAccess : uint32_t { //! Protects access of memory mapped with MAP_JIT flag for the current thread. //! -//! \note This feature is only available on Apple hardware (AArch64) at the moment and and uses a non-portable +//! \note This feature is only available on Apple hardware (AArch64) at the moment and uses a non-portable //! `pthread_jit_write_protect_np()` call when available. //! //! This function must be called before and after a memory mapped with MAP_JIT flag is modified. Example: @@ -212,24 +281,40 @@ ASMJIT_API void protectJitMemory(ProtectJitAccess access) noexcept; //! in destructor. The purpose of this class is to make writing to JIT memory easier. class ProtectJitReadWriteScope { public: + ASMJIT_NONCOPYABLE(ProtectJitReadWriteScope) + + //! \name Members + //! \{ + void* _rxPtr; size_t _size; + CachePolicy _policy; + + //! \} + + //! \name Construction & Destruction + //! \{ //! Makes the given memory block RW protected. - ASMJIT_FORCE_INLINE ProtectJitReadWriteScope(void* rxPtr, size_t size) noexcept + ASMJIT_FORCE_INLINE ProtectJitReadWriteScope( + void* rxPtr, + size_t size, + CachePolicy policy = CachePolicy::kDefault) noexcept : _rxPtr(rxPtr), - _size(size) { + _size(size), + _policy(policy) { protectJitMemory(ProtectJitAccess::kReadWrite); } - // Not copyable. - ProtectJitReadWriteScope(const ProtectJitReadWriteScope& other) = delete; - //! Makes the memory block RX protected again and flushes instruction cache. ASMJIT_FORCE_INLINE ~ProtectJitReadWriteScope() noexcept { protectJitMemory(ProtectJitAccess::kReadExecute); - flushInstructionCache(_rxPtr, _size); + + if (_policy != CachePolicy::kNeverFlush) + flushInstructionCache(_rxPtr, _size); } + + //! \} }; } // VirtMem diff --git a/3rdparty/asmjit/src/asmjit/core/zone.cpp b/3rdparty/asmjit/src/asmjit/core/zone.cpp index d68e110b48c54..e1948ebb0c93f 100644 --- a/3rdparty/asmjit/src/asmjit/core/zone.cpp +++ b/3rdparty/asmjit/src/asmjit/core/zone.cpp @@ -16,8 +16,8 @@ ASMJIT_BEGIN_NAMESPACE // and should never be modified. const Zone::Block Zone::_zeroBlock = { nullptr, nullptr, 0 }; -// Zone - Init & Reset -// =================== +// Zone - Initialization & Reset +// ============================= void Zone::_init(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept { ASMJIT_ASSERT(blockSize >= kMinBlockSize); @@ -215,8 +215,8 @@ static bool ZoneAllocator_hasDynamicBlock(ZoneAllocator* self, ZoneAllocator::Dy } #endif -// ZoneAllocator - Init & Reset -// ============================ +// ZoneAllocator - Initialization & Reset +// ====================================== void ZoneAllocator::reset(Zone* zone) noexcept { // Free dynamic blocks. @@ -227,9 +227,9 @@ void ZoneAllocator::reset(Zone* zone) noexcept { block = next; } - // Zero the entire class and initialize to the given `zone`. - memset(this, 0, sizeof(*this)); _zone = zone; + memset(_slots, 0, sizeof(_slots)); + _dynamicBlocks = nullptr; } // asmjit::ZoneAllocator - Alloc & Release diff --git a/3rdparty/asmjit/src/asmjit/core/zone.h b/3rdparty/asmjit/src/asmjit/core/zone.h index eaea252903ef2..b61a3d1292c25 100644 --- a/3rdparty/asmjit/src/asmjit/core/zone.h +++ b/3rdparty/asmjit/src/asmjit/core/zone.h @@ -85,17 +85,17 @@ class Zone { //! //! It's not required, but it's good practice to set `blockSize` to a reasonable value that depends on the usage //! of `Zone`. Greater block sizes are generally safer and perform better than unreasonably low block sizes. - inline explicit Zone(size_t blockSize, size_t blockAlignment = 1) noexcept { + ASMJIT_INLINE_NODEBUG explicit Zone(size_t blockSize, size_t blockAlignment = 1) noexcept { _init(blockSize, blockAlignment, nullptr); } //! Creates a new Zone with a first block pointing to a `temporary` memory. - inline Zone(size_t blockSize, size_t blockAlignment, const Support::Temporary& temporary) noexcept { + ASMJIT_INLINE_NODEBUG Zone(size_t blockSize, size_t blockAlignment, const Support::Temporary& temporary) noexcept { _init(blockSize, blockAlignment, &temporary); } //! \overload - inline Zone(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept { + ASMJIT_INLINE_NODEBUG Zone(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept { _init(blockSize, blockAlignment, temporary); } @@ -118,7 +118,7 @@ class Zone { //! //! This will destroy the `Zone` instance and release all blocks of memory allocated by it. It performs implicit //! `reset(ResetPolicy::kHard)`. - inline ~Zone() noexcept { reset(ResetPolicy::kHard); } + ASMJIT_INLINE_NODEBUG ~Zone() noexcept { reset(ResetPolicy::kHard); } ASMJIT_API void _init(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept; @@ -133,24 +133,24 @@ class Zone { //! \{ //! Tests whether this `Zone` is actually a `ZoneTmp` that uses temporary memory. - inline bool isTemporary() const noexcept { return _isTemporary != 0; } + ASMJIT_INLINE_NODEBUG bool isTemporary() const noexcept { return _isTemporary != 0; } //! Returns the default block size. - inline size_t blockSize() const noexcept { return _blockSize; } + ASMJIT_INLINE_NODEBUG size_t blockSize() const noexcept { return _blockSize; } //! Returns the default block alignment. - inline size_t blockAlignment() const noexcept { return size_t(1) << _blockAlignmentShift; } + ASMJIT_INLINE_NODEBUG size_t blockAlignment() const noexcept { return size_t(1) << _blockAlignmentShift; } //! Returns remaining size of the current block. - inline size_t remainingSize() const noexcept { return (size_t)(_end - _ptr); } + ASMJIT_INLINE_NODEBUG size_t remainingSize() const noexcept { return (size_t)(_end - _ptr); } //! Returns the current zone cursor (dangerous). //! //! This is a function that can be used to get exclusive access to the current block's memory buffer. template - inline T* ptr() noexcept { return reinterpret_cast(_ptr); } + ASMJIT_INLINE_NODEBUG T* ptr() noexcept { return reinterpret_cast(_ptr); } //! Returns the end of the current zone block, only useful if you use `ptr()`. template - inline T* end() noexcept { return reinterpret_cast(_end); } + ASMJIT_INLINE_NODEBUG T* end() noexcept { return reinterpret_cast(_end); } //! Sets the current zone pointer to `ptr` (must be within the current block). template @@ -185,7 +185,7 @@ class Zone { } //! Aligns the current pointer to `alignment`. - inline void align(size_t alignment) noexcept { + ASMJIT_INLINE_NODEBUG void align(size_t alignment) noexcept { _ptr = Support::min(Support::alignUp(_ptr, alignment), _end); } @@ -193,7 +193,7 @@ class Zone { //! //! \note This function doesn't respect any alignment. If you need to ensure there is enough room for an aligned //! allocation you need to call `align()` before calling `ensure()`. - inline Error ensure(size_t size) noexcept { + ASMJIT_INLINE_NODEBUG Error ensure(size_t size) noexcept { if (size <= remainingSize()) return kErrorOk; else @@ -322,7 +322,7 @@ class Zone { void* p = alloc(sizeof(T), alignof(T)); if (ASMJIT_UNLIKELY(!p)) return nullptr; - return new(p) T(); + return new(Support::PlacementNew{p}) T(); } //! Like `new(std::nothrow) T(...)`, but allocated by `Zone`. @@ -331,7 +331,7 @@ class Zone { void* p = alloc(sizeof(T), alignof(T)); if (ASMJIT_UNLIKELY(!p)) return nullptr; - return new(p) T(std::forward(args)...); + return new(Support::PlacementNew{p}) T(std::forward(args)...); } //! \cond INTERNAL @@ -430,11 +430,11 @@ class ZoneAllocator { //! \{ //! Zone used to allocate memory that fits into slots. - Zone* _zone; + Zone* _zone {}; //! Indexed slots containing released memory. - Slot* _slots[kLoCount + kHiCount]; + Slot* _slots[kLoCount + kHiCount] {}; //! Dynamic blocks for larger allocations (no slots). - DynamicBlock* _dynamicBlocks; + DynamicBlock* _dynamicBlocks {}; //! \} @@ -444,26 +444,22 @@ class ZoneAllocator { //! Creates a new `ZoneAllocator`. //! //! \note To use it, you must first `init()` it. - inline ZoneAllocator() noexcept { - memset(this, 0, sizeof(*this)); - } + ASMJIT_INLINE_NODEBUG ZoneAllocator() noexcept {} //! Creates a new `ZoneAllocator` initialized to use `zone`. - inline explicit ZoneAllocator(Zone* zone) noexcept { - memset(this, 0, sizeof(*this)); - _zone = zone; - } + ASMJIT_INLINE_NODEBUG explicit ZoneAllocator(Zone* zone) noexcept + : _zone(zone) {} //! Destroys the `ZoneAllocator`. - inline ~ZoneAllocator() noexcept { reset(); } + ASMJIT_INLINE_NODEBUG ~ZoneAllocator() noexcept { reset(); } //! Tests whether the `ZoneAllocator` is initialized (i.e. has `Zone`). - inline bool isInitialized() const noexcept { return _zone != nullptr; } + ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _zone != nullptr; } //! Convenience function to initialize the `ZoneAllocator` with `zone`. //! //! It's the same as calling `reset(zone)`. - inline void init(Zone* zone) noexcept { reset(zone); } + ASMJIT_INLINE_NODEBUG void init(Zone* zone) noexcept { reset(zone); } //! Resets this `ZoneAllocator` and also forget about the current `Zone` which is attached (if any). Reset //! optionally attaches a new `zone` passed, or keeps the `ZoneAllocator` in an uninitialized state, if @@ -476,7 +472,7 @@ class ZoneAllocator { //! \{ //! Returns the assigned `Zone` of this allocator or null if this `ZoneAllocator` is not initialized. - inline Zone* zone() const noexcept { return _zone; } + ASMJIT_INLINE_NODEBUG Zone* zone() const noexcept { return _zone; } //! \} @@ -577,7 +573,7 @@ class ZoneAllocator { void* p = allocT(); if (ASMJIT_UNLIKELY(!p)) return nullptr; - return new(p) T(); + return new(Support::PlacementNew{p}) T(); } //! Like `new(std::nothrow) T(...)`, but allocated by `Zone`. template @@ -585,7 +581,7 @@ class ZoneAllocator { void* p = allocT(); if (ASMJIT_UNLIKELY(!p)) return nullptr; - return new(p) T(std::forward(args)...); + return new(Support::PlacementNew{p}) T(std::forward(args)...); } //! Releases the memory previously allocated by `alloc()`. The `size` argument has to be the same as used to call diff --git a/3rdparty/asmjit/src/asmjit/core/zonehash.cpp b/3rdparty/asmjit/src/asmjit/core/zonehash.cpp index 3778fbe22600f..578b083680e4e 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonehash.cpp +++ b/3rdparty/asmjit/src/asmjit/core/zonehash.cpp @@ -288,8 +288,8 @@ UNIT(zone_hash) { for (key = 0; key < count; key++) { node = hashTable.get(MyKeyMatcher(key)); - EXPECT(node != nullptr); - EXPECT(node->_key == key); + EXPECT_NOT_NULL(node); + EXPECT_EQ(node->_key, key); } { @@ -298,11 +298,11 @@ UNIT(zone_hash) { hashTable.remove(&allocator, node); node = hashTable.get(MyKeyMatcher(count)); - EXPECT(node == nullptr); + EXPECT_NULL(node); } } while (count); - EXPECT(hashTable.empty()); + EXPECT_TRUE(hashTable.empty()); } #endif diff --git a/3rdparty/asmjit/src/asmjit/core/zonehash.h b/3rdparty/asmjit/src/asmjit/core/zonehash.h index f332290b54dca..d6cd2e31cb914 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonehash.h +++ b/3rdparty/asmjit/src/asmjit/core/zonehash.h @@ -59,7 +59,7 @@ class ZoneHashBase { //! \name Construction & Destruction //! \{ - inline ZoneHashBase() noexcept { + ASMJIT_INLINE_NODEBUG ZoneHashBase() noexcept { reset(); } @@ -99,8 +99,8 @@ class ZoneHashBase { //! \name Accessors //! \{ - inline bool empty() const noexcept { return _size == 0; } - inline size_t size() const noexcept { return _size; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; } + ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; } //! \} @@ -150,10 +150,10 @@ class ZoneHash : public ZoneHashBase { //! \name Construction & Destruction //! \{ - inline ZoneHash() noexcept + ASMJIT_INLINE_NODEBUG ZoneHash() noexcept : ZoneHashBase() {} - inline ZoneHash(ZoneHash&& other) noexcept + ASMJIT_INLINE_NODEBUG ZoneHash(ZoneHash&& other) noexcept : ZoneHash(other) {} //! \} @@ -161,7 +161,7 @@ class ZoneHash : public ZoneHashBase { //! \name Utilities //! \{ - inline void swap(ZoneHash& other) noexcept { ZoneHashBase::_swap(other); } + ASMJIT_INLINE_NODEBUG void swap(ZoneHash& other) noexcept { ZoneHashBase::_swap(other); } template inline NodeT* get(const KeyT& key) const noexcept { @@ -173,8 +173,8 @@ class ZoneHash : public ZoneHashBase { return node; } - inline NodeT* insert(ZoneAllocator* allocator, NodeT* node) noexcept { return static_cast(_insert(allocator, node)); } - inline NodeT* remove(ZoneAllocator* allocator, NodeT* node) noexcept { return static_cast(_remove(allocator, node)); } + ASMJIT_INLINE_NODEBUG NodeT* insert(ZoneAllocator* allocator, NodeT* node) noexcept { return static_cast(_insert(allocator, node)); } + ASMJIT_INLINE_NODEBUG NodeT* remove(ZoneAllocator* allocator, NodeT* node) noexcept { return static_cast(_remove(allocator, node)); } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/core/zonelist.cpp b/3rdparty/asmjit/src/asmjit/core/zonelist.cpp index d4b311d43077c..ff2c2cf15400c 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonelist.cpp +++ b/3rdparty/asmjit/src/asmjit/core/zonelist.cpp @@ -27,136 +27,136 @@ UNIT(zone_list) { INFO("Append / Unlink"); // [] - EXPECT(list.empty() == true); + EXPECT_TRUE(list.empty()); // [A] list.append(a); - EXPECT(list.empty() == false); - EXPECT(list.first() == a); - EXPECT(list.last() == a); - EXPECT(a->prev() == nullptr); - EXPECT(a->next() == nullptr); + EXPECT_FALSE(list.empty()); + EXPECT_EQ(list.first(), a); + EXPECT_EQ(list.last(), a); + EXPECT_NULL(a->prev()); + EXPECT_NULL(a->next()); // [A, B] list.append(b); - EXPECT(list.first() == a); - EXPECT(list.last() == b); - EXPECT(a->prev() == nullptr); - EXPECT(a->next() == b); - EXPECT(b->prev() == a); - EXPECT(b->next() == nullptr); + EXPECT_EQ(list.first(), a); + EXPECT_EQ(list.last(), b); + EXPECT_NULL(a->prev()); + EXPECT_EQ(a->next(), b); + EXPECT_EQ(b->prev(), a); + EXPECT_NULL(b->next()); // [A, B, C] list.append(c); - EXPECT(list.first() == a); - EXPECT(list.last() == c); - EXPECT(a->prev() == nullptr); - EXPECT(a->next() == b); - EXPECT(b->prev() == a); - EXPECT(b->next() == c); - EXPECT(c->prev() == b); - EXPECT(c->next() == nullptr); + EXPECT_EQ(list.first(), a); + EXPECT_EQ(list.last(), c); + EXPECT_NULL(a->prev()); + EXPECT_EQ(a->next(), b); + EXPECT_EQ(b->prev(), a); + EXPECT_EQ(b->next(), c); + EXPECT_EQ(c->prev(), b); + EXPECT_NULL(c->next()); // [B, C] list.unlink(a); - EXPECT(list.first() == b); - EXPECT(list.last() == c); - EXPECT(a->prev() == nullptr); - EXPECT(a->next() == nullptr); - EXPECT(b->prev() == nullptr); - EXPECT(b->next() == c); - EXPECT(c->prev() == b); - EXPECT(c->next() == nullptr); + EXPECT_EQ(list.first(), b); + EXPECT_EQ(list.last(), c); + EXPECT_NULL(a->prev()); + EXPECT_NULL(a->next()); + EXPECT_NULL(b->prev()); + EXPECT_EQ(b->next(), c); + EXPECT_EQ(c->prev(), b); + EXPECT_NULL(c->next()); // [B] list.unlink(c); - EXPECT(list.first() == b); - EXPECT(list.last() == b); - EXPECT(b->prev() == nullptr); - EXPECT(b->next() == nullptr); - EXPECT(c->prev() == nullptr); - EXPECT(c->next() == nullptr); + EXPECT_EQ(list.first(), b); + EXPECT_EQ(list.last(), b); + EXPECT_NULL(b->prev()); + EXPECT_NULL(b->next()); + EXPECT_NULL(c->prev()); + EXPECT_NULL(c->next()); // [] list.unlink(b); - EXPECT(list.empty() == true); - EXPECT(list.first() == nullptr); - EXPECT(list.last() == nullptr); - EXPECT(b->prev() == nullptr); - EXPECT(b->next() == nullptr); + EXPECT_TRUE(list.empty()); + EXPECT_NULL(list.first()); + EXPECT_NULL(list.last()); + EXPECT_NULL(b->prev()); + EXPECT_NULL(b->next()); INFO("Prepend / Unlink"); // [A] list.prepend(a); - EXPECT(list.empty() == false); - EXPECT(list.first() == a); - EXPECT(list.last() == a); - EXPECT(a->prev() == nullptr); - EXPECT(a->next() == nullptr); + EXPECT_FALSE(list.empty()); + EXPECT_EQ(list.first(), a); + EXPECT_EQ(list.last(), a); + EXPECT_NULL(a->prev()); + EXPECT_NULL(a->next()); // [B, A] list.prepend(b); - EXPECT(list.first() == b); - EXPECT(list.last() == a); - EXPECT(b->prev() == nullptr); - EXPECT(b->next() == a); - EXPECT(a->prev() == b); - EXPECT(a->next() == nullptr); + EXPECT_EQ(list.first(), b); + EXPECT_EQ(list.last(), a); + EXPECT_NULL(b->prev()); + EXPECT_EQ(b->next(), a); + EXPECT_EQ(a->prev(), b); + EXPECT_NULL(a->next()); INFO("InsertAfter / InsertBefore"); // [B, A, C] list.insertAfter(a, c); - EXPECT(list.first() == b); - EXPECT(list.last() == c); - EXPECT(b->prev() == nullptr); - EXPECT(b->next() == a); - EXPECT(a->prev() == b); - EXPECT(a->next() == c); - EXPECT(c->prev() == a); - EXPECT(c->next() == nullptr); + EXPECT_EQ(list.first(), b); + EXPECT_EQ(list.last(), c); + EXPECT_NULL(b->prev()); + EXPECT_EQ(b->next(), a); + EXPECT_EQ(a->prev(), b); + EXPECT_EQ(a->next(), c); + EXPECT_EQ(c->prev(), a); + EXPECT_NULL(c->next()); // [B, D, A, C] list.insertBefore(a, d); - EXPECT(list.first() == b); - EXPECT(list.last() == c); - EXPECT(b->prev() == nullptr); - EXPECT(b->next() == d); - EXPECT(d->prev() == b); - EXPECT(d->next() == a); - EXPECT(a->prev() == d); - EXPECT(a->next() == c); - EXPECT(c->prev() == a); - EXPECT(c->next() == nullptr); + EXPECT_EQ(list.first(), b); + EXPECT_EQ(list.last(), c); + EXPECT_NULL(b->prev()); + EXPECT_EQ(b->next(), d); + EXPECT_EQ(d->prev(), b); + EXPECT_EQ(d->next(), a); + EXPECT_EQ(a->prev(), d); + EXPECT_EQ(a->next(), c); + EXPECT_EQ(c->prev(), a); + EXPECT_NULL(c->next()); INFO("PopFirst / Pop"); // [D, A, C] - EXPECT(list.popFirst() == b); - EXPECT(b->prev() == nullptr); - EXPECT(b->next() == nullptr); - - EXPECT(list.first() == d); - EXPECT(list.last() == c); - EXPECT(d->prev() == nullptr); - EXPECT(d->next() == a); - EXPECT(a->prev() == d); - EXPECT(a->next() == c); - EXPECT(c->prev() == a); - EXPECT(c->next() == nullptr); + EXPECT_EQ(list.popFirst(), b); + EXPECT_NULL(b->prev()); + EXPECT_NULL(b->next()); + + EXPECT_EQ(list.first(), d); + EXPECT_EQ(list.last(), c); + EXPECT_NULL(d->prev()); + EXPECT_EQ(d->next(), a); + EXPECT_EQ(a->prev(), d); + EXPECT_EQ(a->next(), c); + EXPECT_EQ(c->prev(), a); + EXPECT_NULL(c->next()); // [D, A] - EXPECT(list.pop() == c); - EXPECT(c->prev() == nullptr); - EXPECT(c->next() == nullptr); - - EXPECT(list.first() == d); - EXPECT(list.last() == a); - EXPECT(d->prev() == nullptr); - EXPECT(d->next() == a); - EXPECT(a->prev() == d); - EXPECT(a->next() == nullptr); + EXPECT_EQ(list.pop(), c); + EXPECT_NULL(c->prev()); + EXPECT_NULL(c->next()); + + EXPECT_EQ(list.first(), d); + EXPECT_EQ(list.last(), a); + EXPECT_NULL(d->prev()); + EXPECT_EQ(d->next(), a); + EXPECT_EQ(a->prev(), d); + EXPECT_NULL(a->next()); } #endif diff --git a/3rdparty/asmjit/src/asmjit/core/zonelist.h b/3rdparty/asmjit/src/asmjit/core/zonelist.h index c5e0013658963..8980240ef4313 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonelist.h +++ b/3rdparty/asmjit/src/asmjit/core/zonelist.h @@ -39,10 +39,10 @@ class ZoneListNode { //! \name Construction & Destruction //! \{ - inline ZoneListNode() noexcept + ASMJIT_INLINE_NODEBUG ZoneListNode() noexcept : _listNodes { nullptr, nullptr } {} - inline ZoneListNode(ZoneListNode&& other) noexcept + ASMJIT_INLINE_NODEBUG ZoneListNode(ZoneListNode&& other) noexcept : _listNodes { other._listNodes[0], other._listNodes[1] } {} //! \} @@ -50,11 +50,11 @@ class ZoneListNode { //! \name Accessors //! \{ - inline bool hasPrev() const noexcept { return _listNodes[kNodeIndexPrev] != nullptr; } - inline bool hasNext() const noexcept { return _listNodes[kNodeIndexNext] != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasPrev() const noexcept { return _listNodes[kNodeIndexPrev] != nullptr; } + ASMJIT_INLINE_NODEBUG bool hasNext() const noexcept { return _listNodes[kNodeIndexNext] != nullptr; } - inline NodeT* prev() const noexcept { return _listNodes[kNodeIndexPrev]; } - inline NodeT* next() const noexcept { return _listNodes[kNodeIndexNext]; } + ASMJIT_INLINE_NODEBUG NodeT* prev() const noexcept { return _listNodes[kNodeIndexPrev]; } + ASMJIT_INLINE_NODEBUG NodeT* next() const noexcept { return _listNodes[kNodeIndexNext]; } //! \} }; @@ -78,20 +78,19 @@ class ZoneList { //! \name Members //! \{ - NodeT* _nodes[2]; + NodeT* _nodes[2] {}; //! \} //! \name Construction & Destruction //! \{ - inline ZoneList() noexcept - : _nodes { nullptr, nullptr } {} + ASMJIT_INLINE_NODEBUG ZoneList() noexcept {} - inline ZoneList(ZoneList&& other) noexcept + ASMJIT_INLINE_NODEBUG ZoneList(ZoneList&& other) noexcept : _nodes { other._nodes[0], other._nodes[1] } {} - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _nodes[0] = nullptr; _nodes[1] = nullptr; } @@ -101,16 +100,16 @@ class ZoneList { //! \name Accessors //! \{ - inline bool empty() const noexcept { return _nodes[0] == nullptr; } - inline NodeT* first() const noexcept { return _nodes[kNodeIndexFirst]; } - inline NodeT* last() const noexcept { return _nodes[kNodeIndexLast]; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _nodes[0] == nullptr; } + ASMJIT_INLINE_NODEBUG NodeT* first() const noexcept { return _nodes[kNodeIndexFirst]; } + ASMJIT_INLINE_NODEBUG NodeT* last() const noexcept { return _nodes[kNodeIndexLast]; } //! \} //! \name Utilities //! \{ - inline void swap(ZoneList& other) noexcept { + ASMJIT_INLINE_NODEBUG void swap(ZoneList& other) noexcept { std::swap(_nodes[0], other._nodes[0]); std::swap(_nodes[1], other._nodes[1]); } @@ -144,11 +143,11 @@ class ZoneList { node->_listNodes[ dir] = next; } - inline void append(NodeT* node) noexcept { _addNode(node, kNodeIndexLast); } - inline void prepend(NodeT* node) noexcept { _addNode(node, kNodeIndexFirst); } + ASMJIT_INLINE_NODEBUG void append(NodeT* node) noexcept { _addNode(node, kNodeIndexLast); } + ASMJIT_INLINE_NODEBUG void prepend(NodeT* node) noexcept { _addNode(node, kNodeIndexFirst); } - inline void insertAfter(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexNext); } - inline void insertBefore(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexPrev); } + ASMJIT_INLINE_NODEBUG void insertAfter(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexNext); } + ASMJIT_INLINE_NODEBUG void insertBefore(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexPrev); } inline NodeT* unlink(NodeT* node) noexcept { NodeT* prev = node->prev(); diff --git a/3rdparty/asmjit/src/asmjit/core/zonestack.cpp b/3rdparty/asmjit/src/asmjit/core/zonestack.cpp index 77e6f202c7ddc..7d66670935bb7 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonestack.cpp +++ b/3rdparty/asmjit/src/asmjit/core/zonestack.cpp @@ -9,8 +9,8 @@ ASMJIT_BEGIN_NAMESPACE -// ZoneStackBase - Init & Reset -// ============================ +// ZoneStackBase - Initialization & Reset +// ====================================== Error ZoneStackBase::_init(ZoneAllocator* allocator, size_t middleIndex) noexcept { ZoneAllocator* oldAllocator = _allocator; @@ -100,18 +100,24 @@ static void test_zone_stack(ZoneAllocator* allocator, const char* typeName) { INFO("Testing ZoneStack<%s>", typeName); INFO(" (%d items per one Block)", ZoneStack::kNumBlockItems); - EXPECT(stack.init(allocator) == kErrorOk); - EXPECT(stack.empty(), "Stack must be empty after `init()`"); - - EXPECT(stack.append(42) == kErrorOk); - EXPECT(!stack.empty() , "Stack must not be empty after an item has been appended"); - EXPECT(stack.pop() == 42 , "Stack.pop() must return the item that has been appended last"); - EXPECT(stack.empty() , "Stack must be empty after the last item has been removed"); - - EXPECT(stack.prepend(43) == kErrorOk); - EXPECT(!stack.empty() , "Stack must not be empty after an item has been prepended"); - EXPECT(stack.popFirst() == 43, "Stack.popFirst() must return the item that has been prepended last"); - EXPECT(stack.empty() , "Stack must be empty after the last item has been removed"); + EXPECT_EQ(stack.init(allocator), kErrorOk); + EXPECT_TRUE(stack.empty()); + + EXPECT_EQ(stack.append(42), kErrorOk); + EXPECT_FALSE(stack.empty()) + .message("Stack must not be empty after an item has been appended"); + EXPECT_EQ(stack.pop(), 42) + .message("Stack.pop() must return the item that has been appended last"); + EXPECT_TRUE(stack.empty()) + .message("Stack must be empty after the last item has been removed"); + + EXPECT_EQ(stack.prepend(43), kErrorOk); + EXPECT_FALSE(stack.empty()) + .message("Stack must not be empty after an item has been prepended"); + EXPECT_EQ(stack.popFirst(), 43) + .message("Stack.popFirst() must return the item that has been prepended last"); + EXPECT_TRUE(stack.empty()) + .message("Stack must be empty after the last item has been removed"); int i; int iMin =-100000; @@ -121,27 +127,31 @@ static void test_zone_stack(ZoneAllocator* allocator, const char* typeName) { for (i = iMax; i >= 0; i--) stack.prepend(T(i)); for (i = 0; i <= iMax; i++) { T item = stack.popFirst(); - EXPECT(i == item, "Item '%d' didn't match the item '%lld' popped", i, (long long)item); + EXPECT_EQ(i, item) + .message("Item '%d' didn't match the item '%lld' popped", i, (long long)item); if (!stack.empty()) { item = stack.popFirst(); - EXPECT(i + 1 == item, "Item '%d' didn't match the item '%lld' popped", i + 1, (long long)item); + EXPECT_EQ(i + 1, item) + .message("Item '%d' didn't match the item '%lld' popped", i + 1, (long long)item); stack.prepend(item); } } - EXPECT(stack.empty()); + EXPECT_TRUE(stack.empty()); INFO("Validating append() & pop()"); for (i = 0; i <= iMax; i++) stack.append(T(i)); for (i = iMax; i >= 0; i--) { T item = stack.pop(); - EXPECT(i == item, "Item '%d' didn't match the item '%lld' popped", i, (long long)item); + EXPECT_EQ(i, item) + .message("Item '%d' didn't match the item '%lld' popped", i, (long long)item); if (!stack.empty()) { item = stack.pop(); - EXPECT(i - 1 == item, "Item '%d' didn't match the item '%lld' popped", i - 1, (long long)item); + EXPECT_EQ(i - 1, item) + .message("Item '%d' didn't match the item '%lld' popped", i - 1, (long long)item); stack.append(item); } } - EXPECT(stack.empty()); + EXPECT_TRUE(stack.empty()); INFO("Validating append()/prepend() & popFirst()"); for (i = 1; i <= iMax; i++) stack.append(T(i)); @@ -149,9 +159,9 @@ static void test_zone_stack(ZoneAllocator* allocator, const char* typeName) { for (i = iMin; i <= iMax; i++) { T item = stack.popFirst(); - EXPECT(i == item, "Item '%d' didn't match the item '%lld' popped", i, (long long)item); + EXPECT_EQ(i, item); } - EXPECT(stack.empty()); + EXPECT_TRUE(stack.empty()); INFO("Validating append()/prepend() & pop()"); for (i = 0; i >= iMin; i--) stack.prepend(T(i)); @@ -159,9 +169,9 @@ static void test_zone_stack(ZoneAllocator* allocator, const char* typeName) { for (i = iMax; i >= iMin; i--) { T item = stack.pop(); - EXPECT(i == item, "Item '%d' didn't match the item '%lld' popped", i, (long long)item); + EXPECT_EQ(i, item); } - EXPECT(stack.empty()); + EXPECT_TRUE(stack.empty()); } UNIT(zone_stack) { diff --git a/3rdparty/asmjit/src/asmjit/core/zonestack.h b/3rdparty/asmjit/src/asmjit/core/zonestack.h index aea7b6868fa5d..2cf078b3d219e 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonestack.h +++ b/3rdparty/asmjit/src/asmjit/core/zonestack.h @@ -44,31 +44,31 @@ class ZoneStackBase { //! Pointer to the end of the array. void* _end; - inline bool empty() const noexcept { return _start == _end; } - inline Block* prev() const noexcept { return _link[kBlockIndexPrev]; } - inline Block* next() const noexcept { return _link[kBlockIndexNext]; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _start == _end; } + ASMJIT_INLINE_NODEBUG Block* prev() const noexcept { return _link[kBlockIndexPrev]; } + ASMJIT_INLINE_NODEBUG Block* next() const noexcept { return _link[kBlockIndexNext]; } - inline void setPrev(Block* block) noexcept { _link[kBlockIndexPrev] = block; } - inline void setNext(Block* block) noexcept { _link[kBlockIndexNext] = block; } + ASMJIT_INLINE_NODEBUG void setPrev(Block* block) noexcept { _link[kBlockIndexPrev] = block; } + ASMJIT_INLINE_NODEBUG void setNext(Block* block) noexcept { _link[kBlockIndexNext] = block; } template - inline T* start() const noexcept { return static_cast(_start); } + ASMJIT_INLINE_NODEBUG T* start() const noexcept { return static_cast(_start); } template - inline void setStart(T* start) noexcept { _start = static_cast(start); } + ASMJIT_INLINE_NODEBUG void setStart(T* start) noexcept { _start = static_cast(start); } template - inline T* end() const noexcept { return (T*)_end; } + ASMJIT_INLINE_NODEBUG T* end() const noexcept { return (T*)_end; } template - inline void setEnd(T* end) noexcept { _end = (void*)end; } + ASMJIT_INLINE_NODEBUG void setEnd(T* end) noexcept { _end = (void*)end; } template - inline T* data() const noexcept { return (T*)((uint8_t*)(this) + sizeof(Block)); } + ASMJIT_INLINE_NODEBUG T* data() const noexcept { return (T*)((uint8_t*)(this) + sizeof(Block)); } template - inline bool canPrepend() const noexcept { return _start > data(); } + ASMJIT_INLINE_NODEBUG bool canPrepend() const noexcept { return _start > data(); } template - inline bool canAppend() const noexcept { + ASMJIT_INLINE_NODEBUG bool canAppend() const noexcept { size_t kNumBlockItems = (kBlockSize - sizeof(Block)) / sizeof(T); size_t kStartBlockIndex = sizeof(Block); size_t kEndBlockIndex = kStartBlockIndex + kNumBlockItems * sizeof(T); @@ -83,25 +83,21 @@ class ZoneStackBase { //! \{ //! Allocator used to allocate data. - ZoneAllocator* _allocator; + ZoneAllocator* _allocator {}; //! First and last blocks. - Block* _block[2]; + Block* _block[2] {}; //! \} //! \name Construction & Destruction //! \{ - inline ZoneStackBase() noexcept { - _allocator = nullptr; - _block[0] = nullptr; - _block[1] = nullptr; - } - inline ~ZoneStackBase() noexcept { reset(); } + ASMJIT_INLINE_NODEBUG ZoneStackBase() noexcept {} + ASMJIT_INLINE_NODEBUG ~ZoneStackBase() noexcept { reset(); } - inline bool isInitialized() const noexcept { return _allocator != nullptr; } + ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _allocator != nullptr; } ASMJIT_API Error _init(ZoneAllocator* allocator, size_t middleIndex) noexcept; - inline Error reset() noexcept { return _init(nullptr, 0); } + ASMJIT_INLINE_NODEBUG Error reset() noexcept { return _init(nullptr, 0); } //! \} @@ -109,7 +105,7 @@ class ZoneStackBase { //! \{ //! Returns `ZoneAllocator` attached to this container. - inline ZoneAllocator* allocator() const noexcept { return _allocator; } + ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept { return _allocator; } inline bool empty() const noexcept { ASMJIT_ASSERT(isInitialized()); diff --git a/3rdparty/asmjit/src/asmjit/core/zonestring.h b/3rdparty/asmjit/src/asmjit/core/zonestring.h index 01f5bd89f6a84..e62ac50f287bd 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonestring.h +++ b/3rdparty/asmjit/src/asmjit/core/zonestring.h @@ -27,7 +27,7 @@ struct ZoneStringBase { }; }; - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _dummy = nullptr; _external = nullptr; } @@ -83,8 +83,8 @@ class ZoneString { //! \name Construction & Destruction //! \{ - inline ZoneString() noexcept { reset(); } - inline void reset() noexcept { _base.reset(); } + ASMJIT_INLINE_NODEBUG ZoneString() noexcept { reset(); } + ASMJIT_INLINE_NODEBUG void reset() noexcept { _base.reset(); } //! \} @@ -92,21 +92,21 @@ class ZoneString { //! \{ //! Tests whether the string is empty. - inline bool empty() const noexcept { return _base._size == 0; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _base._size == 0; } //! Returns the string data. - inline const char* data() const noexcept { return _base._size <= kMaxEmbeddedSize ? _base._embedded : _base._external; } + ASMJIT_INLINE_NODEBUG const char* data() const noexcept { return _base._size <= kMaxEmbeddedSize ? _base._embedded : _base._external; } //! Returns the string size. - inline uint32_t size() const noexcept { return _base._size; } + ASMJIT_INLINE_NODEBUG uint32_t size() const noexcept { return _base._size; } //! Tests whether the string is embedded (e.g. no dynamically allocated). - inline bool isEmbedded() const noexcept { return _base._size <= kMaxEmbeddedSize; } + ASMJIT_INLINE_NODEBUG bool isEmbedded() const noexcept { return _base._size <= kMaxEmbeddedSize; } //! Copies a new `data` of the given `size` to the string. //! //! If the `size` exceeds the internal buffer the given `zone` will be used to duplicate the data, otherwise //! the internal buffer will be used as a storage. - inline Error setData(Zone* zone, const char* data, size_t size) noexcept { + ASMJIT_INLINE_NODEBUG Error setData(Zone* zone, const char* data, size_t size) noexcept { return _base.setData(zone, kMaxEmbeddedSize, data, size); } diff --git a/3rdparty/asmjit/src/asmjit/core/zonetree.cpp b/3rdparty/asmjit/src/asmjit/core/zonetree.cpp index 8c42af8c02ff4..e8a0e11144018 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonetree.cpp +++ b/3rdparty/asmjit/src/asmjit/core/zonetree.cpp @@ -19,7 +19,7 @@ struct ZoneRBUnit { typedef ZoneTree Tree; static void verifyTree(Tree& tree) noexcept { - EXPECT(checkHeight(static_cast(tree._root)) > 0); + EXPECT_GT(checkHeight(static_cast(tree._root)), 0); } // Check whether the Red-Black tree is valid. @@ -30,17 +30,16 @@ struct ZoneRBUnit { NodeT* rn = node->right(); // Invalid tree. - EXPECT(ln == nullptr || *ln < *node); - EXPECT(rn == nullptr || *rn > *node); + EXPECT_TRUE(ln == nullptr || *ln < *node); + EXPECT_TRUE(rn == nullptr || *rn > *node); // Red violation. - EXPECT(!node->isRed() || - (!ZoneTreeNode::_isValidRed(ln) && !ZoneTreeNode::_isValidRed(rn))); + EXPECT_TRUE(!node->isRed() || (!ZoneTreeNode::_isValidRed(ln) && !ZoneTreeNode::_isValidRed(rn))); // Black violation. int lh = checkHeight(ln); int rh = checkHeight(rn); - EXPECT(!lh || !rh || lh == rh); + EXPECT_TRUE(!lh || !rh || lh == rh); // Only count black links. return (lh && rh) ? lh + !node->isRed() : 0; @@ -83,8 +82,8 @@ UNIT(zone_rbtree) { for (key = 0; key < count; key++) { node = rbTree.get(key); - EXPECT(node != nullptr); - EXPECT(node->_key == key); + EXPECT_NOT_NULL(node); + EXPECT_EQ(node->_key, key); } node = rbTree.get(--count); @@ -92,7 +91,7 @@ UNIT(zone_rbtree) { ZoneRBUnit::verifyTree(rbTree); } while (count); - EXPECT(rbTree.empty()); + EXPECT_TRUE(rbTree.empty()); } #endif diff --git a/3rdparty/asmjit/src/asmjit/core/zonetree.h b/3rdparty/asmjit/src/asmjit/core/zonetree.h index c5dbc78f49675..ffeb674cfe280 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonetree.h +++ b/3rdparty/asmjit/src/asmjit/core/zonetree.h @@ -35,33 +35,32 @@ class ZoneTreeNode { //! \name Members //! \{ - uintptr_t _rbNodeData[2]; + uintptr_t _rbNodeData[2] {}; //! \} //! \name Construction & Destruction //! \{ - inline ZoneTreeNode() noexcept - : _rbNodeData { 0, 0 } {} + ASMJIT_INLINE_NODEBUG ZoneTreeNode() noexcept {} //! \} //! \name Accessors //! \{ - inline bool isRed() const noexcept { return static_cast(_rbNodeData[0] & kRedMask); } + ASMJIT_INLINE_NODEBUG bool isRed() const noexcept { return static_cast(_rbNodeData[0] & kRedMask); } - inline bool hasChild(size_t i) const noexcept { return _rbNodeData[i] > kRedMask; } - inline bool hasLeft() const noexcept { return _rbNodeData[0] > kRedMask; } - inline bool hasRight() const noexcept { return _rbNodeData[1] != 0; } + ASMJIT_INLINE_NODEBUG bool hasChild(size_t i) const noexcept { return _rbNodeData[i] > kRedMask; } + ASMJIT_INLINE_NODEBUG bool hasLeft() const noexcept { return _rbNodeData[0] > kRedMask; } + ASMJIT_INLINE_NODEBUG bool hasRight() const noexcept { return _rbNodeData[1] != 0; } template - inline T* child(size_t i) const noexcept { return static_cast(_getChild(i)); } + ASMJIT_INLINE_NODEBUG T* child(size_t i) const noexcept { return static_cast(_getChild(i)); } template - inline T* left() const noexcept { return static_cast(_getLeft()); } + ASMJIT_INLINE_NODEBUG T* left() const noexcept { return static_cast(_getLeft()); } template - inline T* right() const noexcept { return static_cast(_getRight()); } + ASMJIT_INLINE_NODEBUG T* right() const noexcept { return static_cast(_getRight()); } //! \} @@ -69,19 +68,19 @@ class ZoneTreeNode { //! \name Internal //! \{ - inline ZoneTreeNode* _getChild(size_t i) const noexcept { return (ZoneTreeNode*)(_rbNodeData[i] & kPtrMask); } - inline ZoneTreeNode* _getLeft() const noexcept { return (ZoneTreeNode*)(_rbNodeData[0] & kPtrMask); } - inline ZoneTreeNode* _getRight() const noexcept { return (ZoneTreeNode*)(_rbNodeData[1]); } + ASMJIT_INLINE_NODEBUG ZoneTreeNode* _getChild(size_t i) const noexcept { return (ZoneTreeNode*)(_rbNodeData[i] & kPtrMask); } + ASMJIT_INLINE_NODEBUG ZoneTreeNode* _getLeft() const noexcept { return (ZoneTreeNode*)(_rbNodeData[0] & kPtrMask); } + ASMJIT_INLINE_NODEBUG ZoneTreeNode* _getRight() const noexcept { return (ZoneTreeNode*)(_rbNodeData[1]); } - inline void _setChild(size_t i, ZoneTreeNode* node) noexcept { _rbNodeData[i] = (_rbNodeData[i] & kRedMask) | (uintptr_t)node; } - inline void _setLeft(ZoneTreeNode* node) noexcept { _rbNodeData[0] = (_rbNodeData[0] & kRedMask) | (uintptr_t)node; } - inline void _setRight(ZoneTreeNode* node) noexcept { _rbNodeData[1] = (uintptr_t)node; } + ASMJIT_INLINE_NODEBUG void _setChild(size_t i, ZoneTreeNode* node) noexcept { _rbNodeData[i] = (_rbNodeData[i] & kRedMask) | (uintptr_t)node; } + ASMJIT_INLINE_NODEBUG void _setLeft(ZoneTreeNode* node) noexcept { _rbNodeData[0] = (_rbNodeData[0] & kRedMask) | (uintptr_t)node; } + ASMJIT_INLINE_NODEBUG void _setRight(ZoneTreeNode* node) noexcept { _rbNodeData[1] = (uintptr_t)node; } - inline void _makeRed() noexcept { _rbNodeData[0] |= kRedMask; } - inline void _makeBlack() noexcept { _rbNodeData[0] &= kPtrMask; } + ASMJIT_INLINE_NODEBUG void _makeRed() noexcept { _rbNodeData[0] |= kRedMask; } + ASMJIT_INLINE_NODEBUG void _makeBlack() noexcept { _rbNodeData[0] &= kPtrMask; } //! Tests whether the node is RED (RED node must be non-null and must have RED flag set). - static inline bool _isValidRed(ZoneTreeNode* node) noexcept { return node && node->isRed(); } + static ASMJIT_INLINE_NODEBUG bool _isValidRed(ZoneTreeNode* node) noexcept { return node && node->isRed(); } //! \} //! \endcond @@ -96,7 +95,7 @@ class ZoneTreeNodeT : public ZoneTreeNode { //! \name Construction & Destruction //! \{ - inline ZoneTreeNodeT() noexcept + ASMJIT_INLINE_NODEBUG ZoneTreeNodeT() noexcept : ZoneTreeNode() {} //! \} @@ -104,9 +103,9 @@ class ZoneTreeNodeT : public ZoneTreeNode { //! \name Accessors //! \{ - inline NodeT* child(size_t i) const noexcept { return static_cast(_getChild(i)); } - inline NodeT* left() const noexcept { return static_cast(_getLeft()); } - inline NodeT* right() const noexcept { return static_cast(_getRight()); } + ASMJIT_INLINE_NODEBUG NodeT* child(size_t i) const noexcept { return static_cast(_getChild(i)); } + ASMJIT_INLINE_NODEBUG NodeT* left() const noexcept { return static_cast(_getLeft()); } + ASMJIT_INLINE_NODEBUG NodeT* right() const noexcept { return static_cast(_getRight()); } //! \} }; @@ -118,33 +117,30 @@ class ZoneTree { ASMJIT_NONCOPYABLE(ZoneTree) typedef NodeT Node; - NodeT* _root; + NodeT* _root {}; //! \name Construction & Destruction //! \{ - inline ZoneTree() noexcept - : _root(nullptr) {} - - inline ZoneTree(ZoneTree&& other) noexcept + ASMJIT_INLINE_NODEBUG ZoneTree() noexcept {} + ASMJIT_INLINE_NODEBUG ZoneTree(ZoneTree&& other) noexcept : _root(other._root) {} - - inline void reset() noexcept { _root = nullptr; } + ASMJIT_INLINE_NODEBUG void reset() noexcept { _root = nullptr; } //! \} //! \name Accessors //! \{ - inline bool empty() const noexcept { return _root == nullptr; } - inline NodeT* root() const noexcept { return static_cast(_root); } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _root == nullptr; } + ASMJIT_INLINE_NODEBUG NodeT* root() const noexcept { return static_cast(_root); } //! \} //! \name Utilities //! \{ - inline void swap(ZoneTree& other) noexcept { + ASMJIT_INLINE_NODEBUG void swap(ZoneTree& other) noexcept { std::swap(_root, other._root); } diff --git a/3rdparty/asmjit/src/asmjit/core/zonevector.cpp b/3rdparty/asmjit/src/asmjit/core/zonevector.cpp index dfec5d5f795de..24860219de23f 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonevector.cpp +++ b/3rdparty/asmjit/src/asmjit/core/zonevector.cpp @@ -52,7 +52,8 @@ Error ZoneVectorBase::_grow(ZoneAllocator* allocator, uint32_t sizeOfT, uint32_t Error ZoneVectorBase::_reserve(ZoneAllocator* allocator, uint32_t sizeOfT, uint32_t n) noexcept { uint32_t oldCapacity = _capacity; - if (oldCapacity >= n) return kErrorOk; + if (oldCapacity >= n) + return kErrorOk; uint32_t nBytes = n * sizeOfT; if (ASMJIT_UNLIKELY(nBytes < n)) @@ -65,11 +66,10 @@ Error ZoneVectorBase::_reserve(ZoneAllocator* allocator, uint32_t sizeOfT, uint3 return DebugUtils::errored(kErrorOutOfMemory); void* oldData = _data; - if (_size) + if (oldData && _size) { memcpy(newData, oldData, size_t(_size) * sizeOfT); - - if (oldData) allocator->release(oldData, size_t(oldCapacity) * sizeOfT); + } _capacity = uint32_t(allocatedBytes / sizeOfT); ASMJIT_ASSERT(_capacity >= n); @@ -272,26 +272,39 @@ static void test_zone_vector(ZoneAllocator* allocator, const char* typeName) { ZoneVector vec; INFO("ZoneVector<%s> basic tests", typeName); - EXPECT(vec.append(allocator, 0) == kErrorOk); - EXPECT(vec.empty() == false); - EXPECT(vec.size() == 1); - EXPECT(vec.capacity() >= 1); - EXPECT(vec.indexOf(0) == 0); - EXPECT(vec.indexOf(-11) == Globals::kNotFound); + EXPECT_EQ(vec.append(allocator, 0), kErrorOk); + EXPECT_FALSE(vec.empty()); + EXPECT_EQ(vec.size(), 1u); + EXPECT_GE(vec.capacity(), 1u); + EXPECT_EQ(vec.indexOf(0), 0u); + EXPECT_EQ(vec.indexOf(-11), Globals::kNotFound); vec.clear(); - EXPECT(vec.empty()); - EXPECT(vec.size() == 0); - EXPECT(vec.indexOf(0) == Globals::kNotFound); + EXPECT_TRUE(vec.empty()); + EXPECT_EQ(vec.size(), 0u); + EXPECT_EQ(vec.indexOf(0), Globals::kNotFound); for (i = 0; i < kMax; i++) { - EXPECT(vec.append(allocator, T(i)) == kErrorOk); + EXPECT_EQ(vec.append(allocator, T(i)), kErrorOk); } - EXPECT(vec.empty() == false); - EXPECT(vec.size() == uint32_t(kMax)); - EXPECT(vec.indexOf(T(kMax - 1)) == uint32_t(kMax - 1)); + EXPECT_FALSE(vec.empty()); + EXPECT_EQ(vec.size(), uint32_t(kMax)); + EXPECT_EQ(vec.indexOf(T(0)), uint32_t(0)); + EXPECT_EQ(vec.indexOf(T(kMax - 1)), uint32_t(kMax - 1)); + + EXPECT_EQ(vec.begin()[0], 0); + EXPECT_EQ(vec.end()[-1], kMax - 1); + + EXPECT_EQ(vec.rbegin()[0], kMax - 1); + EXPECT_EQ(vec.rend()[-1], 0); + + int64_t fsum = 0; + int64_t rsum = 0; + + for (const T& item : vec) { fsum += item; } + for (auto it = vec.rbegin(); it != vec.rend(); ++it) { rsum += *it; } - EXPECT(vec.rbegin()[0] == kMax - 1); + EXPECT_EQ(fsum, rsum); vec.release(allocator); } @@ -303,31 +316,31 @@ static void test_zone_bitvector(ZoneAllocator* allocator) { uint32_t kMaxCount = 100; ZoneBitVector vec; - EXPECT(vec.empty()); - EXPECT(vec.size() == 0); + EXPECT_TRUE(vec.empty()); + EXPECT_EQ(vec.size(), 0u); INFO("ZoneBitVector::resize()"); for (count = 1; count < kMaxCount; count++) { vec.clear(); - EXPECT(vec.resize(allocator, count, false) == kErrorOk); - EXPECT(vec.size() == count); + EXPECT_EQ(vec.resize(allocator, count, false), kErrorOk); + EXPECT_EQ(vec.size(), count); for (i = 0; i < count; i++) - EXPECT(vec.bitAt(i) == false); + EXPECT_FALSE(vec.bitAt(i)); vec.clear(); - EXPECT(vec.resize(allocator, count, true) == kErrorOk); - EXPECT(vec.size() == count); + EXPECT_EQ(vec.resize(allocator, count, true), kErrorOk); + EXPECT_EQ(vec.size(), count); for (i = 0; i < count; i++) - EXPECT(vec.bitAt(i) == true); + EXPECT_TRUE(vec.bitAt(i)); } INFO("ZoneBitVector::fillBits() / clearBits()"); for (count = 1; count < kMaxCount; count += 2) { vec.clear(); - EXPECT(vec.resize(allocator, count) == kErrorOk); - EXPECT(vec.size() == count); + EXPECT_EQ(vec.resize(allocator, count), kErrorOk); + EXPECT_EQ(vec.size(), count); for (i = 0; i < (count + 1) / 2; i++) { bool value = bool(i & 1); @@ -338,7 +351,7 @@ static void test_zone_bitvector(ZoneAllocator* allocator) { } for (i = 0; i < count; i++) { - EXPECT(vec.bitAt(i) == bool(i & 1)); + EXPECT_EQ(vec.bitAt(i), bool(i & 1)); } } } diff --git a/3rdparty/asmjit/src/asmjit/core/zonevector.h b/3rdparty/asmjit/src/asmjit/core/zonevector.h index 447c08cb921c2..13d28bbefa229 100644 --- a/3rdparty/asmjit/src/asmjit/core/zonevector.h +++ b/3rdparty/asmjit/src/asmjit/core/zonevector.h @@ -73,11 +73,11 @@ class ZoneVectorBase { //! \{ //! Tests whether the vector is empty. - inline bool empty() const noexcept { return _size == 0; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; } //! Returns the vector size. - inline size_type size() const noexcept { return _size; } + ASMJIT_INLINE_NODEBUG size_type size() const noexcept { return _size; } //! Returns the vector capacity. - inline size_type capacity() const noexcept { return _capacity; } + ASMJIT_INLINE_NODEBUG size_type capacity() const noexcept { return _capacity; } //! \} @@ -85,16 +85,16 @@ class ZoneVectorBase { //! \{ //! Makes the vector empty (won't change the capacity or data pointer). - inline void clear() noexcept { _size = 0; } + ASMJIT_INLINE_NODEBUG void clear() noexcept { _size = 0; } //! Resets the vector data and set its `size` to zero. - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _data = nullptr; _size = 0; _capacity = 0; } //! Truncates the vector to at most `n` items. - inline void truncate(size_type n) noexcept { + ASMJIT_INLINE_NODEBUG void truncate(size_type n) noexcept { _size = Support::min(_size, n); } @@ -128,14 +128,14 @@ class ZoneVector : public ZoneVectorBase { typedef T* iterator; typedef const T* const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; + typedef Support::ArrayReverseIterator reverse_iterator; + typedef Support::ArrayReverseIterator const_reverse_iterator; //! \name Construction & Destruction //! \{ - inline ZoneVector() noexcept : ZoneVectorBase() {} - inline ZoneVector(ZoneVector&& other) noexcept : ZoneVector(other) {} + ASMJIT_INLINE_NODEBUG ZoneVector() noexcept : ZoneVectorBase() {} + ASMJIT_INLINE_NODEBUG ZoneVector(ZoneVector&& other) noexcept : ZoneVector(other) {} //! \} @@ -143,9 +143,9 @@ class ZoneVector : public ZoneVectorBase { //! \{ //! Returns vector data. - inline T* data() noexcept { return static_cast(_data); } + ASMJIT_INLINE_NODEBUG T* data() noexcept { return static_cast(_data); } //! Returns vector data (const) - inline const T* data() const noexcept { return static_cast(_data); } + ASMJIT_INLINE_NODEBUG const T* data() const noexcept { return static_cast(_data); } //! Returns item at the given index `i` (const). inline const T& at(size_t i) const noexcept { @@ -163,23 +163,23 @@ class ZoneVector : public ZoneVectorBase { //! \name STL Compatibility (Iterators) //! \{ - inline iterator begin() noexcept { return iterator(data()); }; - inline const_iterator begin() const noexcept { return const_iterator(data()); }; + ASMJIT_INLINE_NODEBUG iterator begin() noexcept { return iterator(data()); }; + ASMJIT_INLINE_NODEBUG const_iterator begin() const noexcept { return const_iterator(data()); }; - inline iterator end() noexcept { return iterator(data() + _size); }; - inline const_iterator end() const noexcept { return const_iterator(data() + _size); }; + ASMJIT_INLINE_NODEBUG iterator end() noexcept { return iterator(data() + _size); }; + ASMJIT_INLINE_NODEBUG const_iterator end() const noexcept { return const_iterator(data() + _size); }; - inline reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }; - inline const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }; + ASMJIT_INLINE_NODEBUG reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }; + ASMJIT_INLINE_NODEBUG const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }; - inline reverse_iterator rend() noexcept { return reverse_iterator(begin()); }; - inline const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }; + ASMJIT_INLINE_NODEBUG reverse_iterator rend() noexcept { return reverse_iterator(begin()); }; + ASMJIT_INLINE_NODEBUG const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }; - inline const_iterator cbegin() const noexcept { return const_iterator(data()); }; - inline const_iterator cend() const noexcept { return const_iterator(data() + _size); }; + ASMJIT_INLINE_NODEBUG const_iterator cbegin() const noexcept { return const_iterator(data()); }; + ASMJIT_INLINE_NODEBUG const_iterator cend() const noexcept { return const_iterator(data() + _size); }; - inline const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); }; - inline const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); }; + ASMJIT_INLINE_NODEBUG const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); }; + ASMJIT_INLINE_NODEBUG const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); }; //! \} @@ -194,8 +194,13 @@ class ZoneVector : public ZoneVectorBase { if (ASMJIT_UNLIKELY(_size == _capacity)) ASMJIT_PROPAGATE(grow(allocator, 1)); - ::memmove(static_cast(_data) + 1, _data, size_t(_size) * sizeof(T)); - memcpy(_data, &item, sizeof(T)); + memmove(static_cast(static_cast(_data) + 1), + static_cast(_data), + size_t(_size) * sizeof(T)); + + memcpy(static_cast(_data), + static_cast(&item), + sizeof(T)); _size++; return kErrorOk; @@ -209,10 +214,15 @@ class ZoneVector : public ZoneVectorBase { ASMJIT_PROPAGATE(grow(allocator, 1)); T* dst = static_cast(_data) + index; - ::memmove(dst + 1, dst, size_t(_size - index) * sizeof(T)); - memcpy(dst, &item, sizeof(T)); - _size++; + memmove(static_cast(dst + 1), + static_cast(dst), + size_t(_size - index) * sizeof(T)); + memcpy(static_cast(dst), + static_cast(&item), + sizeof(T)); + + _size++; return kErrorOk; } @@ -221,9 +231,11 @@ class ZoneVector : public ZoneVectorBase { if (ASMJIT_UNLIKELY(_size == _capacity)) ASMJIT_PROPAGATE(grow(allocator, 1)); - memcpy(static_cast(_data) + _size, &item, sizeof(T)); - _size++; + memcpy(static_cast(static_cast(_data) + _size), + static_cast(&item), + sizeof(T)); + _size++; return kErrorOk; } @@ -234,7 +246,9 @@ class ZoneVector : public ZoneVectorBase { ASMJIT_PROPAGATE(grow(allocator, size)); if (size) { - memcpy(static_cast(_data) + _size, other._data, size_t(size) * sizeof(T)); + memcpy(static_cast(static_cast(_data) + _size), + static_cast(other._data), + size_t(size) * sizeof(T)); _size += size; } @@ -249,10 +263,15 @@ class ZoneVector : public ZoneVectorBase { ASMJIT_ASSERT(_size < _capacity); T* data = static_cast(_data); - if (_size) - ::memmove(data + 1, data, size_t(_size) * sizeof(T)); + if (_size) { + memmove(static_cast(data + 1), + static_cast(data), + size_t(_size) * sizeof(T)); + } - memcpy(data, &item, sizeof(T)); + memcpy(static_cast(data), + static_cast(&item), + sizeof(T)); _size++; } @@ -263,7 +282,9 @@ class ZoneVector : public ZoneVectorBase { ASMJIT_FORCE_INLINE void appendUnsafe(const T& item) noexcept { ASMJIT_ASSERT(_size < _capacity); - memcpy(static_cast(_data) + _size, &item, sizeof(T)); + memcpy(static_cast(static_cast(_data) + _size), + static_cast(&item), + sizeof(T)); _size++; } @@ -273,17 +294,26 @@ class ZoneVector : public ZoneVectorBase { ASMJIT_ASSERT(index <= _size); T* dst = static_cast(_data) + index; - ::memmove(dst + 1, dst, size_t(_size - index) * sizeof(T)); - memcpy(dst, &item, sizeof(T)); + memmove(static_cast(dst + 1), + static_cast(dst), + size_t(_size - index) * sizeof(T)); + + memcpy(static_cast(dst), + static_cast(&item), + sizeof(T)); + _size++; } + //! Concatenates all items of `other` at the end of the vector. ASMJIT_FORCE_INLINE void concatUnsafe(const ZoneVector& other) noexcept { uint32_t size = other._size; ASMJIT_ASSERT(_capacity - _size >= size); if (size) { - memcpy(static_cast(_data) + _size, other._data, size_t(size) * sizeof(T)); + memcpy(static_cast(static_cast(_data) + _size), + static_cast(other._data), + size_t(size) * sizeof(T)); _size += size; } } @@ -311,8 +341,11 @@ class ZoneVector : public ZoneVectorBase { T* data = static_cast(_data) + i; size_t size = --_size - i; - if (size) - ::memmove(data, data + 1, size_t(size) * sizeof(T)); + if (size) { + memmove(static_cast(data), + static_cast(data + 1), + size_t(size) * sizeof(T)); + } } //! Pops the last element from the vector and returns it. @@ -344,9 +377,9 @@ class ZoneVector : public ZoneVectorBase { //! //! \note The vector must have at least one element. Attempting to use `first()` on empty vector will trigger //! an assertion failure in debug builds. - inline T& first() noexcept { return operator[](0); } + ASMJIT_INLINE_NODEBUG T& first() noexcept { return operator[](0); } //! \overload - inline const T& first() const noexcept { return operator[](0); } + ASMJIT_INLINE_NODEBUG const T& first() const noexcept { return operator[](0); } //! Returns a reference to the last element of the vector. //! @@ -423,21 +456,21 @@ class ZoneBitVector { //! \name Internal //! \{ - static inline uint32_t _wordsPerBits(uint32_t nBits) noexcept { + static ASMJIT_INLINE_NODEBUG uint32_t _wordsPerBits(uint32_t nBits) noexcept { return ((nBits + kBitWordSizeInBits - 1) / kBitWordSizeInBits); } - static inline void _zeroBits(BitWord* dst, uint32_t nBitWords) noexcept { + static ASMJIT_INLINE_NODEBUG void _zeroBits(BitWord* dst, uint32_t nBitWords) noexcept { for (uint32_t i = 0; i < nBitWords; i++) dst[i] = 0; } - static inline void _fillBits(BitWord* dst, uint32_t nBitWords) noexcept { + static ASMJIT_INLINE_NODEBUG void _fillBits(BitWord* dst, uint32_t nBitWords) noexcept { for (uint32_t i = 0; i < nBitWords; i++) dst[i] = ~BitWord(0); } - static inline void _copyBits(BitWord* dst, const BitWord* src, uint32_t nBitWords) noexcept { + static ASMJIT_INLINE_NODEBUG void _copyBits(BitWord* dst, const BitWord* src, uint32_t nBitWords) noexcept { for (uint32_t i = 0; i < nBitWords; i++) dst[i] = src[i]; } @@ -448,9 +481,9 @@ class ZoneBitVector { //! \name Construction & Destruction //! \{ - inline ZoneBitVector() noexcept {} + ASMJIT_INLINE_NODEBUG ZoneBitVector() noexcept {} - inline ZoneBitVector(ZoneBitVector&& other) noexcept + ASMJIT_INLINE_NODEBUG ZoneBitVector(ZoneBitVector&& other) noexcept : _data(other._data), _size(other._size), _capacity(other._capacity) {} @@ -460,8 +493,8 @@ class ZoneBitVector { //! \name Overloaded Operators //! \{ - inline bool operator==(const ZoneBitVector& other) const noexcept { return eq(other); } - inline bool operator!=(const ZoneBitVector& other) const noexcept { return !eq(other); } + ASMJIT_INLINE_NODEBUG bool operator==(const ZoneBitVector& other) const noexcept { return equals(other); } + ASMJIT_INLINE_NODEBUG bool operator!=(const ZoneBitVector& other) const noexcept { return !equals(other); } //! \} @@ -469,44 +502,44 @@ class ZoneBitVector { //! \{ //! Tests whether the bit-vector is empty (has no bits). - inline bool empty() const noexcept { return _size == 0; } + ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; } //! Returns the size of this bit-vector (in bits). - inline uint32_t size() const noexcept { return _size; } + ASMJIT_INLINE_NODEBUG uint32_t size() const noexcept { return _size; } //! Returns the capacity of this bit-vector (in bits). - inline uint32_t capacity() const noexcept { return _capacity; } + ASMJIT_INLINE_NODEBUG uint32_t capacity() const noexcept { return _capacity; } //! Returns the size of the `BitWord[]` array in `BitWord` units. - inline uint32_t sizeInBitWords() const noexcept { return _wordsPerBits(_size); } + ASMJIT_INLINE_NODEBUG uint32_t sizeInBitWords() const noexcept { return _wordsPerBits(_size); } //! Returns the capacity of the `BitWord[]` array in `BitWord` units. - inline uint32_t capacityInBitWords() const noexcept { return _wordsPerBits(_capacity); } + ASMJIT_INLINE_NODEBUG uint32_t capacityInBitWords() const noexcept { return _wordsPerBits(_capacity); } - //! REturns bit-vector data as `BitWord[]`. - inline BitWord* data() noexcept { return _data; } + //! Returns bit-vector data as `BitWord[]`. + ASMJIT_INLINE_NODEBUG BitWord* data() noexcept { return _data; } //! \overload - inline const BitWord* data() const noexcept { return _data; } + ASMJIT_INLINE_NODEBUG const BitWord* data() const noexcept { return _data; } //! \} //! \name Utilities //! \{ - inline void swap(ZoneBitVector& other) noexcept { + ASMJIT_INLINE_NODEBUG void swap(ZoneBitVector& other) noexcept { std::swap(_data, other._data); std::swap(_size, other._size); std::swap(_capacity, other._capacity); } - inline void clear() noexcept { + ASMJIT_INLINE_NODEBUG void clear() noexcept { _size = 0; } - inline void reset() noexcept { + ASMJIT_INLINE_NODEBUG void reset() noexcept { _data = nullptr; _size = 0; _capacity = 0; } - inline void truncate(uint32_t newSize) noexcept { + ASMJIT_INLINE_NODEBUG void truncate(uint32_t newSize) noexcept { _size = Support::min(_size, newSize); _clearUnusedBits(); } @@ -628,7 +661,7 @@ class ZoneBitVector { _data[idx] &= (BitWord(1) << bit) - 1u; } - ASMJIT_FORCE_INLINE bool eq(const ZoneBitVector& other) const noexcept { + ASMJIT_FORCE_INLINE bool equals(const ZoneBitVector& other) const noexcept { if (_size != other._size) return false; @@ -642,18 +675,24 @@ class ZoneBitVector { return true; } +#if !defined(ASMJIT_NO_DEPRECATED) + ASMJIT_DEPRECATED("Use ZoneVector::equals() instead") + ASMJIT_FORCE_INLINE bool eq(const ZoneBitVector& other) const noexcept { return equals(other); } +#endif // !ASMJIT_NO_DEPRECATED + //! \} //! \name Memory Management //! \{ inline void release(ZoneAllocator* allocator) noexcept { - if (!_data) return; + if (!_data) + return; allocator->release(_data, _capacity / 8); reset(); } - inline Error resize(ZoneAllocator* allocator, uint32_t newSize, bool newBitsValue = false) noexcept { + ASMJIT_INLINE_NODEBUG Error resize(ZoneAllocator* allocator, uint32_t newSize, bool newBitsValue = false) noexcept { return _resize(allocator, newSize, newSize, newBitsValue); } diff --git a/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp b/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp index f11fea00238ad..f48c3b2c3b500 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp @@ -493,11 +493,11 @@ static ASMJIT_FORCE_INLINE uint32_t x86GetMovAbsInstSize64Bit(uint32_t regSize, static ASMJIT_FORCE_INLINE bool x86ShouldUseMovabs(Assembler* self, X86BufferWriter& writer, uint32_t regSize, InstOptions options, const Mem& rmRel) noexcept { if (self->is32Bit()) { // There is no relative addressing, just decide whether to use MOV encoded with MOD R/M or absolute. - return !Support::test(options, InstOptions::kX86_ModMR | InstOptions::kX86_ModMR); + return !Support::test(options, InstOptions::kX86_ModMR | InstOptions::kX86_ModRM); } else { // If the addressing type is REL or MOD R/M was specified then absolute mov won't be used. - if (rmRel.addrType() == Mem::AddrType::kRel || Support::test(options, InstOptions::kX86_ModMR)) + if (rmRel.addrType() == Mem::AddrType::kRel || Support::test(options, InstOptions::kX86_ModMR | InstOptions::kX86_ModRM)) return false; int64_t addrValue = rmRel.offset(); @@ -529,8 +529,6 @@ static ASMJIT_FORCE_INLINE bool x86ShouldUseMovabs(Assembler* self, X86BufferWri Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() { _archMask = (uint64_t(1) << uint32_t(Arch::kX86)) | (uint64_t(1) << uint32_t(Arch::kX64)) ; - assignEmitterFuncs(this); - if (code) code->attach(this); } @@ -560,7 +558,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con const Operand_* rmRel; // Memory operand or operand that holds Label|Imm. uint32_t rmInfo; // Memory operand's info based on x86MemInfo. - uint32_t rbReg; // Memory base or modRM register. + uint32_t rbReg = 0; // Memory base or modRM register. uint32_t rxReg; // Memory index register. uint32_t opReg; // ModR/M opcode or register id. @@ -610,7 +608,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con Operand_ opArray[Globals::kMaxOpCount]; EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt); - err = _funcs.validate(arch(), BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone); + err = _funcs.validate(BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone); if (ASMJIT_UNLIKELY(err)) goto Failed; } @@ -653,7 +651,6 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con // This sequence seems to be the fastest. opcode = InstDB::_mainOpcodeTable[instInfo->_mainOpcodeIndex]; opReg = opcode.extractModO(); - rbReg = 0; opcode |= instInfo->_mainOpcodeValue; // Encoding Scope @@ -740,11 +737,11 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86M_NoMemSize: if (o0.isReg()) - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); goto CaseX86M_NoSize; case InstDB::kEncodingX86M: - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingX86M_NoSize: @@ -783,20 +780,20 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con // [?DX:?AX] <- [?DX:?AX] div|mul r16|r32|r64 if (isign3 == ENC_OPS3(Reg, Reg, Reg)) { - if (ASMJIT_UNLIKELY(o0.size() != o1.size())) + if (ASMJIT_UNLIKELY(o0.x86RmSize() != o1.x86RmSize())) goto InvalidInstruction; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rbReg = o2.id(); goto EmitX86R; } // [?DX:?AX] <- [?DX:?AX] div|mul m16|m32|m64 if (isign3 == ENC_OPS3(Reg, Reg, Mem)) { - if (ASMJIT_UNLIKELY(o0.size() != o1.size())) + if (ASMJIT_UNLIKELY(o0.x86RmSize() != o1.x86RmSize())) goto InvalidInstruction; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rmRel = &o2; goto EmitX86M; } @@ -808,10 +805,10 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86M_GPB: if (isign3 == ENC_OPS1(Reg)) { - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rbReg = o0.id(); - if (o0.size() != 1) + if (o0.x86RmSize() != 1) goto EmitX86R; FIXUP_GPB(o0, rbReg); @@ -819,10 +816,10 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS1(Mem)) { - if (ASMJIT_UNLIKELY(o0.size() == 0)) + if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0)) goto AmbiguousOperandSize; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rmRel = &o0; goto EmitX86M; } @@ -851,20 +848,20 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con opReg = 0; if (isign3 == ENC_OPS1(Reg)) { - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); rbReg = o0.id(); goto EmitX86R; } if (isign3 == ENC_OPS1(Mem)) { - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); rmRel = &o0; goto EmitX86M; } // Two operand NOP instruction "0F 1F /r". opReg = o1.id(); - opcode.addPrefixBySize(o1.size()); + opcode.addPrefixBySize(o1.x86RmSize()); if (isign3 == ENC_OPS2(Reg, Reg)) { rbReg = o0.id(); @@ -911,7 +908,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con break; case InstDB::kEncodingX86Rm: - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingX86Rm_NoSize: @@ -934,10 +931,10 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con opReg = o0.id(); rbReg = o1.id(); - if (o0.size() == 2) + if (o0.x86RmSize() == 2) writer.emit8(0x66); else - opcode.addWBySize(o0.size()); + opcode.addWBySize(o0.x86RmSize()); goto EmitX86R; } @@ -945,16 +942,16 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con opReg = o0.id(); rmRel = &o1; - if (o0.size() == 2) + if (o0.x86RmSize() == 2) writer.emit8(0x66); else - opcode.addWBySize(o0.size()); + opcode.addWBySize(o0.x86RmSize()); goto EmitX86M; } break; case InstDB::kEncodingX86Mr: - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingX86Mr_NoSize: @@ -973,15 +970,15 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86Arith: if (isign3 == ENC_OPS2(Reg, Reg)) { - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); - if (o0.size() != o1.size()) + if (o0.x86RmSize() != o1.x86RmSize()) goto OperandSizeMismatch; rbReg = o0.id(); opReg = o1.id(); - if (o0.size() == 1) { + if (o0.x86RmSize() == 1) { FIXUP_GPB(o0, rbReg); FIXUP_GPB(o1, opReg); } @@ -991,19 +988,19 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con goto EmitX86R; // MOD/RM: Alternative encoding selected via instruction options. - opcode += 2; + opcode += 2u; std::swap(opReg, rbReg); goto EmitX86R; } if (isign3 == ENC_OPS2(Reg, Mem)) { - opcode += 2; - opcode.addArithBySize(o0.size()); + opcode += 2u; + opcode.addArithBySize(o0.x86RmSize()); opReg = o0.id(); rmRel = &o1; - if (o0.size() != 1) + if (o0.x86RmSize() != 1) goto EmitX86M; FIXUP_GPB(o0, opReg); @@ -1011,11 +1008,11 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS2(Mem, Reg)) { - opcode.addArithBySize(o1.size()); + opcode.addArithBySize(o1.x86RmSize()); opReg = o1.id(); rmRel = &o0; - if (o1.size() != 1) + if (o1.x86RmSize() != 1) goto EmitX86M; FIXUP_GPB(o1, opReg); @@ -1026,7 +1023,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con opcode = 0x80; if (isign3 == ENC_OPS2(Reg, Imm)) { - uint32_t size = o0.size(); + uint32_t size = o0.x86RmSize(); rbReg = o0.id(); immValue = o1.as().value(); @@ -1075,12 +1072,12 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con goto EmitX86Op; } - opcode += size != 1 ? (immSize != 1 ? 1 : 3) : 0; + opcode += size != 1 ? (immSize != 1 ? 1u : 3u) : 0u; goto EmitX86R; } if (isign3 == ENC_OPS2(Mem, Imm)) { - uint32_t memSize = o0.size(); + uint32_t memSize = o0.x86RmSize(); if (ASMJIT_UNLIKELY(memSize == 0)) goto AmbiguousOperandSize; @@ -1095,7 +1092,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (Support::isInt8(immValue) && !Support::test(options, InstOptions::kLongForm)) immSize = 1; - opcode += memSize != 1 ? (immSize != 1 ? 1 : 3) : 0; + opcode += memSize != 1 ? (immSize != 1 ? 1u : 3u) : 0u; opcode.addPrefixBySize(memSize); rmRel = &o0; @@ -1105,25 +1102,25 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86Bswap: if (isign3 == ENC_OPS1(Reg)) { - if (ASMJIT_UNLIKELY(o0.size() == 1)) + if (ASMJIT_UNLIKELY(o0.x86RmSize() == 1)) goto InvalidInstruction; opReg = o0.id(); - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); goto EmitX86OpReg; } break; case InstDB::kEncodingX86Bt: if (isign3 == ENC_OPS2(Reg, Reg)) { - opcode.addPrefixBySize(o1.size()); + opcode.addPrefixBySize(o1.x86RmSize()); opReg = o1.id(); rbReg = o0.id(); goto EmitX86R; } if (isign3 == ENC_OPS2(Mem, Reg)) { - opcode.addPrefixBySize(o1.size()); + opcode.addPrefixBySize(o1.x86RmSize()); opReg = o1.id(); rmRel = &o0; goto EmitX86M; @@ -1134,7 +1131,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con immSize = 1; opcode = x86AltOpcodeOf(instInfo); - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); opReg = opcode.extractModO(); if (isign3 == ENC_OPS2(Reg, Imm)) { @@ -1143,7 +1140,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS2(Mem, Imm)) { - if (ASMJIT_UNLIKELY(o0.size() == 0)) + if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0)) goto AmbiguousOperandSize; rmRel = &o0; @@ -1176,14 +1173,14 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS2(Reg, Reg)) { - if (o0.size() != o1.size()) + if (o0.x86RmSize() != o1.x86RmSize()) goto OperandSizeMismatch; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rbReg = o0.id(); opReg = o1.id(); - if (o0.size() != 1) + if (o0.x86RmSize() != 1) goto EmitX86R; FIXUP_GPB(o0, rbReg); @@ -1192,11 +1189,11 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS2(Mem, Reg)) { - opcode.addArithBySize(o1.size()); + opcode.addArithBySize(o1.x86RmSize()); opReg = o1.id(); rmRel = &o0; - if (o1.size() != 1) + if (o1.x86RmSize() != 1) goto EmitX86M; FIXUP_GPB(o1, opReg); @@ -1225,18 +1222,18 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86Crc: opReg = o0.id(); - opcode.addWBySize(o0.size()); + opcode.addWBySize(o0.x86RmSize()); if (isign3 == ENC_OPS2(Reg, Reg)) { rbReg = o1.id(); - if (o1.size() == 1) { + if (o1.x86RmSize() == 1) { FIXUP_GPB(o1, rbReg); goto EmitX86R; } else { // This seems to be the only exception of encoding '66F2' prefix. - if (o1.size() == 2) writer.emit8(0x66); + if (o1.x86RmSize() == 2) writer.emit8(0x66); opcode.add(1); goto EmitX86R; @@ -1245,13 +1242,13 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (isign3 == ENC_OPS2(Reg, Mem)) { rmRel = &o1; - if (o1.size() == 0) + if (o1.x86RmSize() == 0) goto AmbiguousOperandSize; // This seems to be the only exception of encoding '66F2' prefix. - if (o1.size() == 2) writer.emit8(0x66); + if (o1.x86RmSize() == 2) writer.emit8(0x66); - opcode += o1.size() != 1; + opcode += uint32_t(o1.x86RmSize() != 1u); goto EmitX86M; } break; @@ -1271,14 +1268,14 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con // First process all forms distinct of `kEncodingX86M_OptB_MulDiv`. if (isign3 == ENC_OPS3(Reg, Reg, Imm)) { opcode = 0x6B; - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); immValue = o2.as().value(); immSize = 1; if (!Support::isInt8(immValue) || Support::test(options, InstOptions::kLongForm)) { opcode -= 2; - immSize = o0.size() == 2 ? 2 : 4; + immSize = o0.x86RmSize() == 2 ? 2 : 4; } opReg = o0.id(); @@ -1289,18 +1286,18 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (isign3 == ENC_OPS3(Reg, Mem, Imm)) { opcode = 0x6B; - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); immValue = o2.as().value(); immSize = 1; // Sign extend so isInt8 returns the right result. - if (o0.size() == 4) + if (o0.x86RmSize() == 4) immValue = x86SignExtendI32(immValue); if (!Support::isInt8(immValue) || Support::test(options, InstOptions::kLongForm)) { opcode -= 2; - immSize = o0.size() == 2 ? 2 : 4; + immSize = o0.x86RmSize() == 2 ? 2 : 4; } opReg = o0.id(); @@ -1311,48 +1308,48 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (isign3 == ENC_OPS2(Reg, Reg)) { // Must be explicit 'ax, r8' form. - if (o1.size() == 1) + if (o1.x86RmSize() == 1) goto CaseX86M_GPB_MulDiv; - if (o0.size() != o1.size()) + if (o0.x86RmSize() != o1.x86RmSize()) goto OperandSizeMismatch; opReg = o0.id(); rbReg = o1.id(); opcode = Opcode::k000F00 | 0xAF; - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); goto EmitX86R; } if (isign3 == ENC_OPS2(Reg, Mem)) { // Must be explicit 'ax, m8' form. - if (o1.size() == 1) + if (o1.x86RmSize() == 1) goto CaseX86M_GPB_MulDiv; opReg = o0.id(); rmRel = &o1; opcode = Opcode::k000F00 | 0xAF; - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); goto EmitX86M; } // Shorthand to imul 'reg, reg, imm'. if (isign3 == ENC_OPS2(Reg, Imm)) { opcode = 0x6B; - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); immValue = o1.as().value(); immSize = 1; // Sign extend so isInt8 returns the right result. - if (o0.size() == 4) + if (o0.x86RmSize() == 4) immValue = x86SignExtendI32(immValue); if (!Support::isInt8(immValue) || Support::test(options, InstOptions::kLongForm)) { opcode -= 2; - immSize = o0.size() == 2 ? 2 : 4; + immSize = o0.x86RmSize() == 2 ? 2 : 4; } opReg = rbReg = o0.id(); @@ -1370,8 +1367,8 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con immValue = o1.as().valueAs(); immSize = 1; - opcode = x86AltOpcodeOf(instInfo) + (o0.size() != 1); - opcode.add66hBySize(o0.size()); + opcode = x86AltOpcodeOf(instInfo) + (o0.x86RmSize() != 1); + opcode.add66hBySize(o0.x86RmSize()); goto EmitX86Op; } @@ -1379,8 +1376,8 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdAx || o1.id() != Gp::kIdDx)) goto InvalidInstruction; - opcode += o0.size() != 1; - opcode.add66hBySize(o0.size()); + opcode += uint32_t(o0.x86RmSize() != 1u); + opcode.add66hBySize(o0.x86RmSize()); goto EmitX86Op; } break; @@ -1390,12 +1387,12 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(!x86IsImplicitMem(o0, Gp::kIdDi) || o1.id() != Gp::kIdDx)) goto InvalidInstruction; - uint32_t size = o0.size(); + uint32_t size = o0.x86RmSize(); if (ASMJIT_UNLIKELY(size == 0)) goto AmbiguousOperandSize; rmRel = &o0; - opcode += (size != 1); + opcode += uint32_t(size != 1u); opcode.add66hBySize(size); goto EmitX86OpImplicitMem; @@ -1406,7 +1403,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (isign3 == ENC_OPS1(Reg)) { rbReg = o0.id(); - if (o0.size() == 1) { + if (o0.x86RmSize() == 1) { FIXUP_GPB(o0, rbReg); goto EmitX86R; } @@ -1414,19 +1411,19 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (is32Bit()) { // INC r16|r32 is only encodable in 32-bit mode (collides with REX). opcode = x86AltOpcodeOf(instInfo) + (rbReg & 0x07); - opcode.add66hBySize(o0.size()); + opcode.add66hBySize(o0.x86RmSize()); goto EmitX86Op; } else { - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); goto EmitX86R; } } if (isign3 == ENC_OPS1(Mem)) { - if (!o0.size()) + if (!o0.x86RmSize()) goto AmbiguousOperandSize; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rmRel = &o0; goto EmitX86M; } @@ -1457,7 +1454,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(!Reg::isGp(o0, Gp::kIdCx))) goto InvalidInstruction; - writer.emitAddressOverride((is32Bit() && o0.size() == 2) || (is64Bit() && o0.size() == 4)); + writer.emitAddressOverride((is32Bit() && o0.x86RmSize() == 2) || (is64Bit() && o0.x86RmSize() == 4)); rmRel = &o1; } @@ -1487,7 +1484,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86LcallLjmp: if (isign3 == ENC_OPS1(Mem)) { rmRel = &o0; - uint32_t mSize = rmRel->size(); + uint32_t mSize = rmRel->as().size(); if (mSize == 0) { mSize = registerSize(); } @@ -1519,7 +1516,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86Lea: if (isign3 == ENC_OPS2(Reg, Mem)) { - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); opReg = o0.id(); rmRel = &o1; goto EmitX86M; @@ -1540,8 +1537,8 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con // GP <- GP if (Reg::isGp(o1)) { - uint32_t opSize = o0.size(); - if (opSize != o1.size()) + uint32_t opSize = o0.x86RmSize(); + if (opSize != o1.x86RmSize()) goto InvalidInstruction; if (opSize == 1) { @@ -1552,7 +1549,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (!Support::test(options, InstOptions::kX86_ModRM)) goto EmitX86R; - opcode += 2; + opcode += 2u; std::swap(opReg, rbReg); goto EmitX86R; } @@ -1563,7 +1560,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (!Support::test(options, InstOptions::kX86_ModRM)) goto EmitX86R; - opcode += 2; + opcode += 2u; std::swap(opReg, rbReg); goto EmitX86R; } @@ -1572,7 +1569,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con // GP <- SReg if (Reg::isSReg(o1)) { opcode = 0x8C; - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); opReg--; goto EmitX86R; } @@ -1606,7 +1603,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con // SReg <- GP if (Reg::isSReg(o0)) { opcode = 0x8E; - opcode.addPrefixBySize(o1.size()); + opcode.addPrefixBySize(o1.x86RmSize()); opReg--; goto EmitX86R; } @@ -1640,28 +1637,28 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con // SReg <- Mem if (Reg::isSReg(o0)) { opcode = 0x8E; - opcode.addPrefixBySize(o1.size()); + opcode.addPrefixBySize(o1.x86RmSize()); opReg--; goto EmitX86M; } // Reg <- Mem else { opcode = 0; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); // Handle a special form of `mov al|ax|eax|rax, [ptr64]` that doesn't use MOD. if (opReg == Gp::kIdAx && !rmRel->as().hasBaseOrIndex()) { - if (x86ShouldUseMovabs(this, writer, o0.size(), options, rmRel->as())) { - opcode += 0xA0; + if (x86ShouldUseMovabs(this, writer, o0.x86RmSize(), options, rmRel->as())) { + opcode += 0xA0u; immValue = rmRel->as().offset(); goto EmitX86OpMovAbs; } } - if (o0.size() == 1) + if (o0.x86RmSize() == 1) FIXUP_GPB(o0, opReg); - opcode += 0x8A; + opcode += 0x8Au; goto EmitX86M; } } @@ -1673,35 +1670,35 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con // Mem <- SReg if (Reg::isSReg(o1)) { opcode = 0x8C; - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); opReg--; goto EmitX86M; } // Mem <- Reg else { opcode = 0; - opcode.addArithBySize(o1.size()); + opcode.addArithBySize(o1.x86RmSize()); // Handle a special form of `mov [ptr64], al|ax|eax|rax` that doesn't use MOD. if (opReg == Gp::kIdAx && !rmRel->as().hasBaseOrIndex()) { - if (x86ShouldUseMovabs(this, writer, o1.size(), options, rmRel->as())) { - opcode += 0xA2; + if (x86ShouldUseMovabs(this, writer, o1.x86RmSize(), options, rmRel->as())) { + opcode += 0xA2u; immValue = rmRel->as().offset(); goto EmitX86OpMovAbs; } } - if (o1.size() == 1) + if (o1.x86RmSize() == 1) FIXUP_GPB(o1, opReg); - opcode += 0x88; + opcode += 0x88u; goto EmitX86M; } } if (isign3 == ENC_OPS2(Reg, Imm)) { opReg = o0.id(); - immSize = FastUInt8(o0.size()); + immSize = FastUInt8(o0.x86RmSize()); if (immSize == 1) { FIXUP_GPB(o0, opReg); @@ -1739,7 +1736,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS2(Mem, Imm)) { - uint32_t memSize = o0.size(); + uint32_t memSize = o0.x86RmSize(); if (ASMJIT_UNLIKELY(memSize == 0)) goto AmbiguousOperandSize; @@ -1761,7 +1758,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con rmRel = &o1; opcode = 0xA0; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); if (ASMJIT_UNLIKELY(!o0.as().isGp()) || opReg != Gp::kIdAx) goto InvalidInstruction; @@ -1782,7 +1779,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con rmRel = &o0; opcode = 0xA2; - opcode.addArithBySize(o1.size()); + opcode.addArithBySize(o1.x86RmSize()); if (ASMJIT_UNLIKELY(!o1.as().isGp()) || opReg != Gp::kIdAx) goto InvalidInstruction; @@ -1811,14 +1808,14 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con break; case InstDB::kEncodingX86MovsxMovzx: - opcode.add(o1.size() != 1); - opcode.addPrefixBySize(o0.size()); + opcode.add(o1.x86RmSize() != 1); + opcode.addPrefixBySize(o0.x86RmSize()); if (isign3 == ENC_OPS2(Reg, Reg)) { opReg = o0.id(); rbReg = o1.id(); - if (o1.size() != 1) + if (o1.x86RmSize() != 1) goto EmitX86R; FIXUP_GPB(o1, rbReg); @@ -1864,8 +1861,8 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(o1.id() != Gp::kIdAx)) goto InvalidInstruction; - opcode = x86AltOpcodeOf(instInfo) + (o1.size() != 1); - opcode.add66hBySize(o1.size()); + opcode = x86AltOpcodeOf(instInfo) + (o1.x86RmSize() != 1); + opcode.add66hBySize(o1.x86RmSize()); immValue = o0.as().valueAs(); immSize = 1; @@ -1876,8 +1873,8 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdDx || o1.id() != Gp::kIdAx)) goto InvalidInstruction; - opcode.add(o1.size() != 1); - opcode.add66hBySize(o1.size()); + opcode.add(o1.x86RmSize() != 1); + opcode.add66hBySize(o1.x86RmSize()); goto EmitX86Op; } break; @@ -1887,7 +1884,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdDx || !x86IsImplicitMem(o1, Gp::kIdSi))) goto InvalidInstruction; - uint32_t size = o1.size(); + uint32_t size = o1.x86RmSize(); if (ASMJIT_UNLIKELY(size == 0)) goto AmbiguousOperandSize; @@ -1939,24 +1936,24 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con CaseX86PushPop_Gp: // We allow 2 byte, 4 byte, and 8 byte register sizes, although PUSH and POP only allow 2 bytes or // native size. On 64-bit we simply PUSH/POP 64-bit register even if 32-bit register was given. - if (ASMJIT_UNLIKELY(o0.size() < 2)) + if (ASMJIT_UNLIKELY(o0.x86RmSize() < 2)) goto InvalidInstruction; opcode = x86AltOpcodeOf(instInfo); - opcode.add66hBySize(o0.size()); + opcode.add66hBySize(o0.x86RmSize()); opReg = o0.id(); goto EmitX86OpReg; } } if (isign3 == ENC_OPS1(Mem)) { - if (ASMJIT_UNLIKELY(o0.size() == 0)) + if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0)) goto AmbiguousOperandSize; - if (ASMJIT_UNLIKELY(o0.size() != 2 && o0.size() != registerSize())) + if (ASMJIT_UNLIKELY(o0.x86RmSize() != 2 && o0.x86RmSize() != registerSize())) goto InvalidInstruction; - opcode.add66hBySize(o0.size()); + opcode.add66hBySize(o0.x86RmSize()); rmRel = &o0; goto EmitX86M; } @@ -1985,17 +1982,17 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86Rot: if (o0.isReg()) { - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rbReg = o0.id(); - if (o0.size() == 1) + if (o0.x86RmSize() == 1) FIXUP_GPB(o0, rbReg); if (isign3 == ENC_OPS2(Reg, Reg)) { if (ASMJIT_UNLIKELY(o1.id() != Gp::kIdCx)) goto InvalidInstruction; - opcode += 2; + opcode += 2u; goto EmitX86R; } @@ -2012,15 +2009,15 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } } else { - if (ASMJIT_UNLIKELY(o0.size() == 0)) + if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0)) goto AmbiguousOperandSize; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); if (isign3 == ENC_OPS2(Mem, Reg)) { if (ASMJIT_UNLIKELY(o1.id() != Gp::kIdCx)) goto InvalidInstruction; - opcode += 2; + opcode += 2u; rmRel = &o0; goto EmitX86M; } @@ -2055,7 +2052,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86ShldShrd: if (isign3 == ENC_OPS3(Reg, Reg, Imm)) { - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); opReg = o1.id(); rbReg = o0.id(); @@ -2065,7 +2062,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS3(Mem, Reg, Imm)) { - opcode.addPrefixBySize(o1.size()); + opcode.addPrefixBySize(o1.x86RmSize()); opReg = o1.id(); rmRel = &o0; @@ -2081,7 +2078,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(o2.id() != Gp::kIdCx)) goto InvalidInstruction; - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); opReg = o1.id(); rbReg = o0.id(); goto EmitX86R; @@ -2091,7 +2088,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(o2.id() != Gp::kIdCx)) goto InvalidInstruction; - opcode.addPrefixBySize(o1.size()); + opcode.addPrefixBySize(o1.x86RmSize()); opReg = o1.id(); rmRel = &o0; goto EmitX86M; @@ -2104,8 +2101,8 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(rmRel->as().offsetLo32() || !Reg::isGp(o0.as(), Gp::kIdAx))) goto InvalidInstruction; - uint32_t size = o0.size(); - if (o1.hasSize() && ASMJIT_UNLIKELY(o1.size() != size)) + uint32_t size = o0.x86RmSize(); + if (o1.x86RmSize() != 0u && ASMJIT_UNLIKELY(o1.x86RmSize() != size)) goto OperandSizeMismatch; opcode.addArithBySize(size); @@ -2119,8 +2116,8 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(rmRel->as().offsetLo32() || !Reg::isGp(o1.as(), Gp::kIdAx))) goto InvalidInstruction; - uint32_t size = o1.size(); - if (o0.hasSize() && ASMJIT_UNLIKELY(o0.size() != size)) + uint32_t size = o1.x86RmSize(); + if (o0.x86RmSize() != 0u && ASMJIT_UNLIKELY(o0.x86RmSize() != size)) goto OperandSizeMismatch; opcode.addArithBySize(size); @@ -2138,11 +2135,11 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (ASMJIT_UNLIKELY(o0.as().hasOffset())) goto InvalidInstruction; - uint32_t size = o1.size(); + uint32_t size = o1.x86RmSize(); if (ASMJIT_UNLIKELY(size == 0)) goto AmbiguousOperandSize; - if (ASMJIT_UNLIKELY(o0.size() != size)) + if (ASMJIT_UNLIKELY(o0.x86RmSize() != size)) goto OperandSizeMismatch; opcode.addArithBySize(size); @@ -2152,14 +2149,14 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingX86Test: if (isign3 == ENC_OPS2(Reg, Reg)) { - if (o0.size() != o1.size()) + if (o0.x86RmSize() != o1.x86RmSize()) goto OperandSizeMismatch; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rbReg = o0.id(); opReg = o1.id(); - if (o0.size() != 1) + if (o0.x86RmSize() != 1) goto EmitX86R; FIXUP_GPB(o0, rbReg); @@ -2168,11 +2165,11 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS2(Mem, Reg)) { - opcode.addArithBySize(o1.size()); + opcode.addArithBySize(o1.x86RmSize()); opReg = o1.id(); rmRel = &o0; - if (o1.size() != 1) + if (o1.x86RmSize() != 1) goto EmitX86M; FIXUP_GPB(o1, opReg); @@ -2184,23 +2181,23 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con opReg = opcode.extractModO(); if (isign3 == ENC_OPS2(Reg, Imm)) { - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rbReg = o0.id(); - if (o0.size() == 1) { + if (o0.x86RmSize() == 1) { FIXUP_GPB(o0, rbReg); immValue = o1.as().valueAs(); immSize = 1; } else { immValue = o1.as().value(); - immSize = FastUInt8(Support::min(o0.size(), 4)); + immSize = FastUInt8(Support::min(o0.x86RmSize(), 4)); } // Short form - AL, AX, EAX, RAX. if (rbReg == 0 && !Support::test(options, InstOptions::kLongForm)) { opcode &= Opcode::kPP_66 | Opcode::kW; - opcode |= 0xA8 + (o0.size() != 1); + opcode |= 0xA8 + (o0.x86RmSize() != 1); goto EmitX86Op; } @@ -2208,25 +2205,25 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS2(Mem, Imm)) { - if (ASMJIT_UNLIKELY(o0.size() == 0)) + if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0)) goto AmbiguousOperandSize; - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); rmRel = &o0; immValue = o1.as().value(); - immSize = FastUInt8(Support::min(o0.size(), 4)); + immSize = FastUInt8(Support::min(o0.x86RmSize(), 4)); goto EmitX86M; } break; case InstDB::kEncodingX86Xchg: if (isign3 == ENC_OPS2(Reg, Mem)) { - opcode.addArithBySize(o0.size()); + opcode.addArithBySize(o0.x86RmSize()); opReg = o0.id(); rmRel = &o1; - if (o0.size() != 1) + if (o0.x86RmSize() != 1) goto EmitX86M; FIXUP_GPB(o0, opReg); @@ -2239,8 +2236,8 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con rbReg = o0.id(); opReg = o1.id(); - uint32_t opSize = o0.size(); - if (opSize != o1.size()) + uint32_t opSize = o0.x86RmSize(); + if (opSize != o1.x86RmSize()) goto OperandSizeMismatch; if (opSize == 1) { @@ -2259,7 +2256,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con goto EmitX86OpReg; } else { - // Encode 'xchg eax, eax' by by using a generic path. + // Encode 'xchg eax, eax' by using a generic path. } } else if (!Support::test(options, InstOptions::kLongForm)) { @@ -2278,11 +2275,11 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } if (isign3 == ENC_OPS2(Mem, Reg)) { - opcode.addArithBySize(o1.size()); + opcode.addArithBySize(o1.x86RmSize()); opReg = o1.id(); rmRel = &o0; - if (o1.size() == 1) { + if (o1.x86RmSize() == 1) { FIXUP_GPB(o1, opReg); } @@ -2356,7 +2353,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (isign3 == ENC_OPS1(Mem)) { CaseFpuArith_Mem: // 0xD8/0xDC, depends on the size of the memory operand; opReg is valid. - opcode = (o0.size() == 4) ? 0xD8 : 0xDC; + opcode = (o0.x86RmSize() == 4) ? 0xD8 : 0xDC; // Clear compressed displacement before going to EmitX86M. opcode &= ~uint32_t(Opcode::kCDSHL_Mask); @@ -2385,16 +2382,16 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (isign3 == ENC_OPS1(Mem)) { rmRel = &o0; - if (o0.size() == 4 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM32)) { + if (o0.x86RmSize() == 4 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM32)) { goto EmitX86M; } - if (o0.size() == 8 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM64)) { - opcode += 4; + if (o0.x86RmSize() == 8 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM64)) { + opcode += 4u; goto EmitX86M; } - if (o0.size() == 10 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM80)) { + if (o0.x86RmSize() == 10 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM80)) { opcode = x86AltOpcodeOf(instInfo); opReg = opcode.extractModO(); goto EmitX86M; @@ -2414,16 +2411,16 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con opcode &= ~uint32_t(Opcode::kCDSHL_Mask); rmRel = &o0; - if (o0.size() == 2 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM16)) { - opcode += 4; + if (o0.x86RmSize() == 2 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM16)) { + opcode += 4u; goto EmitX86M; } - if (o0.size() == 4 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM32)) { + if (o0.x86RmSize() == 4 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM32)) { goto EmitX86M; } - if (o0.size() == 8 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM64)) { + if (o0.x86RmSize() == 8 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM64)) { opcode = x86AltOpcodeOf(instInfo) & ~uint32_t(Opcode::kCDSHL_Mask); opReg = opcode.extractModO(); goto EmitX86M; @@ -2433,7 +2430,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingFpuRDef: if (isign3 == 0) { - opcode += 1; + opcode += 1u; goto EmitFpuOp; } ASMJIT_FALLTHROUGH; @@ -2550,10 +2547,10 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingExtMovbe: if (isign3 == ENC_OPS2(Reg, Mem)) { - if (o0.size() == 1) + if (o0.x86RmSize() == 1) goto InvalidInstruction; - opcode.addPrefixBySize(o0.size()); + opcode.addPrefixBySize(o0.x86RmSize()); opReg = o0.id(); rmRel = &o1; goto EmitX86M; @@ -2563,10 +2560,10 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con opcode = x86AltOpcodeOf(instInfo); if (isign3 == ENC_OPS2(Mem, Reg)) { - if (o1.size() == 1) + if (o1.x86RmSize() == 1) goto InvalidInstruction; - opcode.addPrefixBySize(o1.size()); + opcode.addPrefixBySize(o1.x86RmSize()); opReg = o1.id(); rmRel = &o0; goto EmitX86M; @@ -2621,7 +2618,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (!Support::test(options, InstOptions::kX86_ModMR)) goto EmitX86R; - opcode += 0x10; + opcode += 0x10u; std::swap(opReg, rbReg); goto EmitX86R; } @@ -2692,7 +2689,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con goto CaseExtRm; case InstDB::kEncodingExtRm_Wx: - opcode.addWIf(o1.size() == 8); + opcode.addWIf(o1.x86RmSize() == 8); ASMJIT_FALLTHROUGH; case InstDB::kEncodingExtRm_Wx_GpqOnly: @@ -2716,7 +2713,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingExtRm_P: if (isign3 == ENC_OPS2(Reg, Reg)) { - opcode.add66hIf(Reg::isXmm(o0) | Reg::isXmm(o1)); + opcode.add66hIf(unsigned(Reg::isXmm(o0)) | unsigned(Reg::isXmm(o1))); opReg = o0.id(); rbReg = o1.id(); @@ -2760,7 +2757,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingExtRmRi_P: if (isign3 == ENC_OPS2(Reg, Reg)) { - opcode.add66hIf(Reg::isXmm(o0) | Reg::isXmm(o1)); + opcode.add66hIf(unsigned(Reg::isXmm(o0)) | unsigned(Reg::isXmm(o1))); opReg = o0.id(); rbReg = o1.id(); @@ -2812,7 +2809,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con immSize = 1; if (isign3 == ENC_OPS3(Reg, Reg, Imm)) { - opcode.add66hIf(Reg::isXmm(o0) | Reg::isXmm(o1)); + opcode.add66hIf(unsigned(Reg::isXmm(o0)) | unsigned(Reg::isXmm(o1))); opReg = o0.id(); rbReg = o1.id(); @@ -2970,7 +2967,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con break; case InstDB::kEncodingVexMr_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); if (isign3 == ENC_OPS2(Reg, Reg)) { opReg = o1.id(); @@ -2987,7 +2984,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingVexMr_VM: if (isign3 == ENC_OPS2(Mem, Reg)) { - opcode |= Support::max(x86OpcodeLByVMem(o0), x86OpcodeLBySize(o1.size())); + opcode |= Support::max(x86OpcodeLByVMem(o0), x86OpcodeLBySize(o1.x86RmSize())); opReg = o1.id(); rmRel = &o0; @@ -3010,8 +3007,17 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con goto CaseVexMri; + case InstDB::kEncodingVexMvr_Wx: + if (isign3 == ENC_OPS3(Mem, Reg, Reg)) { + opcode.addWIf(unsigned(Reg::isGpq(o1))); + opReg = x86PackRegAndVvvvv(o1.id(), o2.id()); + rmRel = &o0; + goto EmitVexEvexM; + } + break; + case InstDB::kEncodingVexMri_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexMri: @@ -3040,19 +3046,19 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con goto CaseVexRm; case InstDB::kEncodingVexRm_Wx: - opcode.addWIf(Reg::isGpq(o0) | Reg::isGpq(o1)); + opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned(Reg::isGpq(o1))); goto CaseVexRm; case InstDB::kEncodingVexRm_Lx_Narrow: - if (o1.size()) - opcode |= x86OpcodeLBySize(o1.size()); - else if (o0.size() == 32) + if (o1.x86RmSize()) + opcode |= x86OpcodeLBySize(o1.x86RmSize()); + else if (o0.x86RmSize() == 32) opcode |= Opcode::kLL_2; goto CaseVexRm; case InstDB::kEncodingVexRm_Lx_Bcst: if (isign3 == ENC_OPS2(Reg, Reg) && Reg::isGp(o1.as())) { - opcode = x86AltOpcodeOf(instInfo) | x86OpcodeLBySize(o0.size() | o1.size()); + opcode = x86AltOpcodeOf(instInfo) | x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); opReg = o0.id(); rbReg = o1.id(); goto EmitVexEvexR; @@ -3060,7 +3066,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRm_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRm: @@ -3080,7 +3086,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingVexRm_VM: if (isign3 == ENC_OPS2(Reg, Mem)) { - opcode |= Support::max(x86OpcodeLByVMem(o1), x86OpcodeLBySize(o0.size())); + opcode |= Support::max(x86OpcodeLByVMem(o1), x86OpcodeLBySize(o0.x86RmSize())); opReg = o0.id(); rmRel = &o1; goto EmitVexEvexM; @@ -3110,11 +3116,11 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } case InstDB::kEncodingVexRmi_Wx: - opcode.addWIf(Reg::isGpq(o0) | Reg::isGpq(o1)); + opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned(Reg::isGpq(o1))); goto CaseVexRmi; case InstDB::kEncodingVexRmi_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRmi: @@ -3159,7 +3165,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } case InstDB::kEncodingVexRvm_Wx: { - opcode.addWIf(Reg::isGpq(o0) | (o2.size() == 8)); + opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned((o2.x86RmSize() == 8))); goto CaseVexRvm; } @@ -3169,7 +3175,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } case InstDB::kEncodingVexRvm_Lx: { - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); goto CaseVexRvm; } @@ -3183,7 +3189,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con const Operand_& o3 = opExt[EmitterUtils::kOp3]; - opcode |= x86OpcodeLBySize(o2.size()); + opcode |= x86OpcodeLBySize(o2.x86RmSize()); opReg = x86PackRegAndVvvvv(o0.id(), o2.id()); if (o3.isReg()) { @@ -3200,7 +3206,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } case InstDB::kEncodingVexRvmr_Lx: { - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; } @@ -3234,7 +3240,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRvmi_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRvmi: @@ -3261,7 +3267,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } case InstDB::kEncodingVexRmv_Wx: - opcode.addWIf(Reg::isGpq(o0) | Reg::isGpq(o2)); + opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned(Reg::isGpq(o2))); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRmv: @@ -3281,7 +3287,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingVexRmvRm_VM: if (isign3 == ENC_OPS2(Reg, Mem)) { opcode = x86AltOpcodeOf(instInfo); - opcode |= Support::max(x86OpcodeLByVMem(o1), x86OpcodeLBySize(o0.size())); + opcode |= Support::max(x86OpcodeLByVMem(o1), x86OpcodeLBySize(o0.x86RmSize())); opReg = o0.id(); rmRel = &o1; @@ -3291,7 +3297,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingVexRmv_VM: if (isign3 == ENC_OPS3(Reg, Mem, Reg)) { - opcode |= Support::max(x86OpcodeLByVMem(o1), x86OpcodeLBySize(o0.size() | o2.size())); + opcode |= Support::max(x86OpcodeLByVMem(o1), x86OpcodeLBySize(o0.x86RmSize() | o2.x86RmSize())); opReg = x86PackRegAndVvvvv(o0.id(), o2.id()); rmRel = &o1; @@ -3325,14 +3331,14 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con if (isign3 == ENC_OPS2(Reg, Reg)) { if (Reg::isGp(o0)) { opcode = x86AltOpcodeOf(instInfo); - opcode.addWBySize(o0.size()); + opcode.addWBySize(o0.x86RmSize()); opReg = o1.id(); rbReg = o0.id(); goto EmitVexEvexR; } if (Reg::isGp(o1)) { - opcode.addWBySize(o1.size()); + opcode.addWBySize(o1.x86RmSize()); opReg = o0.id(); rbReg = o1.id(); goto EmitVexEvexR; @@ -3376,7 +3382,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con break; case InstDB::kEncodingVexRmMr_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRmMr: @@ -3432,7 +3438,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con break; case InstDB::kEncodingVexRvmRmi_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRvmRmi: @@ -3544,7 +3550,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con break; case InstDB::kEncodingVexRvmMvr_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRvmMvr: @@ -3576,7 +3582,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRvmVmi_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRvmVmi: @@ -3614,7 +3620,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con break; case InstDB::kEncodingVexVm_Wx: - opcode.addWIf(Reg::isGpq(o0) | Reg::isGpq(o1)); + opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned(Reg::isGpq(o1))); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexVm: @@ -3637,7 +3643,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexVmi_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexVmi: @@ -3659,13 +3665,13 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con break; case InstDB::kEncodingVexVmi4_Wx: - opcode.addWIf(Reg::isGpq(o0) || o1.size() == 8); + opcode.addWIf(Reg::isGpq(o0) || o1.x86RmSize() == 8); immValue = o2.as().value(); immSize = 4; goto CaseVexVmi_AfterImm; case InstDB::kEncodingVexRvrmRvmr_Lx: - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingVexRvrmRvmr: { @@ -3710,7 +3716,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con goto InvalidInstruction; const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9); - opcode |= x86OpcodeLBySize(o0.size() | o1.size() | o2.size() | o3.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize() | o2.x86RmSize() | o3.x86RmSize()); immValue = o4.as().valueAs() & 0x0F; immSize = 1; @@ -3766,7 +3772,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con case InstDB::kEncodingFma4_Lx: // It's fine to just check the first operand, second is just for sanity. - opcode |= x86OpcodeLBySize(o0.size() | o1.size()); + opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize()); ASMJIT_FALLTHROUGH; case InstDB::kEncodingFma4: { @@ -4274,7 +4280,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con } else { // Non-bound label or label bound to a different section. - relOffset = -4 - immSize; + relOffset = -4 - int32_t(immSize); relSize = 4; goto EmitRel; } @@ -4950,10 +4956,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con #endif } - resetExtraReg(); - resetInstOptions(); - resetInlineComment(); - + resetState(); writer.done(this); return kErrorOk; @@ -4987,9 +4990,7 @@ ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, con #ifndef ASMJIT_NO_LOGGING return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt); #else - resetExtraReg(); - resetInstOptions(); - resetInlineComment(); + resetState(); return reportError(err); #endif } @@ -5085,6 +5086,9 @@ Error Assembler::onAttach(CodeHolder* code) noexcept { Arch arch = code->arch(); ASMJIT_PROPAGATE(Base::onAttach(code)); + _instructionAlignment = uint8_t(1); + assignEmitterFuncs(this); + if (Environment::is32Bit(arch)) { // 32 bit architecture - X86. _forcedInstOptions |= InstOptions::kX86_InvalidRex; diff --git a/3rdparty/asmjit/src/asmjit/x86/x86assembler.h b/3rdparty/asmjit/src/asmjit/x86/x86assembler.h index dbffae62895db..dd980a72692b8 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86assembler.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86assembler.h @@ -38,13 +38,14 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! JitRuntime rt; // Create a runtime specialized for JIT. //! CodeHolder code; // Create a CodeHolder. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); //! x86::Assembler a(&code); // Create and attach x86::Assembler to code. //! //! // Decide between 32-bit CDECL, WIN64, and SysV64 calling conventions: //! // 32-BIT - passed all arguments by stack. //! // WIN64 - passes first 4 arguments by RCX, RDX, R8, and R9. -//! // UNIX64 - passes first 6 arguments by RDI, RSI, RCX, RDX, R8, and R9. +//! // UNIX64 - passes first 6 arguments by RDI, RSI, RDX, RCX, R8, and R9. //! x86::Gp arr, cnt; //! x86::Gp sum = x86::eax; // Use EAX as 'sum' as it's a return register. //! @@ -100,7 +101,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! //! The example should be self-explanatory. It shows how to work with labels, how to use operands, and how to emit //! instructions that can use different registers based on runtime selection. It implements 32-bit CDECL, WIN64, -//! and SysV64 caling conventions and will work on most X86/X64 environments. +//! and SysV64 calling conventions and will work on most X86/X64 environments. //! //! Although functions prologs / epilogs can be implemented manually, AsmJit provides utilities that can be used //! to create function prologs and epilogs automatically, see \ref asmjit_function for more details. @@ -131,7 +132,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! JitRuntime rt; // Create a runtime specialized for JIT. //! CodeHolder code; // Create a CodeHolder. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); //! x86::Assembler a(&code); // Create and attach x86::Assembler to code. //! //! // Enable strict validation. @@ -149,7 +151,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! printf("Status: %s\n", DebugUtils::errorAsString(err)); //! //! // Ambiguous operand size - the pointer requires size. -//! err = a.inc(x86::ptr(x86::rax), 1); +//! err = a.inc(x86::ptr(x86::rax)); //! printf("Status: %s\n", DebugUtils::errorAsString(err)); //! //! return 0; @@ -187,7 +189,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! JitRuntime rt; // Create a runtime specialized for JIT. //! CodeHolder code; // Create a CodeHolder. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); //! x86::Assembler a(&code); // Create and attach x86::Assembler to code. //! //! // Let's get these registers from x86::Assembler. @@ -227,6 +230,9 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! targets easily. If you want to create a register of native size dynamically by specifying its id it's also possible: //! //! ``` +//! #include +//! using namespace asmjit; +//! //! void example(x86::Assembler& a) { //! x86::Gp zax = a.gpz(x86::Gp::kIdAx); //! x86::Gp zbx = a.gpz(x86::Gp::kIdBx); @@ -281,21 +287,21 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! #include //! using namespace asmjit; //! -//! void embedData(x86::Assembler& a, const Label& L_Data) { +//! void processData(x86::Assembler& a, const Label& L_Data) { //! x86::Gp addr = a.zax(); // EAX or RAX. //! x86::Gp val = x86::edi; // Where to store some value... //! //! // Approach 1 - Load the address to register through LEA. This approach //! // is flexible as the address can be then manipulated, for //! // example if you have a data array, which would need index. -//! a.lea(addr, L_Data); // Loads the address of the label to EAX or RAX. -//! a.mov(val, dword_ptr(addr)); +//! a.lea(addr, x86::ptr(L_Data)); +//! a.mov(val, x86::dword_ptr(addr)); //! //! // Approach 2 - Load the data directly by using L_Data in address. It's //! // worth noting that this doesn't work with indexes in X64 //! // mode. It will use absolute address in 32-bit mode and //! // relative address (RIP) in 64-bit mode. -//! a.mov(val, dword_ptr(L_Data)); +//! a.mov(val, x86::dword_ptr(L_Data)); //! } //! ``` //! @@ -346,7 +352,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! JitRuntime rt; // Create JIT Runtime. //! CodeHolder code; // Create a CodeHolder. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); //! x86::Assembler a(&code); // Create and attach x86::Assembler to code. //! //! // Decide which registers will be mapped to function arguments. Try changing @@ -356,18 +363,19 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! x86::Gp src_a = a.zcx(); //! x86::Gp src_b = a.zdx(); //! -//! X86::Xmm vec0 = x86::xmm0; -//! X86::Xmm vec1 = x86::xmm1; +//! x86::Xmm vec0 = x86::xmm0; +//! x86::Xmm vec1 = x86::xmm1; //! //! // Create/initialize FuncDetail and FuncFrame. //! FuncDetail func; -//! func.init(FuncSignatureT(CallConvId::kHost)); +//! func.init(FuncSignature::build(), +//! rt.environment()); //! //! FuncFrame frame; //! frame.init(func); //! //! // Make XMM0 and XMM1 dirty - RegGroup::kVec describes XMM|YMM|ZMM registers. -//! frame.setDirtyRegs(RegGroup::kVec, IntUtils::mask(0, 1)); +//! frame.setDirtyRegs(RegGroup::kVec, Support::bitMask(0, 1)); //! //! // Alternatively, if you don't want to use register masks you can pass BaseReg //! // to addDirtyRegs(). The following code would add both xmm0 and xmm1. @@ -375,7 +383,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! //! FuncArgsAssignment args(&func); // Create arguments assignment context. //! args.assignAll(dst, src_a, src_b);// Assign our registers to arguments. -//! args.updateFrameInfo(frame); // Reflect our args in FuncFrame. +//! args.updateFuncFrame(frame); // Reflect our args in FuncFrame. //! frame.finalize(); // Finalize the FuncFrame (updates it). //! //! a.emitProlog(frame); // Emit function prolog. @@ -453,7 +461,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! JitRuntime rt; // Create a runtime specialized for JIT. //! CodeHolder code; // Create a CodeHolder. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); //! x86::Assembler a(&code); // Create and attach x86::Assembler to code. //! //! // Let's get these registers from x86::Assembler. @@ -532,16 +541,16 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! //! void prefixesExample(x86::Assembler& a) { //! // Lock prefix for implementing atomics: -//! // lock add dword ptr [dst], 1 -//! a.lock().add(x86::dword_ptr(dst), 1); +//! // lock add dword ptr [rdi], 1 +//! a.lock().add(x86::dword_ptr(x86::rdi), 1); //! //! // Similarly, XAcquire/XRelease prefixes are also available: -//! // xacquire add dword ptr [dst], 1 -//! a.xacquire().add(x86::dword_ptr(dst), 1); +//! // xacquire add dword ptr [rdi], 1 +//! a.xacquire().add(x86::dword_ptr(x86::rdi), 1); //! //! // Rep prefix (see also repe/repz and repne/repnz): -//! // rep movs byte ptr [dst], byte ptr [src] -//! a.rep().movs(x86::byte_ptr(dst), x86::byte_ptr(src)); +//! // rep movs byte ptr [rdi], byte ptr [rsi] +//! a.rep().movs(x86::byte_ptr(x86::rdi), x86::byte_ptr(x86::rsi)); //! //! // Forcing REX prefix in 64-bit mode. //! // rex mov eax, 1 @@ -605,12 +614,12 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! // ----------------- //! // //! // - Broadcast data is part of memory operand. -//! // - Use x86::Mem::_1toN(), which returns a new x86::Mem operand. +//! // - Use x86::Mem::_1to2(), x86::Mem::_1to4(), etc..., which returns a new x86::Mem operand with broadcast. //! //! // vaddpd zmm0 {k1} {z}, zmm1, [rcx] {1to8} -//! a.k(k1).z().vaddpd(zmm0, zmm1, x86::mem(rcx)._1to8()); +//! a.k(k1).z().vaddpd(zmm0, zmm1, x86::ptr(rcx)._1to8()); //! -//! // Embedded Rounding & Suppress-All-Exceptoins +//! // Embedded Rounding & Suppress-All-Exceptions //! // ------------------------------------------- //! // //! // - Rounding mode and {sae} are part of instruction options. @@ -637,7 +646,7 @@ class ASMJIT_VIRTAPI Assembler //! \{ ASMJIT_API explicit Assembler(CodeHolder* code = nullptr) noexcept; - ASMJIT_API virtual ~Assembler() noexcept; + ASMJIT_API ~Assembler() noexcept override; //! \} @@ -648,12 +657,13 @@ class ASMJIT_VIRTAPI Assembler // NOTE: x86::Assembler uses _privateData to store 'address-override' bit that is used to decide whether to emit // address-override (67H) prefix based on the memory BASE+INDEX registers. It's either `kX86MemInfo_67H_X86` or // `kX86MemInfo_67H_X64`. - inline uint32_t _addressOverrideMask() const noexcept { return _privateData; } - inline void _setAddressOverrideMask(uint32_t m) noexcept { _privateData = m; } + ASMJIT_INLINE_NODEBUG uint32_t _addressOverrideMask() const noexcept { return _privateData; } + ASMJIT_INLINE_NODEBUG void _setAddressOverrideMask(uint32_t m) noexcept { _privateData = m; } //! \} //! \endcond + //! \cond INTERNAL //! \name Emit //! \{ diff --git a/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp b/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp index a27948b65d480..9f025a15bc015 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp @@ -18,8 +18,6 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() { _archMask = (uint64_t(1) << uint32_t(Arch::kX86)) | (uint64_t(1) << uint32_t(Arch::kX64)) ; - assignEmitterFuncs(this); - if (code) code->attach(this); } @@ -29,7 +27,12 @@ Builder::~Builder() noexcept {} // ===================== Error Builder::onAttach(CodeHolder* code) noexcept { - return Base::onAttach(code); + ASMJIT_PROPAGATE(Base::onAttach(code)); + + _instructionAlignment = uint8_t(1); + assignEmitterFuncs(this); + + return kErrorOk; } Error Builder::onDetach(CodeHolder* code) noexcept { diff --git a/3rdparty/asmjit/src/asmjit/x86/x86builder.h b/3rdparty/asmjit/src/asmjit/x86/x86builder.h index f3bb11a0ca22c..194c1402f1101 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86builder.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86builder.h @@ -36,7 +36,9 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! // Small helper function to print the current content of `cb`. //! static void dumpCode(BaseBuilder& builder, const char* phase) { //! String sb; -//! builder.dump(sb); +//! formatOptions formatOptions {}; +//! +//! Formatter::formatNodeList(sb, formatOptions, &builder); //! printf("%s:\n%s\n", phase, sb.data()); //! } //! @@ -44,7 +46,8 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! JitRuntime rt; // Create JIT Runtime. //! CodeHolder code; // Create a CodeHolder. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); //! x86::Builder cb(&code); // Create and attach x86::Builder to `code`. //! //! // Decide which registers will be mapped to function arguments. Try changing registers @@ -58,7 +61,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! //! // Create and initialize `FuncDetail`. //! FuncDetail func; -//! func.init(FuncSignatureT(CallConvId::kHost)); +//! func.init(FuncSignature::build()); //! //! // Remember prolog insertion point. //! BaseNode* prologInsertionPoint = cb.cursor(); @@ -323,7 +326,7 @@ class ASMJIT_VIRTAPI Builder //! \{ ASMJIT_API explicit Builder(CodeHolder* code = nullptr) noexcept; - ASMJIT_API virtual ~Builder() noexcept; + ASMJIT_API ~Builder() noexcept override; //! \} diff --git a/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp b/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp index 04d098070761f..830600edabcea 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp @@ -19,8 +19,6 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() { _archMask = (uint64_t(1) << uint32_t(Arch::kX86)) | (uint64_t(1) << uint32_t(Arch::kX64)) ; - assignEmitterFuncs(this); - if (code) code->attach(this); } @@ -38,6 +36,9 @@ Error Compiler::onAttach(CodeHolder* code) noexcept { return err; } + _instructionAlignment = uint8_t(1); + assignEmitterFuncs(this); + return kErrorOk; } diff --git a/3rdparty/asmjit/src/asmjit/x86/x86compiler.h b/3rdparty/asmjit/src/asmjit/x86/x86compiler.h index d89aea02519e9..b281e208879cd 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86compiler.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86compiler.h @@ -35,31 +35,32 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! typedef int (*Func)(void); //! //! int main() { -//! JitRuntime rt; // Runtime specialized for JIT code execution. -//! CodeHolder code; // Holds code and relocation information. +//! JitRuntime rt; // Runtime specialized for JIT code execution. +//! CodeHolder code; // Holds code and relocation information. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. -//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); +//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. //! -//! cc.addFunc(FuncSignatureT());// Begin a function of `int fn(void)` signature. +//! cc.addFunc(FuncSignature::build()); // Begin a function of `int fn(void)` signature. //! -//! x86::Gp vReg = cc.newGpd(); // Create a 32-bit general purpose register. -//! cc.mov(vReg, 1); // Move one to our virtual register `vReg`. -//! cc.ret(vReg); // Return `vReg` from the function. +//! x86::Gp vReg = cc.newGpd(); // Create a 32-bit general purpose register. +//! cc.mov(vReg, 1); // Move one to our virtual register `vReg`. +//! cc.ret(vReg); // Return `vReg` from the function. //! -//! cc.endFunc(); // End of the function body. -//! cc.finalize(); // Translate and assemble the whole 'cc' content. +//! cc.endFunc(); // End of the function body. +//! cc.finalize(); // Translate and assemble the whole 'cc' content. //! // ----> x86::Compiler is no longer needed from here and can be destroyed <---- //! //! Func fn; -//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime. -//! if (err) return 1; // Handle a possible error returned by AsmJit. +//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime. +//! if (err) return 1; // Handle a possible error returned by AsmJit. //! // ----> CodeHolder is no longer needed from here and can be destroyed <---- //! -//! int result = fn(); // Execute the generated code. -//! printf("%d\n", result); // Print the resulting "1". +//! int result = fn(); // Execute the generated code. +//! printf("%d\n", result); // Print the resulting "1". //! -//! rt.release(fn); // Explicitly remove the function from the runtime. +//! rt.release(fn); // Explicitly remove the function from the runtime. //! return 0; //! } //! ``` @@ -79,48 +80,49 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! typedef void (*MemCpy32)(uint32_t* dst, const uint32_t* src, size_t count); //! //! int main() { -//! JitRuntime rt; // Runtime specialized for JIT code execution. -//! CodeHolder code; // Holds code and relocation information. +//! JitRuntime rt; // Runtime specialized for JIT code execution. +//! CodeHolder code; // Holds code and relocation information. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. -//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); +//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. //! -//! FuncNode* funcNode = cc.addFunc( // Begin the function of the following signature: -//! FuncSignatureT()); // 3rd argument - size_t (machine reg-size). +//! FuncNode* funcNode = cc.addFunc ( // Begin the function of the following signature: +//! FuncSignature::build()); // 3rd argument - size_t (machine reg-size). //! -//! Label L_Loop = cc.newLabel(); // Start of the loop. -//! Label L_Exit = cc.newLabel(); // Used to exit early. +//! Label L_Loop = cc.newLabel(); // Start of the loop. +//! Label L_Exit = cc.newLabel(); // Used to exit early. //! -//! x86::Gp dst = cc.newIntPtr("dst");// Create `dst` register (destination pointer). -//! x86::Gp src = cc.newIntPtr("src");// Create `src` register (source pointer). -//! x86::Gp i = cc.newUIntPtr("i"); // Create `i` register (loop counter). +//! x86::Gp dst = cc.newIntPtr("dst"); // Create `dst` register (destination pointer). +//! x86::Gp src = cc.newIntPtr("src"); // Create `src` register (source pointer). +//! x86::Gp i = cc.newUIntPtr("i"); // Create `i` register (loop counter). //! -//! funcNode->setArg(0, dst); // Assign `dst` argument. -//! funcNode->setArg(1, src); // Assign `src` argument. -//! funcNode->setArg(2, i); // Assign `i` argument. +//! funcNode->setArg(0, dst); // Assign `dst` argument. +//! funcNode->setArg(1, src); // Assign `src` argument. +//! funcNode->setArg(2, i); // Assign `i` argument. //! -//! cc.test(i, i); // Early exit if length is zero. +//! cc.test(i, i); // Early exit if length is zero. //! cc.jz(L_Exit); //! -//! cc.bind(L_Loop); // Bind the beginning of the loop here. +//! cc.bind(L_Loop); // Bind the beginning of the loop here. //! -//! x86::Gp tmp = cc.newInt32("tmp"); // Copy a single dword (4 bytes). -//! cc.mov(tmp, x86::dword_ptr(src)); // Load DWORD from [src] address. -//! cc.mov(x86::dword_ptr(dst), tmp); // Store DWORD to [dst] address. +//! x86::Gp tmp = cc.newInt32("tmp"); // Copy a single dword (4 bytes). +//! cc.mov(tmp, x86::dword_ptr(src)); // Load DWORD from [src] address. +//! cc.mov(x86::dword_ptr(dst), tmp); // Store DWORD to [dst] address. //! -//! cc.add(src, 4); // Increment `src`. -//! cc.add(dst, 4); // Increment `dst`. +//! cc.add(src, 4); // Increment `src`. +//! cc.add(dst, 4); // Increment `dst`. //! -//! cc.dec(i); // Loop until `i` is non-zero. +//! cc.dec(i); // Loop until `i` is non-zero. //! cc.jnz(L_Loop); //! -//! cc.bind(L_Exit); // Label used by early exit. -//! cc.endFunc(); // End of the function body. +//! cc.bind(L_Exit); // Label used by early exit. +//! cc.endFunc(); // End of the function body. //! -//! cc.finalize(); // Translate and assemble the whole 'cc' content. +//! cc.finalize(); // Translate and assemble the whole 'cc' content. //! // ----> x86::Compiler is no longer needed from here and can be destroyed <---- //! //! // Add the generated code to the runtime. @@ -161,13 +163,14 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! typedef void (*Func)(void*); //! //! int main() { -//! JitRuntime rt; // Runtime specialized for JIT code execution. -//! CodeHolder code; // Holds code and relocation information. +//! JitRuntime rt; // Runtime specialized for JIT code execution. +//! CodeHolder code; // Holds code and relocation information. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. -//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); +//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. //! -//! FuncNode* funcNode = cc.addFunc(FuncSignatureT()); +//! FuncNode* funcNode = cc.addFunc(FuncSignature::build()); //! //! // Use the following to enable AVX and/or AVX-512. //! funcNode->frame().setAvxEnabled(); @@ -183,13 +186,13 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! cc.vpaddq(vreg, vreg, vreg); //! cc.vmovdqu32(x86::ptr(addr), vreg); //! -//! cc.endFunc(); // End of the function body. -//! cc.finalize(); // Translate and assemble the whole 'cc' content. +//! cc.endFunc(); // End of the function body. +//! cc.finalize(); // Translate and assemble the whole 'cc' content. //! // ----> x86::Compiler is no longer needed from here and can be destroyed <---- //! //! Func fn; -//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime. -//! if (err) return 1; // Handle a possible error returned by AsmJit. +//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime. +//! if (err) return 1; // Handle a possible error returned by AsmJit. //! // ----> CodeHolder is no longer needed from here and can be destroyed <---- //! //! // Execute the generated code and print some output. @@ -197,7 +200,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! fn(data); //! printf("%llu\n", (unsigned long long)data[0]); //! -//! rt.release(fn); // Explicitly remove the function from the runtime. +//! rt.release(fn); // Explicitly remove the function from the runtime. //! return 0; //! } //! ``` @@ -219,47 +222,48 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! typedef uint32_t (*Fibonacci)(uint32_t x); //! //! int main() { -//! JitRuntime rt; // Runtime specialized for JIT code execution. -//! CodeHolder code; // Holds code and relocation information. +//! JitRuntime rt; // Runtime specialized for JIT code execution. +//! CodeHolder code; // Holds code and relocation information. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. -//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); +//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. //! -//! FuncNode* funcNode = cc.addFunc( // Begin of the Fibonacci function, addFunc() -//! FuncSignatureT()); // Returns a pointer to the FuncNode node. +//! FuncNode* funcNode = cc.addFunc( // Begin of the Fibonacci function, addFunc() +//! FuncSignature::build()); // Returns a pointer to the FuncNode node. //! -//! Label L_Exit = cc.newLabel() // Exit label. -//! x86::Gp x = cc.newUInt32(); // Function x argument. -//! x86::Gp y = cc.newUInt32(); // Temporary. +//! Label L_Exit = cc.newLabel(); // Exit label. +//! x86::Gp x = cc.newUInt32(); // Function x argument. +//! x86::Gp y = cc.newUInt32(); // Temporary. //! //! funcNode->setArg(0, x); //! -//! cc.cmp(x, 3); // Return x if less than 3. +//! cc.cmp(x, 3); // Return x if less than 3. //! cc.jb(L_Exit); //! -//! cc.mov(y, x); // Make copy of the original x. -//! cc.dec(x); // Decrease x. +//! cc.mov(y, x); // Make copy of the original x. +//! cc.dec(x); // Decrease x. //! -//! InvokeNode* invokeNode; // Function invocation: -//! cc.invoke(&invokeNode, // - InvokeNode (output). -//! funcNode->label(), // - Function address or Label. -//! FuncSignatureT()); // - Function signature. +//! InvokeNode* invokeNode; // Function invocation: +//! cc.invoke(&invokeNode, // - InvokeNode (output). +//! funcNode->label(), // - Function address or Label. +//! FuncSignature::build()); // - Function signature. //! -//! invokeNode->setArg(0, x); // Assign x as the first argument. -//! invokeNode->setRet(0, x); // Assign x as a return value as well. +//! invokeNode->setArg(0, x); // Assign x as the first argument. +//! invokeNode->setRet(0, x); // Assign x as a return value as well. //! -//! cc.add(x, y); // Combine the return value with y. +//! cc.add(x, y); // Combine the return value with y. //! //! cc.bind(L_Exit); -//! cc.ret(x); // Return x. -//! cc.endFunc(); // End of the function body. +//! cc.ret(x); // Return x. +//! cc.endFunc(); // End of the function body. //! -//! cc.finalize(); // Translate and assemble the whole 'cc' content. +//! cc.finalize(); // Translate and assemble the whole 'cc' content. //! // ----> x86::Compiler is no longer needed from here and can be destroyed <---- //! //! Fibonacci fib; -//! Error err = rt.add(&fib, &code); // Add the generated code to the runtime. -//! if (err) return 1; // Handle a possible error returned by AsmJit. +//! Error err = rt.add(&fib, &code); // Add the generated code to the runtime. +//! if (err) return 1; // Handle a possible error returned by AsmJit. //! // ----> CodeHolder is no longer needed from here and can be destroyed <---- //! //! // Test the generated code. @@ -287,13 +291,14 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! typedef int (*Func)(void); //! //! int main() { -//! JitRuntime rt; // Runtime specialized for JIT code execution. -//! CodeHolder code; // Holds code and relocation information. +//! JitRuntime rt; // Runtime specialized for JIT code execution. +//! CodeHolder code; // Holds code and relocation information. //! -//! code.init(rt.environment()); // Initialize code to match the JIT environment. -//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. +//! code.init(rt.environment(), // Initialize code to match the JIT environment. +//! rt.cpuFeatures()); +//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code. //! -//! cc.addFunc(FuncSignatureT());// Create a function that returns int. +//! cc.addFunc(FuncSignature::build()); // Create a function that returns int. //! //! x86::Gp p = cc.newIntPtr("p"); //! x86::Gp i = cc.newIntPtr("i"); @@ -301,9 +306,9 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! // Allocate 256 bytes on the stack aligned to 4 bytes. //! x86::Mem stack = cc.newStack(256, 4); //! -//! x86::Mem stackIdx(stack); // Copy of stack with i added. -//! stackIdx.setIndex(i); // stackIdx <- stack[i]. -//! stackIdx.setSize(1); // stackIdx <- byte ptr stack[i]. +//! x86::Mem stackIdx(stack); // Copy of stack with i added. +//! stackIdx.setIndex(i); // stackIdx <- stack[i]. +//! stackIdx.setSize(1); // stackIdx <- byte ptr stack[i]. //! //! // Load a stack address to `p`. This step is purely optional and shows //! // that `lea` is useful to load a memory operands address (even absolute) @@ -316,12 +321,12 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! Label L1 = cc.newLabel(); //! Label L2 = cc.newLabel(); //! -//! cc.bind(L1); // First loop, fill the stack. -//! cc.mov(stackIdx, i.r8()); // stack[i] = uint8_t(i). +//! cc.bind(L1); // First loop, fill the stack. +//! cc.mov(stackIdx, i.r8()); // stack[i] = uint8_t(i). //! -//! cc.inc(i); // i++; -//! cc.cmp(i, 256); // if (i < 256) -//! cc.jb(L1); // goto L1; +//! cc.inc(i); // i++; +//! cc.cmp(i, 256); // if (i < 256) +//! cc.jb(L1); // goto L1; //! //! // Second loop, sum all bytes stored in `stack`. //! x86::Gp sum = cc.newInt32("sum"); @@ -332,25 +337,25 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! //! cc.bind(L2); //! -//! cc.movzx(val, stackIdx); // val = uint32_t(stack[i]); -//! cc.add(sum, val); // sum += val; +//! cc.movzx(val, stackIdx); // val = uint32_t(stack[i]); +//! cc.add(sum, val); // sum += val; //! -//! cc.inc(i); // i++; -//! cc.cmp(i, 256); // if (i < 256) -//! cc.jb(L2); // goto L2; +//! cc.inc(i); // i++; +//! cc.cmp(i, 256); // if (i < 256) +//! cc.jb(L2); // goto L2; //! -//! cc.ret(sum); // Return the `sum` of all values. -//! cc.endFunc(); // End of the function body. +//! cc.ret(sum); // Return the `sum` of all values. +//! cc.endFunc(); // End of the function body. //! -//! cc.finalize(); // Translate and assemble the whole 'cc' content. +//! cc.finalize(); // Translate and assemble the whole 'cc' content. //! // ----> x86::Compiler is no longer needed from here and can be destroyed <---- //! //! Func func; -//! Error err = rt.add(&func, &code); // Add the generated code to the runtime. -//! if (err) return 1; // Handle a possible error returned by AsmJit. +//! Error err = rt.add(&func, &code); // Add the generated code to the runtime. +//! if (err) return 1; // Handle a possible error returned by AsmJit. //! // ----> CodeHolder is no longer needed from here and can be destroyed <---- //! -//! printf("Func() -> %d\n", func()); // Test the generated code. +//! printf("Func() -> %d\n", func()); // Test the generated code. //! //! rt.release(func); //! return 0; @@ -375,7 +380,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! using namespace asmjit; //! //! static void exampleUseOfConstPool(x86::Compiler& cc) { -//! cc.addFunc(FuncSignatureT()); +//! cc.addFunc(FuncSignature::build()); //! //! x86::Gp v0 = cc.newGpd("v0"); //! x86::Gp v1 = cc.newGpd("v1"); @@ -409,7 +414,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! using namespace asmjit; //! //! static void exampleUseOfIndirectJump(x86::Compiler& cc) { -//! FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); +//! FuncNode* funcNode = cc.addFunc(FuncSignature::build()); //! //! // Function arguments //! x86::Xmm a = cc.newXmmSs("a"); @@ -489,7 +494,7 @@ class ASMJIT_VIRTAPI Compiler //! \{ ASMJIT_API explicit Compiler(CodeHolder* code = nullptr) noexcept; - ASMJIT_API virtual ~Compiler() noexcept; + ASMJIT_API ~Compiler() noexcept override; //! \} @@ -497,52 +502,52 @@ class ASMJIT_VIRTAPI Compiler //! \{ #ifndef ASMJIT_NO_LOGGING -# define ASMJIT_NEW_REG_FMT(OUT, PARAM, FORMAT, ARGS) \ +# define ASMJIT_NEW_REG_FMT(OUT, PARAM, FORMAT, ARGS) \ _newRegFmt(&OUT, PARAM, FORMAT, ARGS) #else -# define ASMJIT_NEW_REG_FMT(OUT, PARAM, FORMAT, ARGS) \ - DebugUtils::unused(FORMAT); \ - DebugUtils::unused(std::forward(args)...); \ +# define ASMJIT_NEW_REG_FMT(OUT, PARAM, FORMAT, ARGS) \ + DebugUtils::unused(FORMAT); \ + DebugUtils::unused(std::forward(args)...); \ _newReg(&OUT, PARAM) #endif -#define ASMJIT_NEW_REG_CUSTOM(FUNC, REG) \ - inline REG FUNC(TypeId typeId) { \ - REG reg(Globals::NoInit); \ - _newReg(®, typeId); \ - return reg; \ - } \ - \ - template \ - inline REG FUNC(TypeId typeId, const char* fmt, Args&&... args) { \ - REG reg(Globals::NoInit); \ - ASMJIT_NEW_REG_FMT(reg, typeId, fmt, std::forward(args)...); \ - return reg; \ +#define ASMJIT_NEW_REG_CUSTOM(FUNC, REG) \ + ASMJIT_INLINE_NODEBUG REG FUNC(TypeId typeId) { \ + REG reg(Globals::NoInit); \ + _newReg(®, typeId); \ + return reg; \ + } \ + \ + template \ + ASMJIT_INLINE_NODEBUG REG FUNC(TypeId typeId, const char* fmt, Args&&... args) { \ + REG reg(Globals::NoInit); \ + ASMJIT_NEW_REG_FMT(reg, typeId, fmt, std::forward(args)...); \ + return reg; \ } -#define ASMJIT_NEW_REG_TYPED(FUNC, REG, TYPE_ID) \ - inline REG FUNC() { \ - REG reg(Globals::NoInit); \ - _newReg(®, TYPE_ID); \ - return reg; \ - } \ - \ - template \ - inline REG FUNC(const char* fmt, Args&&... args) { \ - REG reg(Globals::NoInit); \ - ASMJIT_NEW_REG_FMT(reg, TYPE_ID, fmt, std::forward(args)...); \ - return reg; \ +#define ASMJIT_NEW_REG_TYPED(FUNC, REG, TYPE_ID) \ + ASMJIT_INLINE_NODEBUG REG FUNC() { \ + REG reg(Globals::NoInit); \ + _newReg(®, TYPE_ID); \ + return reg; \ + } \ + \ + template \ + ASMJIT_INLINE_NODEBUG REG FUNC(const char* fmt, Args&&... args) { \ + REG reg(Globals::NoInit); \ + ASMJIT_NEW_REG_FMT(reg, TYPE_ID, fmt, std::forward(args)...); \ + return reg; \ } template - inline RegT newSimilarReg(const RegT& ref) { + ASMJIT_INLINE_NODEBUG RegT newSimilarReg(const RegT& ref) { RegT reg(Globals::NoInit); - _newReg(reg, ref); + _newReg(®, ref); return reg; } template - inline RegT newSimilarReg(const RegT& ref, const char* fmt, Args&&... args) { + ASMJIT_INLINE_NODEBUG RegT newSimilarReg(const RegT& ref, const char* fmt, Args&&... args) { RegT reg(Globals::NoInit); ASMJIT_NEW_REG_FMT(reg, ref, fmt, std::forward(args)...); return reg; @@ -596,7 +601,7 @@ class ASMJIT_VIRTAPI Compiler //! \{ //! Creates a new memory chunk allocated on the current function's stack. - inline Mem newStack(uint32_t size, uint32_t alignment, const char* name = nullptr) { + ASMJIT_INLINE_NODEBUG Mem newStack(uint32_t size, uint32_t alignment, const char* name = nullptr) { Mem m(Globals::NoInit); _newStack(&m, size, alignment, name); return m; @@ -608,38 +613,38 @@ class ASMJIT_VIRTAPI Compiler //! \{ //! Put data to a constant-pool and get a memory reference to it. - inline Mem newConst(ConstPoolScope scope, const void* data, size_t size) { + ASMJIT_INLINE_NODEBUG Mem newConst(ConstPoolScope scope, const void* data, size_t size) { Mem m(Globals::NoInit); _newConst(&m, scope, data, size); return m; } //! Put a BYTE `val` to a constant-pool. - inline Mem newByteConst(ConstPoolScope scope, uint8_t val) noexcept { return newConst(scope, &val, 1); } + ASMJIT_INLINE_NODEBUG Mem newByteConst(ConstPoolScope scope, uint8_t val) noexcept { return newConst(scope, &val, 1); } //! Put a WORD `val` to a constant-pool. - inline Mem newWordConst(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); } + ASMJIT_INLINE_NODEBUG Mem newWordConst(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); } //! Put a DWORD `val` to a constant-pool. - inline Mem newDWordConst(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); } + ASMJIT_INLINE_NODEBUG Mem newDWordConst(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); } //! Put a QWORD `val` to a constant-pool. - inline Mem newQWordConst(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); } + ASMJIT_INLINE_NODEBUG Mem newQWordConst(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); } //! Put a WORD `val` to a constant-pool. - inline Mem newInt16Const(ConstPoolScope scope, int16_t val) noexcept { return newConst(scope, &val, 2); } + ASMJIT_INLINE_NODEBUG Mem newInt16Const(ConstPoolScope scope, int16_t val) noexcept { return newConst(scope, &val, 2); } //! Put a WORD `val` to a constant-pool. - inline Mem newUInt16Const(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); } + ASMJIT_INLINE_NODEBUG Mem newUInt16Const(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); } //! Put a DWORD `val` to a constant-pool. - inline Mem newInt32Const(ConstPoolScope scope, int32_t val) noexcept { return newConst(scope, &val, 4); } + ASMJIT_INLINE_NODEBUG Mem newInt32Const(ConstPoolScope scope, int32_t val) noexcept { return newConst(scope, &val, 4); } //! Put a DWORD `val` to a constant-pool. - inline Mem newUInt32Const(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); } + ASMJIT_INLINE_NODEBUG Mem newUInt32Const(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); } //! Put a QWORD `val` to a constant-pool. - inline Mem newInt64Const(ConstPoolScope scope, int64_t val) noexcept { return newConst(scope, &val, 8); } + ASMJIT_INLINE_NODEBUG Mem newInt64Const(ConstPoolScope scope, int64_t val) noexcept { return newConst(scope, &val, 8); } //! Put a QWORD `val` to a constant-pool. - inline Mem newUInt64Const(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); } + ASMJIT_INLINE_NODEBUG Mem newUInt64Const(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); } //! Put a SP-FP `val` to a constant-pool. - inline Mem newFloatConst(ConstPoolScope scope, float val) noexcept { return newConst(scope, &val, 4); } + ASMJIT_INLINE_NODEBUG Mem newFloatConst(ConstPoolScope scope, float val) noexcept { return newConst(scope, &val, 4); } //! Put a DP-FP `val` to a constant-pool. - inline Mem newDoubleConst(ConstPoolScope scope, double val) noexcept { return newConst(scope, &val, 8); } + ASMJIT_INLINE_NODEBUG Mem newDoubleConst(ConstPoolScope scope, double val) noexcept { return newConst(scope, &val, 8); } //! \} @@ -647,9 +652,9 @@ class ASMJIT_VIRTAPI Compiler //! \{ //! Force the compiler to not follow the conditional or unconditional jump. - inline Compiler& unfollow() noexcept { addInstOptions(InstOptions::kUnfollow); return *this; } + ASMJIT_INLINE_NODEBUG Compiler& unfollow() noexcept { addInstOptions(InstOptions::kUnfollow); return *this; } //! Tell the compiler that the destination variable will be overwritten. - inline Compiler& overwrite() noexcept { addInstOptions(InstOptions::kOverwrite); return *this; } + ASMJIT_INLINE_NODEBUG Compiler& overwrite() noexcept { addInstOptions(InstOptions::kOverwrite); return *this; } //! \} @@ -657,7 +662,7 @@ class ASMJIT_VIRTAPI Compiler //! \{ //! Invoke a function call without `target` type enforcement. - inline Error invoke_(InvokeNode** out, const Operand_& target, const FuncSignature& signature) { + ASMJIT_INLINE_NODEBUG Error invoke_(InvokeNode** out, const Operand_& target, const FuncSignature& signature) { return addInvokeNode(out, Inst::kIdCall, target, signature); } @@ -666,22 +671,22 @@ class ASMJIT_VIRTAPI Compiler //! Creates a new \ref InvokeNode, initializes all the necessary members to match the given function `signature`, //! adds the node to the compiler, and stores its pointer to `out`. The operation is atomic, if anything fails //! nullptr is stored in `out` and error code is returned. - inline Error invoke(InvokeNode** out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); } //! \overload - inline Error invoke(InvokeNode** out, const Mem& target, const FuncSignature& signature) { return invoke_(out, target, signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Mem& target, const FuncSignature& signature) { return invoke_(out, target, signature); } //! \overload - inline Error invoke(InvokeNode** out, const Label& target, const FuncSignature& signature) { return invoke_(out, target, signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Label& target, const FuncSignature& signature) { return invoke_(out, target, signature); } //! \overload - inline Error invoke(InvokeNode** out, const Imm& target, const FuncSignature& signature) { return invoke_(out, target, signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Imm& target, const FuncSignature& signature) { return invoke_(out, target, signature); } //! \overload - inline Error invoke(InvokeNode** out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); } + ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); } //! Return from function. - inline Error ret() { return addRet(Operand(), Operand()); } + ASMJIT_INLINE_NODEBUG Error ret() { return addRet(Operand(), Operand()); } //! \overload - inline Error ret(const BaseReg& o0) { return addRet(o0, Operand()); } + ASMJIT_INLINE_NODEBUG Error ret(const BaseReg& o0) { return addRet(o0, Operand()); } //! \overload - inline Error ret(const BaseReg& o0, const BaseReg& o1) { return addRet(o0, o1); } + ASMJIT_INLINE_NODEBUG Error ret(const BaseReg& o0, const BaseReg& o1) { return addRet(o0, o1); } //! \} @@ -691,9 +696,9 @@ class ASMJIT_VIRTAPI Compiler using EmitterExplicitT::jmp; //! Adds a jump to the given `target` with the provided jump `annotation`. - inline Error jmp(const BaseReg& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdJmp, target, annotation); } + ASMJIT_INLINE_NODEBUG Error jmp(const BaseReg& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdJmp, target, annotation); } //! \overload - inline Error jmp(const BaseMem& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdJmp, target, annotation); } + ASMJIT_INLINE_NODEBUG Error jmp(const BaseMem& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdJmp, target, annotation); } //! \} diff --git a/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp b/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp index b541c048b0496..9cd1db684235b 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp @@ -22,6 +22,18 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) // x86::EmitHelper - Utilities // =========================== +static constexpr OperandSignature regSizeToGpSignature[8 + 1] = { + OperandSignature{0}, + OperandSignature{RegTraits::kSignature}, + OperandSignature{RegTraits::kSignature}, + OperandSignature{0}, + OperandSignature{RegTraits::kSignature}, + OperandSignature{0}, + OperandSignature{0}, + OperandSignature{0}, + OperandSignature{RegTraits::kSignature} +}; + static inline uint32_t getXmmMovInst(const FuncFrame& frame) { bool avx = frame.isAvxEnabled(); bool aligned = frame.hasAlignedVecSR(); @@ -70,8 +82,8 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitRegMove( // Detect memory operands and patch them to have the same size as the register. BaseCompiler always sets memory size // of allocs and spills, so it shouldn't be really necessary, however, after this function was separated from Compiler // it's better to make sure that the size is always specified, as we can use 'movzx' and 'movsx' that rely on it. - if (dst.isMem()) { memFlags |= kDstMem; dst.as().setSize(src.size()); } - if (src.isMem()) { memFlags |= kSrcMem; src.as().setSize(dst.size()); } + if (dst.isMem()) { memFlags |= kDstMem; dst.as().setSize(src.as().size()); } + if (src.isMem()) { memFlags |= kSrcMem; src.as().setSize(dst.as().size()); } switch (typeId) { case TypeId::kInt8: @@ -182,41 +194,42 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitArgMove( // Not a real loop, just 'break' is nicer than 'goto'. for (;;) { if (TypeUtils::isInt(dstTypeId)) { + // Sign extend. if (TypeUtils::isInt(srcTypeId)) { - instId = Inst::kIdMovsx; uint32_t castOp = makeCastOp(dstTypeId, srcTypeId); - // Sign extend by using 'movsx'. if (castOp == makeCastOp(TypeId::kInt16, TypeId::kInt8 ) || castOp == makeCastOp(TypeId::kInt32, TypeId::kInt8 ) || - castOp == makeCastOp(TypeId::kInt32, TypeId::kInt16) || castOp == makeCastOp(TypeId::kInt64, TypeId::kInt8 ) || - castOp == makeCastOp(TypeId::kInt64, TypeId::kInt16)) - break; - - // Sign extend by using 'movsxd'. - instId = Inst::kIdMovsxd; - if (castOp == makeCastOp(TypeId::kInt64, TypeId::kInt32)) + castOp == makeCastOp(TypeId::kInt32, TypeId::kInt16) || + castOp == makeCastOp(TypeId::kInt64, TypeId::kInt16) || + castOp == makeCastOp(TypeId::kInt64, TypeId::kInt32)) { + // Sign extend by using 'movsx' or 'movsxd'. + instId = + castOp == makeCastOp(TypeId::kInt64, TypeId::kInt32) + ? Inst::kIdMovsxd + : Inst::kIdMovsx; + + dst.setSignature(regSizeToGpSignature[dstSize]); + if (src.isReg()) + src.setSignature(regSizeToGpSignature[srcSize]); break; + } } + // Zero extend. if (TypeUtils::isInt(srcTypeId) || src_.isMem()) { + uint32_t movSize = Support::min(srcSize, dstSize); + if (movSize <= 4) + dstSize = 4; + // Zero extend by using 'movzx' or 'mov'. - if (dstSize <= 4 && srcSize < 4) { - instId = Inst::kIdMovzx; - dst.setSignature(Reg::signatureOfT()); - } - else { - // We should have caught all possibilities where `srcSize` is less than 4, so we don't have to worry - // about 'movzx' anymore. Minimum size is enough to determine if we want 32-bit or 64-bit move. - instId = Inst::kIdMov; - srcSize = Support::min(srcSize, dstSize); - - dst.setSignature(srcSize == 4 ? Reg::signatureOfT() - : Reg::signatureOfT()); - if (src.isReg()) - src.setSignature(dst.signature()); - } + instId = movSize < 4 ? Inst::kIdMovzx : Inst::kIdMov; + srcSize = Support::min(srcSize, movSize); + + dst.setSignature(regSizeToGpSignature[dstSize]); + if (src.isReg()) + src.setSignature(regSizeToGpSignature[srcSize]); break; } @@ -394,25 +407,29 @@ Error EmitHelper::emitRegSwap( // x86::EmitHelper - Emit Prolog & Epilog // ====================================== -static inline void X86Internal_setupSaveRestoreInfo(RegGroup group, const FuncFrame& frame, Reg& xReg, uint32_t& xInst, uint32_t& xSize) noexcept { +static inline Error X86Internal_setupSaveRestoreInfo(RegGroup group, const FuncFrame& frame, Reg& xReg, uint32_t& xInst, uint32_t& xSize) noexcept { switch (group) { case RegGroup::kVec: xReg = xmm(0); xInst = getXmmMovInst(frame); xSize = xReg.size(); - break; + return kErrorOk; + case RegGroup::kX86_K: xReg = k(0); xInst = Inst::kIdKmovq; xSize = xReg.size(); - break; + return kErrorOk; + case RegGroup::kX86_MM: xReg = mm(0); xInst = Inst::kIdMovq; xSize = xReg.size(); - break; + return kErrorOk; + default: - break; + // This would be a bug in AsmJit if hit. + return DebugUtils::errored(kErrorInvalidState); } } @@ -425,6 +442,12 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) { Gp gpReg = zsp; // General purpose register (temporary). Gp saReg = zsp; // Stack-arguments base pointer. + // Emit: 'endbr32' or 'endbr64' (indirect branch protection). + if (frame.hasIndirectBranchProtection()) { + InstId instId = emitter->is32Bit() ? Inst::kIdEndbr32 : Inst::kIdEndbr64; + ASMJIT_PROPAGATE(emitter->emit(instId)); + } + // Emit: 'push zbp' // 'mov zbp, zsp'. if (frame.hasPreservedFP()) { @@ -473,16 +496,15 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) { // Emit 'movxxx [zsp + X], {[x|y|z]mm, k}'. { - Reg xReg; Mem xBase = ptr(zsp, int32_t(frame.extraRegSaveOffset())); - uint32_t xInst; - uint32_t xSize; - for (RegGroup group : Support::EnumValues{}) { Support::BitWordIterator it(frame.savedRegs(group)); if (it.hasNext()) { - X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize); + Reg xReg; + uint32_t xInst = 0; + uint32_t xSize = 0; + ASMJIT_PROPAGATE(X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize)); do { xReg.setId(it.next()); ASMJIT_PROPAGATE(emitter->emit(xInst, xBase, xReg)); @@ -514,16 +536,15 @@ ASMJIT_FAVOR_SIZE Error EmitHelper::emitEpilog(const FuncFrame& frame) { // Emit 'movxxx {[x|y|z]mm, k}, [zsp + X]'. { - Reg xReg; Mem xBase = ptr(zsp, int32_t(frame.extraRegSaveOffset())); - uint32_t xInst; - uint32_t xSize; - for (RegGroup group : Support::EnumValues{}) { Support::BitWordIterator it(frame.savedRegs(group)); if (it.hasNext()) { - X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize); + Reg xReg; + uint32_t xInst; + uint32_t xSize; + ASMJIT_PROPAGATE(X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize)); do { xReg.setId(it.next()); ASMJIT_PROPAGATE(emitter->emit(xInst, xReg, xBase)); @@ -610,7 +631,7 @@ void assignEmitterFuncs(BaseEmitter* emitter) { #endif #ifndef ASMJIT_NO_VALIDATION - emitter->_funcs.validate = InstInternal::validate; + emitter->_funcs.validate = emitter->is32Bit() ? InstInternal::validateX86 : InstInternal::validateX64; #endif } diff --git a/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h b/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h index e71d9afe7db6f..e09d084a09776 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h @@ -19,7 +19,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) //! \addtogroup asmjit_x86 //! \{ -static inline RegType vecTypeIdToRegType(TypeId typeId) noexcept { +static ASMJIT_INLINE_NODEBUG RegType vecTypeIdToRegType(TypeId typeId) noexcept { return uint32_t(typeId) <= uint32_t(TypeId::_kVec128End) ? RegType::kX86_Xmm : uint32_t(typeId) <= uint32_t(TypeId::_kVec256End) ? RegType::kX86_Ymm : RegType::kX86_Zmm; } @@ -29,7 +29,7 @@ class EmitHelper : public BaseEmitHelper { bool _avxEnabled; bool _avx512Enabled; - inline explicit EmitHelper(BaseEmitter* emitter = nullptr, bool avxEnabled = false, bool avx512Enabled = false) noexcept + ASMJIT_INLINE_NODEBUG explicit EmitHelper(BaseEmitter* emitter = nullptr, bool avxEnabled = false, bool avx512Enabled = false) noexcept : BaseEmitHelper(emitter), _avxEnabled(avxEnabled || avx512Enabled), _avx512Enabled(avx512Enabled) {} diff --git a/3rdparty/asmjit/src/asmjit/x86/x86emitter.h b/3rdparty/asmjit/src/asmjit/x86/x86emitter.h index 1f85dec4fd916..4855e9957c39f 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86emitter.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86emitter.h @@ -139,8 +139,8 @@ struct EmitterExplicitT { // These two are unfortunately reported by the sanitizer. We know what we do, however, the sanitizer doesn't. // I have tried to use reinterpret_cast instead, but that would generate bad code when compiled by MSC. - ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline This* _emitter() noexcept { return static_cast(this); } - ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF inline const This* _emitter() const noexcept { return static_cast(this); } + ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG This* _emitter() noexcept { return static_cast(this); } + ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG const This* _emitter() const noexcept { return static_cast(this); } //! \endcond @@ -471,7 +471,6 @@ struct EmitterExplicitT { ASMJIT_INST_3x(idiv, Idiv, Gp, Gp, Mem) // ANY [EXPLICIT] xDX[Rem]:xAX[Quot] <- xDX:xAX / m16|m32|m64 ASMJIT_INST_2x(imul, Imul, Gp, Gp) // ANY [EXPLICIT] AX <- AL * r8 | ra <- ra * rb ASMJIT_INST_2x(imul, Imul, Gp, Mem) // ANY [EXPLICIT] AX <- AL * m8 | ra <- ra * m16|m32|m64 - ASMJIT_INST_2x(imul, Imul, Gp, Imm) // ANY ASMJIT_INST_3x(imul, Imul, Gp, Gp, Imm) // ANY ASMJIT_INST_3x(imul, Imul, Gp, Mem, Imm) // ANY ASMJIT_INST_3x(imul, Imul, Gp, Gp, Gp) // ANY [EXPLICIT] xDX:xAX <- xAX * r16|r32|r64 @@ -633,6 +632,14 @@ struct EmitterExplicitT { //! \} + //! \name Core Instructions (Aliases) + //! \{ + + //! The `imul(Gp, Imm)` instruction is an alias of `imul(Gp, Gp, Imm)` instruction. + inline Error imul(const Gp& o0, const Imm& o1) { return _emitter()->_emitI(Inst::kIdImul, o0, o0, o1); } + + //! \} + //! \name Deprecated 32-bit Instructions //! \{ @@ -657,7 +664,6 @@ struct EmitterExplicitT { //! \{ // NOTE: For some reason Doxygen is messed up here and thinks we are in cond. - //! \endcond ASMJIT_INST_2x(in, In, Gp_ZAX, Imm) // ANY ASMJIT_INST_2x(in, In, Gp_ZAX, Gp_DX) // ANY @@ -679,14 +685,6 @@ struct EmitterExplicitT { //! \} - //! \name LAHF/SAHF Instructions - //! \{ - - ASMJIT_INST_1x(lahf, Lahf, Gp_AH) // LAHFSAHF [EXPLICIT] AH <- EFL - ASMJIT_INST_1x(sahf, Sahf, Gp_AH) // LAHFSAHF [EXPLICIT] EFL <- AH - - //! \} - //! \name ADX Instructions //! \{ @@ -697,13 +695,18 @@ struct EmitterExplicitT { //! \} - //! \name LZCNT/POPCNT Instructions + //! \name CPUID Instruction //! \{ - ASMJIT_INST_2x(lzcnt, Lzcnt, Gp, Gp) // LZCNT - ASMJIT_INST_2x(lzcnt, Lzcnt, Gp, Mem) // LZCNT - ASMJIT_INST_2x(popcnt, Popcnt, Gp, Gp) // POPCNT - ASMJIT_INST_2x(popcnt, Popcnt, Gp, Mem) // POPCNT + ASMJIT_INST_4x(cpuid, Cpuid, Gp_EAX, Gp_EBX, Gp_ECX, Gp_EDX) // I486 [EXPLICIT] EAX:EBX:ECX:EDX <- CPUID[EAX:ECX] + + //! \} + + //! \name LAHF/SAHF Instructions + //! \{ + + ASMJIT_INST_1x(lahf, Lahf, Gp_AH) // LAHFSAHF [EXPLICIT] AH <- EFL + ASMJIT_INST_1x(sahf, Sahf, Gp_AH) // LAHFSAHF [EXPLICIT] EFL <- AH //! \} @@ -747,27 +750,36 @@ struct EmitterExplicitT { //! \} - //! \name TBM Instructions + //! \name CMPCCXADD Instructions //! \{ - ASMJIT_INST_2x(blcfill, Blcfill, Gp, Gp) // TBM - ASMJIT_INST_2x(blcfill, Blcfill, Gp, Mem) // TBM - ASMJIT_INST_2x(blci, Blci, Gp, Gp) // TBM - ASMJIT_INST_2x(blci, Blci, Gp, Mem) // TBM - ASMJIT_INST_2x(blcic, Blcic, Gp, Gp) // TBM - ASMJIT_INST_2x(blcic, Blcic, Gp, Mem) // TBM - ASMJIT_INST_2x(blcmsk, Blcmsk, Gp, Gp) // TBM - ASMJIT_INST_2x(blcmsk, Blcmsk, Gp, Mem) // TBM - ASMJIT_INST_2x(blcs, Blcs, Gp, Gp) // TBM - ASMJIT_INST_2x(blcs, Blcs, Gp, Mem) // TBM - ASMJIT_INST_2x(blsfill, Blsfill, Gp, Gp) // TBM - ASMJIT_INST_2x(blsfill, Blsfill, Gp, Mem) // TBM - ASMJIT_INST_2x(blsic, Blsic, Gp, Gp) // TBM - ASMJIT_INST_2x(blsic, Blsic, Gp, Mem) // TBM - ASMJIT_INST_2x(t1mskc, T1mskc, Gp, Gp) // TBM - ASMJIT_INST_2x(t1mskc, T1mskc, Gp, Mem) // TBM - ASMJIT_INST_2x(tzmsk, Tzmsk, Gp, Gp) // TBM - ASMJIT_INST_2x(tzmsk, Tzmsk, Gp, Mem) // TBM + ASMJIT_INST_3x(cmpbexadd, Cmpbexadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpbxadd, Cmpbxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmplexadd, Cmplexadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmplxadd, Cmplxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpnbexadd, Cmpnbexadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpnbxadd, Cmpnbxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpnlexadd, Cmpnlexadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpnlxadd, Cmpnlxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpnoxadd, Cmpnoxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpnpxadd, Cmpnpxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpnsxadd, Cmpnsxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpnzxadd, Cmpnzxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpoxadd, Cmpoxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmppxadd, Cmppxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpsxadd, Cmpsxadd, Mem, Gp, Gp) + ASMJIT_INST_3x(cmpzxadd, Cmpzxadd, Mem, Gp, Gp) + + //! \} + + //! \name CacheLine Instructions + //! \{ + + ASMJIT_INST_1x(cldemote, Cldemote, Mem) // CLDEMOTE + ASMJIT_INST_1x(clflush, Clflush, Mem) // CLFLUSH + ASMJIT_INST_1x(clflushopt, Clflushopt, Mem) // CLFLUSH_OPT + ASMJIT_INST_1x(clwb, Clwb, Mem) // CLWB + ASMJIT_INST_1x(clzero, Clzero, DS_ZAX) // CLZERO [EXPLICIT] //! \} @@ -779,6 +791,23 @@ struct EmitterExplicitT { //! \} + //! \name FENCE Instructions (SSE and SSE2) + //! \{ + + ASMJIT_INST_0x(lfence, Lfence) // SSE2 + ASMJIT_INST_0x(mfence, Mfence) // SSE2 + ASMJIT_INST_0x(sfence, Sfence) // SSE + + //! \} + + //! \name LZCNT Instructions + //! \{ + + ASMJIT_INST_2x(lzcnt, Lzcnt, Gp, Gp) // LZCNT + ASMJIT_INST_2x(lzcnt, Lzcnt, Gp, Mem) // LZCNT + + //! \} + //! \name MOVBE Instructions //! \{ @@ -803,12 +832,11 @@ struct EmitterExplicitT { //! \} - //! \name FENCE Instructions (SSE and SSE2) + //! \name POPCNT Instructions //! \{ - ASMJIT_INST_0x(lfence, Lfence) // SSE2 - ASMJIT_INST_0x(mfence, Mfence) // SSE2 - ASMJIT_INST_0x(sfence, Sfence) // SSE + ASMJIT_INST_2x(popcnt, Popcnt, Gp, Gp) // POPCNT + ASMJIT_INST_2x(popcnt, Popcnt, Gp, Mem) // POPCNT //! \} @@ -825,28 +853,21 @@ struct EmitterExplicitT { //! \} - //! \name CPUID Instruction - //! \{ - - ASMJIT_INST_4x(cpuid, Cpuid, Gp_EAX, Gp_EBX, Gp_ECX, Gp_EDX) // I486 [EXPLICIT] EAX:EBX:ECX:EDX <- CPUID[EAX:ECX] - - //! \} - - //! \name CacheLine Instructions + //! \name PREFETCHI Instructions //! \{ - ASMJIT_INST_1x(cldemote, Cldemote, Mem) // CLDEMOTE - ASMJIT_INST_1x(clflush, Clflush, Mem) // CLFLUSH - ASMJIT_INST_1x(clflushopt, Clflushopt, Mem) // CLFLUSH_OPT - ASMJIT_INST_1x(clwb, Clwb, Mem) // CLWB - ASMJIT_INST_1x(clzero, Clzero, DS_ZAX) // CLZERO [EXPLICIT] + ASMJIT_INST_1x(prefetchit0, Prefetchit0, Mem) + ASMJIT_INST_1x(prefetchit1, Prefetchit1, Mem) //! \} - //! \name SERIALIZE Instruction + //! \name RAO_INT Instructions //! \{ - ASMJIT_INST_0x(serialize, Serialize) // SERIALIZE + ASMJIT_INST_2x(aadd, Aadd, Mem, Gp) + ASMJIT_INST_2x(aand, Aand, Mem, Gp) + ASMJIT_INST_2x(aor, Aor, Mem, Gp) + ASMJIT_INST_2x(axor, Axor, Mem, Gp) //! \} @@ -873,6 +894,37 @@ struct EmitterExplicitT { //! \} + //! \name SERIALIZE Instruction + //! \{ + + ASMJIT_INST_0x(serialize, Serialize) // SERIALIZE + + //! \} + + //! \name TBM Instructions + //! \{ + + ASMJIT_INST_2x(blcfill, Blcfill, Gp, Gp) // TBM + ASMJIT_INST_2x(blcfill, Blcfill, Gp, Mem) // TBM + ASMJIT_INST_2x(blci, Blci, Gp, Gp) // TBM + ASMJIT_INST_2x(blci, Blci, Gp, Mem) // TBM + ASMJIT_INST_2x(blcic, Blcic, Gp, Gp) // TBM + ASMJIT_INST_2x(blcic, Blcic, Gp, Mem) // TBM + ASMJIT_INST_2x(blcmsk, Blcmsk, Gp, Gp) // TBM + ASMJIT_INST_2x(blcmsk, Blcmsk, Gp, Mem) // TBM + ASMJIT_INST_2x(blcs, Blcs, Gp, Gp) // TBM + ASMJIT_INST_2x(blcs, Blcs, Gp, Mem) // TBM + ASMJIT_INST_2x(blsfill, Blsfill, Gp, Gp) // TBM + ASMJIT_INST_2x(blsfill, Blsfill, Gp, Mem) // TBM + ASMJIT_INST_2x(blsic, Blsic, Gp, Gp) // TBM + ASMJIT_INST_2x(blsic, Blsic, Gp, Mem) // TBM + ASMJIT_INST_2x(t1mskc, T1mskc, Gp, Gp) // TBM + ASMJIT_INST_2x(t1mskc, T1mskc, Gp, Mem) // TBM + ASMJIT_INST_2x(tzmsk, Tzmsk, Gp, Gp) // TBM + ASMJIT_INST_2x(tzmsk, Tzmsk, Gp, Mem) // TBM + + //! \} + //! \name Other User-Mode Instructions //! \{ @@ -1122,6 +1174,14 @@ struct EmitterExplicitT { //! \} + //! \name INVLPGB Instructions + //! \{ + + ASMJIT_INST_3x(invlpgb, Invlpgb, Gp_EAX, Gp_EDX, Gp_ECX) + ASMJIT_INST_0x(tlbsync, Tlbsync) + + //! \} + //! \name MONITOR Instructions (Privileged) //! \{ @@ -1172,6 +1232,7 @@ struct EmitterExplicitT { ASMJIT_INST_0x(vmresume, Vmresume) // VMX ASMJIT_INST_2x(vmwrite, Vmwrite, Gp, Mem) // VMX ASMJIT_INST_2x(vmwrite, Vmwrite, Gp, Gp) // VMX + ASMJIT_INST_0x(vmxoff, Vmxoff) // VMX ASMJIT_INST_1x(vmxon, Vmxon, Mem) // VMX //! \} @@ -1188,6 +1249,13 @@ struct EmitterExplicitT { //! \} + //! \name SEV_ES Instructions + //! \{ + + ASMJIT_INST_0x(vmgexit, Vmgexit) + + //! \} + //! \name FPU Instructions //! \{ @@ -2092,9 +2160,6 @@ struct EmitterExplicitT { //! \name GFNI Instructions //! \{ - // NOTE: For some reason Doxygen is messed up here and thinks we are in cond. - //! \endcond - ASMJIT_INST_3x(gf2p8affineinvqb, Gf2p8affineinvqb, Xmm, Xmm, Imm) // GFNI ASMJIT_INST_3x(gf2p8affineinvqb, Gf2p8affineinvqb, Xmm, Mem, Imm) // GFNI ASMJIT_INST_3x(gf2p8affineqb, Gf2p8affineqb, Xmm, Xmm, Imm) // GFNI @@ -2762,7 +2827,7 @@ struct EmitterExplicitT { ASMJIT_INST_3x(vpand, Vpand, Vec, Vec, Mem) // AVX+ ASMJIT_INST_3x(vpandd, Vpandd, Vec, Vec, Vec) // AVX512_F{kz|b32} ASMJIT_INST_3x(vpandd, Vpandd, Vec, Vec, Mem) // AVX512_F{kz|b32} - ASMJIT_INST_3x(vpandn, Vpandn, Vec, Vec, Vec) // AV+ + ASMJIT_INST_3x(vpandn, Vpandn, Vec, Vec, Vec) // AVX+ ASMJIT_INST_3x(vpandn, Vpandn, Vec, Vec, Mem) // AVX+ ASMJIT_INST_3x(vpandnd, Vpandnd, Vec, Vec, Vec) // AVX512_F{kz|b32} ASMJIT_INST_3x(vpandnd, Vpandnd, Vec, Vec, Mem) // AVX512_F{kz|b32} @@ -3121,7 +3186,7 @@ struct EmitterExplicitT { ASMJIT_INST_2x(vpopcntq, Vpopcntq, Vec, Mem) // AVX512_VPOPCNTDQ{kz|b64} ASMJIT_INST_2x(vpopcntw, Vpopcntw, Vec, Vec) // AVX512_BITALG{kz|b32} ASMJIT_INST_2x(vpopcntw, Vpopcntw, Vec, Mem) // AVX512_BITALG{kz|b32} - ASMJIT_INST_3x(vpor, Vpor, Vec, Vec, Vec) // AV+ + ASMJIT_INST_3x(vpor, Vpor, Vec, Vec, Vec) // AVX+ ASMJIT_INST_3x(vpor, Vpor, Vec, Vec, Mem) // AVX+ ASMJIT_INST_3x(vpord, Vpord, Vec, Vec, Vec) // AVX512_F{kz|b32} ASMJIT_INST_3x(vpord, Vpord, Vec, Vec, Mem) // AVX512_F{kz|b32} @@ -3659,6 +3724,83 @@ struct EmitterExplicitT { //! \} + //! \name AVX_NE_CONVERT Instructions + //! \{ + + ASMJIT_INST_2x(vbcstnebf162ps, Vbcstnebf162ps, Vec, Mem) + ASMJIT_INST_2x(vbcstnesh2ps, Vbcstnesh2ps, Vec, Mem) + ASMJIT_INST_2x(vcvtneebf162ps, Vcvtneebf162ps, Vec, Mem) + ASMJIT_INST_2x(vcvtneeph2ps, Vcvtneeph2ps, Vec, Mem) + ASMJIT_INST_2x(vcvtneobf162ps, Vcvtneobf162ps, Vec, Mem) + ASMJIT_INST_2x(vcvtneoph2ps, Vcvtneoph2ps, Vec, Mem) + + //! \} + + //! \name AVX_VNNI_INT8 Instructions + //! \{ + + ASMJIT_INST_3x(vpdpbssd, Vpdpbssd, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpbssd, Vpdpbssd, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpbssds, Vpdpbssds, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpbssds, Vpdpbssds, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpbsud, Vpdpbsud, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpbsud, Vpdpbsud, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpbsuds, Vpdpbsuds, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpbsuds, Vpdpbsuds, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpbuud, Vpdpbuud, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpbuud, Vpdpbuud, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpbuuds, Vpdpbuuds, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpbuuds, Vpdpbuuds, Vec, Vec, Mem) + + //! \} + + //! \name AVX_VNNI_INT16 Instructions + //! \{ + + ASMJIT_INST_3x(vpdpwsud, Vpdpwsud, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpwsud, Vpdpwsud, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpwsuds, Vpdpwsuds, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpwsuds, Vpdpwsuds, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpwusd, Vpdpwusd, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpwusd, Vpdpwusd, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpwusds, Vpdpwusds, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpwusds, Vpdpwusds, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpwuud, Vpdpwuud, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpwuud, Vpdpwuud, Vec, Vec, Mem) + ASMJIT_INST_3x(vpdpwuuds, Vpdpwuuds, Vec, Vec, Vec) + ASMJIT_INST_3x(vpdpwuuds, Vpdpwuuds, Vec, Vec, Mem) + + //! \} + + //! \name AVX+SHA512 Instructions + //! \{ + ASMJIT_INST_2x(vsha512msg1, Vsha512msg1, Vec, Vec) + ASMJIT_INST_2x(vsha512msg2, Vsha512msg2, Vec, Vec) + ASMJIT_INST_3x(vsha512rnds2, Vsha512rnds2, Vec, Vec, Vec) + //! \} + + //! \name AVX+SM3 Instructions + //! \{ + + ASMJIT_INST_3x(vsm3msg1, Vsm3msg1, Vec, Vec, Vec) + ASMJIT_INST_3x(vsm3msg1, Vsm3msg1, Vec, Vec, Mem) + ASMJIT_INST_3x(vsm3msg2, Vsm3msg2, Vec, Vec, Vec) + ASMJIT_INST_3x(vsm3msg2, Vsm3msg2, Vec, Vec, Mem) + ASMJIT_INST_4x(vsm3rnds2, Vsm3rnds2, Vec, Vec, Vec, Imm) + ASMJIT_INST_4x(vsm3rnds2, Vsm3rnds2, Vec, Vec, Mem, Imm) + + //! \} + + //! \name AVX+SM4 Instructions + //! \{ + + ASMJIT_INST_3x(vsm4key4, Vsm4key4, Vec, Vec, Vec) + ASMJIT_INST_3x(vsm4key4, Vsm4key4, Vec, Vec, Mem) + ASMJIT_INST_3x(vsm4rnds4, Vsm4rnds4, Vec, Vec, Vec) + ASMJIT_INST_3x(vsm4rnds4, Vsm4rnds4, Vec, Vec, Mem) + + //! \} + //! \name AVX512_FP16 Instructions //! \{ @@ -3880,22 +4022,48 @@ struct EmitterExplicitT { //! \} - //! \name AMX Instructions + //! \name AMX_TILE Instructions //! \{ - ASMJIT_INST_1x(ldtilecfg, Ldtilecfg, Mem) // AMX_TILE - ASMJIT_INST_1x(sttilecfg, Sttilecfg, Mem) // AMX_TILE - ASMJIT_INST_2x(tileloadd, Tileloadd, Tmm, Mem) // AMX_TILE - ASMJIT_INST_2x(tileloaddt1, Tileloaddt1, Tmm, Mem) // AMX_TILE - ASMJIT_INST_0x(tilerelease, Tilerelease) // AMX_TILE - ASMJIT_INST_2x(tilestored, Tilestored, Mem, Tmm) // AMX_TILE - ASMJIT_INST_1x(tilezero, Tilezero, Tmm) // AMX_TILE + ASMJIT_INST_1x(ldtilecfg, Ldtilecfg, Mem) + ASMJIT_INST_1x(sttilecfg, Sttilecfg, Mem) + ASMJIT_INST_2x(tileloadd, Tileloadd, Tmm, Mem) + ASMJIT_INST_2x(tileloaddt1, Tileloaddt1, Tmm, Mem) + ASMJIT_INST_0x(tilerelease, Tilerelease) + ASMJIT_INST_2x(tilestored, Tilestored, Mem, Tmm) + ASMJIT_INST_1x(tilezero, Tilezero, Tmm) - ASMJIT_INST_3x(tdpbf16ps, Tdpbf16ps, Tmm, Tmm, Tmm) // AMX_BF16 - ASMJIT_INST_3x(tdpbssd, Tdpbssd, Tmm, Tmm, Tmm) // AMX_INT8 - ASMJIT_INST_3x(tdpbsud, Tdpbsud, Tmm, Tmm, Tmm) // AMX_INT8 - ASMJIT_INST_3x(tdpbusd, Tdpbusd, Tmm, Tmm, Tmm) // AMX_INT8 - ASMJIT_INST_3x(tdpbuud, Tdpbuud, Tmm, Tmm, Tmm) // AMX_INT8 + //! \} + + //! \name AMX_BF16 Instructions + //! \{ + + ASMJIT_INST_3x(tdpbf16ps, Tdpbf16ps, Tmm, Tmm, Tmm) + + //! \} + + //! \name AMX_COMPLEX Instructions + //! \{ + + ASMJIT_INST_3x(tcmmimfp16ps, Tcmmimfp16ps, Tmm, Tmm, Tmm) + ASMJIT_INST_3x(tcmmrlfp16ps, Tcmmrlfp16ps, Tmm, Tmm, Tmm) + + //! \} + + //! \name AMX_FP16 Instructions + //! \{ + + ASMJIT_INST_3x(tdpfp16ps, Tdpfp16ps, Tmm, Tmm, Tmm) + + //! \} + + //! \name AMX_INT8 Instructions + //! \{ + + ASMJIT_INST_3x(tdpbssd, Tdpbssd, Tmm, Tmm, Tmm) + ASMJIT_INST_3x(tdpbsud, Tdpbsud, Tmm, Tmm, Tmm) + ASMJIT_INST_3x(tdpbusd, Tdpbusd, Tmm, Tmm, Tmm) + ASMJIT_INST_3x(tdpbuud, Tdpbuud, Tmm, Tmm, Tmm) //! \} }; @@ -4167,6 +4335,16 @@ struct EmitterImplicitT : public EmitterExplicitT { //! \} + //! \name SEAM Instructions + //! \{ + + ASMJIT_INST_0x(seamcall, Seamcall) + ASMJIT_INST_0x(seamops, Seamops) + ASMJIT_INST_0x(seamret, Seamret) + ASMJIT_INST_0x(tdcall, Tdcall) + + //! \} + //! \name Privileged Instructions //! \{ diff --git a/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp b/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp index d62dd18b6389e..67b38dfa779ef 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp @@ -4,7 +4,7 @@ // SPDX-License-Identifier: Zlib #include "../core/api-build_p.h" -#ifndef ASMJIT_NO_LOGGING +#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_LOGGING) #include "../core/cpuinfo.h" #include "../core/misc_p.h" @@ -95,6 +95,24 @@ struct RegFormatInfo_T { X == uint32_t(RegType::kX86_Gpd ) ? 8 : X == uint32_t(RegType::kX86_Gpq ) ? 8 : X == uint32_t(RegType::kX86_SReg ) ? 7 : + X == uint32_t(RegType::kX86_Rip ) ? 1 : 0, + + kRegCount = X == uint32_t(RegType::kX86_GpbLo) ? 32 : + X == uint32_t(RegType::kX86_GpbHi) ? 4 : + X == uint32_t(RegType::kX86_Gpw ) ? 32 : + X == uint32_t(RegType::kX86_Gpd ) ? 32 : + X == uint32_t(RegType::kX86_Gpq ) ? 32 : + X == uint32_t(RegType::kX86_Xmm ) ? 32 : + X == uint32_t(RegType::kX86_Ymm ) ? 32 : + X == uint32_t(RegType::kX86_Zmm ) ? 32 : + X == uint32_t(RegType::kX86_Mm ) ? 8 : + X == uint32_t(RegType::kX86_KReg ) ? 8 : + X == uint32_t(RegType::kX86_SReg ) ? 7 : + X == uint32_t(RegType::kX86_CReg ) ? 16 : + X == uint32_t(RegType::kX86_DReg ) ? 16 : + X == uint32_t(RegType::kX86_St ) ? 8 : + X == uint32_t(RegType::kX86_Bnd ) ? 4 : + X == uint32_t(RegType::kX86_Tmm ) ? 8 : X == uint32_t(RegType::kX86_Rip ) ? 1 : 0 }; }; @@ -104,7 +122,7 @@ struct RegFormatInfo_T { } #define ASMJIT_REG_NAME_ENTRY(TYPE) { \ - RegTraits::kCount, \ + RegFormatInfo_T::kRegCount, \ RegFormatInfo_T::kFormatIndex, \ RegFormatInfo_T::kSpecialIndex, \ RegFormatInfo_T::kSpecialCount \ @@ -198,8 +216,11 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept "AESNI\0" "ALTMOVCR8\0" "AMX_BF16\0" + "AMX_COMPLEX\0" + "AMX_FP16\0" "AMX_INT8\0" "AMX_TILE\0" + "APX_F\0" "AVX\0" "AVX2\0" "AVX512_4FMAPS\0" @@ -207,30 +228,36 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept "AVX512_BF16\0" "AVX512_BITALG\0" "AVX512_BW\0" - "AVX512_CDI\0" + "AVX512_CD\0" "AVX512_DQ\0" - "AVX512_ERI\0" + "AVX512_ER\0" "AVX512_F\0" "AVX512_FP16\0" "AVX512_IFMA\0" - "AVX512_PFI\0" + "AVX512_PF\0" "AVX512_VBMI\0" "AVX512_VBMI2\0" "AVX512_VL\0" "AVX512_VNNI\0" "AVX512_VP2INTERSECT\0" "AVX512_VPOPCNTDQ\0" + "AVX_IFMA\0" + "AVX_NE_CONVERT\0" "AVX_VNNI\0" + "AVX_VNNI_INT16\0" + "AVX_VNNI_INT8\0" "BMI\0" "BMI2\0" "CET_IBT\0" "CET_SS\0" + "CET_SSS\0" "CLDEMOTE\0" "CLFLUSH\0" "CLFLUSHOPT\0" "CLWB\0" "CLZERO\0" "CMOV\0" + "CMPCCXADD\0" "CMPXCHG16B\0" "CMPXCHG8B\0" "ENCLV\0" @@ -241,14 +268,20 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept "FMA4\0" "FPU\0" "FSGSBASE\0" + "FSRM\0" + "FSRC\0" + "FSRS\0" "FXSR\0" "FXSROPT\0" + "FZRM\0" "GEODE\0" "GFNI\0" "HLE\0" "HRESET\0" "I486\0" + "INVLPGB\0" "LAHFSAHF\0" + "LAM\0" "LWP\0" "LZCNT\0" "MCOMMIT\0" @@ -261,15 +294,19 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept "MOVDIRI\0" "MPX\0" "MSR\0" + "MSRLIST\0" "MSSE\0" "OSXSAVE\0" "OSPKE\0" "PCLMULQDQ\0" "PCONFIG\0" "POPCNT\0" + "PREFETCHI\0" "PREFETCHW\0" "PREFETCHWT1\0" "PTWRITE\0" + "RAO_INT\0" + "RMPQUERY\0" "RDPID\0" "RDPRU\0" "RDRAND\0" @@ -277,13 +314,20 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept "RDTSC\0" "RDTSCP\0" "RTM\0" + "SEAM\0" "SERIALIZE\0" + "SEV\0" + "SEV_ES\0" + "SEV_SNP\0" "SHA\0" + "SHA512\0" "SKINIT\0" + "SM3\0" + "SM4\0" "SMAP\0" + "SME\0" "SMEP\0" "SMX\0" - "SNP\0" "SSE\0" "SSE2\0" "SSE3\0" @@ -293,6 +337,7 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept "SSSE3\0" "SVM\0" "TBM\0" + "TSE\0" "TSX\0" "TSXLDTRK\0" "UINTR\0" @@ -301,6 +346,7 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept "VPCLMULQDQ\0" "WAITPKG\0" "WBNOINVD\0" + "WRMSRNS\0" "XOP\0" "XSAVE\0" "XSAVEC\0" @@ -309,14 +355,16 @@ Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept "\0"; static const uint16_t sFeatureIndex[] = { - 0, 5, 8, 11, 17, 24, 28, 34, 44, 53, 62, 71, 75, 80, 94, 108, 120, 134, 144, - 155, 165, 176, 185, 197, 209, 220, 232, 245, 255, 267, 287, 304, 313, 317, - 322, 330, 337, 346, 354, 365, 370, 377, 382, 393, 403, 409, 416, 421, 426, - 430, 435, 439, 448, 453, 461, 467, 472, 476, 483, 488, 497, 501, 507, 515, - 519, 524, 532, 541, 547, 557, 565, 569, 573, 578, 586, 592, 602, 610, 617, - 627, 639, 647, 653, 659, 666, 673, 679, 686, 690, 700, 704, 711, 716, 721, - 725, 729, 733, 738, 743, 750, 757, 763, 769, 773, 777, 781, 790, 796, 801, - 805, 816, 824, 833, 837, 843, 850, 859, 866 + 0, 5, 8, 11, 17, 24, 28, 34, 44, 53, 65, 74, 83, 92, 98, 102, 107, 121, 135, + 147, 161, 171, 181, 191, 201, 210, 222, 234, 244, 256, 269, 279, 291, 311, + 328, 337, 352, 361, 376, 390, 394, 399, 407, 414, 422, 431, 439, 450, 455, + 462, 467, 477, 488, 498, 504, 511, 516, 521, 525, 530, 534, 543, 548, 553, + 558, 563, 571, 576, 582, 587, 591, 598, 603, 611, 620, 624, 628, 634, 642, + 646, 651, 659, 668, 674, 684, 692, 696, 700, 708, 713, 721, 727, 737, 745, + 752, 762, 772, 784, 792, 800, 809, 815, 821, 828, 835, 841, 848, 852, 857, + 867, 871, 878, 886, 890, 897, 904, 908, 912, 917, 921, 926, 930, 934, 939, + 944, 951, 958, 964, 970, 974, 978, 982, 986, 995, 1001, 1006, 1010, 1021, + 1029, 1038, 1046, 1050, 1056, 1063, 1072, 1079 }; // @EnumStringEnd@ @@ -344,7 +392,10 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(String& sb, FormatFlag else ASMJIT_PROPAGATE(sb.appendFormat("%%%u", unsigned(Operand::virtIdToIndex(id)))); - if (vReg->type() != type && uint32_t(type) <= uint32_t(RegType::kMaxValue) && Support::test(formatFlags, FormatFlags::kRegCasts)) { + bool formatType = (Support::test(formatFlags, FormatFlags::kRegType)) || + (Support::test(formatFlags, FormatFlags::kRegCasts) && vReg->type() != type); + + if (formatType && uint32_t(type) <= uint32_t(RegType::kMaxValue)) { const RegFormatInfo::TypeEntry& typeEntry = info.typeEntries[size_t(type)]; if (typeEntry.index) ASMJIT_PROPAGATE(sb.appendFormat("@%s", info.typeStrings + typeEntry.index)); @@ -481,8 +532,8 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand( // ===================================================== static constexpr char kImmCharStart = '{'; -static constexpr char kImmCharEnd = '}'; -static constexpr char kImmCharOr = '|'; +static constexpr char kImmCharEnd = '}'; +static constexpr char kImmCharOr = '|'; struct ImmBits { enum Mode : uint32_t { @@ -496,29 +547,29 @@ struct ImmBits { char text[48 - 3]; }; -ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmShuf(String& sb, uint32_t u8, uint32_t bits, uint32_t count) noexcept { +ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmShuf(String& sb, uint32_t imm8, uint32_t bits, uint32_t count) noexcept { uint32_t mask = (1 << bits) - 1; + uint32_t lastPredicateShift = bits * (count - 1u); - for (uint32_t i = 0; i < count; i++, u8 >>= bits) { - uint32_t value = u8 & mask; + for (uint32_t i = 0; i < count; i++, imm8 <<= bits) { + uint32_t index = (imm8 >> lastPredicateShift) & mask; ASMJIT_PROPAGATE(sb.append(i == 0 ? kImmCharStart : kImmCharOr)); - ASMJIT_PROPAGATE(sb.appendUInt(value)); + ASMJIT_PROPAGATE(sb.appendUInt(index)); } - if (kImmCharEnd) - ASMJIT_PROPAGATE(sb.append(kImmCharEnd)); + ASMJIT_PROPAGATE(sb.append(kImmCharEnd)); return kErrorOk; } -ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmBits(String& sb, uint32_t u8, const ImmBits* bits, uint32_t count) noexcept { +ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmBits(String& sb, uint32_t imm8, const ImmBits* bits, uint32_t count) noexcept { uint32_t n = 0; char buf[64]; for (uint32_t i = 0; i < count; i++) { const ImmBits& spec = bits[i]; - uint32_t value = (u8 & uint32_t(spec.mask)) >> spec.shift; + uint32_t value = (imm8 & uint32_t(spec.mask)) >> spec.shift; const char* str = nullptr; switch (spec.mode) { @@ -542,26 +593,23 @@ ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmBits(String& sb, uint3 ASMJIT_PROPAGATE(sb.append(str)); } - if (n && kImmCharEnd) + if (n) ASMJIT_PROPAGATE(sb.append(kImmCharEnd)); return kErrorOk; } -ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmText(String& sb, uint32_t u8, uint32_t bits, uint32_t advance, const char* text, uint32_t count = 1) noexcept { +ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmText(String& sb, uint32_t imm8, uint32_t bits, uint32_t advance, const char* text, uint32_t count = 1) noexcept { uint32_t mask = (1u << bits) - 1; uint32_t pos = 0; - for (uint32_t i = 0; i < count; i++, u8 >>= bits, pos += advance) { - uint32_t value = (u8 & mask) + pos; + for (uint32_t i = 0; i < count; i++, imm8 >>= bits, pos += advance) { + uint32_t value = (imm8 & mask) + pos; ASMJIT_PROPAGATE(sb.append(i == 0 ? kImmCharStart : kImmCharOr)); ASMJIT_PROPAGATE(sb.append(Support::findPackedString(text, value))); } - if (kImmCharEnd) - ASMJIT_PROPAGATE(sb.append(kImmCharEnd)); - - return kErrorOk; + return sb.append(kImmCharEnd); } ASMJIT_FAVOR_SIZE static Error FormatterInternal_explainConst( @@ -583,8 +631,8 @@ ASMJIT_FAVOR_SIZE static Error FormatterInternal_explainConst( static const char vpcmpx[] = "EQ\0" "LT\0" "LE\0" "FALSE\0" "NEQ\0" "GE\0" "GT\0" "TRUE\0"; static const char vpcomx[] = "LT\0" "LE\0" "GT\0" "GE\0" "EQ\0" "NEQ\0" "FALSE\0" "TRUE\0"; - static const char vshufpd[] = "A0\0A1\0B0\0B1\0A2\0A3\0B2\0B3\0A4\0A5\0B4\0B5\0A6\0A7\0B6\0B7\0"; - static const char vshufps[] = "A0\0A1\0A2\0A3\0A0\0A1\0A2\0A3\0B0\0B1\0B2\0B3\0B0\0B1\0B2\0B3\0"; + static const char vshufpd[] = "A0\0" "A1\0" "B0\0" "B1\0" "A2\0" "A3\0" "B2\0" "B3\0" "A4\0" "A5\0" "B4\0" "B5\0" "A6\0" "A7\0" "B6\0" "B7\0"; + static const char vshufps[] = "A0\0" "A1\0" "A2\0" "A3\0" "A0\0" "A1\0" "A2\0" "A3\0" "B0\0" "B1\0" "B2\0" "B3\0" "B0\0" "B1\0" "B2\0" "B3\0"; static const ImmBits vfpclassxx[] = { { 0x07u, 0, ImmBits::kModeLookup, "QNAN\0" "+0\0" "-0\0" "+INF\0" "-INF\0" "DENORMAL\0" "-FINITE\0" "SNAN\0" } @@ -608,25 +656,25 @@ ASMJIT_FAVOR_SIZE static Error FormatterInternal_explainConst( }; static const ImmBits vmpsadbw[] = { - { 0x04u, 2, ImmBits::kModeLookup, "BLK1[0]\0" "BLK1[1]\0" }, - { 0x03u, 0, ImmBits::kModeLookup, "BLK2[0]\0" "BLK2[1]\0" "BLK2[2]\0" "BLK2[3]\0" }, { 0x40u, 6, ImmBits::kModeLookup, "BLK1[4]\0" "BLK1[5]\0" }, - { 0x30u, 4, ImmBits::kModeLookup, "BLK2[4]\0" "BLK2[5]\0" "BLK2[6]\0" "BLK2[7]\0" } + { 0x30u, 4, ImmBits::kModeLookup, "BLK2[4]\0" "BLK2[5]\0" "BLK2[6]\0" "BLK2[7]\0" }, + { 0x04u, 2, ImmBits::kModeLookup, "BLK1[0]\0" "BLK1[1]\0" }, + { 0x03u, 0, ImmBits::kModeLookup, "BLK2[0]\0" "BLK2[1]\0" "BLK2[2]\0" "BLK2[3]\0" } }; static const ImmBits vpclmulqdq[] = { - { 0x01u, 0, ImmBits::kModeLookup, "LQ\0" "HQ\0" }, - { 0x10u, 4, ImmBits::kModeLookup, "LQ\0" "HQ\0" } + { 0x10u, 4, ImmBits::kModeLookup, "LQ\0" "HQ\0" }, + { 0x01u, 0, ImmBits::kModeLookup, "LQ\0" "HQ\0" } }; static const ImmBits vperm2x128[] = { - { 0x0Bu, 0, ImmBits::kModeLookup, "A0\0" "A1\0" "B0\0" "B1\0" "\0" "\0" "\0" "\0" "0\0" "0\0" "0\0" "0\0" }, - { 0xB0u, 4, ImmBits::kModeLookup, "A0\0" "A1\0" "B0\0" "B1\0" "\0" "\0" "\0" "\0" "0\0" "0\0" "0\0" "0\0" } + { 0xB0u, 4, ImmBits::kModeLookup, "A0\0" "A1\0" "B0\0" "B1\0" "\0" "\0" "\0" "\0" "0\0" "0\0" "0\0" "0\0" }, + { 0x0Bu, 0, ImmBits::kModeLookup, "A0\0" "A1\0" "B0\0" "B1\0" "\0" "\0" "\0" "\0" "0\0" "0\0" "0\0" "0\0" } }; static const ImmBits vrangexx[] = { - { 0x03u, 0, ImmBits::kModeLookup, "MIN\0" "MAX\0" "MIN_ABS\0" "MAX_ABS\0" }, - { 0x0Cu, 2, ImmBits::kModeLookup, "SIGN_A\0" "SIGN_B\0" "SIGN_0\0" "SIGN_1\0" } + { 0x0Cu, 2, ImmBits::kModeLookup, "SIGN_A\0" "SIGN_B\0" "SIGN_0\0" "SIGN_1\0" }, + { 0x03u, 0, ImmBits::kModeLookup, "MIN\0" "MAX\0" "MIN_ABS\0" "MAX_ABS\0" } }; static const ImmBits vreducexx_vrndscalexx[] = { @@ -881,7 +929,7 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction( } } - ASMJIT_PROPAGATE(InstInternal::instIdToString(arch, instId, sb)); + ASMJIT_PROPAGATE(InstInternal::instIdToString(instId, sb)); } else { ASMJIT_PROPAGATE(sb.appendFormat("[InstId=#%u]", unsigned(instId))); @@ -898,7 +946,7 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction( uint32_t vecSize = 16; for (uint32_t j = 0; j < opCount; j++) if (operands[j].isReg()) - vecSize = Support::max(vecSize, operands[j].size()); + vecSize = Support::max(vecSize, operands[j].as().size()); ASMJIT_PROPAGATE(FormatterInternal_explainConst(sb, formatFlags, instId, vecSize, op.as())); } @@ -941,4 +989,4 @@ ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction( ASMJIT_END_SUB_NAMESPACE -#endif // !ASMJIT_NO_LOGGING +#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_LOGGING diff --git a/3rdparty/asmjit/src/asmjit/x86/x86func.cpp b/3rdparty/asmjit/src/asmjit/x86/x86func.cpp index bba9eef148cd5..db5b30f86eb07 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86func.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86func.cpp @@ -327,7 +327,8 @@ ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& si } switch (cc.strategy()) { - case CallConvStrategy::kDefault: { + case CallConvStrategy::kDefault: + default: { uint32_t gpzPos = 0; uint32_t vecPos = 0; diff --git a/3rdparty/asmjit/src/asmjit/x86/x86globals.h b/3rdparty/asmjit/src/asmjit/x86/x86globals.h index 803c813ac5341..21ed41e87d13a 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86globals.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86globals.h @@ -53,20 +53,23 @@ enum class CondCode : uint8_t { kNLE = 0x0Fu, //!< ZF==0 & SF==OF (signed > ) kZero = kZ, //!< Zero flag. - kNotZero = kNZ, //!< Non-zero flag. + kNotZero = kNZ, //!< Not zero. + + kEqual = kE, //!< `a == b` (equal). + kNotEqual = kNE, //!< `a != b` (not equal). + + kCarry = kC, //!< Carry flag. + kNotCarry = kNC, //!< Not carry. kSign = kS, //!< Sign flag. - kNotSign = kNS, //!< No sign flag. + kNotSign = kNS, //!< Not sign. kNegative = kS, //!< Sign flag. - kPositive = kNS, //!< No sign flag. + kPositive = kNS, //!< Not sign. kOverflow = kO, //!< Overflow (signed). kNotOverflow = kNO, //!< Not overflow (signed). - kEqual = kE, //!< `a == b` (equal). - kNotEqual = kNE, //!< `a != b` (not equal). - kSignedLT = kL, //!< `a < b` (signed). kSignedLE = kLE, //!< `a <= b` (signed). kSignedGT = kG, //!< `a > b` (signed). @@ -77,6 +80,9 @@ enum class CondCode : uint8_t { kUnsignedGT = kA, //!< `a > b` (unsigned). kUnsignedGE = kAE, //!< `a >= b` (unsigned). + kBTZero = kNC, //!< Tested bit is zero. + kBTNotZero = kC, //!< Tested bit is non-zero. + kParityEven = kP, //!< Even parity flag. kParityOdd = kPO, //!< Odd parity flag. @@ -105,9 +111,9 @@ static constexpr CondCode _reverseCondTable[] = { //! \endcond //! Reverses a condition code (reverses the corresponding operands of a comparison). -static inline constexpr CondCode reverseCond(CondCode cond) noexcept { return _reverseCondTable[uint8_t(cond)]; } +static ASMJIT_INLINE_NODEBUG constexpr CondCode reverseCond(CondCode cond) noexcept { return _reverseCondTable[uint8_t(cond)]; } //! Negates a condition code. -static inline constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ 1u); } +static ASMJIT_INLINE_NODEBUG constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ 1u); } //! Instruction. //! @@ -119,7 +125,9 @@ namespace Inst { kIdNone = 0, //!< Invalid instruction id. kIdAaa, //!< Instruction 'aaa' (X86). kIdAad, //!< Instruction 'aad' (X86). + kIdAadd, //!< Instruction 'aadd' {RAO_INT}. kIdAam, //!< Instruction 'aam' (X86). + kIdAand, //!< Instruction 'aand' {RAO_INT}. kIdAas, //!< Instruction 'aas' (X86). kIdAdc, //!< Instruction 'adc'. kIdAdcx, //!< Instruction 'adcx' {ADX}. @@ -143,7 +151,9 @@ namespace Inst { kIdAndnps, //!< Instruction 'andnps' {SSE}. kIdAndpd, //!< Instruction 'andpd' {SSE2}. kIdAndps, //!< Instruction 'andps' {SSE}. + kIdAor, //!< Instruction 'aor' {RAO_INT}. kIdArpl, //!< Instruction 'arpl' (X86). + kIdAxor, //!< Instruction 'axor' {RAO_INT}. kIdBextr, //!< Instruction 'bextr' {BMI}. kIdBlcfill, //!< Instruction 'blcfill' {TBM}. kIdBlci, //!< Instruction 'blci' {TBM}. @@ -224,14 +234,30 @@ namespace Inst { kIdCmovs, //!< Instruction 'cmovs' {CMOV}. kIdCmovz, //!< Instruction 'cmovz' {CMOV}. kIdCmp, //!< Instruction 'cmp'. + kIdCmpbexadd, //!< Instruction 'cmpbexadd' {CMPCCXADD}. + kIdCmpbxadd, //!< Instruction 'cmpbxadd' {CMPCCXADD}. + kIdCmplexadd, //!< Instruction 'cmplexadd' {CMPCCXADD}. + kIdCmplxadd, //!< Instruction 'cmplxadd' {CMPCCXADD}. + kIdCmpnbexadd, //!< Instruction 'cmpnbexadd' {CMPCCXADD}. + kIdCmpnbxadd, //!< Instruction 'cmpnbxadd' {CMPCCXADD}. + kIdCmpnlexadd, //!< Instruction 'cmpnlexadd' {CMPCCXADD}. + kIdCmpnlxadd, //!< Instruction 'cmpnlxadd' {CMPCCXADD}. + kIdCmpnoxadd, //!< Instruction 'cmpnoxadd' {CMPCCXADD}. + kIdCmpnpxadd, //!< Instruction 'cmpnpxadd' {CMPCCXADD}. + kIdCmpnsxadd, //!< Instruction 'cmpnsxadd' {CMPCCXADD}. + kIdCmpnzxadd, //!< Instruction 'cmpnzxadd' {CMPCCXADD}. + kIdCmpoxadd, //!< Instruction 'cmpoxadd' {CMPCCXADD}. kIdCmppd, //!< Instruction 'cmppd' {SSE2}. kIdCmpps, //!< Instruction 'cmpps' {SSE}. + kIdCmppxadd, //!< Instruction 'cmppxadd' {CMPCCXADD}. kIdCmps, //!< Instruction 'cmps'. kIdCmpsd, //!< Instruction 'cmpsd' {SSE2}. kIdCmpss, //!< Instruction 'cmpss' {SSE}. + kIdCmpsxadd, //!< Instruction 'cmpsxadd' {CMPCCXADD}. kIdCmpxchg, //!< Instruction 'cmpxchg' {I486}. kIdCmpxchg16b, //!< Instruction 'cmpxchg16b' {CMPXCHG16B} (X64). kIdCmpxchg8b, //!< Instruction 'cmpxchg8b' {CMPXCHG8B}. + kIdCmpzxadd, //!< Instruction 'cmpzxadd' {CMPCCXADD}. kIdComisd, //!< Instruction 'comisd' {SSE2}. kIdComiss, //!< Instruction 'comiss' {SSE}. kIdCpuid, //!< Instruction 'cpuid' {I486}. @@ -279,104 +305,104 @@ namespace Inst { kIdEnter, //!< Instruction 'enter'. kIdExtractps, //!< Instruction 'extractps' {SSE4_1}. kIdExtrq, //!< Instruction 'extrq' {SSE4A}. - kIdF2xm1, //!< Instruction 'f2xm1'. - kIdFabs, //!< Instruction 'fabs'. - kIdFadd, //!< Instruction 'fadd'. - kIdFaddp, //!< Instruction 'faddp'. - kIdFbld, //!< Instruction 'fbld'. - kIdFbstp, //!< Instruction 'fbstp'. - kIdFchs, //!< Instruction 'fchs'. - kIdFclex, //!< Instruction 'fclex'. - kIdFcmovb, //!< Instruction 'fcmovb' {CMOV}. - kIdFcmovbe, //!< Instruction 'fcmovbe' {CMOV}. - kIdFcmove, //!< Instruction 'fcmove' {CMOV}. - kIdFcmovnb, //!< Instruction 'fcmovnb' {CMOV}. - kIdFcmovnbe, //!< Instruction 'fcmovnbe' {CMOV}. - kIdFcmovne, //!< Instruction 'fcmovne' {CMOV}. - kIdFcmovnu, //!< Instruction 'fcmovnu' {CMOV}. - kIdFcmovu, //!< Instruction 'fcmovu' {CMOV}. - kIdFcom, //!< Instruction 'fcom'. - kIdFcomi, //!< Instruction 'fcomi'. - kIdFcomip, //!< Instruction 'fcomip'. - kIdFcomp, //!< Instruction 'fcomp'. - kIdFcompp, //!< Instruction 'fcompp'. - kIdFcos, //!< Instruction 'fcos'. - kIdFdecstp, //!< Instruction 'fdecstp'. - kIdFdiv, //!< Instruction 'fdiv'. - kIdFdivp, //!< Instruction 'fdivp'. - kIdFdivr, //!< Instruction 'fdivr'. - kIdFdivrp, //!< Instruction 'fdivrp'. + kIdF2xm1, //!< Instruction 'f2xm1' {FPU}. + kIdFabs, //!< Instruction 'fabs' {FPU}. + kIdFadd, //!< Instruction 'fadd' {FPU}. + kIdFaddp, //!< Instruction 'faddp' {FPU}. + kIdFbld, //!< Instruction 'fbld' {FPU}. + kIdFbstp, //!< Instruction 'fbstp' {FPU}. + kIdFchs, //!< Instruction 'fchs' {FPU}. + kIdFclex, //!< Instruction 'fclex' {FPU}. + kIdFcmovb, //!< Instruction 'fcmovb' {CMOV|FPU}. + kIdFcmovbe, //!< Instruction 'fcmovbe' {CMOV|FPU}. + kIdFcmove, //!< Instruction 'fcmove' {CMOV|FPU}. + kIdFcmovnb, //!< Instruction 'fcmovnb' {CMOV|FPU}. + kIdFcmovnbe, //!< Instruction 'fcmovnbe' {CMOV|FPU}. + kIdFcmovne, //!< Instruction 'fcmovne' {CMOV|FPU}. + kIdFcmovnu, //!< Instruction 'fcmovnu' {CMOV|FPU}. + kIdFcmovu, //!< Instruction 'fcmovu' {CMOV|FPU}. + kIdFcom, //!< Instruction 'fcom' {FPU}. + kIdFcomi, //!< Instruction 'fcomi' {FPU}. + kIdFcomip, //!< Instruction 'fcomip' {FPU}. + kIdFcomp, //!< Instruction 'fcomp' {FPU}. + kIdFcompp, //!< Instruction 'fcompp' {FPU}. + kIdFcos, //!< Instruction 'fcos' {FPU}. + kIdFdecstp, //!< Instruction 'fdecstp' {FPU}. + kIdFdiv, //!< Instruction 'fdiv' {FPU}. + kIdFdivp, //!< Instruction 'fdivp' {FPU}. + kIdFdivr, //!< Instruction 'fdivr' {FPU}. + kIdFdivrp, //!< Instruction 'fdivrp' {FPU}. kIdFemms, //!< Instruction 'femms' {3DNOW}. - kIdFfree, //!< Instruction 'ffree'. - kIdFiadd, //!< Instruction 'fiadd'. - kIdFicom, //!< Instruction 'ficom'. - kIdFicomp, //!< Instruction 'ficomp'. - kIdFidiv, //!< Instruction 'fidiv'. - kIdFidivr, //!< Instruction 'fidivr'. - kIdFild, //!< Instruction 'fild'. - kIdFimul, //!< Instruction 'fimul'. - kIdFincstp, //!< Instruction 'fincstp'. - kIdFinit, //!< Instruction 'finit'. - kIdFist, //!< Instruction 'fist'. - kIdFistp, //!< Instruction 'fistp'. - kIdFisttp, //!< Instruction 'fisttp' {SSE3}. - kIdFisub, //!< Instruction 'fisub'. - kIdFisubr, //!< Instruction 'fisubr'. - kIdFld, //!< Instruction 'fld'. - kIdFld1, //!< Instruction 'fld1'. - kIdFldcw, //!< Instruction 'fldcw'. - kIdFldenv, //!< Instruction 'fldenv'. - kIdFldl2e, //!< Instruction 'fldl2e'. - kIdFldl2t, //!< Instruction 'fldl2t'. - kIdFldlg2, //!< Instruction 'fldlg2'. - kIdFldln2, //!< Instruction 'fldln2'. - kIdFldpi, //!< Instruction 'fldpi'. - kIdFldz, //!< Instruction 'fldz'. - kIdFmul, //!< Instruction 'fmul'. - kIdFmulp, //!< Instruction 'fmulp'. - kIdFnclex, //!< Instruction 'fnclex'. - kIdFninit, //!< Instruction 'fninit'. - kIdFnop, //!< Instruction 'fnop'. - kIdFnsave, //!< Instruction 'fnsave'. - kIdFnstcw, //!< Instruction 'fnstcw'. - kIdFnstenv, //!< Instruction 'fnstenv'. - kIdFnstsw, //!< Instruction 'fnstsw'. - kIdFpatan, //!< Instruction 'fpatan'. - kIdFprem, //!< Instruction 'fprem'. - kIdFprem1, //!< Instruction 'fprem1'. - kIdFptan, //!< Instruction 'fptan'. - kIdFrndint, //!< Instruction 'frndint'. - kIdFrstor, //!< Instruction 'frstor'. - kIdFsave, //!< Instruction 'fsave'. - kIdFscale, //!< Instruction 'fscale'. - kIdFsin, //!< Instruction 'fsin'. - kIdFsincos, //!< Instruction 'fsincos'. - kIdFsqrt, //!< Instruction 'fsqrt'. - kIdFst, //!< Instruction 'fst'. - kIdFstcw, //!< Instruction 'fstcw'. - kIdFstenv, //!< Instruction 'fstenv'. - kIdFstp, //!< Instruction 'fstp'. - kIdFstsw, //!< Instruction 'fstsw'. - kIdFsub, //!< Instruction 'fsub'. - kIdFsubp, //!< Instruction 'fsubp'. - kIdFsubr, //!< Instruction 'fsubr'. - kIdFsubrp, //!< Instruction 'fsubrp'. - kIdFtst, //!< Instruction 'ftst'. - kIdFucom, //!< Instruction 'fucom'. - kIdFucomi, //!< Instruction 'fucomi'. - kIdFucomip, //!< Instruction 'fucomip'. - kIdFucomp, //!< Instruction 'fucomp'. - kIdFucompp, //!< Instruction 'fucompp'. - kIdFwait, //!< Instruction 'fwait'. - kIdFxam, //!< Instruction 'fxam'. - kIdFxch, //!< Instruction 'fxch'. + kIdFfree, //!< Instruction 'ffree' {FPU}. + kIdFiadd, //!< Instruction 'fiadd' {FPU}. + kIdFicom, //!< Instruction 'ficom' {FPU}. + kIdFicomp, //!< Instruction 'ficomp' {FPU}. + kIdFidiv, //!< Instruction 'fidiv' {FPU}. + kIdFidivr, //!< Instruction 'fidivr' {FPU}. + kIdFild, //!< Instruction 'fild' {FPU}. + kIdFimul, //!< Instruction 'fimul' {FPU}. + kIdFincstp, //!< Instruction 'fincstp' {FPU}. + kIdFinit, //!< Instruction 'finit' {FPU}. + kIdFist, //!< Instruction 'fist' {FPU}. + kIdFistp, //!< Instruction 'fistp' {FPU}. + kIdFisttp, //!< Instruction 'fisttp' {SSE3|FPU}. + kIdFisub, //!< Instruction 'fisub' {FPU}. + kIdFisubr, //!< Instruction 'fisubr' {FPU}. + kIdFld, //!< Instruction 'fld' {FPU}. + kIdFld1, //!< Instruction 'fld1' {FPU}. + kIdFldcw, //!< Instruction 'fldcw' {FPU}. + kIdFldenv, //!< Instruction 'fldenv' {FPU}. + kIdFldl2e, //!< Instruction 'fldl2e' {FPU}. + kIdFldl2t, //!< Instruction 'fldl2t' {FPU}. + kIdFldlg2, //!< Instruction 'fldlg2' {FPU}. + kIdFldln2, //!< Instruction 'fldln2' {FPU}. + kIdFldpi, //!< Instruction 'fldpi' {FPU}. + kIdFldz, //!< Instruction 'fldz' {FPU}. + kIdFmul, //!< Instruction 'fmul' {FPU}. + kIdFmulp, //!< Instruction 'fmulp' {FPU}. + kIdFnclex, //!< Instruction 'fnclex' {FPU}. + kIdFninit, //!< Instruction 'fninit' {FPU}. + kIdFnop, //!< Instruction 'fnop' {FPU}. + kIdFnsave, //!< Instruction 'fnsave' {FPU}. + kIdFnstcw, //!< Instruction 'fnstcw' {FPU}. + kIdFnstenv, //!< Instruction 'fnstenv' {FPU}. + kIdFnstsw, //!< Instruction 'fnstsw' {FPU}. + kIdFpatan, //!< Instruction 'fpatan' {FPU}. + kIdFprem, //!< Instruction 'fprem' {FPU}. + kIdFprem1, //!< Instruction 'fprem1' {FPU}. + kIdFptan, //!< Instruction 'fptan' {FPU}. + kIdFrndint, //!< Instruction 'frndint' {FPU}. + kIdFrstor, //!< Instruction 'frstor' {FPU}. + kIdFsave, //!< Instruction 'fsave' {FPU}. + kIdFscale, //!< Instruction 'fscale' {FPU}. + kIdFsin, //!< Instruction 'fsin' {FPU}. + kIdFsincos, //!< Instruction 'fsincos' {FPU}. + kIdFsqrt, //!< Instruction 'fsqrt' {FPU}. + kIdFst, //!< Instruction 'fst' {FPU}. + kIdFstcw, //!< Instruction 'fstcw' {FPU}. + kIdFstenv, //!< Instruction 'fstenv' {FPU}. + kIdFstp, //!< Instruction 'fstp' {FPU}. + kIdFstsw, //!< Instruction 'fstsw' {FPU}. + kIdFsub, //!< Instruction 'fsub' {FPU}. + kIdFsubp, //!< Instruction 'fsubp' {FPU}. + kIdFsubr, //!< Instruction 'fsubr' {FPU}. + kIdFsubrp, //!< Instruction 'fsubrp' {FPU}. + kIdFtst, //!< Instruction 'ftst' {FPU}. + kIdFucom, //!< Instruction 'fucom' {FPU}. + kIdFucomi, //!< Instruction 'fucomi' {FPU}. + kIdFucomip, //!< Instruction 'fucomip' {FPU}. + kIdFucomp, //!< Instruction 'fucomp' {FPU}. + kIdFucompp, //!< Instruction 'fucompp' {FPU}. + kIdFwait, //!< Instruction 'fwait' {FPU}. + kIdFxam, //!< Instruction 'fxam' {FPU}. + kIdFxch, //!< Instruction 'fxch' {FPU}. kIdFxrstor, //!< Instruction 'fxrstor' {FXSR}. kIdFxrstor64, //!< Instruction 'fxrstor64' {FXSR} (X64). kIdFxsave, //!< Instruction 'fxsave' {FXSR}. kIdFxsave64, //!< Instruction 'fxsave64' {FXSR} (X64). - kIdFxtract, //!< Instruction 'fxtract'. - kIdFyl2x, //!< Instruction 'fyl2x'. - kIdFyl2xp1, //!< Instruction 'fyl2xp1'. + kIdFxtract, //!< Instruction 'fxtract' {FPU}. + kIdFyl2x, //!< Instruction 'fyl2x' {FPU}. + kIdFyl2xp1, //!< Instruction 'fyl2xp1' {FPU}. kIdGetsec, //!< Instruction 'getsec' {SMX}. kIdGf2p8affineinvqb, //!< Instruction 'gf2p8affineinvqb' {GFNI}. kIdGf2p8affineqb, //!< Instruction 'gf2p8affineqb' {GFNI}. @@ -403,6 +429,7 @@ namespace Inst { kIdInvept, //!< Instruction 'invept' {VMX}. kIdInvlpg, //!< Instruction 'invlpg' {I486}. kIdInvlpga, //!< Instruction 'invlpga' {SVM}. + kIdInvlpgb, //!< Instruction 'invlpgb' {INVLPGB}. kIdInvpcid, //!< Instruction 'invpcid' {I486}. kIdInvvpid, //!< Instruction 'invvpid' {VMX}. kIdIret, //!< Instruction 'iret'. @@ -535,7 +562,7 @@ namespace Inst { kIdMonitor, //!< Instruction 'monitor' {MONITOR}. kIdMonitorx, //!< Instruction 'monitorx' {MONITORX}. kIdMov, //!< Instruction 'mov'. - kIdMovabs, //!< Instruction 'movabs' (X64). + kIdMovabs, //!< Instruction 'movabs'. kIdMovapd, //!< Instruction 'movapd' {SSE2}. kIdMovaps, //!< Instruction 'movaps' {SSE}. kIdMovbe, //!< Instruction 'movbe' {MOVBE}. @@ -606,7 +633,7 @@ namespace Inst { kIdPaddusb, //!< Instruction 'paddusb' {MMX|SSE2}. kIdPaddusw, //!< Instruction 'paddusw' {MMX|SSE2}. kIdPaddw, //!< Instruction 'paddw' {MMX|SSE2}. - kIdPalignr, //!< Instruction 'palignr' {SSE3}. + kIdPalignr, //!< Instruction 'palignr' {SSSE3}. kIdPand, //!< Instruction 'pand' {MMX|SSE2}. kIdPandn, //!< Instruction 'pandn' {MMX|SSE2}. kIdPause, //!< Instruction 'pause'. @@ -713,10 +740,12 @@ namespace Inst { kIdPopfq, //!< Instruction 'popfq' (X64). kIdPor, //!< Instruction 'por' {MMX|SSE2}. kIdPrefetch, //!< Instruction 'prefetch' {3DNOW}. - kIdPrefetchnta, //!< Instruction 'prefetchnta' {MMX2}. - kIdPrefetcht0, //!< Instruction 'prefetcht0' {MMX2}. - kIdPrefetcht1, //!< Instruction 'prefetcht1' {MMX2}. - kIdPrefetcht2, //!< Instruction 'prefetcht2' {MMX2}. + kIdPrefetchit0, //!< Instruction 'prefetchit0' {PREFETCHI} (X64). + kIdPrefetchit1, //!< Instruction 'prefetchit1' {PREFETCHI} (X64). + kIdPrefetchnta, //!< Instruction 'prefetchnta' {SSE}. + kIdPrefetcht0, //!< Instruction 'prefetcht0' {SSE}. + kIdPrefetcht1, //!< Instruction 'prefetcht1' {SSE}. + kIdPrefetcht2, //!< Instruction 'prefetcht2' {SSE}. kIdPrefetchw, //!< Instruction 'prefetchw' {PREFETCHW}. kIdPrefetchwt1, //!< Instruction 'prefetchwt1' {PREFETCHWT1}. kIdPsadbw, //!< Instruction 'psadbw' {MMX2|SSE2}. @@ -732,7 +761,7 @@ namespace Inst { kIdPslldq, //!< Instruction 'pslldq' {SSE2}. kIdPsllq, //!< Instruction 'psllq' {MMX|SSE2}. kIdPsllw, //!< Instruction 'psllw' {MMX|SSE2}. - kIdPsmash, //!< Instruction 'psmash' {SNP} (X64). + kIdPsmash, //!< Instruction 'psmash' {SEV_SNP} (X64). kIdPsrad, //!< Instruction 'psrad' {MMX|SSE2}. kIdPsraw, //!< Instruction 'psraw' {MMX|SSE2}. kIdPsrld, //!< Instruction 'psrld' {MMX|SSE2}. @@ -764,7 +793,7 @@ namespace Inst { kIdPushf, //!< Instruction 'pushf'. kIdPushfd, //!< Instruction 'pushfd' (X86). kIdPushfq, //!< Instruction 'pushfq' (X64). - kIdPvalidate, //!< Instruction 'pvalidate' {SNP}. + kIdPvalidate, //!< Instruction 'pvalidate' {SEV_SNP}. kIdPxor, //!< Instruction 'pxor' {MMX|SSE2}. kIdRcl, //!< Instruction 'rcl'. kIdRcpps, //!< Instruction 'rcpps' {SSE}. @@ -785,8 +814,8 @@ namespace Inst { kIdRdtscp, //!< Instruction 'rdtscp' {RDTSCP}. kIdRet, //!< Instruction 'ret'. kIdRetf, //!< Instruction 'retf'. - kIdRmpadjust, //!< Instruction 'rmpadjust' {SNP} (X64). - kIdRmpupdate, //!< Instruction 'rmpupdate' {SNP} (X64). + kIdRmpadjust, //!< Instruction 'rmpadjust' {SEV_SNP} (X64). + kIdRmpupdate, //!< Instruction 'rmpupdate' {SEV_SNP} (X64). kIdRol, //!< Instruction 'rol'. kIdRor, //!< Instruction 'ror'. kIdRorx, //!< Instruction 'rorx' {BMI2}. @@ -805,6 +834,9 @@ namespace Inst { kIdSaveprevssp, //!< Instruction 'saveprevssp' {CET_SS}. kIdSbb, //!< Instruction 'sbb'. kIdScas, //!< Instruction 'scas'. + kIdSeamcall, //!< Instruction 'seamcall' {SEAM}. + kIdSeamops, //!< Instruction 'seamops' {SEAM}. + kIdSeamret, //!< Instruction 'seamret' {SEAM}. kIdSenduipi, //!< Instruction 'senduipi' {UINTR} (X64). kIdSerialize, //!< Instruction 'serialize' {SERIALIZE}. kIdSeta, //!< Instruction 'seta'. @@ -838,7 +870,7 @@ namespace Inst { kIdSets, //!< Instruction 'sets'. kIdSetssbsy, //!< Instruction 'setssbsy' {CET_SS}. kIdSetz, //!< Instruction 'setz'. - kIdSfence, //!< Instruction 'sfence' {MMX2}. + kIdSfence, //!< Instruction 'sfence' {SSE}. kIdSgdt, //!< Instruction 'sgdt'. kIdSha1msg1, //!< Instruction 'sha1msg1' {SHA}. kIdSha1msg2, //!< Instruction 'sha1msg2' {SHA}. @@ -883,15 +915,19 @@ namespace Inst { kIdSyscall, //!< Instruction 'syscall' (X64). kIdSysenter, //!< Instruction 'sysenter'. kIdSysexit, //!< Instruction 'sysexit'. - kIdSysexitq, //!< Instruction 'sysexitq'. + kIdSysexitq, //!< Instruction 'sysexitq' (X64). kIdSysret, //!< Instruction 'sysret' (X64). kIdSysretq, //!< Instruction 'sysretq' (X64). kIdT1mskc, //!< Instruction 't1mskc' {TBM}. + kIdTcmmimfp16ps, //!< Instruction 'tcmmimfp16ps' {AMX_COMPLEX} (X64). + kIdTcmmrlfp16ps, //!< Instruction 'tcmmrlfp16ps' {AMX_COMPLEX} (X64). + kIdTdcall, //!< Instruction 'tdcall' {SEAM}. kIdTdpbf16ps, //!< Instruction 'tdpbf16ps' {AMX_BF16} (X64). kIdTdpbssd, //!< Instruction 'tdpbssd' {AMX_INT8} (X64). kIdTdpbsud, //!< Instruction 'tdpbsud' {AMX_INT8} (X64). kIdTdpbusd, //!< Instruction 'tdpbusd' {AMX_INT8} (X64). kIdTdpbuud, //!< Instruction 'tdpbuud' {AMX_INT8} (X64). + kIdTdpfp16ps, //!< Instruction 'tdpfp16ps' {AMX_FP16} (X64). kIdTest, //!< Instruction 'test'. kIdTestui, //!< Instruction 'testui' {UINTR} (X64). kIdTileloadd, //!< Instruction 'tileloadd' {AMX_TILE} (X64). @@ -899,6 +935,7 @@ namespace Inst { kIdTilerelease, //!< Instruction 'tilerelease' {AMX_TILE} (X64). kIdTilestored, //!< Instruction 'tilestored' {AMX_TILE} (X64). kIdTilezero, //!< Instruction 'tilezero' {AMX_TILE} (X64). + kIdTlbsync, //!< Instruction 'tlbsync' {INVLPGB}. kIdTpause, //!< Instruction 'tpause' {WAITPKG}. kIdTzcnt, //!< Instruction 'tzcnt' {BMI}. kIdTzmsk, //!< Instruction 'tzmsk' {TBM}. @@ -938,6 +975,8 @@ namespace Inst { kIdVandnps, //!< Instruction 'vandnps' {AVX|AVX512_DQ+VL}. kIdVandpd, //!< Instruction 'vandpd' {AVX|AVX512_DQ+VL}. kIdVandps, //!< Instruction 'vandps' {AVX|AVX512_DQ+VL}. + kIdVbcstnebf162ps, //!< Instruction 'vbcstnebf162ps' {AVX_NE_CONVERT}. + kIdVbcstnesh2ps, //!< Instruction 'vbcstnesh2ps' {AVX_NE_CONVERT}. kIdVblendmpd, //!< Instruction 'vblendmpd' {AVX512_F+VL}. kIdVblendmps, //!< Instruction 'vblendmps' {AVX512_F+VL}. kIdVblendpd, //!< Instruction 'vblendpd' {AVX}. @@ -973,7 +1012,11 @@ namespace Inst { kIdVcvtdq2ph, //!< Instruction 'vcvtdq2ph' {AVX512_FP16+VL}. kIdVcvtdq2ps, //!< Instruction 'vcvtdq2ps' {AVX|AVX512_F+VL}. kIdVcvtne2ps2bf16, //!< Instruction 'vcvtne2ps2bf16' {AVX512_BF16+VL}. - kIdVcvtneps2bf16, //!< Instruction 'vcvtneps2bf16' {AVX512_BF16+VL}. + kIdVcvtneebf162ps, //!< Instruction 'vcvtneebf162ps' {AVX_NE_CONVERT}. + kIdVcvtneeph2ps, //!< Instruction 'vcvtneeph2ps' {AVX_NE_CONVERT}. + kIdVcvtneobf162ps, //!< Instruction 'vcvtneobf162ps' {AVX_NE_CONVERT}. + kIdVcvtneoph2ps, //!< Instruction 'vcvtneoph2ps' {AVX_NE_CONVERT}. + kIdVcvtneps2bf16, //!< Instruction 'vcvtneps2bf16' {AVX_NE_CONVERT|AVX512_BF16+VL}. kIdVcvtpd2dq, //!< Instruction 'vcvtpd2dq' {AVX|AVX512_F+VL}. kIdVcvtpd2ph, //!< Instruction 'vcvtpd2ph' {AVX512_FP16+VL}. kIdVcvtpd2ps, //!< Instruction 'vcvtpd2ps' {AVX|AVX512_F+VL}. @@ -1057,8 +1100,8 @@ namespace Inst { kIdVdpps, //!< Instruction 'vdpps' {AVX}. kIdVerr, //!< Instruction 'verr'. kIdVerw, //!< Instruction 'verw'. - kIdVexp2pd, //!< Instruction 'vexp2pd' {AVX512_ERI}. - kIdVexp2ps, //!< Instruction 'vexp2ps' {AVX512_ERI}. + kIdVexp2pd, //!< Instruction 'vexp2pd' {AVX512_ER}. + kIdVexp2ps, //!< Instruction 'vexp2ps' {AVX512_ER}. kIdVexpandpd, //!< Instruction 'vexpandpd' {AVX512_F+VL}. kIdVexpandps, //!< Instruction 'vexpandps' {AVX512_F+VL}. kIdVextractf128, //!< Instruction 'vextractf128' {AVX}. @@ -1073,9 +1116,9 @@ namespace Inst { kIdVextracti64x4, //!< Instruction 'vextracti64x4' {AVX512_F}. kIdVextractps, //!< Instruction 'vextractps' {AVX|AVX512_F}. kIdVfcmaddcph, //!< Instruction 'vfcmaddcph' {AVX512_FP16+VL}. - kIdVfcmaddcsh, //!< Instruction 'vfcmaddcsh' {AVX512_FP16+VL}. + kIdVfcmaddcsh, //!< Instruction 'vfcmaddcsh' {AVX512_FP16}. kIdVfcmulcph, //!< Instruction 'vfcmulcph' {AVX512_FP16+VL}. - kIdVfcmulcsh, //!< Instruction 'vfcmulcsh' {AVX512_FP16+VL}. + kIdVfcmulcsh, //!< Instruction 'vfcmulcsh' {AVX512_FP16}. kIdVfixupimmpd, //!< Instruction 'vfixupimmpd' {AVX512_F+VL}. kIdVfixupimmps, //!< Instruction 'vfixupimmps' {AVX512_F+VL}. kIdVfixupimmsd, //!< Instruction 'vfixupimmsd' {AVX512_F}. @@ -1099,7 +1142,7 @@ namespace Inst { kIdVfmadd231sh, //!< Instruction 'vfmadd231sh' {AVX512_FP16}. kIdVfmadd231ss, //!< Instruction 'vfmadd231ss' {FMA|AVX512_F}. kIdVfmaddcph, //!< Instruction 'vfmaddcph' {AVX512_FP16+VL}. - kIdVfmaddcsh, //!< Instruction 'vfmaddcsh' {AVX512_FP16+VL}. + kIdVfmaddcsh, //!< Instruction 'vfmaddcsh' {AVX512_FP16}. kIdVfmaddpd, //!< Instruction 'vfmaddpd' {FMA4}. kIdVfmaddps, //!< Instruction 'vfmaddps' {FMA4}. kIdVfmaddsd, //!< Instruction 'vfmaddsd' {FMA4}. @@ -1206,14 +1249,14 @@ namespace Inst { kIdVfrczss, //!< Instruction 'vfrczss' {XOP}. kIdVgatherdpd, //!< Instruction 'vgatherdpd' {AVX2|AVX512_F+VL}. kIdVgatherdps, //!< Instruction 'vgatherdps' {AVX2|AVX512_F+VL}. - kIdVgatherpf0dpd, //!< Instruction 'vgatherpf0dpd' {AVX512_PFI}. - kIdVgatherpf0dps, //!< Instruction 'vgatherpf0dps' {AVX512_PFI}. - kIdVgatherpf0qpd, //!< Instruction 'vgatherpf0qpd' {AVX512_PFI}. - kIdVgatherpf0qps, //!< Instruction 'vgatherpf0qps' {AVX512_PFI}. - kIdVgatherpf1dpd, //!< Instruction 'vgatherpf1dpd' {AVX512_PFI}. - kIdVgatherpf1dps, //!< Instruction 'vgatherpf1dps' {AVX512_PFI}. - kIdVgatherpf1qpd, //!< Instruction 'vgatherpf1qpd' {AVX512_PFI}. - kIdVgatherpf1qps, //!< Instruction 'vgatherpf1qps' {AVX512_PFI}. + kIdVgatherpf0dpd, //!< Instruction 'vgatherpf0dpd' {AVX512_PF}. + kIdVgatherpf0dps, //!< Instruction 'vgatherpf0dps' {AVX512_PF}. + kIdVgatherpf0qpd, //!< Instruction 'vgatherpf0qpd' {AVX512_PF}. + kIdVgatherpf0qps, //!< Instruction 'vgatherpf0qps' {AVX512_PF}. + kIdVgatherpf1dpd, //!< Instruction 'vgatherpf1dpd' {AVX512_PF}. + kIdVgatherpf1dps, //!< Instruction 'vgatherpf1dps' {AVX512_PF}. + kIdVgatherpf1qpd, //!< Instruction 'vgatherpf1qpd' {AVX512_PF}. + kIdVgatherpf1qps, //!< Instruction 'vgatherpf1qps' {AVX512_PF}. kIdVgatherqpd, //!< Instruction 'vgatherqpd' {AVX2|AVX512_F+VL}. kIdVgatherqps, //!< Instruction 'vgatherqps' {AVX2|AVX512_F+VL}. kIdVgetexppd, //!< Instruction 'vgetexppd' {AVX512_F+VL}. @@ -1254,18 +1297,19 @@ namespace Inst { kIdVmaxpd, //!< Instruction 'vmaxpd' {AVX|AVX512_F+VL}. kIdVmaxph, //!< Instruction 'vmaxph' {AVX512_FP16+VL}. kIdVmaxps, //!< Instruction 'vmaxps' {AVX|AVX512_F+VL}. - kIdVmaxsd, //!< Instruction 'vmaxsd' {AVX|AVX512_F+VL}. + kIdVmaxsd, //!< Instruction 'vmaxsd' {AVX|AVX512_F}. kIdVmaxsh, //!< Instruction 'vmaxsh' {AVX512_FP16}. - kIdVmaxss, //!< Instruction 'vmaxss' {AVX|AVX512_F+VL}. + kIdVmaxss, //!< Instruction 'vmaxss' {AVX|AVX512_F}. kIdVmcall, //!< Instruction 'vmcall' {VMX}. kIdVmclear, //!< Instruction 'vmclear' {VMX}. kIdVmfunc, //!< Instruction 'vmfunc' {VMX}. + kIdVmgexit, //!< Instruction 'vmgexit' {SEV_ES}. kIdVminpd, //!< Instruction 'vminpd' {AVX|AVX512_F+VL}. kIdVminph, //!< Instruction 'vminph' {AVX512_FP16+VL}. kIdVminps, //!< Instruction 'vminps' {AVX|AVX512_F+VL}. - kIdVminsd, //!< Instruction 'vminsd' {AVX|AVX512_F+VL}. + kIdVminsd, //!< Instruction 'vminsd' {AVX|AVX512_F}. kIdVminsh, //!< Instruction 'vminsh' {AVX512_FP16}. - kIdVminss, //!< Instruction 'vminss' {AVX|AVX512_F+VL}. + kIdVminss, //!< Instruction 'vminss' {AVX|AVX512_F}. kIdVmlaunch, //!< Instruction 'vmlaunch' {VMX}. kIdVmload, //!< Instruction 'vmload' {SVM}. kIdVmmcall, //!< Instruction 'vmmcall' {SVM}. @@ -1316,11 +1360,12 @@ namespace Inst { kIdVmulsh, //!< Instruction 'vmulsh' {AVX512_FP16}. kIdVmulss, //!< Instruction 'vmulss' {AVX|AVX512_F}. kIdVmwrite, //!< Instruction 'vmwrite' {VMX}. + kIdVmxoff, //!< Instruction 'vmxoff' {VMX}. kIdVmxon, //!< Instruction 'vmxon' {VMX}. kIdVorpd, //!< Instruction 'vorpd' {AVX|AVX512_DQ+VL}. kIdVorps, //!< Instruction 'vorps' {AVX|AVX512_DQ+VL}. - kIdVp2intersectd, //!< Instruction 'vp2intersectd' {AVX512_VP2INTERSECT}. - kIdVp2intersectq, //!< Instruction 'vp2intersectq' {AVX512_VP2INTERSECT}. + kIdVp2intersectd, //!< Instruction 'vp2intersectd' {AVX512_VP2INTERSECT+VL}. + kIdVp2intersectq, //!< Instruction 'vp2intersectq' {AVX512_VP2INTERSECT+VL}. kIdVp4dpwssd, //!< Instruction 'vp4dpwssd' {AVX512_4VNNIW}. kIdVp4dpwssds, //!< Instruction 'vp4dpwssds' {AVX512_4VNNIW}. kIdVpabsb, //!< Instruction 'vpabsb' {AVX|AVX2|AVX512_BW+VL}. @@ -1357,8 +1402,8 @@ namespace Inst { kIdVpblendw, //!< Instruction 'vpblendw' {AVX|AVX2}. kIdVpbroadcastb, //!< Instruction 'vpbroadcastb' {AVX2|AVX512_BW+VL}. kIdVpbroadcastd, //!< Instruction 'vpbroadcastd' {AVX2|AVX512_F+VL}. - kIdVpbroadcastmb2q, //!< Instruction 'vpbroadcastmb2q' {AVX512_CDI+VL}. - kIdVpbroadcastmw2d, //!< Instruction 'vpbroadcastmw2d' {AVX512_CDI+VL}. + kIdVpbroadcastmb2q, //!< Instruction 'vpbroadcastmb2q' {AVX512_CD+VL}. + kIdVpbroadcastmw2d, //!< Instruction 'vpbroadcastmw2d' {AVX512_CD+VL}. kIdVpbroadcastq, //!< Instruction 'vpbroadcastq' {AVX2|AVX512_F+VL}. kIdVpbroadcastw, //!< Instruction 'vpbroadcastw' {AVX2|AVX512_BW+VL}. kIdVpclmulqdq, //!< Instruction 'vpclmulqdq' {AVX|AVX512_F+VL & PCLMULQDQ|VPCLMULQDQ}. @@ -1395,12 +1440,24 @@ namespace Inst { kIdVpcomuq, //!< Instruction 'vpcomuq' {XOP}. kIdVpcomuw, //!< Instruction 'vpcomuw' {XOP}. kIdVpcomw, //!< Instruction 'vpcomw' {XOP}. - kIdVpconflictd, //!< Instruction 'vpconflictd' {AVX512_CDI+VL}. - kIdVpconflictq, //!< Instruction 'vpconflictq' {AVX512_CDI+VL}. + kIdVpconflictd, //!< Instruction 'vpconflictd' {AVX512_CD+VL}. + kIdVpconflictq, //!< Instruction 'vpconflictq' {AVX512_CD+VL}. + kIdVpdpbssd, //!< Instruction 'vpdpbssd' {AVX_VNNI_INT8}. + kIdVpdpbssds, //!< Instruction 'vpdpbssds' {AVX_VNNI_INT8}. + kIdVpdpbsud, //!< Instruction 'vpdpbsud' {AVX_VNNI_INT8}. + kIdVpdpbsuds, //!< Instruction 'vpdpbsuds' {AVX_VNNI_INT8}. kIdVpdpbusd, //!< Instruction 'vpdpbusd' {AVX_VNNI|AVX512_VNNI+VL}. kIdVpdpbusds, //!< Instruction 'vpdpbusds' {AVX_VNNI|AVX512_VNNI+VL}. + kIdVpdpbuud, //!< Instruction 'vpdpbuud' {AVX_VNNI_INT8}. + kIdVpdpbuuds, //!< Instruction 'vpdpbuuds' {AVX_VNNI_INT8}. kIdVpdpwssd, //!< Instruction 'vpdpwssd' {AVX_VNNI|AVX512_VNNI+VL}. kIdVpdpwssds, //!< Instruction 'vpdpwssds' {AVX_VNNI|AVX512_VNNI+VL}. + kIdVpdpwsud, //!< Instruction 'vpdpwsud' {AVX_VNNI_INT16}. + kIdVpdpwsuds, //!< Instruction 'vpdpwsuds' {AVX_VNNI_INT16}. + kIdVpdpwusd, //!< Instruction 'vpdpwusd' {AVX_VNNI_INT16}. + kIdVpdpwusds, //!< Instruction 'vpdpwusds' {AVX_VNNI_INT16}. + kIdVpdpwuud, //!< Instruction 'vpdpwuud' {AVX_VNNI_INT16}. + kIdVpdpwuuds, //!< Instruction 'vpdpwuuds' {AVX_VNNI_INT16}. kIdVperm2f128, //!< Instruction 'vperm2f128' {AVX}. kIdVperm2i128, //!< Instruction 'vperm2i128' {AVX2}. kIdVpermb, //!< Instruction 'vpermb' {AVX512_VBMI+VL}. @@ -1463,8 +1520,8 @@ namespace Inst { kIdVpinsrd, //!< Instruction 'vpinsrd' {AVX|AVX512_DQ}. kIdVpinsrq, //!< Instruction 'vpinsrq' {AVX|AVX512_DQ} (X64). kIdVpinsrw, //!< Instruction 'vpinsrw' {AVX|AVX512_BW}. - kIdVplzcntd, //!< Instruction 'vplzcntd' {AVX512_CDI+VL}. - kIdVplzcntq, //!< Instruction 'vplzcntq' {AVX512_CDI+VL}. + kIdVplzcntd, //!< Instruction 'vplzcntd' {AVX512_CD+VL}. + kIdVplzcntq, //!< Instruction 'vplzcntq' {AVX512_CD+VL}. kIdVpmacsdd, //!< Instruction 'vpmacsdd' {XOP}. kIdVpmacsdqh, //!< Instruction 'vpmacsdqh' {XOP}. kIdVpmacsdql, //!< Instruction 'vpmacsdql' {XOP}. @@ -1477,8 +1534,8 @@ namespace Inst { kIdVpmacsww, //!< Instruction 'vpmacsww' {XOP}. kIdVpmadcsswd, //!< Instruction 'vpmadcsswd' {XOP}. kIdVpmadcswd, //!< Instruction 'vpmadcswd' {XOP}. - kIdVpmadd52huq, //!< Instruction 'vpmadd52huq' {AVX512_IFMA+VL}. - kIdVpmadd52luq, //!< Instruction 'vpmadd52luq' {AVX512_IFMA+VL}. + kIdVpmadd52huq, //!< Instruction 'vpmadd52huq' {AVX_IFMA|AVX512_IFMA+VL}. + kIdVpmadd52luq, //!< Instruction 'vpmadd52luq' {AVX_IFMA|AVX512_IFMA+VL}. kIdVpmaddubsw, //!< Instruction 'vpmaddubsw' {AVX|AVX2|AVX512_BW+VL}. kIdVpmaddwd, //!< Instruction 'vpmaddwd' {AVX|AVX2|AVX512_BW+VL}. kIdVpmaskmovd, //!< Instruction 'vpmaskmovd' {AVX2}. @@ -1658,10 +1715,10 @@ namespace Inst { kIdVrcp14ps, //!< Instruction 'vrcp14ps' {AVX512_F+VL}. kIdVrcp14sd, //!< Instruction 'vrcp14sd' {AVX512_F}. kIdVrcp14ss, //!< Instruction 'vrcp14ss' {AVX512_F}. - kIdVrcp28pd, //!< Instruction 'vrcp28pd' {AVX512_ERI}. - kIdVrcp28ps, //!< Instruction 'vrcp28ps' {AVX512_ERI}. - kIdVrcp28sd, //!< Instruction 'vrcp28sd' {AVX512_ERI}. - kIdVrcp28ss, //!< Instruction 'vrcp28ss' {AVX512_ERI}. + kIdVrcp28pd, //!< Instruction 'vrcp28pd' {AVX512_ER}. + kIdVrcp28ps, //!< Instruction 'vrcp28ps' {AVX512_ER}. + kIdVrcp28sd, //!< Instruction 'vrcp28sd' {AVX512_ER}. + kIdVrcp28ss, //!< Instruction 'vrcp28ss' {AVX512_ER}. kIdVrcpph, //!< Instruction 'vrcpph' {AVX512_FP16}. kIdVrcpps, //!< Instruction 'vrcpps' {AVX}. kIdVrcpsh, //!< Instruction 'vrcpsh' {AVX512_FP16}. @@ -1686,10 +1743,10 @@ namespace Inst { kIdVrsqrt14ps, //!< Instruction 'vrsqrt14ps' {AVX512_F+VL}. kIdVrsqrt14sd, //!< Instruction 'vrsqrt14sd' {AVX512_F}. kIdVrsqrt14ss, //!< Instruction 'vrsqrt14ss' {AVX512_F}. - kIdVrsqrt28pd, //!< Instruction 'vrsqrt28pd' {AVX512_ERI}. - kIdVrsqrt28ps, //!< Instruction 'vrsqrt28ps' {AVX512_ERI}. - kIdVrsqrt28sd, //!< Instruction 'vrsqrt28sd' {AVX512_ERI}. - kIdVrsqrt28ss, //!< Instruction 'vrsqrt28ss' {AVX512_ERI}. + kIdVrsqrt28pd, //!< Instruction 'vrsqrt28pd' {AVX512_ER}. + kIdVrsqrt28ps, //!< Instruction 'vrsqrt28ps' {AVX512_ER}. + kIdVrsqrt28sd, //!< Instruction 'vrsqrt28sd' {AVX512_ER}. + kIdVrsqrt28ss, //!< Instruction 'vrsqrt28ss' {AVX512_ER}. kIdVrsqrtph, //!< Instruction 'vrsqrtph' {AVX512_FP16+VL}. kIdVrsqrtps, //!< Instruction 'vrsqrtps' {AVX}. kIdVrsqrtsh, //!< Instruction 'vrsqrtsh' {AVX512_FP16}. @@ -1702,22 +1759,30 @@ namespace Inst { kIdVscalefss, //!< Instruction 'vscalefss' {AVX512_F}. kIdVscatterdpd, //!< Instruction 'vscatterdpd' {AVX512_F+VL}. kIdVscatterdps, //!< Instruction 'vscatterdps' {AVX512_F+VL}. - kIdVscatterpf0dpd, //!< Instruction 'vscatterpf0dpd' {AVX512_PFI}. - kIdVscatterpf0dps, //!< Instruction 'vscatterpf0dps' {AVX512_PFI}. - kIdVscatterpf0qpd, //!< Instruction 'vscatterpf0qpd' {AVX512_PFI}. - kIdVscatterpf0qps, //!< Instruction 'vscatterpf0qps' {AVX512_PFI}. - kIdVscatterpf1dpd, //!< Instruction 'vscatterpf1dpd' {AVX512_PFI}. - kIdVscatterpf1dps, //!< Instruction 'vscatterpf1dps' {AVX512_PFI}. - kIdVscatterpf1qpd, //!< Instruction 'vscatterpf1qpd' {AVX512_PFI}. - kIdVscatterpf1qps, //!< Instruction 'vscatterpf1qps' {AVX512_PFI}. + kIdVscatterpf0dpd, //!< Instruction 'vscatterpf0dpd' {AVX512_PF}. + kIdVscatterpf0dps, //!< Instruction 'vscatterpf0dps' {AVX512_PF}. + kIdVscatterpf0qpd, //!< Instruction 'vscatterpf0qpd' {AVX512_PF}. + kIdVscatterpf0qps, //!< Instruction 'vscatterpf0qps' {AVX512_PF}. + kIdVscatterpf1dpd, //!< Instruction 'vscatterpf1dpd' {AVX512_PF}. + kIdVscatterpf1dps, //!< Instruction 'vscatterpf1dps' {AVX512_PF}. + kIdVscatterpf1qpd, //!< Instruction 'vscatterpf1qpd' {AVX512_PF}. + kIdVscatterpf1qps, //!< Instruction 'vscatterpf1qps' {AVX512_PF}. kIdVscatterqpd, //!< Instruction 'vscatterqpd' {AVX512_F+VL}. kIdVscatterqps, //!< Instruction 'vscatterqps' {AVX512_F+VL}. + kIdVsha512msg1, //!< Instruction 'vsha512msg1' {AVX & SHA512}. + kIdVsha512msg2, //!< Instruction 'vsha512msg2' {AVX & SHA512}. + kIdVsha512rnds2, //!< Instruction 'vsha512rnds2' {AVX & SHA512}. kIdVshuff32x4, //!< Instruction 'vshuff32x4' {AVX512_F+VL}. kIdVshuff64x2, //!< Instruction 'vshuff64x2' {AVX512_F+VL}. kIdVshufi32x4, //!< Instruction 'vshufi32x4' {AVX512_F+VL}. kIdVshufi64x2, //!< Instruction 'vshufi64x2' {AVX512_F+VL}. kIdVshufpd, //!< Instruction 'vshufpd' {AVX|AVX512_F+VL}. kIdVshufps, //!< Instruction 'vshufps' {AVX|AVX512_F+VL}. + kIdVsm3msg1, //!< Instruction 'vsm3msg1' {AVX & SM3}. + kIdVsm3msg2, //!< Instruction 'vsm3msg2' {AVX & SM3}. + kIdVsm3rnds2, //!< Instruction 'vsm3rnds2' {AVX & SM3}. + kIdVsm4key4, //!< Instruction 'vsm4key4' {AVX & SM4}. + kIdVsm4rnds4, //!< Instruction 'vsm4rnds4' {AVX & SM4}. kIdVsqrtpd, //!< Instruction 'vsqrtpd' {AVX|AVX512_F+VL}. kIdVsqrtph, //!< Instruction 'vsqrtph' {AVX512_FP16+VL}. kIdVsqrtps, //!< Instruction 'vsqrtps' {AVX|AVX512_F+VL}. @@ -1744,7 +1809,7 @@ namespace Inst { kIdVxorps, //!< Instruction 'vxorps' {AVX|AVX512_DQ+VL}. kIdVzeroall, //!< Instruction 'vzeroall' {AVX}. kIdVzeroupper, //!< Instruction 'vzeroupper' {AVX}. - kIdWbinvd, //!< Instruction 'wbinvd'. + kIdWbinvd, //!< Instruction 'wbinvd' {I486}. kIdWbnoinvd, //!< Instruction 'wbnoinvd' {WBNOINVD}. kIdWrfsbase, //!< Instruction 'wrfsbase' {FSGSBASE} (X64). kIdWrgsbase, //!< Instruction 'wrgsbase' {FSGSBASE} (X64). @@ -1784,7 +1849,7 @@ namespace Inst { }; //! Tests whether the `instId` is defined. - static inline constexpr bool isDefinedId(InstId instId) noexcept { return instId < _kIdCount; } + static ASMJIT_INLINE_NODEBUG constexpr bool isDefinedId(InstId instId) noexcept { return instId < _kIdCount; } //! \cond #define ASMJIT_INST_FROM_COND(ID) \ @@ -1801,11 +1866,11 @@ namespace Inst { //! \endcond //! Translates a condition code `cond` to a `jcc` instruction id. - static constexpr InstId jccFromCond(CondCode cond) noexcept { return _jccTable[uint8_t(cond)]; } + static ASMJIT_INLINE_NODEBUG constexpr InstId jccFromCond(CondCode cond) noexcept { return _jccTable[uint8_t(cond)]; } //! Translates a condition code `cond` to a `setcc` instruction id. - static constexpr InstId setccFromCond(CondCode cond) noexcept { return _setccTable[uint8_t(cond)]; } + static ASMJIT_INLINE_NODEBUG constexpr InstId setccFromCond(CondCode cond) noexcept { return _setccTable[uint8_t(cond)]; } //! Translates a condition code `cond` to a `cmovcc` instruction id. - static constexpr InstId cmovccFromCond(CondCode cond) noexcept { return _cmovccTable[uint8_t(cond)]; } + static ASMJIT_INLINE_NODEBUG constexpr InstId cmovccFromCond(CondCode cond) noexcept { return _cmovccTable[uint8_t(cond)]; } } // {Inst} //! FPU status word bits. @@ -1933,7 +1998,7 @@ enum class RoundImm : uint8_t { kUp = 0x02u, //!< Round to up toward +INF (ceil). kTrunc = 0x03u, //!< Round toward zero (truncate). kCurrent = 0x04u, //!< Round to the current rounding mode set (ignores other RC bits). - kSuppress = 0x08u //!< Supress exceptions (avoids inexact exception, if set). + kSuppress = 0x08u //!< Suppress exceptions (avoids inexact exception, if set). }; ASMJIT_DEFINE_ENUM_FLAGS(RoundImm) @@ -2085,7 +2150,7 @@ enum class VReduceImm : uint8_t { ASMJIT_DEFINE_ENUM_FLAGS(VReduceImm) //! Creates a \ref VReduceImm from a combination of `flags` and `fixedPointLength`. -static inline constexpr VReduceImm vReduceImm(VReduceImm flags, uint32_t fixedPointLength) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr VReduceImm vReduceImm(VReduceImm flags, uint32_t fixedPointLength) noexcept { return flags | VReduceImm(fixedPointLength << 4); } @@ -2120,7 +2185,7 @@ enum class TLogImm : uint8_t { ASMJIT_DEFINE_ENUM_FLAGS(TLogImm) //! Creates an immediate that can be used by VPTERNLOG[D|Q] instructions. -static inline constexpr TLogImm tLogFromBits(uint8_t b000, uint8_t b001, uint8_t b010, uint8_t b011, uint8_t b100, uint8_t b101, uint8_t b110, uint8_t b111) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr TLogImm tLogFromBits(uint8_t b000, uint8_t b001, uint8_t b010, uint8_t b011, uint8_t b100, uint8_t b101, uint8_t b110, uint8_t b111) noexcept { return TLogImm(uint8_t(b000 << 0) | uint8_t(b001 << 1) | uint8_t(b010 << 2) | @@ -2132,7 +2197,7 @@ static inline constexpr TLogImm tLogFromBits(uint8_t b000, uint8_t b001, uint8_t } //! Creates an if/else logic that can be used by VPTERNLOG[D|Q] instructions. -static inline constexpr TLogImm fLogIfElse(TLogImm condition, TLogImm a, TLogImm b) noexcept { return (condition & a) | (~condition & b); } +static ASMJIT_INLINE_NODEBUG constexpr TLogImm fLogIfElse(TLogImm condition, TLogImm a, TLogImm b) noexcept { return (condition & a) | (~condition & b); } //! Creates a shuffle immediate value that be used with SSE/AVX/AVX-512 instructions to shuffle 2 elements in a vector. //! @@ -2141,7 +2206,7 @@ static inline constexpr TLogImm fLogIfElse(TLogImm condition, TLogImm a, TLogImm //! //! Shuffle constants can be used to encode an immediate for these instructions: //! - `shufpd|vshufpd` -static inline constexpr uint32_t shuffleImm(uint32_t a, uint32_t b) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr uint32_t shuffleImm(uint32_t a, uint32_t b) noexcept { return (a << 1) | b; } @@ -2158,7 +2223,7 @@ static inline constexpr uint32_t shuffleImm(uint32_t a, uint32_t b) noexcept { //! - `pshufhw|vpshufhw` //! - `pshufd|vpshufd` //! - `shufps|vshufps` -static inline constexpr uint32_t shuffleImm(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr uint32_t shuffleImm(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept { return (a << 6) | (b << 4) | (c << 2) | d; } diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp b/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp index 3857cc1212703..27671b3adc5bf 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp @@ -3,30 +3,12 @@ // See asmjit.h or LICENSE.md for license and copyright information // SPDX-License-Identifier: Zlib -// ---------------------------------------------------------------------------- -// IMPORTANT: AsmJit now uses an external instruction database to populate -// static tables within this file. Perform the following steps to regenerate -// all tables enclosed by ${...}: -// -// 1. Install node.js environment -// 2. Go to asmjit/tools directory -// 3. Get the latest asmdb from and -// copy/link the `asmdb` directory to `asmjit/tools/asmdb`. -// 4. Execute `node tablegen-x86.js` -// -// Instruction encoding and opcodes were added to the `x86inst.cpp` database -// manually in the past and they are not updated by the script as it became -// tricky. However, everything else is updated including instruction operands -// and tables required to validate them, instruction read/write information -// (including registers and flags), and all indexes to all tables. -// ---------------------------------------------------------------------------- - #include "../core/api-build_p.h" #if !defined(ASMJIT_NO_X86) #include "../core/cpuinfo.h" +#include "../core/instdb_p.h" #include "../core/misc_p.h" -#include "../core/support.h" #include "../x86/x86instapi_p.h" #include "../x86/x86instdb_p.h" #include "../x86/x86opcode_p.h" @@ -34,63 +16,21 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) +namespace InstInternal { + // x86::InstInternal - Text // ======================== #ifndef ASMJIT_NO_TEXT -Error InstInternal::instIdToString(Arch arch, InstId instId, String& output) noexcept { - DebugUtils::unused(arch); - +Error instIdToString(InstId instId, String& output) noexcept { if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId))) return DebugUtils::errored(kErrorInvalidInstruction); - const InstDB::InstInfo& info = InstDB::infoById(instId); - return output.append(InstDB::_nameData + info._nameDataIndex); + return InstNameUtils::decode(output, InstDB::_instNameIndexTable[instId], InstDB::_instNameStringTable); } -InstId InstInternal::stringToInstId(Arch arch, const char* s, size_t len) noexcept { - DebugUtils::unused(arch); - - if (ASMJIT_UNLIKELY(!s)) - return Inst::kIdNone; - - if (len == SIZE_MAX) - len = strlen(s); - - if (ASMJIT_UNLIKELY(len == 0 || len > InstDB::kMaxNameSize)) - return Inst::kIdNone; - - uint32_t prefix = uint32_t(s[0]) - 'a'; - if (ASMJIT_UNLIKELY(prefix > 'z' - 'a')) - return Inst::kIdNone; - - uint32_t index = InstDB::instNameIndex[prefix].start; - if (ASMJIT_UNLIKELY(!index)) - return Inst::kIdNone; - - const char* nameData = InstDB::_nameData; - const InstDB::InstInfo* table = InstDB::_instInfoTable; - - const InstDB::InstInfo* base = table + index; - const InstDB::InstInfo* end = table + InstDB::instNameIndex[prefix].end; - - for (size_t lim = (size_t)(end - base); lim != 0; lim >>= 1) { - const InstDB::InstInfo* cur = base + (lim >> 1); - int result = Support::cmpInstName(nameData + cur[0]._nameDataIndex, s, len); - - if (result < 0) { - base = cur + 1; - lim--; - continue; - } - - if (result > 0) - continue; - - return InstId((size_t)(cur - table)); - } - - return Inst::kIdNone; +InstId stringToInstId(const char* s, size_t len) noexcept { + return InstNameUtils::find(s, len, InstDB::instNameIndex, InstDB::_instNameIndexTable, InstDB::_instNameStringTable); } #endif // !ASMJIT_NO_TEXT @@ -184,7 +124,7 @@ static const X86ValidationData _x64ValidationData = { #undef REG_MASK_FROM_REG_TYPE_X86 static ASMJIT_FORCE_INLINE bool x86IsZmmOrM512(const Operand_& op) noexcept { - return Reg::isZmm(op) || (op.isMem() && op.size() == 64); + return Reg::isZmm(op) || (op.isMem() && op.x86RmSize() == 64); } static ASMJIT_FORCE_INLINE bool x86CheckOSig(const InstDB::OpSignature& op, const InstDB::OpSignature& ref, bool& immOutOfRange) noexcept { @@ -216,20 +156,11 @@ static ASMJIT_FORCE_INLINE bool x86CheckOSig(const InstDB::OpSignature& op, cons return true; } -ASMJIT_FAVOR_SIZE Error InstInternal::validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept { - // Only called when `arch` matches X86 family. - ASMJIT_ASSERT(Environment::isFamilyX86(arch)); - - const X86ValidationData* vd; - if (arch == Arch::kX86) - vd = &_x86ValidationData; - else - vd = &_x64ValidationData; - +static ASMJIT_FAVOR_SIZE Error validate(InstDB::Mode mode, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept { uint32_t i; - InstDB::Mode mode = InstDB::modeFromArch(arch); // Get the instruction data. + const X86ValidationData* vd = (mode == InstDB::Mode::kX86) ? &_x86ValidationData : &_x64ValidationData; InstId instId = inst.id(); InstOptions options = inst.options(); @@ -717,6 +648,15 @@ ASMJIT_FAVOR_SIZE Error InstInternal::validate(Arch arch, const BaseInst& inst, return kErrorOk; } + +Error validateX86(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept { + return validate(InstDB::Mode::kX86, inst, operands, opCount, validationFlags); +} + +Error validateX64(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept { + return validate(InstDB::Mode::kX64, inst, operands, opCount, validationFlags); +} + #endif // !ASMJIT_NO_VALIDATION // x86::InstInternal - QueryRWInfo @@ -785,7 +725,7 @@ static ASMJIT_FORCE_INLINE bool hasSameRegType(const BaseReg* regs, size_t opCou return true; } -Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept { +Error queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept { // Only called when `arch` matches X86 family. ASMJIT_ASSERT(Environment::isFamilyX86(arch)); @@ -827,7 +767,7 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* constexpr OpRWFlags RegPhys = OpRWFlags::kRegPhysId; constexpr OpRWFlags MibRead = OpRWFlags::kMemBaseRead | OpRWFlags::kMemIndexRead; - if (instRwInfo.category == InstDB::RWInfo::kCategoryGeneric) { + if (instRwInfo.category <= uint32_t(InstDB::RWInfo::kCategoryGenericEx)) { uint32_t i; uint32_t rmOpsMask = 0; uint32_t rmMaxSize = 0; @@ -852,8 +792,8 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* uint64_t rByteMask = rwOpData.rByteMask; uint64_t wByteMask = rwOpData.wByteMask; - if (op.isRead() && !rByteMask) rByteMask = Support::lsbMask(srcOp.size()); - if (op.isWrite() && !wByteMask) wByteMask = Support::lsbMask(srcOp.size()); + if (op.isRead() && !rByteMask) rByteMask = Support::lsbMask(srcOp.x86RmSize()); + if (op.isWrite() && !wByteMask) wByteMask = Support::lsbMask(srcOp.x86RmSize()); op._readByteMask = rByteMask; op._writeByteMask = wByteMask; @@ -876,7 +816,7 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* } // Aggregate values required to calculate valid Reg/M info. - rmMaxSize = Support::max(rmMaxSize, srcOp.size()); + rmMaxSize = Support::max(rmMaxSize, srcOp.x86RmSize()); rmOpsMask |= Support::bitMask(i); } else { @@ -919,8 +859,8 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* } } - rmOpsMask &= instRmInfo.rmOpsMask; - if (rmOpsMask) { + rmOpsMask &= uint32_t(instRmInfo.rmOpsMask); + if (rmOpsMask && !inst.hasOption(InstOptions::kX86_ER)) { Support::BitWordIterator it(rmOpsMask); do { i = it.next(); @@ -933,7 +873,7 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* op.setRmSize(instRmInfo.fixedSize); break; case InstDB::RWInfoRm::kCategoryConsistent: - op.setRmSize(operands[i].size()); + op.setRmSize(operands[i].x86RmSize()); break; case InstDB::RWInfoRm::kCategoryHalf: op.setRmSize(rmMaxSize / 2u); @@ -948,6 +888,25 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* } while (it.hasNext()); } + // Special cases per instruction. + if (instRwInfo.category == InstDB::RWInfo::kCategoryGenericEx) { + switch (inst.id()) { + case Inst::kIdVpternlogd: + case Inst::kIdVpternlogq: { + if (opCount == 4 && operands[3].isImm()) { + uint32_t predicate = operands[3].as().valueAs(); + if ((predicate >> 4) == (predicate & 0xF)) { + out->_operands[0].clearOpFlags(OpRWFlags::kRead); + } + } + break; + } + + default: + break; + } + } + return rwHandleAVX512(inst, commonInfo, out); } @@ -966,8 +925,8 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* const Reg& o1 = operands[1].as(); if (o0.isGp() && o1.isGp()) { - out->_operands[0].reset(W | RegM, operands[0].size()); - out->_operands[1].reset(R | RegM, operands[1].size()); + out->_operands[0].reset(W | RegM, operands[0].x86RmSize()); + out->_operands[1].reset(R | RegM, operands[1].x86RmSize()); rwZeroExtendGp(out->_operands[0], operands[0].as(), nativeGpSize); out->_instFlags |= InstRWFlags::kMovOp; @@ -1114,14 +1073,14 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* if (opCount == 2) { if (operands[0].isReg() && operands[1].isImm()) { - out->_operands[0].reset(X, operands[0].size()); + out->_operands[0].reset(X, operands[0].as().size()); out->_operands[1].reset(); rwZeroExtendGp(out->_operands[0], operands[0].as(), nativeGpSize); return kErrorOk; } - if (Reg::isGpw(operands[0]) && operands[1].size() == 1) { + if (Reg::isGpw(operands[0]) && operands[1].x86RmSize() == 1) { // imul ax, r8/m8 <- AX = AL * r8/m8 out->_operands[0].reset(X | RegPhys, 2, Gp::kIdAx); out->_operands[0].setReadByteMask(Support::lsbMask(1)); @@ -1129,8 +1088,8 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* } else { // imul r?, r?/m? - out->_operands[0].reset(X, operands[0].size()); - out->_operands[1].reset(R | RegM, operands[0].size()); + out->_operands[0].reset(X, operands[0].as().size()); + out->_operands[1].reset(R | RegM, operands[0].as().size()); rwZeroExtendGp(out->_operands[0], operands[0].as(), nativeGpSize); } @@ -1141,8 +1100,8 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* if (opCount == 3) { if (operands[2].isImm()) { - out->_operands[0].reset(W, operands[0].size()); - out->_operands[1].reset(R | RegM, operands[1].size()); + out->_operands[0].reset(W, operands[0].x86RmSize()); + out->_operands[1].reset(R | RegM, operands[1].x86RmSize()); out->_operands[2].reset(); rwZeroExtendGp(out->_operands[0], operands[0].as(), nativeGpSize); @@ -1151,9 +1110,9 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* return kErrorOk; } else { - out->_operands[0].reset(W | RegPhys, operands[0].size(), Gp::kIdDx); - out->_operands[1].reset(X | RegPhys, operands[1].size(), Gp::kIdAx); - out->_operands[2].reset(R | RegM, operands[2].size()); + out->_operands[0].reset(W | RegPhys, operands[0].x86RmSize(), Gp::kIdDx); + out->_operands[1].reset(X | RegPhys, operands[1].x86RmSize(), Gp::kIdAx); + out->_operands[2].reset(R | RegM, operands[2].x86RmSize()); rwZeroExtendGp(out->_operands[0], operands[0].as(), nativeGpSize); rwZeroExtendGp(out->_operands[1], operands[1].as(), nativeGpSize); @@ -1230,18 +1189,18 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* // Special case for 'vmaskmovpd|vmaskmovps|vpmaskmovd|vpmaskmovq' instructions. if (opCount == 3) { if (BaseReg::isVec(operands[0]) && BaseReg::isVec(operands[1]) && operands[2].isMem()) { - out->_operands[0].reset(W, operands[0].size()); - out->_operands[1].reset(R, operands[1].size()); - out->_operands[2].reset(R | MibRead, operands[1].size()); + out->_operands[0].reset(W, operands[0].x86RmSize()); + out->_operands[1].reset(R, operands[1].x86RmSize()); + out->_operands[2].reset(R | MibRead, operands[1].x86RmSize()); rwZeroExtendAvxVec(out->_operands[0], operands[0].as()); return kErrorOk; } if (operands[0].isMem() && BaseReg::isVec(operands[1]) && BaseReg::isVec(operands[2])) { - out->_operands[0].reset(X | MibRead, operands[1].size()); - out->_operands[1].reset(R, operands[1].size()); - out->_operands[2].reset(R, operands[2].size()); + out->_operands[0].reset(X | MibRead, operands[1].x86RmSize()); + out->_operands[1].reset(R, operands[1].x86RmSize()); + out->_operands[2].reset(R, operands[2].x86RmSize()); return kErrorOk; } } @@ -1254,7 +1213,7 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* // operand, respectively. if (opCount == 2) { if (BaseReg::isVec(operands[0]) && BaseReg::isVec(operands[1])) { - uint32_t o0Size = operands[0].size(); + uint32_t o0Size = operands[0].x86RmSize(); uint32_t o1Size = o0Size == 16 ? 8 : o0Size; out->_operands[0].reset(W, o0Size); @@ -1266,7 +1225,7 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* } if (BaseReg::isVec(operands[0]) && operands[1].isMem()) { - uint32_t o0Size = operands[0].size(); + uint32_t o0Size = operands[0].x86RmSize(); uint32_t o1Size = o0Size == 16 ? 8 : o0Size; out->_operands[0].reset(W, o0Size); @@ -1286,7 +1245,7 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* if (BaseReg::isGp(operands[0]) && BaseReg::isVec(operands[1])) { out->_operands[0].reset(W, 1); out->_operands[0].setExtendByteMask(Support::lsbMask(nativeGpSize - 1) << 1); - out->_operands[1].reset(R, operands[1].size()); + out->_operands[1].reset(R, operands[1].x86RmSize()); return kErrorOk; } } @@ -1324,7 +1283,7 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* } if (operands[0].isReg() && operands[1].isReg()) { - uint32_t size1 = operands[1].size(); + uint32_t size1 = operands[1].x86RmSize(); uint32_t size0 = size1 >> shift; out->_operands[0].reset(W, size0); @@ -1351,16 +1310,20 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* } if (operands[0].isReg() && operands[1].isMem()) { - uint32_t size1 = operands[1].size() ? operands[1].size() : uint32_t(16); + uint32_t size1 = operands[1].x86RmSize() ? operands[1].x86RmSize() : uint32_t(16); uint32_t size0 = size1 >> shift; out->_operands[0].reset(W, size0); out->_operands[1].reset(R | MibRead, size1); + + if (BaseReg::isVec(operands[0])) + rwZeroExtendAvxVec(out->_operands[0], operands[0].as()); + return kErrorOk; } if (operands[0].isMem() && operands[1].isReg()) { - uint32_t size1 = operands[1].size(); + uint32_t size1 = operands[1].x86RmSize(); uint32_t size0 = size1 >> shift; out->_operands[0].reset(W | MibRead, size0); @@ -1401,12 +1364,15 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* out->_operands[2].reset(); } - uint32_t size0 = operands[0].size(); + uint32_t size0 = operands[0].x86RmSize(); uint32_t size1 = size0 >> shift; out->_operands[0].reset(W, size0); out->_operands[1].reset(R, size1); + if (BaseReg::isVec(operands[0])) + rwZeroExtendAvxVec(out->_operands[0], operands[0].as()); + if (operands[0].isReg() && operands[1].isReg()) { if (instRmInfo.rmOpsMask & 0x1) { out->_operands[0].addOpFlags(RegM); @@ -1481,7 +1447,9 @@ static inline uint32_t InstInternal_usesAvx512(InstOptions instOptions, const Re return hasEvex | hasKMask | hasKOrZmm; } -Error InstInternal::queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept { +Error queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept { + typedef CpuFeatures::X86 Ext; + // Only called when `arch` matches X86 family. DebugUtils::unused(arch); ASMJIT_ASSERT(Environment::isFamilyX86(arch)); @@ -1514,19 +1482,19 @@ Error InstInternal::queryFeatures(Arch arch, const BaseInst& inst, const Operand RegAnalysis regAnalysis = InstInternal_regAnalysis(operands, opCount); // Handle MMX vs SSE overlap. - if (out->has(CpuFeatures::X86::kMMX) || out->has(CpuFeatures::X86::kMMX2)) { + if (out->has(Ext::kMMX) || out->has(Ext::kMMX2)) { // Only instructions defined by SSE and SSE2 overlap. Instructions introduced by newer instruction sets like // SSE3+ don't state MMX as they require SSE3+. - if (out->has(CpuFeatures::X86::kSSE) || out->has(CpuFeatures::X86::kSSE2)) { + if (out->has(Ext::kSSE) || out->has(Ext::kSSE2)) { if (!regAnalysis.hasRegType(RegType::kX86_Xmm)) { // The instruction doesn't use XMM register(s), thus it's MMX/MMX2 only. - out->remove(CpuFeatures::X86::kSSE); - out->remove(CpuFeatures::X86::kSSE2); - out->remove(CpuFeatures::X86::kSSE4_1); + out->remove(Ext::kSSE); + out->remove(Ext::kSSE2); + out->remove(Ext::kSSE4_1); } else { - out->remove(CpuFeatures::X86::kMMX); - out->remove(CpuFeatures::X86::kMMX2); + out->remove(Ext::kMMX); + out->remove(Ext::kMMX2); } // Special case: PEXTRW instruction is MMX/SSE2 instruction. However, MMX/SSE version cannot access memory @@ -1535,30 +1503,30 @@ Error InstInternal::queryFeatures(Arch arch, const BaseInst& inst, const Operand // is, of course, not compatible with MMX/SSE2 and would #UD if SSE4.1 is not supported. if (instId == Inst::kIdPextrw) { if (opCount >= 1 && operands[0].isMem()) - out->remove(CpuFeatures::X86::kSSE2); + out->remove(Ext::kSSE2); else - out->remove(CpuFeatures::X86::kSSE4_1); + out->remove(Ext::kSSE4_1); } } } // Handle PCLMULQDQ vs VPCLMULQDQ. - if (out->has(CpuFeatures::X86::kVPCLMULQDQ)) { + if (out->has(Ext::kVPCLMULQDQ)) { if (regAnalysis.hasRegType(RegType::kX86_Zmm) || Support::test(options, InstOptions::kX86_Evex)) { // AVX512_F & VPCLMULQDQ. - out->remove(CpuFeatures::X86::kAVX, CpuFeatures::X86::kPCLMULQDQ); + out->remove(Ext::kAVX, Ext::kPCLMULQDQ); } else if (regAnalysis.hasRegType(RegType::kX86_Ymm)) { - out->remove(CpuFeatures::X86::kAVX512_F, CpuFeatures::X86::kAVX512_VL); + out->remove(Ext::kAVX512_F, Ext::kAVX512_VL); } else { // AVX & PCLMULQDQ. - out->remove(CpuFeatures::X86::kAVX512_F, CpuFeatures::X86::kAVX512_VL, CpuFeatures::X86::kVPCLMULQDQ); + out->remove(Ext::kAVX512_F, Ext::kAVX512_VL, Ext::kVPCLMULQDQ); } } // Handle AVX vs AVX2 overlap. - if (out->has(CpuFeatures::X86::kAVX) && out->has(CpuFeatures::X86::kAVX2)) { + if (out->has(Ext::kAVX) && out->has(Ext::kAVX2)) { bool isAVX2 = true; // Special case: VBROADCASTSS and VBROADCASTSD were introduced in AVX, but only version that uses memory as a // source operand. AVX2 then added support for register source operand. @@ -1575,157 +1543,287 @@ Error InstInternal::queryFeatures(Arch arch, const BaseInst& inst, const Operand } if (isAVX2) - out->remove(CpuFeatures::X86::kAVX); + out->remove(Ext::kAVX); else - out->remove(CpuFeatures::X86::kAVX2); + out->remove(Ext::kAVX2); } - // Handle AVX|AVX2|FMA|F16C vs AVX512 overlap. - if (out->has(CpuFeatures::X86::kAVX) || out->has(CpuFeatures::X86::kAVX2) || out->has(CpuFeatures::X86::kFMA) || out->has(CpuFeatures::X86::kF16C)) { - // Only AVX512-F|BW|DQ allow to encode AVX/AVX2/FMA/F16C instructions - if (out->has(CpuFeatures::X86::kAVX512_F) || out->has(CpuFeatures::X86::kAVX512_BW) || out->has(CpuFeatures::X86::kAVX512_DQ)) { - uint32_t usesAvx512 = InstInternal_usesAvx512(options, inst.extraReg(), regAnalysis); - uint32_t mustUseEvex = 0; - - switch (instId) { - // Special case: VPSLLDQ and VPSRLDQ instructions only allow `reg, reg. imm` combination in AVX|AVX2 mode, - // then AVX-512 introduced `reg, reg/mem, imm` combination that uses EVEX prefix. This means that if the - // second operand is memory then this is AVX-512_BW instruction and not AVX/AVX2 instruction. - case Inst::kIdVpslldq: - case Inst::kIdVpsrldq: - mustUseEvex = opCount >= 2 && operands[1].isMem(); - break; + // Handle AVX vs AVX512 overlap. + // + // In general, non-AVX encoding is preferred, however, AVX encoded instructions that were initially provided + // as AVX-512 instructions must naturally prefer AVX-512 encoding, as that was the first one provided. + if (out->hasAny(Ext::kAVX, + Ext::kAVX_IFMA, + Ext::kAVX_NE_CONVERT, + Ext::kAVX_VNNI, + Ext::kAVX2, + Ext::kF16C, + Ext::kFMA) + && + out->hasAny(Ext::kAVX512_BF16, + Ext::kAVX512_BW, + Ext::kAVX512_DQ, + Ext::kAVX512_F, + Ext::kAVX512_IFMA, + Ext::kAVX512_VNNI)) { + + uint32_t useEvex = InstInternal_usesAvx512(options, inst.extraReg(), regAnalysis) | regAnalysis.highVecUsed; + switch (instId) { + // Special case: VPBROADCAST[B|D|Q|W] only supports r32/r64 with EVEX prefix. + case Inst::kIdVpbroadcastb: + case Inst::kIdVpbroadcastd: + case Inst::kIdVpbroadcastq: + case Inst::kIdVpbroadcastw: + useEvex |= uint32_t(opCount >= 2 && x86::Reg::isGp(operands[1])); + break; - // Special case: VPBROADCAST[B|D|Q|W] only supports r32/r64 with EVEX prefix. - case Inst::kIdVpbroadcastb: - case Inst::kIdVpbroadcastd: - case Inst::kIdVpbroadcastq: - case Inst::kIdVpbroadcastw: - mustUseEvex = opCount >= 2 && x86::Reg::isGp(operands[1]); - break; + case Inst::kIdVcvtpd2dq: + case Inst::kIdVcvtpd2ps: + case Inst::kIdVcvttpd2dq: + useEvex |= uint32_t(opCount >= 2 && Reg::isYmm(operands[0])); + break; - // Special case: VPERMPD - AVX2 vs AVX512-F case. - case Inst::kIdVpermpd: - mustUseEvex = opCount >= 3 && !operands[2].isImm(); - break; + case Inst::kIdVgatherdpd: + case Inst::kIdVgatherdps: + case Inst::kIdVgatherqpd: + case Inst::kIdVgatherqps: + case Inst::kIdVpgatherdd: + case Inst::kIdVpgatherdq: + case Inst::kIdVpgatherqd: + case Inst::kIdVpgatherqq: + useEvex |= uint32_t(opCount == 2); + break; - // Special case: VPERMQ - AVX2 vs AVX512-F case. - case Inst::kIdVpermq: - mustUseEvex = opCount >= 3 && (operands[1].isMem() || !operands[2].isImm()); - break; - } + // Special case: These instructions only allow `reg, reg. imm` combination in AVX|AVX2 mode, then + // AVX-512 introduced `reg, reg/mem, imm` combination that uses EVEX prefix. This means that if + // the second operand is memory then this is AVX-512_BW instruction and not AVX/AVX2 instruction. + case Inst::kIdVpslldq: + case Inst::kIdVpslld: + case Inst::kIdVpsllq: + case Inst::kIdVpsllw: + case Inst::kIdVpsrad: + case Inst::kIdVpsraq: + case Inst::kIdVpsraw: + case Inst::kIdVpsrld: + case Inst::kIdVpsrldq: + case Inst::kIdVpsrlq: + case Inst::kIdVpsrlw: + useEvex |= uint32_t(opCount >= 2 && operands[1].isMem()); + break; - if (!(usesAvx512 | mustUseEvex | regAnalysis.highVecUsed)) - out->remove(CpuFeatures::X86::kAVX512_F, CpuFeatures::X86::kAVX512_BW, CpuFeatures::X86::kAVX512_DQ, CpuFeatures::X86::kAVX512_VL); - else - out->remove(CpuFeatures::X86::kAVX, CpuFeatures::X86::kAVX2, CpuFeatures::X86::kFMA, CpuFeatures::X86::kF16C); - } - } + // Special case: VPERMPD - AVX2 vs AVX512-F case. + case Inst::kIdVpermpd: + useEvex |= uint32_t(opCount >= 3 && !operands[2].isImm()); + break; - // Handle AVX_VNNI vs AVX512_VNNI overlap. - if (out->has(CpuFeatures::X86::kAVX512_VNNI)) { - // By default the AVX512_VNNI instruction should be used, because it was introduced first. However, VEX|VEX3 - // prefix can be used to force AVX_VNNI instead. - uint32_t usesAvx512 = InstInternal_usesAvx512(options, inst.extraReg(), regAnalysis); + // Special case: VPERMQ - AVX2 vs AVX512-F case. + case Inst::kIdVpermq: + useEvex |= uint32_t(opCount >= 3 && (operands[1].isMem() || !operands[2].isImm())); + break; + } - if (!usesAvx512 && Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3)) - out->remove(CpuFeatures::X86::kAVX512_VNNI, CpuFeatures::X86::kAVX512_VL); - else - out->remove(CpuFeatures::X86::kAVX_VNNI); + if (instInfo.commonInfo().preferEvex() && !Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3)) + useEvex = 1; + + if (useEvex) { + out->remove(Ext::kAVX, + Ext::kAVX_IFMA, + Ext::kAVX_NE_CONVERT, + Ext::kAVX_VNNI, + Ext::kAVX2, + Ext::kF16C, + Ext::kFMA); + } + else { + out->remove(Ext::kAVX512_BF16, + Ext::kAVX512_BW, + Ext::kAVX512_DQ, + Ext::kAVX512_F, + Ext::kAVX512_IFMA, + Ext::kAVX512_VL, + Ext::kAVX512_VNNI); + } } // Clear AVX512_VL if ZMM register is used. if (regAnalysis.hasRegType(RegType::kX86_Zmm)) - out->remove(CpuFeatures::X86::kAVX512_VL); + out->remove(Ext::kAVX512_VL); } return kErrorOk; } #endif // !ASMJIT_NO_INTROSPECTION +} // {InstInternal} + // x86::InstInternal - Tests // ========================= #if defined(ASMJIT_TEST) +#ifndef ASMJIT_NO_TEXT UNIT(x86_inst_api_text) { // All known instructions should be matched. INFO("Matching all X86 instructions"); for (uint32_t a = 1; a < Inst::_kIdCount; a++) { StringTmp<128> aName; - EXPECT(InstInternal::instIdToString(Arch::kX86, a, aName) == kErrorOk, - "Failed to get the name of instruction #%u", a); + EXPECT_EQ(InstInternal::instIdToString(a, aName), kErrorOk) + .message("Failed to get the name of instruction #%u", a); - uint32_t b = InstInternal::stringToInstId(Arch::kX86, aName.data(), aName.size()); + uint32_t b = InstInternal::stringToInstId(aName.data(), aName.size()); StringTmp<128> bName; - InstInternal::instIdToString(Arch::kX86, b, bName); + InstInternal::instIdToString(b, bName); + EXPECT_EQ(a, b) + .message("Instructions do not match \"%s\" (#%u) != \"%s\" (#%u)", aName.data(), a, bName.data(), b); + } +} +#endif // !ASMJIT_NO_TEXT + +#ifndef ASMJIT_NO_INTROSPECTION +template +static Error queryFeaturesInline(CpuFeatures* out, Arch arch, BaseInst inst, Args&&... args) { + Operand_ opArray[] = { std::forward(args)... }; + return InstInternal::queryFeatures(arch, inst, opArray, sizeof...(args), out); +} + +UNIT(x86_inst_api_cpu_features) { + INFO("Verifying whether SSE2+ features are reported correctly for legacy instructions"); + { + CpuFeatures f; + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdPaddd), xmm1, xmm2); + EXPECT_TRUE(f.x86().hasSSE2()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdAddsubpd), xmm1, xmm2); + EXPECT_TRUE(f.x86().hasSSE3()); - EXPECT(a == b, - "Instructions do not match \"%s\" (#%u) != \"%s\" (#%u)", aName.data(), a, bName.data(), b); + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdPshufb), xmm1, xmm2); + EXPECT_TRUE(f.x86().hasSSSE3()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdBlendpd), xmm1, xmm2, Imm(1)); + EXPECT_TRUE(f.x86().hasSSE4_1()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdCrc32), eax, al); + EXPECT_TRUE(f.x86().hasSSE4_2()); + } + + INFO("Verifying whether AVX+ features are reported correctly for AVX instructions"); + { + CpuFeatures f; + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpaddd), xmm1, xmm2, xmm3); + EXPECT_TRUE(f.x86().hasAVX()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpaddd), ymm1, ymm2, ymm3); + EXPECT_TRUE(f.x86().hasAVX2()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVaddsubpd), xmm1, xmm2, xmm3); + EXPECT_TRUE(f.x86().hasAVX()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVaddsubpd), ymm1, ymm2, ymm3); + EXPECT_TRUE(f.x86().hasAVX()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpshufb), xmm1, xmm2, xmm3); + EXPECT_TRUE(f.x86().hasAVX()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpshufb), ymm1, ymm2, ymm3); + EXPECT_TRUE(f.x86().hasAVX2()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVblendpd), xmm1, xmm2, xmm3, Imm(1)); + EXPECT_TRUE(f.x86().hasAVX()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVblendpd), ymm1, ymm2, ymm3, Imm(1)); + EXPECT_TRUE(f.x86().hasAVX()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpunpcklbw), xmm1, xmm2, xmm3); + EXPECT_TRUE(f.x86().hasAVX()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpunpcklbw), ymm1, ymm2, ymm3); + EXPECT_TRUE(f.x86().hasAVX2()); + } + + INFO("Verifying whether AVX2 / AVX512 features are reported correctly for vpgatherxx instructions"); + { + CpuFeatures f; + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpgatherdd), xmm1, ptr(rax, xmm2), xmm3); + EXPECT_TRUE(f.x86().hasAVX2()); + EXPECT_FALSE(f.x86().hasAVX512_F()); + + // NOTE: This instruction is unencodable, but sometimes this signature is used to check the support (without the {k}). + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpgatherdd), xmm1, ptr(rax, xmm2)); + EXPECT_FALSE(f.x86().hasAVX2()); + EXPECT_TRUE(f.x86().hasAVX512_F()); + + queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpgatherdd, InstOptions::kNone, k1), xmm1, ptr(rax, xmm2)); + EXPECT_FALSE(f.x86().hasAVX2()); + EXPECT_TRUE(f.x86().hasAVX512_F()); } } +#endif // !ASMJIT_NO_INTROSPECTION +#ifndef ASMJIT_NO_INTROSPECTION template -static Error queryRWInfoSimple(InstRWInfo* out, Arch arch, InstId instId, InstOptions options, Args&&... args) { - BaseInst inst(instId); - inst.addOptions(options); +static Error queryRWInfoInline(InstRWInfo* out, Arch arch, BaseInst inst, Args&&... args) { Operand_ opArray[] = { std::forward(args)... }; return InstInternal::queryRWInfo(arch, inst, opArray, sizeof...(args), out); } -UNIT(x86_inst_api_rm_feature) { +UNIT(x86_inst_api_rm_features) { INFO("Verifying whether RM/feature is reported correctly for PEXTRW instruction"); { InstRWInfo rwi; - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdPextrw, InstOptions::kNone, eax, mm1, imm(1)); - EXPECT(rwi.rmFeature() == 0); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdPextrw), eax, mm1, imm(1)); + EXPECT_EQ(rwi.rmFeature(), 0u); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdPextrw, InstOptions::kNone, eax, xmm1, imm(1)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kSSE4_1); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdPextrw), eax, xmm1, imm(1)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kSSE4_1); } INFO("Verifying whether RM/feature is reported correctly for AVX512 shift instructions"); { InstRWInfo rwi; - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpslld, InstOptions::kNone, xmm1, xmm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_F); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpslld), xmm1, xmm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpsllq, InstOptions::kNone, ymm1, ymm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_F); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsllq), ymm1, ymm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpsrad, InstOptions::kNone, xmm1, xmm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_F); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrad), xmm1, xmm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpsrld, InstOptions::kNone, ymm1, ymm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_F); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrld), ymm1, ymm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpsrlq, InstOptions::kNone, xmm1, xmm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_F); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrlq), xmm1, xmm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpslldq, InstOptions::kNone, xmm1, xmm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_BW); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpslldq), xmm1, xmm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpsllw, InstOptions::kNone, ymm1, ymm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_BW); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsllw), ymm1, ymm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpsraw, InstOptions::kNone, xmm1, xmm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_BW); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsraw), xmm1, xmm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpsrldq, InstOptions::kNone, ymm1, ymm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_BW); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrldq), ymm1, ymm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpsrlw, InstOptions::kNone, xmm1, xmm2, imm(8)); - EXPECT(rwi.rmFeature() == CpuFeatures::X86::kAVX512_BW); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrlw), xmm1, xmm2, imm(8)); + EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpslld, InstOptions::kNone, xmm1, xmm2, xmm3); - EXPECT(rwi.rmFeature() == 0); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpslld), xmm1, xmm2, xmm3); + EXPECT_EQ(rwi.rmFeature(), 0u); - queryRWInfoSimple(&rwi, Arch::kX64, Inst::kIdVpsllw, InstOptions::kNone, xmm1, xmm2, xmm3); - EXPECT(rwi.rmFeature() == 0); + queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsllw), xmm1, xmm2, xmm3); + EXPECT_EQ(rwi.rmFeature(), 0u); } } -#endif +#endif // !ASMJIT_NO_INTROSPECTION + +#endif // ASMJIT_TEST ASMJIT_END_SUB_NAMESPACE diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h b/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h index 56f7fb928f25e..e0866ea702e3c 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h @@ -18,12 +18,13 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) namespace InstInternal { #ifndef ASMJIT_NO_TEXT -Error ASMJIT_CDECL instIdToString(Arch arch, InstId instId, String& output) noexcept; -InstId ASMJIT_CDECL stringToInstId(Arch arch, const char* s, size_t len) noexcept; +Error ASMJIT_CDECL instIdToString(InstId instId, String& output) noexcept; +InstId ASMJIT_CDECL stringToInstId(const char* s, size_t len) noexcept; #endif // !ASMJIT_NO_TEXT #ifndef ASMJIT_NO_VALIDATION -Error ASMJIT_CDECL validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept; +Error ASMJIT_CDECL validateX86(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept; +Error ASMJIT_CDECL validateX64(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept; #endif // !ASMJIT_NO_VALIDATION #ifndef ASMJIT_NO_INTROSPECTION diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp b/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp index ee22526c34801..4269076f1c482 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp @@ -3,24 +3,6 @@ // See asmjit.h or LICENSE.md for license and copyright information // SPDX-License-Identifier: Zlib -// ---------------------------------------------------------------------------- -// IMPORTANT: AsmJit now uses an external instruction database to populate -// static tables within this file. Perform the following steps to regenerate -// all tables enclosed by ${...}: -// -// 1. Install node.js environment -// 2. Go to asmjit/tools directory -// 3. Get the latest asmdb from and -// copy/link the `asmdb` directory to `asmjit/tools/asmdb`. -// 4. Execute `node tablegen-x86.js` -// -// Instruction encoding and opcodes were added to the `x86inst.cpp` database -// manually in the past and they are not updated by the script as it became -// tricky. However, everything else is updated including instruction operands -// and tables required to validate them, instruction read/write information -// (including registers and flags), and all indexes to all tables. -// ---------------------------------------------------------------------------- - #include "../core/api-build_p.h" #if !defined(ASMJIT_NO_X86) @@ -47,17 +29,9 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) #define E(PREFIX, OPCODE, ModO, LL, W, EvexW, N, TT) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT) | Opcode::kMM_ForceEvex) #define O_FPU(PREFIX, OPCODE, ModO) (Opcode::kFPU_##PREFIX | (0x##OPCODE & 0xFFu) | ((0x##OPCODE >> 8) << Opcode::kFPU_2B_Shift) | Opcode::kModO_##ModO) -// Don't store `_nameDataIndex` if instruction names are disabled. Since some -// APIs can use `_nameDataIndex` it's much safer if it's zero if it's not defined. -#ifndef ASMJIT_NO_TEXT - #define NAME_DATA_INDEX(Index) Index -#else - #define NAME_DATA_INDEX(Index) 0 -#endif - // Defines an X86 instruction. -#define INST(id, encoding, opcode0, opcode1, mainOpcodeIndex, altOpcodeIndex, nameDataIndex, commomInfoIndex, additionalInfoIndex) { \ - uint32_t(NAME_DATA_INDEX(nameDataIndex)), \ +#define INST(id, encoding, opcode0, opcode1, mainOpcodeIndex, altOpcodeIndex, commomInfoIndex, additionalInfoIndex) { \ + uint32_t(0), \ uint32_t(commomInfoIndex), \ uint32_t(additionalInfoIndex), \ uint8_t(InstDB::kEncoding##encoding), \ @@ -67,1674 +41,1733 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86) } const InstDB::InstInfo InstDB::_instInfoTable[] = { - /*--------------------+--------------------+------------------+--------+------------------+--------+----+----+------+----+----+ - | Instruction | Instruction | Main Opcode | EVEX |Alternative Opcode| EVEX |Op0X|Op1X|Name-X|IdxA|IdxB| - | Id & Name | Encoding | (pp+mmm|op/o|L|w|W|N|TT.)|--(pp+mmm|op/o|L|w|W|N|TT.)| (auto-generated) | - +---------------------+--------------------+---------+----+-+-+-+-+----+---------+----+-+-+-+-+----+----+----+------+----+---*/ + /*--------------------+--------------------+------------------+--------+------------------+--------+----+----+----+----+ + | Instruction | Instruction | Main Opcode | EVEX |Alternative Opcode| EVEX |Op0X|Op1X|IdxA|IdxB| + | Id & Name | Encoding | (pp+mmm|op/o|L|w|W|N|TT.)|--(pp+mmm|op/o|L|w|W|N|TT.)| (auto-generated) | + +---------------------+--------------------+---------+----+-+-+-+-+----+---------+----+-+-+-+-+----+----+----+----+---*/ // ${InstInfo:Begin} - INST(None , None , 0 , 0 , 0 , 0 , 0 , 0 , 0 ), // #0 - INST(Aaa , X86Op_xAX , O(000000,37,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 , 1 ), // #1 - INST(Aad , X86I_xAX , O(000000,D5,_,_,_,_,_,_ ), 0 , 0 , 0 , 5 , 2 , 1 ), // #2 - INST(Aam , X86I_xAX , O(000000,D4,_,_,_,_,_,_ ), 0 , 0 , 0 , 9 , 2 , 1 ), // #3 - INST(Aas , X86Op_xAX , O(000000,3F,_,_,_,_,_,_ ), 0 , 0 , 0 , 13 , 1 , 1 ), // #4 - INST(Adc , X86Arith , O(000000,10,2,_,x,_,_,_ ), 0 , 1 , 0 , 17 , 3 , 2 ), // #5 - INST(Adcx , X86Rm , O(660F38,F6,_,_,x,_,_,_ ), 0 , 2 , 0 , 21 , 4 , 3 ), // #6 - INST(Add , X86Arith , O(000000,00,0,_,x,_,_,_ ), 0 , 0 , 0 , 3146 , 3 , 1 ), // #7 - INST(Addpd , ExtRm , O(660F00,58,_,_,_,_,_,_ ), 0 , 3 , 0 , 5788 , 5 , 4 ), // #8 - INST(Addps , ExtRm , O(000F00,58,_,_,_,_,_,_ ), 0 , 4 , 0 , 5800 , 5 , 5 ), // #9 - INST(Addsd , ExtRm , O(F20F00,58,_,_,_,_,_,_ ), 0 , 5 , 0 , 6118 , 6 , 4 ), // #10 - INST(Addss , ExtRm , O(F30F00,58,_,_,_,_,_,_ ), 0 , 6 , 0 , 3283 , 7 , 5 ), // #11 - INST(Addsubpd , ExtRm , O(660F00,D0,_,_,_,_,_,_ ), 0 , 3 , 0 , 5410 , 5 , 6 ), // #12 - INST(Addsubps , ExtRm , O(F20F00,D0,_,_,_,_,_,_ ), 0 , 5 , 0 , 5422 , 5 , 6 ), // #13 - INST(Adox , X86Rm , O(F30F38,F6,_,_,x,_,_,_ ), 0 , 7 , 0 , 26 , 4 , 7 ), // #14 - INST(Aesdec , ExtRm , O(660F38,DE,_,_,_,_,_,_ ), 0 , 2 , 0 , 3352 , 5 , 8 ), // #15 - INST(Aesdeclast , ExtRm , O(660F38,DF,_,_,_,_,_,_ ), 0 , 2 , 0 , 3360 , 5 , 8 ), // #16 - INST(Aesenc , ExtRm , O(660F38,DC,_,_,_,_,_,_ ), 0 , 2 , 0 , 3372 , 5 , 8 ), // #17 - INST(Aesenclast , ExtRm , O(660F38,DD,_,_,_,_,_,_ ), 0 , 2 , 0 , 3380 , 5 , 8 ), // #18 - INST(Aesimc , ExtRm , O(660F38,DB,_,_,_,_,_,_ ), 0 , 2 , 0 , 3392 , 5 , 8 ), // #19 - INST(Aeskeygenassist , ExtRmi , O(660F3A,DF,_,_,_,_,_,_ ), 0 , 8 , 0 , 3400 , 8 , 8 ), // #20 - INST(And , X86Arith , O(000000,20,4,_,x,_,_,_ ), 0 , 9 , 0 , 2525 , 9 , 1 ), // #21 - INST(Andn , VexRvm_Wx , V(000F38,F2,_,0,x,_,_,_ ), 0 , 10 , 0 , 7789 , 10 , 9 ), // #22 - INST(Andnpd , ExtRm , O(660F00,55,_,_,_,_,_,_ ), 0 , 3 , 0 , 3433 , 5 , 4 ), // #23 - INST(Andnps , ExtRm , O(000F00,55,_,_,_,_,_,_ ), 0 , 4 , 0 , 3441 , 5 , 5 ), // #24 - INST(Andpd , ExtRm , O(660F00,54,_,_,_,_,_,_ ), 0 , 3 , 0 , 4745 , 11 , 4 ), // #25 - INST(Andps , ExtRm , O(000F00,54,_,_,_,_,_,_ ), 0 , 4 , 0 , 4755 , 11 , 5 ), // #26 - INST(Arpl , X86Mr_NoSize , O(000000,63,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 12 , 10 ), // #27 - INST(Bextr , VexRmv_Wx , V(000F38,F7,_,0,x,_,_,_ ), 0 , 10 , 0 , 36 , 13 , 9 ), // #28 - INST(Blcfill , VexVm_Wx , V(XOP_M9,01,1,0,x,_,_,_ ), 0 , 11 , 0 , 42 , 14 , 11 ), // #29 - INST(Blci , VexVm_Wx , V(XOP_M9,02,6,0,x,_,_,_ ), 0 , 12 , 0 , 50 , 14 , 11 ), // #30 - INST(Blcic , VexVm_Wx , V(XOP_M9,01,5,0,x,_,_,_ ), 0 , 13 , 0 , 55 , 14 , 11 ), // #31 - INST(Blcmsk , VexVm_Wx , V(XOP_M9,02,1,0,x,_,_,_ ), 0 , 11 , 0 , 61 , 14 , 11 ), // #32 - INST(Blcs , VexVm_Wx , V(XOP_M9,01,3,0,x,_,_,_ ), 0 , 14 , 0 , 68 , 14 , 11 ), // #33 - INST(Blendpd , ExtRmi , O(660F3A,0D,_,_,_,_,_,_ ), 0 , 8 , 0 , 3483 , 8 , 12 ), // #34 - INST(Blendps , ExtRmi , O(660F3A,0C,_,_,_,_,_,_ ), 0 , 8 , 0 , 3492 , 8 , 12 ), // #35 - INST(Blendvpd , ExtRm_XMM0 , O(660F38,15,_,_,_,_,_,_ ), 0 , 2 , 0 , 3501 , 15 , 12 ), // #36 - INST(Blendvps , ExtRm_XMM0 , O(660F38,14,_,_,_,_,_,_ ), 0 , 2 , 0 , 3511 , 15 , 12 ), // #37 - INST(Blsfill , VexVm_Wx , V(XOP_M9,01,2,0,x,_,_,_ ), 0 , 15 , 0 , 73 , 14 , 11 ), // #38 - INST(Blsi , VexVm_Wx , V(000F38,F3,3,0,x,_,_,_ ), 0 , 16 , 0 , 81 , 14 , 9 ), // #39 - INST(Blsic , VexVm_Wx , V(XOP_M9,01,6,0,x,_,_,_ ), 0 , 12 , 0 , 86 , 14 , 11 ), // #40 - INST(Blsmsk , VexVm_Wx , V(000F38,F3,2,0,x,_,_,_ ), 0 , 17 , 0 , 92 , 14 , 9 ), // #41 - INST(Blsr , VexVm_Wx , V(000F38,F3,1,0,x,_,_,_ ), 0 , 18 , 0 , 99 , 14 , 9 ), // #42 - INST(Bndcl , X86Rm , O(F30F00,1A,_,_,_,_,_,_ ), 0 , 6 , 0 , 104 , 16 , 13 ), // #43 - INST(Bndcn , X86Rm , O(F20F00,1B,_,_,_,_,_,_ ), 0 , 5 , 0 , 110 , 16 , 13 ), // #44 - INST(Bndcu , X86Rm , O(F20F00,1A,_,_,_,_,_,_ ), 0 , 5 , 0 , 116 , 16 , 13 ), // #45 - INST(Bndldx , X86Rm , O(000F00,1A,_,_,_,_,_,_ ), 0 , 4 , 0 , 122 , 17 , 13 ), // #46 - INST(Bndmk , X86Rm , O(F30F00,1B,_,_,_,_,_,_ ), 0 , 6 , 0 , 129 , 18 , 13 ), // #47 - INST(Bndmov , X86Bndmov , O(660F00,1A,_,_,_,_,_,_ ), O(660F00,1B,_,_,_,_,_,_ ), 3 , 1 , 135 , 19 , 13 ), // #48 - INST(Bndstx , X86Mr , O(000F00,1B,_,_,_,_,_,_ ), 0 , 4 , 0 , 142 , 20 , 13 ), // #49 - INST(Bound , X86Rm , O(000000,62,_,_,_,_,_,_ ), 0 , 0 , 0 , 149 , 21 , 0 ), // #50 - INST(Bsf , X86Rm , O(000F00,BC,_,_,x,_,_,_ ), 0 , 4 , 0 , 155 , 22 , 1 ), // #51 - INST(Bsr , X86Rm , O(000F00,BD,_,_,x,_,_,_ ), 0 , 4 , 0 , 159 , 22 , 1 ), // #52 - INST(Bswap , X86Bswap , O(000F00,C8,_,_,x,_,_,_ ), 0 , 4 , 0 , 163 , 23 , 0 ), // #53 - INST(Bt , X86Bt , O(000F00,A3,_,_,x,_,_,_ ), O(000F00,BA,4,_,x,_,_,_ ), 4 , 2 , 169 , 24 , 14 ), // #54 - INST(Btc , X86Bt , O(000F00,BB,_,_,x,_,_,_ ), O(000F00,BA,7,_,x,_,_,_ ), 4 , 3 , 172 , 25 , 14 ), // #55 - INST(Btr , X86Bt , O(000F00,B3,_,_,x,_,_,_ ), O(000F00,BA,6,_,x,_,_,_ ), 4 , 4 , 176 , 25 , 14 ), // #56 - INST(Bts , X86Bt , O(000F00,AB,_,_,x,_,_,_ ), O(000F00,BA,5,_,x,_,_,_ ), 4 , 5 , 180 , 25 , 14 ), // #57 - INST(Bzhi , VexRmv_Wx , V(000F38,F5,_,0,x,_,_,_ ), 0 , 10 , 0 , 184 , 13 , 15 ), // #58 - INST(Call , X86Call , O(000000,FF,2,_,_,_,_,_ ), 0 , 1 , 0 , 3038 , 26 , 1 ), // #59 - INST(Cbw , X86Op_xAX , O(660000,98,_,_,_,_,_,_ ), 0 , 19 , 0 , 189 , 27 , 0 ), // #60 - INST(Cdq , X86Op_xDX_xAX , O(000000,99,_,_,_,_,_,_ ), 0 , 0 , 0 , 193 , 28 , 0 ), // #61 - INST(Cdqe , X86Op_xAX , O(000000,98,_,_,1,_,_,_ ), 0 , 20 , 0 , 197 , 29 , 0 ), // #62 - INST(Clac , X86Op , O(000F01,CA,_,_,_,_,_,_ ), 0 , 21 , 0 , 202 , 30 , 16 ), // #63 - INST(Clc , X86Op , O(000000,F8,_,_,_,_,_,_ ), 0 , 0 , 0 , 207 , 30 , 17 ), // #64 - INST(Cld , X86Op , O(000000,FC,_,_,_,_,_,_ ), 0 , 0 , 0 , 211 , 30 , 18 ), // #65 - INST(Cldemote , X86M_Only , O(000F00,1C,0,_,_,_,_,_ ), 0 , 4 , 0 , 215 , 31 , 19 ), // #66 - INST(Clflush , X86M_Only , O(000F00,AE,7,_,_,_,_,_ ), 0 , 22 , 0 , 224 , 31 , 20 ), // #67 - INST(Clflushopt , X86M_Only , O(660F00,AE,7,_,_,_,_,_ ), 0 , 23 , 0 , 232 , 31 , 21 ), // #68 - INST(Clgi , X86Op , O(000F01,DD,_,_,_,_,_,_ ), 0 , 21 , 0 , 243 , 30 , 22 ), // #69 - INST(Cli , X86Op , O(000000,FA,_,_,_,_,_,_ ), 0 , 0 , 0 , 248 , 30 , 23 ), // #70 - INST(Clrssbsy , X86M_Only , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 24 , 0 , 252 , 32 , 24 ), // #71 - INST(Clts , X86Op , O(000F00,06,_,_,_,_,_,_ ), 0 , 4 , 0 , 261 , 30 , 0 ), // #72 - INST(Clui , X86Op , O(F30F01,EE,_,_,_,_,_,_ ), 0 , 25 , 0 , 266 , 33 , 25 ), // #73 - INST(Clwb , X86M_Only , O(660F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 271 , 31 , 26 ), // #74 - INST(Clzero , X86Op_MemZAX , O(000F01,FC,_,_,_,_,_,_ ), 0 , 21 , 0 , 276 , 34 , 27 ), // #75 - INST(Cmc , X86Op , O(000000,F5,_,_,_,_,_,_ ), 0 , 0 , 0 , 283 , 30 , 28 ), // #76 - INST(Cmova , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 4 , 0 , 287 , 22 , 29 ), // #77 - INST(Cmovae , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 4 , 0 , 293 , 22 , 30 ), // #78 - INST(Cmovb , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 4 , 0 , 648 , 22 , 30 ), // #79 - INST(Cmovbe , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 4 , 0 , 655 , 22 , 29 ), // #80 - INST(Cmovc , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 4 , 0 , 300 , 22 , 30 ), // #81 - INST(Cmove , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 4 , 0 , 663 , 22 , 31 ), // #82 - INST(Cmovg , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 4 , 0 , 306 , 22 , 32 ), // #83 - INST(Cmovge , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 4 , 0 , 312 , 22 , 33 ), // #84 - INST(Cmovl , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 4 , 0 , 319 , 22 , 33 ), // #85 - INST(Cmovle , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 4 , 0 , 325 , 22 , 32 ), // #86 - INST(Cmovna , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 4 , 0 , 332 , 22 , 29 ), // #87 - INST(Cmovnae , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 4 , 0 , 339 , 22 , 30 ), // #88 - INST(Cmovnb , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 4 , 0 , 670 , 22 , 30 ), // #89 - INST(Cmovnbe , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 4 , 0 , 678 , 22 , 29 ), // #90 - INST(Cmovnc , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 4 , 0 , 347 , 22 , 30 ), // #91 - INST(Cmovne , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 4 , 0 , 687 , 22 , 31 ), // #92 - INST(Cmovng , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 4 , 0 , 354 , 22 , 32 ), // #93 - INST(Cmovnge , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 4 , 0 , 361 , 22 , 33 ), // #94 - INST(Cmovnl , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 4 , 0 , 369 , 22 , 33 ), // #95 - INST(Cmovnle , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 4 , 0 , 376 , 22 , 32 ), // #96 - INST(Cmovno , X86Rm , O(000F00,41,_,_,x,_,_,_ ), 0 , 4 , 0 , 384 , 22 , 34 ), // #97 - INST(Cmovnp , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 4 , 0 , 391 , 22 , 35 ), // #98 - INST(Cmovns , X86Rm , O(000F00,49,_,_,x,_,_,_ ), 0 , 4 , 0 , 398 , 22 , 36 ), // #99 - INST(Cmovnz , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 4 , 0 , 405 , 22 , 31 ), // #100 - INST(Cmovo , X86Rm , O(000F00,40,_,_,x,_,_,_ ), 0 , 4 , 0 , 412 , 22 , 34 ), // #101 - INST(Cmovp , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 4 , 0 , 418 , 22 , 35 ), // #102 - INST(Cmovpe , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 4 , 0 , 424 , 22 , 35 ), // #103 - INST(Cmovpo , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 4 , 0 , 431 , 22 , 35 ), // #104 - INST(Cmovs , X86Rm , O(000F00,48,_,_,x,_,_,_ ), 0 , 4 , 0 , 438 , 22 , 36 ), // #105 - INST(Cmovz , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 4 , 0 , 444 , 22 , 31 ), // #106 - INST(Cmp , X86Arith , O(000000,38,7,_,x,_,_,_ ), 0 , 27 , 0 , 450 , 35 , 1 ), // #107 - INST(Cmppd , ExtRmi , O(660F00,C2,_,_,_,_,_,_ ), 0 , 3 , 0 , 3737 , 8 , 4 ), // #108 - INST(Cmpps , ExtRmi , O(000F00,C2,_,_,_,_,_,_ ), 0 , 4 , 0 , 3751 , 8 , 5 ), // #109 - INST(Cmps , X86StrMm , O(000000,A6,_,_,_,_,_,_ ), 0 , 0 , 0 , 454 , 36 , 37 ), // #110 - INST(Cmpsd , ExtRmi , O(F20F00,C2,_,_,_,_,_,_ ), 0 , 5 , 0 , 3758 , 37 , 4 ), // #111 - INST(Cmpss , ExtRmi , O(F30F00,C2,_,_,_,_,_,_ ), 0 , 6 , 0 , 3772 , 38 , 5 ), // #112 - INST(Cmpxchg , X86Cmpxchg , O(000F00,B0,_,_,x,_,_,_ ), 0 , 4 , 0 , 459 , 39 , 38 ), // #113 - INST(Cmpxchg16b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,1,_,_,_ ), 0 , 28 , 0 , 467 , 40 , 39 ), // #114 - INST(Cmpxchg8b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,_,_,_,_ ), 0 , 29 , 0 , 478 , 41 , 40 ), // #115 - INST(Comisd , ExtRm , O(660F00,2F,_,_,_,_,_,_ ), 0 , 3 , 0 , 11391, 6 , 41 ), // #116 - INST(Comiss , ExtRm , O(000F00,2F,_,_,_,_,_,_ ), 0 , 4 , 0 , 11409, 7 , 42 ), // #117 - INST(Cpuid , X86Op , O(000F00,A2,_,_,_,_,_,_ ), 0 , 4 , 0 , 488 , 42 , 43 ), // #118 - INST(Cqo , X86Op_xDX_xAX , O(000000,99,_,_,1,_,_,_ ), 0 , 20 , 0 , 494 , 43 , 0 ), // #119 - INST(Crc32 , X86Crc , O(F20F38,F0,_,_,x,_,_,_ ), 0 , 30 , 0 , 498 , 44 , 44 ), // #120 - INST(Cvtdq2pd , ExtRm , O(F30F00,E6,_,_,_,_,_,_ ), 0 , 6 , 0 , 3827 , 6 , 4 ), // #121 - INST(Cvtdq2ps , ExtRm , O(000F00,5B,_,_,_,_,_,_ ), 0 , 4 , 0 , 3847 , 5 , 4 ), // #122 - INST(Cvtpd2dq , ExtRm , O(F20F00,E6,_,_,_,_,_,_ ), 0 , 5 , 0 , 3886 , 5 , 4 ), // #123 - INST(Cvtpd2pi , ExtRm , O(660F00,2D,_,_,_,_,_,_ ), 0 , 3 , 0 , 504 , 45 , 4 ), // #124 - INST(Cvtpd2ps , ExtRm , O(660F00,5A,_,_,_,_,_,_ ), 0 , 3 , 0 , 3906 , 5 , 4 ), // #125 - INST(Cvtpi2pd , ExtRm , O(660F00,2A,_,_,_,_,_,_ ), 0 , 3 , 0 , 513 , 46 , 4 ), // #126 - INST(Cvtpi2ps , ExtRm , O(000F00,2A,_,_,_,_,_,_ ), 0 , 4 , 0 , 522 , 46 , 5 ), // #127 - INST(Cvtps2dq , ExtRm , O(660F00,5B,_,_,_,_,_,_ ), 0 , 3 , 0 , 4040 , 5 , 4 ), // #128 - INST(Cvtps2pd , ExtRm , O(000F00,5A,_,_,_,_,_,_ ), 0 , 4 , 0 , 4050 , 6 , 4 ), // #129 - INST(Cvtps2pi , ExtRm , O(000F00,2D,_,_,_,_,_,_ ), 0 , 4 , 0 , 531 , 47 , 5 ), // #130 - INST(Cvtsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2D,_,_,x,_,_,_ ), 0 , 5 , 0 , 4153 , 48 , 4 ), // #131 - INST(Cvtsd2ss , ExtRm , O(F20F00,5A,_,_,_,_,_,_ ), 0 , 5 , 0 , 4163 , 6 , 4 ), // #132 - INST(Cvtsi2sd , ExtRm_Wx , O(F20F00,2A,_,_,x,_,_,_ ), 0 , 5 , 0 , 4225 , 49 , 4 ), // #133 - INST(Cvtsi2ss , ExtRm_Wx , O(F30F00,2A,_,_,x,_,_,_ ), 0 , 6 , 0 , 4245 , 49 , 5 ), // #134 - INST(Cvtss2sd , ExtRm , O(F30F00,5A,_,_,_,_,_,_ ), 0 , 6 , 0 , 4255 , 7 , 4 ), // #135 - INST(Cvtss2si , ExtRm_Wx_GpqOnly , O(F30F00,2D,_,_,x,_,_,_ ), 0 , 6 , 0 , 4275 , 50 , 5 ), // #136 - INST(Cvttpd2dq , ExtRm , O(660F00,E6,_,_,_,_,_,_ ), 0 , 3 , 0 , 4296 , 5 , 4 ), // #137 - INST(Cvttpd2pi , ExtRm , O(660F00,2C,_,_,_,_,_,_ ), 0 , 3 , 0 , 540 , 45 , 4 ), // #138 - INST(Cvttps2dq , ExtRm , O(F30F00,5B,_,_,_,_,_,_ ), 0 , 6 , 0 , 4409 , 5 , 4 ), // #139 - INST(Cvttps2pi , ExtRm , O(000F00,2C,_,_,_,_,_,_ ), 0 , 4 , 0 , 550 , 47 , 5 ), // #140 - INST(Cvttsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2C,_,_,x,_,_,_ ), 0 , 5 , 0 , 4455 , 48 , 4 ), // #141 - INST(Cvttss2si , ExtRm_Wx_GpqOnly , O(F30F00,2C,_,_,x,_,_,_ ), 0 , 6 , 0 , 4501 , 50 , 5 ), // #142 - INST(Cwd , X86Op_xDX_xAX , O(660000,99,_,_,_,_,_,_ ), 0 , 19 , 0 , 560 , 51 , 0 ), // #143 - INST(Cwde , X86Op_xAX , O(000000,98,_,_,_,_,_,_ ), 0 , 0 , 0 , 564 , 52 , 0 ), // #144 - INST(Daa , X86Op , O(000000,27,_,_,_,_,_,_ ), 0 , 0 , 0 , 569 , 1 , 1 ), // #145 - INST(Das , X86Op , O(000000,2F,_,_,_,_,_,_ ), 0 , 0 , 0 , 573 , 1 , 1 ), // #146 - INST(Dec , X86IncDec , O(000000,FE,1,_,x,_,_,_ ), O(000000,48,_,_,x,_,_,_ ), 31 , 6 , 3355 , 53 , 45 ), // #147 - INST(Div , X86M_GPB_MulDiv , O(000000,F6,6,_,x,_,_,_ ), 0 , 32 , 0 , 810 , 54 , 1 ), // #148 - INST(Divpd , ExtRm , O(660F00,5E,_,_,_,_,_,_ ), 0 , 3 , 0 , 4652 , 5 , 4 ), // #149 - INST(Divps , ExtRm , O(000F00,5E,_,_,_,_,_,_ ), 0 , 4 , 0 , 4666 , 5 , 5 ), // #150 - INST(Divsd , ExtRm , O(F20F00,5E,_,_,_,_,_,_ ), 0 , 5 , 0 , 4673 , 6 , 4 ), // #151 - INST(Divss , ExtRm , O(F30F00,5E,_,_,_,_,_,_ ), 0 , 6 , 0 , 4687 , 7 , 5 ), // #152 - INST(Dppd , ExtRmi , O(660F3A,41,_,_,_,_,_,_ ), 0 , 8 , 0 , 4704 , 8 , 12 ), // #153 - INST(Dpps , ExtRmi , O(660F3A,40,_,_,_,_,_,_ ), 0 , 8 , 0 , 4710 , 8 , 12 ), // #154 - INST(Emms , X86Op , O(000F00,77,_,_,_,_,_,_ ), 0 , 4 , 0 , 778 , 55 , 46 ), // #155 - INST(Endbr32 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,3 ), 0 , 33 , 0 , 577 , 30 , 47 ), // #156 - INST(Endbr64 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,2 ), 0 , 34 , 0 , 585 , 30 , 47 ), // #157 - INST(Enqcmd , X86EnqcmdMovdir64b , O(F20F38,F8,_,_,_,_,_,_ ), 0 , 30 , 0 , 593 , 56 , 48 ), // #158 - INST(Enqcmds , X86EnqcmdMovdir64b , O(F30F38,F8,_,_,_,_,_,_ ), 0 , 7 , 0 , 600 , 56 , 48 ), // #159 - INST(Enter , X86Enter , O(000000,C8,_,_,_,_,_,_ ), 0 , 0 , 0 , 3046 , 57 , 0 ), // #160 - INST(Extractps , ExtExtract , O(660F3A,17,_,_,_,_,_,_ ), 0 , 8 , 0 , 4900 , 58 , 12 ), // #161 - INST(Extrq , ExtExtrq , O(660F00,79,_,_,_,_,_,_ ), O(660F00,78,0,_,_,_,_,_ ), 3 , 7 , 8625 , 59 , 49 ), // #162 - INST(F2xm1 , FpuOp , O_FPU(00,D9F0,_) , 0 , 35 , 0 , 608 , 30 , 0 ), // #163 - INST(Fabs , FpuOp , O_FPU(00,D9E1,_) , 0 , 35 , 0 , 614 , 30 , 0 ), // #164 - INST(Fadd , FpuArith , O_FPU(00,C0C0,0) , 0 , 36 , 0 , 2121 , 60 , 0 ), // #165 - INST(Faddp , FpuRDef , O_FPU(00,DEC0,_) , 0 , 37 , 0 , 619 , 61 , 0 ), // #166 - INST(Fbld , X86M_Only , O_FPU(00,00DF,4) , 0 , 38 , 0 , 625 , 62 , 0 ), // #167 - INST(Fbstp , X86M_Only , O_FPU(00,00DF,6) , 0 , 39 , 0 , 630 , 62 , 0 ), // #168 - INST(Fchs , FpuOp , O_FPU(00,D9E0,_) , 0 , 35 , 0 , 636 , 30 , 0 ), // #169 - INST(Fclex , FpuOp , O_FPU(9B,DBE2,_) , 0 , 40 , 0 , 641 , 30 , 0 ), // #170 - INST(Fcmovb , FpuR , O_FPU(00,DAC0,_) , 0 , 41 , 0 , 647 , 63 , 30 ), // #171 - INST(Fcmovbe , FpuR , O_FPU(00,DAD0,_) , 0 , 41 , 0 , 654 , 63 , 29 ), // #172 - INST(Fcmove , FpuR , O_FPU(00,DAC8,_) , 0 , 41 , 0 , 662 , 63 , 31 ), // #173 - INST(Fcmovnb , FpuR , O_FPU(00,DBC0,_) , 0 , 42 , 0 , 669 , 63 , 30 ), // #174 - INST(Fcmovnbe , FpuR , O_FPU(00,DBD0,_) , 0 , 42 , 0 , 677 , 63 , 29 ), // #175 - INST(Fcmovne , FpuR , O_FPU(00,DBC8,_) , 0 , 42 , 0 , 686 , 63 , 31 ), // #176 - INST(Fcmovnu , FpuR , O_FPU(00,DBD8,_) , 0 , 42 , 0 , 694 , 63 , 35 ), // #177 - INST(Fcmovu , FpuR , O_FPU(00,DAD8,_) , 0 , 41 , 0 , 702 , 63 , 35 ), // #178 - INST(Fcom , FpuCom , O_FPU(00,D0D0,2) , 0 , 43 , 0 , 709 , 64 , 0 ), // #179 - INST(Fcomi , FpuR , O_FPU(00,DBF0,_) , 0 , 42 , 0 , 714 , 63 , 50 ), // #180 - INST(Fcomip , FpuR , O_FPU(00,DFF0,_) , 0 , 44 , 0 , 720 , 63 , 50 ), // #181 - INST(Fcomp , FpuCom , O_FPU(00,D8D8,3) , 0 , 45 , 0 , 727 , 64 , 0 ), // #182 - INST(Fcompp , FpuOp , O_FPU(00,DED9,_) , 0 , 37 , 0 , 733 , 30 , 0 ), // #183 - INST(Fcos , FpuOp , O_FPU(00,D9FF,_) , 0 , 35 , 0 , 740 , 30 , 0 ), // #184 - INST(Fdecstp , FpuOp , O_FPU(00,D9F6,_) , 0 , 35 , 0 , 745 , 30 , 0 ), // #185 - INST(Fdiv , FpuArith , O_FPU(00,F0F8,6) , 0 , 46 , 0 , 753 , 60 , 0 ), // #186 - INST(Fdivp , FpuRDef , O_FPU(00,DEF8,_) , 0 , 37 , 0 , 758 , 61 , 0 ), // #187 - INST(Fdivr , FpuArith , O_FPU(00,F8F0,7) , 0 , 47 , 0 , 764 , 60 , 0 ), // #188 - INST(Fdivrp , FpuRDef , O_FPU(00,DEF0,_) , 0 , 37 , 0 , 770 , 61 , 0 ), // #189 - INST(Femms , X86Op , O(000F00,0E,_,_,_,_,_,_ ), 0 , 4 , 0 , 777 , 30 , 51 ), // #190 - INST(Ffree , FpuR , O_FPU(00,DDC0,_) , 0 , 48 , 0 , 783 , 63 , 0 ), // #191 - INST(Fiadd , FpuM , O_FPU(00,00DA,0) , 0 , 49 , 0 , 789 , 65 , 0 ), // #192 - INST(Ficom , FpuM , O_FPU(00,00DA,2) , 0 , 50 , 0 , 795 , 65 , 0 ), // #193 - INST(Ficomp , FpuM , O_FPU(00,00DA,3) , 0 , 51 , 0 , 801 , 65 , 0 ), // #194 - INST(Fidiv , FpuM , O_FPU(00,00DA,6) , 0 , 39 , 0 , 808 , 65 , 0 ), // #195 - INST(Fidivr , FpuM , O_FPU(00,00DA,7) , 0 , 52 , 0 , 814 , 65 , 0 ), // #196 - INST(Fild , FpuM , O_FPU(00,00DB,0) , O_FPU(00,00DF,5) , 49 , 8 , 821 , 66 , 0 ), // #197 - INST(Fimul , FpuM , O_FPU(00,00DA,1) , 0 , 53 , 0 , 826 , 65 , 0 ), // #198 - INST(Fincstp , FpuOp , O_FPU(00,D9F7,_) , 0 , 35 , 0 , 832 , 30 , 0 ), // #199 - INST(Finit , FpuOp , O_FPU(9B,DBE3,_) , 0 , 40 , 0 , 840 , 30 , 0 ), // #200 - INST(Fist , FpuM , O_FPU(00,00DB,2) , 0 , 50 , 0 , 846 , 65 , 0 ), // #201 - INST(Fistp , FpuM , O_FPU(00,00DB,3) , O_FPU(00,00DF,7) , 51 , 9 , 851 , 66 , 0 ), // #202 - INST(Fisttp , FpuM , O_FPU(00,00DB,1) , O_FPU(00,00DD,1) , 53 , 10 , 857 , 66 , 6 ), // #203 - INST(Fisub , FpuM , O_FPU(00,00DA,4) , 0 , 38 , 0 , 864 , 65 , 0 ), // #204 - INST(Fisubr , FpuM , O_FPU(00,00DA,5) , 0 , 54 , 0 , 870 , 65 , 0 ), // #205 - INST(Fld , FpuFldFst , O_FPU(00,00D9,0) , O_FPU(00,00DB,5) , 49 , 11 , 877 , 67 , 0 ), // #206 - INST(Fld1 , FpuOp , O_FPU(00,D9E8,_) , 0 , 35 , 0 , 881 , 30 , 0 ), // #207 - INST(Fldcw , X86M_Only , O_FPU(00,00D9,5) , 0 , 54 , 0 , 886 , 68 , 0 ), // #208 - INST(Fldenv , X86M_Only , O_FPU(00,00D9,4) , 0 , 38 , 0 , 892 , 69 , 0 ), // #209 - INST(Fldl2e , FpuOp , O_FPU(00,D9EA,_) , 0 , 35 , 0 , 899 , 30 , 0 ), // #210 - INST(Fldl2t , FpuOp , O_FPU(00,D9E9,_) , 0 , 35 , 0 , 906 , 30 , 0 ), // #211 - INST(Fldlg2 , FpuOp , O_FPU(00,D9EC,_) , 0 , 35 , 0 , 913 , 30 , 0 ), // #212 - INST(Fldln2 , FpuOp , O_FPU(00,D9ED,_) , 0 , 35 , 0 , 920 , 30 , 0 ), // #213 - INST(Fldpi , FpuOp , O_FPU(00,D9EB,_) , 0 , 35 , 0 , 927 , 30 , 0 ), // #214 - INST(Fldz , FpuOp , O_FPU(00,D9EE,_) , 0 , 35 , 0 , 933 , 30 , 0 ), // #215 - INST(Fmul , FpuArith , O_FPU(00,C8C8,1) , 0 , 55 , 0 , 2163 , 60 , 0 ), // #216 - INST(Fmulp , FpuRDef , O_FPU(00,DEC8,_) , 0 , 37 , 0 , 938 , 61 , 0 ), // #217 - INST(Fnclex , FpuOp , O_FPU(00,DBE2,_) , 0 , 42 , 0 , 944 , 30 , 0 ), // #218 - INST(Fninit , FpuOp , O_FPU(00,DBE3,_) , 0 , 42 , 0 , 951 , 30 , 0 ), // #219 - INST(Fnop , FpuOp , O_FPU(00,D9D0,_) , 0 , 35 , 0 , 958 , 30 , 0 ), // #220 - INST(Fnsave , X86M_Only , O_FPU(00,00DD,6) , 0 , 39 , 0 , 963 , 69 , 0 ), // #221 - INST(Fnstcw , X86M_Only , O_FPU(00,00D9,7) , 0 , 52 , 0 , 970 , 68 , 0 ), // #222 - INST(Fnstenv , X86M_Only , O_FPU(00,00D9,6) , 0 , 39 , 0 , 977 , 69 , 0 ), // #223 - INST(Fnstsw , FpuStsw , O_FPU(00,00DD,7) , O_FPU(00,DFE0,_) , 52 , 12 , 985 , 70 , 0 ), // #224 - INST(Fpatan , FpuOp , O_FPU(00,D9F3,_) , 0 , 35 , 0 , 992 , 30 , 0 ), // #225 - INST(Fprem , FpuOp , O_FPU(00,D9F8,_) , 0 , 35 , 0 , 999 , 30 , 0 ), // #226 - INST(Fprem1 , FpuOp , O_FPU(00,D9F5,_) , 0 , 35 , 0 , 1005 , 30 , 0 ), // #227 - INST(Fptan , FpuOp , O_FPU(00,D9F2,_) , 0 , 35 , 0 , 1012 , 30 , 0 ), // #228 - INST(Frndint , FpuOp , O_FPU(00,D9FC,_) , 0 , 35 , 0 , 1018 , 30 , 0 ), // #229 - INST(Frstor , X86M_Only , O_FPU(00,00DD,4) , 0 , 38 , 0 , 1026 , 69 , 0 ), // #230 - INST(Fsave , X86M_Only , O_FPU(9B,00DD,6) , 0 , 56 , 0 , 1033 , 69 , 0 ), // #231 - INST(Fscale , FpuOp , O_FPU(00,D9FD,_) , 0 , 35 , 0 , 1039 , 30 , 0 ), // #232 - INST(Fsin , FpuOp , O_FPU(00,D9FE,_) , 0 , 35 , 0 , 1046 , 30 , 0 ), // #233 - INST(Fsincos , FpuOp , O_FPU(00,D9FB,_) , 0 , 35 , 0 , 1051 , 30 , 0 ), // #234 - INST(Fsqrt , FpuOp , O_FPU(00,D9FA,_) , 0 , 35 , 0 , 1059 , 30 , 0 ), // #235 - INST(Fst , FpuFldFst , O_FPU(00,00D9,2) , 0 , 50 , 0 , 1065 , 71 , 0 ), // #236 - INST(Fstcw , X86M_Only , O_FPU(9B,00D9,7) , 0 , 57 , 0 , 1069 , 68 , 0 ), // #237 - INST(Fstenv , X86M_Only , O_FPU(9B,00D9,6) , 0 , 56 , 0 , 1075 , 69 , 0 ), // #238 - INST(Fstp , FpuFldFst , O_FPU(00,00D9,3) , O(000000,DB,7,_,_,_,_,_ ), 51 , 13 , 1082 , 67 , 0 ), // #239 - INST(Fstsw , FpuStsw , O_FPU(9B,00DD,7) , O_FPU(9B,DFE0,_) , 57 , 14 , 1087 , 70 , 0 ), // #240 - INST(Fsub , FpuArith , O_FPU(00,E0E8,4) , 0 , 58 , 0 , 2241 , 60 , 0 ), // #241 - INST(Fsubp , FpuRDef , O_FPU(00,DEE8,_) , 0 , 37 , 0 , 1093 , 61 , 0 ), // #242 - INST(Fsubr , FpuArith , O_FPU(00,E8E0,5) , 0 , 59 , 0 , 2247 , 60 , 0 ), // #243 - INST(Fsubrp , FpuRDef , O_FPU(00,DEE0,_) , 0 , 37 , 0 , 1099 , 61 , 0 ), // #244 - INST(Ftst , FpuOp , O_FPU(00,D9E4,_) , 0 , 35 , 0 , 1106 , 30 , 0 ), // #245 - INST(Fucom , FpuRDef , O_FPU(00,DDE0,_) , 0 , 48 , 0 , 1111 , 61 , 0 ), // #246 - INST(Fucomi , FpuR , O_FPU(00,DBE8,_) , 0 , 42 , 0 , 1117 , 63 , 50 ), // #247 - INST(Fucomip , FpuR , O_FPU(00,DFE8,_) , 0 , 44 , 0 , 1124 , 63 , 50 ), // #248 - INST(Fucomp , FpuRDef , O_FPU(00,DDE8,_) , 0 , 48 , 0 , 1132 , 61 , 0 ), // #249 - INST(Fucompp , FpuOp , O_FPU(00,DAE9,_) , 0 , 41 , 0 , 1139 , 30 , 0 ), // #250 - INST(Fwait , X86Op , O_FPU(00,009B,_) , 0 , 49 , 0 , 1147 , 30 , 0 ), // #251 - INST(Fxam , FpuOp , O_FPU(00,D9E5,_) , 0 , 35 , 0 , 1153 , 30 , 0 ), // #252 - INST(Fxch , FpuR , O_FPU(00,D9C8,_) , 0 , 35 , 0 , 1158 , 61 , 0 ), // #253 - INST(Fxrstor , X86M_Only , O(000F00,AE,1,_,_,_,_,_ ), 0 , 29 , 0 , 1163 , 69 , 52 ), // #254 - INST(Fxrstor64 , X86M_Only , O(000F00,AE,1,_,1,_,_,_ ), 0 , 28 , 0 , 1171 , 72 , 52 ), // #255 - INST(Fxsave , X86M_Only , O(000F00,AE,0,_,_,_,_,_ ), 0 , 4 , 0 , 1181 , 69 , 52 ), // #256 - INST(Fxsave64 , X86M_Only , O(000F00,AE,0,_,1,_,_,_ ), 0 , 60 , 0 , 1188 , 72 , 52 ), // #257 - INST(Fxtract , FpuOp , O_FPU(00,D9F4,_) , 0 , 35 , 0 , 1197 , 30 , 0 ), // #258 - INST(Fyl2x , FpuOp , O_FPU(00,D9F1,_) , 0 , 35 , 0 , 1205 , 30 , 0 ), // #259 - INST(Fyl2xp1 , FpuOp , O_FPU(00,D9F9,_) , 0 , 35 , 0 , 1211 , 30 , 0 ), // #260 - INST(Getsec , X86Op , O(000F00,37,_,_,_,_,_,_ ), 0 , 4 , 0 , 1219 , 30 , 53 ), // #261 - INST(Gf2p8affineinvqb , ExtRmi , O(660F3A,CF,_,_,_,_,_,_ ), 0 , 8 , 0 , 6789 , 8 , 54 ), // #262 - INST(Gf2p8affineqb , ExtRmi , O(660F3A,CE,_,_,_,_,_,_ ), 0 , 8 , 0 , 6807 , 8 , 54 ), // #263 - INST(Gf2p8mulb , ExtRm , O(660F38,CF,_,_,_,_,_,_ ), 0 , 2 , 0 , 6822 , 5 , 54 ), // #264 - INST(Haddpd , ExtRm , O(660F00,7C,_,_,_,_,_,_ ), 0 , 3 , 0 , 6833 , 5 , 6 ), // #265 - INST(Haddps , ExtRm , O(F20F00,7C,_,_,_,_,_,_ ), 0 , 5 , 0 , 6841 , 5 , 6 ), // #266 - INST(Hlt , X86Op , O(000000,F4,_,_,_,_,_,_ ), 0 , 0 , 0 , 1226 , 30 , 0 ), // #267 - INST(Hreset , X86Op_Mod11RM_I8 , O(F30F3A,F0,0,_,_,_,_,_ ), 0 , 61 , 0 , 1230 , 73 , 55 ), // #268 - INST(Hsubpd , ExtRm , O(660F00,7D,_,_,_,_,_,_ ), 0 , 3 , 0 , 6849 , 5 , 6 ), // #269 - INST(Hsubps , ExtRm , O(F20F00,7D,_,_,_,_,_,_ ), 0 , 5 , 0 , 6857 , 5 , 6 ), // #270 - INST(Idiv , X86M_GPB_MulDiv , O(000000,F6,7,_,x,_,_,_ ), 0 , 27 , 0 , 809 , 54 , 1 ), // #271 - INST(Imul , X86Imul , O(000000,F6,5,_,x,_,_,_ ), 0 , 62 , 0 , 827 , 74 , 1 ), // #272 - INST(In , X86In , O(000000,EC,_,_,_,_,_,_ ), O(000000,E4,_,_,_,_,_,_ ), 0 , 15 , 11572, 75 , 0 ), // #273 - INST(Inc , X86IncDec , O(000000,FE,0,_,x,_,_,_ ), O(000000,40,_,_,x,_,_,_ ), 0 , 16 , 1237 , 53 , 45 ), // #274 - INST(Incsspd , X86M , O(F30F00,AE,5,_,0,_,_,_ ), 0 , 63 , 0 , 1241 , 76 , 56 ), // #275 - INST(Incsspq , X86M , O(F30F00,AE,5,_,1,_,_,_ ), 0 , 64 , 0 , 1249 , 77 , 56 ), // #276 - INST(Ins , X86Ins , O(000000,6C,_,_,_,_,_,_ ), 0 , 0 , 0 , 1916 , 78 , 0 ), // #277 - INST(Insertps , ExtRmi , O(660F3A,21,_,_,_,_,_,_ ), 0 , 8 , 0 , 6993 , 38 , 12 ), // #278 - INST(Insertq , ExtInsertq , O(F20F00,79,_,_,_,_,_,_ ), O(F20F00,78,_,_,_,_,_,_ ), 5 , 17 , 1257 , 79 , 49 ), // #279 - INST(Int , X86Int , O(000000,CD,_,_,_,_,_,_ ), 0 , 0 , 0 , 1022 , 80 , 0 ), // #280 - INST(Int3 , X86Op , O(000000,CC,_,_,_,_,_,_ ), 0 , 0 , 0 , 1265 , 30 , 0 ), // #281 - INST(Into , X86Op , O(000000,CE,_,_,_,_,_,_ ), 0 , 0 , 0 , 1270 , 81 , 57 ), // #282 - INST(Invd , X86Op , O(000F00,08,_,_,_,_,_,_ ), 0 , 4 , 0 , 11501, 30 , 43 ), // #283 - INST(Invept , X86Rm_NoSize , O(660F38,80,_,_,_,_,_,_ ), 0 , 2 , 0 , 1275 , 82 , 58 ), // #284 - INST(Invlpg , X86M_Only , O(000F00,01,7,_,_,_,_,_ ), 0 , 22 , 0 , 1282 , 69 , 43 ), // #285 - INST(Invlpga , X86Op_xAddr , O(000F01,DF,_,_,_,_,_,_ ), 0 , 21 , 0 , 1289 , 83 , 22 ), // #286 - INST(Invpcid , X86Rm_NoSize , O(660F38,82,_,_,_,_,_,_ ), 0 , 2 , 0 , 1297 , 82 , 43 ), // #287 - INST(Invvpid , X86Rm_NoSize , O(660F38,81,_,_,_,_,_,_ ), 0 , 2 , 0 , 1305 , 82 , 58 ), // #288 - INST(Iret , X86Op , O(660000,CF,_,_,_,_,_,_ ), 0 , 19 , 0 , 3226 , 84 , 1 ), // #289 - INST(Iretd , X86Op , O(000000,CF,_,_,_,_,_,_ ), 0 , 0 , 0 , 1313 , 84 , 1 ), // #290 - INST(Iretq , X86Op , O(000000,CF,_,_,1,_,_,_ ), 0 , 20 , 0 , 1319 , 85 , 1 ), // #291 - INST(Ja , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 4 , 18 , 1325 , 86 , 59 ), // #292 - INST(Jae , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 4 , 19 , 1328 , 86 , 60 ), // #293 - INST(Jb , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 4 , 20 , 1332 , 86 , 60 ), // #294 - INST(Jbe , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 4 , 21 , 1335 , 86 , 59 ), // #295 - INST(Jc , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 4 , 20 , 1339 , 86 , 60 ), // #296 - INST(Je , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 4 , 22 , 1342 , 86 , 61 ), // #297 - INST(Jecxz , X86JecxzLoop , 0 , O(000000,E3,_,_,_,_,_,_ ), 0 , 23 , 1345 , 87 , 0 ), // #298 - INST(Jg , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 4 , 24 , 1351 , 86 , 62 ), // #299 - INST(Jge , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 4 , 25 , 1354 , 86 , 63 ), // #300 - INST(Jl , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 4 , 26 , 1358 , 86 , 63 ), // #301 - INST(Jle , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 4 , 27 , 1361 , 86 , 62 ), // #302 - INST(Jmp , X86Jmp , O(000000,FF,4,_,_,_,_,_ ), O(000000,EB,_,_,_,_,_,_ ), 9 , 28 , 1861 , 88 , 0 ), // #303 - INST(Jna , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 4 , 21 , 1365 , 86 , 59 ), // #304 - INST(Jnae , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 4 , 20 , 1369 , 86 , 60 ), // #305 - INST(Jnb , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 4 , 19 , 1374 , 86 , 60 ), // #306 - INST(Jnbe , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 4 , 18 , 1378 , 86 , 59 ), // #307 - INST(Jnc , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 4 , 19 , 1383 , 86 , 60 ), // #308 - INST(Jne , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 4 , 29 , 1387 , 86 , 61 ), // #309 - INST(Jng , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 4 , 27 , 1391 , 86 , 62 ), // #310 - INST(Jnge , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 4 , 26 , 1395 , 86 , 63 ), // #311 - INST(Jnl , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 4 , 25 , 1400 , 86 , 63 ), // #312 - INST(Jnle , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 4 , 24 , 1404 , 86 , 62 ), // #313 - INST(Jno , X86Jcc , O(000F00,81,_,_,_,_,_,_ ), O(000000,71,_,_,_,_,_,_ ), 4 , 30 , 1409 , 86 , 57 ), // #314 - INST(Jnp , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 4 , 31 , 1413 , 86 , 64 ), // #315 - INST(Jns , X86Jcc , O(000F00,89,_,_,_,_,_,_ ), O(000000,79,_,_,_,_,_,_ ), 4 , 32 , 1417 , 86 , 65 ), // #316 - INST(Jnz , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 4 , 29 , 1421 , 86 , 61 ), // #317 - INST(Jo , X86Jcc , O(000F00,80,_,_,_,_,_,_ ), O(000000,70,_,_,_,_,_,_ ), 4 , 33 , 1425 , 86 , 57 ), // #318 - INST(Jp , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 4 , 34 , 1428 , 86 , 64 ), // #319 - INST(Jpe , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 4 , 34 , 1431 , 86 , 64 ), // #320 - INST(Jpo , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 4 , 31 , 1435 , 86 , 64 ), // #321 - INST(Js , X86Jcc , O(000F00,88,_,_,_,_,_,_ ), O(000000,78,_,_,_,_,_,_ ), 4 , 35 , 1439 , 86 , 65 ), // #322 - INST(Jz , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 4 , 22 , 1442 , 86 , 61 ), // #323 - INST(Kaddb , VexRvm , V(660F00,4A,_,1,0,_,_,_ ), 0 , 65 , 0 , 1445 , 89 , 66 ), // #324 - INST(Kaddd , VexRvm , V(660F00,4A,_,1,1,_,_,_ ), 0 , 66 , 0 , 1451 , 89 , 67 ), // #325 - INST(Kaddq , VexRvm , V(000F00,4A,_,1,1,_,_,_ ), 0 , 67 , 0 , 1457 , 89 , 67 ), // #326 - INST(Kaddw , VexRvm , V(000F00,4A,_,1,0,_,_,_ ), 0 , 68 , 0 , 1463 , 89 , 66 ), // #327 - INST(Kandb , VexRvm , V(660F00,41,_,1,0,_,_,_ ), 0 , 65 , 0 , 1469 , 89 , 66 ), // #328 - INST(Kandd , VexRvm , V(660F00,41,_,1,1,_,_,_ ), 0 , 66 , 0 , 1475 , 89 , 67 ), // #329 - INST(Kandnb , VexRvm , V(660F00,42,_,1,0,_,_,_ ), 0 , 65 , 0 , 1481 , 89 , 66 ), // #330 - INST(Kandnd , VexRvm , V(660F00,42,_,1,1,_,_,_ ), 0 , 66 , 0 , 1488 , 89 , 67 ), // #331 - INST(Kandnq , VexRvm , V(000F00,42,_,1,1,_,_,_ ), 0 , 67 , 0 , 1495 , 89 , 67 ), // #332 - INST(Kandnw , VexRvm , V(000F00,42,_,1,0,_,_,_ ), 0 , 68 , 0 , 1502 , 89 , 68 ), // #333 - INST(Kandq , VexRvm , V(000F00,41,_,1,1,_,_,_ ), 0 , 67 , 0 , 1509 , 89 , 67 ), // #334 - INST(Kandw , VexRvm , V(000F00,41,_,1,0,_,_,_ ), 0 , 68 , 0 , 1515 , 89 , 68 ), // #335 - INST(Kmovb , VexKmov , V(660F00,90,_,0,0,_,_,_ ), V(660F00,92,_,0,0,_,_,_ ), 69 , 36 , 1521 , 90 , 69 ), // #336 - INST(Kmovd , VexKmov , V(660F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,0,_,_,_ ), 70 , 37 , 9105 , 91 , 70 ), // #337 - INST(Kmovq , VexKmov , V(000F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,1,_,_,_ ), 71 , 38 , 9116 , 92 , 70 ), // #338 - INST(Kmovw , VexKmov , V(000F00,90,_,0,0,_,_,_ ), V(000F00,92,_,0,0,_,_,_ ), 72 , 39 , 1527 , 93 , 71 ), // #339 - INST(Knotb , VexRm , V(660F00,44,_,0,0,_,_,_ ), 0 , 69 , 0 , 1533 , 94 , 66 ), // #340 - INST(Knotd , VexRm , V(660F00,44,_,0,1,_,_,_ ), 0 , 70 , 0 , 1539 , 94 , 67 ), // #341 - INST(Knotq , VexRm , V(000F00,44,_,0,1,_,_,_ ), 0 , 71 , 0 , 1545 , 94 , 67 ), // #342 - INST(Knotw , VexRm , V(000F00,44,_,0,0,_,_,_ ), 0 , 72 , 0 , 1551 , 94 , 68 ), // #343 - INST(Korb , VexRvm , V(660F00,45,_,1,0,_,_,_ ), 0 , 65 , 0 , 1557 , 89 , 66 ), // #344 - INST(Kord , VexRvm , V(660F00,45,_,1,1,_,_,_ ), 0 , 66 , 0 , 1562 , 89 , 67 ), // #345 - INST(Korq , VexRvm , V(000F00,45,_,1,1,_,_,_ ), 0 , 67 , 0 , 1567 , 89 , 67 ), // #346 - INST(Kortestb , VexRm , V(660F00,98,_,0,0,_,_,_ ), 0 , 69 , 0 , 1572 , 94 , 72 ), // #347 - INST(Kortestd , VexRm , V(660F00,98,_,0,1,_,_,_ ), 0 , 70 , 0 , 1581 , 94 , 73 ), // #348 - INST(Kortestq , VexRm , V(000F00,98,_,0,1,_,_,_ ), 0 , 71 , 0 , 1590 , 94 , 73 ), // #349 - INST(Kortestw , VexRm , V(000F00,98,_,0,0,_,_,_ ), 0 , 72 , 0 , 1599 , 94 , 74 ), // #350 - INST(Korw , VexRvm , V(000F00,45,_,1,0,_,_,_ ), 0 , 68 , 0 , 1608 , 89 , 68 ), // #351 - INST(Kshiftlb , VexRmi , V(660F3A,32,_,0,0,_,_,_ ), 0 , 73 , 0 , 1613 , 95 , 66 ), // #352 - INST(Kshiftld , VexRmi , V(660F3A,33,_,0,0,_,_,_ ), 0 , 73 , 0 , 1622 , 95 , 67 ), // #353 - INST(Kshiftlq , VexRmi , V(660F3A,33,_,0,1,_,_,_ ), 0 , 74 , 0 , 1631 , 95 , 67 ), // #354 - INST(Kshiftlw , VexRmi , V(660F3A,32,_,0,1,_,_,_ ), 0 , 74 , 0 , 1640 , 95 , 68 ), // #355 - INST(Kshiftrb , VexRmi , V(660F3A,30,_,0,0,_,_,_ ), 0 , 73 , 0 , 1649 , 95 , 66 ), // #356 - INST(Kshiftrd , VexRmi , V(660F3A,31,_,0,0,_,_,_ ), 0 , 73 , 0 , 1658 , 95 , 67 ), // #357 - INST(Kshiftrq , VexRmi , V(660F3A,31,_,0,1,_,_,_ ), 0 , 74 , 0 , 1667 , 95 , 67 ), // #358 - INST(Kshiftrw , VexRmi , V(660F3A,30,_,0,1,_,_,_ ), 0 , 74 , 0 , 1676 , 95 , 68 ), // #359 - INST(Ktestb , VexRm , V(660F00,99,_,0,0,_,_,_ ), 0 , 69 , 0 , 1685 , 94 , 72 ), // #360 - INST(Ktestd , VexRm , V(660F00,99,_,0,1,_,_,_ ), 0 , 70 , 0 , 1692 , 94 , 73 ), // #361 - INST(Ktestq , VexRm , V(000F00,99,_,0,1,_,_,_ ), 0 , 71 , 0 , 1699 , 94 , 73 ), // #362 - INST(Ktestw , VexRm , V(000F00,99,_,0,0,_,_,_ ), 0 , 72 , 0 , 1706 , 94 , 72 ), // #363 - INST(Kunpckbw , VexRvm , V(660F00,4B,_,1,0,_,_,_ ), 0 , 65 , 0 , 1713 , 89 , 68 ), // #364 - INST(Kunpckdq , VexRvm , V(000F00,4B,_,1,1,_,_,_ ), 0 , 67 , 0 , 1722 , 89 , 67 ), // #365 - INST(Kunpckwd , VexRvm , V(000F00,4B,_,1,0,_,_,_ ), 0 , 68 , 0 , 1731 , 89 , 67 ), // #366 - INST(Kxnorb , VexRvm , V(660F00,46,_,1,0,_,_,_ ), 0 , 65 , 0 , 1740 , 96 , 66 ), // #367 - INST(Kxnord , VexRvm , V(660F00,46,_,1,1,_,_,_ ), 0 , 66 , 0 , 1747 , 96 , 67 ), // #368 - INST(Kxnorq , VexRvm , V(000F00,46,_,1,1,_,_,_ ), 0 , 67 , 0 , 1754 , 96 , 67 ), // #369 - INST(Kxnorw , VexRvm , V(000F00,46,_,1,0,_,_,_ ), 0 , 68 , 0 , 1761 , 96 , 68 ), // #370 - INST(Kxorb , VexRvm , V(660F00,47,_,1,0,_,_,_ ), 0 , 65 , 0 , 1768 , 96 , 66 ), // #371 - INST(Kxord , VexRvm , V(660F00,47,_,1,1,_,_,_ ), 0 , 66 , 0 , 1774 , 96 , 67 ), // #372 - INST(Kxorq , VexRvm , V(000F00,47,_,1,1,_,_,_ ), 0 , 67 , 0 , 1780 , 96 , 67 ), // #373 - INST(Kxorw , VexRvm , V(000F00,47,_,1,0,_,_,_ ), 0 , 68 , 0 , 1786 , 96 , 68 ), // #374 - INST(Lahf , X86Op , O(000000,9F,_,_,_,_,_,_ ), 0 , 0 , 0 , 1792 , 97 , 75 ), // #375 - INST(Lar , X86Rm , O(000F00,02,_,_,_,_,_,_ ), 0 , 4 , 0 , 1797 , 98 , 10 ), // #376 - INST(Lcall , X86LcallLjmp , O(000000,FF,3,_,_,_,_,_ ), O(000000,9A,_,_,_,_,_,_ ), 75 , 40 , 1801 , 99 , 1 ), // #377 - INST(Lddqu , ExtRm , O(F20F00,F0,_,_,_,_,_,_ ), 0 , 5 , 0 , 7003 , 100, 6 ), // #378 - INST(Ldmxcsr , X86M_Only , O(000F00,AE,2,_,_,_,_,_ ), 0 , 76 , 0 , 7010 , 101, 5 ), // #379 - INST(Lds , X86Rm , O(000000,C5,_,_,_,_,_,_ ), 0 , 0 , 0 , 1807 , 102, 0 ), // #380 - INST(Ldtilecfg , AmxCfg , V(000F38,49,_,0,0,_,_,_ ), 0 , 10 , 0 , 1811 , 103, 76 ), // #381 - INST(Lea , X86Lea , O(000000,8D,_,_,x,_,_,_ ), 0 , 0 , 0 , 1821 , 104, 0 ), // #382 - INST(Leave , X86Op , O(000000,C9,_,_,_,_,_,_ ), 0 , 0 , 0 , 1825 , 30 , 0 ), // #383 - INST(Les , X86Rm , O(000000,C4,_,_,_,_,_,_ ), 0 , 0 , 0 , 1831 , 102, 0 ), // #384 - INST(Lfence , X86Fence , O(000F00,AE,5,_,_,_,_,_ ), 0 , 77 , 0 , 1835 , 30 , 4 ), // #385 - INST(Lfs , X86Rm , O(000F00,B4,_,_,_,_,_,_ ), 0 , 4 , 0 , 1842 , 105, 0 ), // #386 - INST(Lgdt , X86M_Only , O(000F00,01,2,_,_,_,_,_ ), 0 , 76 , 0 , 1846 , 69 , 0 ), // #387 - INST(Lgs , X86Rm , O(000F00,B5,_,_,_,_,_,_ ), 0 , 4 , 0 , 1851 , 105, 0 ), // #388 - INST(Lidt , X86M_Only , O(000F00,01,3,_,_,_,_,_ ), 0 , 78 , 0 , 1855 , 69 , 0 ), // #389 - INST(Ljmp , X86LcallLjmp , O(000000,FF,5,_,_,_,_,_ ), O(000000,EA,_,_,_,_,_,_ ), 62 , 41 , 1860 , 106, 0 ), // #390 - INST(Lldt , X86M_NoSize , O(000F00,00,2,_,_,_,_,_ ), 0 , 76 , 0 , 1865 , 107, 0 ), // #391 - INST(Llwpcb , VexR_Wx , V(XOP_M9,12,0,0,x,_,_,_ ), 0 , 79 , 0 , 1870 , 108, 77 ), // #392 - INST(Lmsw , X86M_NoSize , O(000F00,01,6,_,_,_,_,_ ), 0 , 80 , 0 , 1877 , 107, 0 ), // #393 - INST(Lods , X86StrRm , O(000000,AC,_,_,_,_,_,_ ), 0 , 0 , 0 , 1882 , 109, 78 ), // #394 - INST(Loop , X86JecxzLoop , 0 , O(000000,E2,_,_,_,_,_,_ ), 0 , 42 , 1887 , 110, 0 ), // #395 - INST(Loope , X86JecxzLoop , 0 , O(000000,E1,_,_,_,_,_,_ ), 0 , 43 , 1892 , 110, 61 ), // #396 - INST(Loopne , X86JecxzLoop , 0 , O(000000,E0,_,_,_,_,_,_ ), 0 , 44 , 1898 , 110, 61 ), // #397 - INST(Lsl , X86Rm , O(000F00,03,_,_,_,_,_,_ ), 0 , 4 , 0 , 1905 , 111, 10 ), // #398 - INST(Lss , X86Rm , O(000F00,B2,_,_,_,_,_,_ ), 0 , 4 , 0 , 7556 , 105, 0 ), // #399 - INST(Ltr , X86M_NoSize , O(000F00,00,3,_,_,_,_,_ ), 0 , 78 , 0 , 1909 , 107, 0 ), // #400 - INST(Lwpins , VexVmi4_Wx , V(XOP_MA,12,0,0,x,_,_,_ ), 0 , 81 , 0 , 1913 , 112, 77 ), // #401 - INST(Lwpval , VexVmi4_Wx , V(XOP_MA,12,1,0,x,_,_,_ ), 0 , 82 , 0 , 1920 , 112, 77 ), // #402 - INST(Lzcnt , X86Rm_Raw66H , O(F30F00,BD,_,_,x,_,_,_ ), 0 , 6 , 0 , 1927 , 22 , 79 ), // #403 - INST(Maskmovdqu , ExtRm_ZDI , O(660F00,F7,_,_,_,_,_,_ ), 0 , 3 , 0 , 7019 , 113, 4 ), // #404 - INST(Maskmovq , ExtRm_ZDI , O(000F00,F7,_,_,_,_,_,_ ), 0 , 4 , 0 , 9113 , 114, 80 ), // #405 - INST(Maxpd , ExtRm , O(660F00,5F,_,_,_,_,_,_ ), 0 , 3 , 0 , 7053 , 5 , 4 ), // #406 - INST(Maxps , ExtRm , O(000F00,5F,_,_,_,_,_,_ ), 0 , 4 , 0 , 7067 , 5 , 5 ), // #407 - INST(Maxsd , ExtRm , O(F20F00,5F,_,_,_,_,_,_ ), 0 , 5 , 0 , 9132 , 6 , 4 ), // #408 - INST(Maxss , ExtRm , O(F30F00,5F,_,_,_,_,_,_ ), 0 , 6 , 0 , 7088 , 7 , 5 ), // #409 - INST(Mcommit , X86Op , O(F30F01,FA,_,_,_,_,_,_ ), 0 , 25 , 0 , 1933 , 30 , 81 ), // #410 - INST(Mfence , X86Fence , O(000F00,AE,6,_,_,_,_,_ ), 0 , 80 , 0 , 1941 , 30 , 4 ), // #411 - INST(Minpd , ExtRm , O(660F00,5D,_,_,_,_,_,_ ), 0 , 3 , 0 , 7117 , 5 , 4 ), // #412 - INST(Minps , ExtRm , O(000F00,5D,_,_,_,_,_,_ ), 0 , 4 , 0 , 7131 , 5 , 5 ), // #413 - INST(Minsd , ExtRm , O(F20F00,5D,_,_,_,_,_,_ ), 0 , 5 , 0 , 9196 , 6 , 4 ), // #414 - INST(Minss , ExtRm , O(F30F00,5D,_,_,_,_,_,_ ), 0 , 6 , 0 , 7152 , 7 , 5 ), // #415 - INST(Monitor , X86Op , O(000F01,C8,_,_,_,_,_,_ ), 0 , 21 , 0 , 3232 , 115, 82 ), // #416 - INST(Monitorx , X86Op , O(000F01,FA,_,_,_,_,_,_ ), 0 , 21 , 0 , 1948 , 115, 83 ), // #417 - INST(Mov , X86Mov , 0 , 0 , 0 , 0 , 138 , 116, 84 ), // #418 - INST(Movabs , X86Movabs , 0 , 0 , 0 , 0 , 1957 , 117, 0 ), // #419 - INST(Movapd , ExtMov , O(660F00,28,_,_,_,_,_,_ ), O(660F00,29,_,_,_,_,_,_ ), 3 , 45 , 7183 , 118, 85 ), // #420 - INST(Movaps , ExtMov , O(000F00,28,_,_,_,_,_,_ ), O(000F00,29,_,_,_,_,_,_ ), 4 , 46 , 7191 , 118, 86 ), // #421 - INST(Movbe , ExtMovbe , O(000F38,F0,_,_,x,_,_,_ ), O(000F38,F1,_,_,x,_,_,_ ), 83 , 47 , 656 , 119, 87 ), // #422 - INST(Movd , ExtMovd , O(000F00,6E,_,_,_,_,_,_ ), O(000F00,7E,_,_,_,_,_,_ ), 4 , 48 , 9106 , 120, 88 ), // #423 - INST(Movddup , ExtMov , O(F20F00,12,_,_,_,_,_,_ ), 0 , 5 , 0 , 7205 , 6 , 6 ), // #424 - INST(Movdir64b , X86EnqcmdMovdir64b , O(660F38,F8,_,_,_,_,_,_ ), 0 , 2 , 0 , 1964 , 121, 89 ), // #425 - INST(Movdiri , X86MovntiMovdiri , O(000F38,F9,_,_,_,_,_,_ ), 0 , 83 , 0 , 1974 , 122, 90 ), // #426 - INST(Movdq2q , ExtMov , O(F20F00,D6,_,_,_,_,_,_ ), 0 , 5 , 0 , 1982 , 123, 4 ), // #427 - INST(Movdqa , ExtMov , O(660F00,6F,_,_,_,_,_,_ ), O(660F00,7F,_,_,_,_,_,_ ), 3 , 49 , 7214 , 118, 85 ), // #428 - INST(Movdqu , ExtMov , O(F30F00,6F,_,_,_,_,_,_ ), O(F30F00,7F,_,_,_,_,_,_ ), 6 , 50 , 7023 , 118, 85 ), // #429 - INST(Movhlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), 0 , 4 , 0 , 7289 , 124, 5 ), // #430 - INST(Movhpd , ExtMov , O(660F00,16,_,_,_,_,_,_ ), O(660F00,17,_,_,_,_,_,_ ), 3 , 51 , 7298 , 125, 4 ), // #431 - INST(Movhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), O(000F00,17,_,_,_,_,_,_ ), 4 , 52 , 7306 , 125, 5 ), // #432 - INST(Movlhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), 0 , 4 , 0 , 7314 , 124, 5 ), // #433 - INST(Movlpd , ExtMov , O(660F00,12,_,_,_,_,_,_ ), O(660F00,13,_,_,_,_,_,_ ), 3 , 53 , 7323 , 125, 4 ), // #434 - INST(Movlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), O(000F00,13,_,_,_,_,_,_ ), 4 , 54 , 7331 , 125, 5 ), // #435 - INST(Movmskpd , ExtMov , O(660F00,50,_,_,_,_,_,_ ), 0 , 3 , 0 , 7339 , 126, 4 ), // #436 - INST(Movmskps , ExtMov , O(000F00,50,_,_,_,_,_,_ ), 0 , 4 , 0 , 7349 , 126, 5 ), // #437 - INST(Movntdq , ExtMov , 0 , O(660F00,E7,_,_,_,_,_,_ ), 0 , 55 , 7359 , 127, 4 ), // #438 - INST(Movntdqa , ExtMov , O(660F38,2A,_,_,_,_,_,_ ), 0 , 2 , 0 , 7368 , 100, 12 ), // #439 - INST(Movnti , X86MovntiMovdiri , O(000F00,C3,_,_,x,_,_,_ ), 0 , 4 , 0 , 1990 , 122, 4 ), // #440 - INST(Movntpd , ExtMov , 0 , O(660F00,2B,_,_,_,_,_,_ ), 0 , 56 , 7378 , 127, 4 ), // #441 - INST(Movntps , ExtMov , 0 , O(000F00,2B,_,_,_,_,_,_ ), 0 , 57 , 7387 , 127, 5 ), // #442 - INST(Movntq , ExtMov , 0 , O(000F00,E7,_,_,_,_,_,_ ), 0 , 58 , 1997 , 128, 80 ), // #443 - INST(Movntsd , ExtMov , 0 , O(F20F00,2B,_,_,_,_,_,_ ), 0 , 59 , 2004 , 129, 49 ), // #444 - INST(Movntss , ExtMov , 0 , O(F30F00,2B,_,_,_,_,_,_ ), 0 , 60 , 2012 , 130, 49 ), // #445 - INST(Movq , ExtMovq , O(000F00,6E,_,_,x,_,_,_ ), O(000F00,7E,_,_,x,_,_,_ ), 4 , 48 , 9117 , 131, 91 ), // #446 - INST(Movq2dq , ExtRm , O(F30F00,D6,_,_,_,_,_,_ ), 0 , 6 , 0 , 2020 , 132, 4 ), // #447 - INST(Movs , X86StrMm , O(000000,A4,_,_,_,_,_,_ ), 0 , 0 , 0 , 439 , 133, 78 ), // #448 - INST(Movsd , ExtMov , O(F20F00,10,_,_,_,_,_,_ ), O(F20F00,11,_,_,_,_,_,_ ), 5 , 61 , 7402 , 134, 85 ), // #449 - INST(Movshdup , ExtRm , O(F30F00,16,_,_,_,_,_,_ ), 0 , 6 , 0 , 7416 , 5 , 6 ), // #450 - INST(Movsldup , ExtRm , O(F30F00,12,_,_,_,_,_,_ ), 0 , 6 , 0 , 7426 , 5 , 6 ), // #451 - INST(Movss , ExtMov , O(F30F00,10,_,_,_,_,_,_ ), O(F30F00,11,_,_,_,_,_,_ ), 6 , 62 , 7436 , 135, 86 ), // #452 - INST(Movsx , X86MovsxMovzx , O(000F00,BE,_,_,x,_,_,_ ), 0 , 4 , 0 , 2028 , 136, 0 ), // #453 - INST(Movsxd , X86Rm , O(000000,63,_,_,x,_,_,_ ), 0 , 0 , 0 , 2034 , 137, 0 ), // #454 - INST(Movupd , ExtMov , O(660F00,10,_,_,_,_,_,_ ), O(660F00,11,_,_,_,_,_,_ ), 3 , 63 , 7443 , 118, 85 ), // #455 - INST(Movups , ExtMov , O(000F00,10,_,_,_,_,_,_ ), O(000F00,11,_,_,_,_,_,_ ), 4 , 64 , 7451 , 118, 86 ), // #456 - INST(Movzx , X86MovsxMovzx , O(000F00,B6,_,_,x,_,_,_ ), 0 , 4 , 0 , 2041 , 136, 0 ), // #457 - INST(Mpsadbw , ExtRmi , O(660F3A,42,_,_,_,_,_,_ ), 0 , 8 , 0 , 7465 , 8 , 12 ), // #458 - INST(Mul , X86M_GPB_MulDiv , O(000000,F6,4,_,x,_,_,_ ), 0 , 9 , 0 , 828 , 54 , 1 ), // #459 - INST(Mulpd , ExtRm , O(660F00,59,_,_,_,_,_,_ ), 0 , 3 , 0 , 7519 , 5 , 4 ), // #460 - INST(Mulps , ExtRm , O(000F00,59,_,_,_,_,_,_ ), 0 , 4 , 0 , 7533 , 5 , 5 ), // #461 - INST(Mulsd , ExtRm , O(F20F00,59,_,_,_,_,_,_ ), 0 , 5 , 0 , 7540 , 6 , 4 ), // #462 - INST(Mulss , ExtRm , O(F30F00,59,_,_,_,_,_,_ ), 0 , 6 , 0 , 7554 , 7 , 5 ), // #463 - INST(Mulx , VexRvm_ZDX_Wx , V(F20F38,F6,_,0,x,_,_,_ ), 0 , 84 , 0 , 2047 , 138, 92 ), // #464 - INST(Mwait , X86Op , O(000F01,C9,_,_,_,_,_,_ ), 0 , 21 , 0 , 3241 , 139, 82 ), // #465 - INST(Mwaitx , X86Op , O(000F01,FB,_,_,_,_,_,_ ), 0 , 21 , 0 , 2052 , 140, 83 ), // #466 - INST(Neg , X86M_GPB , O(000000,F6,3,_,x,_,_,_ ), 0 , 75 , 0 , 2059 , 141, 1 ), // #467 - INST(Nop , X86M_Nop , O(000000,90,_,_,_,_,_,_ ), 0 , 0 , 0 , 959 , 142, 0 ), // #468 - INST(Not , X86M_GPB , O(000000,F6,2,_,x,_,_,_ ), 0 , 1 , 0 , 2063 , 141, 0 ), // #469 - INST(Or , X86Arith , O(000000,08,1,_,x,_,_,_ ), 0 , 31 , 0 , 3237 , 143, 1 ), // #470 - INST(Orpd , ExtRm , O(660F00,56,_,_,_,_,_,_ ), 0 , 3 , 0 , 11458, 11 , 4 ), // #471 - INST(Orps , ExtRm , O(000F00,56,_,_,_,_,_,_ ), 0 , 4 , 0 , 11465, 11 , 5 ), // #472 - INST(Out , X86Out , O(000000,EE,_,_,_,_,_,_ ), O(000000,E6,_,_,_,_,_,_ ), 0 , 65 , 2067 , 144, 0 ), // #473 - INST(Outs , X86Outs , O(000000,6E,_,_,_,_,_,_ ), 0 , 0 , 0 , 2071 , 145, 0 ), // #474 - INST(Pabsb , ExtRm_P , O(000F38,1C,_,_,_,_,_,_ ), 0 , 83 , 0 , 7636 , 146, 93 ), // #475 - INST(Pabsd , ExtRm_P , O(000F38,1E,_,_,_,_,_,_ ), 0 , 83 , 0 , 7643 , 146, 93 ), // #476 - INST(Pabsw , ExtRm_P , O(000F38,1D,_,_,_,_,_,_ ), 0 , 83 , 0 , 7657 , 146, 93 ), // #477 - INST(Packssdw , ExtRm_P , O(000F00,6B,_,_,_,_,_,_ ), 0 , 4 , 0 , 7664 , 146, 88 ), // #478 - INST(Packsswb , ExtRm_P , O(000F00,63,_,_,_,_,_,_ ), 0 , 4 , 0 , 7674 , 146, 88 ), // #479 - INST(Packusdw , ExtRm , O(660F38,2B,_,_,_,_,_,_ ), 0 , 2 , 0 , 7684 , 5 , 12 ), // #480 - INST(Packuswb , ExtRm_P , O(000F00,67,_,_,_,_,_,_ ), 0 , 4 , 0 , 7694 , 146, 88 ), // #481 - INST(Paddb , ExtRm_P , O(000F00,FC,_,_,_,_,_,_ ), 0 , 4 , 0 , 7704 , 146, 88 ), // #482 - INST(Paddd , ExtRm_P , O(000F00,FE,_,_,_,_,_,_ ), 0 , 4 , 0 , 7711 , 146, 88 ), // #483 - INST(Paddq , ExtRm_P , O(000F00,D4,_,_,_,_,_,_ ), 0 , 4 , 0 , 7718 , 146, 4 ), // #484 - INST(Paddsb , ExtRm_P , O(000F00,EC,_,_,_,_,_,_ ), 0 , 4 , 0 , 7725 , 146, 88 ), // #485 - INST(Paddsw , ExtRm_P , O(000F00,ED,_,_,_,_,_,_ ), 0 , 4 , 0 , 7733 , 146, 88 ), // #486 - INST(Paddusb , ExtRm_P , O(000F00,DC,_,_,_,_,_,_ ), 0 , 4 , 0 , 7741 , 146, 88 ), // #487 - INST(Paddusw , ExtRm_P , O(000F00,DD,_,_,_,_,_,_ ), 0 , 4 , 0 , 7750 , 146, 88 ), // #488 - INST(Paddw , ExtRm_P , O(000F00,FD,_,_,_,_,_,_ ), 0 , 4 , 0 , 7759 , 146, 88 ), // #489 - INST(Palignr , ExtRmi_P , O(000F3A,0F,_,_,_,_,_,_ ), 0 , 85 , 0 , 7766 , 147, 6 ), // #490 - INST(Pand , ExtRm_P , O(000F00,DB,_,_,_,_,_,_ ), 0 , 4 , 0 , 7775 , 148, 88 ), // #491 - INST(Pandn , ExtRm_P , O(000F00,DF,_,_,_,_,_,_ ), 0 , 4 , 0 , 7788 , 149, 88 ), // #492 - INST(Pause , X86Op , O(F30000,90,_,_,_,_,_,_ ), 0 , 86 , 0 , 3195 , 30 , 0 ), // #493 - INST(Pavgb , ExtRm_P , O(000F00,E0,_,_,_,_,_,_ ), 0 , 4 , 0 , 7818 , 146, 94 ), // #494 - INST(Pavgusb , Ext3dNow , O(000F0F,BF,_,_,_,_,_,_ ), 0 , 87 , 0 , 2076 , 150, 51 ), // #495 - INST(Pavgw , ExtRm_P , O(000F00,E3,_,_,_,_,_,_ ), 0 , 4 , 0 , 7825 , 146, 94 ), // #496 - INST(Pblendvb , ExtRm_XMM0 , O(660F38,10,_,_,_,_,_,_ ), 0 , 2 , 0 , 7881 , 15 , 12 ), // #497 - INST(Pblendw , ExtRmi , O(660F3A,0E,_,_,_,_,_,_ ), 0 , 8 , 0 , 7891 , 8 , 12 ), // #498 - INST(Pclmulqdq , ExtRmi , O(660F3A,44,_,_,_,_,_,_ ), 0 , 8 , 0 , 7984 , 8 , 95 ), // #499 - INST(Pcmpeqb , ExtRm_P , O(000F00,74,_,_,_,_,_,_ ), 0 , 4 , 0 , 8016 , 149, 88 ), // #500 - INST(Pcmpeqd , ExtRm_P , O(000F00,76,_,_,_,_,_,_ ), 0 , 4 , 0 , 8025 , 149, 88 ), // #501 - INST(Pcmpeqq , ExtRm , O(660F38,29,_,_,_,_,_,_ ), 0 , 2 , 0 , 8034 , 151, 12 ), // #502 - INST(Pcmpeqw , ExtRm_P , O(000F00,75,_,_,_,_,_,_ ), 0 , 4 , 0 , 8043 , 149, 88 ), // #503 - INST(Pcmpestri , ExtRmi , O(660F3A,61,_,_,_,_,_,_ ), 0 , 8 , 0 , 8052 , 152, 96 ), // #504 - INST(Pcmpestrm , ExtRmi , O(660F3A,60,_,_,_,_,_,_ ), 0 , 8 , 0 , 8063 , 153, 96 ), // #505 - INST(Pcmpgtb , ExtRm_P , O(000F00,64,_,_,_,_,_,_ ), 0 , 4 , 0 , 8074 , 149, 88 ), // #506 - INST(Pcmpgtd , ExtRm_P , O(000F00,66,_,_,_,_,_,_ ), 0 , 4 , 0 , 8083 , 149, 88 ), // #507 - INST(Pcmpgtq , ExtRm , O(660F38,37,_,_,_,_,_,_ ), 0 , 2 , 0 , 8092 , 151, 44 ), // #508 - INST(Pcmpgtw , ExtRm_P , O(000F00,65,_,_,_,_,_,_ ), 0 , 4 , 0 , 8101 , 149, 88 ), // #509 - INST(Pcmpistri , ExtRmi , O(660F3A,63,_,_,_,_,_,_ ), 0 , 8 , 0 , 8110 , 154, 96 ), // #510 - INST(Pcmpistrm , ExtRmi , O(660F3A,62,_,_,_,_,_,_ ), 0 , 8 , 0 , 8121 , 155, 96 ), // #511 - INST(Pconfig , X86Op , O(000F01,C5,_,_,_,_,_,_ ), 0 , 21 , 0 , 2084 , 30 , 97 ), // #512 - INST(Pdep , VexRvm_Wx , V(F20F38,F5,_,0,x,_,_,_ ), 0 , 84 , 0 , 2092 , 10 , 92 ), // #513 - INST(Pext , VexRvm_Wx , V(F30F38,F5,_,0,x,_,_,_ ), 0 , 88 , 0 , 2097 , 10 , 92 ), // #514 - INST(Pextrb , ExtExtract , O(000F3A,14,_,_,_,_,_,_ ), 0 , 85 , 0 , 8608 , 156, 12 ), // #515 - INST(Pextrd , ExtExtract , O(000F3A,16,_,_,_,_,_,_ ), 0 , 85 , 0 , 8616 , 58 , 12 ), // #516 - INST(Pextrq , ExtExtract , O(000F3A,16,_,_,1,_,_,_ ), 0 , 89 , 0 , 8624 , 157, 12 ), // #517 - INST(Pextrw , ExtPextrw , O(000F00,C5,_,_,_,_,_,_ ), O(000F3A,15,_,_,_,_,_,_ ), 4 , 66 , 8632 , 158, 98 ), // #518 - INST(Pf2id , Ext3dNow , O(000F0F,1D,_,_,_,_,_,_ ), 0 , 87 , 0 , 2102 , 150, 51 ), // #519 - INST(Pf2iw , Ext3dNow , O(000F0F,1C,_,_,_,_,_,_ ), 0 , 87 , 0 , 2108 , 150, 99 ), // #520 - INST(Pfacc , Ext3dNow , O(000F0F,AE,_,_,_,_,_,_ ), 0 , 87 , 0 , 2114 , 150, 51 ), // #521 - INST(Pfadd , Ext3dNow , O(000F0F,9E,_,_,_,_,_,_ ), 0 , 87 , 0 , 2120 , 150, 51 ), // #522 - INST(Pfcmpeq , Ext3dNow , O(000F0F,B0,_,_,_,_,_,_ ), 0 , 87 , 0 , 2126 , 150, 51 ), // #523 - INST(Pfcmpge , Ext3dNow , O(000F0F,90,_,_,_,_,_,_ ), 0 , 87 , 0 , 2134 , 150, 51 ), // #524 - INST(Pfcmpgt , Ext3dNow , O(000F0F,A0,_,_,_,_,_,_ ), 0 , 87 , 0 , 2142 , 150, 51 ), // #525 - INST(Pfmax , Ext3dNow , O(000F0F,A4,_,_,_,_,_,_ ), 0 , 87 , 0 , 2150 , 150, 51 ), // #526 - INST(Pfmin , Ext3dNow , O(000F0F,94,_,_,_,_,_,_ ), 0 , 87 , 0 , 2156 , 150, 51 ), // #527 - INST(Pfmul , Ext3dNow , O(000F0F,B4,_,_,_,_,_,_ ), 0 , 87 , 0 , 2162 , 150, 51 ), // #528 - INST(Pfnacc , Ext3dNow , O(000F0F,8A,_,_,_,_,_,_ ), 0 , 87 , 0 , 2168 , 150, 99 ), // #529 - INST(Pfpnacc , Ext3dNow , O(000F0F,8E,_,_,_,_,_,_ ), 0 , 87 , 0 , 2175 , 150, 99 ), // #530 - INST(Pfrcp , Ext3dNow , O(000F0F,96,_,_,_,_,_,_ ), 0 , 87 , 0 , 2183 , 150, 51 ), // #531 - INST(Pfrcpit1 , Ext3dNow , O(000F0F,A6,_,_,_,_,_,_ ), 0 , 87 , 0 , 2189 , 150, 51 ), // #532 - INST(Pfrcpit2 , Ext3dNow , O(000F0F,B6,_,_,_,_,_,_ ), 0 , 87 , 0 , 2198 , 150, 51 ), // #533 - INST(Pfrcpv , Ext3dNow , O(000F0F,86,_,_,_,_,_,_ ), 0 , 87 , 0 , 2207 , 150, 100), // #534 - INST(Pfrsqit1 , Ext3dNow , O(000F0F,A7,_,_,_,_,_,_ ), 0 , 87 , 0 , 2214 , 150, 51 ), // #535 - INST(Pfrsqrt , Ext3dNow , O(000F0F,97,_,_,_,_,_,_ ), 0 , 87 , 0 , 2223 , 150, 51 ), // #536 - INST(Pfrsqrtv , Ext3dNow , O(000F0F,87,_,_,_,_,_,_ ), 0 , 87 , 0 , 2231 , 150, 100), // #537 - INST(Pfsub , Ext3dNow , O(000F0F,9A,_,_,_,_,_,_ ), 0 , 87 , 0 , 2240 , 150, 51 ), // #538 - INST(Pfsubr , Ext3dNow , O(000F0F,AA,_,_,_,_,_,_ ), 0 , 87 , 0 , 2246 , 150, 51 ), // #539 - INST(Phaddd , ExtRm_P , O(000F38,02,_,_,_,_,_,_ ), 0 , 83 , 0 , 8711 , 146, 93 ), // #540 - INST(Phaddsw , ExtRm_P , O(000F38,03,_,_,_,_,_,_ ), 0 , 83 , 0 , 8728 , 146, 93 ), // #541 - INST(Phaddw , ExtRm_P , O(000F38,01,_,_,_,_,_,_ ), 0 , 83 , 0 , 8797 , 146, 93 ), // #542 - INST(Phminposuw , ExtRm , O(660F38,41,_,_,_,_,_,_ ), 0 , 2 , 0 , 8823 , 5 , 12 ), // #543 - INST(Phsubd , ExtRm_P , O(000F38,06,_,_,_,_,_,_ ), 0 , 83 , 0 , 8844 , 146, 93 ), // #544 - INST(Phsubsw , ExtRm_P , O(000F38,07,_,_,_,_,_,_ ), 0 , 83 , 0 , 8861 , 146, 93 ), // #545 - INST(Phsubw , ExtRm_P , O(000F38,05,_,_,_,_,_,_ ), 0 , 83 , 0 , 8870 , 146, 93 ), // #546 - INST(Pi2fd , Ext3dNow , O(000F0F,0D,_,_,_,_,_,_ ), 0 , 87 , 0 , 2253 , 150, 51 ), // #547 - INST(Pi2fw , Ext3dNow , O(000F0F,0C,_,_,_,_,_,_ ), 0 , 87 , 0 , 2259 , 150, 99 ), // #548 - INST(Pinsrb , ExtRmi , O(660F3A,20,_,_,_,_,_,_ ), 0 , 8 , 0 , 8887 , 159, 12 ), // #549 - INST(Pinsrd , ExtRmi , O(660F3A,22,_,_,_,_,_,_ ), 0 , 8 , 0 , 8895 , 160, 12 ), // #550 - INST(Pinsrq , ExtRmi , O(660F3A,22,_,_,1,_,_,_ ), 0 , 90 , 0 , 8903 , 161, 12 ), // #551 - INST(Pinsrw , ExtRmi_P , O(000F00,C4,_,_,_,_,_,_ ), 0 , 4 , 0 , 8911 , 162, 94 ), // #552 - INST(Pmaddubsw , ExtRm_P , O(000F38,04,_,_,_,_,_,_ ), 0 , 83 , 0 , 9081 , 146, 93 ), // #553 - INST(Pmaddwd , ExtRm_P , O(000F00,F5,_,_,_,_,_,_ ), 0 , 4 , 0 , 9092 , 146, 88 ), // #554 - INST(Pmaxsb , ExtRm , O(660F38,3C,_,_,_,_,_,_ ), 0 , 2 , 0 , 9123 , 11 , 12 ), // #555 - INST(Pmaxsd , ExtRm , O(660F38,3D,_,_,_,_,_,_ ), 0 , 2 , 0 , 9131 , 11 , 12 ), // #556 - INST(Pmaxsw , ExtRm_P , O(000F00,EE,_,_,_,_,_,_ ), 0 , 4 , 0 , 9147 , 148, 94 ), // #557 - INST(Pmaxub , ExtRm_P , O(000F00,DE,_,_,_,_,_,_ ), 0 , 4 , 0 , 9155 , 148, 94 ), // #558 - INST(Pmaxud , ExtRm , O(660F38,3F,_,_,_,_,_,_ ), 0 , 2 , 0 , 9163 , 11 , 12 ), // #559 - INST(Pmaxuw , ExtRm , O(660F38,3E,_,_,_,_,_,_ ), 0 , 2 , 0 , 9179 , 11 , 12 ), // #560 - INST(Pminsb , ExtRm , O(660F38,38,_,_,_,_,_,_ ), 0 , 2 , 0 , 9187 , 11 , 12 ), // #561 - INST(Pminsd , ExtRm , O(660F38,39,_,_,_,_,_,_ ), 0 , 2 , 0 , 9195 , 11 , 12 ), // #562 - INST(Pminsw , ExtRm_P , O(000F00,EA,_,_,_,_,_,_ ), 0 , 4 , 0 , 9211 , 148, 94 ), // #563 - INST(Pminub , ExtRm_P , O(000F00,DA,_,_,_,_,_,_ ), 0 , 4 , 0 , 9219 , 148, 94 ), // #564 - INST(Pminud , ExtRm , O(660F38,3B,_,_,_,_,_,_ ), 0 , 2 , 0 , 9227 , 11 , 12 ), // #565 - INST(Pminuw , ExtRm , O(660F38,3A,_,_,_,_,_,_ ), 0 , 2 , 0 , 9243 , 11 , 12 ), // #566 - INST(Pmovmskb , ExtRm_P , O(000F00,D7,_,_,_,_,_,_ ), 0 , 4 , 0 , 9321 , 163, 94 ), // #567 - INST(Pmovsxbd , ExtRm , O(660F38,21,_,_,_,_,_,_ ), 0 , 2 , 0 , 9418 , 7 , 12 ), // #568 - INST(Pmovsxbq , ExtRm , O(660F38,22,_,_,_,_,_,_ ), 0 , 2 , 0 , 9428 , 164, 12 ), // #569 - INST(Pmovsxbw , ExtRm , O(660F38,20,_,_,_,_,_,_ ), 0 , 2 , 0 , 9438 , 6 , 12 ), // #570 - INST(Pmovsxdq , ExtRm , O(660F38,25,_,_,_,_,_,_ ), 0 , 2 , 0 , 9448 , 6 , 12 ), // #571 - INST(Pmovsxwd , ExtRm , O(660F38,23,_,_,_,_,_,_ ), 0 , 2 , 0 , 9458 , 6 , 12 ), // #572 - INST(Pmovsxwq , ExtRm , O(660F38,24,_,_,_,_,_,_ ), 0 , 2 , 0 , 9468 , 7 , 12 ), // #573 - INST(Pmovzxbd , ExtRm , O(660F38,31,_,_,_,_,_,_ ), 0 , 2 , 0 , 9555 , 7 , 12 ), // #574 - INST(Pmovzxbq , ExtRm , O(660F38,32,_,_,_,_,_,_ ), 0 , 2 , 0 , 9565 , 164, 12 ), // #575 - INST(Pmovzxbw , ExtRm , O(660F38,30,_,_,_,_,_,_ ), 0 , 2 , 0 , 9575 , 6 , 12 ), // #576 - INST(Pmovzxdq , ExtRm , O(660F38,35,_,_,_,_,_,_ ), 0 , 2 , 0 , 9585 , 6 , 12 ), // #577 - INST(Pmovzxwd , ExtRm , O(660F38,33,_,_,_,_,_,_ ), 0 , 2 , 0 , 9595 , 6 , 12 ), // #578 - INST(Pmovzxwq , ExtRm , O(660F38,34,_,_,_,_,_,_ ), 0 , 2 , 0 , 9605 , 7 , 12 ), // #579 - INST(Pmuldq , ExtRm , O(660F38,28,_,_,_,_,_,_ ), 0 , 2 , 0 , 9615 , 5 , 12 ), // #580 - INST(Pmulhrsw , ExtRm_P , O(000F38,0B,_,_,_,_,_,_ ), 0 , 83 , 0 , 9623 , 146, 93 ), // #581 - INST(Pmulhrw , Ext3dNow , O(000F0F,B7,_,_,_,_,_,_ ), 0 , 87 , 0 , 2265 , 150, 51 ), // #582 - INST(Pmulhuw , ExtRm_P , O(000F00,E4,_,_,_,_,_,_ ), 0 , 4 , 0 , 9633 , 146, 94 ), // #583 - INST(Pmulhw , ExtRm_P , O(000F00,E5,_,_,_,_,_,_ ), 0 , 4 , 0 , 9642 , 146, 88 ), // #584 - INST(Pmulld , ExtRm , O(660F38,40,_,_,_,_,_,_ ), 0 , 2 , 0 , 9650 , 5 , 12 ), // #585 - INST(Pmullw , ExtRm_P , O(000F00,D5,_,_,_,_,_,_ ), 0 , 4 , 0 , 9666 , 146, 88 ), // #586 - INST(Pmuludq , ExtRm_P , O(000F00,F4,_,_,_,_,_,_ ), 0 , 4 , 0 , 9689 , 146, 4 ), // #587 - INST(Pop , X86Pop , O(000000,8F,0,_,_,_,_,_ ), O(000000,58,_,_,_,_,_,_ ), 0 , 67 , 2273 , 165, 0 ), // #588 - INST(Popa , X86Op , O(660000,61,_,_,_,_,_,_ ), 0 , 19 , 0 , 2277 , 81 , 0 ), // #589 - INST(Popad , X86Op , O(000000,61,_,_,_,_,_,_ ), 0 , 0 , 0 , 2282 , 81 , 0 ), // #590 - INST(Popcnt , X86Rm_Raw66H , O(F30F00,B8,_,_,x,_,_,_ ), 0 , 6 , 0 , 2288 , 22 , 101), // #591 - INST(Popf , X86Op , O(660000,9D,_,_,_,_,_,_ ), 0 , 19 , 0 , 2295 , 30 , 102), // #592 - INST(Popfd , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 2300 , 81 , 102), // #593 - INST(Popfq , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 2306 , 33 , 102), // #594 - INST(Por , ExtRm_P , O(000F00,EB,_,_,_,_,_,_ ), 0 , 4 , 0 , 9734 , 148, 88 ), // #595 - INST(Prefetch , X86M_Only , O(000F00,0D,0,_,_,_,_,_ ), 0 , 4 , 0 , 2312 , 31 , 51 ), // #596 - INST(Prefetchnta , X86M_Only , O(000F00,18,0,_,_,_,_,_ ), 0 , 4 , 0 , 2321 , 31 , 80 ), // #597 - INST(Prefetcht0 , X86M_Only , O(000F00,18,1,_,_,_,_,_ ), 0 , 29 , 0 , 2333 , 31 , 80 ), // #598 - INST(Prefetcht1 , X86M_Only , O(000F00,18,2,_,_,_,_,_ ), 0 , 76 , 0 , 2344 , 31 , 80 ), // #599 - INST(Prefetcht2 , X86M_Only , O(000F00,18,3,_,_,_,_,_ ), 0 , 78 , 0 , 2355 , 31 , 80 ), // #600 - INST(Prefetchw , X86M_Only , O(000F00,0D,1,_,_,_,_,_ ), 0 , 29 , 0 , 2366 , 31 , 103), // #601 - INST(Prefetchwt1 , X86M_Only , O(000F00,0D,2,_,_,_,_,_ ), 0 , 76 , 0 , 2376 , 31 , 104), // #602 - INST(Psadbw , ExtRm_P , O(000F00,F6,_,_,_,_,_,_ ), 0 , 4 , 0 , 4644 , 146, 94 ), // #603 - INST(Pshufb , ExtRm_P , O(000F38,00,_,_,_,_,_,_ ), 0 , 83 , 0 , 10060, 146, 93 ), // #604 - INST(Pshufd , ExtRmi , O(660F00,70,_,_,_,_,_,_ ), 0 , 3 , 0 , 10081, 8 , 4 ), // #605 - INST(Pshufhw , ExtRmi , O(F30F00,70,_,_,_,_,_,_ ), 0 , 6 , 0 , 10089, 8 , 4 ), // #606 - INST(Pshuflw , ExtRmi , O(F20F00,70,_,_,_,_,_,_ ), 0 , 5 , 0 , 10098, 8 , 4 ), // #607 - INST(Pshufw , ExtRmi_P , O(000F00,70,_,_,_,_,_,_ ), 0 , 4 , 0 , 2388 , 166, 80 ), // #608 - INST(Psignb , ExtRm_P , O(000F38,08,_,_,_,_,_,_ ), 0 , 83 , 0 , 10107, 146, 93 ), // #609 - INST(Psignd , ExtRm_P , O(000F38,0A,_,_,_,_,_,_ ), 0 , 83 , 0 , 10115, 146, 93 ), // #610 - INST(Psignw , ExtRm_P , O(000F38,09,_,_,_,_,_,_ ), 0 , 83 , 0 , 10123, 146, 93 ), // #611 - INST(Pslld , ExtRmRi_P , O(000F00,F2,_,_,_,_,_,_ ), O(000F00,72,6,_,_,_,_,_ ), 4 , 68 , 10131, 167, 88 ), // #612 - INST(Pslldq , ExtRmRi , 0 , O(660F00,73,7,_,_,_,_,_ ), 0 , 69 , 10138, 168, 4 ), // #613 - INST(Psllq , ExtRmRi_P , O(000F00,F3,_,_,_,_,_,_ ), O(000F00,73,6,_,_,_,_,_ ), 4 , 70 , 10146, 167, 88 ), // #614 - INST(Psllw , ExtRmRi_P , O(000F00,F1,_,_,_,_,_,_ ), O(000F00,71,6,_,_,_,_,_ ), 4 , 71 , 10177, 167, 88 ), // #615 - INST(Psmash , X86Op , O(F30F01,FF,_,_,_,_,_,_ ), 0 , 25 , 0 , 2395 , 33 , 105), // #616 - INST(Psrad , ExtRmRi_P , O(000F00,E2,_,_,_,_,_,_ ), O(000F00,72,4,_,_,_,_,_ ), 4 , 72 , 10184, 167, 88 ), // #617 - INST(Psraw , ExtRmRi_P , O(000F00,E1,_,_,_,_,_,_ ), O(000F00,71,4,_,_,_,_,_ ), 4 , 73 , 10222, 167, 88 ), // #618 - INST(Psrld , ExtRmRi_P , O(000F00,D2,_,_,_,_,_,_ ), O(000F00,72,2,_,_,_,_,_ ), 4 , 74 , 10229, 167, 88 ), // #619 - INST(Psrldq , ExtRmRi , 0 , O(660F00,73,3,_,_,_,_,_ ), 0 , 75 , 10236, 168, 4 ), // #620 - INST(Psrlq , ExtRmRi_P , O(000F00,D3,_,_,_,_,_,_ ), O(000F00,73,2,_,_,_,_,_ ), 4 , 76 , 10244, 167, 88 ), // #621 - INST(Psrlw , ExtRmRi_P , O(000F00,D1,_,_,_,_,_,_ ), O(000F00,71,2,_,_,_,_,_ ), 4 , 77 , 10275, 167, 88 ), // #622 - INST(Psubb , ExtRm_P , O(000F00,F8,_,_,_,_,_,_ ), 0 , 4 , 0 , 10282, 149, 88 ), // #623 - INST(Psubd , ExtRm_P , O(000F00,FA,_,_,_,_,_,_ ), 0 , 4 , 0 , 10289, 149, 88 ), // #624 - INST(Psubq , ExtRm_P , O(000F00,FB,_,_,_,_,_,_ ), 0 , 4 , 0 , 10296, 149, 4 ), // #625 - INST(Psubsb , ExtRm_P , O(000F00,E8,_,_,_,_,_,_ ), 0 , 4 , 0 , 10303, 149, 88 ), // #626 - INST(Psubsw , ExtRm_P , O(000F00,E9,_,_,_,_,_,_ ), 0 , 4 , 0 , 10311, 149, 88 ), // #627 - INST(Psubusb , ExtRm_P , O(000F00,D8,_,_,_,_,_,_ ), 0 , 4 , 0 , 10319, 149, 88 ), // #628 - INST(Psubusw , ExtRm_P , O(000F00,D9,_,_,_,_,_,_ ), 0 , 4 , 0 , 10328, 149, 88 ), // #629 - INST(Psubw , ExtRm_P , O(000F00,F9,_,_,_,_,_,_ ), 0 , 4 , 0 , 10337, 149, 88 ), // #630 - INST(Pswapd , Ext3dNow , O(000F0F,BB,_,_,_,_,_,_ ), 0 , 87 , 0 , 2402 , 150, 99 ), // #631 - INST(Ptest , ExtRm , O(660F38,17,_,_,_,_,_,_ ), 0 , 2 , 0 , 10366, 5 , 106), // #632 - INST(Ptwrite , X86M , O(F30F00,AE,4,_,_,_,_,_ ), 0 , 91 , 0 , 2409 , 169, 107), // #633 - INST(Punpckhbw , ExtRm_P , O(000F00,68,_,_,_,_,_,_ ), 0 , 4 , 0 , 10449, 146, 88 ), // #634 - INST(Punpckhdq , ExtRm_P , O(000F00,6A,_,_,_,_,_,_ ), 0 , 4 , 0 , 10460, 146, 88 ), // #635 - INST(Punpckhqdq , ExtRm , O(660F00,6D,_,_,_,_,_,_ ), 0 , 3 , 0 , 10471, 5 , 4 ), // #636 - INST(Punpckhwd , ExtRm_P , O(000F00,69,_,_,_,_,_,_ ), 0 , 4 , 0 , 10483, 146, 88 ), // #637 - INST(Punpcklbw , ExtRm_P , O(000F00,60,_,_,_,_,_,_ ), 0 , 4 , 0 , 10494, 170, 88 ), // #638 - INST(Punpckldq , ExtRm_P , O(000F00,62,_,_,_,_,_,_ ), 0 , 4 , 0 , 10505, 170, 88 ), // #639 - INST(Punpcklqdq , ExtRm , O(660F00,6C,_,_,_,_,_,_ ), 0 , 3 , 0 , 10516, 5 , 4 ), // #640 - INST(Punpcklwd , ExtRm_P , O(000F00,61,_,_,_,_,_,_ ), 0 , 4 , 0 , 10528, 170, 88 ), // #641 - INST(Push , X86Push , O(000000,FF,6,_,_,_,_,_ ), O(000000,50,_,_,_,_,_,_ ), 32 , 78 , 2417 , 171, 0 ), // #642 - INST(Pusha , X86Op , O(660000,60,_,_,_,_,_,_ ), 0 , 19 , 0 , 2422 , 81 , 0 ), // #643 - INST(Pushad , X86Op , O(000000,60,_,_,_,_,_,_ ), 0 , 0 , 0 , 2428 , 81 , 0 ), // #644 - INST(Pushf , X86Op , O(660000,9C,_,_,_,_,_,_ ), 0 , 19 , 0 , 2435 , 30 , 108), // #645 - INST(Pushfd , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 2441 , 81 , 108), // #646 - INST(Pushfq , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 2448 , 33 , 108), // #647 - INST(Pvalidate , X86Op , O(F20F01,FF,_,_,_,_,_,_ ), 0 , 92 , 0 , 2455 , 30 , 109), // #648 - INST(Pxor , ExtRm_P , O(000F00,EF,_,_,_,_,_,_ ), 0 , 4 , 0 , 10539, 149, 88 ), // #649 - INST(Rcl , X86Rot , O(000000,D0,2,_,x,_,_,_ ), 0 , 1 , 0 , 2465 , 172, 110), // #650 - INST(Rcpps , ExtRm , O(000F00,53,_,_,_,_,_,_ ), 0 , 4 , 0 , 10674, 5 , 5 ), // #651 - INST(Rcpss , ExtRm , O(F30F00,53,_,_,_,_,_,_ ), 0 , 6 , 0 , 10688, 7 , 5 ), // #652 - INST(Rcr , X86Rot , O(000000,D0,3,_,x,_,_,_ ), 0 , 75 , 0 , 2469 , 172, 110), // #653 - INST(Rdfsbase , X86M , O(F30F00,AE,0,_,x,_,_,_ ), 0 , 6 , 0 , 2473 , 173, 111), // #654 - INST(Rdgsbase , X86M , O(F30F00,AE,1,_,x,_,_,_ ), 0 , 93 , 0 , 2482 , 173, 111), // #655 - INST(Rdmsr , X86Op , O(000F00,32,_,_,_,_,_,_ ), 0 , 4 , 0 , 2491 , 174, 112), // #656 - INST(Rdpid , X86R_Native , O(F30F00,C7,7,_,_,_,_,_ ), 0 , 94 , 0 , 2497 , 175, 113), // #657 - INST(Rdpkru , X86Op , O(000F01,EE,_,_,_,_,_,_ ), 0 , 21 , 0 , 2503 , 174, 114), // #658 - INST(Rdpmc , X86Op , O(000F00,33,_,_,_,_,_,_ ), 0 , 4 , 0 , 2510 , 174, 0 ), // #659 - INST(Rdpru , X86Op , O(000F01,FD,_,_,_,_,_,_ ), 0 , 21 , 0 , 2516 , 174, 115), // #660 - INST(Rdrand , X86M , O(000F00,C7,6,_,x,_,_,_ ), 0 , 80 , 0 , 2522 , 23 , 116), // #661 - INST(Rdseed , X86M , O(000F00,C7,7,_,x,_,_,_ ), 0 , 22 , 0 , 2529 , 23 , 117), // #662 - INST(Rdsspd , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 93 , 0 , 2536 , 76 , 56 ), // #663 - INST(Rdsspq , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 93 , 0 , 2543 , 77 , 56 ), // #664 - INST(Rdtsc , X86Op , O(000F00,31,_,_,_,_,_,_ ), 0 , 4 , 0 , 2550 , 28 , 118), // #665 - INST(Rdtscp , X86Op , O(000F01,F9,_,_,_,_,_,_ ), 0 , 21 , 0 , 2556 , 174, 119), // #666 - INST(Ret , X86Ret , O(000000,C2,_,_,_,_,_,_ ), 0 , 0 , 0 , 3072 , 176, 0 ), // #667 - INST(Retf , X86Ret , O(000000,CA,_,_,x,_,_,_ ), 0 , 0 , 0 , 2563 , 177, 0 ), // #668 - INST(Rmpadjust , X86Op , O(F30F01,FE,_,_,_,_,_,_ ), 0 , 25 , 0 , 2568 , 33 , 105), // #669 - INST(Rmpupdate , X86Op , O(F20F01,FE,_,_,_,_,_,_ ), 0 , 92 , 0 , 2578 , 33 , 105), // #670 - INST(Rol , X86Rot , O(000000,D0,0,_,x,_,_,_ ), 0 , 0 , 0 , 2588 , 172, 120), // #671 - INST(Ror , X86Rot , O(000000,D0,1,_,x,_,_,_ ), 0 , 31 , 0 , 2592 , 172, 120), // #672 - INST(Rorx , VexRmi_Wx , V(F20F3A,F0,_,0,x,_,_,_ ), 0 , 95 , 0 , 2596 , 178, 92 ), // #673 - INST(Roundpd , ExtRmi , O(660F3A,09,_,_,_,_,_,_ ), 0 , 8 , 0 , 10827, 8 , 12 ), // #674 - INST(Roundps , ExtRmi , O(660F3A,08,_,_,_,_,_,_ ), 0 , 8 , 0 , 10836, 8 , 12 ), // #675 - INST(Roundsd , ExtRmi , O(660F3A,0B,_,_,_,_,_,_ ), 0 , 8 , 0 , 10845, 37 , 12 ), // #676 - INST(Roundss , ExtRmi , O(660F3A,0A,_,_,_,_,_,_ ), 0 , 8 , 0 , 10854, 38 , 12 ), // #677 - INST(Rsm , X86Op , O(000F00,AA,_,_,_,_,_,_ ), 0 , 4 , 0 , 2601 , 81 , 1 ), // #678 - INST(Rsqrtps , ExtRm , O(000F00,52,_,_,_,_,_,_ ), 0 , 4 , 0 , 10960, 5 , 5 ), // #679 - INST(Rsqrtss , ExtRm , O(F30F00,52,_,_,_,_,_,_ ), 0 , 6 , 0 , 10978, 7 , 5 ), // #680 - INST(Rstorssp , X86M_Only , O(F30F00,01,5,_,_,_,_,_ ), 0 , 63 , 0 , 2605 , 32 , 24 ), // #681 - INST(Sahf , X86Op , O(000000,9E,_,_,_,_,_,_ ), 0 , 0 , 0 , 2614 , 97 , 121), // #682 - INST(Sal , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 9 , 0 , 2619 , 172, 1 ), // #683 - INST(Sar , X86Rot , O(000000,D0,7,_,x,_,_,_ ), 0 , 27 , 0 , 2623 , 172, 1 ), // #684 - INST(Sarx , VexRmv_Wx , V(F30F38,F7,_,0,x,_,_,_ ), 0 , 88 , 0 , 2627 , 13 , 92 ), // #685 - INST(Saveprevssp , X86Op , O(F30F01,EA,_,_,_,_,_,_ ), 0 , 25 , 0 , 2632 , 30 , 24 ), // #686 - INST(Sbb , X86Arith , O(000000,18,3,_,x,_,_,_ ), 0 , 75 , 0 , 2644 , 179, 2 ), // #687 - INST(Scas , X86StrRm , O(000000,AE,_,_,_,_,_,_ ), 0 , 0 , 0 , 2648 , 180, 37 ), // #688 - INST(Senduipi , X86M_NoSize , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 24 , 0 , 2653 , 77 , 25 ), // #689 - INST(Serialize , X86Op , O(000F01,E8,_,_,_,_,_,_ ), 0 , 21 , 0 , 2662 , 30 , 122), // #690 - INST(Seta , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 4 , 0 , 2672 , 181, 59 ), // #691 - INST(Setae , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 4 , 0 , 2677 , 181, 60 ), // #692 - INST(Setb , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 4 , 0 , 2683 , 181, 60 ), // #693 - INST(Setbe , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 4 , 0 , 2688 , 181, 59 ), // #694 - INST(Setc , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 4 , 0 , 2694 , 181, 60 ), // #695 - INST(Sete , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 4 , 0 , 2699 , 181, 61 ), // #696 - INST(Setg , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 4 , 0 , 2704 , 181, 62 ), // #697 - INST(Setge , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 4 , 0 , 2709 , 181, 63 ), // #698 - INST(Setl , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 4 , 0 , 2715 , 181, 63 ), // #699 - INST(Setle , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 4 , 0 , 2720 , 181, 62 ), // #700 - INST(Setna , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 4 , 0 , 2726 , 181, 59 ), // #701 - INST(Setnae , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 4 , 0 , 2732 , 181, 60 ), // #702 - INST(Setnb , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 4 , 0 , 2739 , 181, 60 ), // #703 - INST(Setnbe , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 4 , 0 , 2745 , 181, 59 ), // #704 - INST(Setnc , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 4 , 0 , 2752 , 181, 60 ), // #705 - INST(Setne , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 4 , 0 , 2758 , 181, 61 ), // #706 - INST(Setng , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 4 , 0 , 2764 , 181, 62 ), // #707 - INST(Setnge , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 4 , 0 , 2770 , 181, 63 ), // #708 - INST(Setnl , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 4 , 0 , 2777 , 181, 63 ), // #709 - INST(Setnle , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 4 , 0 , 2783 , 181, 62 ), // #710 - INST(Setno , X86Set , O(000F00,91,_,_,_,_,_,_ ), 0 , 4 , 0 , 2790 , 181, 57 ), // #711 - INST(Setnp , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 4 , 0 , 2796 , 181, 64 ), // #712 - INST(Setns , X86Set , O(000F00,99,_,_,_,_,_,_ ), 0 , 4 , 0 , 2802 , 181, 65 ), // #713 - INST(Setnz , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 4 , 0 , 2808 , 181, 61 ), // #714 - INST(Seto , X86Set , O(000F00,90,_,_,_,_,_,_ ), 0 , 4 , 0 , 2814 , 181, 57 ), // #715 - INST(Setp , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 4 , 0 , 2819 , 181, 64 ), // #716 - INST(Setpe , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 4 , 0 , 2824 , 181, 64 ), // #717 - INST(Setpo , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 4 , 0 , 2830 , 181, 64 ), // #718 - INST(Sets , X86Set , O(000F00,98,_,_,_,_,_,_ ), 0 , 4 , 0 , 2836 , 181, 65 ), // #719 - INST(Setssbsy , X86Op , O(F30F01,E8,_,_,_,_,_,_ ), 0 , 25 , 0 , 2841 , 30 , 56 ), // #720 - INST(Setz , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 4 , 0 , 2850 , 181, 61 ), // #721 - INST(Sfence , X86Fence , O(000F00,AE,7,_,_,_,_,_ ), 0 , 22 , 0 , 2855 , 30 , 80 ), // #722 - INST(Sgdt , X86M_Only , O(000F00,01,0,_,_,_,_,_ ), 0 , 4 , 0 , 2862 , 69 , 0 ), // #723 - INST(Sha1msg1 , ExtRm , O(000F38,C9,_,_,_,_,_,_ ), 0 , 83 , 0 , 2867 , 5 , 123), // #724 - INST(Sha1msg2 , ExtRm , O(000F38,CA,_,_,_,_,_,_ ), 0 , 83 , 0 , 2876 , 5 , 123), // #725 - INST(Sha1nexte , ExtRm , O(000F38,C8,_,_,_,_,_,_ ), 0 , 83 , 0 , 2885 , 5 , 123), // #726 - INST(Sha1rnds4 , ExtRmi , O(000F3A,CC,_,_,_,_,_,_ ), 0 , 85 , 0 , 2895 , 8 , 123), // #727 - INST(Sha256msg1 , ExtRm , O(000F38,CC,_,_,_,_,_,_ ), 0 , 83 , 0 , 2905 , 5 , 123), // #728 - INST(Sha256msg2 , ExtRm , O(000F38,CD,_,_,_,_,_,_ ), 0 , 83 , 0 , 2916 , 5 , 123), // #729 - INST(Sha256rnds2 , ExtRm_XMM0 , O(000F38,CB,_,_,_,_,_,_ ), 0 , 83 , 0 , 2927 , 15 , 123), // #730 - INST(Shl , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 9 , 0 , 2939 , 172, 1 ), // #731 - INST(Shld , X86ShldShrd , O(000F00,A4,_,_,x,_,_,_ ), 0 , 4 , 0 , 9938 , 182, 1 ), // #732 - INST(Shlx , VexRmv_Wx , V(660F38,F7,_,0,x,_,_,_ ), 0 , 96 , 0 , 2943 , 13 , 92 ), // #733 - INST(Shr , X86Rot , O(000000,D0,5,_,x,_,_,_ ), 0 , 62 , 0 , 2948 , 172, 1 ), // #734 - INST(Shrd , X86ShldShrd , O(000F00,AC,_,_,x,_,_,_ ), 0 , 4 , 0 , 2952 , 182, 1 ), // #735 - INST(Shrx , VexRmv_Wx , V(F20F38,F7,_,0,x,_,_,_ ), 0 , 84 , 0 , 2957 , 13 , 92 ), // #736 - INST(Shufpd , ExtRmi , O(660F00,C6,_,_,_,_,_,_ ), 0 , 3 , 0 , 11259, 8 , 4 ), // #737 - INST(Shufps , ExtRmi , O(000F00,C6,_,_,_,_,_,_ ), 0 , 4 , 0 , 11267, 8 , 5 ), // #738 - INST(Sidt , X86M_Only , O(000F00,01,1,_,_,_,_,_ ), 0 , 29 , 0 , 2962 , 69 , 0 ), // #739 - INST(Skinit , X86Op_xAX , O(000F01,DE,_,_,_,_,_,_ ), 0 , 21 , 0 , 2967 , 52 , 124), // #740 - INST(Sldt , X86M_NoMemSize , O(000F00,00,0,_,_,_,_,_ ), 0 , 4 , 0 , 2974 , 183, 0 ), // #741 - INST(Slwpcb , VexR_Wx , V(XOP_M9,12,1,0,x,_,_,_ ), 0 , 11 , 0 , 2979 , 108, 77 ), // #742 - INST(Smsw , X86M_NoMemSize , O(000F00,01,4,_,_,_,_,_ ), 0 , 97 , 0 , 2986 , 183, 0 ), // #743 - INST(Sqrtpd , ExtRm , O(660F00,51,_,_,_,_,_,_ ), 0 , 3 , 0 , 11275, 5 , 4 ), // #744 - INST(Sqrtps , ExtRm , O(000F00,51,_,_,_,_,_,_ ), 0 , 4 , 0 , 10961, 5 , 5 ), // #745 - INST(Sqrtsd , ExtRm , O(F20F00,51,_,_,_,_,_,_ ), 0 , 5 , 0 , 11299, 6 , 4 ), // #746 - INST(Sqrtss , ExtRm , O(F30F00,51,_,_,_,_,_,_ ), 0 , 6 , 0 , 10979, 7 , 5 ), // #747 - INST(Stac , X86Op , O(000F01,CB,_,_,_,_,_,_ ), 0 , 21 , 0 , 2991 , 30 , 16 ), // #748 - INST(Stc , X86Op , O(000000,F9,_,_,_,_,_,_ ), 0 , 0 , 0 , 2996 , 30 , 17 ), // #749 - INST(Std , X86Op , O(000000,FD,_,_,_,_,_,_ ), 0 , 0 , 0 , 7921 , 30 , 18 ), // #750 - INST(Stgi , X86Op , O(000F01,DC,_,_,_,_,_,_ ), 0 , 21 , 0 , 3000 , 30 , 124), // #751 - INST(Sti , X86Op , O(000000,FB,_,_,_,_,_,_ ), 0 , 0 , 0 , 3005 , 30 , 23 ), // #752 - INST(Stmxcsr , X86M_Only , O(000F00,AE,3,_,_,_,_,_ ), 0 , 78 , 0 , 11323, 101, 5 ), // #753 - INST(Stos , X86StrMr , O(000000,AA,_,_,_,_,_,_ ), 0 , 0 , 0 , 3009 , 184, 78 ), // #754 - INST(Str , X86M_NoMemSize , O(000F00,00,1,_,_,_,_,_ ), 0 , 29 , 0 , 3014 , 183, 0 ), // #755 - INST(Sttilecfg , AmxCfg , V(660F38,49,_,0,0,_,_,_ ), 0 , 96 , 0 , 3018 , 103, 76 ), // #756 - INST(Stui , X86Op , O(F30F01,EF,_,_,_,_,_,_ ), 0 , 25 , 0 , 3135 , 33 , 25 ), // #757 - INST(Sub , X86Arith , O(000000,28,5,_,x,_,_,_ ), 0 , 62 , 0 , 866 , 179, 1 ), // #758 - INST(Subpd , ExtRm , O(660F00,5C,_,_,_,_,_,_ ), 0 , 3 , 0 , 5413 , 5 , 4 ), // #759 - INST(Subps , ExtRm , O(000F00,5C,_,_,_,_,_,_ ), 0 , 4 , 0 , 5425 , 5 , 5 ), // #760 - INST(Subsd , ExtRm , O(F20F00,5C,_,_,_,_,_,_ ), 0 , 5 , 0 , 6392 , 6 , 4 ), // #761 - INST(Subss , ExtRm , O(F30F00,5C,_,_,_,_,_,_ ), 0 , 6 , 0 , 6402 , 7 , 5 ), // #762 - INST(Swapgs , X86Op , O(000F01,F8,_,_,_,_,_,_ ), 0 , 21 , 0 , 3028 , 33 , 0 ), // #763 - INST(Syscall , X86Op , O(000F00,05,_,_,_,_,_,_ ), 0 , 4 , 0 , 3035 , 33 , 0 ), // #764 - INST(Sysenter , X86Op , O(000F00,34,_,_,_,_,_,_ ), 0 , 4 , 0 , 3043 , 30 , 0 ), // #765 - INST(Sysexit , X86Op , O(000F00,35,_,_,_,_,_,_ ), 0 , 4 , 0 , 3052 , 30 , 0 ), // #766 - INST(Sysexitq , X86Op , O(000F00,35,_,_,1,_,_,_ ), 0 , 60 , 0 , 3060 , 30 , 0 ), // #767 - INST(Sysret , X86Op , O(000F00,07,_,_,_,_,_,_ ), 0 , 4 , 0 , 3069 , 33 , 0 ), // #768 - INST(Sysretq , X86Op , O(000F00,07,_,_,1,_,_,_ ), 0 , 60 , 0 , 3076 , 33 , 0 ), // #769 - INST(T1mskc , VexVm_Wx , V(XOP_M9,01,7,0,x,_,_,_ ), 0 , 98 , 0 , 3084 , 14 , 11 ), // #770 - INST(Tdpbf16ps , AmxRmv , V(F30F38,5C,_,0,0,_,_,_ ), 0 , 88 , 0 , 3091 , 185, 125), // #771 - INST(Tdpbssd , AmxRmv , V(F20F38,5E,_,0,0,_,_,_ ), 0 , 84 , 0 , 3101 , 185, 126), // #772 - INST(Tdpbsud , AmxRmv , V(F30F38,5E,_,0,0,_,_,_ ), 0 , 88 , 0 , 3109 , 185, 126), // #773 - INST(Tdpbusd , AmxRmv , V(660F38,5E,_,0,0,_,_,_ ), 0 , 96 , 0 , 3117 , 185, 126), // #774 - INST(Tdpbuud , AmxRmv , V(000F38,5E,_,0,0,_,_,_ ), 0 , 10 , 0 , 3125 , 185, 126), // #775 - INST(Test , X86Test , O(000000,84,_,_,x,_,_,_ ), O(000000,F6,_,_,x,_,_,_ ), 0 , 79 , 10367, 186, 1 ), // #776 - INST(Testui , X86Op , O(F30F01,ED,_,_,_,_,_,_ ), 0 , 25 , 0 , 3133 , 33 , 127), // #777 - INST(Tileloadd , AmxRm , V(F20F38,4B,_,0,0,_,_,_ ), 0 , 84 , 0 , 3140 , 187, 76 ), // #778 - INST(Tileloaddt1 , AmxRm , V(660F38,4B,_,0,0,_,_,_ ), 0 , 96 , 0 , 3150 , 187, 76 ), // #779 - INST(Tilerelease , VexOpMod , V(000F38,49,0,0,0,_,_,_ ), 0 , 10 , 0 , 3162 , 188, 76 ), // #780 - INST(Tilestored , AmxMr , V(F30F38,4B,_,0,0,_,_,_ ), 0 , 88 , 0 , 3174 , 189, 76 ), // #781 - INST(Tilezero , AmxR , V(F20F38,49,_,0,0,_,_,_ ), 0 , 84 , 0 , 3185 , 190, 76 ), // #782 - INST(Tpause , X86R32_EDX_EAX , O(660F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 3194 , 191, 128), // #783 - INST(Tzcnt , X86Rm_Raw66H , O(F30F00,BC,_,_,x,_,_,_ ), 0 , 6 , 0 , 3201 , 22 , 9 ), // #784 - INST(Tzmsk , VexVm_Wx , V(XOP_M9,01,4,0,x,_,_,_ ), 0 , 99 , 0 , 3207 , 14 , 11 ), // #785 - INST(Ucomisd , ExtRm , O(660F00,2E,_,_,_,_,_,_ ), 0 , 3 , 0 , 11390, 6 , 41 ), // #786 - INST(Ucomiss , ExtRm , O(000F00,2E,_,_,_,_,_,_ ), 0 , 4 , 0 , 11408, 7 , 42 ), // #787 - INST(Ud0 , X86Rm , O(000F00,FF,_,_,_,_,_,_ ), 0 , 4 , 0 , 3213 , 192, 0 ), // #788 - INST(Ud1 , X86Rm , O(000F00,B9,_,_,_,_,_,_ ), 0 , 4 , 0 , 3217 , 192, 0 ), // #789 - INST(Ud2 , X86Op , O(000F00,0B,_,_,_,_,_,_ ), 0 , 4 , 0 , 3221 , 30 , 0 ), // #790 - INST(Uiret , X86Op , O(F30F01,EC,_,_,_,_,_,_ ), 0 , 25 , 0 , 3225 , 33 , 25 ), // #791 - INST(Umonitor , X86R_FromM , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 24 , 0 , 3231 , 193, 129), // #792 - INST(Umwait , X86R32_EDX_EAX , O(F20F00,AE,6,_,_,_,_,_ ), 0 , 100, 0 , 3240 , 191, 128), // #793 - INST(Unpckhpd , ExtRm , O(660F00,15,_,_,_,_,_,_ ), 0 , 3 , 0 , 11417, 5 , 4 ), // #794 - INST(Unpckhps , ExtRm , O(000F00,15,_,_,_,_,_,_ ), 0 , 4 , 0 , 11427, 5 , 5 ), // #795 - INST(Unpcklpd , ExtRm , O(660F00,14,_,_,_,_,_,_ ), 0 , 3 , 0 , 11437, 5 , 4 ), // #796 - INST(Unpcklps , ExtRm , O(000F00,14,_,_,_,_,_,_ ), 0 , 4 , 0 , 11447, 5 , 5 ), // #797 - INST(V4fmaddps , VexRm_T1_4X , E(F20F38,9A,_,2,_,0,4,T4X), 0 , 101, 0 , 3247 , 194, 130), // #798 - INST(V4fmaddss , VexRm_T1_4X , E(F20F38,9B,_,0,_,0,4,T4X), 0 , 102, 0 , 3257 , 195, 130), // #799 - INST(V4fnmaddps , VexRm_T1_4X , E(F20F38,AA,_,2,_,0,4,T4X), 0 , 101, 0 , 3267 , 194, 130), // #800 - INST(V4fnmaddss , VexRm_T1_4X , E(F20F38,AB,_,0,_,0,4,T4X), 0 , 102, 0 , 3278 , 195, 130), // #801 - INST(Vaddpd , VexRvm_Lx , V(660F00,58,_,x,I,1,4,FV ), 0 , 103, 0 , 3289 , 196, 131), // #802 - INST(Vaddph , VexRvm_Lx , E(00MAP5,58,_,_,_,0,4,FV ), 0 , 104, 0 , 3296 , 197, 132), // #803 - INST(Vaddps , VexRvm_Lx , V(000F00,58,_,x,I,0,4,FV ), 0 , 105, 0 , 3303 , 198, 131), // #804 - INST(Vaddsd , VexRvm , V(F20F00,58,_,I,I,1,3,T1S), 0 , 106, 0 , 3310 , 199, 133), // #805 - INST(Vaddsh , VexRvm , E(F3MAP5,58,_,_,_,0,1,T1S), 0 , 107, 0 , 3317 , 200, 134), // #806 - INST(Vaddss , VexRvm , V(F30F00,58,_,I,I,0,2,T1S), 0 , 108, 0 , 3324 , 201, 133), // #807 - INST(Vaddsubpd , VexRvm_Lx , V(660F00,D0,_,x,I,_,_,_ ), 0 , 69 , 0 , 3331 , 202, 135), // #808 - INST(Vaddsubps , VexRvm_Lx , V(F20F00,D0,_,x,I,_,_,_ ), 0 , 109, 0 , 3341 , 202, 135), // #809 - INST(Vaesdec , VexRvm_Lx , V(660F38,DE,_,x,I,_,4,FVM), 0 , 110, 0 , 3351 , 203, 136), // #810 - INST(Vaesdeclast , VexRvm_Lx , V(660F38,DF,_,x,I,_,4,FVM), 0 , 110, 0 , 3359 , 203, 136), // #811 - INST(Vaesenc , VexRvm_Lx , V(660F38,DC,_,x,I,_,4,FVM), 0 , 110, 0 , 3371 , 203, 136), // #812 - INST(Vaesenclast , VexRvm_Lx , V(660F38,DD,_,x,I,_,4,FVM), 0 , 110, 0 , 3379 , 203, 136), // #813 - INST(Vaesimc , VexRm , V(660F38,DB,_,0,I,_,_,_ ), 0 , 96 , 0 , 3391 , 204, 137), // #814 - INST(Vaeskeygenassist , VexRmi , V(660F3A,DF,_,0,I,_,_,_ ), 0 , 73 , 0 , 3399 , 205, 137), // #815 - INST(Valignd , VexRvmi_Lx , E(660F3A,03,_,x,_,0,4,FV ), 0 , 111, 0 , 3416 , 206, 138), // #816 - INST(Valignq , VexRvmi_Lx , E(660F3A,03,_,x,_,1,4,FV ), 0 , 112, 0 , 3424 , 207, 138), // #817 - INST(Vandnpd , VexRvm_Lx , V(660F00,55,_,x,I,1,4,FV ), 0 , 103, 0 , 3432 , 208, 139), // #818 - INST(Vandnps , VexRvm_Lx , V(000F00,55,_,x,I,0,4,FV ), 0 , 105, 0 , 3440 , 209, 139), // #819 - INST(Vandpd , VexRvm_Lx , V(660F00,54,_,x,I,1,4,FV ), 0 , 103, 0 , 3448 , 210, 139), // #820 - INST(Vandps , VexRvm_Lx , V(000F00,54,_,x,I,0,4,FV ), 0 , 105, 0 , 3455 , 211, 139), // #821 - INST(Vblendmpd , VexRvm_Lx , E(660F38,65,_,x,_,1,4,FV ), 0 , 113, 0 , 3462 , 212, 138), // #822 - INST(Vblendmps , VexRvm_Lx , E(660F38,65,_,x,_,0,4,FV ), 0 , 114, 0 , 3472 , 213, 138), // #823 - INST(Vblendpd , VexRvmi_Lx , V(660F3A,0D,_,x,I,_,_,_ ), 0 , 73 , 0 , 3482 , 214, 135), // #824 - INST(Vblendps , VexRvmi_Lx , V(660F3A,0C,_,x,I,_,_,_ ), 0 , 73 , 0 , 3491 , 214, 135), // #825 - INST(Vblendvpd , VexRvmr_Lx , V(660F3A,4B,_,x,0,_,_,_ ), 0 , 73 , 0 , 3500 , 215, 135), // #826 - INST(Vblendvps , VexRvmr_Lx , V(660F3A,4A,_,x,0,_,_,_ ), 0 , 73 , 0 , 3510 , 215, 135), // #827 - INST(Vbroadcastf128 , VexRm , V(660F38,1A,_,1,0,_,_,_ ), 0 , 115, 0 , 3520 , 216, 135), // #828 - INST(Vbroadcastf32x2 , VexRm_Lx , E(660F38,19,_,x,_,0,3,T2 ), 0 , 116, 0 , 3535 , 217, 140), // #829 - INST(Vbroadcastf32x4 , VexRm_Lx , E(660F38,1A,_,x,_,0,4,T4 ), 0 , 117, 0 , 3551 , 218, 68 ), // #830 - INST(Vbroadcastf32x8 , VexRm , E(660F38,1B,_,2,_,0,5,T8 ), 0 , 118, 0 , 3567 , 219, 66 ), // #831 - INST(Vbroadcastf64x2 , VexRm_Lx , E(660F38,1A,_,x,_,1,4,T2 ), 0 , 119, 0 , 3583 , 218, 140), // #832 - INST(Vbroadcastf64x4 , VexRm , E(660F38,1B,_,2,_,1,5,T4 ), 0 , 120, 0 , 3599 , 219, 68 ), // #833 - INST(Vbroadcasti128 , VexRm , V(660F38,5A,_,1,0,_,_,_ ), 0 , 115, 0 , 3615 , 216, 141), // #834 - INST(Vbroadcasti32x2 , VexRm_Lx , E(660F38,59,_,x,_,0,3,T2 ), 0 , 116, 0 , 3630 , 220, 140), // #835 - INST(Vbroadcasti32x4 , VexRm_Lx , E(660F38,5A,_,x,_,0,4,T4 ), 0 , 117, 0 , 3646 , 218, 138), // #836 - INST(Vbroadcasti32x8 , VexRm , E(660F38,5B,_,2,_,0,5,T8 ), 0 , 118, 0 , 3662 , 219, 66 ), // #837 - INST(Vbroadcasti64x2 , VexRm_Lx , E(660F38,5A,_,x,_,1,4,T2 ), 0 , 119, 0 , 3678 , 218, 140), // #838 - INST(Vbroadcasti64x4 , VexRm , E(660F38,5B,_,2,_,1,5,T4 ), 0 , 120, 0 , 3694 , 219, 68 ), // #839 - INST(Vbroadcastsd , VexRm_Lx , V(660F38,19,_,x,0,1,3,T1S), 0 , 121, 0 , 3710 , 221, 142), // #840 - INST(Vbroadcastss , VexRm_Lx , V(660F38,18,_,x,0,0,2,T1S), 0 , 122, 0 , 3723 , 222, 142), // #841 - INST(Vcmppd , VexRvmi_Lx_KEvex , V(660F00,C2,_,x,I,1,4,FV ), 0 , 103, 0 , 3736 , 223, 131), // #842 - INST(Vcmpph , VexRvmi_Lx_KEvex , E(000F3A,C2,_,_,_,0,4,FV ), 0 , 123, 0 , 3743 , 224, 132), // #843 - INST(Vcmpps , VexRvmi_Lx_KEvex , V(000F00,C2,_,x,I,0,4,FV ), 0 , 105, 0 , 3750 , 225, 131), // #844 - INST(Vcmpsd , VexRvmi_KEvex , V(F20F00,C2,_,I,I,1,3,T1S), 0 , 106, 0 , 3757 , 226, 133), // #845 - INST(Vcmpsh , VexRvmi_KEvex , E(F30F3A,C2,_,_,_,0,1,T1S), 0 , 124, 0 , 3764 , 227, 134), // #846 - INST(Vcmpss , VexRvmi_KEvex , V(F30F00,C2,_,I,I,0,2,T1S), 0 , 108, 0 , 3771 , 228, 133), // #847 - INST(Vcomisd , VexRm , V(660F00,2F,_,I,I,1,3,T1S), 0 , 125, 0 , 3778 , 229, 143), // #848 - INST(Vcomish , VexRm , E(00MAP5,2F,_,_,_,0,1,T1S), 0 , 126, 0 , 3786 , 230, 134), // #849 - INST(Vcomiss , VexRm , V(000F00,2F,_,I,I,0,2,T1S), 0 , 127, 0 , 3794 , 231, 143), // #850 - INST(Vcompresspd , VexMr_Lx , E(660F38,8A,_,x,_,1,3,T1S), 0 , 128, 0 , 3802 , 232, 138), // #851 - INST(Vcompressps , VexMr_Lx , E(660F38,8A,_,x,_,0,2,T1S), 0 , 129, 0 , 3814 , 232, 138), // #852 - INST(Vcvtdq2pd , VexRm_Lx , V(F30F00,E6,_,x,I,0,3,HV ), 0 , 130, 0 , 3826 , 233, 131), // #853 - INST(Vcvtdq2ph , VexRm_Lx , E(00MAP5,5B,_,_,_,0,4,FV ), 0 , 104, 0 , 3836 , 234, 132), // #854 - INST(Vcvtdq2ps , VexRm_Lx , V(000F00,5B,_,x,I,0,4,FV ), 0 , 105, 0 , 3846 , 235, 131), // #855 - INST(Vcvtne2ps2bf16 , VexRvm_Lx , E(F20F38,72,_,_,_,0,4,FV ), 0 , 131, 0 , 3856 , 213, 144), // #856 - INST(Vcvtneps2bf16 , VexRm_Lx_Narrow , E(F30F38,72,_,_,_,0,4,FV ), 0 , 132, 0 , 3871 , 236, 144), // #857 - INST(Vcvtpd2dq , VexRm_Lx_Narrow , V(F20F00,E6,_,x,I,1,4,FV ), 0 , 133, 0 , 3885 , 237, 131), // #858 - INST(Vcvtpd2ph , VexRm_Lx , E(66MAP5,5A,_,_,_,1,4,FV ), 0 , 134, 0 , 3895 , 238, 132), // #859 - INST(Vcvtpd2ps , VexRm_Lx_Narrow , V(660F00,5A,_,x,I,1,4,FV ), 0 , 103, 0 , 3905 , 237, 131), // #860 - INST(Vcvtpd2qq , VexRm_Lx , E(660F00,7B,_,x,_,1,4,FV ), 0 , 135, 0 , 3915 , 239, 140), // #861 - INST(Vcvtpd2udq , VexRm_Lx_Narrow , E(000F00,79,_,x,_,1,4,FV ), 0 , 136, 0 , 3925 , 240, 138), // #862 - INST(Vcvtpd2uqq , VexRm_Lx , E(660F00,79,_,x,_,1,4,FV ), 0 , 135, 0 , 3936 , 239, 140), // #863 - INST(Vcvtph2dq , VexRm_Lx , E(66MAP5,5B,_,_,_,0,3,HV ), 0 , 137, 0 , 3947 , 241, 132), // #864 - INST(Vcvtph2pd , VexRm_Lx , E(00MAP5,5A,_,_,_,0,2,QV ), 0 , 138, 0 , 3957 , 242, 132), // #865 - INST(Vcvtph2ps , VexRm_Lx , V(660F38,13,_,x,0,0,3,HVM), 0 , 139, 0 , 3967 , 243, 145), // #866 - INST(Vcvtph2psx , VexRm_Lx , E(66MAP6,13,_,_,_,0,3,HV ), 0 , 140, 0 , 3977 , 244, 132), // #867 - INST(Vcvtph2qq , VexRm_Lx , E(66MAP5,7B,_,_,_,0,2,QV ), 0 , 141, 0 , 3988 , 245, 132), // #868 - INST(Vcvtph2udq , VexRm_Lx , E(00MAP5,79,_,_,_,0,3,HV ), 0 , 142, 0 , 3998 , 241, 132), // #869 - INST(Vcvtph2uqq , VexRm_Lx , E(66MAP5,79,_,_,_,0,2,QV ), 0 , 141, 0 , 4009 , 245, 132), // #870 - INST(Vcvtph2uw , VexRm_Lx , E(00MAP5,7D,_,_,_,0,4,FV ), 0 , 104, 0 , 4020 , 246, 132), // #871 - INST(Vcvtph2w , VexRm_Lx , E(66MAP5,7D,_,_,_,0,4,FV ), 0 , 143, 0 , 4030 , 246, 132), // #872 - INST(Vcvtps2dq , VexRm_Lx , V(660F00,5B,_,x,I,0,4,FV ), 0 , 144, 0 , 4039 , 235, 131), // #873 - INST(Vcvtps2pd , VexRm_Lx , V(000F00,5A,_,x,I,0,3,HV ), 0 , 145, 0 , 4049 , 247, 131), // #874 - INST(Vcvtps2ph , VexMri_Lx , V(660F3A,1D,_,x,0,0,3,HVM), 0 , 146, 0 , 4059 , 248, 145), // #875 - INST(Vcvtps2phx , VexRm_Lx , E(66MAP5,1D,_,_,_,0,4,FV ), 0 , 143, 0 , 4069 , 234, 132), // #876 - INST(Vcvtps2qq , VexRm_Lx , E(660F00,7B,_,x,_,0,3,HV ), 0 , 147, 0 , 4080 , 249, 140), // #877 - INST(Vcvtps2udq , VexRm_Lx , E(000F00,79,_,x,_,0,4,FV ), 0 , 148, 0 , 4090 , 250, 138), // #878 - INST(Vcvtps2uqq , VexRm_Lx , E(660F00,79,_,x,_,0,3,HV ), 0 , 147, 0 , 4101 , 249, 140), // #879 - INST(Vcvtqq2pd , VexRm_Lx , E(F30F00,E6,_,x,_,1,4,FV ), 0 , 149, 0 , 4112 , 239, 140), // #880 - INST(Vcvtqq2ph , VexRm_Lx , E(00MAP5,5B,_,_,_,1,4,FV ), 0 , 150, 0 , 4122 , 238, 132), // #881 - INST(Vcvtqq2ps , VexRm_Lx_Narrow , E(000F00,5B,_,x,_,1,4,FV ), 0 , 136, 0 , 4132 , 240, 140), // #882 - INST(Vcvtsd2sh , VexRvm , E(F2MAP5,5A,_,_,_,1,3,T1S), 0 , 151, 0 , 4142 , 251, 134), // #883 - INST(Vcvtsd2si , VexRm_Wx , V(F20F00,2D,_,I,x,x,3,T1F), 0 , 152, 0 , 4152 , 252, 133), // #884 - INST(Vcvtsd2ss , VexRvm , V(F20F00,5A,_,I,I,1,3,T1S), 0 , 106, 0 , 4162 , 199, 133), // #885 - INST(Vcvtsd2usi , VexRm_Wx , E(F20F00,79,_,I,_,x,3,T1F), 0 , 153, 0 , 4172 , 253, 68 ), // #886 - INST(Vcvtsh2sd , VexRvm , E(F3MAP5,5A,_,_,_,0,1,T1S), 0 , 107, 0 , 4183 , 254, 134), // #887 - INST(Vcvtsh2si , VexRm_Wx , E(F3MAP5,2D,_,_,_,x,1,T1S), 0 , 107, 0 , 4193 , 255, 134), // #888 - INST(Vcvtsh2ss , VexRvm , E(00MAP6,13,_,_,_,0,1,T1S), 0 , 154, 0 , 4203 , 254, 134), // #889 - INST(Vcvtsh2usi , VexRm_Wx , E(F3MAP5,79,_,_,_,x,1,T1S), 0 , 107, 0 , 4213 , 255, 134), // #890 - INST(Vcvtsi2sd , VexRvm_Wx , V(F20F00,2A,_,I,x,x,2,T1W), 0 , 155, 0 , 4224 , 256, 133), // #891 - INST(Vcvtsi2sh , VexRvm_Wx , E(F3MAP5,2A,_,_,_,x,2,T1W), 0 , 156, 0 , 4234 , 257, 134), // #892 - INST(Vcvtsi2ss , VexRvm_Wx , V(F30F00,2A,_,I,x,x,2,T1W), 0 , 157, 0 , 4244 , 256, 133), // #893 - INST(Vcvtss2sd , VexRvm , V(F30F00,5A,_,I,I,0,2,T1S), 0 , 108, 0 , 4254 , 258, 133), // #894 - INST(Vcvtss2sh , VexRvm , E(00MAP5,1D,_,_,_,0,2,T1S), 0 , 158, 0 , 4264 , 259, 134), // #895 - INST(Vcvtss2si , VexRm_Wx , V(F30F00,2D,_,I,x,x,2,T1F), 0 , 108, 0 , 4274 , 260, 133), // #896 - INST(Vcvtss2usi , VexRm_Wx , E(F30F00,79,_,I,_,x,2,T1F), 0 , 159, 0 , 4284 , 261, 68 ), // #897 - INST(Vcvttpd2dq , VexRm_Lx_Narrow , V(660F00,E6,_,x,I,1,4,FV ), 0 , 103, 0 , 4295 , 262, 131), // #898 - INST(Vcvttpd2qq , VexRm_Lx , E(660F00,7A,_,x,_,1,4,FV ), 0 , 135, 0 , 4306 , 263, 138), // #899 - INST(Vcvttpd2udq , VexRm_Lx_Narrow , E(000F00,78,_,x,_,1,4,FV ), 0 , 136, 0 , 4317 , 264, 138), // #900 - INST(Vcvttpd2uqq , VexRm_Lx , E(660F00,78,_,x,_,1,4,FV ), 0 , 135, 0 , 4329 , 263, 140), // #901 - INST(Vcvttph2dq , VexRm_Lx , E(F3MAP5,5B,_,_,_,0,3,HV ), 0 , 160, 0 , 4341 , 244, 132), // #902 - INST(Vcvttph2qq , VexRm_Lx , E(66MAP5,7A,_,_,_,0,2,QV ), 0 , 141, 0 , 4352 , 242, 132), // #903 - INST(Vcvttph2udq , VexRm_Lx , E(00MAP5,78,_,_,_,0,3,HV ), 0 , 142, 0 , 4363 , 244, 132), // #904 - INST(Vcvttph2uqq , VexRm_Lx , E(66MAP5,78,_,_,_,0,2,QV ), 0 , 141, 0 , 4375 , 242, 132), // #905 - INST(Vcvttph2uw , VexRm_Lx , E(00MAP5,7C,_,_,_,0,4,FV ), 0 , 104, 0 , 4387 , 265, 132), // #906 - INST(Vcvttph2w , VexRm_Lx , E(66MAP5,7C,_,_,_,0,4,FV ), 0 , 143, 0 , 4398 , 265, 132), // #907 - INST(Vcvttps2dq , VexRm_Lx , V(F30F00,5B,_,x,I,0,4,FV ), 0 , 161, 0 , 4408 , 266, 131), // #908 - INST(Vcvttps2qq , VexRm_Lx , E(660F00,7A,_,x,_,0,3,HV ), 0 , 147, 0 , 4419 , 267, 140), // #909 - INST(Vcvttps2udq , VexRm_Lx , E(000F00,78,_,x,_,0,4,FV ), 0 , 148, 0 , 4430 , 268, 138), // #910 - INST(Vcvttps2uqq , VexRm_Lx , E(660F00,78,_,x,_,0,3,HV ), 0 , 147, 0 , 4442 , 267, 140), // #911 - INST(Vcvttsd2si , VexRm_Wx , V(F20F00,2C,_,I,x,x,3,T1F), 0 , 152, 0 , 4454 , 269, 133), // #912 - INST(Vcvttsd2usi , VexRm_Wx , E(F20F00,78,_,I,_,x,3,T1F), 0 , 153, 0 , 4465 , 270, 68 ), // #913 - INST(Vcvttsh2si , VexRm_Wx , E(F3MAP5,2C,_,_,_,x,1,T1S), 0 , 107, 0 , 4477 , 271, 134), // #914 - INST(Vcvttsh2usi , VexRm_Wx , E(F3MAP5,78,_,_,_,x,1,T1S), 0 , 107, 0 , 4488 , 271, 134), // #915 - INST(Vcvttss2si , VexRm_Wx , V(F30F00,2C,_,I,x,x,2,T1F), 0 , 108, 0 , 4500 , 272, 133), // #916 - INST(Vcvttss2usi , VexRm_Wx , E(F30F00,78,_,I,_,x,2,T1F), 0 , 159, 0 , 4511 , 273, 68 ), // #917 - INST(Vcvtudq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,0,3,HV ), 0 , 162, 0 , 4523 , 274, 138), // #918 - INST(Vcvtudq2ph , VexRm_Lx , E(F2MAP5,7A,_,_,_,0,4,FV ), 0 , 163, 0 , 4534 , 234, 132), // #919 - INST(Vcvtudq2ps , VexRm_Lx , E(F20F00,7A,_,x,_,0,4,FV ), 0 , 164, 0 , 4545 , 250, 138), // #920 - INST(Vcvtuqq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,1,4,FV ), 0 , 149, 0 , 4556 , 239, 140), // #921 - INST(Vcvtuqq2ph , VexRm_Lx , E(F2MAP5,7A,_,_,_,1,4,FV ), 0 , 165, 0 , 4567 , 238, 132), // #922 - INST(Vcvtuqq2ps , VexRm_Lx_Narrow , E(F20F00,7A,_,x,_,1,4,FV ), 0 , 166, 0 , 4578 , 240, 140), // #923 - INST(Vcvtusi2sd , VexRvm_Wx , E(F20F00,7B,_,I,_,x,2,T1W), 0 , 167, 0 , 4589 , 257, 68 ), // #924 - INST(Vcvtusi2sh , VexRvm_Wx , E(F3MAP5,7B,_,_,_,x,2,T1W), 0 , 156, 0 , 4600 , 257, 134), // #925 - INST(Vcvtusi2ss , VexRvm_Wx , E(F30F00,7B,_,I,_,x,2,T1W), 0 , 168, 0 , 4611 , 257, 68 ), // #926 - INST(Vcvtuw2ph , VexRm_Lx , E(F2MAP5,7D,_,_,_,0,4,FV ), 0 , 163, 0 , 4622 , 246, 132), // #927 - INST(Vcvtw2ph , VexRm_Lx , E(F3MAP5,7D,_,_,_,0,4,FV ), 0 , 169, 0 , 4632 , 246, 132), // #928 - INST(Vdbpsadbw , VexRvmi_Lx , E(660F3A,42,_,x,_,0,4,FVM), 0 , 111, 0 , 4641 , 275, 146), // #929 - INST(Vdivpd , VexRvm_Lx , V(660F00,5E,_,x,I,1,4,FV ), 0 , 103, 0 , 4651 , 196, 131), // #930 - INST(Vdivph , VexRvm_Lx , E(00MAP5,5E,_,_,_,0,4,FV ), 0 , 104, 0 , 4658 , 197, 132), // #931 - INST(Vdivps , VexRvm_Lx , V(000F00,5E,_,x,I,0,4,FV ), 0 , 105, 0 , 4665 , 198, 131), // #932 - INST(Vdivsd , VexRvm , V(F20F00,5E,_,I,I,1,3,T1S), 0 , 106, 0 , 4672 , 199, 133), // #933 - INST(Vdivsh , VexRvm , E(F3MAP5,5E,_,_,_,0,1,T1S), 0 , 107, 0 , 4679 , 200, 134), // #934 - INST(Vdivss , VexRvm , V(F30F00,5E,_,I,I,0,2,T1S), 0 , 108, 0 , 4686 , 201, 133), // #935 - INST(Vdpbf16ps , VexRvm_Lx , E(F30F38,52,_,_,_,0,4,FV ), 0 , 132, 0 , 4693 , 213, 144), // #936 - INST(Vdppd , VexRvmi_Lx , V(660F3A,41,_,x,I,_,_,_ ), 0 , 73 , 0 , 4703 , 276, 135), // #937 - INST(Vdpps , VexRvmi_Lx , V(660F3A,40,_,x,I,_,_,_ ), 0 , 73 , 0 , 4709 , 214, 135), // #938 - INST(Verr , X86M_NoSize , O(000F00,00,4,_,_,_,_,_ ), 0 , 97 , 0 , 4715 , 107, 10 ), // #939 - INST(Verw , X86M_NoSize , O(000F00,00,5,_,_,_,_,_ ), 0 , 77 , 0 , 4720 , 107, 10 ), // #940 - INST(Vexp2pd , VexRm , E(660F38,C8,_,2,_,1,4,FV ), 0 , 170, 0 , 4725 , 277, 147), // #941 - INST(Vexp2ps , VexRm , E(660F38,C8,_,2,_,0,4,FV ), 0 , 171, 0 , 4733 , 278, 147), // #942 - INST(Vexpandpd , VexRm_Lx , E(660F38,88,_,x,_,1,3,T1S), 0 , 128, 0 , 4741 , 279, 138), // #943 - INST(Vexpandps , VexRm_Lx , E(660F38,88,_,x,_,0,2,T1S), 0 , 129, 0 , 4751 , 279, 138), // #944 - INST(Vextractf128 , VexMri , V(660F3A,19,_,1,0,_,_,_ ), 0 , 172, 0 , 4761 , 280, 135), // #945 - INST(Vextractf32x4 , VexMri_Lx , E(660F3A,19,_,x,_,0,4,T4 ), 0 , 173, 0 , 4774 , 281, 138), // #946 - INST(Vextractf32x8 , VexMri , E(660F3A,1B,_,2,_,0,5,T8 ), 0 , 174, 0 , 4788 , 282, 66 ), // #947 - INST(Vextractf64x2 , VexMri_Lx , E(660F3A,19,_,x,_,1,4,T2 ), 0 , 175, 0 , 4802 , 281, 140), // #948 - INST(Vextractf64x4 , VexMri , E(660F3A,1B,_,2,_,1,5,T4 ), 0 , 176, 0 , 4816 , 282, 68 ), // #949 - INST(Vextracti128 , VexMri , V(660F3A,39,_,1,0,_,_,_ ), 0 , 172, 0 , 4830 , 280, 141), // #950 - INST(Vextracti32x4 , VexMri_Lx , E(660F3A,39,_,x,_,0,4,T4 ), 0 , 173, 0 , 4843 , 281, 138), // #951 - INST(Vextracti32x8 , VexMri , E(660F3A,3B,_,2,_,0,5,T8 ), 0 , 174, 0 , 4857 , 282, 66 ), // #952 - INST(Vextracti64x2 , VexMri_Lx , E(660F3A,39,_,x,_,1,4,T2 ), 0 , 175, 0 , 4871 , 281, 140), // #953 - INST(Vextracti64x4 , VexMri , E(660F3A,3B,_,2,_,1,5,T4 ), 0 , 176, 0 , 4885 , 282, 68 ), // #954 - INST(Vextractps , VexMri , V(660F3A,17,_,0,I,I,2,T1S), 0 , 177, 0 , 4899 , 283, 133), // #955 - INST(Vfcmaddcph , VexRvm_Lx , E(F2MAP6,56,_,_,_,0,4,FV ), 0 , 178, 0 , 4910 , 284, 132), // #956 - INST(Vfcmaddcsh , VexRvm , E(F2MAP6,57,_,_,_,0,2,T1S), 0 , 179, 0 , 4921 , 259, 132), // #957 - INST(Vfcmulcph , VexRvm_Lx , E(F2MAP6,D6,_,_,_,0,4,FV ), 0 , 178, 0 , 4932 , 284, 132), // #958 - INST(Vfcmulcsh , VexRvm , E(F2MAP6,D7,_,_,_,0,2,T1S), 0 , 179, 0 , 4942 , 259, 132), // #959 - INST(Vfixupimmpd , VexRvmi_Lx , E(660F3A,54,_,x,_,1,4,FV ), 0 , 112, 0 , 4952 , 285, 138), // #960 - INST(Vfixupimmps , VexRvmi_Lx , E(660F3A,54,_,x,_,0,4,FV ), 0 , 111, 0 , 4964 , 286, 138), // #961 - INST(Vfixupimmsd , VexRvmi , E(660F3A,55,_,I,_,1,3,T1S), 0 , 180, 0 , 4976 , 287, 68 ), // #962 - INST(Vfixupimmss , VexRvmi , E(660F3A,55,_,I,_,0,2,T1S), 0 , 181, 0 , 4988 , 288, 68 ), // #963 - INST(Vfmadd132pd , VexRvm_Lx , V(660F38,98,_,x,1,1,4,FV ), 0 , 182, 0 , 5000 , 196, 148), // #964 - INST(Vfmadd132ph , VexRvm_Lx , E(66MAP6,98,_,_,_,0,4,FV ), 0 , 183, 0 , 5012 , 197, 132), // #965 - INST(Vfmadd132ps , VexRvm_Lx , V(660F38,98,_,x,0,0,4,FV ), 0 , 110, 0 , 5024 , 198, 148), // #966 - INST(Vfmadd132sd , VexRvm , V(660F38,99,_,I,1,1,3,T1S), 0 , 184, 0 , 5036 , 199, 149), // #967 - INST(Vfmadd132sh , VexRvm , E(66MAP6,99,_,_,_,0,1,T1S), 0 , 185, 0 , 5048 , 200, 134), // #968 - INST(Vfmadd132ss , VexRvm , V(660F38,99,_,I,0,0,2,T1S), 0 , 122, 0 , 5060 , 201, 149), // #969 - INST(Vfmadd213pd , VexRvm_Lx , V(660F38,A8,_,x,1,1,4,FV ), 0 , 182, 0 , 5072 , 196, 148), // #970 - INST(Vfmadd213ph , VexRvm_Lx , E(66MAP6,A8,_,_,_,0,4,FV ), 0 , 183, 0 , 5084 , 197, 132), // #971 - INST(Vfmadd213ps , VexRvm_Lx , V(660F38,A8,_,x,0,0,4,FV ), 0 , 110, 0 , 5096 , 198, 148), // #972 - INST(Vfmadd213sd , VexRvm , V(660F38,A9,_,I,1,1,3,T1S), 0 , 184, 0 , 5108 , 199, 149), // #973 - INST(Vfmadd213sh , VexRvm , E(66MAP6,A9,_,_,_,0,1,T1S), 0 , 185, 0 , 5120 , 200, 134), // #974 - INST(Vfmadd213ss , VexRvm , V(660F38,A9,_,I,0,0,2,T1S), 0 , 122, 0 , 5132 , 201, 149), // #975 - INST(Vfmadd231pd , VexRvm_Lx , V(660F38,B8,_,x,1,1,4,FV ), 0 , 182, 0 , 5144 , 196, 148), // #976 - INST(Vfmadd231ph , VexRvm_Lx , E(66MAP6,B8,_,_,_,0,4,FV ), 0 , 183, 0 , 5156 , 197, 132), // #977 - INST(Vfmadd231ps , VexRvm_Lx , V(660F38,B8,_,x,0,0,4,FV ), 0 , 110, 0 , 5168 , 198, 148), // #978 - INST(Vfmadd231sd , VexRvm , V(660F38,B9,_,I,1,1,3,T1S), 0 , 184, 0 , 5180 , 199, 149), // #979 - INST(Vfmadd231sh , VexRvm , E(66MAP6,B9,_,_,_,0,1,T1S), 0 , 185, 0 , 5192 , 200, 134), // #980 - INST(Vfmadd231ss , VexRvm , V(660F38,B9,_,I,0,0,2,T1S), 0 , 122, 0 , 5204 , 201, 149), // #981 - INST(Vfmaddcph , VexRvm_Lx , E(F3MAP6,56,_,_,_,0,4,FV ), 0 , 186, 0 , 5216 , 284, 132), // #982 - INST(Vfmaddcsh , VexRvm , E(F3MAP6,57,_,_,_,0,2,T1S), 0 , 187, 0 , 5226 , 259, 132), // #983 - INST(Vfmaddpd , Fma4_Lx , V(660F3A,69,_,x,x,_,_,_ ), 0 , 73 , 0 , 5236 , 289, 150), // #984 - INST(Vfmaddps , Fma4_Lx , V(660F3A,68,_,x,x,_,_,_ ), 0 , 73 , 0 , 5245 , 289, 150), // #985 - INST(Vfmaddsd , Fma4 , V(660F3A,6B,_,0,x,_,_,_ ), 0 , 73 , 0 , 5254 , 290, 150), // #986 - INST(Vfmaddss , Fma4 , V(660F3A,6A,_,0,x,_,_,_ ), 0 , 73 , 0 , 5263 , 291, 150), // #987 - INST(Vfmaddsub132pd , VexRvm_Lx , V(660F38,96,_,x,1,1,4,FV ), 0 , 182, 0 , 5272 , 196, 148), // #988 - INST(Vfmaddsub132ph , VexRvm_Lx , E(66MAP6,96,_,_,_,0,4,FV ), 0 , 183, 0 , 5287 , 197, 132), // #989 - INST(Vfmaddsub132ps , VexRvm_Lx , V(660F38,96,_,x,0,0,4,FV ), 0 , 110, 0 , 5302 , 198, 148), // #990 - INST(Vfmaddsub213pd , VexRvm_Lx , V(660F38,A6,_,x,1,1,4,FV ), 0 , 182, 0 , 5317 , 196, 148), // #991 - INST(Vfmaddsub213ph , VexRvm_Lx , E(66MAP6,A6,_,_,_,0,4,FV ), 0 , 183, 0 , 5332 , 197, 132), // #992 - INST(Vfmaddsub213ps , VexRvm_Lx , V(660F38,A6,_,x,0,0,4,FV ), 0 , 110, 0 , 5347 , 198, 148), // #993 - INST(Vfmaddsub231pd , VexRvm_Lx , V(660F38,B6,_,x,1,1,4,FV ), 0 , 182, 0 , 5362 , 196, 148), // #994 - INST(Vfmaddsub231ph , VexRvm_Lx , E(66MAP6,B6,_,_,_,0,4,FV ), 0 , 183, 0 , 5377 , 197, 132), // #995 - INST(Vfmaddsub231ps , VexRvm_Lx , V(660F38,B6,_,x,0,0,4,FV ), 0 , 110, 0 , 5392 , 198, 148), // #996 - INST(Vfmaddsubpd , Fma4_Lx , V(660F3A,5D,_,x,x,_,_,_ ), 0 , 73 , 0 , 5407 , 289, 150), // #997 - INST(Vfmaddsubps , Fma4_Lx , V(660F3A,5C,_,x,x,_,_,_ ), 0 , 73 , 0 , 5419 , 289, 150), // #998 - INST(Vfmsub132pd , VexRvm_Lx , V(660F38,9A,_,x,1,1,4,FV ), 0 , 182, 0 , 5431 , 196, 148), // #999 - INST(Vfmsub132ph , VexRvm_Lx , E(66MAP6,9A,_,_,_,0,4,FV ), 0 , 183, 0 , 5443 , 197, 132), // #1000 - INST(Vfmsub132ps , VexRvm_Lx , V(660F38,9A,_,x,0,0,4,FV ), 0 , 110, 0 , 5455 , 198, 148), // #1001 - INST(Vfmsub132sd , VexRvm , V(660F38,9B,_,I,1,1,3,T1S), 0 , 184, 0 , 5467 , 199, 149), // #1002 - INST(Vfmsub132sh , VexRvm , E(66MAP6,9B,_,_,_,0,1,T1S), 0 , 185, 0 , 5479 , 200, 134), // #1003 - INST(Vfmsub132ss , VexRvm , V(660F38,9B,_,I,0,0,2,T1S), 0 , 122, 0 , 5491 , 201, 149), // #1004 - INST(Vfmsub213pd , VexRvm_Lx , V(660F38,AA,_,x,1,1,4,FV ), 0 , 182, 0 , 5503 , 196, 148), // #1005 - INST(Vfmsub213ph , VexRvm_Lx , E(66MAP6,AA,_,_,_,0,4,FV ), 0 , 183, 0 , 5515 , 197, 132), // #1006 - INST(Vfmsub213ps , VexRvm_Lx , V(660F38,AA,_,x,0,0,4,FV ), 0 , 110, 0 , 5527 , 198, 148), // #1007 - INST(Vfmsub213sd , VexRvm , V(660F38,AB,_,I,1,1,3,T1S), 0 , 184, 0 , 5539 , 199, 149), // #1008 - INST(Vfmsub213sh , VexRvm , E(66MAP6,AB,_,_,_,0,1,T1S), 0 , 185, 0 , 5551 , 200, 134), // #1009 - INST(Vfmsub213ss , VexRvm , V(660F38,AB,_,I,0,0,2,T1S), 0 , 122, 0 , 5563 , 201, 149), // #1010 - INST(Vfmsub231pd , VexRvm_Lx , V(660F38,BA,_,x,1,1,4,FV ), 0 , 182, 0 , 5575 , 196, 148), // #1011 - INST(Vfmsub231ph , VexRvm_Lx , E(66MAP6,BA,_,_,_,0,4,FV ), 0 , 183, 0 , 5587 , 197, 132), // #1012 - INST(Vfmsub231ps , VexRvm_Lx , V(660F38,BA,_,x,0,0,4,FV ), 0 , 110, 0 , 5599 , 198, 148), // #1013 - INST(Vfmsub231sd , VexRvm , V(660F38,BB,_,I,1,1,3,T1S), 0 , 184, 0 , 5611 , 199, 149), // #1014 - INST(Vfmsub231sh , VexRvm , E(66MAP6,BB,_,_,_,0,1,T1S), 0 , 185, 0 , 5623 , 200, 134), // #1015 - INST(Vfmsub231ss , VexRvm , V(660F38,BB,_,I,0,0,2,T1S), 0 , 122, 0 , 5635 , 201, 149), // #1016 - INST(Vfmsubadd132pd , VexRvm_Lx , V(660F38,97,_,x,1,1,4,FV ), 0 , 182, 0 , 5647 , 196, 148), // #1017 - INST(Vfmsubadd132ph , VexRvm_Lx , E(66MAP6,97,_,_,_,0,4,FV ), 0 , 183, 0 , 5662 , 197, 132), // #1018 - INST(Vfmsubadd132ps , VexRvm_Lx , V(660F38,97,_,x,0,0,4,FV ), 0 , 110, 0 , 5677 , 198, 148), // #1019 - INST(Vfmsubadd213pd , VexRvm_Lx , V(660F38,A7,_,x,1,1,4,FV ), 0 , 182, 0 , 5692 , 196, 148), // #1020 - INST(Vfmsubadd213ph , VexRvm_Lx , E(66MAP6,A7,_,_,_,0,4,FV ), 0 , 183, 0 , 5707 , 197, 132), // #1021 - INST(Vfmsubadd213ps , VexRvm_Lx , V(660F38,A7,_,x,0,0,4,FV ), 0 , 110, 0 , 5722 , 198, 148), // #1022 - INST(Vfmsubadd231pd , VexRvm_Lx , V(660F38,B7,_,x,1,1,4,FV ), 0 , 182, 0 , 5737 , 196, 148), // #1023 - INST(Vfmsubadd231ph , VexRvm_Lx , E(66MAP6,B7,_,_,_,0,4,FV ), 0 , 183, 0 , 5752 , 197, 132), // #1024 - INST(Vfmsubadd231ps , VexRvm_Lx , V(660F38,B7,_,x,0,0,4,FV ), 0 , 110, 0 , 5767 , 198, 148), // #1025 - INST(Vfmsubaddpd , Fma4_Lx , V(660F3A,5F,_,x,x,_,_,_ ), 0 , 73 , 0 , 5782 , 289, 150), // #1026 - INST(Vfmsubaddps , Fma4_Lx , V(660F3A,5E,_,x,x,_,_,_ ), 0 , 73 , 0 , 5794 , 289, 150), // #1027 - INST(Vfmsubpd , Fma4_Lx , V(660F3A,6D,_,x,x,_,_,_ ), 0 , 73 , 0 , 5806 , 289, 150), // #1028 - INST(Vfmsubps , Fma4_Lx , V(660F3A,6C,_,x,x,_,_,_ ), 0 , 73 , 0 , 5815 , 289, 150), // #1029 - INST(Vfmsubsd , Fma4 , V(660F3A,6F,_,0,x,_,_,_ ), 0 , 73 , 0 , 5824 , 290, 150), // #1030 - INST(Vfmsubss , Fma4 , V(660F3A,6E,_,0,x,_,_,_ ), 0 , 73 , 0 , 5833 , 291, 150), // #1031 - INST(Vfmulcph , VexRvm_Lx , E(F3MAP6,D6,_,_,_,0,4,FV ), 0 , 186, 0 , 5842 , 284, 132), // #1032 - INST(Vfmulcsh , VexRvm , E(F3MAP6,D7,_,_,_,0,2,T1S), 0 , 187, 0 , 5851 , 259, 132), // #1033 - INST(Vfnmadd132pd , VexRvm_Lx , V(660F38,9C,_,x,1,1,4,FV ), 0 , 182, 0 , 5860 , 196, 148), // #1034 - INST(Vfnmadd132ph , VexRvm_Lx , E(66MAP6,9C,_,_,_,0,4,FV ), 0 , 183, 0 , 5873 , 197, 132), // #1035 - INST(Vfnmadd132ps , VexRvm_Lx , V(660F38,9C,_,x,0,0,4,FV ), 0 , 110, 0 , 5886 , 198, 148), // #1036 - INST(Vfnmadd132sd , VexRvm , V(660F38,9D,_,I,1,1,3,T1S), 0 , 184, 0 , 5899 , 199, 149), // #1037 - INST(Vfnmadd132sh , VexRvm , E(66MAP6,9D,_,_,_,0,1,T1S), 0 , 185, 0 , 5912 , 200, 134), // #1038 - INST(Vfnmadd132ss , VexRvm , V(660F38,9D,_,I,0,0,2,T1S), 0 , 122, 0 , 5925 , 201, 149), // #1039 - INST(Vfnmadd213pd , VexRvm_Lx , V(660F38,AC,_,x,1,1,4,FV ), 0 , 182, 0 , 5938 , 196, 148), // #1040 - INST(Vfnmadd213ph , VexRvm_Lx , E(66MAP6,AC,_,_,_,0,4,FV ), 0 , 183, 0 , 5951 , 197, 132), // #1041 - INST(Vfnmadd213ps , VexRvm_Lx , V(660F38,AC,_,x,0,0,4,FV ), 0 , 110, 0 , 5964 , 198, 148), // #1042 - INST(Vfnmadd213sd , VexRvm , V(660F38,AD,_,I,1,1,3,T1S), 0 , 184, 0 , 5977 , 199, 149), // #1043 - INST(Vfnmadd213sh , VexRvm , E(66MAP6,AD,_,_,_,0,1,T1S), 0 , 185, 0 , 5990 , 200, 134), // #1044 - INST(Vfnmadd213ss , VexRvm , V(660F38,AD,_,I,0,0,2,T1S), 0 , 122, 0 , 6003 , 201, 149), // #1045 - INST(Vfnmadd231pd , VexRvm_Lx , V(660F38,BC,_,x,1,1,4,FV ), 0 , 182, 0 , 6016 , 196, 148), // #1046 - INST(Vfnmadd231ph , VexRvm_Lx , E(66MAP6,BC,_,_,_,0,4,FV ), 0 , 183, 0 , 6029 , 197, 132), // #1047 - INST(Vfnmadd231ps , VexRvm_Lx , V(660F38,BC,_,x,0,0,4,FV ), 0 , 110, 0 , 6042 , 198, 148), // #1048 - INST(Vfnmadd231sd , VexRvm , V(660F38,BD,_,I,1,1,3,T1S), 0 , 184, 0 , 6055 , 199, 149), // #1049 - INST(Vfnmadd231sh , VexRvm , E(66MAP6,BD,_,_,_,0,1,T1S), 0 , 185, 0 , 6068 , 200, 134), // #1050 - INST(Vfnmadd231ss , VexRvm , V(660F38,BD,_,I,0,0,2,T1S), 0 , 122, 0 , 6081 , 201, 149), // #1051 - INST(Vfnmaddpd , Fma4_Lx , V(660F3A,79,_,x,x,_,_,_ ), 0 , 73 , 0 , 6094 , 289, 150), // #1052 - INST(Vfnmaddps , Fma4_Lx , V(660F3A,78,_,x,x,_,_,_ ), 0 , 73 , 0 , 6104 , 289, 150), // #1053 - INST(Vfnmaddsd , Fma4 , V(660F3A,7B,_,0,x,_,_,_ ), 0 , 73 , 0 , 6114 , 290, 150), // #1054 - INST(Vfnmaddss , Fma4 , V(660F3A,7A,_,0,x,_,_,_ ), 0 , 73 , 0 , 6124 , 291, 150), // #1055 - INST(Vfnmsub132pd , VexRvm_Lx , V(660F38,9E,_,x,1,1,4,FV ), 0 , 182, 0 , 6134 , 196, 148), // #1056 - INST(Vfnmsub132ph , VexRvm_Lx , E(66MAP6,9E,_,_,_,0,4,FV ), 0 , 183, 0 , 6147 , 197, 132), // #1057 - INST(Vfnmsub132ps , VexRvm_Lx , V(660F38,9E,_,x,0,0,4,FV ), 0 , 110, 0 , 6160 , 198, 148), // #1058 - INST(Vfnmsub132sd , VexRvm , V(660F38,9F,_,I,1,1,3,T1S), 0 , 184, 0 , 6173 , 199, 149), // #1059 - INST(Vfnmsub132sh , VexRvm , E(66MAP6,9F,_,_,_,0,1,T1S), 0 , 185, 0 , 6186 , 200, 134), // #1060 - INST(Vfnmsub132ss , VexRvm , V(660F38,9F,_,I,0,0,2,T1S), 0 , 122, 0 , 6199 , 201, 149), // #1061 - INST(Vfnmsub213pd , VexRvm_Lx , V(660F38,AE,_,x,1,1,4,FV ), 0 , 182, 0 , 6212 , 196, 148), // #1062 - INST(Vfnmsub213ph , VexRvm_Lx , E(66MAP6,AE,_,_,_,0,4,FV ), 0 , 183, 0 , 6225 , 197, 132), // #1063 - INST(Vfnmsub213ps , VexRvm_Lx , V(660F38,AE,_,x,0,0,4,FV ), 0 , 110, 0 , 6238 , 198, 148), // #1064 - INST(Vfnmsub213sd , VexRvm , V(660F38,AF,_,I,1,1,3,T1S), 0 , 184, 0 , 6251 , 199, 149), // #1065 - INST(Vfnmsub213sh , VexRvm , E(66MAP6,AF,_,_,_,0,1,T1S), 0 , 185, 0 , 6264 , 200, 134), // #1066 - INST(Vfnmsub213ss , VexRvm , V(660F38,AF,_,I,0,0,2,T1S), 0 , 122, 0 , 6277 , 201, 149), // #1067 - INST(Vfnmsub231pd , VexRvm_Lx , V(660F38,BE,_,x,1,1,4,FV ), 0 , 182, 0 , 6290 , 196, 148), // #1068 - INST(Vfnmsub231ph , VexRvm_Lx , E(66MAP6,BE,_,_,_,0,4,FV ), 0 , 183, 0 , 6303 , 197, 132), // #1069 - INST(Vfnmsub231ps , VexRvm_Lx , V(660F38,BE,_,x,0,0,4,FV ), 0 , 110, 0 , 6316 , 198, 148), // #1070 - INST(Vfnmsub231sd , VexRvm , V(660F38,BF,_,I,1,1,3,T1S), 0 , 184, 0 , 6329 , 199, 149), // #1071 - INST(Vfnmsub231sh , VexRvm , E(66MAP6,BF,_,_,_,0,1,T1S), 0 , 185, 0 , 6342 , 200, 134), // #1072 - INST(Vfnmsub231ss , VexRvm , V(660F38,BF,_,I,0,0,2,T1S), 0 , 122, 0 , 6355 , 201, 149), // #1073 - INST(Vfnmsubpd , Fma4_Lx , V(660F3A,7D,_,x,x,_,_,_ ), 0 , 73 , 0 , 6368 , 289, 150), // #1074 - INST(Vfnmsubps , Fma4_Lx , V(660F3A,7C,_,x,x,_,_,_ ), 0 , 73 , 0 , 6378 , 289, 150), // #1075 - INST(Vfnmsubsd , Fma4 , V(660F3A,7F,_,0,x,_,_,_ ), 0 , 73 , 0 , 6388 , 290, 150), // #1076 - INST(Vfnmsubss , Fma4 , V(660F3A,7E,_,0,x,_,_,_ ), 0 , 73 , 0 , 6398 , 291, 150), // #1077 - INST(Vfpclasspd , VexRmi_Lx , E(660F3A,66,_,x,_,1,4,FV ), 0 , 112, 0 , 6408 , 292, 140), // #1078 - INST(Vfpclassph , VexRmi_Lx , E(000F3A,66,_,_,_,0,4,FV ), 0 , 123, 0 , 6419 , 293, 132), // #1079 - INST(Vfpclassps , VexRmi_Lx , E(660F3A,66,_,x,_,0,4,FV ), 0 , 111, 0 , 6430 , 294, 140), // #1080 - INST(Vfpclasssd , VexRmi , E(660F3A,67,_,I,_,1,3,T1S), 0 , 180, 0 , 6441 , 295, 66 ), // #1081 - INST(Vfpclasssh , VexRmi , E(000F3A,67,_,_,_,0,1,T1S), 0 , 188, 0 , 6452 , 296, 134), // #1082 - INST(Vfpclassss , VexRmi , E(660F3A,67,_,I,_,0,2,T1S), 0 , 181, 0 , 6463 , 297, 66 ), // #1083 - INST(Vfrczpd , VexRm_Lx , V(XOP_M9,81,_,x,0,_,_,_ ), 0 , 79 , 0 , 6474 , 298, 151), // #1084 - INST(Vfrczps , VexRm_Lx , V(XOP_M9,80,_,x,0,_,_,_ ), 0 , 79 , 0 , 6482 , 298, 151), // #1085 - INST(Vfrczsd , VexRm , V(XOP_M9,83,_,0,0,_,_,_ ), 0 , 79 , 0 , 6490 , 299, 151), // #1086 - INST(Vfrczss , VexRm , V(XOP_M9,82,_,0,0,_,_,_ ), 0 , 79 , 0 , 6498 , 300, 151), // #1087 - INST(Vgatherdpd , VexRmvRm_VM , V(660F38,92,_,x,1,_,_,_ ), E(660F38,92,_,x,_,1,3,T1S), 189, 80 , 6506 , 301, 152), // #1088 - INST(Vgatherdps , VexRmvRm_VM , V(660F38,92,_,x,0,_,_,_ ), E(660F38,92,_,x,_,0,2,T1S), 96 , 81 , 6517 , 302, 152), // #1089 - INST(Vgatherpf0dpd , VexM_VM , E(660F38,C6,1,2,_,1,3,T1S), 0 , 190, 0 , 6528 , 303, 153), // #1090 - INST(Vgatherpf0dps , VexM_VM , E(660F38,C6,1,2,_,0,2,T1S), 0 , 191, 0 , 6542 , 304, 153), // #1091 - INST(Vgatherpf0qpd , VexM_VM , E(660F38,C7,1,2,_,1,3,T1S), 0 , 190, 0 , 6556 , 305, 153), // #1092 - INST(Vgatherpf0qps , VexM_VM , E(660F38,C7,1,2,_,0,2,T1S), 0 , 191, 0 , 6570 , 305, 153), // #1093 - INST(Vgatherpf1dpd , VexM_VM , E(660F38,C6,2,2,_,1,3,T1S), 0 , 192, 0 , 6584 , 303, 153), // #1094 - INST(Vgatherpf1dps , VexM_VM , E(660F38,C6,2,2,_,0,2,T1S), 0 , 193, 0 , 6598 , 304, 153), // #1095 - INST(Vgatherpf1qpd , VexM_VM , E(660F38,C7,2,2,_,1,3,T1S), 0 , 192, 0 , 6612 , 305, 153), // #1096 - INST(Vgatherpf1qps , VexM_VM , E(660F38,C7,2,2,_,0,2,T1S), 0 , 193, 0 , 6626 , 305, 153), // #1097 - INST(Vgatherqpd , VexRmvRm_VM , V(660F38,93,_,x,1,_,_,_ ), E(660F38,93,_,x,_,1,3,T1S), 189, 82 , 6640 , 306, 152), // #1098 - INST(Vgatherqps , VexRmvRm_VM , V(660F38,93,_,x,0,_,_,_ ), E(660F38,93,_,x,_,0,2,T1S), 96 , 83 , 6651 , 307, 152), // #1099 - INST(Vgetexppd , VexRm_Lx , E(660F38,42,_,x,_,1,4,FV ), 0 , 113, 0 , 6662 , 263, 138), // #1100 - INST(Vgetexpph , VexRm_Lx , E(66MAP6,42,_,_,_,0,4,FV ), 0 , 183, 0 , 6672 , 265, 132), // #1101 - INST(Vgetexpps , VexRm_Lx , E(660F38,42,_,x,_,0,4,FV ), 0 , 114, 0 , 6682 , 268, 138), // #1102 - INST(Vgetexpsd , VexRvm , E(660F38,43,_,I,_,1,3,T1S), 0 , 128, 0 , 6692 , 308, 68 ), // #1103 - INST(Vgetexpsh , VexRvm , E(66MAP6,43,_,_,_,0,1,T1S), 0 , 185, 0 , 6702 , 254, 134), // #1104 - INST(Vgetexpss , VexRvm , E(660F38,43,_,I,_,0,2,T1S), 0 , 129, 0 , 6712 , 309, 68 ), // #1105 - INST(Vgetmantpd , VexRmi_Lx , E(660F3A,26,_,x,_,1,4,FV ), 0 , 112, 0 , 6722 , 310, 138), // #1106 - INST(Vgetmantph , VexRmi_Lx , E(000F3A,26,_,_,_,0,4,FV ), 0 , 123, 0 , 6733 , 311, 132), // #1107 - INST(Vgetmantps , VexRmi_Lx , E(660F3A,26,_,x,_,0,4,FV ), 0 , 111, 0 , 6744 , 312, 138), // #1108 - INST(Vgetmantsd , VexRvmi , E(660F3A,27,_,I,_,1,3,T1S), 0 , 180, 0 , 6755 , 287, 68 ), // #1109 - INST(Vgetmantsh , VexRvmi , E(000F3A,27,_,_,_,0,1,T1S), 0 , 188, 0 , 6766 , 313, 134), // #1110 - INST(Vgetmantss , VexRvmi , E(660F3A,27,_,I,_,0,2,T1S), 0 , 181, 0 , 6777 , 288, 68 ), // #1111 - INST(Vgf2p8affineinvqb, VexRvmi_Lx , V(660F3A,CF,_,x,1,1,4,FV ), 0 , 194, 0 , 6788 , 314, 154), // #1112 - INST(Vgf2p8affineqb , VexRvmi_Lx , V(660F3A,CE,_,x,1,1,4,FV ), 0 , 194, 0 , 6806 , 314, 154), // #1113 - INST(Vgf2p8mulb , VexRvm_Lx , V(660F38,CF,_,x,0,0,4,FV ), 0 , 110, 0 , 6821 , 315, 154), // #1114 - INST(Vhaddpd , VexRvm_Lx , V(660F00,7C,_,x,I,_,_,_ ), 0 , 69 , 0 , 6832 , 202, 135), // #1115 - INST(Vhaddps , VexRvm_Lx , V(F20F00,7C,_,x,I,_,_,_ ), 0 , 109, 0 , 6840 , 202, 135), // #1116 - INST(Vhsubpd , VexRvm_Lx , V(660F00,7D,_,x,I,_,_,_ ), 0 , 69 , 0 , 6848 , 202, 135), // #1117 - INST(Vhsubps , VexRvm_Lx , V(F20F00,7D,_,x,I,_,_,_ ), 0 , 109, 0 , 6856 , 202, 135), // #1118 - INST(Vinsertf128 , VexRvmi , V(660F3A,18,_,1,0,_,_,_ ), 0 , 172, 0 , 6864 , 316, 135), // #1119 - INST(Vinsertf32x4 , VexRvmi_Lx , E(660F3A,18,_,x,_,0,4,T4 ), 0 , 173, 0 , 6876 , 317, 138), // #1120 - INST(Vinsertf32x8 , VexRvmi , E(660F3A,1A,_,2,_,0,5,T8 ), 0 , 174, 0 , 6889 , 318, 66 ), // #1121 - INST(Vinsertf64x2 , VexRvmi_Lx , E(660F3A,18,_,x,_,1,4,T2 ), 0 , 175, 0 , 6902 , 317, 140), // #1122 - INST(Vinsertf64x4 , VexRvmi , E(660F3A,1A,_,2,_,1,5,T4 ), 0 , 176, 0 , 6915 , 318, 68 ), // #1123 - INST(Vinserti128 , VexRvmi , V(660F3A,38,_,1,0,_,_,_ ), 0 , 172, 0 , 6928 , 316, 141), // #1124 - INST(Vinserti32x4 , VexRvmi_Lx , E(660F3A,38,_,x,_,0,4,T4 ), 0 , 173, 0 , 6940 , 317, 138), // #1125 - INST(Vinserti32x8 , VexRvmi , E(660F3A,3A,_,2,_,0,5,T8 ), 0 , 174, 0 , 6953 , 318, 66 ), // #1126 - INST(Vinserti64x2 , VexRvmi_Lx , E(660F3A,38,_,x,_,1,4,T2 ), 0 , 175, 0 , 6966 , 317, 140), // #1127 - INST(Vinserti64x4 , VexRvmi , E(660F3A,3A,_,2,_,1,5,T4 ), 0 , 176, 0 , 6979 , 318, 68 ), // #1128 - INST(Vinsertps , VexRvmi , V(660F3A,21,_,0,I,0,2,T1S), 0 , 177, 0 , 6992 , 319, 133), // #1129 - INST(Vlddqu , VexRm_Lx , V(F20F00,F0,_,x,I,_,_,_ ), 0 , 109, 0 , 7002 , 320, 135), // #1130 - INST(Vldmxcsr , VexM , V(000F00,AE,2,0,I,_,_,_ ), 0 , 195, 0 , 7009 , 321, 135), // #1131 - INST(Vmaskmovdqu , VexRm_ZDI , V(660F00,F7,_,0,I,_,_,_ ), 0 , 69 , 0 , 7018 , 322, 135), // #1132 - INST(Vmaskmovpd , VexRvmMvr_Lx , V(660F38,2D,_,x,0,_,_,_ ), V(660F38,2F,_,x,0,_,_,_ ), 96 , 84 , 7030 , 323, 135), // #1133 - INST(Vmaskmovps , VexRvmMvr_Lx , V(660F38,2C,_,x,0,_,_,_ ), V(660F38,2E,_,x,0,_,_,_ ), 96 , 85 , 7041 , 323, 135), // #1134 - INST(Vmaxpd , VexRvm_Lx , V(660F00,5F,_,x,I,1,4,FV ), 0 , 103, 0 , 7052 , 324, 131), // #1135 - INST(Vmaxph , VexRvm_Lx , E(00MAP5,5F,_,_,_,0,4,FV ), 0 , 104, 0 , 7059 , 325, 132), // #1136 - INST(Vmaxps , VexRvm_Lx , V(000F00,5F,_,x,I,0,4,FV ), 0 , 105, 0 , 7066 , 326, 131), // #1137 - INST(Vmaxsd , VexRvm , V(F20F00,5F,_,I,I,1,3,T1S), 0 , 106, 0 , 7073 , 327, 131), // #1138 - INST(Vmaxsh , VexRvm , E(F3MAP5,5F,_,_,_,0,1,T1S), 0 , 107, 0 , 7080 , 254, 134), // #1139 - INST(Vmaxss , VexRvm , V(F30F00,5F,_,I,I,0,2,T1S), 0 , 108, 0 , 7087 , 258, 131), // #1140 - INST(Vmcall , X86Op , O(000F01,C1,_,_,_,_,_,_ ), 0 , 21 , 0 , 7094 , 30 , 58 ), // #1141 - INST(Vmclear , X86M_Only , O(660F00,C7,6,_,_,_,_,_ ), 0 , 26 , 0 , 7101 , 32 , 58 ), // #1142 - INST(Vmfunc , X86Op , O(000F01,D4,_,_,_,_,_,_ ), 0 , 21 , 0 , 7109 , 30 , 58 ), // #1143 - INST(Vminpd , VexRvm_Lx , V(660F00,5D,_,x,I,1,4,FV ), 0 , 103, 0 , 7116 , 324, 131), // #1144 - INST(Vminph , VexRvm_Lx , E(00MAP5,5D,_,_,_,0,4,FV ), 0 , 104, 0 , 7123 , 325, 132), // #1145 - INST(Vminps , VexRvm_Lx , V(000F00,5D,_,x,I,0,4,FV ), 0 , 105, 0 , 7130 , 326, 131), // #1146 - INST(Vminsd , VexRvm , V(F20F00,5D,_,I,I,1,3,T1S), 0 , 106, 0 , 7137 , 327, 131), // #1147 - INST(Vminsh , VexRvm , E(F3MAP5,5D,_,_,_,0,1,T1S), 0 , 107, 0 , 7144 , 254, 134), // #1148 - INST(Vminss , VexRvm , V(F30F00,5D,_,I,I,0,2,T1S), 0 , 108, 0 , 7151 , 258, 131), // #1149 - INST(Vmlaunch , X86Op , O(000F01,C2,_,_,_,_,_,_ ), 0 , 21 , 0 , 7158 , 30 , 58 ), // #1150 - INST(Vmload , X86Op_xAX , O(000F01,DA,_,_,_,_,_,_ ), 0 , 21 , 0 , 7167 , 328, 22 ), // #1151 - INST(Vmmcall , X86Op , O(000F01,D9,_,_,_,_,_,_ ), 0 , 21 , 0 , 7174 , 30 , 22 ), // #1152 - INST(Vmovapd , VexRmMr_Lx , V(660F00,28,_,x,I,1,4,FVM), V(660F00,29,_,x,I,1,4,FVM), 103, 86 , 7182 , 329, 155), // #1153 - INST(Vmovaps , VexRmMr_Lx , V(000F00,28,_,x,I,0,4,FVM), V(000F00,29,_,x,I,0,4,FVM), 105, 87 , 7190 , 329, 155), // #1154 - INST(Vmovd , VexMovdMovq , V(660F00,6E,_,0,0,0,2,T1S), V(660F00,7E,_,0,0,0,2,T1S), 196, 88 , 7198 , 330, 133), // #1155 - INST(Vmovddup , VexRm_Lx , V(F20F00,12,_,x,I,1,3,DUP), 0 , 197, 0 , 7204 , 331, 131), // #1156 - INST(Vmovdqa , VexRmMr_Lx , V(660F00,6F,_,x,I,_,_,_ ), V(660F00,7F,_,x,I,_,_,_ ), 69 , 89 , 7213 , 332, 156), // #1157 - INST(Vmovdqa32 , VexRmMr_Lx , E(660F00,6F,_,x,_,0,4,FVM), E(660F00,7F,_,x,_,0,4,FVM), 198, 90 , 7221 , 333, 157), // #1158 - INST(Vmovdqa64 , VexRmMr_Lx , E(660F00,6F,_,x,_,1,4,FVM), E(660F00,7F,_,x,_,1,4,FVM), 135, 91 , 7231 , 333, 157), // #1159 - INST(Vmovdqu , VexRmMr_Lx , V(F30F00,6F,_,x,I,_,_,_ ), V(F30F00,7F,_,x,I,_,_,_ ), 199, 92 , 7241 , 332, 156), // #1160 - INST(Vmovdqu16 , VexRmMr_Lx , E(F20F00,6F,_,x,_,1,4,FVM), E(F20F00,7F,_,x,_,1,4,FVM), 166, 93 , 7249 , 333, 158), // #1161 - INST(Vmovdqu32 , VexRmMr_Lx , E(F30F00,6F,_,x,_,0,4,FVM), E(F30F00,7F,_,x,_,0,4,FVM), 200, 94 , 7259 , 333, 157), // #1162 - INST(Vmovdqu64 , VexRmMr_Lx , E(F30F00,6F,_,x,_,1,4,FVM), E(F30F00,7F,_,x,_,1,4,FVM), 149, 95 , 7269 , 333, 157), // #1163 - INST(Vmovdqu8 , VexRmMr_Lx , E(F20F00,6F,_,x,_,0,4,FVM), E(F20F00,7F,_,x,_,0,4,FVM), 164, 96 , 7279 , 333, 158), // #1164 - INST(Vmovhlps , VexRvm , V(000F00,12,_,0,I,0,_,_ ), 0 , 72 , 0 , 7288 , 334, 133), // #1165 - INST(Vmovhpd , VexRvmMr , V(660F00,16,_,0,I,1,3,T1S), V(660F00,17,_,0,I,1,3,T1S), 125, 97 , 7297 , 335, 133), // #1166 - INST(Vmovhps , VexRvmMr , V(000F00,16,_,0,I,0,3,T2 ), V(000F00,17,_,0,I,0,3,T2 ), 201, 98 , 7305 , 335, 133), // #1167 - INST(Vmovlhps , VexRvm , V(000F00,16,_,0,I,0,_,_ ), 0 , 72 , 0 , 7313 , 334, 133), // #1168 - INST(Vmovlpd , VexRvmMr , V(660F00,12,_,0,I,1,3,T1S), V(660F00,13,_,0,I,1,3,T1S), 125, 99 , 7322 , 335, 133), // #1169 - INST(Vmovlps , VexRvmMr , V(000F00,12,_,0,I,0,3,T2 ), V(000F00,13,_,0,I,0,3,T2 ), 201, 100, 7330 , 335, 133), // #1170 - INST(Vmovmskpd , VexRm_Lx , V(660F00,50,_,x,I,_,_,_ ), 0 , 69 , 0 , 7338 , 336, 135), // #1171 - INST(Vmovmskps , VexRm_Lx , V(000F00,50,_,x,I,_,_,_ ), 0 , 72 , 0 , 7348 , 336, 135), // #1172 - INST(Vmovntdq , VexMr_Lx , V(660F00,E7,_,x,I,0,4,FVM), 0 , 144, 0 , 7358 , 337, 131), // #1173 - INST(Vmovntdqa , VexRm_Lx , V(660F38,2A,_,x,I,0,4,FVM), 0 , 110, 0 , 7367 , 338, 142), // #1174 - INST(Vmovntpd , VexMr_Lx , V(660F00,2B,_,x,I,1,4,FVM), 0 , 103, 0 , 7377 , 337, 131), // #1175 - INST(Vmovntps , VexMr_Lx , V(000F00,2B,_,x,I,0,4,FVM), 0 , 105, 0 , 7386 , 337, 131), // #1176 - INST(Vmovq , VexMovdMovq , V(660F00,6E,_,0,I,1,3,T1S), V(660F00,7E,_,0,I,1,3,T1S), 125, 101, 7395 , 339, 159), // #1177 - INST(Vmovsd , VexMovssMovsd , V(F20F00,10,_,I,I,1,3,T1S), V(F20F00,11,_,I,I,1,3,T1S), 106, 102, 7401 , 340, 159), // #1178 - INST(Vmovsh , VexMovssMovsd , E(F3MAP5,10,_,I,_,0,1,T1S), E(F3MAP5,11,_,I,_,0,1,T1S), 107, 103, 7408 , 341, 134), // #1179 - INST(Vmovshdup , VexRm_Lx , V(F30F00,16,_,x,I,0,4,FVM), 0 , 161, 0 , 7415 , 342, 131), // #1180 - INST(Vmovsldup , VexRm_Lx , V(F30F00,12,_,x,I,0,4,FVM), 0 , 161, 0 , 7425 , 342, 131), // #1181 - INST(Vmovss , VexMovssMovsd , V(F30F00,10,_,I,I,0,2,T1S), V(F30F00,11,_,I,I,0,2,T1S), 108, 104, 7435 , 343, 159), // #1182 - INST(Vmovupd , VexRmMr_Lx , V(660F00,10,_,x,I,1,4,FVM), V(660F00,11,_,x,I,1,4,FVM), 103, 105, 7442 , 329, 155), // #1183 - INST(Vmovups , VexRmMr_Lx , V(000F00,10,_,x,I,0,4,FVM), V(000F00,11,_,x,I,0,4,FVM), 105, 106, 7450 , 329, 155), // #1184 - INST(Vmovw , VexMovdMovq , E(66MAP5,6E,_,0,_,I,1,T1S), E(66MAP5,7E,_,0,_,I,1,T1S), 202, 107, 7458 , 344, 134), // #1185 - INST(Vmpsadbw , VexRvmi_Lx , V(660F3A,42,_,x,I,_,_,_ ), 0 , 73 , 0 , 7464 , 214, 160), // #1186 - INST(Vmptrld , X86M_Only , O(000F00,C7,6,_,_,_,_,_ ), 0 , 80 , 0 , 7473 , 32 , 58 ), // #1187 - INST(Vmptrst , X86M_Only , O(000F00,C7,7,_,_,_,_,_ ), 0 , 22 , 0 , 7481 , 32 , 58 ), // #1188 - INST(Vmread , X86Mr_NoSize , O(000F00,78,_,_,_,_,_,_ ), 0 , 4 , 0 , 7489 , 345, 58 ), // #1189 - INST(Vmresume , X86Op , O(000F01,C3,_,_,_,_,_,_ ), 0 , 21 , 0 , 7496 , 30 , 58 ), // #1190 - INST(Vmrun , X86Op_xAX , O(000F01,D8,_,_,_,_,_,_ ), 0 , 21 , 0 , 7505 , 328, 22 ), // #1191 - INST(Vmsave , X86Op_xAX , O(000F01,DB,_,_,_,_,_,_ ), 0 , 21 , 0 , 7511 , 328, 22 ), // #1192 - INST(Vmulpd , VexRvm_Lx , V(660F00,59,_,x,I,1,4,FV ), 0 , 103, 0 , 7518 , 196, 131), // #1193 - INST(Vmulph , VexRvm_Lx , E(00MAP5,59,_,_,_,0,4,FV ), 0 , 104, 0 , 7525 , 197, 132), // #1194 - INST(Vmulps , VexRvm_Lx , V(000F00,59,_,x,I,0,4,FV ), 0 , 105, 0 , 7532 , 198, 131), // #1195 - INST(Vmulsd , VexRvm , V(F20F00,59,_,I,I,1,3,T1S), 0 , 106, 0 , 7539 , 199, 133), // #1196 - INST(Vmulsh , VexRvm , E(F3MAP5,59,_,_,_,0,1,T1S), 0 , 107, 0 , 7546 , 200, 134), // #1197 - INST(Vmulss , VexRvm , V(F30F00,59,_,I,I,0,2,T1S), 0 , 108, 0 , 7553 , 201, 133), // #1198 - INST(Vmwrite , X86Rm_NoSize , O(000F00,79,_,_,_,_,_,_ ), 0 , 4 , 0 , 7560 , 346, 58 ), // #1199 - INST(Vmxon , X86M_Only , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 24 , 0 , 7568 , 32 , 58 ), // #1200 - INST(Vorpd , VexRvm_Lx , V(660F00,56,_,x,I,1,4,FV ), 0 , 103, 0 , 7574 , 210, 139), // #1201 - INST(Vorps , VexRvm_Lx , V(000F00,56,_,x,I,0,4,FV ), 0 , 105, 0 , 7580 , 211, 139), // #1202 - INST(Vp2intersectd , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,0,4,FV ), 0 , 131, 0 , 7586 , 347, 161), // #1203 - INST(Vp2intersectq , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,1,4,FV ), 0 , 203, 0 , 7600 , 348, 161), // #1204 - INST(Vp4dpwssd , VexRm_T1_4X , E(F20F38,52,_,2,_,0,4,T4X), 0 , 101, 0 , 7614 , 194, 162), // #1205 - INST(Vp4dpwssds , VexRm_T1_4X , E(F20F38,53,_,2,_,0,4,T4X), 0 , 101, 0 , 7624 , 194, 162), // #1206 - INST(Vpabsb , VexRm_Lx , V(660F38,1C,_,x,I,_,4,FVM), 0 , 110, 0 , 7635 , 342, 163), // #1207 - INST(Vpabsd , VexRm_Lx , V(660F38,1E,_,x,I,0,4,FV ), 0 , 110, 0 , 7642 , 349, 142), // #1208 - INST(Vpabsq , VexRm_Lx , E(660F38,1F,_,x,_,1,4,FV ), 0 , 113, 0 , 7649 , 350, 138), // #1209 - INST(Vpabsw , VexRm_Lx , V(660F38,1D,_,x,I,_,4,FVM), 0 , 110, 0 , 7656 , 342, 163), // #1210 - INST(Vpackssdw , VexRvm_Lx , V(660F00,6B,_,x,I,0,4,FV ), 0 , 144, 0 , 7663 , 209, 163), // #1211 - INST(Vpacksswb , VexRvm_Lx , V(660F00,63,_,x,I,I,4,FVM), 0 , 144, 0 , 7673 , 315, 163), // #1212 - INST(Vpackusdw , VexRvm_Lx , V(660F38,2B,_,x,I,0,4,FV ), 0 , 110, 0 , 7683 , 209, 163), // #1213 - INST(Vpackuswb , VexRvm_Lx , V(660F00,67,_,x,I,I,4,FVM), 0 , 144, 0 , 7693 , 315, 163), // #1214 - INST(Vpaddb , VexRvm_Lx , V(660F00,FC,_,x,I,I,4,FVM), 0 , 144, 0 , 7703 , 315, 163), // #1215 - INST(Vpaddd , VexRvm_Lx , V(660F00,FE,_,x,I,0,4,FV ), 0 , 144, 0 , 7710 , 209, 142), // #1216 - INST(Vpaddq , VexRvm_Lx , V(660F00,D4,_,x,I,1,4,FV ), 0 , 103, 0 , 7717 , 208, 142), // #1217 - INST(Vpaddsb , VexRvm_Lx , V(660F00,EC,_,x,I,I,4,FVM), 0 , 144, 0 , 7724 , 315, 163), // #1218 - INST(Vpaddsw , VexRvm_Lx , V(660F00,ED,_,x,I,I,4,FVM), 0 , 144, 0 , 7732 , 315, 163), // #1219 - INST(Vpaddusb , VexRvm_Lx , V(660F00,DC,_,x,I,I,4,FVM), 0 , 144, 0 , 7740 , 315, 163), // #1220 - INST(Vpaddusw , VexRvm_Lx , V(660F00,DD,_,x,I,I,4,FVM), 0 , 144, 0 , 7749 , 315, 163), // #1221 - INST(Vpaddw , VexRvm_Lx , V(660F00,FD,_,x,I,I,4,FVM), 0 , 144, 0 , 7758 , 315, 163), // #1222 - INST(Vpalignr , VexRvmi_Lx , V(660F3A,0F,_,x,I,I,4,FVM), 0 , 204, 0 , 7765 , 314, 163), // #1223 - INST(Vpand , VexRvm_Lx , V(660F00,DB,_,x,I,_,_,_ ), 0 , 69 , 0 , 7774 , 351, 160), // #1224 - INST(Vpandd , VexRvm_Lx , E(660F00,DB,_,x,_,0,4,FV ), 0 , 198, 0 , 7780 , 352, 138), // #1225 - INST(Vpandn , VexRvm_Lx , V(660F00,DF,_,x,I,_,_,_ ), 0 , 69 , 0 , 7787 , 353, 160), // #1226 - INST(Vpandnd , VexRvm_Lx , E(660F00,DF,_,x,_,0,4,FV ), 0 , 198, 0 , 7794 , 354, 138), // #1227 - INST(Vpandnq , VexRvm_Lx , E(660F00,DF,_,x,_,1,4,FV ), 0 , 135, 0 , 7802 , 355, 138), // #1228 - INST(Vpandq , VexRvm_Lx , E(660F00,DB,_,x,_,1,4,FV ), 0 , 135, 0 , 7810 , 356, 138), // #1229 - INST(Vpavgb , VexRvm_Lx , V(660F00,E0,_,x,I,I,4,FVM), 0 , 144, 0 , 7817 , 315, 163), // #1230 - INST(Vpavgw , VexRvm_Lx , V(660F00,E3,_,x,I,I,4,FVM), 0 , 144, 0 , 7824 , 315, 163), // #1231 - INST(Vpblendd , VexRvmi_Lx , V(660F3A,02,_,x,0,_,_,_ ), 0 , 73 , 0 , 7831 , 214, 141), // #1232 - INST(Vpblendmb , VexRvm_Lx , E(660F38,66,_,x,_,0,4,FVM), 0 , 114, 0 , 7840 , 357, 146), // #1233 - INST(Vpblendmd , VexRvm_Lx , E(660F38,64,_,x,_,0,4,FV ), 0 , 114, 0 , 7850 , 213, 138), // #1234 - INST(Vpblendmq , VexRvm_Lx , E(660F38,64,_,x,_,1,4,FV ), 0 , 113, 0 , 7860 , 212, 138), // #1235 - INST(Vpblendmw , VexRvm_Lx , E(660F38,66,_,x,_,1,4,FVM), 0 , 113, 0 , 7870 , 357, 146), // #1236 - INST(Vpblendvb , VexRvmr_Lx , V(660F3A,4C,_,x,0,_,_,_ ), 0 , 73 , 0 , 7880 , 215, 160), // #1237 - INST(Vpblendw , VexRvmi_Lx , V(660F3A,0E,_,x,I,_,_,_ ), 0 , 73 , 0 , 7890 , 214, 160), // #1238 - INST(Vpbroadcastb , VexRm_Lx_Bcst , V(660F38,78,_,x,0,0,0,T1S), E(660F38,7A,_,x,0,0,0,T1S), 96 , 108, 7899 , 358, 164), // #1239 - INST(Vpbroadcastd , VexRm_Lx_Bcst , V(660F38,58,_,x,0,0,2,T1S), E(660F38,7C,_,x,0,0,0,T1S), 122, 109, 7912 , 359, 152), // #1240 - INST(Vpbroadcastmb2q , VexRm_Lx , E(F30F38,2A,_,x,_,1,_,_ ), 0 , 205, 0 , 7925 , 360, 165), // #1241 - INST(Vpbroadcastmw2d , VexRm_Lx , E(F30F38,3A,_,x,_,0,_,_ ), 0 , 206, 0 , 7941 , 360, 165), // #1242 - INST(Vpbroadcastq , VexRm_Lx_Bcst , V(660F38,59,_,x,0,1,3,T1S), E(660F38,7C,_,x,0,1,0,T1S), 121, 110, 7957 , 361, 152), // #1243 - INST(Vpbroadcastw , VexRm_Lx_Bcst , V(660F38,79,_,x,0,0,1,T1S), E(660F38,7B,_,x,0,0,0,T1S), 207, 111, 7970 , 362, 164), // #1244 - INST(Vpclmulqdq , VexRvmi_Lx , V(660F3A,44,_,x,I,_,4,FVM), 0 , 204, 0 , 7983 , 363, 166), // #1245 - INST(Vpcmov , VexRvrmRvmr_Lx , V(XOP_M8,A2,_,x,x,_,_,_ ), 0 , 208, 0 , 7994 , 289, 151), // #1246 - INST(Vpcmpb , VexRvmi_Lx , E(660F3A,3F,_,x,_,0,4,FVM), 0 , 111, 0 , 8001 , 364, 146), // #1247 - INST(Vpcmpd , VexRvmi_Lx , E(660F3A,1F,_,x,_,0,4,FV ), 0 , 111, 0 , 8008 , 365, 138), // #1248 - INST(Vpcmpeqb , VexRvm_Lx_KEvex , V(660F00,74,_,x,I,I,4,FV ), 0 , 144, 0 , 8015 , 366, 163), // #1249 - INST(Vpcmpeqd , VexRvm_Lx_KEvex , V(660F00,76,_,x,I,0,4,FVM), 0 , 144, 0 , 8024 , 367, 142), // #1250 - INST(Vpcmpeqq , VexRvm_Lx_KEvex , V(660F38,29,_,x,I,1,4,FVM), 0 , 209, 0 , 8033 , 368, 142), // #1251 - INST(Vpcmpeqw , VexRvm_Lx_KEvex , V(660F00,75,_,x,I,I,4,FV ), 0 , 144, 0 , 8042 , 366, 163), // #1252 - INST(Vpcmpestri , VexRmi , V(660F3A,61,_,0,I,_,_,_ ), 0 , 73 , 0 , 8051 , 369, 167), // #1253 - INST(Vpcmpestrm , VexRmi , V(660F3A,60,_,0,I,_,_,_ ), 0 , 73 , 0 , 8062 , 370, 167), // #1254 - INST(Vpcmpgtb , VexRvm_Lx_KEvex , V(660F00,64,_,x,I,I,4,FV ), 0 , 144, 0 , 8073 , 366, 163), // #1255 - INST(Vpcmpgtd , VexRvm_Lx_KEvex , V(660F00,66,_,x,I,0,4,FVM), 0 , 144, 0 , 8082 , 367, 142), // #1256 - INST(Vpcmpgtq , VexRvm_Lx_KEvex , V(660F38,37,_,x,I,1,4,FVM), 0 , 209, 0 , 8091 , 368, 142), // #1257 - INST(Vpcmpgtw , VexRvm_Lx_KEvex , V(660F00,65,_,x,I,I,4,FV ), 0 , 144, 0 , 8100 , 366, 163), // #1258 - INST(Vpcmpistri , VexRmi , V(660F3A,63,_,0,I,_,_,_ ), 0 , 73 , 0 , 8109 , 371, 167), // #1259 - INST(Vpcmpistrm , VexRmi , V(660F3A,62,_,0,I,_,_,_ ), 0 , 73 , 0 , 8120 , 372, 167), // #1260 - INST(Vpcmpq , VexRvmi_Lx , E(660F3A,1F,_,x,_,1,4,FV ), 0 , 112, 0 , 8131 , 373, 138), // #1261 - INST(Vpcmpub , VexRvmi_Lx , E(660F3A,3E,_,x,_,0,4,FVM), 0 , 111, 0 , 8138 , 364, 146), // #1262 - INST(Vpcmpud , VexRvmi_Lx , E(660F3A,1E,_,x,_,0,4,FV ), 0 , 111, 0 , 8146 , 365, 138), // #1263 - INST(Vpcmpuq , VexRvmi_Lx , E(660F3A,1E,_,x,_,1,4,FV ), 0 , 112, 0 , 8154 , 373, 138), // #1264 - INST(Vpcmpuw , VexRvmi_Lx , E(660F3A,3E,_,x,_,1,4,FVM), 0 , 112, 0 , 8162 , 373, 146), // #1265 - INST(Vpcmpw , VexRvmi_Lx , E(660F3A,3F,_,x,_,1,4,FVM), 0 , 112, 0 , 8170 , 373, 146), // #1266 - INST(Vpcomb , VexRvmi , V(XOP_M8,CC,_,0,0,_,_,_ ), 0 , 208, 0 , 8177 , 276, 151), // #1267 - INST(Vpcomd , VexRvmi , V(XOP_M8,CE,_,0,0,_,_,_ ), 0 , 208, 0 , 8184 , 276, 151), // #1268 - INST(Vpcompressb , VexMr_Lx , E(660F38,63,_,x,_,0,0,T1S), 0 , 210, 0 , 8191 , 232, 168), // #1269 - INST(Vpcompressd , VexMr_Lx , E(660F38,8B,_,x,_,0,2,T1S), 0 , 129, 0 , 8203 , 232, 138), // #1270 - INST(Vpcompressq , VexMr_Lx , E(660F38,8B,_,x,_,1,3,T1S), 0 , 128, 0 , 8215 , 232, 138), // #1271 - INST(Vpcompressw , VexMr_Lx , E(660F38,63,_,x,_,1,1,T1S), 0 , 211, 0 , 8227 , 232, 168), // #1272 - INST(Vpcomq , VexRvmi , V(XOP_M8,CF,_,0,0,_,_,_ ), 0 , 208, 0 , 8239 , 276, 151), // #1273 - INST(Vpcomub , VexRvmi , V(XOP_M8,EC,_,0,0,_,_,_ ), 0 , 208, 0 , 8246 , 276, 151), // #1274 - INST(Vpcomud , VexRvmi , V(XOP_M8,EE,_,0,0,_,_,_ ), 0 , 208, 0 , 8254 , 276, 151), // #1275 - INST(Vpcomuq , VexRvmi , V(XOP_M8,EF,_,0,0,_,_,_ ), 0 , 208, 0 , 8262 , 276, 151), // #1276 - INST(Vpcomuw , VexRvmi , V(XOP_M8,ED,_,0,0,_,_,_ ), 0 , 208, 0 , 8270 , 276, 151), // #1277 - INST(Vpcomw , VexRvmi , V(XOP_M8,CD,_,0,0,_,_,_ ), 0 , 208, 0 , 8278 , 276, 151), // #1278 - INST(Vpconflictd , VexRm_Lx , E(660F38,C4,_,x,_,0,4,FV ), 0 , 114, 0 , 8285 , 374, 165), // #1279 - INST(Vpconflictq , VexRm_Lx , E(660F38,C4,_,x,_,1,4,FV ), 0 , 113, 0 , 8297 , 374, 165), // #1280 - INST(Vpdpbusd , VexRvm_Lx , V(660F38,50,_,x,_,0,4,FV ), 0 , 110, 0 , 8309 , 375, 169), // #1281 - INST(Vpdpbusds , VexRvm_Lx , V(660F38,51,_,x,_,0,4,FV ), 0 , 110, 0 , 8318 , 375, 169), // #1282 - INST(Vpdpwssd , VexRvm_Lx , V(660F38,52,_,x,_,0,4,FV ), 0 , 110, 0 , 8328 , 375, 169), // #1283 - INST(Vpdpwssds , VexRvm_Lx , V(660F38,53,_,x,_,0,4,FV ), 0 , 110, 0 , 8337 , 375, 169), // #1284 - INST(Vperm2f128 , VexRvmi , V(660F3A,06,_,1,0,_,_,_ ), 0 , 172, 0 , 8347 , 376, 135), // #1285 - INST(Vperm2i128 , VexRvmi , V(660F3A,46,_,1,0,_,_,_ ), 0 , 172, 0 , 8358 , 376, 141), // #1286 - INST(Vpermb , VexRvm_Lx , E(660F38,8D,_,x,_,0,4,FVM), 0 , 114, 0 , 8369 , 357, 170), // #1287 - INST(Vpermd , VexRvm_Lx , V(660F38,36,_,x,0,0,4,FV ), 0 , 110, 0 , 8376 , 377, 152), // #1288 - INST(Vpermi2b , VexRvm_Lx , E(660F38,75,_,x,_,0,4,FVM), 0 , 114, 0 , 8383 , 357, 170), // #1289 - INST(Vpermi2d , VexRvm_Lx , E(660F38,76,_,x,_,0,4,FV ), 0 , 114, 0 , 8392 , 213, 138), // #1290 - INST(Vpermi2pd , VexRvm_Lx , E(660F38,77,_,x,_,1,4,FV ), 0 , 113, 0 , 8401 , 212, 138), // #1291 - INST(Vpermi2ps , VexRvm_Lx , E(660F38,77,_,x,_,0,4,FV ), 0 , 114, 0 , 8411 , 213, 138), // #1292 - INST(Vpermi2q , VexRvm_Lx , E(660F38,76,_,x,_,1,4,FV ), 0 , 113, 0 , 8421 , 212, 138), // #1293 - INST(Vpermi2w , VexRvm_Lx , E(660F38,75,_,x,_,1,4,FVM), 0 , 113, 0 , 8430 , 357, 146), // #1294 - INST(Vpermil2pd , VexRvrmiRvmri_Lx , V(660F3A,49,_,x,x,_,_,_ ), 0 , 73 , 0 , 8439 , 378, 151), // #1295 - INST(Vpermil2ps , VexRvrmiRvmri_Lx , V(660F3A,48,_,x,x,_,_,_ ), 0 , 73 , 0 , 8450 , 378, 151), // #1296 - INST(Vpermilpd , VexRvmRmi_Lx , V(660F38,0D,_,x,0,1,4,FV ), V(660F3A,05,_,x,0,1,4,FV ), 209, 112, 8461 , 379, 131), // #1297 - INST(Vpermilps , VexRvmRmi_Lx , V(660F38,0C,_,x,0,0,4,FV ), V(660F3A,04,_,x,0,0,4,FV ), 110, 113, 8471 , 380, 131), // #1298 - INST(Vpermpd , VexRvmRmi_Lx , E(660F38,16,_,x,1,1,4,FV ), V(660F3A,01,_,x,1,1,4,FV ), 212, 114, 8481 , 381, 152), // #1299 - INST(Vpermps , VexRvm_Lx , V(660F38,16,_,x,0,0,4,FV ), 0 , 110, 0 , 8489 , 377, 152), // #1300 - INST(Vpermq , VexRvmRmi_Lx , E(660F38,36,_,x,_,1,4,FV ), V(660F3A,00,_,x,1,1,4,FV ), 113, 115, 8497 , 381, 152), // #1301 - INST(Vpermt2b , VexRvm_Lx , E(660F38,7D,_,x,_,0,4,FVM), 0 , 114, 0 , 8504 , 357, 170), // #1302 - INST(Vpermt2d , VexRvm_Lx , E(660F38,7E,_,x,_,0,4,FV ), 0 , 114, 0 , 8513 , 213, 138), // #1303 - INST(Vpermt2pd , VexRvm_Lx , E(660F38,7F,_,x,_,1,4,FV ), 0 , 113, 0 , 8522 , 212, 138), // #1304 - INST(Vpermt2ps , VexRvm_Lx , E(660F38,7F,_,x,_,0,4,FV ), 0 , 114, 0 , 8532 , 213, 138), // #1305 - INST(Vpermt2q , VexRvm_Lx , E(660F38,7E,_,x,_,1,4,FV ), 0 , 113, 0 , 8542 , 212, 138), // #1306 - INST(Vpermt2w , VexRvm_Lx , E(660F38,7D,_,x,_,1,4,FVM), 0 , 113, 0 , 8551 , 357, 146), // #1307 - INST(Vpermw , VexRvm_Lx , E(660F38,8D,_,x,_,1,4,FVM), 0 , 113, 0 , 8560 , 357, 146), // #1308 - INST(Vpexpandb , VexRm_Lx , E(660F38,62,_,x,_,0,0,T1S), 0 , 210, 0 , 8567 , 279, 168), // #1309 - INST(Vpexpandd , VexRm_Lx , E(660F38,89,_,x,_,0,2,T1S), 0 , 129, 0 , 8577 , 279, 138), // #1310 - INST(Vpexpandq , VexRm_Lx , E(660F38,89,_,x,_,1,3,T1S), 0 , 128, 0 , 8587 , 279, 138), // #1311 - INST(Vpexpandw , VexRm_Lx , E(660F38,62,_,x,_,1,1,T1S), 0 , 211, 0 , 8597 , 279, 168), // #1312 - INST(Vpextrb , VexMri , V(660F3A,14,_,0,0,I,0,T1S), 0 , 73 , 0 , 8607 , 382, 171), // #1313 - INST(Vpextrd , VexMri , V(660F3A,16,_,0,0,0,2,T1S), 0 , 177, 0 , 8615 , 283, 172), // #1314 - INST(Vpextrq , VexMri , V(660F3A,16,_,0,1,1,3,T1S), 0 , 213, 0 , 8623 , 383, 172), // #1315 - INST(Vpextrw , VexMri_Vpextrw , V(660F3A,15,_,0,0,I,1,T1S), 0 , 214, 0 , 8631 , 384, 171), // #1316 - INST(Vpgatherdd , VexRmvRm_VM , V(660F38,90,_,x,0,_,_,_ ), E(660F38,90,_,x,_,0,2,T1S), 96 , 116, 8639 , 302, 152), // #1317 - INST(Vpgatherdq , VexRmvRm_VM , V(660F38,90,_,x,1,_,_,_ ), E(660F38,90,_,x,_,1,3,T1S), 189, 117, 8650 , 301, 152), // #1318 - INST(Vpgatherqd , VexRmvRm_VM , V(660F38,91,_,x,0,_,_,_ ), E(660F38,91,_,x,_,0,2,T1S), 96 , 118, 8661 , 307, 152), // #1319 - INST(Vpgatherqq , VexRmvRm_VM , V(660F38,91,_,x,1,_,_,_ ), E(660F38,91,_,x,_,1,3,T1S), 189, 119, 8672 , 306, 152), // #1320 - INST(Vphaddbd , VexRm , V(XOP_M9,C2,_,0,0,_,_,_ ), 0 , 79 , 0 , 8683 , 204, 151), // #1321 - INST(Vphaddbq , VexRm , V(XOP_M9,C3,_,0,0,_,_,_ ), 0 , 79 , 0 , 8692 , 204, 151), // #1322 - INST(Vphaddbw , VexRm , V(XOP_M9,C1,_,0,0,_,_,_ ), 0 , 79 , 0 , 8701 , 204, 151), // #1323 - INST(Vphaddd , VexRvm_Lx , V(660F38,02,_,x,I,_,_,_ ), 0 , 96 , 0 , 8710 , 202, 160), // #1324 - INST(Vphadddq , VexRm , V(XOP_M9,CB,_,0,0,_,_,_ ), 0 , 79 , 0 , 8718 , 204, 151), // #1325 - INST(Vphaddsw , VexRvm_Lx , V(660F38,03,_,x,I,_,_,_ ), 0 , 96 , 0 , 8727 , 202, 160), // #1326 - INST(Vphaddubd , VexRm , V(XOP_M9,D2,_,0,0,_,_,_ ), 0 , 79 , 0 , 8736 , 204, 151), // #1327 - INST(Vphaddubq , VexRm , V(XOP_M9,D3,_,0,0,_,_,_ ), 0 , 79 , 0 , 8746 , 204, 151), // #1328 - INST(Vphaddubw , VexRm , V(XOP_M9,D1,_,0,0,_,_,_ ), 0 , 79 , 0 , 8756 , 204, 151), // #1329 - INST(Vphaddudq , VexRm , V(XOP_M9,DB,_,0,0,_,_,_ ), 0 , 79 , 0 , 8766 , 204, 151), // #1330 - INST(Vphadduwd , VexRm , V(XOP_M9,D6,_,0,0,_,_,_ ), 0 , 79 , 0 , 8776 , 204, 151), // #1331 - INST(Vphadduwq , VexRm , V(XOP_M9,D7,_,0,0,_,_,_ ), 0 , 79 , 0 , 8786 , 204, 151), // #1332 - INST(Vphaddw , VexRvm_Lx , V(660F38,01,_,x,I,_,_,_ ), 0 , 96 , 0 , 8796 , 202, 160), // #1333 - INST(Vphaddwd , VexRm , V(XOP_M9,C6,_,0,0,_,_,_ ), 0 , 79 , 0 , 8804 , 204, 151), // #1334 - INST(Vphaddwq , VexRm , V(XOP_M9,C7,_,0,0,_,_,_ ), 0 , 79 , 0 , 8813 , 204, 151), // #1335 - INST(Vphminposuw , VexRm , V(660F38,41,_,0,I,_,_,_ ), 0 , 96 , 0 , 8822 , 204, 135), // #1336 - INST(Vphsubbw , VexRm , V(XOP_M9,E1,_,0,0,_,_,_ ), 0 , 79 , 0 , 8834 , 204, 151), // #1337 - INST(Vphsubd , VexRvm_Lx , V(660F38,06,_,x,I,_,_,_ ), 0 , 96 , 0 , 8843 , 202, 160), // #1338 - INST(Vphsubdq , VexRm , V(XOP_M9,E3,_,0,0,_,_,_ ), 0 , 79 , 0 , 8851 , 204, 151), // #1339 - INST(Vphsubsw , VexRvm_Lx , V(660F38,07,_,x,I,_,_,_ ), 0 , 96 , 0 , 8860 , 202, 160), // #1340 - INST(Vphsubw , VexRvm_Lx , V(660F38,05,_,x,I,_,_,_ ), 0 , 96 , 0 , 8869 , 202, 160), // #1341 - INST(Vphsubwd , VexRm , V(XOP_M9,E2,_,0,0,_,_,_ ), 0 , 79 , 0 , 8877 , 204, 151), // #1342 - INST(Vpinsrb , VexRvmi , V(660F3A,20,_,0,0,I,0,T1S), 0 , 73 , 0 , 8886 , 385, 171), // #1343 - INST(Vpinsrd , VexRvmi , V(660F3A,22,_,0,0,0,2,T1S), 0 , 177, 0 , 8894 , 386, 172), // #1344 - INST(Vpinsrq , VexRvmi , V(660F3A,22,_,0,1,1,3,T1S), 0 , 213, 0 , 8902 , 387, 172), // #1345 - INST(Vpinsrw , VexRvmi , V(660F00,C4,_,0,0,I,1,T1S), 0 , 215, 0 , 8910 , 388, 171), // #1346 - INST(Vplzcntd , VexRm_Lx , E(660F38,44,_,x,_,0,4,FV ), 0 , 114, 0 , 8918 , 374, 165), // #1347 - INST(Vplzcntq , VexRm_Lx , E(660F38,44,_,x,_,1,4,FV ), 0 , 113, 0 , 8927 , 350, 165), // #1348 - INST(Vpmacsdd , VexRvmr , V(XOP_M8,9E,_,0,0,_,_,_ ), 0 , 208, 0 , 8936 , 389, 151), // #1349 - INST(Vpmacsdqh , VexRvmr , V(XOP_M8,9F,_,0,0,_,_,_ ), 0 , 208, 0 , 8945 , 389, 151), // #1350 - INST(Vpmacsdql , VexRvmr , V(XOP_M8,97,_,0,0,_,_,_ ), 0 , 208, 0 , 8955 , 389, 151), // #1351 - INST(Vpmacssdd , VexRvmr , V(XOP_M8,8E,_,0,0,_,_,_ ), 0 , 208, 0 , 8965 , 389, 151), // #1352 - INST(Vpmacssdqh , VexRvmr , V(XOP_M8,8F,_,0,0,_,_,_ ), 0 , 208, 0 , 8975 , 389, 151), // #1353 - INST(Vpmacssdql , VexRvmr , V(XOP_M8,87,_,0,0,_,_,_ ), 0 , 208, 0 , 8986 , 389, 151), // #1354 - INST(Vpmacsswd , VexRvmr , V(XOP_M8,86,_,0,0,_,_,_ ), 0 , 208, 0 , 8997 , 389, 151), // #1355 - INST(Vpmacssww , VexRvmr , V(XOP_M8,85,_,0,0,_,_,_ ), 0 , 208, 0 , 9007 , 389, 151), // #1356 - INST(Vpmacswd , VexRvmr , V(XOP_M8,96,_,0,0,_,_,_ ), 0 , 208, 0 , 9017 , 389, 151), // #1357 - INST(Vpmacsww , VexRvmr , V(XOP_M8,95,_,0,0,_,_,_ ), 0 , 208, 0 , 9026 , 389, 151), // #1358 - INST(Vpmadcsswd , VexRvmr , V(XOP_M8,A6,_,0,0,_,_,_ ), 0 , 208, 0 , 9035 , 389, 151), // #1359 - INST(Vpmadcswd , VexRvmr , V(XOP_M8,B6,_,0,0,_,_,_ ), 0 , 208, 0 , 9046 , 389, 151), // #1360 - INST(Vpmadd52huq , VexRvm_Lx , E(660F38,B5,_,x,_,1,4,FV ), 0 , 113, 0 , 9056 , 212, 173), // #1361 - INST(Vpmadd52luq , VexRvm_Lx , E(660F38,B4,_,x,_,1,4,FV ), 0 , 113, 0 , 9068 , 212, 173), // #1362 - INST(Vpmaddubsw , VexRvm_Lx , V(660F38,04,_,x,I,I,4,FVM), 0 , 110, 0 , 9080 , 315, 163), // #1363 - INST(Vpmaddwd , VexRvm_Lx , V(660F00,F5,_,x,I,I,4,FVM), 0 , 144, 0 , 9091 , 315, 163), // #1364 - INST(Vpmaskmovd , VexRvmMvr_Lx , V(660F38,8C,_,x,0,_,_,_ ), V(660F38,8E,_,x,0,_,_,_ ), 96 , 120, 9100 , 323, 141), // #1365 - INST(Vpmaskmovq , VexRvmMvr_Lx , V(660F38,8C,_,x,1,_,_,_ ), V(660F38,8E,_,x,1,_,_,_ ), 189, 121, 9111 , 323, 141), // #1366 - INST(Vpmaxsb , VexRvm_Lx , V(660F38,3C,_,x,I,I,4,FVM), 0 , 110, 0 , 9122 , 390, 163), // #1367 - INST(Vpmaxsd , VexRvm_Lx , V(660F38,3D,_,x,I,0,4,FV ), 0 , 110, 0 , 9130 , 211, 142), // #1368 - INST(Vpmaxsq , VexRvm_Lx , E(660F38,3D,_,x,_,1,4,FV ), 0 , 113, 0 , 9138 , 212, 138), // #1369 - INST(Vpmaxsw , VexRvm_Lx , V(660F00,EE,_,x,I,I,4,FVM), 0 , 144, 0 , 9146 , 390, 163), // #1370 - INST(Vpmaxub , VexRvm_Lx , V(660F00,DE,_,x,I,I,4,FVM), 0 , 144, 0 , 9154 , 390, 163), // #1371 - INST(Vpmaxud , VexRvm_Lx , V(660F38,3F,_,x,I,0,4,FV ), 0 , 110, 0 , 9162 , 211, 142), // #1372 - INST(Vpmaxuq , VexRvm_Lx , E(660F38,3F,_,x,_,1,4,FV ), 0 , 113, 0 , 9170 , 212, 138), // #1373 - INST(Vpmaxuw , VexRvm_Lx , V(660F38,3E,_,x,I,I,4,FVM), 0 , 110, 0 , 9178 , 390, 163), // #1374 - INST(Vpminsb , VexRvm_Lx , V(660F38,38,_,x,I,I,4,FVM), 0 , 110, 0 , 9186 , 390, 163), // #1375 - INST(Vpminsd , VexRvm_Lx , V(660F38,39,_,x,I,0,4,FV ), 0 , 110, 0 , 9194 , 211, 142), // #1376 - INST(Vpminsq , VexRvm_Lx , E(660F38,39,_,x,_,1,4,FV ), 0 , 113, 0 , 9202 , 212, 138), // #1377 - INST(Vpminsw , VexRvm_Lx , V(660F00,EA,_,x,I,I,4,FVM), 0 , 144, 0 , 9210 , 390, 163), // #1378 - INST(Vpminub , VexRvm_Lx , V(660F00,DA,_,x,I,_,4,FVM), 0 , 144, 0 , 9218 , 390, 163), // #1379 - INST(Vpminud , VexRvm_Lx , V(660F38,3B,_,x,I,0,4,FV ), 0 , 110, 0 , 9226 , 211, 142), // #1380 - INST(Vpminuq , VexRvm_Lx , E(660F38,3B,_,x,_,1,4,FV ), 0 , 113, 0 , 9234 , 212, 138), // #1381 - INST(Vpminuw , VexRvm_Lx , V(660F38,3A,_,x,I,_,4,FVM), 0 , 110, 0 , 9242 , 390, 163), // #1382 - INST(Vpmovb2m , VexRm_Lx , E(F30F38,29,_,x,_,0,_,_ ), 0 , 206, 0 , 9250 , 391, 146), // #1383 - INST(Vpmovd2m , VexRm_Lx , E(F30F38,39,_,x,_,0,_,_ ), 0 , 206, 0 , 9259 , 391, 140), // #1384 - INST(Vpmovdb , VexMr_Lx , E(F30F38,31,_,x,_,0,2,QVM), 0 , 216, 0 , 9268 , 392, 138), // #1385 - INST(Vpmovdw , VexMr_Lx , E(F30F38,33,_,x,_,0,3,HVM), 0 , 217, 0 , 9276 , 393, 138), // #1386 - INST(Vpmovm2b , VexRm_Lx , E(F30F38,28,_,x,_,0,_,_ ), 0 , 206, 0 , 9284 , 360, 146), // #1387 - INST(Vpmovm2d , VexRm_Lx , E(F30F38,38,_,x,_,0,_,_ ), 0 , 206, 0 , 9293 , 360, 140), // #1388 - INST(Vpmovm2q , VexRm_Lx , E(F30F38,38,_,x,_,1,_,_ ), 0 , 205, 0 , 9302 , 360, 140), // #1389 - INST(Vpmovm2w , VexRm_Lx , E(F30F38,28,_,x,_,1,_,_ ), 0 , 205, 0 , 9311 , 360, 146), // #1390 - INST(Vpmovmskb , VexRm_Lx , V(660F00,D7,_,x,I,_,_,_ ), 0 , 69 , 0 , 9320 , 336, 160), // #1391 - INST(Vpmovq2m , VexRm_Lx , E(F30F38,39,_,x,_,1,_,_ ), 0 , 205, 0 , 9330 , 391, 140), // #1392 - INST(Vpmovqb , VexMr_Lx , E(F30F38,32,_,x,_,0,1,OVM), 0 , 218, 0 , 9339 , 394, 138), // #1393 - INST(Vpmovqd , VexMr_Lx , E(F30F38,35,_,x,_,0,3,HVM), 0 , 217, 0 , 9347 , 393, 138), // #1394 - INST(Vpmovqw , VexMr_Lx , E(F30F38,34,_,x,_,0,2,QVM), 0 , 216, 0 , 9355 , 392, 138), // #1395 - INST(Vpmovsdb , VexMr_Lx , E(F30F38,21,_,x,_,0,2,QVM), 0 , 216, 0 , 9363 , 392, 138), // #1396 - INST(Vpmovsdw , VexMr_Lx , E(F30F38,23,_,x,_,0,3,HVM), 0 , 217, 0 , 9372 , 393, 138), // #1397 - INST(Vpmovsqb , VexMr_Lx , E(F30F38,22,_,x,_,0,1,OVM), 0 , 218, 0 , 9381 , 394, 138), // #1398 - INST(Vpmovsqd , VexMr_Lx , E(F30F38,25,_,x,_,0,3,HVM), 0 , 217, 0 , 9390 , 393, 138), // #1399 - INST(Vpmovsqw , VexMr_Lx , E(F30F38,24,_,x,_,0,2,QVM), 0 , 216, 0 , 9399 , 392, 138), // #1400 - INST(Vpmovswb , VexMr_Lx , E(F30F38,20,_,x,_,0,3,HVM), 0 , 217, 0 , 9408 , 393, 146), // #1401 - INST(Vpmovsxbd , VexRm_Lx , V(660F38,21,_,x,I,I,2,QVM), 0 , 219, 0 , 9417 , 395, 142), // #1402 - INST(Vpmovsxbq , VexRm_Lx , V(660F38,22,_,x,I,I,1,OVM), 0 , 220, 0 , 9427 , 396, 142), // #1403 - INST(Vpmovsxbw , VexRm_Lx , V(660F38,20,_,x,I,I,3,HVM), 0 , 139, 0 , 9437 , 397, 163), // #1404 - INST(Vpmovsxdq , VexRm_Lx , V(660F38,25,_,x,I,0,3,HVM), 0 , 139, 0 , 9447 , 397, 142), // #1405 - INST(Vpmovsxwd , VexRm_Lx , V(660F38,23,_,x,I,I,3,HVM), 0 , 139, 0 , 9457 , 397, 142), // #1406 - INST(Vpmovsxwq , VexRm_Lx , V(660F38,24,_,x,I,I,2,QVM), 0 , 219, 0 , 9467 , 395, 142), // #1407 - INST(Vpmovusdb , VexMr_Lx , E(F30F38,11,_,x,_,0,2,QVM), 0 , 216, 0 , 9477 , 392, 138), // #1408 - INST(Vpmovusdw , VexMr_Lx , E(F30F38,13,_,x,_,0,3,HVM), 0 , 217, 0 , 9487 , 393, 138), // #1409 - INST(Vpmovusqb , VexMr_Lx , E(F30F38,12,_,x,_,0,1,OVM), 0 , 218, 0 , 9497 , 394, 138), // #1410 - INST(Vpmovusqd , VexMr_Lx , E(F30F38,15,_,x,_,0,3,HVM), 0 , 217, 0 , 9507 , 393, 138), // #1411 - INST(Vpmovusqw , VexMr_Lx , E(F30F38,14,_,x,_,0,2,QVM), 0 , 216, 0 , 9517 , 392, 138), // #1412 - INST(Vpmovuswb , VexMr_Lx , E(F30F38,10,_,x,_,0,3,HVM), 0 , 217, 0 , 9527 , 393, 146), // #1413 - INST(Vpmovw2m , VexRm_Lx , E(F30F38,29,_,x,_,1,_,_ ), 0 , 205, 0 , 9537 , 391, 146), // #1414 - INST(Vpmovwb , VexMr_Lx , E(F30F38,30,_,x,_,0,3,HVM), 0 , 217, 0 , 9546 , 393, 146), // #1415 - INST(Vpmovzxbd , VexRm_Lx , V(660F38,31,_,x,I,I,2,QVM), 0 , 219, 0 , 9554 , 395, 142), // #1416 - INST(Vpmovzxbq , VexRm_Lx , V(660F38,32,_,x,I,I,1,OVM), 0 , 220, 0 , 9564 , 396, 142), // #1417 - INST(Vpmovzxbw , VexRm_Lx , V(660F38,30,_,x,I,I,3,HVM), 0 , 139, 0 , 9574 , 397, 163), // #1418 - INST(Vpmovzxdq , VexRm_Lx , V(660F38,35,_,x,I,0,3,HVM), 0 , 139, 0 , 9584 , 397, 142), // #1419 - INST(Vpmovzxwd , VexRm_Lx , V(660F38,33,_,x,I,I,3,HVM), 0 , 139, 0 , 9594 , 397, 142), // #1420 - INST(Vpmovzxwq , VexRm_Lx , V(660F38,34,_,x,I,I,2,QVM), 0 , 219, 0 , 9604 , 395, 142), // #1421 - INST(Vpmuldq , VexRvm_Lx , V(660F38,28,_,x,I,1,4,FV ), 0 , 209, 0 , 9614 , 208, 142), // #1422 - INST(Vpmulhrsw , VexRvm_Lx , V(660F38,0B,_,x,I,I,4,FVM), 0 , 110, 0 , 9622 , 315, 163), // #1423 - INST(Vpmulhuw , VexRvm_Lx , V(660F00,E4,_,x,I,I,4,FVM), 0 , 144, 0 , 9632 , 315, 163), // #1424 - INST(Vpmulhw , VexRvm_Lx , V(660F00,E5,_,x,I,I,4,FVM), 0 , 144, 0 , 9641 , 315, 163), // #1425 - INST(Vpmulld , VexRvm_Lx , V(660F38,40,_,x,I,0,4,FV ), 0 , 110, 0 , 9649 , 209, 142), // #1426 - INST(Vpmullq , VexRvm_Lx , E(660F38,40,_,x,_,1,4,FV ), 0 , 113, 0 , 9657 , 212, 140), // #1427 - INST(Vpmullw , VexRvm_Lx , V(660F00,D5,_,x,I,I,4,FVM), 0 , 144, 0 , 9665 , 315, 163), // #1428 - INST(Vpmultishiftqb , VexRvm_Lx , E(660F38,83,_,x,_,1,4,FV ), 0 , 113, 0 , 9673 , 212, 170), // #1429 - INST(Vpmuludq , VexRvm_Lx , V(660F00,F4,_,x,I,1,4,FV ), 0 , 103, 0 , 9688 , 208, 142), // #1430 - INST(Vpopcntb , VexRm_Lx , E(660F38,54,_,x,_,0,4,FV ), 0 , 114, 0 , 9697 , 279, 174), // #1431 - INST(Vpopcntd , VexRm_Lx , E(660F38,55,_,x,_,0,4,FVM), 0 , 114, 0 , 9706 , 374, 175), // #1432 - INST(Vpopcntq , VexRm_Lx , E(660F38,55,_,x,_,1,4,FVM), 0 , 113, 0 , 9715 , 350, 175), // #1433 - INST(Vpopcntw , VexRm_Lx , E(660F38,54,_,x,_,1,4,FV ), 0 , 113, 0 , 9724 , 279, 174), // #1434 - INST(Vpor , VexRvm_Lx , V(660F00,EB,_,x,I,_,_,_ ), 0 , 69 , 0 , 9733 , 351, 160), // #1435 - INST(Vpord , VexRvm_Lx , E(660F00,EB,_,x,_,0,4,FV ), 0 , 198, 0 , 9738 , 352, 138), // #1436 - INST(Vporq , VexRvm_Lx , E(660F00,EB,_,x,_,1,4,FV ), 0 , 135, 0 , 9744 , 356, 138), // #1437 - INST(Vpperm , VexRvrmRvmr , V(XOP_M8,A3,_,0,x,_,_,_ ), 0 , 208, 0 , 9750 , 398, 151), // #1438 - INST(Vprold , VexVmi_Lx , E(660F00,72,1,x,_,0,4,FV ), 0 , 221, 0 , 9757 , 399, 138), // #1439 - INST(Vprolq , VexVmi_Lx , E(660F00,72,1,x,_,1,4,FV ), 0 , 222, 0 , 9764 , 400, 138), // #1440 - INST(Vprolvd , VexRvm_Lx , E(660F38,15,_,x,_,0,4,FV ), 0 , 114, 0 , 9771 , 213, 138), // #1441 - INST(Vprolvq , VexRvm_Lx , E(660F38,15,_,x,_,1,4,FV ), 0 , 113, 0 , 9779 , 212, 138), // #1442 - INST(Vprord , VexVmi_Lx , E(660F00,72,0,x,_,0,4,FV ), 0 , 198, 0 , 9787 , 399, 138), // #1443 - INST(Vprorq , VexVmi_Lx , E(660F00,72,0,x,_,1,4,FV ), 0 , 135, 0 , 9794 , 400, 138), // #1444 - INST(Vprorvd , VexRvm_Lx , E(660F38,14,_,x,_,0,4,FV ), 0 , 114, 0 , 9801 , 213, 138), // #1445 - INST(Vprorvq , VexRvm_Lx , E(660F38,14,_,x,_,1,4,FV ), 0 , 113, 0 , 9809 , 212, 138), // #1446 - INST(Vprotb , VexRvmRmvRmi , V(XOP_M9,90,_,0,x,_,_,_ ), V(XOP_M8,C0,_,0,x,_,_,_ ), 79 , 122, 9817 , 401, 151), // #1447 - INST(Vprotd , VexRvmRmvRmi , V(XOP_M9,92,_,0,x,_,_,_ ), V(XOP_M8,C2,_,0,x,_,_,_ ), 79 , 123, 9824 , 401, 151), // #1448 - INST(Vprotq , VexRvmRmvRmi , V(XOP_M9,93,_,0,x,_,_,_ ), V(XOP_M8,C3,_,0,x,_,_,_ ), 79 , 124, 9831 , 401, 151), // #1449 - INST(Vprotw , VexRvmRmvRmi , V(XOP_M9,91,_,0,x,_,_,_ ), V(XOP_M8,C1,_,0,x,_,_,_ ), 79 , 125, 9838 , 401, 151), // #1450 - INST(Vpsadbw , VexRvm_Lx , V(660F00,F6,_,x,I,I,4,FVM), 0 , 144, 0 , 9845 , 203, 163), // #1451 - INST(Vpscatterdd , VexMr_VM , E(660F38,A0,_,x,_,0,2,T1S), 0 , 129, 0 , 9853 , 402, 138), // #1452 - INST(Vpscatterdq , VexMr_VM , E(660F38,A0,_,x,_,1,3,T1S), 0 , 128, 0 , 9865 , 403, 138), // #1453 - INST(Vpscatterqd , VexMr_VM , E(660F38,A1,_,x,_,0,2,T1S), 0 , 129, 0 , 9877 , 404, 138), // #1454 - INST(Vpscatterqq , VexMr_VM , E(660F38,A1,_,x,_,1,3,T1S), 0 , 128, 0 , 9889 , 405, 138), // #1455 - INST(Vpshab , VexRvmRmv , V(XOP_M9,98,_,0,x,_,_,_ ), 0 , 79 , 0 , 9901 , 406, 151), // #1456 - INST(Vpshad , VexRvmRmv , V(XOP_M9,9A,_,0,x,_,_,_ ), 0 , 79 , 0 , 9908 , 406, 151), // #1457 - INST(Vpshaq , VexRvmRmv , V(XOP_M9,9B,_,0,x,_,_,_ ), 0 , 79 , 0 , 9915 , 406, 151), // #1458 - INST(Vpshaw , VexRvmRmv , V(XOP_M9,99,_,0,x,_,_,_ ), 0 , 79 , 0 , 9922 , 406, 151), // #1459 - INST(Vpshlb , VexRvmRmv , V(XOP_M9,94,_,0,x,_,_,_ ), 0 , 79 , 0 , 9929 , 406, 151), // #1460 - INST(Vpshld , VexRvmRmv , V(XOP_M9,96,_,0,x,_,_,_ ), 0 , 79 , 0 , 9936 , 406, 151), // #1461 - INST(Vpshldd , VexRvmi_Lx , E(660F3A,71,_,x,_,0,4,FV ), 0 , 111, 0 , 9943 , 206, 168), // #1462 - INST(Vpshldq , VexRvmi_Lx , E(660F3A,71,_,x,_,1,4,FV ), 0 , 112, 0 , 9951 , 207, 168), // #1463 - INST(Vpshldvd , VexRvm_Lx , E(660F38,71,_,x,_,0,4,FV ), 0 , 114, 0 , 9959 , 213, 168), // #1464 - INST(Vpshldvq , VexRvm_Lx , E(660F38,71,_,x,_,1,4,FV ), 0 , 113, 0 , 9968 , 212, 168), // #1465 - INST(Vpshldvw , VexRvm_Lx , E(660F38,70,_,x,_,1,4,FVM), 0 , 113, 0 , 9977 , 357, 168), // #1466 - INST(Vpshldw , VexRvmi_Lx , E(660F3A,70,_,x,_,1,4,FVM), 0 , 112, 0 , 9986 , 275, 168), // #1467 - INST(Vpshlq , VexRvmRmv , V(XOP_M9,97,_,0,x,_,_,_ ), 0 , 79 , 0 , 9994 , 406, 151), // #1468 - INST(Vpshlw , VexRvmRmv , V(XOP_M9,95,_,0,x,_,_,_ ), 0 , 79 , 0 , 10001, 406, 151), // #1469 - INST(Vpshrdd , VexRvmi_Lx , E(660F3A,73,_,x,_,0,4,FV ), 0 , 111, 0 , 10008, 206, 168), // #1470 - INST(Vpshrdq , VexRvmi_Lx , E(660F3A,73,_,x,_,1,4,FV ), 0 , 112, 0 , 10016, 207, 168), // #1471 - INST(Vpshrdvd , VexRvm_Lx , E(660F38,73,_,x,_,0,4,FV ), 0 , 114, 0 , 10024, 213, 168), // #1472 - INST(Vpshrdvq , VexRvm_Lx , E(660F38,73,_,x,_,1,4,FV ), 0 , 113, 0 , 10033, 212, 168), // #1473 - INST(Vpshrdvw , VexRvm_Lx , E(660F38,72,_,x,_,1,4,FVM), 0 , 113, 0 , 10042, 357, 168), // #1474 - INST(Vpshrdw , VexRvmi_Lx , E(660F3A,72,_,x,_,1,4,FVM), 0 , 112, 0 , 10051, 275, 168), // #1475 - INST(Vpshufb , VexRvm_Lx , V(660F38,00,_,x,I,I,4,FVM), 0 , 110, 0 , 10059, 315, 163), // #1476 - INST(Vpshufbitqmb , VexRvm_Lx , E(660F38,8F,_,x,0,0,4,FVM), 0 , 114, 0 , 10067, 407, 174), // #1477 - INST(Vpshufd , VexRmi_Lx , V(660F00,70,_,x,I,0,4,FV ), 0 , 144, 0 , 10080, 408, 142), // #1478 - INST(Vpshufhw , VexRmi_Lx , V(F30F00,70,_,x,I,I,4,FVM), 0 , 161, 0 , 10088, 409, 163), // #1479 - INST(Vpshuflw , VexRmi_Lx , V(F20F00,70,_,x,I,I,4,FVM), 0 , 223, 0 , 10097, 409, 163), // #1480 - INST(Vpsignb , VexRvm_Lx , V(660F38,08,_,x,I,_,_,_ ), 0 , 96 , 0 , 10106, 202, 160), // #1481 - INST(Vpsignd , VexRvm_Lx , V(660F38,0A,_,x,I,_,_,_ ), 0 , 96 , 0 , 10114, 202, 160), // #1482 - INST(Vpsignw , VexRvm_Lx , V(660F38,09,_,x,I,_,_,_ ), 0 , 96 , 0 , 10122, 202, 160), // #1483 - INST(Vpslld , VexRvmVmi_Lx_MEvex , V(660F00,F2,_,x,I,0,4,128), V(660F00,72,6,x,I,0,4,FV ), 224, 126, 10130, 410, 142), // #1484 - INST(Vpslldq , VexVmi_Lx_MEvex , V(660F00,73,7,x,I,I,4,FVM), 0 , 225, 0 , 10137, 411, 163), // #1485 - INST(Vpsllq , VexRvmVmi_Lx_MEvex , V(660F00,F3,_,x,I,1,4,128), V(660F00,73,6,x,I,1,4,FV ), 226, 127, 10145, 412, 142), // #1486 - INST(Vpsllvd , VexRvm_Lx , V(660F38,47,_,x,0,0,4,FV ), 0 , 110, 0 , 10152, 209, 152), // #1487 - INST(Vpsllvq , VexRvm_Lx , V(660F38,47,_,x,1,1,4,FV ), 0 , 182, 0 , 10160, 208, 152), // #1488 - INST(Vpsllvw , VexRvm_Lx , E(660F38,12,_,x,_,1,4,FVM), 0 , 113, 0 , 10168, 357, 146), // #1489 - INST(Vpsllw , VexRvmVmi_Lx_MEvex , V(660F00,F1,_,x,I,I,4,128), V(660F00,71,6,x,I,I,4,FVM), 224, 128, 10176, 413, 163), // #1490 - INST(Vpsrad , VexRvmVmi_Lx_MEvex , V(660F00,E2,_,x,I,0,4,128), V(660F00,72,4,x,I,0,4,FV ), 224, 129, 10183, 410, 142), // #1491 - INST(Vpsraq , VexRvmVmi_Lx_MEvex , E(660F00,E2,_,x,_,1,4,128), E(660F00,72,4,x,_,1,4,FV ), 227, 130, 10190, 414, 138), // #1492 - INST(Vpsravd , VexRvm_Lx , V(660F38,46,_,x,0,0,4,FV ), 0 , 110, 0 , 10197, 209, 152), // #1493 - INST(Vpsravq , VexRvm_Lx , E(660F38,46,_,x,_,1,4,FV ), 0 , 113, 0 , 10205, 212, 138), // #1494 - INST(Vpsravw , VexRvm_Lx , E(660F38,11,_,x,_,1,4,FVM), 0 , 113, 0 , 10213, 357, 146), // #1495 - INST(Vpsraw , VexRvmVmi_Lx_MEvex , V(660F00,E1,_,x,I,I,4,128), V(660F00,71,4,x,I,I,4,FVM), 224, 131, 10221, 413, 163), // #1496 - INST(Vpsrld , VexRvmVmi_Lx_MEvex , V(660F00,D2,_,x,I,0,4,128), V(660F00,72,2,x,I,0,4,FV ), 224, 132, 10228, 410, 142), // #1497 - INST(Vpsrldq , VexVmi_Lx_MEvex , V(660F00,73,3,x,I,I,4,FVM), 0 , 228, 0 , 10235, 411, 163), // #1498 - INST(Vpsrlq , VexRvmVmi_Lx_MEvex , V(660F00,D3,_,x,I,1,4,128), V(660F00,73,2,x,I,1,4,FV ), 226, 133, 10243, 412, 142), // #1499 - INST(Vpsrlvd , VexRvm_Lx , V(660F38,45,_,x,0,0,4,FV ), 0 , 110, 0 , 10250, 209, 152), // #1500 - INST(Vpsrlvq , VexRvm_Lx , V(660F38,45,_,x,1,1,4,FV ), 0 , 182, 0 , 10258, 208, 152), // #1501 - INST(Vpsrlvw , VexRvm_Lx , E(660F38,10,_,x,_,1,4,FVM), 0 , 113, 0 , 10266, 357, 146), // #1502 - INST(Vpsrlw , VexRvmVmi_Lx_MEvex , V(660F00,D1,_,x,I,I,4,128), V(660F00,71,2,x,I,I,4,FVM), 224, 134, 10274, 413, 163), // #1503 - INST(Vpsubb , VexRvm_Lx , V(660F00,F8,_,x,I,I,4,FVM), 0 , 144, 0 , 10281, 415, 163), // #1504 - INST(Vpsubd , VexRvm_Lx , V(660F00,FA,_,x,I,0,4,FV ), 0 , 144, 0 , 10288, 416, 142), // #1505 - INST(Vpsubq , VexRvm_Lx , V(660F00,FB,_,x,I,1,4,FV ), 0 , 103, 0 , 10295, 417, 142), // #1506 - INST(Vpsubsb , VexRvm_Lx , V(660F00,E8,_,x,I,I,4,FVM), 0 , 144, 0 , 10302, 415, 163), // #1507 - INST(Vpsubsw , VexRvm_Lx , V(660F00,E9,_,x,I,I,4,FVM), 0 , 144, 0 , 10310, 415, 163), // #1508 - INST(Vpsubusb , VexRvm_Lx , V(660F00,D8,_,x,I,I,4,FVM), 0 , 144, 0 , 10318, 415, 163), // #1509 - INST(Vpsubusw , VexRvm_Lx , V(660F00,D9,_,x,I,I,4,FVM), 0 , 144, 0 , 10327, 415, 163), // #1510 - INST(Vpsubw , VexRvm_Lx , V(660F00,F9,_,x,I,I,4,FVM), 0 , 144, 0 , 10336, 415, 163), // #1511 - INST(Vpternlogd , VexRvmi_Lx , E(660F3A,25,_,x,_,0,4,FV ), 0 , 111, 0 , 10343, 206, 138), // #1512 - INST(Vpternlogq , VexRvmi_Lx , E(660F3A,25,_,x,_,1,4,FV ), 0 , 112, 0 , 10354, 207, 138), // #1513 - INST(Vptest , VexRm_Lx , V(660F38,17,_,x,I,_,_,_ ), 0 , 96 , 0 , 10365, 298, 167), // #1514 - INST(Vptestmb , VexRvm_Lx , E(660F38,26,_,x,_,0,4,FVM), 0 , 114, 0 , 10372, 407, 146), // #1515 - INST(Vptestmd , VexRvm_Lx , E(660F38,27,_,x,_,0,4,FV ), 0 , 114, 0 , 10381, 418, 138), // #1516 - INST(Vptestmq , VexRvm_Lx , E(660F38,27,_,x,_,1,4,FV ), 0 , 113, 0 , 10390, 419, 138), // #1517 - INST(Vptestmw , VexRvm_Lx , E(660F38,26,_,x,_,1,4,FVM), 0 , 113, 0 , 10399, 407, 146), // #1518 - INST(Vptestnmb , VexRvm_Lx , E(F30F38,26,_,x,_,0,4,FVM), 0 , 132, 0 , 10408, 407, 146), // #1519 - INST(Vptestnmd , VexRvm_Lx , E(F30F38,27,_,x,_,0,4,FV ), 0 , 132, 0 , 10418, 418, 138), // #1520 - INST(Vptestnmq , VexRvm_Lx , E(F30F38,27,_,x,_,1,4,FV ), 0 , 229, 0 , 10428, 419, 138), // #1521 - INST(Vptestnmw , VexRvm_Lx , E(F30F38,26,_,x,_,1,4,FVM), 0 , 229, 0 , 10438, 407, 146), // #1522 - INST(Vpunpckhbw , VexRvm_Lx , V(660F00,68,_,x,I,I,4,FVM), 0 , 144, 0 , 10448, 315, 163), // #1523 - INST(Vpunpckhdq , VexRvm_Lx , V(660F00,6A,_,x,I,0,4,FV ), 0 , 144, 0 , 10459, 209, 142), // #1524 - INST(Vpunpckhqdq , VexRvm_Lx , V(660F00,6D,_,x,I,1,4,FV ), 0 , 103, 0 , 10470, 208, 142), // #1525 - INST(Vpunpckhwd , VexRvm_Lx , V(660F00,69,_,x,I,I,4,FVM), 0 , 144, 0 , 10482, 315, 163), // #1526 - INST(Vpunpcklbw , VexRvm_Lx , V(660F00,60,_,x,I,I,4,FVM), 0 , 144, 0 , 10493, 315, 163), // #1527 - INST(Vpunpckldq , VexRvm_Lx , V(660F00,62,_,x,I,0,4,FV ), 0 , 144, 0 , 10504, 209, 142), // #1528 - INST(Vpunpcklqdq , VexRvm_Lx , V(660F00,6C,_,x,I,1,4,FV ), 0 , 103, 0 , 10515, 208, 142), // #1529 - INST(Vpunpcklwd , VexRvm_Lx , V(660F00,61,_,x,I,I,4,FVM), 0 , 144, 0 , 10527, 315, 163), // #1530 - INST(Vpxor , VexRvm_Lx , V(660F00,EF,_,x,I,_,_,_ ), 0 , 69 , 0 , 10538, 353, 160), // #1531 - INST(Vpxord , VexRvm_Lx , E(660F00,EF,_,x,_,0,4,FV ), 0 , 198, 0 , 10544, 354, 138), // #1532 - INST(Vpxorq , VexRvm_Lx , E(660F00,EF,_,x,_,1,4,FV ), 0 , 135, 0 , 10551, 355, 138), // #1533 - INST(Vrangepd , VexRvmi_Lx , E(660F3A,50,_,x,_,1,4,FV ), 0 , 112, 0 , 10558, 285, 140), // #1534 - INST(Vrangeps , VexRvmi_Lx , E(660F3A,50,_,x,_,0,4,FV ), 0 , 111, 0 , 10567, 286, 140), // #1535 - INST(Vrangesd , VexRvmi , E(660F3A,51,_,I,_,1,3,T1S), 0 , 180, 0 , 10576, 287, 66 ), // #1536 - INST(Vrangess , VexRvmi , E(660F3A,51,_,I,_,0,2,T1S), 0 , 181, 0 , 10585, 288, 66 ), // #1537 - INST(Vrcp14pd , VexRm_Lx , E(660F38,4C,_,x,_,1,4,FV ), 0 , 113, 0 , 10594, 350, 138), // #1538 - INST(Vrcp14ps , VexRm_Lx , E(660F38,4C,_,x,_,0,4,FV ), 0 , 114, 0 , 10603, 374, 138), // #1539 - INST(Vrcp14sd , VexRvm , E(660F38,4D,_,I,_,1,3,T1S), 0 , 128, 0 , 10612, 420, 68 ), // #1540 - INST(Vrcp14ss , VexRvm , E(660F38,4D,_,I,_,0,2,T1S), 0 , 129, 0 , 10621, 421, 68 ), // #1541 - INST(Vrcp28pd , VexRm , E(660F38,CA,_,2,_,1,4,FV ), 0 , 170, 0 , 10630, 277, 147), // #1542 - INST(Vrcp28ps , VexRm , E(660F38,CA,_,2,_,0,4,FV ), 0 , 171, 0 , 10639, 278, 147), // #1543 - INST(Vrcp28sd , VexRvm , E(660F38,CB,_,I,_,1,3,T1S), 0 , 128, 0 , 10648, 308, 147), // #1544 - INST(Vrcp28ss , VexRvm , E(660F38,CB,_,I,_,0,2,T1S), 0 , 129, 0 , 10657, 309, 147), // #1545 - INST(Vrcpph , VexRm_Lx , E(66MAP6,4C,_,_,_,0,4,FV ), 0 , 183, 0 , 10666, 422, 134), // #1546 - INST(Vrcpps , VexRm_Lx , V(000F00,53,_,x,I,_,_,_ ), 0 , 72 , 0 , 10673, 298, 135), // #1547 - INST(Vrcpsh , VexRvm , E(66MAP6,4D,_,_,_,0,1,T1S), 0 , 185, 0 , 10680, 423, 134), // #1548 - INST(Vrcpss , VexRvm , V(F30F00,53,_,I,I,_,_,_ ), 0 , 199, 0 , 10687, 424, 135), // #1549 - INST(Vreducepd , VexRmi_Lx , E(660F3A,56,_,x,_,1,4,FV ), 0 , 112, 0 , 10694, 400, 140), // #1550 - INST(Vreduceph , VexRmi_Lx , E(000F3A,56,_,_,_,0,4,FV ), 0 , 123, 0 , 10704, 311, 132), // #1551 - INST(Vreduceps , VexRmi_Lx , E(660F3A,56,_,x,_,0,4,FV ), 0 , 111, 0 , 10714, 399, 140), // #1552 - INST(Vreducesd , VexRvmi , E(660F3A,57,_,I,_,1,3,T1S), 0 , 180, 0 , 10724, 425, 66 ), // #1553 - INST(Vreducesh , VexRvmi , E(000F3A,57,_,_,_,0,1,T1S), 0 , 188, 0 , 10734, 313, 134), // #1554 - INST(Vreducess , VexRvmi , E(660F3A,57,_,I,_,0,2,T1S), 0 , 181, 0 , 10744, 426, 66 ), // #1555 - INST(Vrndscalepd , VexRmi_Lx , E(660F3A,09,_,x,_,1,4,FV ), 0 , 112, 0 , 10754, 310, 138), // #1556 - INST(Vrndscaleph , VexRmi_Lx , E(000F3A,08,_,_,_,0,4,FV ), 0 , 123, 0 , 10766, 311, 132), // #1557 - INST(Vrndscaleps , VexRmi_Lx , E(660F3A,08,_,x,_,0,4,FV ), 0 , 111, 0 , 10778, 312, 138), // #1558 - INST(Vrndscalesd , VexRvmi , E(660F3A,0B,_,I,_,1,3,T1S), 0 , 180, 0 , 10790, 287, 68 ), // #1559 - INST(Vrndscalesh , VexRvmi , E(000F3A,0A,_,_,_,0,1,T1S), 0 , 188, 0 , 10802, 313, 134), // #1560 - INST(Vrndscaless , VexRvmi , E(660F3A,0A,_,I,_,0,2,T1S), 0 , 181, 0 , 10814, 288, 68 ), // #1561 - INST(Vroundpd , VexRmi_Lx , V(660F3A,09,_,x,I,_,_,_ ), 0 , 73 , 0 , 10826, 427, 135), // #1562 - INST(Vroundps , VexRmi_Lx , V(660F3A,08,_,x,I,_,_,_ ), 0 , 73 , 0 , 10835, 427, 135), // #1563 - INST(Vroundsd , VexRvmi , V(660F3A,0B,_,I,I,_,_,_ ), 0 , 73 , 0 , 10844, 428, 135), // #1564 - INST(Vroundss , VexRvmi , V(660F3A,0A,_,I,I,_,_,_ ), 0 , 73 , 0 , 10853, 429, 135), // #1565 - INST(Vrsqrt14pd , VexRm_Lx , E(660F38,4E,_,x,_,1,4,FV ), 0 , 113, 0 , 10862, 350, 138), // #1566 - INST(Vrsqrt14ps , VexRm_Lx , E(660F38,4E,_,x,_,0,4,FV ), 0 , 114, 0 , 10873, 374, 138), // #1567 - INST(Vrsqrt14sd , VexRvm , E(660F38,4F,_,I,_,1,3,T1S), 0 , 128, 0 , 10884, 420, 68 ), // #1568 - INST(Vrsqrt14ss , VexRvm , E(660F38,4F,_,I,_,0,2,T1S), 0 , 129, 0 , 10895, 421, 68 ), // #1569 - INST(Vrsqrt28pd , VexRm , E(660F38,CC,_,2,_,1,4,FV ), 0 , 170, 0 , 10906, 277, 147), // #1570 - INST(Vrsqrt28ps , VexRm , E(660F38,CC,_,2,_,0,4,FV ), 0 , 171, 0 , 10917, 278, 147), // #1571 - INST(Vrsqrt28sd , VexRvm , E(660F38,CD,_,I,_,1,3,T1S), 0 , 128, 0 , 10928, 308, 147), // #1572 - INST(Vrsqrt28ss , VexRvm , E(660F38,CD,_,I,_,0,2,T1S), 0 , 129, 0 , 10939, 309, 147), // #1573 - INST(Vrsqrtph , VexRm_Lx , E(66MAP6,4E,_,_,_,0,4,FV ), 0 , 183, 0 , 10950, 422, 132), // #1574 - INST(Vrsqrtps , VexRm_Lx , V(000F00,52,_,x,I,_,_,_ ), 0 , 72 , 0 , 10959, 298, 135), // #1575 - INST(Vrsqrtsh , VexRvm , E(66MAP6,4F,_,_,_,0,1,T1S), 0 , 185, 0 , 10968, 423, 134), // #1576 - INST(Vrsqrtss , VexRvm , V(F30F00,52,_,I,I,_,_,_ ), 0 , 199, 0 , 10977, 424, 135), // #1577 - INST(Vscalefpd , VexRvm_Lx , E(660F38,2C,_,x,_,1,4,FV ), 0 , 113, 0 , 10986, 430, 138), // #1578 - INST(Vscalefph , VexRvm_Lx , E(66MAP6,2C,_,_,_,0,4,FV ), 0 , 183, 0 , 10996, 197, 132), // #1579 - INST(Vscalefps , VexRvm_Lx , E(660F38,2C,_,x,_,0,4,FV ), 0 , 114, 0 , 11006, 284, 138), // #1580 - INST(Vscalefsd , VexRvm , E(660F38,2D,_,I,_,1,3,T1S), 0 , 128, 0 , 11016, 251, 68 ), // #1581 - INST(Vscalefsh , VexRvm , E(66MAP6,2D,_,_,_,0,1,T1S), 0 , 185, 0 , 11026, 200, 134), // #1582 - INST(Vscalefss , VexRvm , E(660F38,2D,_,I,_,0,2,T1S), 0 , 129, 0 , 11036, 259, 68 ), // #1583 - INST(Vscatterdpd , VexMr_VM , E(660F38,A2,_,x,_,1,3,T1S), 0 , 128, 0 , 11046, 403, 138), // #1584 - INST(Vscatterdps , VexMr_VM , E(660F38,A2,_,x,_,0,2,T1S), 0 , 129, 0 , 11058, 402, 138), // #1585 - INST(Vscatterpf0dpd , VexM_VM , E(660F38,C6,5,2,_,1,3,T1S), 0 , 230, 0 , 11070, 303, 153), // #1586 - INST(Vscatterpf0dps , VexM_VM , E(660F38,C6,5,2,_,0,2,T1S), 0 , 231, 0 , 11085, 304, 153), // #1587 - INST(Vscatterpf0qpd , VexM_VM , E(660F38,C7,5,2,_,1,3,T1S), 0 , 230, 0 , 11100, 305, 153), // #1588 - INST(Vscatterpf0qps , VexM_VM , E(660F38,C7,5,2,_,0,2,T1S), 0 , 231, 0 , 11115, 305, 153), // #1589 - INST(Vscatterpf1dpd , VexM_VM , E(660F38,C6,6,2,_,1,3,T1S), 0 , 232, 0 , 11130, 303, 153), // #1590 - INST(Vscatterpf1dps , VexM_VM , E(660F38,C6,6,2,_,0,2,T1S), 0 , 233, 0 , 11145, 304, 153), // #1591 - INST(Vscatterpf1qpd , VexM_VM , E(660F38,C7,6,2,_,1,3,T1S), 0 , 232, 0 , 11160, 305, 153), // #1592 - INST(Vscatterpf1qps , VexM_VM , E(660F38,C7,6,2,_,0,2,T1S), 0 , 233, 0 , 11175, 305, 153), // #1593 - INST(Vscatterqpd , VexMr_VM , E(660F38,A3,_,x,_,1,3,T1S), 0 , 128, 0 , 11190, 405, 138), // #1594 - INST(Vscatterqps , VexMr_VM , E(660F38,A3,_,x,_,0,2,T1S), 0 , 129, 0 , 11202, 404, 138), // #1595 - INST(Vshuff32x4 , VexRvmi_Lx , E(660F3A,23,_,x,_,0,4,FV ), 0 , 111, 0 , 11214, 431, 138), // #1596 - INST(Vshuff64x2 , VexRvmi_Lx , E(660F3A,23,_,x,_,1,4,FV ), 0 , 112, 0 , 11225, 432, 138), // #1597 - INST(Vshufi32x4 , VexRvmi_Lx , E(660F3A,43,_,x,_,0,4,FV ), 0 , 111, 0 , 11236, 431, 138), // #1598 - INST(Vshufi64x2 , VexRvmi_Lx , E(660F3A,43,_,x,_,1,4,FV ), 0 , 112, 0 , 11247, 432, 138), // #1599 - INST(Vshufpd , VexRvmi_Lx , V(660F00,C6,_,x,I,1,4,FV ), 0 , 103, 0 , 11258, 433, 131), // #1600 - INST(Vshufps , VexRvmi_Lx , V(000F00,C6,_,x,I,0,4,FV ), 0 , 105, 0 , 11266, 434, 131), // #1601 - INST(Vsqrtpd , VexRm_Lx , V(660F00,51,_,x,I,1,4,FV ), 0 , 103, 0 , 11274, 435, 131), // #1602 - INST(Vsqrtph , VexRm_Lx , E(00MAP5,51,_,_,_,0,4,FV ), 0 , 104, 0 , 11282, 246, 132), // #1603 - INST(Vsqrtps , VexRm_Lx , V(000F00,51,_,x,I,0,4,FV ), 0 , 105, 0 , 11290, 235, 131), // #1604 - INST(Vsqrtsd , VexRvm , V(F20F00,51,_,I,I,1,3,T1S), 0 , 106, 0 , 11298, 199, 133), // #1605 - INST(Vsqrtsh , VexRvm , E(F3MAP5,51,_,_,_,0,1,T1S), 0 , 107, 0 , 11306, 200, 134), // #1606 - INST(Vsqrtss , VexRvm , V(F30F00,51,_,I,I,0,2,T1S), 0 , 108, 0 , 11314, 201, 133), // #1607 - INST(Vstmxcsr , VexM , V(000F00,AE,3,0,I,_,_,_ ), 0 , 234, 0 , 11322, 321, 135), // #1608 - INST(Vsubpd , VexRvm_Lx , V(660F00,5C,_,x,I,1,4,FV ), 0 , 103, 0 , 11331, 196, 131), // #1609 - INST(Vsubph , VexRvm_Lx , E(00MAP5,5C,_,_,_,0,4,FV ), 0 , 104, 0 , 11338, 197, 132), // #1610 - INST(Vsubps , VexRvm_Lx , V(000F00,5C,_,x,I,0,4,FV ), 0 , 105, 0 , 11345, 198, 131), // #1611 - INST(Vsubsd , VexRvm , V(F20F00,5C,_,I,I,1,3,T1S), 0 , 106, 0 , 11352, 199, 133), // #1612 - INST(Vsubsh , VexRvm , E(F3MAP5,5C,_,_,_,0,1,T1S), 0 , 107, 0 , 11359, 200, 134), // #1613 - INST(Vsubss , VexRvm , V(F30F00,5C,_,I,I,0,2,T1S), 0 , 108, 0 , 11366, 201, 133), // #1614 - INST(Vtestpd , VexRm_Lx , V(660F38,0F,_,x,0,_,_,_ ), 0 , 96 , 0 , 11373, 298, 167), // #1615 - INST(Vtestps , VexRm_Lx , V(660F38,0E,_,x,0,_,_,_ ), 0 , 96 , 0 , 11381, 298, 167), // #1616 - INST(Vucomisd , VexRm , V(660F00,2E,_,I,I,1,3,T1S), 0 , 125, 0 , 11389, 229, 143), // #1617 - INST(Vucomish , VexRm , E(00MAP5,2E,_,_,_,0,1,T1S), 0 , 126, 0 , 11398, 230, 134), // #1618 - INST(Vucomiss , VexRm , V(000F00,2E,_,I,I,0,2,T1S), 0 , 127, 0 , 11407, 231, 143), // #1619 - INST(Vunpckhpd , VexRvm_Lx , V(660F00,15,_,x,I,1,4,FV ), 0 , 103, 0 , 11416, 208, 131), // #1620 - INST(Vunpckhps , VexRvm_Lx , V(000F00,15,_,x,I,0,4,FV ), 0 , 105, 0 , 11426, 209, 131), // #1621 - INST(Vunpcklpd , VexRvm_Lx , V(660F00,14,_,x,I,1,4,FV ), 0 , 103, 0 , 11436, 208, 131), // #1622 - INST(Vunpcklps , VexRvm_Lx , V(000F00,14,_,x,I,0,4,FV ), 0 , 105, 0 , 11446, 209, 131), // #1623 - INST(Vxorpd , VexRvm_Lx , V(660F00,57,_,x,I,1,4,FV ), 0 , 103, 0 , 11456, 417, 139), // #1624 - INST(Vxorps , VexRvm_Lx , V(000F00,57,_,x,I,0,4,FV ), 0 , 105, 0 , 11463, 416, 139), // #1625 - INST(Vzeroall , VexOp , V(000F00,77,_,1,I,_,_,_ ), 0 , 68 , 0 , 11470, 436, 135), // #1626 - INST(Vzeroupper , VexOp , V(000F00,77,_,0,I,_,_,_ ), 0 , 72 , 0 , 11479, 436, 135), // #1627 - INST(Wbinvd , X86Op , O(000F00,09,_,_,_,_,_,_ ), 0 , 4 , 0 , 11490, 30 , 0 ), // #1628 - INST(Wbnoinvd , X86Op , O(F30F00,09,_,_,_,_,_,_ ), 0 , 6 , 0 , 11497, 30 , 176), // #1629 - INST(Wrfsbase , X86M , O(F30F00,AE,2,_,x,_,_,_ ), 0 , 235, 0 , 11506, 173, 111), // #1630 - INST(Wrgsbase , X86M , O(F30F00,AE,3,_,x,_,_,_ ), 0 , 236, 0 , 11515, 173, 111), // #1631 - INST(Wrmsr , X86Op , O(000F00,30,_,_,_,_,_,_ ), 0 , 4 , 0 , 11524, 174, 112), // #1632 - INST(Wrssd , X86Mr , O(000F38,F6,_,_,_,_,_,_ ), 0 , 83 , 0 , 11530, 437, 56 ), // #1633 - INST(Wrssq , X86Mr , O(000F38,F6,_,_,1,_,_,_ ), 0 , 237, 0 , 11536, 438, 56 ), // #1634 - INST(Wrussd , X86Mr , O(660F38,F5,_,_,_,_,_,_ ), 0 , 2 , 0 , 11542, 437, 56 ), // #1635 - INST(Wrussq , X86Mr , O(660F38,F5,_,_,1,_,_,_ ), 0 , 238, 0 , 11549, 438, 56 ), // #1636 - INST(Xabort , X86Op_Mod11RM_I8 , O(000000,C6,7,_,_,_,_,_ ), 0 , 27 , 0 , 11556, 80 , 177), // #1637 - INST(Xadd , X86Xadd , O(000F00,C0,_,_,x,_,_,_ ), 0 , 4 , 0 , 11563, 439, 38 ), // #1638 - INST(Xbegin , X86JmpRel , O(000000,C7,7,_,_,_,_,_ ), 0 , 27 , 0 , 11568, 440, 177), // #1639 - INST(Xchg , X86Xchg , O(000000,86,_,_,x,_,_,_ ), 0 , 0 , 0 , 462 , 441, 0 ), // #1640 - INST(Xend , X86Op , O(000F01,D5,_,_,_,_,_,_ ), 0 , 21 , 0 , 11575, 30 , 177), // #1641 - INST(Xgetbv , X86Op , O(000F01,D0,_,_,_,_,_,_ ), 0 , 21 , 0 , 11580, 174, 178), // #1642 - INST(Xlatb , X86Op , O(000000,D7,_,_,_,_,_,_ ), 0 , 0 , 0 , 11587, 30 , 0 ), // #1643 - INST(Xor , X86Arith , O(000000,30,6,_,x,_,_,_ ), 0 , 32 , 0 , 10540, 179, 1 ), // #1644 - INST(Xorpd , ExtRm , O(660F00,57,_,_,_,_,_,_ ), 0 , 3 , 0 , 11457, 151, 4 ), // #1645 - INST(Xorps , ExtRm , O(000F00,57,_,_,_,_,_,_ ), 0 , 4 , 0 , 11464, 151, 5 ), // #1646 - INST(Xresldtrk , X86Op , O(F20F01,E9,_,_,_,_,_,_ ), 0 , 92 , 0 , 11593, 30 , 179), // #1647 - INST(Xrstor , X86M_Only_EDX_EAX , O(000F00,AE,5,_,_,_,_,_ ), 0 , 77 , 0 , 1164 , 442, 178), // #1648 - INST(Xrstor64 , X86M_Only_EDX_EAX , O(000F00,AE,5,_,1,_,_,_ ), 0 , 239, 0 , 1172 , 443, 178), // #1649 - INST(Xrstors , X86M_Only_EDX_EAX , O(000F00,C7,3,_,_,_,_,_ ), 0 , 78 , 0 , 11603, 442, 180), // #1650 - INST(Xrstors64 , X86M_Only_EDX_EAX , O(000F00,C7,3,_,1,_,_,_ ), 0 , 240, 0 , 11611, 443, 180), // #1651 - INST(Xsave , X86M_Only_EDX_EAX , O(000F00,AE,4,_,_,_,_,_ ), 0 , 97 , 0 , 1182 , 442, 178), // #1652 - INST(Xsave64 , X86M_Only_EDX_EAX , O(000F00,AE,4,_,1,_,_,_ ), 0 , 241, 0 , 1189 , 443, 178), // #1653 - INST(Xsavec , X86M_Only_EDX_EAX , O(000F00,C7,4,_,_,_,_,_ ), 0 , 97 , 0 , 11621, 442, 181), // #1654 - INST(Xsavec64 , X86M_Only_EDX_EAX , O(000F00,C7,4,_,1,_,_,_ ), 0 , 241, 0 , 11628, 443, 181), // #1655 - INST(Xsaveopt , X86M_Only_EDX_EAX , O(000F00,AE,6,_,_,_,_,_ ), 0 , 80 , 0 , 11637, 442, 182), // #1656 - INST(Xsaveopt64 , X86M_Only_EDX_EAX , O(000F00,AE,6,_,1,_,_,_ ), 0 , 242, 0 , 11646, 443, 182), // #1657 - INST(Xsaves , X86M_Only_EDX_EAX , O(000F00,C7,5,_,_,_,_,_ ), 0 , 77 , 0 , 11657, 442, 180), // #1658 - INST(Xsaves64 , X86M_Only_EDX_EAX , O(000F00,C7,5,_,1,_,_,_ ), 0 , 239, 0 , 11664, 443, 180), // #1659 - INST(Xsetbv , X86Op , O(000F01,D1,_,_,_,_,_,_ ), 0 , 21 , 0 , 11673, 174, 178), // #1660 - INST(Xsusldtrk , X86Op , O(F20F01,E8,_,_,_,_,_,_ ), 0 , 92 , 0 , 11680, 30 , 179), // #1661 - INST(Xtest , X86Op , O(000F01,D6,_,_,_,_,_,_ ), 0 , 21 , 0 , 11690, 30 , 183) // #1662 + INST(None , None , 0 , 0 , 0 , 0 , 0 , 0 ), // #0 + INST(Aaa , X86Op_xAX , O(000000,37,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #1 + INST(Aad , X86I_xAX , O(000000,D5,_,_,_,_,_,_ ), 0 , 0 , 0 , 2 , 1 ), // #2 + INST(Aadd , X86Mr , O(000F38,FC,_,_,_,_,_,_ ), 0 , 1 , 0 , 3 , 2 ), // #3 + INST(Aam , X86I_xAX , O(000000,D4,_,_,_,_,_,_ ), 0 , 0 , 0 , 2 , 1 ), // #4 + INST(Aand , X86Mr , O(660F38,FC,_,_,_,_,_,_ ), 0 , 2 , 0 , 3 , 2 ), // #5 + INST(Aas , X86Op_xAX , O(000000,3F,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #6 + INST(Adc , X86Arith , O(000000,10,2,_,x,_,_,_ ), 0 , 3 , 0 , 4 , 3 ), // #7 + INST(Adcx , X86Rm , O(660F38,F6,_,_,x,_,_,_ ), 0 , 2 , 0 , 5 , 4 ), // #8 + INST(Add , X86Arith , O(000000,00,0,_,x,_,_,_ ), 0 , 0 , 0 , 4 , 1 ), // #9 + INST(Addpd , ExtRm , O(660F00,58,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #10 + INST(Addps , ExtRm , O(000F00,58,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #11 + INST(Addsd , ExtRm , O(F20F00,58,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #12 + INST(Addss , ExtRm , O(F30F00,58,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #13 + INST(Addsubpd , ExtRm , O(660F00,D0,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 7 ), // #14 + INST(Addsubps , ExtRm , O(F20F00,D0,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 7 ), // #15 + INST(Adox , X86Rm , O(F30F38,F6,_,_,x,_,_,_ ), 0 , 8 , 0 , 5 , 8 ), // #16 + INST(Aesdec , ExtRm , O(660F38,DE,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #17 + INST(Aesdeclast , ExtRm , O(660F38,DF,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #18 + INST(Aesenc , ExtRm , O(660F38,DC,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #19 + INST(Aesenclast , ExtRm , O(660F38,DD,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #20 + INST(Aesimc , ExtRm , O(660F38,DB,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #21 + INST(Aeskeygenassist , ExtRmi , O(660F3A,DF,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 9 ), // #22 + INST(And , X86Arith , O(000000,20,4,_,x,_,_,_ ), 0 , 10 , 0 , 10 , 1 ), // #23 + INST(Andn , VexRvm_Wx , V(000F38,F2,_,0,x,_,_,_ ), 0 , 11 , 0 , 11 , 10 ), // #24 + INST(Andnpd , ExtRm , O(660F00,55,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #25 + INST(Andnps , ExtRm , O(000F00,55,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #26 + INST(Andpd , ExtRm , O(660F00,54,_,_,_,_,_,_ ), 0 , 4 , 0 , 12 , 5 ), // #27 + INST(Andps , ExtRm , O(000F00,54,_,_,_,_,_,_ ), 0 , 5 , 0 , 12 , 6 ), // #28 + INST(Aor , X86Mr , O(F20F38,FC,_,_,_,_,_,_ ), 0 , 12 , 0 , 3 , 2 ), // #29 + INST(Arpl , X86Mr_NoSize , O(000000,63,_,_,_,_,_,_ ), 0 , 0 , 0 , 13 , 11 ), // #30 + INST(Axor , X86Mr , O(F30F38,FC,_,_,_,_,_,_ ), 0 , 8 , 0 , 3 , 2 ), // #31 + INST(Bextr , VexRmv_Wx , V(000F38,F7,_,0,x,_,_,_ ), 0 , 11 , 0 , 14 , 10 ), // #32 + INST(Blcfill , VexVm_Wx , V(XOP_M9,01,1,0,x,_,_,_ ), 0 , 13 , 0 , 15 , 12 ), // #33 + INST(Blci , VexVm_Wx , V(XOP_M9,02,6,0,x,_,_,_ ), 0 , 14 , 0 , 15 , 12 ), // #34 + INST(Blcic , VexVm_Wx , V(XOP_M9,01,5,0,x,_,_,_ ), 0 , 15 , 0 , 15 , 12 ), // #35 + INST(Blcmsk , VexVm_Wx , V(XOP_M9,02,1,0,x,_,_,_ ), 0 , 13 , 0 , 15 , 12 ), // #36 + INST(Blcs , VexVm_Wx , V(XOP_M9,01,3,0,x,_,_,_ ), 0 , 16 , 0 , 15 , 12 ), // #37 + INST(Blendpd , ExtRmi , O(660F3A,0D,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #38 + INST(Blendps , ExtRmi , O(660F3A,0C,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #39 + INST(Blendvpd , ExtRm_XMM0 , O(660F38,15,_,_,_,_,_,_ ), 0 , 2 , 0 , 16 , 13 ), // #40 + INST(Blendvps , ExtRm_XMM0 , O(660F38,14,_,_,_,_,_,_ ), 0 , 2 , 0 , 16 , 13 ), // #41 + INST(Blsfill , VexVm_Wx , V(XOP_M9,01,2,0,x,_,_,_ ), 0 , 17 , 0 , 15 , 12 ), // #42 + INST(Blsi , VexVm_Wx , V(000F38,F3,3,0,x,_,_,_ ), 0 , 18 , 0 , 15 , 10 ), // #43 + INST(Blsic , VexVm_Wx , V(XOP_M9,01,6,0,x,_,_,_ ), 0 , 14 , 0 , 15 , 12 ), // #44 + INST(Blsmsk , VexVm_Wx , V(000F38,F3,2,0,x,_,_,_ ), 0 , 19 , 0 , 15 , 10 ), // #45 + INST(Blsr , VexVm_Wx , V(000F38,F3,1,0,x,_,_,_ ), 0 , 20 , 0 , 15 , 10 ), // #46 + INST(Bndcl , X86Rm , O(F30F00,1A,_,_,_,_,_,_ ), 0 , 7 , 0 , 17 , 14 ), // #47 + INST(Bndcn , X86Rm , O(F20F00,1B,_,_,_,_,_,_ ), 0 , 6 , 0 , 17 , 14 ), // #48 + INST(Bndcu , X86Rm , O(F20F00,1A,_,_,_,_,_,_ ), 0 , 6 , 0 , 17 , 14 ), // #49 + INST(Bndldx , X86Rm , O(000F00,1A,_,_,_,_,_,_ ), 0 , 5 , 0 , 18 , 14 ), // #50 + INST(Bndmk , X86Rm , O(F30F00,1B,_,_,_,_,_,_ ), 0 , 7 , 0 , 19 , 14 ), // #51 + INST(Bndmov , X86Bndmov , O(660F00,1A,_,_,_,_,_,_ ), O(660F00,1B,_,_,_,_,_,_ ), 4 , 1 , 20 , 14 ), // #52 + INST(Bndstx , X86Mr , O(000F00,1B,_,_,_,_,_,_ ), 0 , 5 , 0 , 21 , 14 ), // #53 + INST(Bound , X86Rm , O(000000,62,_,_,_,_,_,_ ), 0 , 0 , 0 , 22 , 0 ), // #54 + INST(Bsf , X86Rm , O(000F00,BC,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 1 ), // #55 + INST(Bsr , X86Rm , O(000F00,BD,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 1 ), // #56 + INST(Bswap , X86Bswap , O(000F00,C8,_,_,x,_,_,_ ), 0 , 5 , 0 , 24 , 0 ), // #57 + INST(Bt , X86Bt , O(000F00,A3,_,_,x,_,_,_ ), O(000F00,BA,4,_,x,_,_,_ ), 5 , 2 , 25 , 15 ), // #58 + INST(Btc , X86Bt , O(000F00,BB,_,_,x,_,_,_ ), O(000F00,BA,7,_,x,_,_,_ ), 5 , 3 , 26 , 15 ), // #59 + INST(Btr , X86Bt , O(000F00,B3,_,_,x,_,_,_ ), O(000F00,BA,6,_,x,_,_,_ ), 5 , 4 , 26 , 15 ), // #60 + INST(Bts , X86Bt , O(000F00,AB,_,_,x,_,_,_ ), O(000F00,BA,5,_,x,_,_,_ ), 5 , 5 , 26 , 15 ), // #61 + INST(Bzhi , VexRmv_Wx , V(000F38,F5,_,0,x,_,_,_ ), 0 , 11 , 0 , 14 , 16 ), // #62 + INST(Call , X86Call , O(000000,FF,2,_,_,_,_,_ ), 0 , 3 , 0 , 27 , 1 ), // #63 + INST(Cbw , X86Op_xAX , O(660000,98,_,_,_,_,_,_ ), 0 , 21 , 0 , 28 , 0 ), // #64 + INST(Cdq , X86Op_xDX_xAX , O(000000,99,_,_,_,_,_,_ ), 0 , 0 , 0 , 29 , 0 ), // #65 + INST(Cdqe , X86Op_xAX , O(000000,98,_,_,1,_,_,_ ), 0 , 22 , 0 , 30 , 0 ), // #66 + INST(Clac , X86Op , O(000F01,CA,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 17 ), // #67 + INST(Clc , X86Op , O(000000,F8,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 18 ), // #68 + INST(Cld , X86Op , O(000000,FC,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 19 ), // #69 + INST(Cldemote , X86M_Only , O(000F00,1C,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 20 ), // #70 + INST(Clflush , X86M_Only , O(000F00,AE,7,_,_,_,_,_ ), 0 , 24 , 0 , 32 , 21 ), // #71 + INST(Clflushopt , X86M_Only , O(660F00,AE,7,_,_,_,_,_ ), 0 , 25 , 0 , 32 , 22 ), // #72 + INST(Clgi , X86Op , O(000F01,DD,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 23 ), // #73 + INST(Cli , X86Op , O(000000,FA,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 24 ), // #74 + INST(Clrssbsy , X86M_Only , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 33 , 25 ), // #75 + INST(Clts , X86Op , O(000F00,06,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #76 + INST(Clui , X86Op , O(F30F01,EE,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 26 ), // #77 + INST(Clwb , X86M_Only , O(660F00,AE,6,_,_,_,_,_ ), 0 , 28 , 0 , 32 , 27 ), // #78 + INST(Clzero , X86Op_MemZAX , O(000F01,FC,_,_,_,_,_,_ ), 0 , 23 , 0 , 35 , 28 ), // #79 + INST(Cmc , X86Op , O(000000,F5,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 29 ), // #80 + INST(Cmova , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #81 + INST(Cmovae , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #82 + INST(Cmovb , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #83 + INST(Cmovbe , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #84 + INST(Cmovc , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #85 + INST(Cmove , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #86 + INST(Cmovg , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #87 + INST(Cmovge , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #88 + INST(Cmovl , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #89 + INST(Cmovle , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #90 + INST(Cmovna , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #91 + INST(Cmovnae , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #92 + INST(Cmovnb , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #93 + INST(Cmovnbe , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #94 + INST(Cmovnc , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #95 + INST(Cmovne , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #96 + INST(Cmovng , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #97 + INST(Cmovnge , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #98 + INST(Cmovnl , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #99 + INST(Cmovnle , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #100 + INST(Cmovno , X86Rm , O(000F00,41,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 35 ), // #101 + INST(Cmovnp , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #102 + INST(Cmovns , X86Rm , O(000F00,49,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 37 ), // #103 + INST(Cmovnz , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #104 + INST(Cmovo , X86Rm , O(000F00,40,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 35 ), // #105 + INST(Cmovp , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #106 + INST(Cmovpe , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #107 + INST(Cmovpo , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #108 + INST(Cmovs , X86Rm , O(000F00,48,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 37 ), // #109 + INST(Cmovz , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #110 + INST(Cmp , X86Arith , O(000000,38,7,_,x,_,_,_ ), 0 , 29 , 0 , 36 , 1 ), // #111 + INST(Cmpbexadd , VexMvr_Wx , V(660F38,E6,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #112 + INST(Cmpbxadd , VexMvr_Wx , V(660F38,E2,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #113 + INST(Cmplexadd , VexMvr_Wx , V(660F38,EE,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #114 + INST(Cmplxadd , VexMvr_Wx , V(660F38,EC,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #115 + INST(Cmpnbexadd , VexMvr_Wx , V(660F38,E7,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #116 + INST(Cmpnbxadd , VexMvr_Wx , V(660F38,E3,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #117 + INST(Cmpnlexadd , VexMvr_Wx , V(660F38,EF,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #118 + INST(Cmpnlxadd , VexMvr_Wx , V(660F38,ED,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #119 + INST(Cmpnoxadd , VexMvr_Wx , V(660F38,E1,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #120 + INST(Cmpnpxadd , VexMvr_Wx , V(660F38,EB,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #121 + INST(Cmpnsxadd , VexMvr_Wx , V(660F38,E9,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #122 + INST(Cmpnzxadd , VexMvr_Wx , V(660F38,E5,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #123 + INST(Cmpoxadd , VexMvr_Wx , V(660F38,E0,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #124 + INST(Cmppd , ExtRmi , O(660F00,C2,_,_,_,_,_,_ ), 0 , 4 , 0 , 9 , 5 ), // #125 + INST(Cmpps , ExtRmi , O(000F00,C2,_,_,_,_,_,_ ), 0 , 5 , 0 , 9 , 6 ), // #126 + INST(Cmppxadd , VexMvr_Wx , V(660F38,EA,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #127 + INST(Cmps , X86StrMm , O(000000,A6,_,_,_,_,_,_ ), 0 , 0 , 0 , 38 , 39 ), // #128 + INST(Cmpsd , ExtRmi , O(F20F00,C2,_,_,_,_,_,_ ), 0 , 6 , 0 , 39 , 5 ), // #129 + INST(Cmpss , ExtRmi , O(F30F00,C2,_,_,_,_,_,_ ), 0 , 7 , 0 , 40 , 6 ), // #130 + INST(Cmpsxadd , VexMvr_Wx , V(660F38,E8,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #131 + INST(Cmpxchg , X86Cmpxchg , O(000F00,B0,_,_,x,_,_,_ ), 0 , 5 , 0 , 41 , 40 ), // #132 + INST(Cmpxchg16b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,1,_,_,_ ), 0 , 31 , 0 , 42 , 41 ), // #133 + INST(Cmpxchg8b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,_,_,_,_ ), 0 , 32 , 0 , 43 , 42 ), // #134 + INST(Cmpzxadd , VexMvr_Wx , V(660F38,E4,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #135 + INST(Comisd , ExtRm , O(660F00,2F,_,_,_,_,_,_ ), 0 , 4 , 0 , 7 , 43 ), // #136 + INST(Comiss , ExtRm , O(000F00,2F,_,_,_,_,_,_ ), 0 , 5 , 0 , 8 , 44 ), // #137 + INST(Cpuid , X86Op , O(000F00,A2,_,_,_,_,_,_ ), 0 , 5 , 0 , 44 , 45 ), // #138 + INST(Cqo , X86Op_xDX_xAX , O(000000,99,_,_,1,_,_,_ ), 0 , 22 , 0 , 45 , 0 ), // #139 + INST(Crc32 , X86Crc , O(F20F38,F0,_,_,x,_,_,_ ), 0 , 12 , 0 , 46 , 46 ), // #140 + INST(Cvtdq2pd , ExtRm , O(F30F00,E6,_,_,_,_,_,_ ), 0 , 7 , 0 , 7 , 5 ), // #141 + INST(Cvtdq2ps , ExtRm , O(000F00,5B,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 5 ), // #142 + INST(Cvtpd2dq , ExtRm , O(F20F00,E6,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 5 ), // #143 + INST(Cvtpd2pi , ExtRm , O(660F00,2D,_,_,_,_,_,_ ), 0 , 4 , 0 , 47 , 5 ), // #144 + INST(Cvtpd2ps , ExtRm , O(660F00,5A,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #145 + INST(Cvtpi2pd , ExtRm , O(660F00,2A,_,_,_,_,_,_ ), 0 , 4 , 0 , 48 , 5 ), // #146 + INST(Cvtpi2ps , ExtRm , O(000F00,2A,_,_,_,_,_,_ ), 0 , 5 , 0 , 48 , 6 ), // #147 + INST(Cvtps2dq , ExtRm , O(660F00,5B,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #148 + INST(Cvtps2pd , ExtRm , O(000F00,5A,_,_,_,_,_,_ ), 0 , 5 , 0 , 7 , 5 ), // #149 + INST(Cvtps2pi , ExtRm , O(000F00,2D,_,_,_,_,_,_ ), 0 , 5 , 0 , 49 , 6 ), // #150 + INST(Cvtsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2D,_,_,x,_,_,_ ), 0 , 6 , 0 , 50 , 5 ), // #151 + INST(Cvtsd2ss , ExtRm , O(F20F00,5A,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #152 + INST(Cvtsi2sd , ExtRm_Wx , O(F20F00,2A,_,_,x,_,_,_ ), 0 , 6 , 0 , 51 , 5 ), // #153 + INST(Cvtsi2ss , ExtRm_Wx , O(F30F00,2A,_,_,x,_,_,_ ), 0 , 7 , 0 , 52 , 6 ), // #154 + INST(Cvtss2sd , ExtRm , O(F30F00,5A,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 5 ), // #155 + INST(Cvtss2si , ExtRm_Wx_GpqOnly , O(F30F00,2D,_,_,x,_,_,_ ), 0 , 7 , 0 , 53 , 6 ), // #156 + INST(Cvttpd2dq , ExtRm , O(660F00,E6,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #157 + INST(Cvttpd2pi , ExtRm , O(660F00,2C,_,_,_,_,_,_ ), 0 , 4 , 0 , 47 , 5 ), // #158 + INST(Cvttps2dq , ExtRm , O(F30F00,5B,_,_,_,_,_,_ ), 0 , 7 , 0 , 6 , 5 ), // #159 + INST(Cvttps2pi , ExtRm , O(000F00,2C,_,_,_,_,_,_ ), 0 , 5 , 0 , 49 , 6 ), // #160 + INST(Cvttsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2C,_,_,x,_,_,_ ), 0 , 6 , 0 , 50 , 5 ), // #161 + INST(Cvttss2si , ExtRm_Wx_GpqOnly , O(F30F00,2C,_,_,x,_,_,_ ), 0 , 7 , 0 , 54 , 6 ), // #162 + INST(Cwd , X86Op_xDX_xAX , O(660000,99,_,_,_,_,_,_ ), 0 , 21 , 0 , 55 , 0 ), // #163 + INST(Cwde , X86Op_xAX , O(000000,98,_,_,_,_,_,_ ), 0 , 0 , 0 , 56 , 0 ), // #164 + INST(Daa , X86Op , O(000000,27,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #165 + INST(Das , X86Op , O(000000,2F,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #166 + INST(Dec , X86IncDec , O(000000,FE,1,_,x,_,_,_ ), O(000000,48,_,_,x,_,_,_ ), 33 , 6 , 57 , 47 ), // #167 + INST(Div , X86M_GPB_MulDiv , O(000000,F6,6,_,x,_,_,_ ), 0 , 34 , 0 , 58 , 1 ), // #168 + INST(Divpd , ExtRm , O(660F00,5E,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #169 + INST(Divps , ExtRm , O(000F00,5E,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #170 + INST(Divsd , ExtRm , O(F20F00,5E,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #171 + INST(Divss , ExtRm , O(F30F00,5E,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #172 + INST(Dppd , ExtRmi , O(660F3A,41,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #173 + INST(Dpps , ExtRmi , O(660F3A,40,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #174 + INST(Emms , X86Op , O(000F00,77,_,_,_,_,_,_ ), 0 , 5 , 0 , 59 , 48 ), // #175 + INST(Endbr32 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,3 ), 0 , 35 , 0 , 31 , 49 ), // #176 + INST(Endbr64 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,2 ), 0 , 36 , 0 , 31 , 49 ), // #177 + INST(Enqcmd , X86EnqcmdMovdir64b , O(F20F38,F8,_,_,_,_,_,_ ), 0 , 12 , 0 , 60 , 50 ), // #178 + INST(Enqcmds , X86EnqcmdMovdir64b , O(F30F38,F8,_,_,_,_,_,_ ), 0 , 8 , 0 , 60 , 50 ), // #179 + INST(Enter , X86Enter , O(000000,C8,_,_,_,_,_,_ ), 0 , 0 , 0 , 61 , 0 ), // #180 + INST(Extractps , ExtExtract , O(660F3A,17,_,_,_,_,_,_ ), 0 , 9 , 0 , 62 , 13 ), // #181 + INST(Extrq , ExtExtrq , O(660F00,79,_,_,_,_,_,_ ), O(660F00,78,0,_,_,_,_,_ ), 4 , 7 , 63 , 51 ), // #182 + INST(F2xm1 , FpuOp , O_FPU(00,D9F0,_) , 0 , 37 , 0 , 31 , 52 ), // #183 + INST(Fabs , FpuOp , O_FPU(00,D9E1,_) , 0 , 37 , 0 , 31 , 52 ), // #184 + INST(Fadd , FpuArith , O_FPU(00,C0C0,0) , 0 , 38 , 0 , 64 , 52 ), // #185 + INST(Faddp , FpuRDef , O_FPU(00,DEC0,_) , 0 , 39 , 0 , 65 , 52 ), // #186 + INST(Fbld , X86M_Only , O_FPU(00,00DF,4) , 0 , 40 , 0 , 66 , 52 ), // #187 + INST(Fbstp , X86M_Only , O_FPU(00,00DF,6) , 0 , 41 , 0 , 66 , 52 ), // #188 + INST(Fchs , FpuOp , O_FPU(00,D9E0,_) , 0 , 37 , 0 , 31 , 52 ), // #189 + INST(Fclex , FpuOp , O_FPU(9B,DBE2,_) , 0 , 42 , 0 , 31 , 52 ), // #190 + INST(Fcmovb , FpuR , O_FPU(00,DAC0,_) , 0 , 43 , 0 , 67 , 53 ), // #191 + INST(Fcmovbe , FpuR , O_FPU(00,DAD0,_) , 0 , 43 , 0 , 67 , 54 ), // #192 + INST(Fcmove , FpuR , O_FPU(00,DAC8,_) , 0 , 43 , 0 , 67 , 55 ), // #193 + INST(Fcmovnb , FpuR , O_FPU(00,DBC0,_) , 0 , 44 , 0 , 67 , 53 ), // #194 + INST(Fcmovnbe , FpuR , O_FPU(00,DBD0,_) , 0 , 44 , 0 , 67 , 54 ), // #195 + INST(Fcmovne , FpuR , O_FPU(00,DBC8,_) , 0 , 44 , 0 , 67 , 55 ), // #196 + INST(Fcmovnu , FpuR , O_FPU(00,DBD8,_) , 0 , 44 , 0 , 67 , 56 ), // #197 + INST(Fcmovu , FpuR , O_FPU(00,DAD8,_) , 0 , 43 , 0 , 67 , 56 ), // #198 + INST(Fcom , FpuCom , O_FPU(00,D0D0,2) , 0 , 45 , 0 , 68 , 52 ), // #199 + INST(Fcomi , FpuR , O_FPU(00,DBF0,_) , 0 , 44 , 0 , 67 , 57 ), // #200 + INST(Fcomip , FpuR , O_FPU(00,DFF0,_) , 0 , 46 , 0 , 67 , 57 ), // #201 + INST(Fcomp , FpuCom , O_FPU(00,D8D8,3) , 0 , 47 , 0 , 68 , 52 ), // #202 + INST(Fcompp , FpuOp , O_FPU(00,DED9,_) , 0 , 39 , 0 , 31 , 52 ), // #203 + INST(Fcos , FpuOp , O_FPU(00,D9FF,_) , 0 , 37 , 0 , 31 , 52 ), // #204 + INST(Fdecstp , FpuOp , O_FPU(00,D9F6,_) , 0 , 37 , 0 , 31 , 52 ), // #205 + INST(Fdiv , FpuArith , O_FPU(00,F0F8,6) , 0 , 48 , 0 , 64 , 52 ), // #206 + INST(Fdivp , FpuRDef , O_FPU(00,DEF8,_) , 0 , 39 , 0 , 65 , 52 ), // #207 + INST(Fdivr , FpuArith , O_FPU(00,F8F0,7) , 0 , 49 , 0 , 64 , 52 ), // #208 + INST(Fdivrp , FpuRDef , O_FPU(00,DEF0,_) , 0 , 39 , 0 , 65 , 52 ), // #209 + INST(Femms , X86Op , O(000F00,0E,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 58 ), // #210 + INST(Ffree , FpuR , O_FPU(00,DDC0,_) , 0 , 50 , 0 , 67 , 52 ), // #211 + INST(Fiadd , FpuM , O_FPU(00,00DA,0) , 0 , 51 , 0 , 69 , 52 ), // #212 + INST(Ficom , FpuM , O_FPU(00,00DA,2) , 0 , 52 , 0 , 69 , 52 ), // #213 + INST(Ficomp , FpuM , O_FPU(00,00DA,3) , 0 , 53 , 0 , 69 , 52 ), // #214 + INST(Fidiv , FpuM , O_FPU(00,00DA,6) , 0 , 41 , 0 , 69 , 52 ), // #215 + INST(Fidivr , FpuM , O_FPU(00,00DA,7) , 0 , 54 , 0 , 69 , 52 ), // #216 + INST(Fild , FpuM , O_FPU(00,00DB,0) , O_FPU(00,00DF,5) , 51 , 8 , 70 , 52 ), // #217 + INST(Fimul , FpuM , O_FPU(00,00DA,1) , 0 , 55 , 0 , 69 , 52 ), // #218 + INST(Fincstp , FpuOp , O_FPU(00,D9F7,_) , 0 , 37 , 0 , 31 , 52 ), // #219 + INST(Finit , FpuOp , O_FPU(9B,DBE3,_) , 0 , 42 , 0 , 31 , 52 ), // #220 + INST(Fist , FpuM , O_FPU(00,00DB,2) , 0 , 52 , 0 , 69 , 52 ), // #221 + INST(Fistp , FpuM , O_FPU(00,00DB,3) , O_FPU(00,00DF,7) , 53 , 9 , 70 , 52 ), // #222 + INST(Fisttp , FpuM , O_FPU(00,00DB,1) , O_FPU(00,00DD,1) , 55 , 10 , 70 , 59 ), // #223 + INST(Fisub , FpuM , O_FPU(00,00DA,4) , 0 , 40 , 0 , 69 , 52 ), // #224 + INST(Fisubr , FpuM , O_FPU(00,00DA,5) , 0 , 56 , 0 , 69 , 52 ), // #225 + INST(Fld , FpuFldFst , O_FPU(00,00D9,0) , O_FPU(00,00DB,5) , 51 , 11 , 71 , 52 ), // #226 + INST(Fld1 , FpuOp , O_FPU(00,D9E8,_) , 0 , 37 , 0 , 31 , 52 ), // #227 + INST(Fldcw , X86M_Only , O_FPU(00,00D9,5) , 0 , 56 , 0 , 72 , 52 ), // #228 + INST(Fldenv , X86M_Only , O_FPU(00,00D9,4) , 0 , 40 , 0 , 32 , 52 ), // #229 + INST(Fldl2e , FpuOp , O_FPU(00,D9EA,_) , 0 , 37 , 0 , 31 , 52 ), // #230 + INST(Fldl2t , FpuOp , O_FPU(00,D9E9,_) , 0 , 37 , 0 , 31 , 52 ), // #231 + INST(Fldlg2 , FpuOp , O_FPU(00,D9EC,_) , 0 , 37 , 0 , 31 , 52 ), // #232 + INST(Fldln2 , FpuOp , O_FPU(00,D9ED,_) , 0 , 37 , 0 , 31 , 52 ), // #233 + INST(Fldpi , FpuOp , O_FPU(00,D9EB,_) , 0 , 37 , 0 , 31 , 52 ), // #234 + INST(Fldz , FpuOp , O_FPU(00,D9EE,_) , 0 , 37 , 0 , 31 , 52 ), // #235 + INST(Fmul , FpuArith , O_FPU(00,C8C8,1) , 0 , 57 , 0 , 64 , 52 ), // #236 + INST(Fmulp , FpuRDef , O_FPU(00,DEC8,_) , 0 , 39 , 0 , 65 , 52 ), // #237 + INST(Fnclex , FpuOp , O_FPU(00,DBE2,_) , 0 , 44 , 0 , 31 , 52 ), // #238 + INST(Fninit , FpuOp , O_FPU(00,DBE3,_) , 0 , 44 , 0 , 31 , 52 ), // #239 + INST(Fnop , FpuOp , O_FPU(00,D9D0,_) , 0 , 37 , 0 , 31 , 52 ), // #240 + INST(Fnsave , X86M_Only , O_FPU(00,00DD,6) , 0 , 41 , 0 , 32 , 52 ), // #241 + INST(Fnstcw , X86M_Only , O_FPU(00,00D9,7) , 0 , 54 , 0 , 72 , 52 ), // #242 + INST(Fnstenv , X86M_Only , O_FPU(00,00D9,6) , 0 , 41 , 0 , 32 , 52 ), // #243 + INST(Fnstsw , FpuStsw , O_FPU(00,00DD,7) , O_FPU(00,DFE0,_) , 54 , 12 , 73 , 52 ), // #244 + INST(Fpatan , FpuOp , O_FPU(00,D9F3,_) , 0 , 37 , 0 , 31 , 52 ), // #245 + INST(Fprem , FpuOp , O_FPU(00,D9F8,_) , 0 , 37 , 0 , 31 , 52 ), // #246 + INST(Fprem1 , FpuOp , O_FPU(00,D9F5,_) , 0 , 37 , 0 , 31 , 52 ), // #247 + INST(Fptan , FpuOp , O_FPU(00,D9F2,_) , 0 , 37 , 0 , 31 , 52 ), // #248 + INST(Frndint , FpuOp , O_FPU(00,D9FC,_) , 0 , 37 , 0 , 31 , 52 ), // #249 + INST(Frstor , X86M_Only , O_FPU(00,00DD,4) , 0 , 40 , 0 , 32 , 52 ), // #250 + INST(Fsave , X86M_Only , O_FPU(9B,00DD,6) , 0 , 58 , 0 , 32 , 52 ), // #251 + INST(Fscale , FpuOp , O_FPU(00,D9FD,_) , 0 , 37 , 0 , 31 , 52 ), // #252 + INST(Fsin , FpuOp , O_FPU(00,D9FE,_) , 0 , 37 , 0 , 31 , 52 ), // #253 + INST(Fsincos , FpuOp , O_FPU(00,D9FB,_) , 0 , 37 , 0 , 31 , 52 ), // #254 + INST(Fsqrt , FpuOp , O_FPU(00,D9FA,_) , 0 , 37 , 0 , 31 , 52 ), // #255 + INST(Fst , FpuFldFst , O_FPU(00,00D9,2) , 0 , 52 , 0 , 74 , 52 ), // #256 + INST(Fstcw , X86M_Only , O_FPU(9B,00D9,7) , 0 , 59 , 0 , 72 , 52 ), // #257 + INST(Fstenv , X86M_Only , O_FPU(9B,00D9,6) , 0 , 58 , 0 , 32 , 52 ), // #258 + INST(Fstp , FpuFldFst , O_FPU(00,00D9,3) , O(000000,DB,7,_,_,_,_,_ ), 53 , 13 , 71 , 52 ), // #259 + INST(Fstsw , FpuStsw , O_FPU(9B,00DD,7) , O_FPU(9B,DFE0,_) , 59 , 14 , 73 , 52 ), // #260 + INST(Fsub , FpuArith , O_FPU(00,E0E8,4) , 0 , 60 , 0 , 64 , 52 ), // #261 + INST(Fsubp , FpuRDef , O_FPU(00,DEE8,_) , 0 , 39 , 0 , 65 , 52 ), // #262 + INST(Fsubr , FpuArith , O_FPU(00,E8E0,5) , 0 , 61 , 0 , 64 , 52 ), // #263 + INST(Fsubrp , FpuRDef , O_FPU(00,DEE0,_) , 0 , 39 , 0 , 65 , 52 ), // #264 + INST(Ftst , FpuOp , O_FPU(00,D9E4,_) , 0 , 37 , 0 , 31 , 52 ), // #265 + INST(Fucom , FpuRDef , O_FPU(00,DDE0,_) , 0 , 50 , 0 , 65 , 52 ), // #266 + INST(Fucomi , FpuR , O_FPU(00,DBE8,_) , 0 , 44 , 0 , 67 , 57 ), // #267 + INST(Fucomip , FpuR , O_FPU(00,DFE8,_) , 0 , 46 , 0 , 67 , 57 ), // #268 + INST(Fucomp , FpuRDef , O_FPU(00,DDE8,_) , 0 , 50 , 0 , 65 , 52 ), // #269 + INST(Fucompp , FpuOp , O_FPU(00,DAE9,_) , 0 , 43 , 0 , 31 , 52 ), // #270 + INST(Fwait , X86Op , O_FPU(00,009B,_) , 0 , 51 , 0 , 31 , 52 ), // #271 + INST(Fxam , FpuOp , O_FPU(00,D9E5,_) , 0 , 37 , 0 , 31 , 52 ), // #272 + INST(Fxch , FpuR , O_FPU(00,D9C8,_) , 0 , 37 , 0 , 65 , 52 ), // #273 + INST(Fxrstor , X86M_Only , O(000F00,AE,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 60 ), // #274 + INST(Fxrstor64 , X86M_Only , O(000F00,AE,1,_,1,_,_,_ ), 0 , 31 , 0 , 75 , 60 ), // #275 + INST(Fxsave , X86M_Only , O(000F00,AE,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 61 ), // #276 + INST(Fxsave64 , X86M_Only , O(000F00,AE,0,_,1,_,_,_ ), 0 , 62 , 0 , 75 , 61 ), // #277 + INST(Fxtract , FpuOp , O_FPU(00,D9F4,_) , 0 , 37 , 0 , 31 , 52 ), // #278 + INST(Fyl2x , FpuOp , O_FPU(00,D9F1,_) , 0 , 37 , 0 , 31 , 52 ), // #279 + INST(Fyl2xp1 , FpuOp , O_FPU(00,D9F9,_) , 0 , 37 , 0 , 31 , 52 ), // #280 + INST(Getsec , X86Op , O(000F00,37,_,_,_,_,_,_ ), 0 , 5 , 0 , 56 , 62 ), // #281 + INST(Gf2p8affineinvqb , ExtRmi , O(660F3A,CF,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 63 ), // #282 + INST(Gf2p8affineqb , ExtRmi , O(660F3A,CE,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 63 ), // #283 + INST(Gf2p8mulb , ExtRm , O(660F38,CF,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 63 ), // #284 + INST(Haddpd , ExtRm , O(660F00,7C,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 7 ), // #285 + INST(Haddps , ExtRm , O(F20F00,7C,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 7 ), // #286 + INST(Hlt , X86Op , O(000000,F4,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #287 + INST(Hreset , X86Op_Mod11RM_I8 , O(F30F3A,F0,0,_,_,_,_,_ ), 0 , 63 , 0 , 76 , 64 ), // #288 + INST(Hsubpd , ExtRm , O(660F00,7D,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 7 ), // #289 + INST(Hsubps , ExtRm , O(F20F00,7D,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 7 ), // #290 + INST(Idiv , X86M_GPB_MulDiv , O(000000,F6,7,_,x,_,_,_ ), 0 , 29 , 0 , 58 , 1 ), // #291 + INST(Imul , X86Imul , O(000000,F6,5,_,x,_,_,_ ), 0 , 64 , 0 , 77 , 1 ), // #292 + INST(In , X86In , O(000000,EC,_,_,_,_,_,_ ), O(000000,E4,_,_,_,_,_,_ ), 0 , 15 , 78 , 0 ), // #293 + INST(Inc , X86IncDec , O(000000,FE,0,_,x,_,_,_ ), O(000000,40,_,_,x,_,_,_ ), 0 , 16 , 79 , 47 ), // #294 + INST(Incsspd , X86M , O(F30F00,AE,5,_,0,_,_,_ ), 0 , 65 , 0 , 80 , 65 ), // #295 + INST(Incsspq , X86M , O(F30F00,AE,5,_,1,_,_,_ ), 0 , 66 , 0 , 81 , 65 ), // #296 + INST(Ins , X86Ins , O(000000,6C,_,_,_,_,_,_ ), 0 , 0 , 0 , 82 , 0 ), // #297 + INST(Insertps , ExtRmi , O(660F3A,21,_,_,_,_,_,_ ), 0 , 9 , 0 , 40 , 13 ), // #298 + INST(Insertq , ExtInsertq , O(F20F00,79,_,_,_,_,_,_ ), O(F20F00,78,_,_,_,_,_,_ ), 6 , 17 , 83 , 51 ), // #299 + INST(Int , X86Int , O(000000,CD,_,_,_,_,_,_ ), 0 , 0 , 0 , 84 , 0 ), // #300 + INST(Int3 , X86Op , O(000000,CC,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #301 + INST(Into , X86Op , O(000000,CE,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 66 ), // #302 + INST(Invd , X86Op , O(000F00,08,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 45 ), // #303 + INST(Invept , X86Rm_NoSize , O(660F38,80,_,_,_,_,_,_ ), 0 , 2 , 0 , 86 , 67 ), // #304 + INST(Invlpg , X86M_Only , O(000F00,01,7,_,_,_,_,_ ), 0 , 24 , 0 , 32 , 45 ), // #305 + INST(Invlpga , X86Op_xAddr , O(000F01,DF,_,_,_,_,_,_ ), 0 , 23 , 0 , 87 , 23 ), // #306 + INST(Invlpgb , X86Op , O(000F01,FE,_,_,_,_,_,_ ), 0 , 23 , 0 , 88 , 68 ), // #307 + INST(Invpcid , X86Rm_NoSize , O(660F38,82,_,_,_,_,_,_ ), 0 , 2 , 0 , 86 , 45 ), // #308 + INST(Invvpid , X86Rm_NoSize , O(660F38,81,_,_,_,_,_,_ ), 0 , 2 , 0 , 86 , 67 ), // #309 + INST(Iret , X86Op , O(660000,CF,_,_,_,_,_,_ ), 0 , 21 , 0 , 89 , 1 ), // #310 + INST(Iretd , X86Op , O(000000,CF,_,_,_,_,_,_ ), 0 , 0 , 0 , 89 , 1 ), // #311 + INST(Iretq , X86Op , O(000000,CF,_,_,1,_,_,_ ), 0 , 22 , 0 , 90 , 1 ), // #312 + INST(Ja , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 5 , 18 , 91 , 69 ), // #313 + INST(Jae , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 5 , 19 , 91 , 70 ), // #314 + INST(Jb , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 5 , 20 , 91 , 70 ), // #315 + INST(Jbe , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 5 , 21 , 91 , 69 ), // #316 + INST(Jc , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 5 , 20 , 91 , 70 ), // #317 + INST(Je , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 5 , 22 , 91 , 71 ), // #318 + INST(Jecxz , X86JecxzLoop , 0 , O(000000,E3,_,_,_,_,_,_ ), 0 , 23 , 92 , 0 ), // #319 + INST(Jg , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 5 , 24 , 91 , 72 ), // #320 + INST(Jge , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 5 , 25 , 91 , 73 ), // #321 + INST(Jl , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 5 , 26 , 91 , 73 ), // #322 + INST(Jle , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 5 , 27 , 91 , 72 ), // #323 + INST(Jmp , X86Jmp , O(000000,FF,4,_,_,_,_,_ ), O(000000,EB,_,_,_,_,_,_ ), 10 , 28 , 93 , 0 ), // #324 + INST(Jna , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 5 , 21 , 91 , 69 ), // #325 + INST(Jnae , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 5 , 20 , 91 , 70 ), // #326 + INST(Jnb , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 5 , 19 , 91 , 70 ), // #327 + INST(Jnbe , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 5 , 18 , 91 , 69 ), // #328 + INST(Jnc , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 5 , 19 , 91 , 70 ), // #329 + INST(Jne , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 5 , 29 , 91 , 71 ), // #330 + INST(Jng , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 5 , 27 , 91 , 72 ), // #331 + INST(Jnge , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 5 , 26 , 91 , 73 ), // #332 + INST(Jnl , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 5 , 25 , 91 , 73 ), // #333 + INST(Jnle , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 5 , 24 , 91 , 72 ), // #334 + INST(Jno , X86Jcc , O(000F00,81,_,_,_,_,_,_ ), O(000000,71,_,_,_,_,_,_ ), 5 , 30 , 91 , 66 ), // #335 + INST(Jnp , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 5 , 31 , 91 , 74 ), // #336 + INST(Jns , X86Jcc , O(000F00,89,_,_,_,_,_,_ ), O(000000,79,_,_,_,_,_,_ ), 5 , 32 , 91 , 75 ), // #337 + INST(Jnz , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 5 , 29 , 91 , 71 ), // #338 + INST(Jo , X86Jcc , O(000F00,80,_,_,_,_,_,_ ), O(000000,70,_,_,_,_,_,_ ), 5 , 33 , 91 , 66 ), // #339 + INST(Jp , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 5 , 34 , 91 , 74 ), // #340 + INST(Jpe , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 5 , 34 , 91 , 74 ), // #341 + INST(Jpo , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 5 , 31 , 91 , 74 ), // #342 + INST(Js , X86Jcc , O(000F00,88,_,_,_,_,_,_ ), O(000000,78,_,_,_,_,_,_ ), 5 , 35 , 91 , 75 ), // #343 + INST(Jz , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 5 , 22 , 91 , 71 ), // #344 + INST(Kaddb , VexRvm , V(660F00,4A,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 76 ), // #345 + INST(Kaddd , VexRvm , V(660F00,4A,_,1,1,_,_,_ ), 0 , 68 , 0 , 94 , 77 ), // #346 + INST(Kaddq , VexRvm , V(000F00,4A,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #347 + INST(Kaddw , VexRvm , V(000F00,4A,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 76 ), // #348 + INST(Kandb , VexRvm , V(660F00,41,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 76 ), // #349 + INST(Kandd , VexRvm , V(660F00,41,_,1,1,_,_,_ ), 0 , 68 , 0 , 94 , 77 ), // #350 + INST(Kandnb , VexRvm , V(660F00,42,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 76 ), // #351 + INST(Kandnd , VexRvm , V(660F00,42,_,1,1,_,_,_ ), 0 , 68 , 0 , 94 , 77 ), // #352 + INST(Kandnq , VexRvm , V(000F00,42,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #353 + INST(Kandnw , VexRvm , V(000F00,42,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 78 ), // #354 + INST(Kandq , VexRvm , V(000F00,41,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #355 + INST(Kandw , VexRvm , V(000F00,41,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 78 ), // #356 + INST(Kmovb , VexKmov , V(660F00,90,_,0,0,_,_,_ ), V(660F00,92,_,0,0,_,_,_ ), 71 , 36 , 95 , 79 ), // #357 + INST(Kmovd , VexKmov , V(660F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,0,_,_,_ ), 72 , 37 , 96 , 80 ), // #358 + INST(Kmovq , VexKmov , V(000F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,1,_,_,_ ), 73 , 38 , 97 , 80 ), // #359 + INST(Kmovw , VexKmov , V(000F00,90,_,0,0,_,_,_ ), V(000F00,92,_,0,0,_,_,_ ), 74 , 39 , 98 , 81 ), // #360 + INST(Knotb , VexRm , V(660F00,44,_,0,0,_,_,_ ), 0 , 71 , 0 , 99 , 76 ), // #361 + INST(Knotd , VexRm , V(660F00,44,_,0,1,_,_,_ ), 0 , 72 , 0 , 99 , 77 ), // #362 + INST(Knotq , VexRm , V(000F00,44,_,0,1,_,_,_ ), 0 , 73 , 0 , 99 , 77 ), // #363 + INST(Knotw , VexRm , V(000F00,44,_,0,0,_,_,_ ), 0 , 74 , 0 , 99 , 78 ), // #364 + INST(Korb , VexRvm , V(660F00,45,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 76 ), // #365 + INST(Kord , VexRvm , V(660F00,45,_,1,1,_,_,_ ), 0 , 68 , 0 , 94 , 77 ), // #366 + INST(Korq , VexRvm , V(000F00,45,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #367 + INST(Kortestb , VexRm , V(660F00,98,_,0,0,_,_,_ ), 0 , 71 , 0 , 99 , 82 ), // #368 + INST(Kortestd , VexRm , V(660F00,98,_,0,1,_,_,_ ), 0 , 72 , 0 , 99 , 83 ), // #369 + INST(Kortestq , VexRm , V(000F00,98,_,0,1,_,_,_ ), 0 , 73 , 0 , 99 , 83 ), // #370 + INST(Kortestw , VexRm , V(000F00,98,_,0,0,_,_,_ ), 0 , 74 , 0 , 99 , 84 ), // #371 + INST(Korw , VexRvm , V(000F00,45,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 78 ), // #372 + INST(Kshiftlb , VexRmi , V(660F3A,32,_,0,0,_,_,_ ), 0 , 75 , 0 , 100, 76 ), // #373 + INST(Kshiftld , VexRmi , V(660F3A,33,_,0,0,_,_,_ ), 0 , 75 , 0 , 100, 77 ), // #374 + INST(Kshiftlq , VexRmi , V(660F3A,33,_,0,1,_,_,_ ), 0 , 76 , 0 , 100, 77 ), // #375 + INST(Kshiftlw , VexRmi , V(660F3A,32,_,0,1,_,_,_ ), 0 , 76 , 0 , 100, 78 ), // #376 + INST(Kshiftrb , VexRmi , V(660F3A,30,_,0,0,_,_,_ ), 0 , 75 , 0 , 100, 76 ), // #377 + INST(Kshiftrd , VexRmi , V(660F3A,31,_,0,0,_,_,_ ), 0 , 75 , 0 , 100, 77 ), // #378 + INST(Kshiftrq , VexRmi , V(660F3A,31,_,0,1,_,_,_ ), 0 , 76 , 0 , 100, 77 ), // #379 + INST(Kshiftrw , VexRmi , V(660F3A,30,_,0,1,_,_,_ ), 0 , 76 , 0 , 100, 78 ), // #380 + INST(Ktestb , VexRm , V(660F00,99,_,0,0,_,_,_ ), 0 , 71 , 0 , 99 , 82 ), // #381 + INST(Ktestd , VexRm , V(660F00,99,_,0,1,_,_,_ ), 0 , 72 , 0 , 99 , 83 ), // #382 + INST(Ktestq , VexRm , V(000F00,99,_,0,1,_,_,_ ), 0 , 73 , 0 , 99 , 83 ), // #383 + INST(Ktestw , VexRm , V(000F00,99,_,0,0,_,_,_ ), 0 , 74 , 0 , 99 , 82 ), // #384 + INST(Kunpckbw , VexRvm , V(660F00,4B,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 78 ), // #385 + INST(Kunpckdq , VexRvm , V(000F00,4B,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #386 + INST(Kunpckwd , VexRvm , V(000F00,4B,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 77 ), // #387 + INST(Kxnorb , VexRvm , V(660F00,46,_,1,0,_,_,_ ), 0 , 67 , 0 , 101, 76 ), // #388 + INST(Kxnord , VexRvm , V(660F00,46,_,1,1,_,_,_ ), 0 , 68 , 0 , 101, 77 ), // #389 + INST(Kxnorq , VexRvm , V(000F00,46,_,1,1,_,_,_ ), 0 , 69 , 0 , 101, 77 ), // #390 + INST(Kxnorw , VexRvm , V(000F00,46,_,1,0,_,_,_ ), 0 , 70 , 0 , 101, 78 ), // #391 + INST(Kxorb , VexRvm , V(660F00,47,_,1,0,_,_,_ ), 0 , 67 , 0 , 101, 76 ), // #392 + INST(Kxord , VexRvm , V(660F00,47,_,1,1,_,_,_ ), 0 , 68 , 0 , 101, 77 ), // #393 + INST(Kxorq , VexRvm , V(000F00,47,_,1,1,_,_,_ ), 0 , 69 , 0 , 101, 77 ), // #394 + INST(Kxorw , VexRvm , V(000F00,47,_,1,0,_,_,_ ), 0 , 70 , 0 , 101, 78 ), // #395 + INST(Lahf , X86Op , O(000000,9F,_,_,_,_,_,_ ), 0 , 0 , 0 , 102, 85 ), // #396 + INST(Lar , X86Rm , O(000F00,02,_,_,_,_,_,_ ), 0 , 5 , 0 , 103, 11 ), // #397 + INST(Lcall , X86LcallLjmp , O(000000,FF,3,_,_,_,_,_ ), O(000000,9A,_,_,_,_,_,_ ), 77 , 40 , 104, 1 ), // #398 + INST(Lddqu , ExtRm , O(F20F00,F0,_,_,_,_,_,_ ), 0 , 6 , 0 , 105, 7 ), // #399 + INST(Ldmxcsr , X86M_Only , O(000F00,AE,2,_,_,_,_,_ ), 0 , 78 , 0 , 106, 6 ), // #400 + INST(Lds , X86Rm , O(000000,C5,_,_,_,_,_,_ ), 0 , 0 , 0 , 107, 0 ), // #401 + INST(Ldtilecfg , AmxCfg , V(000F38,49,_,0,0,_,_,_ ), 0 , 11 , 0 , 108, 86 ), // #402 + INST(Lea , X86Lea , O(000000,8D,_,_,x,_,_,_ ), 0 , 0 , 0 , 109, 0 ), // #403 + INST(Leave , X86Op , O(000000,C9,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #404 + INST(Les , X86Rm , O(000000,C4,_,_,_,_,_,_ ), 0 , 0 , 0 , 107, 0 ), // #405 + INST(Lfence , X86Fence , O(000F00,AE,5,_,_,_,_,_ ), 0 , 79 , 0 , 31 , 5 ), // #406 + INST(Lfs , X86Rm , O(000F00,B4,_,_,_,_,_,_ ), 0 , 5 , 0 , 110, 0 ), // #407 + INST(Lgdt , X86M_Only , O(000F00,01,2,_,_,_,_,_ ), 0 , 78 , 0 , 32 , 0 ), // #408 + INST(Lgs , X86Rm , O(000F00,B5,_,_,_,_,_,_ ), 0 , 5 , 0 , 110, 0 ), // #409 + INST(Lidt , X86M_Only , O(000F00,01,3,_,_,_,_,_ ), 0 , 80 , 0 , 32 , 0 ), // #410 + INST(Ljmp , X86LcallLjmp , O(000000,FF,5,_,_,_,_,_ ), O(000000,EA,_,_,_,_,_,_ ), 64 , 41 , 111, 0 ), // #411 + INST(Lldt , X86M_NoSize , O(000F00,00,2,_,_,_,_,_ ), 0 , 78 , 0 , 112, 0 ), // #412 + INST(Llwpcb , VexR_Wx , V(XOP_M9,12,0,0,x,_,_,_ ), 0 , 81 , 0 , 113, 87 ), // #413 + INST(Lmsw , X86M_NoSize , O(000F00,01,6,_,_,_,_,_ ), 0 , 82 , 0 , 112, 0 ), // #414 + INST(Lods , X86StrRm , O(000000,AC,_,_,_,_,_,_ ), 0 , 0 , 0 , 114, 88 ), // #415 + INST(Loop , X86JecxzLoop , 0 , O(000000,E2,_,_,_,_,_,_ ), 0 , 42 , 115, 0 ), // #416 + INST(Loope , X86JecxzLoop , 0 , O(000000,E1,_,_,_,_,_,_ ), 0 , 43 , 115, 71 ), // #417 + INST(Loopne , X86JecxzLoop , 0 , O(000000,E0,_,_,_,_,_,_ ), 0 , 44 , 115, 71 ), // #418 + INST(Lsl , X86Rm , O(000F00,03,_,_,_,_,_,_ ), 0 , 5 , 0 , 116, 11 ), // #419 + INST(Lss , X86Rm , O(000F00,B2,_,_,_,_,_,_ ), 0 , 5 , 0 , 110, 0 ), // #420 + INST(Ltr , X86M_NoSize , O(000F00,00,3,_,_,_,_,_ ), 0 , 80 , 0 , 112, 0 ), // #421 + INST(Lwpins , VexVmi4_Wx , V(XOP_MA,12,0,0,x,_,_,_ ), 0 , 83 , 0 , 117, 87 ), // #422 + INST(Lwpval , VexVmi4_Wx , V(XOP_MA,12,1,0,x,_,_,_ ), 0 , 84 , 0 , 117, 87 ), // #423 + INST(Lzcnt , X86Rm_Raw66H , O(F30F00,BD,_,_,x,_,_,_ ), 0 , 7 , 0 , 23 , 89 ), // #424 + INST(Maskmovdqu , ExtRm_ZDI , O(660F00,F7,_,_,_,_,_,_ ), 0 , 4 , 0 , 118, 5 ), // #425 + INST(Maskmovq , ExtRm_ZDI , O(000F00,F7,_,_,_,_,_,_ ), 0 , 5 , 0 , 119, 90 ), // #426 + INST(Maxpd , ExtRm , O(660F00,5F,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #427 + INST(Maxps , ExtRm , O(000F00,5F,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #428 + INST(Maxsd , ExtRm , O(F20F00,5F,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #429 + INST(Maxss , ExtRm , O(F30F00,5F,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #430 + INST(Mcommit , X86Op , O(F30F01,FA,_,_,_,_,_,_ ), 0 , 27 , 0 , 31 , 91 ), // #431 + INST(Mfence , X86Fence , O(000F00,AE,6,_,_,_,_,_ ), 0 , 82 , 0 , 31 , 5 ), // #432 + INST(Minpd , ExtRm , O(660F00,5D,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #433 + INST(Minps , ExtRm , O(000F00,5D,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #434 + INST(Minsd , ExtRm , O(F20F00,5D,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #435 + INST(Minss , ExtRm , O(F30F00,5D,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #436 + INST(Monitor , X86Op , O(000F01,C8,_,_,_,_,_,_ ), 0 , 23 , 0 , 120, 92 ), // #437 + INST(Monitorx , X86Op , O(000F01,FA,_,_,_,_,_,_ ), 0 , 23 , 0 , 120, 93 ), // #438 + INST(Mov , X86Mov , 0 , 0 , 0 , 0 , 121, 94 ), // #439 + INST(Movabs , X86Movabs , 0 , 0 , 0 , 0 , 122, 0 ), // #440 + INST(Movapd , ExtMov , O(660F00,28,_,_,_,_,_,_ ), O(660F00,29,_,_,_,_,_,_ ), 4 , 45 , 123, 95 ), // #441 + INST(Movaps , ExtMov , O(000F00,28,_,_,_,_,_,_ ), O(000F00,29,_,_,_,_,_,_ ), 5 , 46 , 123, 96 ), // #442 + INST(Movbe , ExtMovbe , O(000F38,F0,_,_,x,_,_,_ ), O(000F38,F1,_,_,x,_,_,_ ), 1 , 47 , 124, 97 ), // #443 + INST(Movd , ExtMovd , O(000F00,6E,_,_,_,_,_,_ ), O(000F00,7E,_,_,_,_,_,_ ), 5 , 48 , 125, 98 ), // #444 + INST(Movddup , ExtMov , O(F20F00,12,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 7 ), // #445 + INST(Movdir64b , X86EnqcmdMovdir64b , O(660F38,F8,_,_,_,_,_,_ ), 0 , 2 , 0 , 126, 99 ), // #446 + INST(Movdiri , X86MovntiMovdiri , O(000F38,F9,_,_,_,_,_,_ ), 0 , 1 , 0 , 3 , 100), // #447 + INST(Movdq2q , ExtMov , O(F20F00,D6,_,_,_,_,_,_ ), 0 , 6 , 0 , 127, 5 ), // #448 + INST(Movdqa , ExtMov , O(660F00,6F,_,_,_,_,_,_ ), O(660F00,7F,_,_,_,_,_,_ ), 4 , 49 , 123, 95 ), // #449 + INST(Movdqu , ExtMov , O(F30F00,6F,_,_,_,_,_,_ ), O(F30F00,7F,_,_,_,_,_,_ ), 7 , 50 , 123, 95 ), // #450 + INST(Movhlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), 0 , 5 , 0 , 128, 6 ), // #451 + INST(Movhpd , ExtMov , O(660F00,16,_,_,_,_,_,_ ), O(660F00,17,_,_,_,_,_,_ ), 4 , 51 , 129, 5 ), // #452 + INST(Movhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), O(000F00,17,_,_,_,_,_,_ ), 5 , 52 , 129, 6 ), // #453 + INST(Movlhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), 0 , 5 , 0 , 128, 6 ), // #454 + INST(Movlpd , ExtMov , O(660F00,12,_,_,_,_,_,_ ), O(660F00,13,_,_,_,_,_,_ ), 4 , 53 , 129, 5 ), // #455 + INST(Movlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), O(000F00,13,_,_,_,_,_,_ ), 5 , 54 , 129, 6 ), // #456 + INST(Movmskpd , ExtMov , O(660F00,50,_,_,_,_,_,_ ), 0 , 4 , 0 , 130, 5 ), // #457 + INST(Movmskps , ExtMov , O(000F00,50,_,_,_,_,_,_ ), 0 , 5 , 0 , 130, 6 ), // #458 + INST(Movntdq , ExtMov , 0 , O(660F00,E7,_,_,_,_,_,_ ), 0 , 55 , 131, 5 ), // #459 + INST(Movntdqa , ExtMov , O(660F38,2A,_,_,_,_,_,_ ), 0 , 2 , 0 , 105, 13 ), // #460 + INST(Movnti , X86MovntiMovdiri , O(000F00,C3,_,_,x,_,_,_ ), 0 , 5 , 0 , 3 , 5 ), // #461 + INST(Movntpd , ExtMov , 0 , O(660F00,2B,_,_,_,_,_,_ ), 0 , 56 , 131, 5 ), // #462 + INST(Movntps , ExtMov , 0 , O(000F00,2B,_,_,_,_,_,_ ), 0 , 57 , 131, 6 ), // #463 + INST(Movntq , ExtMov , 0 , O(000F00,E7,_,_,_,_,_,_ ), 0 , 58 , 132, 90 ), // #464 + INST(Movntsd , ExtMov , 0 , O(F20F00,2B,_,_,_,_,_,_ ), 0 , 59 , 133, 51 ), // #465 + INST(Movntss , ExtMov , 0 , O(F30F00,2B,_,_,_,_,_,_ ), 0 , 60 , 134, 51 ), // #466 + INST(Movq , ExtMovq , O(000F00,6E,_,_,x,_,_,_ ), O(000F00,7E,_,_,x,_,_,_ ), 5 , 48 , 135, 101), // #467 + INST(Movq2dq , ExtRm , O(F30F00,D6,_,_,_,_,_,_ ), 0 , 7 , 0 , 136, 5 ), // #468 + INST(Movs , X86StrMm , O(000000,A4,_,_,_,_,_,_ ), 0 , 0 , 0 , 137, 88 ), // #469 + INST(Movsd , ExtMov , O(F20F00,10,_,_,_,_,_,_ ), O(F20F00,11,_,_,_,_,_,_ ), 6 , 61 , 138, 95 ), // #470 + INST(Movshdup , ExtRm , O(F30F00,16,_,_,_,_,_,_ ), 0 , 7 , 0 , 6 , 7 ), // #471 + INST(Movsldup , ExtRm , O(F30F00,12,_,_,_,_,_,_ ), 0 , 7 , 0 , 6 , 7 ), // #472 + INST(Movss , ExtMov , O(F30F00,10,_,_,_,_,_,_ ), O(F30F00,11,_,_,_,_,_,_ ), 7 , 62 , 139, 96 ), // #473 + INST(Movsx , X86MovsxMovzx , O(000F00,BE,_,_,x,_,_,_ ), 0 , 5 , 0 , 140, 0 ), // #474 + INST(Movsxd , X86Rm , O(000000,63,_,_,x,_,_,_ ), 0 , 0 , 0 , 141, 0 ), // #475 + INST(Movupd , ExtMov , O(660F00,10,_,_,_,_,_,_ ), O(660F00,11,_,_,_,_,_,_ ), 4 , 63 , 123, 95 ), // #476 + INST(Movups , ExtMov , O(000F00,10,_,_,_,_,_,_ ), O(000F00,11,_,_,_,_,_,_ ), 5 , 64 , 123, 96 ), // #477 + INST(Movzx , X86MovsxMovzx , O(000F00,B6,_,_,x,_,_,_ ), 0 , 5 , 0 , 140, 0 ), // #478 + INST(Mpsadbw , ExtRmi , O(660F3A,42,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #479 + INST(Mul , X86M_GPB_MulDiv , O(000000,F6,4,_,x,_,_,_ ), 0 , 10 , 0 , 58 , 1 ), // #480 + INST(Mulpd , ExtRm , O(660F00,59,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #481 + INST(Mulps , ExtRm , O(000F00,59,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #482 + INST(Mulsd , ExtRm , O(F20F00,59,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #483 + INST(Mulss , ExtRm , O(F30F00,59,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #484 + INST(Mulx , VexRvm_ZDX_Wx , V(F20F38,F6,_,0,x,_,_,_ ), 0 , 85 , 0 , 142, 102), // #485 + INST(Mwait , X86Op , O(000F01,C9,_,_,_,_,_,_ ), 0 , 23 , 0 , 143, 92 ), // #486 + INST(Mwaitx , X86Op , O(000F01,FB,_,_,_,_,_,_ ), 0 , 23 , 0 , 144, 93 ), // #487 + INST(Neg , X86M_GPB , O(000000,F6,3,_,x,_,_,_ ), 0 , 77 , 0 , 145, 1 ), // #488 + INST(Nop , X86M_Nop , O(000000,90,_,_,_,_,_,_ ), 0 , 0 , 0 , 146, 0 ), // #489 + INST(Not , X86M_GPB , O(000000,F6,2,_,x,_,_,_ ), 0 , 3 , 0 , 145, 0 ), // #490 + INST(Or , X86Arith , O(000000,08,1,_,x,_,_,_ ), 0 , 33 , 0 , 147, 1 ), // #491 + INST(Orpd , ExtRm , O(660F00,56,_,_,_,_,_,_ ), 0 , 4 , 0 , 12 , 5 ), // #492 + INST(Orps , ExtRm , O(000F00,56,_,_,_,_,_,_ ), 0 , 5 , 0 , 12 , 6 ), // #493 + INST(Out , X86Out , O(000000,EE,_,_,_,_,_,_ ), O(000000,E6,_,_,_,_,_,_ ), 0 , 65 , 148, 0 ), // #494 + INST(Outs , X86Outs , O(000000,6E,_,_,_,_,_,_ ), 0 , 0 , 0 , 149, 0 ), // #495 + INST(Pabsb , ExtRm_P , O(000F38,1C,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #496 + INST(Pabsd , ExtRm_P , O(000F38,1E,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #497 + INST(Pabsw , ExtRm_P , O(000F38,1D,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #498 + INST(Packssdw , ExtRm_P , O(000F00,6B,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #499 + INST(Packsswb , ExtRm_P , O(000F00,63,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #500 + INST(Packusdw , ExtRm , O(660F38,2B,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #501 + INST(Packuswb , ExtRm_P , O(000F00,67,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #502 + INST(Paddb , ExtRm_P , O(000F00,FC,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #503 + INST(Paddd , ExtRm_P , O(000F00,FE,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #504 + INST(Paddq , ExtRm_P , O(000F00,D4,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 5 ), // #505 + INST(Paddsb , ExtRm_P , O(000F00,EC,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #506 + INST(Paddsw , ExtRm_P , O(000F00,ED,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #507 + INST(Paddusb , ExtRm_P , O(000F00,DC,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #508 + INST(Paddusw , ExtRm_P , O(000F00,DD,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #509 + INST(Paddw , ExtRm_P , O(000F00,FD,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #510 + INST(Palignr , ExtRmi_P , O(000F3A,0F,_,_,_,_,_,_ ), 0 , 86 , 0 , 151, 103), // #511 + INST(Pand , ExtRm_P , O(000F00,DB,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #512 + INST(Pandn , ExtRm_P , O(000F00,DF,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #513 + INST(Pause , X86Op , O(F30000,90,_,_,_,_,_,_ ), 0 , 87 , 0 , 31 , 0 ), // #514 + INST(Pavgb , ExtRm_P , O(000F00,E0,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 104), // #515 + INST(Pavgusb , Ext3dNow , O(000F0F,BF,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #516 + INST(Pavgw , ExtRm_P , O(000F00,E3,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 104), // #517 + INST(Pblendvb , ExtRm_XMM0 , O(660F38,10,_,_,_,_,_,_ ), 0 , 2 , 0 , 16 , 13 ), // #518 + INST(Pblendw , ExtRmi , O(660F3A,0E,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #519 + INST(Pclmulqdq , ExtRmi , O(660F3A,44,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 105), // #520 + INST(Pcmpeqb , ExtRm_P , O(000F00,74,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #521 + INST(Pcmpeqd , ExtRm_P , O(000F00,76,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #522 + INST(Pcmpeqq , ExtRm , O(660F38,29,_,_,_,_,_,_ ), 0 , 2 , 0 , 155, 13 ), // #523 + INST(Pcmpeqw , ExtRm_P , O(000F00,75,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #524 + INST(Pcmpestri , ExtRmi , O(660F3A,61,_,_,_,_,_,_ ), 0 , 9 , 0 , 156, 106), // #525 + INST(Pcmpestrm , ExtRmi , O(660F3A,60,_,_,_,_,_,_ ), 0 , 9 , 0 , 157, 106), // #526 + INST(Pcmpgtb , ExtRm_P , O(000F00,64,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #527 + INST(Pcmpgtd , ExtRm_P , O(000F00,66,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #528 + INST(Pcmpgtq , ExtRm , O(660F38,37,_,_,_,_,_,_ ), 0 , 2 , 0 , 155, 46 ), // #529 + INST(Pcmpgtw , ExtRm_P , O(000F00,65,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #530 + INST(Pcmpistri , ExtRmi , O(660F3A,63,_,_,_,_,_,_ ), 0 , 9 , 0 , 158, 106), // #531 + INST(Pcmpistrm , ExtRmi , O(660F3A,62,_,_,_,_,_,_ ), 0 , 9 , 0 , 159, 106), // #532 + INST(Pconfig , X86Op , O(000F01,C5,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 107), // #533 + INST(Pdep , VexRvm_Wx , V(F20F38,F5,_,0,x,_,_,_ ), 0 , 85 , 0 , 11 , 102), // #534 + INST(Pext , VexRvm_Wx , V(F30F38,F5,_,0,x,_,_,_ ), 0 , 89 , 0 , 11 , 102), // #535 + INST(Pextrb , ExtExtract , O(000F3A,14,_,_,_,_,_,_ ), 0 , 86 , 0 , 160, 13 ), // #536 + INST(Pextrd , ExtExtract , O(000F3A,16,_,_,_,_,_,_ ), 0 , 86 , 0 , 62 , 13 ), // #537 + INST(Pextrq , ExtExtract , O(000F3A,16,_,_,1,_,_,_ ), 0 , 90 , 0 , 161, 13 ), // #538 + INST(Pextrw , ExtPextrw , O(000F00,C5,_,_,_,_,_,_ ), O(000F3A,15,_,_,_,_,_,_ ), 5 , 66 , 162, 108), // #539 + INST(Pf2id , Ext3dNow , O(000F0F,1D,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #540 + INST(Pf2iw , Ext3dNow , O(000F0F,1C,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #541 + INST(Pfacc , Ext3dNow , O(000F0F,AE,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #542 + INST(Pfadd , Ext3dNow , O(000F0F,9E,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #543 + INST(Pfcmpeq , Ext3dNow , O(000F0F,B0,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #544 + INST(Pfcmpge , Ext3dNow , O(000F0F,90,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #545 + INST(Pfcmpgt , Ext3dNow , O(000F0F,A0,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #546 + INST(Pfmax , Ext3dNow , O(000F0F,A4,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #547 + INST(Pfmin , Ext3dNow , O(000F0F,94,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #548 + INST(Pfmul , Ext3dNow , O(000F0F,B4,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #549 + INST(Pfnacc , Ext3dNow , O(000F0F,8A,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #550 + INST(Pfpnacc , Ext3dNow , O(000F0F,8E,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #551 + INST(Pfrcp , Ext3dNow , O(000F0F,96,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #552 + INST(Pfrcpit1 , Ext3dNow , O(000F0F,A6,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #553 + INST(Pfrcpit2 , Ext3dNow , O(000F0F,B6,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #554 + INST(Pfrcpv , Ext3dNow , O(000F0F,86,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 110), // #555 + INST(Pfrsqit1 , Ext3dNow , O(000F0F,A7,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #556 + INST(Pfrsqrt , Ext3dNow , O(000F0F,97,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #557 + INST(Pfrsqrtv , Ext3dNow , O(000F0F,87,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 110), // #558 + INST(Pfsub , Ext3dNow , O(000F0F,9A,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #559 + INST(Pfsubr , Ext3dNow , O(000F0F,AA,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #560 + INST(Phaddd , ExtRm_P , O(000F38,02,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #561 + INST(Phaddsw , ExtRm_P , O(000F38,03,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #562 + INST(Phaddw , ExtRm_P , O(000F38,01,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #563 + INST(Phminposuw , ExtRm , O(660F38,41,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #564 + INST(Phsubd , ExtRm_P , O(000F38,06,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #565 + INST(Phsubsw , ExtRm_P , O(000F38,07,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #566 + INST(Phsubw , ExtRm_P , O(000F38,05,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #567 + INST(Pi2fd , Ext3dNow , O(000F0F,0D,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #568 + INST(Pi2fw , Ext3dNow , O(000F0F,0C,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #569 + INST(Pinsrb , ExtRmi , O(660F3A,20,_,_,_,_,_,_ ), 0 , 9 , 0 , 163, 13 ), // #570 + INST(Pinsrd , ExtRmi , O(660F3A,22,_,_,_,_,_,_ ), 0 , 9 , 0 , 164, 13 ), // #571 + INST(Pinsrq , ExtRmi , O(660F3A,22,_,_,1,_,_,_ ), 0 , 91 , 0 , 165, 13 ), // #572 + INST(Pinsrw , ExtRmi_P , O(000F00,C4,_,_,_,_,_,_ ), 0 , 5 , 0 , 166, 104), // #573 + INST(Pmaddubsw , ExtRm_P , O(000F38,04,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #574 + INST(Pmaddwd , ExtRm_P , O(000F00,F5,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #575 + INST(Pmaxsb , ExtRm , O(660F38,3C,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #576 + INST(Pmaxsd , ExtRm , O(660F38,3D,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #577 + INST(Pmaxsw , ExtRm_P , O(000F00,EE,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 104), // #578 + INST(Pmaxub , ExtRm_P , O(000F00,DE,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 104), // #579 + INST(Pmaxud , ExtRm , O(660F38,3F,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #580 + INST(Pmaxuw , ExtRm , O(660F38,3E,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #581 + INST(Pminsb , ExtRm , O(660F38,38,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #582 + INST(Pminsd , ExtRm , O(660F38,39,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #583 + INST(Pminsw , ExtRm_P , O(000F00,EA,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 104), // #584 + INST(Pminub , ExtRm_P , O(000F00,DA,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 104), // #585 + INST(Pminud , ExtRm , O(660F38,3B,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #586 + INST(Pminuw , ExtRm , O(660F38,3A,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #587 + INST(Pmovmskb , ExtRm_P , O(000F00,D7,_,_,_,_,_,_ ), 0 , 5 , 0 , 167, 104), // #588 + INST(Pmovsxbd , ExtRm , O(660F38,21,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #589 + INST(Pmovsxbq , ExtRm , O(660F38,22,_,_,_,_,_,_ ), 0 , 2 , 0 , 168, 13 ), // #590 + INST(Pmovsxbw , ExtRm , O(660F38,20,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #591 + INST(Pmovsxdq , ExtRm , O(660F38,25,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #592 + INST(Pmovsxwd , ExtRm , O(660F38,23,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #593 + INST(Pmovsxwq , ExtRm , O(660F38,24,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #594 + INST(Pmovzxbd , ExtRm , O(660F38,31,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #595 + INST(Pmovzxbq , ExtRm , O(660F38,32,_,_,_,_,_,_ ), 0 , 2 , 0 , 168, 13 ), // #596 + INST(Pmovzxbw , ExtRm , O(660F38,30,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #597 + INST(Pmovzxdq , ExtRm , O(660F38,35,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #598 + INST(Pmovzxwd , ExtRm , O(660F38,33,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #599 + INST(Pmovzxwq , ExtRm , O(660F38,34,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #600 + INST(Pmuldq , ExtRm , O(660F38,28,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #601 + INST(Pmulhrsw , ExtRm_P , O(000F38,0B,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #602 + INST(Pmulhrw , Ext3dNow , O(000F0F,B7,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #603 + INST(Pmulhuw , ExtRm_P , O(000F00,E4,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 104), // #604 + INST(Pmulhw , ExtRm_P , O(000F00,E5,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #605 + INST(Pmulld , ExtRm , O(660F38,40,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #606 + INST(Pmullw , ExtRm_P , O(000F00,D5,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #607 + INST(Pmuludq , ExtRm_P , O(000F00,F4,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 5 ), // #608 + INST(Pop , X86Pop , O(000000,8F,0,_,_,_,_,_ ), O(000000,58,_,_,_,_,_,_ ), 0 , 67 , 169, 0 ), // #609 + INST(Popa , X86Op , O(660000,61,_,_,_,_,_,_ ), 0 , 21 , 0 , 85 , 0 ), // #610 + INST(Popad , X86Op , O(000000,61,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 0 ), // #611 + INST(Popcnt , X86Rm_Raw66H , O(F30F00,B8,_,_,x,_,_,_ ), 0 , 7 , 0 , 23 , 111), // #612 + INST(Popf , X86Op , O(660000,9D,_,_,_,_,_,_ ), 0 , 21 , 0 , 31 , 112), // #613 + INST(Popfd , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 112), // #614 + INST(Popfq , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 34 , 112), // #615 + INST(Por , ExtRm_P , O(000F00,EB,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #616 + INST(Prefetch , X86M_Only , O(000F00,0D,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 58 ), // #617 + INST(Prefetchit0 , X86M_Only , O(000F00,18,7,_,_,_,_,_ ), 0 , 24 , 0 , 75 , 113), // #618 + INST(Prefetchit1 , X86M_Only , O(000F00,18,6,_,_,_,_,_ ), 0 , 82 , 0 , 75 , 113), // #619 + INST(Prefetchnta , X86M_Only , O(000F00,18,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 6 ), // #620 + INST(Prefetcht0 , X86M_Only , O(000F00,18,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 6 ), // #621 + INST(Prefetcht1 , X86M_Only , O(000F00,18,2,_,_,_,_,_ ), 0 , 78 , 0 , 32 , 6 ), // #622 + INST(Prefetcht2 , X86M_Only , O(000F00,18,3,_,_,_,_,_ ), 0 , 80 , 0 , 32 , 6 ), // #623 + INST(Prefetchw , X86M_Only , O(000F00,0D,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 114), // #624 + INST(Prefetchwt1 , X86M_Only , O(000F00,0D,2,_,_,_,_,_ ), 0 , 78 , 0 , 32 , 115), // #625 + INST(Psadbw , ExtRm_P , O(000F00,F6,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 104), // #626 + INST(Pshufb , ExtRm_P , O(000F38,00,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #627 + INST(Pshufd , ExtRmi , O(660F00,70,_,_,_,_,_,_ ), 0 , 4 , 0 , 9 , 5 ), // #628 + INST(Pshufhw , ExtRmi , O(F30F00,70,_,_,_,_,_,_ ), 0 , 7 , 0 , 9 , 5 ), // #629 + INST(Pshuflw , ExtRmi , O(F20F00,70,_,_,_,_,_,_ ), 0 , 6 , 0 , 9 , 5 ), // #630 + INST(Pshufw , ExtRmi_P , O(000F00,70,_,_,_,_,_,_ ), 0 , 5 , 0 , 170, 90 ), // #631 + INST(Psignb , ExtRm_P , O(000F38,08,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #632 + INST(Psignd , ExtRm_P , O(000F38,0A,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #633 + INST(Psignw , ExtRm_P , O(000F38,09,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #634 + INST(Pslld , ExtRmRi_P , O(000F00,F2,_,_,_,_,_,_ ), O(000F00,72,6,_,_,_,_,_ ), 5 , 68 , 171, 98 ), // #635 + INST(Pslldq , ExtRmRi , 0 , O(660F00,73,7,_,_,_,_,_ ), 0 , 69 , 172, 5 ), // #636 + INST(Psllq , ExtRmRi_P , O(000F00,F3,_,_,_,_,_,_ ), O(000F00,73,6,_,_,_,_,_ ), 5 , 70 , 171, 98 ), // #637 + INST(Psllw , ExtRmRi_P , O(000F00,F1,_,_,_,_,_,_ ), O(000F00,71,6,_,_,_,_,_ ), 5 , 71 , 171, 98 ), // #638 + INST(Psmash , X86Op , O(F30F01,FF,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 116), // #639 + INST(Psrad , ExtRmRi_P , O(000F00,E2,_,_,_,_,_,_ ), O(000F00,72,4,_,_,_,_,_ ), 5 , 72 , 171, 98 ), // #640 + INST(Psraw , ExtRmRi_P , O(000F00,E1,_,_,_,_,_,_ ), O(000F00,71,4,_,_,_,_,_ ), 5 , 73 , 171, 98 ), // #641 + INST(Psrld , ExtRmRi_P , O(000F00,D2,_,_,_,_,_,_ ), O(000F00,72,2,_,_,_,_,_ ), 5 , 74 , 171, 98 ), // #642 + INST(Psrldq , ExtRmRi , 0 , O(660F00,73,3,_,_,_,_,_ ), 0 , 75 , 172, 5 ), // #643 + INST(Psrlq , ExtRmRi_P , O(000F00,D3,_,_,_,_,_,_ ), O(000F00,73,2,_,_,_,_,_ ), 5 , 76 , 171, 98 ), // #644 + INST(Psrlw , ExtRmRi_P , O(000F00,D1,_,_,_,_,_,_ ), O(000F00,71,2,_,_,_,_,_ ), 5 , 77 , 171, 98 ), // #645 + INST(Psubb , ExtRm_P , O(000F00,F8,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #646 + INST(Psubd , ExtRm_P , O(000F00,FA,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #647 + INST(Psubq , ExtRm_P , O(000F00,FB,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 5 ), // #648 + INST(Psubsb , ExtRm_P , O(000F00,E8,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #649 + INST(Psubsw , ExtRm_P , O(000F00,E9,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #650 + INST(Psubusb , ExtRm_P , O(000F00,D8,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #651 + INST(Psubusw , ExtRm_P , O(000F00,D9,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #652 + INST(Psubw , ExtRm_P , O(000F00,F9,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #653 + INST(Pswapd , Ext3dNow , O(000F0F,BB,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #654 + INST(Ptest , ExtRm , O(660F38,17,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 117), // #655 + INST(Ptwrite , X86M , O(F30F00,AE,4,_,_,_,_,_ ), 0 , 92 , 0 , 173, 118), // #656 + INST(Punpckhbw , ExtRm_P , O(000F00,68,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #657 + INST(Punpckhdq , ExtRm_P , O(000F00,6A,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #658 + INST(Punpckhqdq , ExtRm , O(660F00,6D,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #659 + INST(Punpckhwd , ExtRm_P , O(000F00,69,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #660 + INST(Punpcklbw , ExtRm_P , O(000F00,60,_,_,_,_,_,_ ), 0 , 5 , 0 , 174, 98 ), // #661 + INST(Punpckldq , ExtRm_P , O(000F00,62,_,_,_,_,_,_ ), 0 , 5 , 0 , 174, 98 ), // #662 + INST(Punpcklqdq , ExtRm , O(660F00,6C,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #663 + INST(Punpcklwd , ExtRm_P , O(000F00,61,_,_,_,_,_,_ ), 0 , 5 , 0 , 174, 98 ), // #664 + INST(Push , X86Push , O(000000,FF,6,_,_,_,_,_ ), O(000000,50,_,_,_,_,_,_ ), 34 , 78 , 175, 0 ), // #665 + INST(Pusha , X86Op , O(660000,60,_,_,_,_,_,_ ), 0 , 21 , 0 , 85 , 0 ), // #666 + INST(Pushad , X86Op , O(000000,60,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 0 ), // #667 + INST(Pushf , X86Op , O(660000,9C,_,_,_,_,_,_ ), 0 , 21 , 0 , 31 , 119), // #668 + INST(Pushfd , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 119), // #669 + INST(Pushfq , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 34 , 119), // #670 + INST(Pvalidate , X86Op , O(F20F01,FF,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 120), // #671 + INST(Pxor , ExtRm_P , O(000F00,EF,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #672 + INST(Rcl , X86Rot , O(000000,D0,2,_,x,_,_,_ ), 0 , 3 , 0 , 176, 121), // #673 + INST(Rcpps , ExtRm , O(000F00,53,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #674 + INST(Rcpss , ExtRm , O(F30F00,53,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #675 + INST(Rcr , X86Rot , O(000000,D0,3,_,x,_,_,_ ), 0 , 77 , 0 , 176, 121), // #676 + INST(Rdfsbase , X86M , O(F30F00,AE,0,_,x,_,_,_ ), 0 , 7 , 0 , 177, 122), // #677 + INST(Rdgsbase , X86M , O(F30F00,AE,1,_,x,_,_,_ ), 0 , 94 , 0 , 177, 122), // #678 + INST(Rdmsr , X86Op , O(000F00,32,_,_,_,_,_,_ ), 0 , 5 , 0 , 178, 123), // #679 + INST(Rdpid , X86R_Native , O(F30F00,C7,7,_,_,_,_,_ ), 0 , 95 , 0 , 179, 124), // #680 + INST(Rdpkru , X86Op , O(000F01,EE,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 125), // #681 + INST(Rdpmc , X86Op , O(000F00,33,_,_,_,_,_,_ ), 0 , 5 , 0 , 178, 0 ), // #682 + INST(Rdpru , X86Op , O(000F01,FD,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 126), // #683 + INST(Rdrand , X86M , O(000F00,C7,6,_,x,_,_,_ ), 0 , 82 , 0 , 24 , 127), // #684 + INST(Rdseed , X86M , O(000F00,C7,7,_,x,_,_,_ ), 0 , 24 , 0 , 24 , 128), // #685 + INST(Rdsspd , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 94 , 0 , 80 , 65 ), // #686 + INST(Rdsspq , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 94 , 0 , 81 , 65 ), // #687 + INST(Rdtsc , X86Op , O(000F00,31,_,_,_,_,_,_ ), 0 , 5 , 0 , 29 , 129), // #688 + INST(Rdtscp , X86Op , O(000F01,F9,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 130), // #689 + INST(Ret , X86Ret , O(000000,C2,_,_,_,_,_,_ ), 0 , 0 , 0 , 180, 0 ), // #690 + INST(Retf , X86Ret , O(000000,CA,_,_,x,_,_,_ ), 0 , 0 , 0 , 181, 0 ), // #691 + INST(Rmpadjust , X86Op , O(F30F01,FE,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 116), // #692 + INST(Rmpupdate , X86Op , O(F20F01,FE,_,_,_,_,_,_ ), 0 , 93 , 0 , 34 , 116), // #693 + INST(Rol , X86Rot , O(000000,D0,0,_,x,_,_,_ ), 0 , 0 , 0 , 176, 131), // #694 + INST(Ror , X86Rot , O(000000,D0,1,_,x,_,_,_ ), 0 , 33 , 0 , 176, 131), // #695 + INST(Rorx , VexRmi_Wx , V(F20F3A,F0,_,0,x,_,_,_ ), 0 , 96 , 0 , 182, 102), // #696 + INST(Roundpd , ExtRmi , O(660F3A,09,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #697 + INST(Roundps , ExtRmi , O(660F3A,08,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #698 + INST(Roundsd , ExtRmi , O(660F3A,0B,_,_,_,_,_,_ ), 0 , 9 , 0 , 39 , 13 ), // #699 + INST(Roundss , ExtRmi , O(660F3A,0A,_,_,_,_,_,_ ), 0 , 9 , 0 , 40 , 13 ), // #700 + INST(Rsm , X86Op , O(000F00,AA,_,_,_,_,_,_ ), 0 , 5 , 0 , 85 , 1 ), // #701 + INST(Rsqrtps , ExtRm , O(000F00,52,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #702 + INST(Rsqrtss , ExtRm , O(F30F00,52,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #703 + INST(Rstorssp , X86M_Only , O(F30F00,01,5,_,_,_,_,_ ), 0 , 65 , 0 , 33 , 25 ), // #704 + INST(Sahf , X86Op , O(000000,9E,_,_,_,_,_,_ ), 0 , 0 , 0 , 102, 132), // #705 + INST(Sal , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 10 , 0 , 176, 1 ), // #706 + INST(Sar , X86Rot , O(000000,D0,7,_,x,_,_,_ ), 0 , 29 , 0 , 176, 1 ), // #707 + INST(Sarx , VexRmv_Wx , V(F30F38,F7,_,0,x,_,_,_ ), 0 , 89 , 0 , 14 , 102), // #708 + INST(Saveprevssp , X86Op , O(F30F01,EA,_,_,_,_,_,_ ), 0 , 27 , 0 , 31 , 25 ), // #709 + INST(Sbb , X86Arith , O(000000,18,3,_,x,_,_,_ ), 0 , 77 , 0 , 183, 3 ), // #710 + INST(Scas , X86StrRm , O(000000,AE,_,_,_,_,_,_ ), 0 , 0 , 0 , 184, 39 ), // #711 + INST(Seamcall , X86Op , O(660F01,CF,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #712 + INST(Seamops , X86Op , O(660F01,CE,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #713 + INST(Seamret , X86Op , O(660F01,CD,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #714 + INST(Senduipi , X86M_NoSize , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 26 , 0 , 81 , 26 ), // #715 + INST(Serialize , X86Op , O(000F01,E8,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 134), // #716 + INST(Seta , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 69 ), // #717 + INST(Setae , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #718 + INST(Setb , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #719 + INST(Setbe , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 69 ), // #720 + INST(Setc , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #721 + INST(Sete , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 71 ), // #722 + INST(Setg , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 72 ), // #723 + INST(Setge , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 73 ), // #724 + INST(Setl , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 73 ), // #725 + INST(Setle , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 72 ), // #726 + INST(Setna , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 69 ), // #727 + INST(Setnae , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #728 + INST(Setnb , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #729 + INST(Setnbe , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 69 ), // #730 + INST(Setnc , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #731 + INST(Setne , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 71 ), // #732 + INST(Setng , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 72 ), // #733 + INST(Setnge , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 73 ), // #734 + INST(Setnl , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 73 ), // #735 + INST(Setnle , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 72 ), // #736 + INST(Setno , X86Set , O(000F00,91,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 66 ), // #737 + INST(Setnp , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 74 ), // #738 + INST(Setns , X86Set , O(000F00,99,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 75 ), // #739 + INST(Setnz , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 71 ), // #740 + INST(Seto , X86Set , O(000F00,90,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 66 ), // #741 + INST(Setp , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 74 ), // #742 + INST(Setpe , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 74 ), // #743 + INST(Setpo , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 74 ), // #744 + INST(Sets , X86Set , O(000F00,98,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 75 ), // #745 + INST(Setssbsy , X86Op , O(F30F01,E8,_,_,_,_,_,_ ), 0 , 27 , 0 , 31 , 65 ), // #746 + INST(Setz , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 71 ), // #747 + INST(Sfence , X86Fence , O(000F00,AE,7,_,_,_,_,_ ), 0 , 24 , 0 , 31 , 6 ), // #748 + INST(Sgdt , X86M_Only , O(000F00,01,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 0 ), // #749 + INST(Sha1msg1 , ExtRm , O(000F38,C9,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #750 + INST(Sha1msg2 , ExtRm , O(000F38,CA,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #751 + INST(Sha1nexte , ExtRm , O(000F38,C8,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #752 + INST(Sha1rnds4 , ExtRmi , O(000F3A,CC,_,_,_,_,_,_ ), 0 , 86 , 0 , 9 , 135), // #753 + INST(Sha256msg1 , ExtRm , O(000F38,CC,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #754 + INST(Sha256msg2 , ExtRm , O(000F38,CD,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #755 + INST(Sha256rnds2 , ExtRm_XMM0 , O(000F38,CB,_,_,_,_,_,_ ), 0 , 1 , 0 , 16 , 135), // #756 + INST(Shl , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 10 , 0 , 176, 1 ), // #757 + INST(Shld , X86ShldShrd , O(000F00,A4,_,_,x,_,_,_ ), 0 , 5 , 0 , 186, 1 ), // #758 + INST(Shlx , VexRmv_Wx , V(660F38,F7,_,0,x,_,_,_ ), 0 , 30 , 0 , 14 , 102), // #759 + INST(Shr , X86Rot , O(000000,D0,5,_,x,_,_,_ ), 0 , 64 , 0 , 176, 1 ), // #760 + INST(Shrd , X86ShldShrd , O(000F00,AC,_,_,x,_,_,_ ), 0 , 5 , 0 , 186, 1 ), // #761 + INST(Shrx , VexRmv_Wx , V(F20F38,F7,_,0,x,_,_,_ ), 0 , 85 , 0 , 14 , 102), // #762 + INST(Shufpd , ExtRmi , O(660F00,C6,_,_,_,_,_,_ ), 0 , 4 , 0 , 9 , 5 ), // #763 + INST(Shufps , ExtRmi , O(000F00,C6,_,_,_,_,_,_ ), 0 , 5 , 0 , 9 , 6 ), // #764 + INST(Sidt , X86M_Only , O(000F00,01,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 0 ), // #765 + INST(Skinit , X86Op_xAX , O(000F01,DE,_,_,_,_,_,_ ), 0 , 23 , 0 , 56 , 136), // #766 + INST(Sldt , X86M_NoMemSize , O(000F00,00,0,_,_,_,_,_ ), 0 , 5 , 0 , 187, 0 ), // #767 + INST(Slwpcb , VexR_Wx , V(XOP_M9,12,1,0,x,_,_,_ ), 0 , 13 , 0 , 113, 87 ), // #768 + INST(Smsw , X86M_NoMemSize , O(000F00,01,4,_,_,_,_,_ ), 0 , 98 , 0 , 187, 0 ), // #769 + INST(Sqrtpd , ExtRm , O(660F00,51,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #770 + INST(Sqrtps , ExtRm , O(000F00,51,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #771 + INST(Sqrtsd , ExtRm , O(F20F00,51,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #772 + INST(Sqrtss , ExtRm , O(F30F00,51,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #773 + INST(Stac , X86Op , O(000F01,CB,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 17 ), // #774 + INST(Stc , X86Op , O(000000,F9,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 18 ), // #775 + INST(Std , X86Op , O(000000,FD,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 19 ), // #776 + INST(Stgi , X86Op , O(000F01,DC,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 136), // #777 + INST(Sti , X86Op , O(000000,FB,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 24 ), // #778 + INST(Stmxcsr , X86M_Only , O(000F00,AE,3,_,_,_,_,_ ), 0 , 80 , 0 , 106, 6 ), // #779 + INST(Stos , X86StrMr , O(000000,AA,_,_,_,_,_,_ ), 0 , 0 , 0 , 188, 88 ), // #780 + INST(Str , X86M_NoMemSize , O(000F00,00,1,_,_,_,_,_ ), 0 , 32 , 0 , 187, 0 ), // #781 + INST(Sttilecfg , AmxCfg , V(660F38,49,_,0,0,_,_,_ ), 0 , 30 , 0 , 108, 86 ), // #782 + INST(Stui , X86Op , O(F30F01,EF,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 26 ), // #783 + INST(Sub , X86Arith , O(000000,28,5,_,x,_,_,_ ), 0 , 64 , 0 , 183, 1 ), // #784 + INST(Subpd , ExtRm , O(660F00,5C,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #785 + INST(Subps , ExtRm , O(000F00,5C,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #786 + INST(Subsd , ExtRm , O(F20F00,5C,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #787 + INST(Subss , ExtRm , O(F30F00,5C,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #788 + INST(Swapgs , X86Op , O(000F01,F8,_,_,_,_,_,_ ), 0 , 23 , 0 , 34 , 0 ), // #789 + INST(Syscall , X86Op , O(000F00,05,_,_,_,_,_,_ ), 0 , 5 , 0 , 34 , 0 ), // #790 + INST(Sysenter , X86Op , O(000F00,34,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #791 + INST(Sysexit , X86Op , O(000F00,35,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #792 + INST(Sysexitq , X86Op , O(000F00,35,_,_,1,_,_,_ ), 0 , 62 , 0 , 34 , 0 ), // #793 + INST(Sysret , X86Op , O(000F00,07,_,_,_,_,_,_ ), 0 , 5 , 0 , 34 , 0 ), // #794 + INST(Sysretq , X86Op , O(000F00,07,_,_,1,_,_,_ ), 0 , 62 , 0 , 34 , 0 ), // #795 + INST(T1mskc , VexVm_Wx , V(XOP_M9,01,7,0,x,_,_,_ ), 0 , 99 , 0 , 15 , 12 ), // #796 + INST(Tcmmimfp16ps , AmxRmv , V(660F38,6C,_,0,0,_,_,_ ), 0 , 30 , 0 , 189, 137), // #797 + INST(Tcmmrlfp16ps , AmxRmv , V(000F38,6C,_,0,0,_,_,_ ), 0 , 11 , 0 , 189, 137), // #798 + INST(Tdcall , X86Op , O(660F01,CC,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #799 + INST(Tdpbf16ps , AmxRmv , V(F30F38,5C,_,0,0,_,_,_ ), 0 , 89 , 0 , 189, 138), // #800 + INST(Tdpbssd , AmxRmv , V(F20F38,5E,_,0,0,_,_,_ ), 0 , 85 , 0 , 189, 139), // #801 + INST(Tdpbsud , AmxRmv , V(F30F38,5E,_,0,0,_,_,_ ), 0 , 89 , 0 , 189, 139), // #802 + INST(Tdpbusd , AmxRmv , V(660F38,5E,_,0,0,_,_,_ ), 0 , 30 , 0 , 189, 139), // #803 + INST(Tdpbuud , AmxRmv , V(000F38,5E,_,0,0,_,_,_ ), 0 , 11 , 0 , 189, 139), // #804 + INST(Tdpfp16ps , AmxRmv , V(F20F38,5C,_,0,0,_,_,_ ), 0 , 85 , 0 , 189, 140), // #805 + INST(Test , X86Test , O(000000,84,_,_,x,_,_,_ ), O(000000,F6,_,_,x,_,_,_ ), 0 , 79 , 190, 1 ), // #806 + INST(Testui , X86Op , O(F30F01,ED,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 141), // #807 + INST(Tileloadd , AmxRm , V(F20F38,4B,_,0,0,_,_,_ ), 0 , 85 , 0 , 191, 86 ), // #808 + INST(Tileloaddt1 , AmxRm , V(660F38,4B,_,0,0,_,_,_ ), 0 , 30 , 0 , 191, 86 ), // #809 + INST(Tilerelease , VexOpMod , V(000F38,49,0,0,0,_,_,_ ), 0 , 11 , 0 , 192, 86 ), // #810 + INST(Tilestored , AmxMr , V(F30F38,4B,_,0,0,_,_,_ ), 0 , 89 , 0 , 193, 86 ), // #811 + INST(Tilezero , AmxR , V(F20F38,49,_,0,0,_,_,_ ), 0 , 85 , 0 , 194, 86 ), // #812 + INST(Tlbsync , X86Op , O(000F01,FF,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 68 ), // #813 + INST(Tpause , X86R32_EDX_EAX , O(660F00,AE,6,_,_,_,_,_ ), 0 , 28 , 0 , 195, 142), // #814 + INST(Tzcnt , X86Rm_Raw66H , O(F30F00,BC,_,_,x,_,_,_ ), 0 , 7 , 0 , 23 , 10 ), // #815 + INST(Tzmsk , VexVm_Wx , V(XOP_M9,01,4,0,x,_,_,_ ), 0 , 100, 0 , 15 , 12 ), // #816 + INST(Ucomisd , ExtRm , O(660F00,2E,_,_,_,_,_,_ ), 0 , 4 , 0 , 7 , 43 ), // #817 + INST(Ucomiss , ExtRm , O(000F00,2E,_,_,_,_,_,_ ), 0 , 5 , 0 , 8 , 44 ), // #818 + INST(Ud0 , X86Rm , O(000F00,FF,_,_,_,_,_,_ ), 0 , 5 , 0 , 196, 0 ), // #819 + INST(Ud1 , X86Rm , O(000F00,B9,_,_,_,_,_,_ ), 0 , 5 , 0 , 196, 0 ), // #820 + INST(Ud2 , X86Op , O(000F00,0B,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #821 + INST(Uiret , X86Op , O(F30F01,EC,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 26 ), // #822 + INST(Umonitor , X86R_FromM , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 197, 143), // #823 + INST(Umwait , X86R32_EDX_EAX , O(F20F00,AE,6,_,_,_,_,_ ), 0 , 101, 0 , 195, 142), // #824 + INST(Unpckhpd , ExtRm , O(660F00,15,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #825 + INST(Unpckhps , ExtRm , O(000F00,15,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #826 + INST(Unpcklpd , ExtRm , O(660F00,14,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #827 + INST(Unpcklps , ExtRm , O(000F00,14,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #828 + INST(V4fmaddps , VexRm_T1_4X , E(F20F38,9A,_,2,_,0,4,T4X), 0 , 102, 0 , 198, 144), // #829 + INST(V4fmaddss , VexRm_T1_4X , E(F20F38,9B,_,0,_,0,4,T4X), 0 , 103, 0 , 199, 144), // #830 + INST(V4fnmaddps , VexRm_T1_4X , E(F20F38,AA,_,2,_,0,4,T4X), 0 , 102, 0 , 198, 144), // #831 + INST(V4fnmaddss , VexRm_T1_4X , E(F20F38,AB,_,0,_,0,4,T4X), 0 , 103, 0 , 199, 144), // #832 + INST(Vaddpd , VexRvm_Lx , V(660F00,58,_,x,I,1,4,FV ), 0 , 104, 0 , 200, 145), // #833 + INST(Vaddph , VexRvm_Lx , E(00MAP5,58,_,_,_,0,4,FV ), 0 , 105, 0 , 201, 146), // #834 + INST(Vaddps , VexRvm_Lx , V(000F00,58,_,x,I,0,4,FV ), 0 , 106, 0 , 202, 145), // #835 + INST(Vaddsd , VexRvm , V(F20F00,58,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #836 + INST(Vaddsh , VexRvm , E(F3MAP5,58,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #837 + INST(Vaddss , VexRvm , V(F30F00,58,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #838 + INST(Vaddsubpd , VexRvm_Lx , V(660F00,D0,_,x,I,_,_,_ ), 0 , 71 , 0 , 206, 149), // #839 + INST(Vaddsubps , VexRvm_Lx , V(F20F00,D0,_,x,I,_,_,_ ), 0 , 110, 0 , 206, 149), // #840 + INST(Vaesdec , VexRvm_Lx , V(660F38,DE,_,x,I,_,4,FVM), 0 , 111, 0 , 207, 150), // #841 + INST(Vaesdeclast , VexRvm_Lx , V(660F38,DF,_,x,I,_,4,FVM), 0 , 111, 0 , 207, 150), // #842 + INST(Vaesenc , VexRvm_Lx , V(660F38,DC,_,x,I,_,4,FVM), 0 , 111, 0 , 207, 150), // #843 + INST(Vaesenclast , VexRvm_Lx , V(660F38,DD,_,x,I,_,4,FVM), 0 , 111, 0 , 207, 150), // #844 + INST(Vaesimc , VexRm , V(660F38,DB,_,0,I,_,_,_ ), 0 , 30 , 0 , 208, 151), // #845 + INST(Vaeskeygenassist , VexRmi , V(660F3A,DF,_,0,I,_,_,_ ), 0 , 75 , 0 , 209, 151), // #846 + INST(Valignd , VexRvmi_Lx , E(660F3A,03,_,x,_,0,4,FV ), 0 , 112, 0 , 210, 152), // #847 + INST(Valignq , VexRvmi_Lx , E(660F3A,03,_,x,_,1,4,FV ), 0 , 113, 0 , 211, 152), // #848 + INST(Vandnpd , VexRvm_Lx , V(660F00,55,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 153), // #849 + INST(Vandnps , VexRvm_Lx , V(000F00,55,_,x,I,0,4,FV ), 0 , 106, 0 , 213, 153), // #850 + INST(Vandpd , VexRvm_Lx , V(660F00,54,_,x,I,1,4,FV ), 0 , 104, 0 , 214, 153), // #851 + INST(Vandps , VexRvm_Lx , V(000F00,54,_,x,I,0,4,FV ), 0 , 106, 0 , 215, 153), // #852 + INST(Vbcstnebf162ps , VexRm_Lx , V(F30F38,B1,_,x,0,_,_,_ ), 0 , 89 , 0 , 216, 154), // #853 + INST(Vbcstnesh2ps , VexRm_Lx , V(660F38,B1,_,x,0,_,_,_ ), 0 , 30 , 0 , 216, 154), // #854 + INST(Vblendmpd , VexRvm_Lx , E(660F38,65,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #855 + INST(Vblendmps , VexRvm_Lx , E(660F38,65,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #856 + INST(Vblendpd , VexRvmi_Lx , V(660F3A,0D,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 149), // #857 + INST(Vblendps , VexRvmi_Lx , V(660F3A,0C,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 149), // #858 + INST(Vblendvpd , VexRvmr_Lx , V(660F3A,4B,_,x,0,_,_,_ ), 0 , 75 , 0 , 220, 149), // #859 + INST(Vblendvps , VexRvmr_Lx , V(660F3A,4A,_,x,0,_,_,_ ), 0 , 75 , 0 , 220, 149), // #860 + INST(Vbroadcastf128 , VexRm , V(660F38,1A,_,1,0,_,_,_ ), 0 , 116, 0 , 221, 149), // #861 + INST(Vbroadcastf32x2 , VexRm_Lx , E(660F38,19,_,x,_,0,3,T2 ), 0 , 117, 0 , 222, 155), // #862 + INST(Vbroadcastf32x4 , VexRm_Lx , E(660F38,1A,_,x,_,0,4,T4 ), 0 , 118, 0 , 223, 78 ), // #863 + INST(Vbroadcastf32x8 , VexRm , E(660F38,1B,_,2,_,0,5,T8 ), 0 , 119, 0 , 224, 76 ), // #864 + INST(Vbroadcastf64x2 , VexRm_Lx , E(660F38,1A,_,x,_,1,4,T2 ), 0 , 120, 0 , 223, 155), // #865 + INST(Vbroadcastf64x4 , VexRm , E(660F38,1B,_,2,_,1,5,T4 ), 0 , 121, 0 , 224, 78 ), // #866 + INST(Vbroadcasti128 , VexRm , V(660F38,5A,_,1,0,_,_,_ ), 0 , 116, 0 , 221, 156), // #867 + INST(Vbroadcasti32x2 , VexRm_Lx , E(660F38,59,_,x,_,0,3,T2 ), 0 , 117, 0 , 225, 155), // #868 + INST(Vbroadcasti32x4 , VexRm_Lx , E(660F38,5A,_,x,_,0,4,T4 ), 0 , 118, 0 , 223, 152), // #869 + INST(Vbroadcasti32x8 , VexRm , E(660F38,5B,_,2,_,0,5,T8 ), 0 , 119, 0 , 224, 76 ), // #870 + INST(Vbroadcasti64x2 , VexRm_Lx , E(660F38,5A,_,x,_,1,4,T2 ), 0 , 120, 0 , 223, 155), // #871 + INST(Vbroadcasti64x4 , VexRm , E(660F38,5B,_,2,_,1,5,T4 ), 0 , 121, 0 , 224, 78 ), // #872 + INST(Vbroadcastsd , VexRm_Lx , V(660F38,19,_,x,0,1,3,T1S), 0 , 122, 0 , 226, 157), // #873 + INST(Vbroadcastss , VexRm_Lx , V(660F38,18,_,x,0,0,2,T1S), 0 , 123, 0 , 227, 157), // #874 + INST(Vcmppd , VexRvmi_Lx_KEvex , V(660F00,C2,_,x,I,1,4,FV ), 0 , 104, 0 , 228, 145), // #875 + INST(Vcmpph , VexRvmi_Lx_KEvex , E(000F3A,C2,_,_,_,0,4,FV ), 0 , 124, 0 , 229, 146), // #876 + INST(Vcmpps , VexRvmi_Lx_KEvex , V(000F00,C2,_,x,I,0,4,FV ), 0 , 106, 0 , 230, 145), // #877 + INST(Vcmpsd , VexRvmi_KEvex , V(F20F00,C2,_,I,I,1,3,T1S), 0 , 107, 0 , 231, 147), // #878 + INST(Vcmpsh , VexRvmi_KEvex , E(F30F3A,C2,_,_,_,0,1,T1S), 0 , 125, 0 , 232, 148), // #879 + INST(Vcmpss , VexRvmi_KEvex , V(F30F00,C2,_,I,I,0,2,T1S), 0 , 109, 0 , 233, 147), // #880 + INST(Vcomisd , VexRm , V(660F00,2F,_,I,I,1,3,T1S), 0 , 126, 0 , 234, 158), // #881 + INST(Vcomish , VexRm , E(00MAP5,2F,_,_,_,0,1,T1S), 0 , 127, 0 , 235, 159), // #882 + INST(Vcomiss , VexRm , V(000F00,2F,_,I,I,0,2,T1S), 0 , 128, 0 , 236, 158), // #883 + INST(Vcompresspd , VexMr_Lx , E(660F38,8A,_,x,_,1,3,T1S), 0 , 129, 0 , 237, 152), // #884 + INST(Vcompressps , VexMr_Lx , E(660F38,8A,_,x,_,0,2,T1S), 0 , 130, 0 , 237, 152), // #885 + INST(Vcvtdq2pd , VexRm_Lx , V(F30F00,E6,_,x,I,0,3,HV ), 0 , 131, 0 , 238, 145), // #886 + INST(Vcvtdq2ph , VexRm_Lx_Narrow , E(00MAP5,5B,_,x,0,0,4,FV ), 0 , 105, 0 , 239, 146), // #887 + INST(Vcvtdq2ps , VexRm_Lx , V(000F00,5B,_,x,I,0,4,FV ), 0 , 106, 0 , 240, 145), // #888 + INST(Vcvtne2ps2bf16 , VexRvm_Lx , E(F20F38,72,_,_,_,0,4,FV ), 0 , 132, 0 , 218, 160), // #889 + INST(Vcvtneebf162ps , VexRm_Lx , V(F30F38,B0,_,x,0,_,_,_ ), 0 , 89 , 0 , 241, 154), // #890 + INST(Vcvtneeph2ps , VexRm_Lx , V(660F38,B0,_,x,0,_,_,_ ), 0 , 30 , 0 , 241, 154), // #891 + INST(Vcvtneobf162ps , VexRm_Lx , V(F20F38,B0,_,x,0,_,_,_ ), 0 , 85 , 0 , 241, 154), // #892 + INST(Vcvtneoph2ps , VexRm_Lx , V(000F38,B0,_,x,0,_,_,_ ), 0 , 11 , 0 , 241, 154), // #893 + INST(Vcvtneps2bf16 , VexRm_Lx_Narrow , V(F30F38,72,_,_,_,0,4,FV ), 0 , 133, 0 , 242, 161), // #894 + INST(Vcvtpd2dq , VexRm_Lx_Narrow , V(F20F00,E6,_,x,I,1,4,FV ), 0 , 134, 0 , 243, 145), // #895 + INST(Vcvtpd2ph , VexRm_Lx , E(66MAP5,5A,_,_,_,1,4,FV ), 0 , 135, 0 , 244, 146), // #896 + INST(Vcvtpd2ps , VexRm_Lx_Narrow , V(660F00,5A,_,x,I,1,4,FV ), 0 , 104, 0 , 243, 145), // #897 + INST(Vcvtpd2qq , VexRm_Lx , E(660F00,7B,_,x,_,1,4,FV ), 0 , 136, 0 , 245, 155), // #898 + INST(Vcvtpd2udq , VexRm_Lx_Narrow , E(000F00,79,_,x,_,1,4,FV ), 0 , 137, 0 , 246, 152), // #899 + INST(Vcvtpd2uqq , VexRm_Lx , E(660F00,79,_,x,_,1,4,FV ), 0 , 136, 0 , 245, 155), // #900 + INST(Vcvtph2dq , VexRm_Lx , E(66MAP5,5B,_,_,_,0,3,HV ), 0 , 138, 0 , 247, 146), // #901 + INST(Vcvtph2pd , VexRm_Lx , E(00MAP5,5A,_,_,_,0,2,QV ), 0 , 139, 0 , 248, 146), // #902 + INST(Vcvtph2ps , VexRm_Lx , V(660F38,13,_,x,0,0,3,HVM), 0 , 140, 0 , 249, 162), // #903 + INST(Vcvtph2psx , VexRm_Lx , E(66MAP6,13,_,_,_,0,3,HV ), 0 , 141, 0 , 250, 146), // #904 + INST(Vcvtph2qq , VexRm_Lx , E(66MAP5,7B,_,_,_,0,2,QV ), 0 , 142, 0 , 251, 146), // #905 + INST(Vcvtph2udq , VexRm_Lx , E(00MAP5,79,_,_,_,0,3,HV ), 0 , 143, 0 , 247, 146), // #906 + INST(Vcvtph2uqq , VexRm_Lx , E(66MAP5,79,_,_,_,0,2,QV ), 0 , 142, 0 , 251, 146), // #907 + INST(Vcvtph2uw , VexRm_Lx , E(00MAP5,7D,_,_,_,0,4,FV ), 0 , 105, 0 , 252, 146), // #908 + INST(Vcvtph2w , VexRm_Lx , E(66MAP5,7D,_,_,_,0,4,FV ), 0 , 144, 0 , 252, 146), // #909 + INST(Vcvtps2dq , VexRm_Lx , V(660F00,5B,_,x,I,0,4,FV ), 0 , 145, 0 , 240, 145), // #910 + INST(Vcvtps2pd , VexRm_Lx , V(000F00,5A,_,x,I,0,3,HV ), 0 , 146, 0 , 253, 145), // #911 + INST(Vcvtps2ph , VexMri_Lx , V(660F3A,1D,_,x,0,0,3,HVM), 0 , 147, 0 , 254, 162), // #912 + INST(Vcvtps2phx , VexRm_Lx_Narrow , E(66MAP5,1D,_,_,_,0,4,FV ), 0 , 144, 0 , 239, 146), // #913 + INST(Vcvtps2qq , VexRm_Lx , E(660F00,7B,_,x,_,0,3,HV ), 0 , 148, 0 , 255, 155), // #914 + INST(Vcvtps2udq , VexRm_Lx , E(000F00,79,_,x,_,0,4,FV ), 0 , 149, 0 , 256, 152), // #915 + INST(Vcvtps2uqq , VexRm_Lx , E(660F00,79,_,x,_,0,3,HV ), 0 , 148, 0 , 255, 155), // #916 + INST(Vcvtqq2pd , VexRm_Lx , E(F30F00,E6,_,x,_,1,4,FV ), 0 , 150, 0 , 245, 155), // #917 + INST(Vcvtqq2ph , VexRm_Lx , E(00MAP5,5B,_,_,_,1,4,FV ), 0 , 151, 0 , 244, 146), // #918 + INST(Vcvtqq2ps , VexRm_Lx_Narrow , E(000F00,5B,_,x,_,1,4,FV ), 0 , 137, 0 , 246, 155), // #919 + INST(Vcvtsd2sh , VexRvm , E(F2MAP5,5A,_,_,_,1,3,T1S), 0 , 152, 0 , 257, 148), // #920 + INST(Vcvtsd2si , VexRm_Wx , V(F20F00,2D,_,I,x,x,3,T1F), 0 , 153, 0 , 258, 147), // #921 + INST(Vcvtsd2ss , VexRvm , V(F20F00,5A,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #922 + INST(Vcvtsd2usi , VexRm_Wx , E(F20F00,79,_,I,_,x,3,T1F), 0 , 154, 0 , 259, 78 ), // #923 + INST(Vcvtsh2sd , VexRvm , E(F3MAP5,5A,_,_,_,0,1,T1S), 0 , 108, 0 , 260, 148), // #924 + INST(Vcvtsh2si , VexRm_Wx , E(F3MAP5,2D,_,_,_,x,1,T1S), 0 , 108, 0 , 261, 148), // #925 + INST(Vcvtsh2ss , VexRvm , E(00MAP6,13,_,_,_,0,1,T1S), 0 , 155, 0 , 260, 148), // #926 + INST(Vcvtsh2usi , VexRm_Wx , E(F3MAP5,79,_,_,_,x,1,T1S), 0 , 108, 0 , 261, 148), // #927 + INST(Vcvtsi2sd , VexRvm_Wx , V(F20F00,2A,_,I,x,x,2,T1W), 0 , 156, 0 , 262, 147), // #928 + INST(Vcvtsi2sh , VexRvm_Wx , E(F3MAP5,2A,_,_,_,x,2,T1W), 0 , 157, 0 , 263, 148), // #929 + INST(Vcvtsi2ss , VexRvm_Wx , V(F30F00,2A,_,I,x,x,2,T1W), 0 , 158, 0 , 262, 147), // #930 + INST(Vcvtss2sd , VexRvm , V(F30F00,5A,_,I,I,0,2,T1S), 0 , 109, 0 , 264, 147), // #931 + INST(Vcvtss2sh , VexRvm , E(00MAP5,1D,_,_,_,0,2,T1S), 0 , 159, 0 , 265, 148), // #932 + INST(Vcvtss2si , VexRm_Wx , V(F30F00,2D,_,I,x,x,2,T1F), 0 , 109, 0 , 266, 147), // #933 + INST(Vcvtss2usi , VexRm_Wx , E(F30F00,79,_,I,_,x,2,T1F), 0 , 160, 0 , 267, 78 ), // #934 + INST(Vcvttpd2dq , VexRm_Lx_Narrow , V(660F00,E6,_,x,I,1,4,FV ), 0 , 104, 0 , 268, 145), // #935 + INST(Vcvttpd2qq , VexRm_Lx , E(660F00,7A,_,x,_,1,4,FV ), 0 , 136, 0 , 269, 152), // #936 + INST(Vcvttpd2udq , VexRm_Lx_Narrow , E(000F00,78,_,x,_,1,4,FV ), 0 , 137, 0 , 270, 152), // #937 + INST(Vcvttpd2uqq , VexRm_Lx , E(660F00,78,_,x,_,1,4,FV ), 0 , 136, 0 , 269, 155), // #938 + INST(Vcvttph2dq , VexRm_Lx , E(F3MAP5,5B,_,_,_,0,3,HV ), 0 , 161, 0 , 250, 146), // #939 + INST(Vcvttph2qq , VexRm_Lx , E(66MAP5,7A,_,_,_,0,2,QV ), 0 , 142, 0 , 248, 146), // #940 + INST(Vcvttph2udq , VexRm_Lx , E(00MAP5,78,_,_,_,0,3,HV ), 0 , 143, 0 , 250, 146), // #941 + INST(Vcvttph2uqq , VexRm_Lx , E(66MAP5,78,_,_,_,0,2,QV ), 0 , 142, 0 , 248, 146), // #942 + INST(Vcvttph2uw , VexRm_Lx , E(00MAP5,7C,_,_,_,0,4,FV ), 0 , 105, 0 , 271, 146), // #943 + INST(Vcvttph2w , VexRm_Lx , E(66MAP5,7C,_,_,_,0,4,FV ), 0 , 144, 0 , 271, 146), // #944 + INST(Vcvttps2dq , VexRm_Lx , V(F30F00,5B,_,x,I,0,4,FV ), 0 , 162, 0 , 272, 145), // #945 + INST(Vcvttps2qq , VexRm_Lx , E(660F00,7A,_,x,_,0,3,HV ), 0 , 148, 0 , 273, 155), // #946 + INST(Vcvttps2udq , VexRm_Lx , E(000F00,78,_,x,_,0,4,FV ), 0 , 149, 0 , 274, 152), // #947 + INST(Vcvttps2uqq , VexRm_Lx , E(660F00,78,_,x,_,0,3,HV ), 0 , 148, 0 , 273, 155), // #948 + INST(Vcvttsd2si , VexRm_Wx , V(F20F00,2C,_,I,x,x,3,T1F), 0 , 153, 0 , 275, 147), // #949 + INST(Vcvttsd2usi , VexRm_Wx , E(F20F00,78,_,I,_,x,3,T1F), 0 , 154, 0 , 276, 78 ), // #950 + INST(Vcvttsh2si , VexRm_Wx , E(F3MAP5,2C,_,_,_,x,1,T1S), 0 , 108, 0 , 277, 148), // #951 + INST(Vcvttsh2usi , VexRm_Wx , E(F3MAP5,78,_,_,_,x,1,T1S), 0 , 108, 0 , 277, 148), // #952 + INST(Vcvttss2si , VexRm_Wx , V(F30F00,2C,_,I,x,x,2,T1F), 0 , 109, 0 , 278, 147), // #953 + INST(Vcvttss2usi , VexRm_Wx , E(F30F00,78,_,I,_,x,2,T1F), 0 , 160, 0 , 279, 78 ), // #954 + INST(Vcvtudq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,0,3,HV ), 0 , 163, 0 , 280, 152), // #955 + INST(Vcvtudq2ph , VexRm_Lx_Narrow , E(F2MAP5,7A,_,_,_,0,4,FV ), 0 , 164, 0 , 239, 146), // #956 + INST(Vcvtudq2ps , VexRm_Lx , E(F20F00,7A,_,x,_,0,4,FV ), 0 , 165, 0 , 256, 152), // #957 + INST(Vcvtuqq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,1,4,FV ), 0 , 150, 0 , 245, 155), // #958 + INST(Vcvtuqq2ph , VexRm_Lx , E(F2MAP5,7A,_,_,_,1,4,FV ), 0 , 166, 0 , 244, 146), // #959 + INST(Vcvtuqq2ps , VexRm_Lx_Narrow , E(F20F00,7A,_,x,_,1,4,FV ), 0 , 167, 0 , 246, 155), // #960 + INST(Vcvtusi2sd , VexRvm_Wx , E(F20F00,7B,_,I,_,x,2,T1W), 0 , 168, 0 , 281, 78 ), // #961 + INST(Vcvtusi2sh , VexRvm_Wx , E(F3MAP5,7B,_,_,_,x,2,T1W), 0 , 157, 0 , 263, 148), // #962 + INST(Vcvtusi2ss , VexRvm_Wx , E(F30F00,7B,_,I,_,x,2,T1W), 0 , 169, 0 , 281, 78 ), // #963 + INST(Vcvtuw2ph , VexRm_Lx , E(F2MAP5,7D,_,_,_,0,4,FV ), 0 , 164, 0 , 252, 146), // #964 + INST(Vcvtw2ph , VexRm_Lx , E(F3MAP5,7D,_,_,_,0,4,FV ), 0 , 170, 0 , 252, 146), // #965 + INST(Vdbpsadbw , VexRvmi_Lx , E(660F3A,42,_,x,_,0,4,FVM), 0 , 112, 0 , 282, 163), // #966 + INST(Vdivpd , VexRvm_Lx , V(660F00,5E,_,x,I,1,4,FV ), 0 , 104, 0 , 200, 145), // #967 + INST(Vdivph , VexRvm_Lx , E(00MAP5,5E,_,_,_,0,4,FV ), 0 , 105, 0 , 201, 146), // #968 + INST(Vdivps , VexRvm_Lx , V(000F00,5E,_,x,I,0,4,FV ), 0 , 106, 0 , 202, 145), // #969 + INST(Vdivsd , VexRvm , V(F20F00,5E,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #970 + INST(Vdivsh , VexRvm , E(F3MAP5,5E,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #971 + INST(Vdivss , VexRvm , V(F30F00,5E,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #972 + INST(Vdpbf16ps , VexRvm_Lx , E(F30F38,52,_,_,_,0,4,FV ), 0 , 171, 0 , 218, 160), // #973 + INST(Vdppd , VexRvmi_Lx , V(660F3A,41,_,x,I,_,_,_ ), 0 , 75 , 0 , 283, 149), // #974 + INST(Vdpps , VexRvmi_Lx , V(660F3A,40,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 149), // #975 + INST(Verr , X86M_NoSize , O(000F00,00,4,_,_,_,_,_ ), 0 , 98 , 0 , 112, 11 ), // #976 + INST(Verw , X86M_NoSize , O(000F00,00,5,_,_,_,_,_ ), 0 , 79 , 0 , 112, 11 ), // #977 + INST(Vexp2pd , VexRm , E(660F38,C8,_,2,_,1,4,FV ), 0 , 172, 0 , 284, 164), // #978 + INST(Vexp2ps , VexRm , E(660F38,C8,_,2,_,0,4,FV ), 0 , 173, 0 , 285, 164), // #979 + INST(Vexpandpd , VexRm_Lx , E(660F38,88,_,x,_,1,3,T1S), 0 , 129, 0 , 286, 152), // #980 + INST(Vexpandps , VexRm_Lx , E(660F38,88,_,x,_,0,2,T1S), 0 , 130, 0 , 286, 152), // #981 + INST(Vextractf128 , VexMri , V(660F3A,19,_,1,0,_,_,_ ), 0 , 174, 0 , 287, 149), // #982 + INST(Vextractf32x4 , VexMri_Lx , E(660F3A,19,_,x,_,0,4,T4 ), 0 , 175, 0 , 288, 152), // #983 + INST(Vextractf32x8 , VexMri , E(660F3A,1B,_,2,_,0,5,T8 ), 0 , 176, 0 , 289, 76 ), // #984 + INST(Vextractf64x2 , VexMri_Lx , E(660F3A,19,_,x,_,1,4,T2 ), 0 , 177, 0 , 288, 155), // #985 + INST(Vextractf64x4 , VexMri , E(660F3A,1B,_,2,_,1,5,T4 ), 0 , 178, 0 , 289, 78 ), // #986 + INST(Vextracti128 , VexMri , V(660F3A,39,_,1,0,_,_,_ ), 0 , 174, 0 , 287, 156), // #987 + INST(Vextracti32x4 , VexMri_Lx , E(660F3A,39,_,x,_,0,4,T4 ), 0 , 175, 0 , 288, 152), // #988 + INST(Vextracti32x8 , VexMri , E(660F3A,3B,_,2,_,0,5,T8 ), 0 , 176, 0 , 289, 76 ), // #989 + INST(Vextracti64x2 , VexMri_Lx , E(660F3A,39,_,x,_,1,4,T2 ), 0 , 177, 0 , 288, 155), // #990 + INST(Vextracti64x4 , VexMri , E(660F3A,3B,_,2,_,1,5,T4 ), 0 , 178, 0 , 289, 78 ), // #991 + INST(Vextractps , VexMri , V(660F3A,17,_,0,I,I,2,T1S), 0 , 179, 0 , 290, 147), // #992 + INST(Vfcmaddcph , VexRvm_Lx , E(F2MAP6,56,_,_,_,0,4,FV ), 0 , 180, 0 , 291, 146), // #993 + INST(Vfcmaddcsh , VexRvm , E(F2MAP6,57,_,_,_,0,2,T1S), 0 , 181, 0 , 265, 148), // #994 + INST(Vfcmulcph , VexRvm_Lx , E(F2MAP6,D6,_,_,_,0,4,FV ), 0 , 180, 0 , 291, 146), // #995 + INST(Vfcmulcsh , VexRvm , E(F2MAP6,D7,_,_,_,0,2,T1S), 0 , 181, 0 , 265, 148), // #996 + INST(Vfixupimmpd , VexRvmi_Lx , E(660F3A,54,_,x,_,1,4,FV ), 0 , 113, 0 , 292, 152), // #997 + INST(Vfixupimmps , VexRvmi_Lx , E(660F3A,54,_,x,_,0,4,FV ), 0 , 112, 0 , 293, 152), // #998 + INST(Vfixupimmsd , VexRvmi , E(660F3A,55,_,I,_,1,3,T1S), 0 , 182, 0 , 294, 78 ), // #999 + INST(Vfixupimmss , VexRvmi , E(660F3A,55,_,I,_,0,2,T1S), 0 , 183, 0 , 295, 78 ), // #1000 + INST(Vfmadd132pd , VexRvm_Lx , V(660F38,98,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1001 + INST(Vfmadd132ph , VexRvm_Lx , E(66MAP6,98,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1002 + INST(Vfmadd132ps , VexRvm_Lx , V(660F38,98,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1003 + INST(Vfmadd132sd , VexRvm , V(660F38,99,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1004 + INST(Vfmadd132sh , VexRvm , E(66MAP6,99,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1005 + INST(Vfmadd132ss , VexRvm , V(660F38,99,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1006 + INST(Vfmadd213pd , VexRvm_Lx , V(660F38,A8,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1007 + INST(Vfmadd213ph , VexRvm_Lx , E(66MAP6,A8,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1008 + INST(Vfmadd213ps , VexRvm_Lx , V(660F38,A8,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1009 + INST(Vfmadd213sd , VexRvm , V(660F38,A9,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1010 + INST(Vfmadd213sh , VexRvm , E(66MAP6,A9,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1011 + INST(Vfmadd213ss , VexRvm , V(660F38,A9,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1012 + INST(Vfmadd231pd , VexRvm_Lx , V(660F38,B8,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1013 + INST(Vfmadd231ph , VexRvm_Lx , E(66MAP6,B8,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1014 + INST(Vfmadd231ps , VexRvm_Lx , V(660F38,B8,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1015 + INST(Vfmadd231sd , VexRvm , V(660F38,B9,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1016 + INST(Vfmadd231sh , VexRvm , E(66MAP6,B9,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1017 + INST(Vfmadd231ss , VexRvm , V(660F38,B9,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1018 + INST(Vfmaddcph , VexRvm_Lx , E(F3MAP6,56,_,_,_,0,4,FV ), 0 , 188, 0 , 291, 146), // #1019 + INST(Vfmaddcsh , VexRvm , E(F3MAP6,57,_,_,_,0,2,T1S), 0 , 189, 0 , 265, 148), // #1020 + INST(Vfmaddpd , Fma4_Lx , V(660F3A,69,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1021 + INST(Vfmaddps , Fma4_Lx , V(660F3A,68,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1022 + INST(Vfmaddsd , Fma4 , V(660F3A,6B,_,0,x,_,_,_ ), 0 , 75 , 0 , 297, 167), // #1023 + INST(Vfmaddss , Fma4 , V(660F3A,6A,_,0,x,_,_,_ ), 0 , 75 , 0 , 298, 167), // #1024 + INST(Vfmaddsub132pd , VexRvm_Lx , V(660F38,96,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1025 + INST(Vfmaddsub132ph , VexRvm_Lx , E(66MAP6,96,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1026 + INST(Vfmaddsub132ps , VexRvm_Lx , V(660F38,96,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1027 + INST(Vfmaddsub213pd , VexRvm_Lx , V(660F38,A6,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1028 + INST(Vfmaddsub213ph , VexRvm_Lx , E(66MAP6,A6,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1029 + INST(Vfmaddsub213ps , VexRvm_Lx , V(660F38,A6,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1030 + INST(Vfmaddsub231pd , VexRvm_Lx , V(660F38,B6,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1031 + INST(Vfmaddsub231ph , VexRvm_Lx , E(66MAP6,B6,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1032 + INST(Vfmaddsub231ps , VexRvm_Lx , V(660F38,B6,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1033 + INST(Vfmaddsubpd , Fma4_Lx , V(660F3A,5D,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1034 + INST(Vfmaddsubps , Fma4_Lx , V(660F3A,5C,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1035 + INST(Vfmsub132pd , VexRvm_Lx , V(660F38,9A,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1036 + INST(Vfmsub132ph , VexRvm_Lx , E(66MAP6,9A,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1037 + INST(Vfmsub132ps , VexRvm_Lx , V(660F38,9A,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1038 + INST(Vfmsub132sd , VexRvm , V(660F38,9B,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1039 + INST(Vfmsub132sh , VexRvm , E(66MAP6,9B,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1040 + INST(Vfmsub132ss , VexRvm , V(660F38,9B,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1041 + INST(Vfmsub213pd , VexRvm_Lx , V(660F38,AA,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1042 + INST(Vfmsub213ph , VexRvm_Lx , E(66MAP6,AA,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1043 + INST(Vfmsub213ps , VexRvm_Lx , V(660F38,AA,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1044 + INST(Vfmsub213sd , VexRvm , V(660F38,AB,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1045 + INST(Vfmsub213sh , VexRvm , E(66MAP6,AB,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1046 + INST(Vfmsub213ss , VexRvm , V(660F38,AB,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1047 + INST(Vfmsub231pd , VexRvm_Lx , V(660F38,BA,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1048 + INST(Vfmsub231ph , VexRvm_Lx , E(66MAP6,BA,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1049 + INST(Vfmsub231ps , VexRvm_Lx , V(660F38,BA,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1050 + INST(Vfmsub231sd , VexRvm , V(660F38,BB,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1051 + INST(Vfmsub231sh , VexRvm , E(66MAP6,BB,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1052 + INST(Vfmsub231ss , VexRvm , V(660F38,BB,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1053 + INST(Vfmsubadd132pd , VexRvm_Lx , V(660F38,97,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1054 + INST(Vfmsubadd132ph , VexRvm_Lx , E(66MAP6,97,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1055 + INST(Vfmsubadd132ps , VexRvm_Lx , V(660F38,97,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1056 + INST(Vfmsubadd213pd , VexRvm_Lx , V(660F38,A7,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1057 + INST(Vfmsubadd213ph , VexRvm_Lx , E(66MAP6,A7,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1058 + INST(Vfmsubadd213ps , VexRvm_Lx , V(660F38,A7,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1059 + INST(Vfmsubadd231pd , VexRvm_Lx , V(660F38,B7,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1060 + INST(Vfmsubadd231ph , VexRvm_Lx , E(66MAP6,B7,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1061 + INST(Vfmsubadd231ps , VexRvm_Lx , V(660F38,B7,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1062 + INST(Vfmsubaddpd , Fma4_Lx , V(660F3A,5F,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1063 + INST(Vfmsubaddps , Fma4_Lx , V(660F3A,5E,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1064 + INST(Vfmsubpd , Fma4_Lx , V(660F3A,6D,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1065 + INST(Vfmsubps , Fma4_Lx , V(660F3A,6C,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1066 + INST(Vfmsubsd , Fma4 , V(660F3A,6F,_,0,x,_,_,_ ), 0 , 75 , 0 , 297, 167), // #1067 + INST(Vfmsubss , Fma4 , V(660F3A,6E,_,0,x,_,_,_ ), 0 , 75 , 0 , 298, 167), // #1068 + INST(Vfmulcph , VexRvm_Lx , E(F3MAP6,D6,_,_,_,0,4,FV ), 0 , 188, 0 , 291, 146), // #1069 + INST(Vfmulcsh , VexRvm , E(F3MAP6,D7,_,_,_,0,2,T1S), 0 , 189, 0 , 265, 146), // #1070 + INST(Vfnmadd132pd , VexRvm_Lx , V(660F38,9C,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1071 + INST(Vfnmadd132ph , VexRvm_Lx , E(66MAP6,9C,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1072 + INST(Vfnmadd132ps , VexRvm_Lx , V(660F38,9C,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1073 + INST(Vfnmadd132sd , VexRvm , V(660F38,9D,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1074 + INST(Vfnmadd132sh , VexRvm , E(66MAP6,9D,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1075 + INST(Vfnmadd132ss , VexRvm , V(660F38,9D,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1076 + INST(Vfnmadd213pd , VexRvm_Lx , V(660F38,AC,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1077 + INST(Vfnmadd213ph , VexRvm_Lx , E(66MAP6,AC,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1078 + INST(Vfnmadd213ps , VexRvm_Lx , V(660F38,AC,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1079 + INST(Vfnmadd213sd , VexRvm , V(660F38,AD,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1080 + INST(Vfnmadd213sh , VexRvm , E(66MAP6,AD,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1081 + INST(Vfnmadd213ss , VexRvm , V(660F38,AD,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1082 + INST(Vfnmadd231pd , VexRvm_Lx , V(660F38,BC,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1083 + INST(Vfnmadd231ph , VexRvm_Lx , E(66MAP6,BC,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1084 + INST(Vfnmadd231ps , VexRvm_Lx , V(660F38,BC,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1085 + INST(Vfnmadd231sd , VexRvm , V(660F38,BD,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1086 + INST(Vfnmadd231sh , VexRvm , E(66MAP6,BD,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1087 + INST(Vfnmadd231ss , VexRvm , V(660F38,BD,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1088 + INST(Vfnmaddpd , Fma4_Lx , V(660F3A,79,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1089 + INST(Vfnmaddps , Fma4_Lx , V(660F3A,78,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1090 + INST(Vfnmaddsd , Fma4 , V(660F3A,7B,_,0,x,_,_,_ ), 0 , 75 , 0 , 297, 167), // #1091 + INST(Vfnmaddss , Fma4 , V(660F3A,7A,_,0,x,_,_,_ ), 0 , 75 , 0 , 298, 167), // #1092 + INST(Vfnmsub132pd , VexRvm_Lx , V(660F38,9E,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1093 + INST(Vfnmsub132ph , VexRvm_Lx , E(66MAP6,9E,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1094 + INST(Vfnmsub132ps , VexRvm_Lx , V(660F38,9E,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1095 + INST(Vfnmsub132sd , VexRvm , V(660F38,9F,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1096 + INST(Vfnmsub132sh , VexRvm , E(66MAP6,9F,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1097 + INST(Vfnmsub132ss , VexRvm , V(660F38,9F,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1098 + INST(Vfnmsub213pd , VexRvm_Lx , V(660F38,AE,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1099 + INST(Vfnmsub213ph , VexRvm_Lx , E(66MAP6,AE,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1100 + INST(Vfnmsub213ps , VexRvm_Lx , V(660F38,AE,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1101 + INST(Vfnmsub213sd , VexRvm , V(660F38,AF,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1102 + INST(Vfnmsub213sh , VexRvm , E(66MAP6,AF,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1103 + INST(Vfnmsub213ss , VexRvm , V(660F38,AF,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1104 + INST(Vfnmsub231pd , VexRvm_Lx , V(660F38,BE,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1105 + INST(Vfnmsub231ph , VexRvm_Lx , E(66MAP6,BE,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1106 + INST(Vfnmsub231ps , VexRvm_Lx , V(660F38,BE,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1107 + INST(Vfnmsub231sd , VexRvm , V(660F38,BF,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1108 + INST(Vfnmsub231sh , VexRvm , E(66MAP6,BF,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1109 + INST(Vfnmsub231ss , VexRvm , V(660F38,BF,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1110 + INST(Vfnmsubpd , Fma4_Lx , V(660F3A,7D,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1111 + INST(Vfnmsubps , Fma4_Lx , V(660F3A,7C,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1112 + INST(Vfnmsubsd , Fma4 , V(660F3A,7F,_,0,x,_,_,_ ), 0 , 75 , 0 , 297, 167), // #1113 + INST(Vfnmsubss , Fma4 , V(660F3A,7E,_,0,x,_,_,_ ), 0 , 75 , 0 , 298, 167), // #1114 + INST(Vfpclasspd , VexRmi_Lx , E(660F3A,66,_,x,_,1,4,FV ), 0 , 113, 0 , 299, 155), // #1115 + INST(Vfpclassph , VexRmi_Lx , E(000F3A,66,_,_,_,0,4,FV ), 0 , 124, 0 , 300, 146), // #1116 + INST(Vfpclassps , VexRmi_Lx , E(660F3A,66,_,x,_,0,4,FV ), 0 , 112, 0 , 301, 155), // #1117 + INST(Vfpclasssd , VexRmi , E(660F3A,67,_,I,_,1,3,T1S), 0 , 182, 0 , 302, 76 ), // #1118 + INST(Vfpclasssh , VexRmi , E(000F3A,67,_,_,_,0,1,T1S), 0 , 190, 0 , 303, 148), // #1119 + INST(Vfpclassss , VexRmi , E(660F3A,67,_,I,_,0,2,T1S), 0 , 183, 0 , 304, 76 ), // #1120 + INST(Vfrczpd , VexRm_Lx , V(XOP_M9,81,_,x,0,_,_,_ ), 0 , 81 , 0 , 305, 168), // #1121 + INST(Vfrczps , VexRm_Lx , V(XOP_M9,80,_,x,0,_,_,_ ), 0 , 81 , 0 , 305, 168), // #1122 + INST(Vfrczsd , VexRm , V(XOP_M9,83,_,0,0,_,_,_ ), 0 , 81 , 0 , 306, 168), // #1123 + INST(Vfrczss , VexRm , V(XOP_M9,82,_,0,0,_,_,_ ), 0 , 81 , 0 , 307, 168), // #1124 + INST(Vgatherdpd , VexRmvRm_VM , V(660F38,92,_,x,1,_,_,_ ), E(660F38,92,_,x,_,1,3,T1S), 191, 80 , 308, 169), // #1125 + INST(Vgatherdps , VexRmvRm_VM , V(660F38,92,_,x,0,_,_,_ ), E(660F38,92,_,x,_,0,2,T1S), 30 , 81 , 309, 169), // #1126 + INST(Vgatherpf0dpd , VexM_VM , E(660F38,C6,1,2,_,1,3,T1S), 0 , 192, 0 , 310, 170), // #1127 + INST(Vgatherpf0dps , VexM_VM , E(660F38,C6,1,2,_,0,2,T1S), 0 , 193, 0 , 311, 170), // #1128 + INST(Vgatherpf0qpd , VexM_VM , E(660F38,C7,1,2,_,1,3,T1S), 0 , 192, 0 , 312, 170), // #1129 + INST(Vgatherpf0qps , VexM_VM , E(660F38,C7,1,2,_,0,2,T1S), 0 , 193, 0 , 312, 170), // #1130 + INST(Vgatherpf1dpd , VexM_VM , E(660F38,C6,2,2,_,1,3,T1S), 0 , 194, 0 , 310, 170), // #1131 + INST(Vgatherpf1dps , VexM_VM , E(660F38,C6,2,2,_,0,2,T1S), 0 , 195, 0 , 311, 170), // #1132 + INST(Vgatherpf1qpd , VexM_VM , E(660F38,C7,2,2,_,1,3,T1S), 0 , 194, 0 , 312, 170), // #1133 + INST(Vgatherpf1qps , VexM_VM , E(660F38,C7,2,2,_,0,2,T1S), 0 , 195, 0 , 312, 170), // #1134 + INST(Vgatherqpd , VexRmvRm_VM , V(660F38,93,_,x,1,_,_,_ ), E(660F38,93,_,x,_,1,3,T1S), 191, 82 , 313, 169), // #1135 + INST(Vgatherqps , VexRmvRm_VM , V(660F38,93,_,x,0,_,_,_ ), E(660F38,93,_,x,_,0,2,T1S), 30 , 83 , 314, 169), // #1136 + INST(Vgetexppd , VexRm_Lx , E(660F38,42,_,x,_,1,4,FV ), 0 , 114, 0 , 269, 152), // #1137 + INST(Vgetexpph , VexRm_Lx , E(66MAP6,42,_,_,_,0,4,FV ), 0 , 185, 0 , 271, 146), // #1138 + INST(Vgetexpps , VexRm_Lx , E(660F38,42,_,x,_,0,4,FV ), 0 , 115, 0 , 274, 152), // #1139 + INST(Vgetexpsd , VexRvm , E(660F38,43,_,I,_,1,3,T1S), 0 , 129, 0 , 315, 78 ), // #1140 + INST(Vgetexpsh , VexRvm , E(66MAP6,43,_,_,_,0,1,T1S), 0 , 187, 0 , 260, 148), // #1141 + INST(Vgetexpss , VexRvm , E(660F38,43,_,I,_,0,2,T1S), 0 , 130, 0 , 316, 78 ), // #1142 + INST(Vgetmantpd , VexRmi_Lx , E(660F3A,26,_,x,_,1,4,FV ), 0 , 113, 0 , 317, 152), // #1143 + INST(Vgetmantph , VexRmi_Lx , E(000F3A,26,_,_,_,0,4,FV ), 0 , 124, 0 , 318, 146), // #1144 + INST(Vgetmantps , VexRmi_Lx , E(660F3A,26,_,x,_,0,4,FV ), 0 , 112, 0 , 319, 152), // #1145 + INST(Vgetmantsd , VexRvmi , E(660F3A,27,_,I,_,1,3,T1S), 0 , 182, 0 , 294, 78 ), // #1146 + INST(Vgetmantsh , VexRvmi , E(000F3A,27,_,_,_,0,1,T1S), 0 , 190, 0 , 320, 148), // #1147 + INST(Vgetmantss , VexRvmi , E(660F3A,27,_,I,_,0,2,T1S), 0 , 183, 0 , 295, 78 ), // #1148 + INST(Vgf2p8affineinvqb, VexRvmi_Lx , V(660F3A,CF,_,x,1,1,4,FV ), 0 , 196, 0 , 321, 171), // #1149 + INST(Vgf2p8affineqb , VexRvmi_Lx , V(660F3A,CE,_,x,1,1,4,FV ), 0 , 196, 0 , 321, 171), // #1150 + INST(Vgf2p8mulb , VexRvm_Lx , V(660F38,CF,_,x,0,0,4,FV ), 0 , 111, 0 , 322, 171), // #1151 + INST(Vhaddpd , VexRvm_Lx , V(660F00,7C,_,x,I,_,_,_ ), 0 , 71 , 0 , 206, 149), // #1152 + INST(Vhaddps , VexRvm_Lx , V(F20F00,7C,_,x,I,_,_,_ ), 0 , 110, 0 , 206, 149), // #1153 + INST(Vhsubpd , VexRvm_Lx , V(660F00,7D,_,x,I,_,_,_ ), 0 , 71 , 0 , 206, 149), // #1154 + INST(Vhsubps , VexRvm_Lx , V(F20F00,7D,_,x,I,_,_,_ ), 0 , 110, 0 , 206, 149), // #1155 + INST(Vinsertf128 , VexRvmi , V(660F3A,18,_,1,0,_,_,_ ), 0 , 174, 0 , 323, 149), // #1156 + INST(Vinsertf32x4 , VexRvmi_Lx , E(660F3A,18,_,x,_,0,4,T4 ), 0 , 175, 0 , 324, 152), // #1157 + INST(Vinsertf32x8 , VexRvmi , E(660F3A,1A,_,2,_,0,5,T8 ), 0 , 176, 0 , 325, 76 ), // #1158 + INST(Vinsertf64x2 , VexRvmi_Lx , E(660F3A,18,_,x,_,1,4,T2 ), 0 , 177, 0 , 324, 155), // #1159 + INST(Vinsertf64x4 , VexRvmi , E(660F3A,1A,_,2,_,1,5,T4 ), 0 , 178, 0 , 325, 78 ), // #1160 + INST(Vinserti128 , VexRvmi , V(660F3A,38,_,1,0,_,_,_ ), 0 , 174, 0 , 323, 156), // #1161 + INST(Vinserti32x4 , VexRvmi_Lx , E(660F3A,38,_,x,_,0,4,T4 ), 0 , 175, 0 , 324, 152), // #1162 + INST(Vinserti32x8 , VexRvmi , E(660F3A,3A,_,2,_,0,5,T8 ), 0 , 176, 0 , 325, 76 ), // #1163 + INST(Vinserti64x2 , VexRvmi_Lx , E(660F3A,38,_,x,_,1,4,T2 ), 0 , 177, 0 , 324, 155), // #1164 + INST(Vinserti64x4 , VexRvmi , E(660F3A,3A,_,2,_,1,5,T4 ), 0 , 178, 0 , 325, 78 ), // #1165 + INST(Vinsertps , VexRvmi , V(660F3A,21,_,0,I,0,2,T1S), 0 , 179, 0 , 326, 147), // #1166 + INST(Vlddqu , VexRm_Lx , V(F20F00,F0,_,x,I,_,_,_ ), 0 , 110, 0 , 241, 149), // #1167 + INST(Vldmxcsr , VexM , V(000F00,AE,2,0,I,_,_,_ ), 0 , 197, 0 , 327, 149), // #1168 + INST(Vmaskmovdqu , VexRm_ZDI , V(660F00,F7,_,0,I,_,_,_ ), 0 , 71 , 0 , 328, 149), // #1169 + INST(Vmaskmovpd , VexRvmMvr_Lx , V(660F38,2D,_,x,0,_,_,_ ), V(660F38,2F,_,x,0,_,_,_ ), 30 , 84 , 329, 149), // #1170 + INST(Vmaskmovps , VexRvmMvr_Lx , V(660F38,2C,_,x,0,_,_,_ ), V(660F38,2E,_,x,0,_,_,_ ), 30 , 85 , 329, 149), // #1171 + INST(Vmaxpd , VexRvm_Lx , V(660F00,5F,_,x,I,1,4,FV ), 0 , 104, 0 , 330, 145), // #1172 + INST(Vmaxph , VexRvm_Lx , E(00MAP5,5F,_,_,_,0,4,FV ), 0 , 105, 0 , 331, 146), // #1173 + INST(Vmaxps , VexRvm_Lx , V(000F00,5F,_,x,I,0,4,FV ), 0 , 106, 0 , 332, 145), // #1174 + INST(Vmaxsd , VexRvm , V(F20F00,5F,_,I,I,1,3,T1S), 0 , 107, 0 , 333, 147), // #1175 + INST(Vmaxsh , VexRvm , E(F3MAP5,5F,_,_,_,0,1,T1S), 0 , 108, 0 , 260, 148), // #1176 + INST(Vmaxss , VexRvm , V(F30F00,5F,_,I,I,0,2,T1S), 0 , 109, 0 , 264, 147), // #1177 + INST(Vmcall , X86Op , O(000F01,C1,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1178 + INST(Vmclear , X86M_Only , O(660F00,C7,6,_,_,_,_,_ ), 0 , 28 , 0 , 33 , 67 ), // #1179 + INST(Vmfunc , X86Op , O(000F01,D4,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1180 + INST(Vmgexit , X86Op , O(F20F01,D9,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 172), // #1181 + INST(Vminpd , VexRvm_Lx , V(660F00,5D,_,x,I,1,4,FV ), 0 , 104, 0 , 330, 145), // #1182 + INST(Vminph , VexRvm_Lx , E(00MAP5,5D,_,_,_,0,4,FV ), 0 , 105, 0 , 331, 146), // #1183 + INST(Vminps , VexRvm_Lx , V(000F00,5D,_,x,I,0,4,FV ), 0 , 106, 0 , 332, 145), // #1184 + INST(Vminsd , VexRvm , V(F20F00,5D,_,I,I,1,3,T1S), 0 , 107, 0 , 333, 147), // #1185 + INST(Vminsh , VexRvm , E(F3MAP5,5D,_,_,_,0,1,T1S), 0 , 108, 0 , 260, 148), // #1186 + INST(Vminss , VexRvm , V(F30F00,5D,_,I,I,0,2,T1S), 0 , 109, 0 , 264, 147), // #1187 + INST(Vmlaunch , X86Op , O(000F01,C2,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1188 + INST(Vmload , X86Op_xAX , O(000F01,DA,_,_,_,_,_,_ ), 0 , 23 , 0 , 334, 23 ), // #1189 + INST(Vmmcall , X86Op , O(000F01,D9,_,_,_,_,_,_ ), 0 , 23 , 0 , 335, 23 ), // #1190 + INST(Vmovapd , VexRmMr_Lx , V(660F00,28,_,x,I,1,4,FVM), V(660F00,29,_,x,I,1,4,FVM), 104, 86 , 336, 173), // #1191 + INST(Vmovaps , VexRmMr_Lx , V(000F00,28,_,x,I,0,4,FVM), V(000F00,29,_,x,I,0,4,FVM), 106, 87 , 336, 173), // #1192 + INST(Vmovd , VexMovdMovq , V(660F00,6E,_,0,0,0,2,T1S), V(660F00,7E,_,0,0,0,2,T1S), 198, 88 , 337, 147), // #1193 + INST(Vmovddup , VexRm_Lx , V(F20F00,12,_,x,I,1,3,DUP), 0 , 199, 0 , 338, 145), // #1194 + INST(Vmovdqa , VexRmMr_Lx , V(660F00,6F,_,x,I,_,_,_ ), V(660F00,7F,_,x,I,_,_,_ ), 71 , 89 , 339, 174), // #1195 + INST(Vmovdqa32 , VexRmMr_Lx , E(660F00,6F,_,x,_,0,4,FVM), E(660F00,7F,_,x,_,0,4,FVM), 200, 90 , 340, 175), // #1196 + INST(Vmovdqa64 , VexRmMr_Lx , E(660F00,6F,_,x,_,1,4,FVM), E(660F00,7F,_,x,_,1,4,FVM), 136, 91 , 340, 175), // #1197 + INST(Vmovdqu , VexRmMr_Lx , V(F30F00,6F,_,x,I,_,_,_ ), V(F30F00,7F,_,x,I,_,_,_ ), 201, 92 , 339, 174), // #1198 + INST(Vmovdqu16 , VexRmMr_Lx , E(F20F00,6F,_,x,_,1,4,FVM), E(F20F00,7F,_,x,_,1,4,FVM), 167, 93 , 340, 176), // #1199 + INST(Vmovdqu32 , VexRmMr_Lx , E(F30F00,6F,_,x,_,0,4,FVM), E(F30F00,7F,_,x,_,0,4,FVM), 202, 94 , 340, 175), // #1200 + INST(Vmovdqu64 , VexRmMr_Lx , E(F30F00,6F,_,x,_,1,4,FVM), E(F30F00,7F,_,x,_,1,4,FVM), 150, 95 , 340, 175), // #1201 + INST(Vmovdqu8 , VexRmMr_Lx , E(F20F00,6F,_,x,_,0,4,FVM), E(F20F00,7F,_,x,_,0,4,FVM), 165, 96 , 340, 176), // #1202 + INST(Vmovhlps , VexRvm , V(000F00,12,_,0,I,0,_,_ ), 0 , 74 , 0 , 341, 147), // #1203 + INST(Vmovhpd , VexRvmMr , V(660F00,16,_,0,I,1,3,T1S), V(660F00,17,_,0,I,1,3,T1S), 126, 97 , 342, 147), // #1204 + INST(Vmovhps , VexRvmMr , V(000F00,16,_,0,I,0,3,T2 ), V(000F00,17,_,0,I,0,3,T2 ), 203, 98 , 342, 147), // #1205 + INST(Vmovlhps , VexRvm , V(000F00,16,_,0,I,0,_,_ ), 0 , 74 , 0 , 341, 147), // #1206 + INST(Vmovlpd , VexRvmMr , V(660F00,12,_,0,I,1,3,T1S), V(660F00,13,_,0,I,1,3,T1S), 126, 99 , 342, 147), // #1207 + INST(Vmovlps , VexRvmMr , V(000F00,12,_,0,I,0,3,T2 ), V(000F00,13,_,0,I,0,3,T2 ), 203, 100, 342, 147), // #1208 + INST(Vmovmskpd , VexRm_Lx , V(660F00,50,_,x,I,_,_,_ ), 0 , 71 , 0 , 343, 149), // #1209 + INST(Vmovmskps , VexRm_Lx , V(000F00,50,_,x,I,_,_,_ ), 0 , 74 , 0 , 343, 149), // #1210 + INST(Vmovntdq , VexMr_Lx , V(660F00,E7,_,x,I,0,4,FVM), 0 , 145, 0 , 344, 145), // #1211 + INST(Vmovntdqa , VexRm_Lx , V(660F38,2A,_,x,I,0,4,FVM), 0 , 111, 0 , 345, 157), // #1212 + INST(Vmovntpd , VexMr_Lx , V(660F00,2B,_,x,I,1,4,FVM), 0 , 104, 0 , 344, 145), // #1213 + INST(Vmovntps , VexMr_Lx , V(000F00,2B,_,x,I,0,4,FVM), 0 , 106, 0 , 344, 145), // #1214 + INST(Vmovq , VexMovdMovq , V(660F00,6E,_,0,I,1,3,T1S), V(660F00,7E,_,0,I,1,3,T1S), 126, 101, 346, 177), // #1215 + INST(Vmovsd , VexMovssMovsd , V(F20F00,10,_,I,I,1,3,T1S), V(F20F00,11,_,I,I,1,3,T1S), 107, 102, 347, 177), // #1216 + INST(Vmovsh , VexMovssMovsd , E(F3MAP5,10,_,I,_,0,1,T1S), E(F3MAP5,11,_,I,_,0,1,T1S), 108, 103, 348, 148), // #1217 + INST(Vmovshdup , VexRm_Lx , V(F30F00,16,_,x,I,0,4,FVM), 0 , 162, 0 , 349, 145), // #1218 + INST(Vmovsldup , VexRm_Lx , V(F30F00,12,_,x,I,0,4,FVM), 0 , 162, 0 , 349, 145), // #1219 + INST(Vmovss , VexMovssMovsd , V(F30F00,10,_,I,I,0,2,T1S), V(F30F00,11,_,I,I,0,2,T1S), 109, 104, 350, 177), // #1220 + INST(Vmovupd , VexRmMr_Lx , V(660F00,10,_,x,I,1,4,FVM), V(660F00,11,_,x,I,1,4,FVM), 104, 105, 336, 173), // #1221 + INST(Vmovups , VexRmMr_Lx , V(000F00,10,_,x,I,0,4,FVM), V(000F00,11,_,x,I,0,4,FVM), 106, 106, 336, 173), // #1222 + INST(Vmovw , VexMovdMovq , E(66MAP5,6E,_,0,_,I,1,T1S), E(66MAP5,7E,_,0,_,I,1,T1S), 204, 107, 351, 148), // #1223 + INST(Vmpsadbw , VexRvmi_Lx , V(660F3A,42,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 178), // #1224 + INST(Vmptrld , X86M_Only , O(000F00,C7,6,_,_,_,_,_ ), 0 , 82 , 0 , 33 , 67 ), // #1225 + INST(Vmptrst , X86M_Only , O(000F00,C7,7,_,_,_,_,_ ), 0 , 24 , 0 , 33 , 67 ), // #1226 + INST(Vmread , X86Mr_NoSize , O(000F00,78,_,_,_,_,_,_ ), 0 , 5 , 0 , 352, 67 ), // #1227 + INST(Vmresume , X86Op , O(000F01,C3,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1228 + INST(Vmrun , X86Op_xAX , O(000F01,D8,_,_,_,_,_,_ ), 0 , 23 , 0 , 334, 23 ), // #1229 + INST(Vmsave , X86Op_xAX , O(000F01,DB,_,_,_,_,_,_ ), 0 , 23 , 0 , 334, 23 ), // #1230 + INST(Vmulpd , VexRvm_Lx , V(660F00,59,_,x,I,1,4,FV ), 0 , 104, 0 , 200, 145), // #1231 + INST(Vmulph , VexRvm_Lx , E(00MAP5,59,_,_,_,0,4,FV ), 0 , 105, 0 , 201, 146), // #1232 + INST(Vmulps , VexRvm_Lx , V(000F00,59,_,x,I,0,4,FV ), 0 , 106, 0 , 202, 145), // #1233 + INST(Vmulsd , VexRvm , V(F20F00,59,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #1234 + INST(Vmulsh , VexRvm , E(F3MAP5,59,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #1235 + INST(Vmulss , VexRvm , V(F30F00,59,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #1236 + INST(Vmwrite , X86Rm_NoSize , O(000F00,79,_,_,_,_,_,_ ), 0 , 5 , 0 , 353, 67 ), // #1237 + INST(Vmxoff , X86Op , O(000F01,C4,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1238 + INST(Vmxon , X86M_Only , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 26 , 0 , 33 , 67 ), // #1239 + INST(Vorpd , VexRvm_Lx , V(660F00,56,_,x,I,1,4,FV ), 0 , 104, 0 , 214, 153), // #1240 + INST(Vorps , VexRvm_Lx , V(000F00,56,_,x,I,0,4,FV ), 0 , 106, 0 , 215, 153), // #1241 + INST(Vp2intersectd , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,0,4,FV ), 0 , 132, 0 , 354, 179), // #1242 + INST(Vp2intersectq , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,1,4,FV ), 0 , 205, 0 , 355, 179), // #1243 + INST(Vp4dpwssd , VexRm_T1_4X , E(F20F38,52,_,2,_,0,4,T4X), 0 , 102, 0 , 198, 180), // #1244 + INST(Vp4dpwssds , VexRm_T1_4X , E(F20F38,53,_,2,_,0,4,T4X), 0 , 102, 0 , 198, 180), // #1245 + INST(Vpabsb , VexRm_Lx , V(660F38,1C,_,x,I,_,4,FVM), 0 , 111, 0 , 349, 181), // #1246 + INST(Vpabsd , VexRm_Lx , V(660F38,1E,_,x,I,0,4,FV ), 0 , 111, 0 , 356, 157), // #1247 + INST(Vpabsq , VexRm_Lx , E(660F38,1F,_,x,_,1,4,FV ), 0 , 114, 0 , 357, 152), // #1248 + INST(Vpabsw , VexRm_Lx , V(660F38,1D,_,x,I,_,4,FVM), 0 , 111, 0 , 349, 181), // #1249 + INST(Vpackssdw , VexRvm_Lx , V(660F00,6B,_,x,I,0,4,FV ), 0 , 145, 0 , 213, 181), // #1250 + INST(Vpacksswb , VexRvm_Lx , V(660F00,63,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1251 + INST(Vpackusdw , VexRvm_Lx , V(660F38,2B,_,x,I,0,4,FV ), 0 , 111, 0 , 213, 181), // #1252 + INST(Vpackuswb , VexRvm_Lx , V(660F00,67,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1253 + INST(Vpaddb , VexRvm_Lx , V(660F00,FC,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1254 + INST(Vpaddd , VexRvm_Lx , V(660F00,FE,_,x,I,0,4,FV ), 0 , 145, 0 , 213, 157), // #1255 + INST(Vpaddq , VexRvm_Lx , V(660F00,D4,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 157), // #1256 + INST(Vpaddsb , VexRvm_Lx , V(660F00,EC,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1257 + INST(Vpaddsw , VexRvm_Lx , V(660F00,ED,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1258 + INST(Vpaddusb , VexRvm_Lx , V(660F00,DC,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1259 + INST(Vpaddusw , VexRvm_Lx , V(660F00,DD,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1260 + INST(Vpaddw , VexRvm_Lx , V(660F00,FD,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1261 + INST(Vpalignr , VexRvmi_Lx , V(660F3A,0F,_,x,I,I,4,FVM), 0 , 206, 0 , 321, 181), // #1262 + INST(Vpand , VexRvm_Lx , V(660F00,DB,_,x,I,_,_,_ ), 0 , 71 , 0 , 358, 178), // #1263 + INST(Vpandd , VexRvm_Lx , E(660F00,DB,_,x,_,0,4,FV ), 0 , 200, 0 , 359, 152), // #1264 + INST(Vpandn , VexRvm_Lx , V(660F00,DF,_,x,I,_,_,_ ), 0 , 71 , 0 , 360, 178), // #1265 + INST(Vpandnd , VexRvm_Lx , E(660F00,DF,_,x,_,0,4,FV ), 0 , 200, 0 , 361, 152), // #1266 + INST(Vpandnq , VexRvm_Lx , E(660F00,DF,_,x,_,1,4,FV ), 0 , 136, 0 , 362, 152), // #1267 + INST(Vpandq , VexRvm_Lx , E(660F00,DB,_,x,_,1,4,FV ), 0 , 136, 0 , 363, 152), // #1268 + INST(Vpavgb , VexRvm_Lx , V(660F00,E0,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1269 + INST(Vpavgw , VexRvm_Lx , V(660F00,E3,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1270 + INST(Vpblendd , VexRvmi_Lx , V(660F3A,02,_,x,0,_,_,_ ), 0 , 75 , 0 , 219, 156), // #1271 + INST(Vpblendmb , VexRvm_Lx , E(660F38,66,_,x,_,0,4,FVM), 0 , 115, 0 , 364, 163), // #1272 + INST(Vpblendmd , VexRvm_Lx , E(660F38,64,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1273 + INST(Vpblendmq , VexRvm_Lx , E(660F38,64,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1274 + INST(Vpblendmw , VexRvm_Lx , E(660F38,66,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1275 + INST(Vpblendvb , VexRvmr_Lx , V(660F3A,4C,_,x,0,_,_,_ ), 0 , 75 , 0 , 220, 178), // #1276 + INST(Vpblendw , VexRvmi_Lx , V(660F3A,0E,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 178), // #1277 + INST(Vpbroadcastb , VexRm_Lx_Bcst , V(660F38,78,_,x,0,0,0,T1S), E(660F38,7A,_,x,0,0,0,T1S), 30 , 108, 365, 182), // #1278 + INST(Vpbroadcastd , VexRm_Lx_Bcst , V(660F38,58,_,x,0,0,2,T1S), E(660F38,7C,_,x,0,0,0,T1S), 123, 109, 366, 169), // #1279 + INST(Vpbroadcastmb2q , VexRm_Lx , E(F30F38,2A,_,x,_,1,_,_ ), 0 , 207, 0 , 367, 183), // #1280 + INST(Vpbroadcastmw2d , VexRm_Lx , E(F30F38,3A,_,x,_,0,_,_ ), 0 , 208, 0 , 367, 183), // #1281 + INST(Vpbroadcastq , VexRm_Lx_Bcst , V(660F38,59,_,x,0,1,3,T1S), E(660F38,7C,_,x,0,1,0,T1S), 122, 110, 368, 169), // #1282 + INST(Vpbroadcastw , VexRm_Lx_Bcst , V(660F38,79,_,x,0,0,1,T1S), E(660F38,7B,_,x,0,0,0,T1S), 209, 111, 369, 182), // #1283 + INST(Vpclmulqdq , VexRvmi_Lx , V(660F3A,44,_,x,I,_,4,FVM), 0 , 206, 0 , 370, 184), // #1284 + INST(Vpcmov , VexRvrmRvmr_Lx , V(XOP_M8,A2,_,x,x,_,_,_ ), 0 , 210, 0 , 296, 168), // #1285 + INST(Vpcmpb , VexRvmi_Lx , E(660F3A,3F,_,x,_,0,4,FVM), 0 , 112, 0 , 371, 163), // #1286 + INST(Vpcmpd , VexRvmi_Lx , E(660F3A,1F,_,x,_,0,4,FV ), 0 , 112, 0 , 372, 152), // #1287 + INST(Vpcmpeqb , VexRvm_Lx_KEvex , V(660F00,74,_,x,I,I,4,FV ), 0 , 145, 0 , 373, 181), // #1288 + INST(Vpcmpeqd , VexRvm_Lx_KEvex , V(660F00,76,_,x,I,0,4,FVM), 0 , 145, 0 , 374, 157), // #1289 + INST(Vpcmpeqq , VexRvm_Lx_KEvex , V(660F38,29,_,x,I,1,4,FVM), 0 , 211, 0 , 375, 157), // #1290 + INST(Vpcmpeqw , VexRvm_Lx_KEvex , V(660F00,75,_,x,I,I,4,FV ), 0 , 145, 0 , 373, 181), // #1291 + INST(Vpcmpestri , VexRmi , V(660F3A,61,_,0,I,_,_,_ ), 0 , 75 , 0 , 376, 185), // #1292 + INST(Vpcmpestrm , VexRmi , V(660F3A,60,_,0,I,_,_,_ ), 0 , 75 , 0 , 377, 185), // #1293 + INST(Vpcmpgtb , VexRvm_Lx_KEvex , V(660F00,64,_,x,I,I,4,FV ), 0 , 145, 0 , 373, 181), // #1294 + INST(Vpcmpgtd , VexRvm_Lx_KEvex , V(660F00,66,_,x,I,0,4,FVM), 0 , 145, 0 , 374, 157), // #1295 + INST(Vpcmpgtq , VexRvm_Lx_KEvex , V(660F38,37,_,x,I,1,4,FVM), 0 , 211, 0 , 375, 157), // #1296 + INST(Vpcmpgtw , VexRvm_Lx_KEvex , V(660F00,65,_,x,I,I,4,FV ), 0 , 145, 0 , 373, 181), // #1297 + INST(Vpcmpistri , VexRmi , V(660F3A,63,_,0,I,_,_,_ ), 0 , 75 , 0 , 378, 185), // #1298 + INST(Vpcmpistrm , VexRmi , V(660F3A,62,_,0,I,_,_,_ ), 0 , 75 , 0 , 379, 185), // #1299 + INST(Vpcmpq , VexRvmi_Lx , E(660F3A,1F,_,x,_,1,4,FV ), 0 , 113, 0 , 380, 152), // #1300 + INST(Vpcmpub , VexRvmi_Lx , E(660F3A,3E,_,x,_,0,4,FVM), 0 , 112, 0 , 371, 163), // #1301 + INST(Vpcmpud , VexRvmi_Lx , E(660F3A,1E,_,x,_,0,4,FV ), 0 , 112, 0 , 372, 152), // #1302 + INST(Vpcmpuq , VexRvmi_Lx , E(660F3A,1E,_,x,_,1,4,FV ), 0 , 113, 0 , 380, 152), // #1303 + INST(Vpcmpuw , VexRvmi_Lx , E(660F3A,3E,_,x,_,1,4,FVM), 0 , 113, 0 , 380, 163), // #1304 + INST(Vpcmpw , VexRvmi_Lx , E(660F3A,3F,_,x,_,1,4,FVM), 0 , 113, 0 , 380, 163), // #1305 + INST(Vpcomb , VexRvmi , V(XOP_M8,CC,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1306 + INST(Vpcomd , VexRvmi , V(XOP_M8,CE,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1307 + INST(Vpcompressb , VexMr_Lx , E(660F38,63,_,x,_,0,0,T1S), 0 , 212, 0 , 237, 186), // #1308 + INST(Vpcompressd , VexMr_Lx , E(660F38,8B,_,x,_,0,2,T1S), 0 , 130, 0 , 237, 152), // #1309 + INST(Vpcompressq , VexMr_Lx , E(660F38,8B,_,x,_,1,3,T1S), 0 , 129, 0 , 237, 152), // #1310 + INST(Vpcompressw , VexMr_Lx , E(660F38,63,_,x,_,1,1,T1S), 0 , 213, 0 , 237, 186), // #1311 + INST(Vpcomq , VexRvmi , V(XOP_M8,CF,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1312 + INST(Vpcomub , VexRvmi , V(XOP_M8,EC,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1313 + INST(Vpcomud , VexRvmi , V(XOP_M8,EE,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1314 + INST(Vpcomuq , VexRvmi , V(XOP_M8,EF,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1315 + INST(Vpcomuw , VexRvmi , V(XOP_M8,ED,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1316 + INST(Vpcomw , VexRvmi , V(XOP_M8,CD,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1317 + INST(Vpconflictd , VexRm_Lx , E(660F38,C4,_,x,_,0,4,FV ), 0 , 115, 0 , 381, 183), // #1318 + INST(Vpconflictq , VexRm_Lx , E(660F38,C4,_,x,_,1,4,FV ), 0 , 114, 0 , 381, 183), // #1319 + INST(Vpdpbssd , VexRvm_Lx , V(F20F38,50,_,x,0,_,_,_ ), 0 , 85 , 0 , 206, 187), // #1320 + INST(Vpdpbssds , VexRvm_Lx , V(F20F38,51,_,x,0,_,_,_ ), 0 , 85 , 0 , 206, 187), // #1321 + INST(Vpdpbsud , VexRvm_Lx , V(F30F38,50,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 187), // #1322 + INST(Vpdpbsuds , VexRvm_Lx , V(F30F38,51,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 187), // #1323 + INST(Vpdpbusd , VexRvm_Lx , V(660F38,50,_,x,_,0,4,FV ), 0 , 111, 0 , 382, 188), // #1324 + INST(Vpdpbusds , VexRvm_Lx , V(660F38,51,_,x,_,0,4,FV ), 0 , 111, 0 , 382, 188), // #1325 + INST(Vpdpbuud , VexRvm_Lx , V(000F38,50,_,x,0,_,_,_ ), 0 , 11 , 0 , 206, 187), // #1326 + INST(Vpdpbuuds , VexRvm_Lx , V(000F38,51,_,x,0,_,_,_ ), 0 , 11 , 0 , 206, 187), // #1327 + INST(Vpdpwssd , VexRvm_Lx , V(660F38,52,_,x,_,0,4,FV ), 0 , 111, 0 , 382, 188), // #1328 + INST(Vpdpwssds , VexRvm_Lx , V(660F38,53,_,x,_,0,4,FV ), 0 , 111, 0 , 382, 188), // #1329 + INST(Vpdpwsud , VexRvm_Lx , V(F30F38,D2,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 189), // #1330 + INST(Vpdpwsuds , VexRvm_Lx , V(F30F38,D3,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 189), // #1331 + INST(Vpdpwusd , VexRvm_Lx , V(660F38,D2,_,x,0,_,_,_ ), 0 , 30 , 0 , 206, 189), // #1332 + INST(Vpdpwusds , VexRvm_Lx , V(660F38,D3,_,x,0,_,_,_ ), 0 , 30 , 0 , 206, 189), // #1333 + INST(Vpdpwuud , VexRvm_Lx , V(000F38,D2,_,x,0,_,_,_ ), 0 , 11 , 0 , 206, 189), // #1334 + INST(Vpdpwuuds , VexRvm_Lx , V(000F38,D3,_,x,0,_,_,_ ), 0 , 11 , 0 , 206, 189), // #1335 + INST(Vperm2f128 , VexRvmi , V(660F3A,06,_,1,0,_,_,_ ), 0 , 174, 0 , 383, 149), // #1336 + INST(Vperm2i128 , VexRvmi , V(660F3A,46,_,1,0,_,_,_ ), 0 , 174, 0 , 383, 156), // #1337 + INST(Vpermb , VexRvm_Lx , E(660F38,8D,_,x,_,0,4,FVM), 0 , 115, 0 , 364, 190), // #1338 + INST(Vpermd , VexRvm_Lx , V(660F38,36,_,x,0,0,4,FV ), 0 , 111, 0 , 384, 169), // #1339 + INST(Vpermi2b , VexRvm_Lx , E(660F38,75,_,x,_,0,4,FVM), 0 , 115, 0 , 364, 190), // #1340 + INST(Vpermi2d , VexRvm_Lx , E(660F38,76,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1341 + INST(Vpermi2pd , VexRvm_Lx , E(660F38,77,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1342 + INST(Vpermi2ps , VexRvm_Lx , E(660F38,77,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1343 + INST(Vpermi2q , VexRvm_Lx , E(660F38,76,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1344 + INST(Vpermi2w , VexRvm_Lx , E(660F38,75,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1345 + INST(Vpermil2pd , VexRvrmiRvmri_Lx , V(660F3A,49,_,x,x,_,_,_ ), 0 , 75 , 0 , 385, 168), // #1346 + INST(Vpermil2ps , VexRvrmiRvmri_Lx , V(660F3A,48,_,x,x,_,_,_ ), 0 , 75 , 0 , 385, 168), // #1347 + INST(Vpermilpd , VexRvmRmi_Lx , V(660F38,0D,_,x,0,1,4,FV ), V(660F3A,05,_,x,0,1,4,FV ), 211, 112, 386, 145), // #1348 + INST(Vpermilps , VexRvmRmi_Lx , V(660F38,0C,_,x,0,0,4,FV ), V(660F3A,04,_,x,0,0,4,FV ), 111, 113, 387, 145), // #1349 + INST(Vpermpd , VexRvmRmi_Lx , E(660F38,16,_,x,1,1,4,FV ), V(660F3A,01,_,x,1,1,4,FV ), 214, 114, 388, 169), // #1350 + INST(Vpermps , VexRvm_Lx , V(660F38,16,_,x,0,0,4,FV ), 0 , 111, 0 , 384, 169), // #1351 + INST(Vpermq , VexRvmRmi_Lx , E(660F38,36,_,x,_,1,4,FV ), V(660F3A,00,_,x,1,1,4,FV ), 114, 115, 388, 169), // #1352 + INST(Vpermt2b , VexRvm_Lx , E(660F38,7D,_,x,_,0,4,FVM), 0 , 115, 0 , 364, 190), // #1353 + INST(Vpermt2d , VexRvm_Lx , E(660F38,7E,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1354 + INST(Vpermt2pd , VexRvm_Lx , E(660F38,7F,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1355 + INST(Vpermt2ps , VexRvm_Lx , E(660F38,7F,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1356 + INST(Vpermt2q , VexRvm_Lx , E(660F38,7E,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1357 + INST(Vpermt2w , VexRvm_Lx , E(660F38,7D,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1358 + INST(Vpermw , VexRvm_Lx , E(660F38,8D,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1359 + INST(Vpexpandb , VexRm_Lx , E(660F38,62,_,x,_,0,0,T1S), 0 , 212, 0 , 286, 186), // #1360 + INST(Vpexpandd , VexRm_Lx , E(660F38,89,_,x,_,0,2,T1S), 0 , 130, 0 , 286, 152), // #1361 + INST(Vpexpandq , VexRm_Lx , E(660F38,89,_,x,_,1,3,T1S), 0 , 129, 0 , 286, 152), // #1362 + INST(Vpexpandw , VexRm_Lx , E(660F38,62,_,x,_,1,1,T1S), 0 , 213, 0 , 286, 186), // #1363 + INST(Vpextrb , VexMri , V(660F3A,14,_,0,0,I,0,T1S), 0 , 75 , 0 , 389, 191), // #1364 + INST(Vpextrd , VexMri , V(660F3A,16,_,0,0,0,2,T1S), 0 , 179, 0 , 290, 192), // #1365 + INST(Vpextrq , VexMri , V(660F3A,16,_,0,1,1,3,T1S), 0 , 215, 0 , 390, 192), // #1366 + INST(Vpextrw , VexMri_Vpextrw , V(660F3A,15,_,0,0,I,1,T1S), 0 , 216, 0 , 391, 191), // #1367 + INST(Vpgatherdd , VexRmvRm_VM , V(660F38,90,_,x,0,_,_,_ ), E(660F38,90,_,x,_,0,2,T1S), 30 , 116, 309, 169), // #1368 + INST(Vpgatherdq , VexRmvRm_VM , V(660F38,90,_,x,1,_,_,_ ), E(660F38,90,_,x,_,1,3,T1S), 191, 117, 308, 169), // #1369 + INST(Vpgatherqd , VexRmvRm_VM , V(660F38,91,_,x,0,_,_,_ ), E(660F38,91,_,x,_,0,2,T1S), 30 , 118, 314, 169), // #1370 + INST(Vpgatherqq , VexRmvRm_VM , V(660F38,91,_,x,1,_,_,_ ), E(660F38,91,_,x,_,1,3,T1S), 191, 119, 313, 169), // #1371 + INST(Vphaddbd , VexRm , V(XOP_M9,C2,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1372 + INST(Vphaddbq , VexRm , V(XOP_M9,C3,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1373 + INST(Vphaddbw , VexRm , V(XOP_M9,C1,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1374 + INST(Vphaddd , VexRvm_Lx , V(660F38,02,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1375 + INST(Vphadddq , VexRm , V(XOP_M9,CB,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1376 + INST(Vphaddsw , VexRvm_Lx , V(660F38,03,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1377 + INST(Vphaddubd , VexRm , V(XOP_M9,D2,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1378 + INST(Vphaddubq , VexRm , V(XOP_M9,D3,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1379 + INST(Vphaddubw , VexRm , V(XOP_M9,D1,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1380 + INST(Vphaddudq , VexRm , V(XOP_M9,DB,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1381 + INST(Vphadduwd , VexRm , V(XOP_M9,D6,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1382 + INST(Vphadduwq , VexRm , V(XOP_M9,D7,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1383 + INST(Vphaddw , VexRvm_Lx , V(660F38,01,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1384 + INST(Vphaddwd , VexRm , V(XOP_M9,C6,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1385 + INST(Vphaddwq , VexRm , V(XOP_M9,C7,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1386 + INST(Vphminposuw , VexRm , V(660F38,41,_,0,I,_,_,_ ), 0 , 30 , 0 , 208, 149), // #1387 + INST(Vphsubbw , VexRm , V(XOP_M9,E1,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1388 + INST(Vphsubd , VexRvm_Lx , V(660F38,06,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1389 + INST(Vphsubdq , VexRm , V(XOP_M9,E3,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1390 + INST(Vphsubsw , VexRvm_Lx , V(660F38,07,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1391 + INST(Vphsubw , VexRvm_Lx , V(660F38,05,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1392 + INST(Vphsubwd , VexRm , V(XOP_M9,E2,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1393 + INST(Vpinsrb , VexRvmi , V(660F3A,20,_,0,0,I,0,T1S), 0 , 75 , 0 , 392, 191), // #1394 + INST(Vpinsrd , VexRvmi , V(660F3A,22,_,0,0,0,2,T1S), 0 , 179, 0 , 393, 192), // #1395 + INST(Vpinsrq , VexRvmi , V(660F3A,22,_,0,1,1,3,T1S), 0 , 215, 0 , 394, 192), // #1396 + INST(Vpinsrw , VexRvmi , V(660F00,C4,_,0,0,I,1,T1S), 0 , 217, 0 , 395, 191), // #1397 + INST(Vplzcntd , VexRm_Lx , E(660F38,44,_,x,_,0,4,FV ), 0 , 115, 0 , 381, 183), // #1398 + INST(Vplzcntq , VexRm_Lx , E(660F38,44,_,x,_,1,4,FV ), 0 , 114, 0 , 357, 183), // #1399 + INST(Vpmacsdd , VexRvmr , V(XOP_M8,9E,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1400 + INST(Vpmacsdqh , VexRvmr , V(XOP_M8,9F,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1401 + INST(Vpmacsdql , VexRvmr , V(XOP_M8,97,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1402 + INST(Vpmacssdd , VexRvmr , V(XOP_M8,8E,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1403 + INST(Vpmacssdqh , VexRvmr , V(XOP_M8,8F,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1404 + INST(Vpmacssdql , VexRvmr , V(XOP_M8,87,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1405 + INST(Vpmacsswd , VexRvmr , V(XOP_M8,86,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1406 + INST(Vpmacssww , VexRvmr , V(XOP_M8,85,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1407 + INST(Vpmacswd , VexRvmr , V(XOP_M8,96,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1408 + INST(Vpmacsww , VexRvmr , V(XOP_M8,95,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1409 + INST(Vpmadcsswd , VexRvmr , V(XOP_M8,A6,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1410 + INST(Vpmadcswd , VexRvmr , V(XOP_M8,B6,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1411 + INST(Vpmadd52huq , VexRvm_Lx , V(660F38,B5,_,x,1,1,4,FV ), 0 , 184, 0 , 397, 193), // #1412 + INST(Vpmadd52luq , VexRvm_Lx , V(660F38,B4,_,x,1,1,4,FV ), 0 , 184, 0 , 397, 193), // #1413 + INST(Vpmaddubsw , VexRvm_Lx , V(660F38,04,_,x,I,I,4,FVM), 0 , 111, 0 , 322, 181), // #1414 + INST(Vpmaddwd , VexRvm_Lx , V(660F00,F5,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1415 + INST(Vpmaskmovd , VexRvmMvr_Lx , V(660F38,8C,_,x,0,_,_,_ ), V(660F38,8E,_,x,0,_,_,_ ), 30 , 120, 329, 156), // #1416 + INST(Vpmaskmovq , VexRvmMvr_Lx , V(660F38,8C,_,x,1,_,_,_ ), V(660F38,8E,_,x,1,_,_,_ ), 191, 121, 329, 156), // #1417 + INST(Vpmaxsb , VexRvm_Lx , V(660F38,3C,_,x,I,I,4,FVM), 0 , 111, 0 , 398, 181), // #1418 + INST(Vpmaxsd , VexRvm_Lx , V(660F38,3D,_,x,I,0,4,FV ), 0 , 111, 0 , 215, 157), // #1419 + INST(Vpmaxsq , VexRvm_Lx , E(660F38,3D,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1420 + INST(Vpmaxsw , VexRvm_Lx , V(660F00,EE,_,x,I,I,4,FVM), 0 , 145, 0 , 398, 181), // #1421 + INST(Vpmaxub , VexRvm_Lx , V(660F00,DE,_,x,I,I,4,FVM), 0 , 145, 0 , 398, 181), // #1422 + INST(Vpmaxud , VexRvm_Lx , V(660F38,3F,_,x,I,0,4,FV ), 0 , 111, 0 , 215, 157), // #1423 + INST(Vpmaxuq , VexRvm_Lx , E(660F38,3F,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1424 + INST(Vpmaxuw , VexRvm_Lx , V(660F38,3E,_,x,I,I,4,FVM), 0 , 111, 0 , 398, 181), // #1425 + INST(Vpminsb , VexRvm_Lx , V(660F38,38,_,x,I,I,4,FVM), 0 , 111, 0 , 398, 181), // #1426 + INST(Vpminsd , VexRvm_Lx , V(660F38,39,_,x,I,0,4,FV ), 0 , 111, 0 , 215, 157), // #1427 + INST(Vpminsq , VexRvm_Lx , E(660F38,39,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1428 + INST(Vpminsw , VexRvm_Lx , V(660F00,EA,_,x,I,I,4,FVM), 0 , 145, 0 , 398, 181), // #1429 + INST(Vpminub , VexRvm_Lx , V(660F00,DA,_,x,I,_,4,FVM), 0 , 145, 0 , 398, 181), // #1430 + INST(Vpminud , VexRvm_Lx , V(660F38,3B,_,x,I,0,4,FV ), 0 , 111, 0 , 215, 157), // #1431 + INST(Vpminuq , VexRvm_Lx , E(660F38,3B,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1432 + INST(Vpminuw , VexRvm_Lx , V(660F38,3A,_,x,I,_,4,FVM), 0 , 111, 0 , 398, 181), // #1433 + INST(Vpmovb2m , VexRm_Lx , E(F30F38,29,_,x,_,0,_,_ ), 0 , 208, 0 , 399, 163), // #1434 + INST(Vpmovd2m , VexRm_Lx , E(F30F38,39,_,x,_,0,_,_ ), 0 , 208, 0 , 399, 155), // #1435 + INST(Vpmovdb , VexMr_Lx , E(F30F38,31,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1436 + INST(Vpmovdw , VexMr_Lx , E(F30F38,33,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1437 + INST(Vpmovm2b , VexRm_Lx , E(F30F38,28,_,x,_,0,_,_ ), 0 , 208, 0 , 367, 163), // #1438 + INST(Vpmovm2d , VexRm_Lx , E(F30F38,38,_,x,_,0,_,_ ), 0 , 208, 0 , 367, 155), // #1439 + INST(Vpmovm2q , VexRm_Lx , E(F30F38,38,_,x,_,1,_,_ ), 0 , 207, 0 , 367, 155), // #1440 + INST(Vpmovm2w , VexRm_Lx , E(F30F38,28,_,x,_,1,_,_ ), 0 , 207, 0 , 367, 163), // #1441 + INST(Vpmovmskb , VexRm_Lx , V(660F00,D7,_,x,I,_,_,_ ), 0 , 71 , 0 , 343, 178), // #1442 + INST(Vpmovq2m , VexRm_Lx , E(F30F38,39,_,x,_,1,_,_ ), 0 , 207, 0 , 399, 155), // #1443 + INST(Vpmovqb , VexMr_Lx , E(F30F38,32,_,x,_,0,1,OVM), 0 , 220, 0 , 402, 152), // #1444 + INST(Vpmovqd , VexMr_Lx , E(F30F38,35,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1445 + INST(Vpmovqw , VexMr_Lx , E(F30F38,34,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1446 + INST(Vpmovsdb , VexMr_Lx , E(F30F38,21,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1447 + INST(Vpmovsdw , VexMr_Lx , E(F30F38,23,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1448 + INST(Vpmovsqb , VexMr_Lx , E(F30F38,22,_,x,_,0,1,OVM), 0 , 220, 0 , 402, 152), // #1449 + INST(Vpmovsqd , VexMr_Lx , E(F30F38,25,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1450 + INST(Vpmovsqw , VexMr_Lx , E(F30F38,24,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1451 + INST(Vpmovswb , VexMr_Lx , E(F30F38,20,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 163), // #1452 + INST(Vpmovsxbd , VexRm_Lx , V(660F38,21,_,x,I,I,2,QVM), 0 , 221, 0 , 403, 157), // #1453 + INST(Vpmovsxbq , VexRm_Lx , V(660F38,22,_,x,I,I,1,OVM), 0 , 222, 0 , 404, 157), // #1454 + INST(Vpmovsxbw , VexRm_Lx , V(660F38,20,_,x,I,I,3,HVM), 0 , 140, 0 , 405, 181), // #1455 + INST(Vpmovsxdq , VexRm_Lx , V(660F38,25,_,x,I,0,3,HVM), 0 , 140, 0 , 405, 157), // #1456 + INST(Vpmovsxwd , VexRm_Lx , V(660F38,23,_,x,I,I,3,HVM), 0 , 140, 0 , 405, 157), // #1457 + INST(Vpmovsxwq , VexRm_Lx , V(660F38,24,_,x,I,I,2,QVM), 0 , 221, 0 , 403, 157), // #1458 + INST(Vpmovusdb , VexMr_Lx , E(F30F38,11,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1459 + INST(Vpmovusdw , VexMr_Lx , E(F30F38,13,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1460 + INST(Vpmovusqb , VexMr_Lx , E(F30F38,12,_,x,_,0,1,OVM), 0 , 220, 0 , 402, 152), // #1461 + INST(Vpmovusqd , VexMr_Lx , E(F30F38,15,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1462 + INST(Vpmovusqw , VexMr_Lx , E(F30F38,14,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1463 + INST(Vpmovuswb , VexMr_Lx , E(F30F38,10,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 163), // #1464 + INST(Vpmovw2m , VexRm_Lx , E(F30F38,29,_,x,_,1,_,_ ), 0 , 207, 0 , 399, 163), // #1465 + INST(Vpmovwb , VexMr_Lx , E(F30F38,30,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 163), // #1466 + INST(Vpmovzxbd , VexRm_Lx , V(660F38,31,_,x,I,I,2,QVM), 0 , 221, 0 , 403, 157), // #1467 + INST(Vpmovzxbq , VexRm_Lx , V(660F38,32,_,x,I,I,1,OVM), 0 , 222, 0 , 404, 157), // #1468 + INST(Vpmovzxbw , VexRm_Lx , V(660F38,30,_,x,I,I,3,HVM), 0 , 140, 0 , 405, 181), // #1469 + INST(Vpmovzxdq , VexRm_Lx , V(660F38,35,_,x,I,0,3,HVM), 0 , 140, 0 , 405, 157), // #1470 + INST(Vpmovzxwd , VexRm_Lx , V(660F38,33,_,x,I,I,3,HVM), 0 , 140, 0 , 405, 157), // #1471 + INST(Vpmovzxwq , VexRm_Lx , V(660F38,34,_,x,I,I,2,QVM), 0 , 221, 0 , 403, 157), // #1472 + INST(Vpmuldq , VexRvm_Lx , V(660F38,28,_,x,I,1,4,FV ), 0 , 211, 0 , 212, 157), // #1473 + INST(Vpmulhrsw , VexRvm_Lx , V(660F38,0B,_,x,I,I,4,FVM), 0 , 111, 0 , 322, 181), // #1474 + INST(Vpmulhuw , VexRvm_Lx , V(660F00,E4,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1475 + INST(Vpmulhw , VexRvm_Lx , V(660F00,E5,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1476 + INST(Vpmulld , VexRvm_Lx , V(660F38,40,_,x,I,0,4,FV ), 0 , 111, 0 , 213, 157), // #1477 + INST(Vpmullq , VexRvm_Lx , E(660F38,40,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 155), // #1478 + INST(Vpmullw , VexRvm_Lx , V(660F00,D5,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1479 + INST(Vpmultishiftqb , VexRvm_Lx , E(660F38,83,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 190), // #1480 + INST(Vpmuludq , VexRvm_Lx , V(660F00,F4,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 157), // #1481 + INST(Vpopcntb , VexRm_Lx , E(660F38,54,_,x,_,0,4,FV ), 0 , 115, 0 , 286, 194), // #1482 + INST(Vpopcntd , VexRm_Lx , E(660F38,55,_,x,_,0,4,FVM), 0 , 115, 0 , 381, 195), // #1483 + INST(Vpopcntq , VexRm_Lx , E(660F38,55,_,x,_,1,4,FVM), 0 , 114, 0 , 357, 195), // #1484 + INST(Vpopcntw , VexRm_Lx , E(660F38,54,_,x,_,1,4,FV ), 0 , 114, 0 , 286, 194), // #1485 + INST(Vpor , VexRvm_Lx , V(660F00,EB,_,x,I,_,_,_ ), 0 , 71 , 0 , 358, 178), // #1486 + INST(Vpord , VexRvm_Lx , E(660F00,EB,_,x,_,0,4,FV ), 0 , 200, 0 , 359, 152), // #1487 + INST(Vporq , VexRvm_Lx , E(660F00,EB,_,x,_,1,4,FV ), 0 , 136, 0 , 363, 152), // #1488 + INST(Vpperm , VexRvrmRvmr , V(XOP_M8,A3,_,0,x,_,_,_ ), 0 , 210, 0 , 406, 168), // #1489 + INST(Vprold , VexVmi_Lx , E(660F00,72,1,x,_,0,4,FV ), 0 , 223, 0 , 407, 152), // #1490 + INST(Vprolq , VexVmi_Lx , E(660F00,72,1,x,_,1,4,FV ), 0 , 224, 0 , 408, 152), // #1491 + INST(Vprolvd , VexRvm_Lx , E(660F38,15,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1492 + INST(Vprolvq , VexRvm_Lx , E(660F38,15,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1493 + INST(Vprord , VexVmi_Lx , E(660F00,72,0,x,_,0,4,FV ), 0 , 200, 0 , 407, 152), // #1494 + INST(Vprorq , VexVmi_Lx , E(660F00,72,0,x,_,1,4,FV ), 0 , 136, 0 , 408, 152), // #1495 + INST(Vprorvd , VexRvm_Lx , E(660F38,14,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1496 + INST(Vprorvq , VexRvm_Lx , E(660F38,14,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1497 + INST(Vprotb , VexRvmRmvRmi , V(XOP_M9,90,_,0,x,_,_,_ ), V(XOP_M8,C0,_,0,x,_,_,_ ), 81 , 122, 409, 168), // #1498 + INST(Vprotd , VexRvmRmvRmi , V(XOP_M9,92,_,0,x,_,_,_ ), V(XOP_M8,C2,_,0,x,_,_,_ ), 81 , 123, 409, 168), // #1499 + INST(Vprotq , VexRvmRmvRmi , V(XOP_M9,93,_,0,x,_,_,_ ), V(XOP_M8,C3,_,0,x,_,_,_ ), 81 , 124, 409, 168), // #1500 + INST(Vprotw , VexRvmRmvRmi , V(XOP_M9,91,_,0,x,_,_,_ ), V(XOP_M8,C1,_,0,x,_,_,_ ), 81 , 125, 409, 168), // #1501 + INST(Vpsadbw , VexRvm_Lx , V(660F00,F6,_,x,I,I,4,FVM), 0 , 145, 0 , 207, 181), // #1502 + INST(Vpscatterdd , VexMr_VM , E(660F38,A0,_,x,_,0,2,T1S), 0 , 130, 0 , 410, 152), // #1503 + INST(Vpscatterdq , VexMr_VM , E(660F38,A0,_,x,_,1,3,T1S), 0 , 129, 0 , 411, 152), // #1504 + INST(Vpscatterqd , VexMr_VM , E(660F38,A1,_,x,_,0,2,T1S), 0 , 130, 0 , 412, 152), // #1505 + INST(Vpscatterqq , VexMr_VM , E(660F38,A1,_,x,_,1,3,T1S), 0 , 129, 0 , 413, 152), // #1506 + INST(Vpshab , VexRvmRmv , V(XOP_M9,98,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1507 + INST(Vpshad , VexRvmRmv , V(XOP_M9,9A,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1508 + INST(Vpshaq , VexRvmRmv , V(XOP_M9,9B,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1509 + INST(Vpshaw , VexRvmRmv , V(XOP_M9,99,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1510 + INST(Vpshlb , VexRvmRmv , V(XOP_M9,94,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1511 + INST(Vpshld , VexRvmRmv , V(XOP_M9,96,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1512 + INST(Vpshldd , VexRvmi_Lx , E(660F3A,71,_,x,_,0,4,FV ), 0 , 112, 0 , 210, 186), // #1513 + INST(Vpshldq , VexRvmi_Lx , E(660F3A,71,_,x,_,1,4,FV ), 0 , 113, 0 , 211, 186), // #1514 + INST(Vpshldvd , VexRvm_Lx , E(660F38,71,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 186), // #1515 + INST(Vpshldvq , VexRvm_Lx , E(660F38,71,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 186), // #1516 + INST(Vpshldvw , VexRvm_Lx , E(660F38,70,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 186), // #1517 + INST(Vpshldw , VexRvmi_Lx , E(660F3A,70,_,x,_,1,4,FVM), 0 , 113, 0 , 282, 186), // #1518 + INST(Vpshlq , VexRvmRmv , V(XOP_M9,97,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1519 + INST(Vpshlw , VexRvmRmv , V(XOP_M9,95,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1520 + INST(Vpshrdd , VexRvmi_Lx , E(660F3A,73,_,x,_,0,4,FV ), 0 , 112, 0 , 210, 186), // #1521 + INST(Vpshrdq , VexRvmi_Lx , E(660F3A,73,_,x,_,1,4,FV ), 0 , 113, 0 , 211, 186), // #1522 + INST(Vpshrdvd , VexRvm_Lx , E(660F38,73,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 186), // #1523 + INST(Vpshrdvq , VexRvm_Lx , E(660F38,73,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 186), // #1524 + INST(Vpshrdvw , VexRvm_Lx , E(660F38,72,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 186), // #1525 + INST(Vpshrdw , VexRvmi_Lx , E(660F3A,72,_,x,_,1,4,FVM), 0 , 113, 0 , 282, 186), // #1526 + INST(Vpshufb , VexRvm_Lx , V(660F38,00,_,x,I,I,4,FVM), 0 , 111, 0 , 322, 181), // #1527 + INST(Vpshufbitqmb , VexRvm_Lx , E(660F38,8F,_,x,0,0,4,FVM), 0 , 115, 0 , 415, 194), // #1528 + INST(Vpshufd , VexRmi_Lx , V(660F00,70,_,x,I,0,4,FV ), 0 , 145, 0 , 416, 157), // #1529 + INST(Vpshufhw , VexRmi_Lx , V(F30F00,70,_,x,I,I,4,FVM), 0 , 162, 0 , 417, 181), // #1530 + INST(Vpshuflw , VexRmi_Lx , V(F20F00,70,_,x,I,I,4,FVM), 0 , 225, 0 , 417, 181), // #1531 + INST(Vpsignb , VexRvm_Lx , V(660F38,08,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1532 + INST(Vpsignd , VexRvm_Lx , V(660F38,0A,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1533 + INST(Vpsignw , VexRvm_Lx , V(660F38,09,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1534 + INST(Vpslld , VexRvmVmi_Lx_MEvex , V(660F00,F2,_,x,I,0,4,128), V(660F00,72,6,x,I,0,4,FV ), 226, 126, 418, 157), // #1535 + INST(Vpslldq , VexVmi_Lx_MEvex , V(660F00,73,7,x,I,I,4,FVM), 0 , 227, 0 , 419, 181), // #1536 + INST(Vpsllq , VexRvmVmi_Lx_MEvex , V(660F00,F3,_,x,I,1,4,128), V(660F00,73,6,x,I,1,4,FV ), 228, 127, 420, 157), // #1537 + INST(Vpsllvd , VexRvm_Lx , V(660F38,47,_,x,0,0,4,FV ), 0 , 111, 0 , 213, 169), // #1538 + INST(Vpsllvq , VexRvm_Lx , V(660F38,47,_,x,1,1,4,FV ), 0 , 184, 0 , 212, 169), // #1539 + INST(Vpsllvw , VexRvm_Lx , E(660F38,12,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1540 + INST(Vpsllw , VexRvmVmi_Lx_MEvex , V(660F00,F1,_,x,I,I,4,128), V(660F00,71,6,x,I,I,4,FVM), 226, 128, 421, 181), // #1541 + INST(Vpsrad , VexRvmVmi_Lx_MEvex , V(660F00,E2,_,x,I,0,4,128), V(660F00,72,4,x,I,0,4,FV ), 226, 129, 418, 157), // #1542 + INST(Vpsraq , VexRvmVmi_Lx_MEvex , E(660F00,E2,_,x,_,1,4,128), E(660F00,72,4,x,_,1,4,FV ), 229, 130, 422, 152), // #1543 + INST(Vpsravd , VexRvm_Lx , V(660F38,46,_,x,0,0,4,FV ), 0 , 111, 0 , 213, 169), // #1544 + INST(Vpsravq , VexRvm_Lx , E(660F38,46,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1545 + INST(Vpsravw , VexRvm_Lx , E(660F38,11,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1546 + INST(Vpsraw , VexRvmVmi_Lx_MEvex , V(660F00,E1,_,x,I,I,4,128), V(660F00,71,4,x,I,I,4,FVM), 226, 131, 421, 181), // #1547 + INST(Vpsrld , VexRvmVmi_Lx_MEvex , V(660F00,D2,_,x,I,0,4,128), V(660F00,72,2,x,I,0,4,FV ), 226, 132, 418, 157), // #1548 + INST(Vpsrldq , VexVmi_Lx_MEvex , V(660F00,73,3,x,I,I,4,FVM), 0 , 230, 0 , 419, 181), // #1549 + INST(Vpsrlq , VexRvmVmi_Lx_MEvex , V(660F00,D3,_,x,I,1,4,128), V(660F00,73,2,x,I,1,4,FV ), 228, 133, 420, 157), // #1550 + INST(Vpsrlvd , VexRvm_Lx , V(660F38,45,_,x,0,0,4,FV ), 0 , 111, 0 , 213, 169), // #1551 + INST(Vpsrlvq , VexRvm_Lx , V(660F38,45,_,x,1,1,4,FV ), 0 , 184, 0 , 212, 169), // #1552 + INST(Vpsrlvw , VexRvm_Lx , E(660F38,10,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1553 + INST(Vpsrlw , VexRvmVmi_Lx_MEvex , V(660F00,D1,_,x,I,I,4,128), V(660F00,71,2,x,I,I,4,FVM), 226, 134, 421, 181), // #1554 + INST(Vpsubb , VexRvm_Lx , V(660F00,F8,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1555 + INST(Vpsubd , VexRvm_Lx , V(660F00,FA,_,x,I,0,4,FV ), 0 , 145, 0 , 424, 157), // #1556 + INST(Vpsubq , VexRvm_Lx , V(660F00,FB,_,x,I,1,4,FV ), 0 , 104, 0 , 425, 157), // #1557 + INST(Vpsubsb , VexRvm_Lx , V(660F00,E8,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1558 + INST(Vpsubsw , VexRvm_Lx , V(660F00,E9,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1559 + INST(Vpsubusb , VexRvm_Lx , V(660F00,D8,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1560 + INST(Vpsubusw , VexRvm_Lx , V(660F00,D9,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1561 + INST(Vpsubw , VexRvm_Lx , V(660F00,F9,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1562 + INST(Vpternlogd , VexRvmi_Lx , E(660F3A,25,_,x,_,0,4,FV ), 0 , 112, 0 , 210, 152), // #1563 + INST(Vpternlogq , VexRvmi_Lx , E(660F3A,25,_,x,_,1,4,FV ), 0 , 113, 0 , 211, 152), // #1564 + INST(Vptest , VexRm_Lx , V(660F38,17,_,x,I,_,_,_ ), 0 , 30 , 0 , 305, 185), // #1565 + INST(Vptestmb , VexRvm_Lx , E(660F38,26,_,x,_,0,4,FVM), 0 , 115, 0 , 415, 163), // #1566 + INST(Vptestmd , VexRvm_Lx , E(660F38,27,_,x,_,0,4,FV ), 0 , 115, 0 , 426, 152), // #1567 + INST(Vptestmq , VexRvm_Lx , E(660F38,27,_,x,_,1,4,FV ), 0 , 114, 0 , 427, 152), // #1568 + INST(Vptestmw , VexRvm_Lx , E(660F38,26,_,x,_,1,4,FVM), 0 , 114, 0 , 415, 163), // #1569 + INST(Vptestnmb , VexRvm_Lx , E(F30F38,26,_,x,_,0,4,FVM), 0 , 171, 0 , 415, 163), // #1570 + INST(Vptestnmd , VexRvm_Lx , E(F30F38,27,_,x,_,0,4,FV ), 0 , 171, 0 , 426, 152), // #1571 + INST(Vptestnmq , VexRvm_Lx , E(F30F38,27,_,x,_,1,4,FV ), 0 , 231, 0 , 427, 152), // #1572 + INST(Vptestnmw , VexRvm_Lx , E(F30F38,26,_,x,_,1,4,FVM), 0 , 231, 0 , 415, 163), // #1573 + INST(Vpunpckhbw , VexRvm_Lx , V(660F00,68,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1574 + INST(Vpunpckhdq , VexRvm_Lx , V(660F00,6A,_,x,I,0,4,FV ), 0 , 145, 0 , 213, 157), // #1575 + INST(Vpunpckhqdq , VexRvm_Lx , V(660F00,6D,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 157), // #1576 + INST(Vpunpckhwd , VexRvm_Lx , V(660F00,69,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1577 + INST(Vpunpcklbw , VexRvm_Lx , V(660F00,60,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1578 + INST(Vpunpckldq , VexRvm_Lx , V(660F00,62,_,x,I,0,4,FV ), 0 , 145, 0 , 213, 157), // #1579 + INST(Vpunpcklqdq , VexRvm_Lx , V(660F00,6C,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 157), // #1580 + INST(Vpunpcklwd , VexRvm_Lx , V(660F00,61,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1581 + INST(Vpxor , VexRvm_Lx , V(660F00,EF,_,x,I,_,_,_ ), 0 , 71 , 0 , 360, 178), // #1582 + INST(Vpxord , VexRvm_Lx , E(660F00,EF,_,x,_,0,4,FV ), 0 , 200, 0 , 361, 152), // #1583 + INST(Vpxorq , VexRvm_Lx , E(660F00,EF,_,x,_,1,4,FV ), 0 , 136, 0 , 362, 152), // #1584 + INST(Vrangepd , VexRvmi_Lx , E(660F3A,50,_,x,_,1,4,FV ), 0 , 113, 0 , 292, 155), // #1585 + INST(Vrangeps , VexRvmi_Lx , E(660F3A,50,_,x,_,0,4,FV ), 0 , 112, 0 , 293, 155), // #1586 + INST(Vrangesd , VexRvmi , E(660F3A,51,_,I,_,1,3,T1S), 0 , 182, 0 , 294, 76 ), // #1587 + INST(Vrangess , VexRvmi , E(660F3A,51,_,I,_,0,2,T1S), 0 , 183, 0 , 295, 76 ), // #1588 + INST(Vrcp14pd , VexRm_Lx , E(660F38,4C,_,x,_,1,4,FV ), 0 , 114, 0 , 357, 152), // #1589 + INST(Vrcp14ps , VexRm_Lx , E(660F38,4C,_,x,_,0,4,FV ), 0 , 115, 0 , 381, 152), // #1590 + INST(Vrcp14sd , VexRvm , E(660F38,4D,_,I,_,1,3,T1S), 0 , 129, 0 , 428, 78 ), // #1591 + INST(Vrcp14ss , VexRvm , E(660F38,4D,_,I,_,0,2,T1S), 0 , 130, 0 , 429, 78 ), // #1592 + INST(Vrcp28pd , VexRm , E(660F38,CA,_,2,_,1,4,FV ), 0 , 172, 0 , 284, 164), // #1593 + INST(Vrcp28ps , VexRm , E(660F38,CA,_,2,_,0,4,FV ), 0 , 173, 0 , 285, 164), // #1594 + INST(Vrcp28sd , VexRvm , E(660F38,CB,_,I,_,1,3,T1S), 0 , 129, 0 , 315, 164), // #1595 + INST(Vrcp28ss , VexRvm , E(660F38,CB,_,I,_,0,2,T1S), 0 , 130, 0 , 316, 164), // #1596 + INST(Vrcpph , VexRm_Lx , E(66MAP6,4C,_,_,_,0,4,FV ), 0 , 185, 0 , 430, 148), // #1597 + INST(Vrcpps , VexRm_Lx , V(000F00,53,_,x,I,_,_,_ ), 0 , 74 , 0 , 305, 149), // #1598 + INST(Vrcpsh , VexRvm , E(66MAP6,4D,_,_,_,0,1,T1S), 0 , 187, 0 , 431, 148), // #1599 + INST(Vrcpss , VexRvm , V(F30F00,53,_,I,I,_,_,_ ), 0 , 201, 0 , 432, 149), // #1600 + INST(Vreducepd , VexRmi_Lx , E(660F3A,56,_,x,_,1,4,FV ), 0 , 113, 0 , 408, 155), // #1601 + INST(Vreduceph , VexRmi_Lx , E(000F3A,56,_,_,_,0,4,FV ), 0 , 124, 0 , 318, 146), // #1602 + INST(Vreduceps , VexRmi_Lx , E(660F3A,56,_,x,_,0,4,FV ), 0 , 112, 0 , 407, 155), // #1603 + INST(Vreducesd , VexRvmi , E(660F3A,57,_,I,_,1,3,T1S), 0 , 182, 0 , 433, 76 ), // #1604 + INST(Vreducesh , VexRvmi , E(000F3A,57,_,_,_,0,1,T1S), 0 , 190, 0 , 320, 148), // #1605 + INST(Vreducess , VexRvmi , E(660F3A,57,_,I,_,0,2,T1S), 0 , 183, 0 , 434, 76 ), // #1606 + INST(Vrndscalepd , VexRmi_Lx , E(660F3A,09,_,x,_,1,4,FV ), 0 , 113, 0 , 317, 152), // #1607 + INST(Vrndscaleph , VexRmi_Lx , E(000F3A,08,_,_,_,0,4,FV ), 0 , 124, 0 , 318, 146), // #1608 + INST(Vrndscaleps , VexRmi_Lx , E(660F3A,08,_,x,_,0,4,FV ), 0 , 112, 0 , 319, 152), // #1609 + INST(Vrndscalesd , VexRvmi , E(660F3A,0B,_,I,_,1,3,T1S), 0 , 182, 0 , 294, 78 ), // #1610 + INST(Vrndscalesh , VexRvmi , E(000F3A,0A,_,_,_,0,1,T1S), 0 , 190, 0 , 320, 148), // #1611 + INST(Vrndscaless , VexRvmi , E(660F3A,0A,_,I,_,0,2,T1S), 0 , 183, 0 , 295, 78 ), // #1612 + INST(Vroundpd , VexRmi_Lx , V(660F3A,09,_,x,I,_,_,_ ), 0 , 75 , 0 , 435, 149), // #1613 + INST(Vroundps , VexRmi_Lx , V(660F3A,08,_,x,I,_,_,_ ), 0 , 75 , 0 , 435, 149), // #1614 + INST(Vroundsd , VexRvmi , V(660F3A,0B,_,I,I,_,_,_ ), 0 , 75 , 0 , 436, 149), // #1615 + INST(Vroundss , VexRvmi , V(660F3A,0A,_,I,I,_,_,_ ), 0 , 75 , 0 , 437, 149), // #1616 + INST(Vrsqrt14pd , VexRm_Lx , E(660F38,4E,_,x,_,1,4,FV ), 0 , 114, 0 , 357, 152), // #1617 + INST(Vrsqrt14ps , VexRm_Lx , E(660F38,4E,_,x,_,0,4,FV ), 0 , 115, 0 , 381, 152), // #1618 + INST(Vrsqrt14sd , VexRvm , E(660F38,4F,_,I,_,1,3,T1S), 0 , 129, 0 , 428, 78 ), // #1619 + INST(Vrsqrt14ss , VexRvm , E(660F38,4F,_,I,_,0,2,T1S), 0 , 130, 0 , 429, 78 ), // #1620 + INST(Vrsqrt28pd , VexRm , E(660F38,CC,_,2,_,1,4,FV ), 0 , 172, 0 , 284, 164), // #1621 + INST(Vrsqrt28ps , VexRm , E(660F38,CC,_,2,_,0,4,FV ), 0 , 173, 0 , 285, 164), // #1622 + INST(Vrsqrt28sd , VexRvm , E(660F38,CD,_,I,_,1,3,T1S), 0 , 129, 0 , 315, 164), // #1623 + INST(Vrsqrt28ss , VexRvm , E(660F38,CD,_,I,_,0,2,T1S), 0 , 130, 0 , 316, 164), // #1624 + INST(Vrsqrtph , VexRm_Lx , E(66MAP6,4E,_,_,_,0,4,FV ), 0 , 185, 0 , 430, 146), // #1625 + INST(Vrsqrtps , VexRm_Lx , V(000F00,52,_,x,I,_,_,_ ), 0 , 74 , 0 , 305, 149), // #1626 + INST(Vrsqrtsh , VexRvm , E(66MAP6,4F,_,_,_,0,1,T1S), 0 , 187, 0 , 431, 148), // #1627 + INST(Vrsqrtss , VexRvm , V(F30F00,52,_,I,I,_,_,_ ), 0 , 201, 0 , 432, 149), // #1628 + INST(Vscalefpd , VexRvm_Lx , E(660F38,2C,_,x,_,1,4,FV ), 0 , 114, 0 , 438, 152), // #1629 + INST(Vscalefph , VexRvm_Lx , E(66MAP6,2C,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1630 + INST(Vscalefps , VexRvm_Lx , E(660F38,2C,_,x,_,0,4,FV ), 0 , 115, 0 , 291, 152), // #1631 + INST(Vscalefsd , VexRvm , E(660F38,2D,_,I,_,1,3,T1S), 0 , 129, 0 , 257, 78 ), // #1632 + INST(Vscalefsh , VexRvm , E(66MAP6,2D,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1633 + INST(Vscalefss , VexRvm , E(660F38,2D,_,I,_,0,2,T1S), 0 , 130, 0 , 265, 78 ), // #1634 + INST(Vscatterdpd , VexMr_VM , E(660F38,A2,_,x,_,1,3,T1S), 0 , 129, 0 , 411, 152), // #1635 + INST(Vscatterdps , VexMr_VM , E(660F38,A2,_,x,_,0,2,T1S), 0 , 130, 0 , 410, 152), // #1636 + INST(Vscatterpf0dpd , VexM_VM , E(660F38,C6,5,2,_,1,3,T1S), 0 , 232, 0 , 310, 170), // #1637 + INST(Vscatterpf0dps , VexM_VM , E(660F38,C6,5,2,_,0,2,T1S), 0 , 233, 0 , 311, 170), // #1638 + INST(Vscatterpf0qpd , VexM_VM , E(660F38,C7,5,2,_,1,3,T1S), 0 , 232, 0 , 312, 170), // #1639 + INST(Vscatterpf0qps , VexM_VM , E(660F38,C7,5,2,_,0,2,T1S), 0 , 233, 0 , 312, 170), // #1640 + INST(Vscatterpf1dpd , VexM_VM , E(660F38,C6,6,2,_,1,3,T1S), 0 , 234, 0 , 310, 170), // #1641 + INST(Vscatterpf1dps , VexM_VM , E(660F38,C6,6,2,_,0,2,T1S), 0 , 235, 0 , 311, 170), // #1642 + INST(Vscatterpf1qpd , VexM_VM , E(660F38,C7,6,2,_,1,3,T1S), 0 , 234, 0 , 312, 170), // #1643 + INST(Vscatterpf1qps , VexM_VM , E(660F38,C7,6,2,_,0,2,T1S), 0 , 235, 0 , 312, 170), // #1644 + INST(Vscatterqpd , VexMr_VM , E(660F38,A3,_,x,_,1,3,T1S), 0 , 129, 0 , 413, 152), // #1645 + INST(Vscatterqps , VexMr_VM , E(660F38,A3,_,x,_,0,2,T1S), 0 , 130, 0 , 412, 152), // #1646 + INST(Vsha512msg1 , VexRm , V(F20F38,CC,_,1,0,_,_,_ ), 0 , 236, 0 , 439, 196), // #1647 + INST(Vsha512msg2 , VexRm , V(F20F38,CD,_,1,0,_,_,_ ), 0 , 236, 0 , 440, 196), // #1648 + INST(Vsha512rnds2 , VexRvm , V(F20F38,CB,_,1,0,_,_,_ ), 0 , 236, 0 , 441, 196), // #1649 + INST(Vshuff32x4 , VexRvmi_Lx , E(660F3A,23,_,x,_,0,4,FV ), 0 , 112, 0 , 442, 152), // #1650 + INST(Vshuff64x2 , VexRvmi_Lx , E(660F3A,23,_,x,_,1,4,FV ), 0 , 113, 0 , 443, 152), // #1651 + INST(Vshufi32x4 , VexRvmi_Lx , E(660F3A,43,_,x,_,0,4,FV ), 0 , 112, 0 , 442, 152), // #1652 + INST(Vshufi64x2 , VexRvmi_Lx , E(660F3A,43,_,x,_,1,4,FV ), 0 , 113, 0 , 443, 152), // #1653 + INST(Vshufpd , VexRvmi_Lx , V(660F00,C6,_,x,I,1,4,FV ), 0 , 104, 0 , 444, 145), // #1654 + INST(Vshufps , VexRvmi_Lx , V(000F00,C6,_,x,I,0,4,FV ), 0 , 106, 0 , 445, 145), // #1655 + INST(Vsm3msg1 , VexRvm , V(000F38,DA,_,0,0,_,_,_ ), 0 , 11 , 0 , 446, 197), // #1656 + INST(Vsm3msg2 , VexRvm , V(660F38,DA,_,0,0,_,_,_ ), 0 , 30 , 0 , 446, 197), // #1657 + INST(Vsm3rnds2 , VexRvmi , V(660F3A,DE,_,0,0,_,_,_ ), 0 , 75 , 0 , 283, 197), // #1658 + INST(Vsm4key4 , VexRvm_Lx , V(F30F38,DA,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 198), // #1659 + INST(Vsm4rnds4 , VexRvm_Lx , V(F20F38,DA,_,x,0,_,_,_ ), 0 , 85 , 0 , 206, 198), // #1660 + INST(Vsqrtpd , VexRm_Lx , V(660F00,51,_,x,I,1,4,FV ), 0 , 104, 0 , 447, 145), // #1661 + INST(Vsqrtph , VexRm_Lx , E(00MAP5,51,_,_,_,0,4,FV ), 0 , 105, 0 , 252, 146), // #1662 + INST(Vsqrtps , VexRm_Lx , V(000F00,51,_,x,I,0,4,FV ), 0 , 106, 0 , 240, 145), // #1663 + INST(Vsqrtsd , VexRvm , V(F20F00,51,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #1664 + INST(Vsqrtsh , VexRvm , E(F3MAP5,51,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #1665 + INST(Vsqrtss , VexRvm , V(F30F00,51,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #1666 + INST(Vstmxcsr , VexM , V(000F00,AE,3,0,I,_,_,_ ), 0 , 237, 0 , 327, 149), // #1667 + INST(Vsubpd , VexRvm_Lx , V(660F00,5C,_,x,I,1,4,FV ), 0 , 104, 0 , 200, 145), // #1668 + INST(Vsubph , VexRvm_Lx , E(00MAP5,5C,_,_,_,0,4,FV ), 0 , 105, 0 , 201, 146), // #1669 + INST(Vsubps , VexRvm_Lx , V(000F00,5C,_,x,I,0,4,FV ), 0 , 106, 0 , 202, 145), // #1670 + INST(Vsubsd , VexRvm , V(F20F00,5C,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #1671 + INST(Vsubsh , VexRvm , E(F3MAP5,5C,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #1672 + INST(Vsubss , VexRvm , V(F30F00,5C,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #1673 + INST(Vtestpd , VexRm_Lx , V(660F38,0F,_,x,0,_,_,_ ), 0 , 30 , 0 , 305, 185), // #1674 + INST(Vtestps , VexRm_Lx , V(660F38,0E,_,x,0,_,_,_ ), 0 , 30 , 0 , 305, 185), // #1675 + INST(Vucomisd , VexRm , V(660F00,2E,_,I,I,1,3,T1S), 0 , 126, 0 , 234, 158), // #1676 + INST(Vucomish , VexRm , E(00MAP5,2E,_,_,_,0,1,T1S), 0 , 127, 0 , 235, 159), // #1677 + INST(Vucomiss , VexRm , V(000F00,2E,_,I,I,0,2,T1S), 0 , 128, 0 , 236, 158), // #1678 + INST(Vunpckhpd , VexRvm_Lx , V(660F00,15,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 145), // #1679 + INST(Vunpckhps , VexRvm_Lx , V(000F00,15,_,x,I,0,4,FV ), 0 , 106, 0 , 213, 145), // #1680 + INST(Vunpcklpd , VexRvm_Lx , V(660F00,14,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 145), // #1681 + INST(Vunpcklps , VexRvm_Lx , V(000F00,14,_,x,I,0,4,FV ), 0 , 106, 0 , 213, 145), // #1682 + INST(Vxorpd , VexRvm_Lx , V(660F00,57,_,x,I,1,4,FV ), 0 , 104, 0 , 425, 153), // #1683 + INST(Vxorps , VexRvm_Lx , V(000F00,57,_,x,I,0,4,FV ), 0 , 106, 0 , 424, 153), // #1684 + INST(Vzeroall , VexOp , V(000F00,77,_,1,I,_,_,_ ), 0 , 70 , 0 , 448, 149), // #1685 + INST(Vzeroupper , VexOp , V(000F00,77,_,0,I,_,_,_ ), 0 , 74 , 0 , 448, 149), // #1686 + INST(Wbinvd , X86Op , O(000F00,09,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 45 ), // #1687 + INST(Wbnoinvd , X86Op , O(F30F00,09,_,_,_,_,_,_ ), 0 , 7 , 0 , 31 , 199), // #1688 + INST(Wrfsbase , X86M , O(F30F00,AE,2,_,x,_,_,_ ), 0 , 238, 0 , 177, 122), // #1689 + INST(Wrgsbase , X86M , O(F30F00,AE,3,_,x,_,_,_ ), 0 , 239, 0 , 177, 122), // #1690 + INST(Wrmsr , X86Op , O(000F00,30,_,_,_,_,_,_ ), 0 , 5 , 0 , 178, 123), // #1691 + INST(Wrssd , X86Mr , O(000F38,F6,_,_,_,_,_,_ ), 0 , 1 , 0 , 449, 65 ), // #1692 + INST(Wrssq , X86Mr , O(000F38,F6,_,_,1,_,_,_ ), 0 , 240, 0 , 450, 65 ), // #1693 + INST(Wrussd , X86Mr , O(660F38,F5,_,_,_,_,_,_ ), 0 , 2 , 0 , 449, 65 ), // #1694 + INST(Wrussq , X86Mr , O(660F38,F5,_,_,1,_,_,_ ), 0 , 241, 0 , 450, 65 ), // #1695 + INST(Xabort , X86Op_Mod11RM_I8 , O(000000,C6,7,_,_,_,_,_ ), 0 , 29 , 0 , 84 , 200), // #1696 + INST(Xadd , X86Xadd , O(000F00,C0,_,_,x,_,_,_ ), 0 , 5 , 0 , 451, 40 ), // #1697 + INST(Xbegin , X86JmpRel , O(000000,C7,7,_,_,_,_,_ ), 0 , 29 , 0 , 452, 200), // #1698 + INST(Xchg , X86Xchg , O(000000,86,_,_,x,_,_,_ ), 0 , 0 , 0 , 453, 0 ), // #1699 + INST(Xend , X86Op , O(000F01,D5,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 200), // #1700 + INST(Xgetbv , X86Op , O(000F01,D0,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 201), // #1701 + INST(Xlatb , X86Op , O(000000,D7,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #1702 + INST(Xor , X86Arith , O(000000,30,6,_,x,_,_,_ ), 0 , 34 , 0 , 183, 1 ), // #1703 + INST(Xorpd , ExtRm , O(660F00,57,_,_,_,_,_,_ ), 0 , 4 , 0 , 155, 5 ), // #1704 + INST(Xorps , ExtRm , O(000F00,57,_,_,_,_,_,_ ), 0 , 5 , 0 , 155, 6 ), // #1705 + INST(Xresldtrk , X86Op , O(F20F01,E9,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 202), // #1706 + INST(Xrstor , X86M_Only_EDX_EAX , O(000F00,AE,5,_,_,_,_,_ ), 0 , 79 , 0 , 454, 201), // #1707 + INST(Xrstor64 , X86M_Only_EDX_EAX , O(000F00,AE,5,_,1,_,_,_ ), 0 , 242, 0 , 455, 201), // #1708 + INST(Xrstors , X86M_Only_EDX_EAX , O(000F00,C7,3,_,_,_,_,_ ), 0 , 80 , 0 , 454, 203), // #1709 + INST(Xrstors64 , X86M_Only_EDX_EAX , O(000F00,C7,3,_,1,_,_,_ ), 0 , 243, 0 , 455, 203), // #1710 + INST(Xsave , X86M_Only_EDX_EAX , O(000F00,AE,4,_,_,_,_,_ ), 0 , 98 , 0 , 454, 201), // #1711 + INST(Xsave64 , X86M_Only_EDX_EAX , O(000F00,AE,4,_,1,_,_,_ ), 0 , 244, 0 , 455, 201), // #1712 + INST(Xsavec , X86M_Only_EDX_EAX , O(000F00,C7,4,_,_,_,_,_ ), 0 , 98 , 0 , 454, 204), // #1713 + INST(Xsavec64 , X86M_Only_EDX_EAX , O(000F00,C7,4,_,1,_,_,_ ), 0 , 244, 0 , 455, 204), // #1714 + INST(Xsaveopt , X86M_Only_EDX_EAX , O(000F00,AE,6,_,_,_,_,_ ), 0 , 82 , 0 , 454, 205), // #1715 + INST(Xsaveopt64 , X86M_Only_EDX_EAX , O(000F00,AE,6,_,1,_,_,_ ), 0 , 245, 0 , 455, 205), // #1716 + INST(Xsaves , X86M_Only_EDX_EAX , O(000F00,C7,5,_,_,_,_,_ ), 0 , 79 , 0 , 454, 203), // #1717 + INST(Xsaves64 , X86M_Only_EDX_EAX , O(000F00,C7,5,_,1,_,_,_ ), 0 , 242, 0 , 455, 203), // #1718 + INST(Xsetbv , X86Op , O(000F01,D1,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 201), // #1719 + INST(Xsusldtrk , X86Op , O(F20F01,E8,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 202), // #1720 + INST(Xtest , X86Op , O(000F01,D6,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 206) // #1721 // ${InstInfo:End} }; #undef NAME_DATA_INDEX @@ -1747,248 +1780,251 @@ const InstDB::InstInfo InstDB::_instInfoTable[] = { // ------------------- Automatically generated, do not edit ------------------- const uint32_t InstDB::_mainOpcodeTable[] = { O(000000,00,0,0,0,0,0,0 ), // #0 [ref=56x] - O(000000,00,2,0,0,0,0,0 ), // #1 [ref=4x] - O(660F38,00,0,0,0,0,0,0 ), // #2 [ref=43x] - O(660F00,00,0,0,0,0,0,0 ), // #3 [ref=38x] - O(000F00,00,0,0,0,0,0,0 ), // #4 [ref=231x] - O(F20F00,00,0,0,0,0,0,0 ), // #5 [ref=24x] - O(F30F00,00,0,0,0,0,0,0 ), // #6 [ref=29x] - O(F30F38,00,0,0,0,0,0,0 ), // #7 [ref=2x] - O(660F3A,00,0,0,0,0,0,0 ), // #8 [ref=22x] - O(000000,00,4,0,0,0,0,0 ), // #9 [ref=5x] - V(000F38,00,0,0,0,0,0,None), // #10 [ref=6x] - V(XOP_M9,00,1,0,0,0,0,None), // #11 [ref=3x] - V(XOP_M9,00,6,0,0,0,0,None), // #12 [ref=2x] - V(XOP_M9,00,5,0,0,0,0,None), // #13 [ref=1x] - V(XOP_M9,00,3,0,0,0,0,None), // #14 [ref=1x] - V(XOP_M9,00,2,0,0,0,0,None), // #15 [ref=1x] - V(000F38,00,3,0,0,0,0,None), // #16 [ref=1x] - V(000F38,00,2,0,0,0,0,None), // #17 [ref=1x] - V(000F38,00,1,0,0,0,0,None), // #18 [ref=1x] - O(660000,00,0,0,0,0,0,0 ), // #19 [ref=7x] - O(000000,00,0,0,1,0,0,0 ), // #20 [ref=3x] - O(000F01,00,0,0,0,0,0,0 ), // #21 [ref=29x] - O(000F00,00,7,0,0,0,0,0 ), // #22 [ref=5x] - O(660F00,00,7,0,0,0,0,0 ), // #23 [ref=1x] - O(F30F00,00,6,0,0,0,0,0 ), // #24 [ref=4x] - O(F30F01,00,0,0,0,0,0,0 ), // #25 [ref=9x] - O(660F00,00,6,0,0,0,0,0 ), // #26 [ref=3x] - O(000000,00,7,0,0,0,0,0 ), // #27 [ref=5x] - O(000F00,00,1,0,1,0,0,0 ), // #28 [ref=2x] - O(000F00,00,1,0,0,0,0,0 ), // #29 [ref=6x] - O(F20F38,00,0,0,0,0,0,0 ), // #30 [ref=2x] - O(000000,00,1,0,0,0,0,0 ), // #31 [ref=3x] - O(000000,00,6,0,0,0,0,0 ), // #32 [ref=3x] - O(F30F00,00,7,0,0,0,0,3 ), // #33 [ref=1x] - O(F30F00,00,7,0,0,0,0,2 ), // #34 [ref=1x] - O_FPU(00,D900,0) , // #35 [ref=29x] - O_FPU(00,C000,0) , // #36 [ref=1x] - O_FPU(00,DE00,0) , // #37 [ref=7x] - O_FPU(00,0000,4) , // #38 [ref=4x] - O_FPU(00,0000,6) , // #39 [ref=4x] - O_FPU(9B,DB00,0) , // #40 [ref=2x] - O_FPU(00,DA00,0) , // #41 [ref=5x] - O_FPU(00,DB00,0) , // #42 [ref=8x] - O_FPU(00,D000,2) , // #43 [ref=1x] - O_FPU(00,DF00,0) , // #44 [ref=2x] - O_FPU(00,D800,3) , // #45 [ref=1x] - O_FPU(00,F000,6) , // #46 [ref=1x] - O_FPU(00,F800,7) , // #47 [ref=1x] - O_FPU(00,DD00,0) , // #48 [ref=3x] - O_FPU(00,0000,0) , // #49 [ref=4x] - O_FPU(00,0000,2) , // #50 [ref=3x] - O_FPU(00,0000,3) , // #51 [ref=3x] - O_FPU(00,0000,7) , // #52 [ref=3x] - O_FPU(00,0000,1) , // #53 [ref=2x] - O_FPU(00,0000,5) , // #54 [ref=2x] - O_FPU(00,C800,1) , // #55 [ref=1x] - O_FPU(9B,0000,6) , // #56 [ref=2x] - O_FPU(9B,0000,7) , // #57 [ref=2x] - O_FPU(00,E000,4) , // #58 [ref=1x] - O_FPU(00,E800,5) , // #59 [ref=1x] - O(000F00,00,0,0,1,0,0,0 ), // #60 [ref=3x] - O(F30F3A,00,0,0,0,0,0,0 ), // #61 [ref=1x] - O(000000,00,5,0,0,0,0,0 ), // #62 [ref=4x] - O(F30F00,00,5,0,0,0,0,0 ), // #63 [ref=2x] - O(F30F00,00,5,0,1,0,0,0 ), // #64 [ref=1x] - V(660F00,00,0,1,0,0,0,None), // #65 [ref=7x] - V(660F00,00,0,1,1,0,0,None), // #66 [ref=6x] - V(000F00,00,0,1,1,0,0,None), // #67 [ref=7x] - V(000F00,00,0,1,0,0,0,None), // #68 [ref=8x] - V(660F00,00,0,0,0,0,0,None), // #69 [ref=15x] - V(660F00,00,0,0,1,0,0,None), // #70 [ref=4x] - V(000F00,00,0,0,1,0,0,None), // #71 [ref=4x] - V(000F00,00,0,0,0,0,0,None), // #72 [ref=10x] - V(660F3A,00,0,0,0,0,0,None), // #73 [ref=47x] - V(660F3A,00,0,0,1,0,0,None), // #74 [ref=4x] - O(000000,00,3,0,0,0,0,0 ), // #75 [ref=4x] - O(000F00,00,2,0,0,0,0,0 ), // #76 [ref=5x] - O(000F00,00,5,0,0,0,0,0 ), // #77 [ref=4x] - O(000F00,00,3,0,0,0,0,0 ), // #78 [ref=5x] - V(XOP_M9,00,0,0,0,0,0,None), // #79 [ref=32x] - O(000F00,00,6,0,0,0,0,0 ), // #80 [ref=5x] - V(XOP_MA,00,0,0,0,0,0,None), // #81 [ref=1x] - V(XOP_MA,00,1,0,0,0,0,None), // #82 [ref=1x] - O(000F38,00,0,0,0,0,0,0 ), // #83 [ref=24x] - V(F20F38,00,0,0,0,0,0,None), // #84 [ref=6x] - O(000F3A,00,0,0,0,0,0,0 ), // #85 [ref=4x] - O(F30000,00,0,0,0,0,0,0 ), // #86 [ref=1x] - O(000F0F,00,0,0,0,0,0,0 ), // #87 [ref=26x] - V(F30F38,00,0,0,0,0,0,None), // #88 [ref=5x] - O(000F3A,00,0,0,1,0,0,0 ), // #89 [ref=1x] - O(660F3A,00,0,0,1,0,0,0 ), // #90 [ref=1x] - O(F30F00,00,4,0,0,0,0,0 ), // #91 [ref=1x] - O(F20F01,00,0,0,0,0,0,0 ), // #92 [ref=4x] - O(F30F00,00,1,0,0,0,0,0 ), // #93 [ref=3x] - O(F30F00,00,7,0,0,0,0,0 ), // #94 [ref=1x] - V(F20F3A,00,0,0,0,0,0,None), // #95 [ref=1x] - V(660F38,00,0,0,0,0,0,None), // #96 [ref=26x] - O(000F00,00,4,0,0,0,0,0 ), // #97 [ref=4x] - V(XOP_M9,00,7,0,0,0,0,None), // #98 [ref=1x] - V(XOP_M9,00,4,0,0,0,0,None), // #99 [ref=1x] - O(F20F00,00,6,0,0,0,0,0 ), // #100 [ref=1x] - E(F20F38,00,0,2,0,0,4,None), // #101 [ref=4x] - E(F20F38,00,0,0,0,0,4,None), // #102 [ref=2x] - V(660F00,00,0,0,0,1,4,ByLL), // #103 [ref=25x] - E(00MAP5,00,0,0,0,0,4,ByLL), // #104 [ref=10x] - V(000F00,00,0,0,0,0,4,ByLL), // #105 [ref=19x] - V(F20F00,00,0,0,0,1,3,None), // #106 [ref=10x] - E(F3MAP5,00,0,0,0,0,1,None), // #107 [ref=13x] - V(F30F00,00,0,0,0,0,2,None), // #108 [ref=12x] - V(F20F00,00,0,0,0,0,0,None), // #109 [ref=4x] - V(660F38,00,0,0,0,0,4,ByLL), // #110 [ref=50x] - E(660F3A,00,0,0,0,0,4,ByLL), // #111 [ref=17x] - E(660F3A,00,0,0,0,1,4,ByLL), // #112 [ref=18x] - E(660F38,00,0,0,0,1,4,ByLL), // #113 [ref=40x] - E(660F38,00,0,0,0,0,4,ByLL), // #114 [ref=25x] - V(660F38,00,0,1,0,0,0,None), // #115 [ref=2x] - E(660F38,00,0,0,0,0,3,None), // #116 [ref=2x] - E(660F38,00,0,0,0,0,4,None), // #117 [ref=2x] - E(660F38,00,0,2,0,0,5,None), // #118 [ref=2x] - E(660F38,00,0,0,0,1,4,None), // #119 [ref=2x] - E(660F38,00,0,2,0,1,5,None), // #120 [ref=2x] - V(660F38,00,0,0,0,1,3,None), // #121 [ref=2x] - V(660F38,00,0,0,0,0,2,None), // #122 [ref=14x] - E(000F3A,00,0,0,0,0,4,ByLL), // #123 [ref=5x] - E(F30F3A,00,0,0,0,0,1,None), // #124 [ref=1x] - V(660F00,00,0,0,0,1,3,None), // #125 [ref=5x] - E(00MAP5,00,0,0,0,0,1,None), // #126 [ref=2x] - V(000F00,00,0,0,0,0,2,None), // #127 [ref=2x] - E(660F38,00,0,0,0,1,3,None), // #128 [ref=14x] - E(660F38,00,0,0,0,0,2,None), // #129 [ref=14x] - V(F30F00,00,0,0,0,0,3,ByLL), // #130 [ref=1x] - E(F20F38,00,0,0,0,0,4,ByLL), // #131 [ref=2x] - E(F30F38,00,0,0,0,0,4,ByLL), // #132 [ref=4x] - V(F20F00,00,0,0,0,1,4,ByLL), // #133 [ref=1x] - E(66MAP5,00,0,0,0,1,4,ByLL), // #134 [ref=1x] - E(660F00,00,0,0,0,1,4,ByLL), // #135 [ref=10x] - E(000F00,00,0,0,0,1,4,ByLL), // #136 [ref=3x] - E(66MAP5,00,0,0,0,0,3,ByLL), // #137 [ref=1x] - E(00MAP5,00,0,0,0,0,2,ByLL), // #138 [ref=1x] - V(660F38,00,0,0,0,0,3,ByLL), // #139 [ref=7x] - E(66MAP6,00,0,0,0,0,3,ByLL), // #140 [ref=1x] - E(66MAP5,00,0,0,0,0,2,ByLL), // #141 [ref=4x] - E(00MAP5,00,0,0,0,0,3,ByLL), // #142 [ref=2x] - E(66MAP5,00,0,0,0,0,4,ByLL), // #143 [ref=3x] - V(660F00,00,0,0,0,0,4,ByLL), // #144 [ref=43x] - V(000F00,00,0,0,0,0,3,ByLL), // #145 [ref=1x] - V(660F3A,00,0,0,0,0,3,ByLL), // #146 [ref=1x] - E(660F00,00,0,0,0,0,3,ByLL), // #147 [ref=4x] - E(000F00,00,0,0,0,0,4,ByLL), // #148 [ref=2x] - E(F30F00,00,0,0,0,1,4,ByLL), // #149 [ref=3x] - E(00MAP5,00,0,0,0,1,4,ByLL), // #150 [ref=1x] - E(F2MAP5,00,0,0,0,1,3,None), // #151 [ref=1x] - V(F20F00,00,0,0,0,0,3,None), // #152 [ref=2x] - E(F20F00,00,0,0,0,0,3,None), // #153 [ref=2x] - E(00MAP6,00,0,0,0,0,1,None), // #154 [ref=1x] - V(F20F00,00,0,0,0,0,2,T1W ), // #155 [ref=1x] - E(F3MAP5,00,0,0,0,0,2,T1W ), // #156 [ref=2x] - V(F30F00,00,0,0,0,0,2,T1W ), // #157 [ref=1x] - E(00MAP5,00,0,0,0,0,2,None), // #158 [ref=1x] - E(F30F00,00,0,0,0,0,2,None), // #159 [ref=2x] - E(F3MAP5,00,0,0,0,0,3,ByLL), // #160 [ref=1x] - V(F30F00,00,0,0,0,0,4,ByLL), // #161 [ref=4x] - E(F30F00,00,0,0,0,0,3,ByLL), // #162 [ref=1x] - E(F2MAP5,00,0,0,0,0,4,ByLL), // #163 [ref=2x] - E(F20F00,00,0,0,0,0,4,ByLL), // #164 [ref=2x] - E(F2MAP5,00,0,0,0,1,4,ByLL), // #165 [ref=1x] - E(F20F00,00,0,0,0,1,4,ByLL), // #166 [ref=2x] - E(F20F00,00,0,0,0,0,2,T1W ), // #167 [ref=1x] - E(F30F00,00,0,0,0,0,2,T1W ), // #168 [ref=1x] - E(F3MAP5,00,0,0,0,0,4,ByLL), // #169 [ref=1x] - E(660F38,00,0,2,0,1,4,ByLL), // #170 [ref=3x] - E(660F38,00,0,2,0,0,4,ByLL), // #171 [ref=3x] - V(660F3A,00,0,1,0,0,0,None), // #172 [ref=6x] - E(660F3A,00,0,0,0,0,4,None), // #173 [ref=4x] - E(660F3A,00,0,2,0,0,5,None), // #174 [ref=4x] - E(660F3A,00,0,0,0,1,4,None), // #175 [ref=4x] - E(660F3A,00,0,2,0,1,5,None), // #176 [ref=4x] - V(660F3A,00,0,0,0,0,2,None), // #177 [ref=4x] - E(F2MAP6,00,0,0,0,0,4,ByLL), // #178 [ref=2x] - E(F2MAP6,00,0,0,0,0,2,None), // #179 [ref=2x] - E(660F3A,00,0,0,0,1,3,None), // #180 [ref=6x] - E(660F3A,00,0,0,0,0,2,None), // #181 [ref=6x] - V(660F38,00,0,0,1,1,4,ByLL), // #182 [ref=20x] - E(66MAP6,00,0,0,0,0,4,ByLL), // #183 [ref=22x] - V(660F38,00,0,0,1,1,3,None), // #184 [ref=12x] - E(66MAP6,00,0,0,0,0,1,None), // #185 [ref=16x] - E(F3MAP6,00,0,0,0,0,4,ByLL), // #186 [ref=2x] - E(F3MAP6,00,0,0,0,0,2,None), // #187 [ref=2x] - E(000F3A,00,0,0,0,0,1,None), // #188 [ref=4x] - V(660F38,00,0,0,1,0,0,None), // #189 [ref=5x] - E(660F38,00,1,2,0,1,3,None), // #190 [ref=2x] - E(660F38,00,1,2,0,0,2,None), // #191 [ref=2x] - E(660F38,00,2,2,0,1,3,None), // #192 [ref=2x] - E(660F38,00,2,2,0,0,2,None), // #193 [ref=2x] - V(660F3A,00,0,0,1,1,4,ByLL), // #194 [ref=2x] - V(000F00,00,2,0,0,0,0,None), // #195 [ref=1x] - V(660F00,00,0,0,0,0,2,None), // #196 [ref=1x] - V(F20F00,00,0,0,0,1,3,DUP ), // #197 [ref=1x] - E(660F00,00,0,0,0,0,4,ByLL), // #198 [ref=6x] - V(F30F00,00,0,0,0,0,0,None), // #199 [ref=3x] - E(F30F00,00,0,0,0,0,4,ByLL), // #200 [ref=1x] - V(000F00,00,0,0,0,0,3,None), // #201 [ref=2x] - E(66MAP5,00,0,0,0,0,1,None), // #202 [ref=1x] - E(F20F38,00,0,0,0,1,4,ByLL), // #203 [ref=1x] - V(660F3A,00,0,0,0,0,4,ByLL), // #204 [ref=2x] - E(F30F38,00,0,0,0,1,0,None), // #205 [ref=5x] - E(F30F38,00,0,0,0,0,0,None), // #206 [ref=5x] - V(660F38,00,0,0,0,0,1,None), // #207 [ref=1x] - V(XOP_M8,00,0,0,0,0,0,None), // #208 [ref=22x] - V(660F38,00,0,0,0,1,4,ByLL), // #209 [ref=4x] - E(660F38,00,0,0,0,0,0,None), // #210 [ref=2x] - E(660F38,00,0,0,0,1,1,None), // #211 [ref=2x] - E(660F38,00,0,0,1,1,4,ByLL), // #212 [ref=1x] - V(660F3A,00,0,0,1,1,3,None), // #213 [ref=2x] - V(660F3A,00,0,0,0,0,1,None), // #214 [ref=1x] - V(660F00,00,0,0,0,0,1,None), // #215 [ref=1x] - E(F30F38,00,0,0,0,0,2,ByLL), // #216 [ref=6x] - E(F30F38,00,0,0,0,0,3,ByLL), // #217 [ref=9x] - E(F30F38,00,0,0,0,0,1,ByLL), // #218 [ref=3x] - V(660F38,00,0,0,0,0,2,ByLL), // #219 [ref=4x] - V(660F38,00,0,0,0,0,1,ByLL), // #220 [ref=2x] - E(660F00,00,1,0,0,0,4,ByLL), // #221 [ref=1x] - E(660F00,00,1,0,0,1,4,ByLL), // #222 [ref=1x] - V(F20F00,00,0,0,0,0,4,ByLL), // #223 [ref=1x] - V(660F00,00,0,0,0,0,4,None), // #224 [ref=6x] - V(660F00,00,7,0,0,0,4,ByLL), // #225 [ref=1x] - V(660F00,00,0,0,0,1,4,None), // #226 [ref=2x] - E(660F00,00,0,0,0,1,4,None), // #227 [ref=1x] - V(660F00,00,3,0,0,0,4,ByLL), // #228 [ref=1x] - E(F30F38,00,0,0,0,1,4,ByLL), // #229 [ref=2x] - E(660F38,00,5,2,0,1,3,None), // #230 [ref=2x] - E(660F38,00,5,2,0,0,2,None), // #231 [ref=2x] - E(660F38,00,6,2,0,1,3,None), // #232 [ref=2x] - E(660F38,00,6,2,0,0,2,None), // #233 [ref=2x] - V(000F00,00,3,0,0,0,0,None), // #234 [ref=1x] - O(F30F00,00,2,0,0,0,0,0 ), // #235 [ref=1x] - O(F30F00,00,3,0,0,0,0,0 ), // #236 [ref=1x] - O(000F38,00,0,0,1,0,0,0 ), // #237 [ref=1x] - O(660F38,00,0,0,1,0,0,0 ), // #238 [ref=1x] - O(000F00,00,5,0,1,0,0,0 ), // #239 [ref=2x] - O(000F00,00,3,0,1,0,0,0 ), // #240 [ref=1x] - O(000F00,00,4,0,1,0,0,0 ), // #241 [ref=2x] - O(000F00,00,6,0,1,0,0,0 ) // #242 [ref=1x] + O(000F38,00,0,0,0,0,0,0 ), // #1 [ref=25x] + O(660F38,00,0,0,0,0,0,0 ), // #2 [ref=44x] + O(000000,00,2,0,0,0,0,0 ), // #3 [ref=4x] + O(660F00,00,0,0,0,0,0,0 ), // #4 [ref=38x] + O(000F00,00,0,0,0,0,0,0 ), // #5 [ref=231x] + O(F20F00,00,0,0,0,0,0,0 ), // #6 [ref=24x] + O(F30F00,00,0,0,0,0,0,0 ), // #7 [ref=29x] + O(F30F38,00,0,0,0,0,0,0 ), // #8 [ref=3x] + O(660F3A,00,0,0,0,0,0,0 ), // #9 [ref=22x] + O(000000,00,4,0,0,0,0,0 ), // #10 [ref=5x] + V(000F38,00,0,0,0,0,0,None), // #11 [ref=13x] + O(F20F38,00,0,0,0,0,0,0 ), // #12 [ref=3x] + V(XOP_M9,00,1,0,0,0,0,None), // #13 [ref=3x] + V(XOP_M9,00,6,0,0,0,0,None), // #14 [ref=2x] + V(XOP_M9,00,5,0,0,0,0,None), // #15 [ref=1x] + V(XOP_M9,00,3,0,0,0,0,None), // #16 [ref=1x] + V(XOP_M9,00,2,0,0,0,0,None), // #17 [ref=1x] + V(000F38,00,3,0,0,0,0,None), // #18 [ref=1x] + V(000F38,00,2,0,0,0,0,None), // #19 [ref=1x] + V(000F38,00,1,0,0,0,0,None), // #20 [ref=1x] + O(660000,00,0,0,0,0,0,0 ), // #21 [ref=7x] + O(000000,00,0,0,1,0,0,0 ), // #22 [ref=3x] + O(000F01,00,0,0,0,0,0,0 ), // #23 [ref=32x] + O(000F00,00,7,0,0,0,0,0 ), // #24 [ref=6x] + O(660F00,00,7,0,0,0,0,0 ), // #25 [ref=1x] + O(F30F00,00,6,0,0,0,0,0 ), // #26 [ref=4x] + O(F30F01,00,0,0,0,0,0,0 ), // #27 [ref=9x] + O(660F00,00,6,0,0,0,0,0 ), // #28 [ref=3x] + O(000000,00,7,0,0,0,0,0 ), // #29 [ref=5x] + V(660F38,00,0,0,0,0,0,None), // #30 [ref=48x] + O(000F00,00,1,0,1,0,0,0 ), // #31 [ref=2x] + O(000F00,00,1,0,0,0,0,0 ), // #32 [ref=6x] + O(000000,00,1,0,0,0,0,0 ), // #33 [ref=3x] + O(000000,00,6,0,0,0,0,0 ), // #34 [ref=3x] + O(F30F00,00,7,0,0,0,0,3 ), // #35 [ref=1x] + O(F30F00,00,7,0,0,0,0,2 ), // #36 [ref=1x] + O_FPU(00,D900,0) , // #37 [ref=29x] + O_FPU(00,C000,0) , // #38 [ref=1x] + O_FPU(00,DE00,0) , // #39 [ref=7x] + O_FPU(00,0000,4) , // #40 [ref=4x] + O_FPU(00,0000,6) , // #41 [ref=4x] + O_FPU(9B,DB00,0) , // #42 [ref=2x] + O_FPU(00,DA00,0) , // #43 [ref=5x] + O_FPU(00,DB00,0) , // #44 [ref=8x] + O_FPU(00,D000,2) , // #45 [ref=1x] + O_FPU(00,DF00,0) , // #46 [ref=2x] + O_FPU(00,D800,3) , // #47 [ref=1x] + O_FPU(00,F000,6) , // #48 [ref=1x] + O_FPU(00,F800,7) , // #49 [ref=1x] + O_FPU(00,DD00,0) , // #50 [ref=3x] + O_FPU(00,0000,0) , // #51 [ref=4x] + O_FPU(00,0000,2) , // #52 [ref=3x] + O_FPU(00,0000,3) , // #53 [ref=3x] + O_FPU(00,0000,7) , // #54 [ref=3x] + O_FPU(00,0000,1) , // #55 [ref=2x] + O_FPU(00,0000,5) , // #56 [ref=2x] + O_FPU(00,C800,1) , // #57 [ref=1x] + O_FPU(9B,0000,6) , // #58 [ref=2x] + O_FPU(9B,0000,7) , // #59 [ref=2x] + O_FPU(00,E000,4) , // #60 [ref=1x] + O_FPU(00,E800,5) , // #61 [ref=1x] + O(000F00,00,0,0,1,0,0,0 ), // #62 [ref=3x] + O(F30F3A,00,0,0,0,0,0,0 ), // #63 [ref=1x] + O(000000,00,5,0,0,0,0,0 ), // #64 [ref=4x] + O(F30F00,00,5,0,0,0,0,0 ), // #65 [ref=2x] + O(F30F00,00,5,0,1,0,0,0 ), // #66 [ref=1x] + V(660F00,00,0,1,0,0,0,None), // #67 [ref=7x] + V(660F00,00,0,1,1,0,0,None), // #68 [ref=6x] + V(000F00,00,0,1,1,0,0,None), // #69 [ref=7x] + V(000F00,00,0,1,0,0,0,None), // #70 [ref=8x] + V(660F00,00,0,0,0,0,0,None), // #71 [ref=15x] + V(660F00,00,0,0,1,0,0,None), // #72 [ref=4x] + V(000F00,00,0,0,1,0,0,None), // #73 [ref=4x] + V(000F00,00,0,0,0,0,0,None), // #74 [ref=10x] + V(660F3A,00,0,0,0,0,0,None), // #75 [ref=48x] + V(660F3A,00,0,0,1,0,0,None), // #76 [ref=4x] + O(000000,00,3,0,0,0,0,0 ), // #77 [ref=4x] + O(000F00,00,2,0,0,0,0,0 ), // #78 [ref=5x] + O(000F00,00,5,0,0,0,0,0 ), // #79 [ref=4x] + O(000F00,00,3,0,0,0,0,0 ), // #80 [ref=5x] + V(XOP_M9,00,0,0,0,0,0,None), // #81 [ref=32x] + O(000F00,00,6,0,0,0,0,0 ), // #82 [ref=6x] + V(XOP_MA,00,0,0,0,0,0,None), // #83 [ref=1x] + V(XOP_MA,00,1,0,0,0,0,None), // #84 [ref=1x] + V(F20F38,00,0,0,0,0,0,None), // #85 [ref=11x] + O(000F3A,00,0,0,0,0,0,0 ), // #86 [ref=4x] + O(F30000,00,0,0,0,0,0,0 ), // #87 [ref=1x] + O(000F0F,00,0,0,0,0,0,0 ), // #88 [ref=26x] + V(F30F38,00,0,0,0,0,0,None), // #89 [ref=12x] + O(000F3A,00,0,0,1,0,0,0 ), // #90 [ref=1x] + O(660F3A,00,0,0,1,0,0,0 ), // #91 [ref=1x] + O(F30F00,00,4,0,0,0,0,0 ), // #92 [ref=1x] + O(F20F01,00,0,0,0,0,0,0 ), // #93 [ref=5x] + O(F30F00,00,1,0,0,0,0,0 ), // #94 [ref=3x] + O(F30F00,00,7,0,0,0,0,0 ), // #95 [ref=1x] + V(F20F3A,00,0,0,0,0,0,None), // #96 [ref=1x] + O(660F01,00,0,0,0,0,0,0 ), // #97 [ref=4x] + O(000F00,00,4,0,0,0,0,0 ), // #98 [ref=4x] + V(XOP_M9,00,7,0,0,0,0,None), // #99 [ref=1x] + V(XOP_M9,00,4,0,0,0,0,None), // #100 [ref=1x] + O(F20F00,00,6,0,0,0,0,0 ), // #101 [ref=1x] + E(F20F38,00,0,2,0,0,4,None), // #102 [ref=4x] + E(F20F38,00,0,0,0,0,4,None), // #103 [ref=2x] + V(660F00,00,0,0,0,1,4,ByLL), // #104 [ref=25x] + E(00MAP5,00,0,0,0,0,4,ByLL), // #105 [ref=10x] + V(000F00,00,0,0,0,0,4,ByLL), // #106 [ref=19x] + V(F20F00,00,0,0,0,1,3,None), // #107 [ref=10x] + E(F3MAP5,00,0,0,0,0,1,None), // #108 [ref=13x] + V(F30F00,00,0,0,0,0,2,None), // #109 [ref=12x] + V(F20F00,00,0,0,0,0,0,None), // #110 [ref=4x] + V(660F38,00,0,0,0,0,4,ByLL), // #111 [ref=50x] + E(660F3A,00,0,0,0,0,4,ByLL), // #112 [ref=17x] + E(660F3A,00,0,0,0,1,4,ByLL), // #113 [ref=18x] + E(660F38,00,0,0,0,1,4,ByLL), // #114 [ref=38x] + E(660F38,00,0,0,0,0,4,ByLL), // #115 [ref=25x] + V(660F38,00,0,1,0,0,0,None), // #116 [ref=2x] + E(660F38,00,0,0,0,0,3,None), // #117 [ref=2x] + E(660F38,00,0,0,0,0,4,None), // #118 [ref=2x] + E(660F38,00,0,2,0,0,5,None), // #119 [ref=2x] + E(660F38,00,0,0,0,1,4,None), // #120 [ref=2x] + E(660F38,00,0,2,0,1,5,None), // #121 [ref=2x] + V(660F38,00,0,0,0,1,3,None), // #122 [ref=2x] + V(660F38,00,0,0,0,0,2,None), // #123 [ref=14x] + E(000F3A,00,0,0,0,0,4,ByLL), // #124 [ref=5x] + E(F30F3A,00,0,0,0,0,1,None), // #125 [ref=1x] + V(660F00,00,0,0,0,1,3,None), // #126 [ref=5x] + E(00MAP5,00,0,0,0,0,1,None), // #127 [ref=2x] + V(000F00,00,0,0,0,0,2,None), // #128 [ref=2x] + E(660F38,00,0,0,0,1,3,None), // #129 [ref=14x] + E(660F38,00,0,0,0,0,2,None), // #130 [ref=14x] + V(F30F00,00,0,0,0,0,3,ByLL), // #131 [ref=1x] + E(F20F38,00,0,0,0,0,4,ByLL), // #132 [ref=2x] + V(F30F38,00,0,0,0,0,4,ByLL), // #133 [ref=1x] + V(F20F00,00,0,0,0,1,4,ByLL), // #134 [ref=1x] + E(66MAP5,00,0,0,0,1,4,ByLL), // #135 [ref=1x] + E(660F00,00,0,0,0,1,4,ByLL), // #136 [ref=10x] + E(000F00,00,0,0,0,1,4,ByLL), // #137 [ref=3x] + E(66MAP5,00,0,0,0,0,3,ByLL), // #138 [ref=1x] + E(00MAP5,00,0,0,0,0,2,ByLL), // #139 [ref=1x] + V(660F38,00,0,0,0,0,3,ByLL), // #140 [ref=7x] + E(66MAP6,00,0,0,0,0,3,ByLL), // #141 [ref=1x] + E(66MAP5,00,0,0,0,0,2,ByLL), // #142 [ref=4x] + E(00MAP5,00,0,0,0,0,3,ByLL), // #143 [ref=2x] + E(66MAP5,00,0,0,0,0,4,ByLL), // #144 [ref=3x] + V(660F00,00,0,0,0,0,4,ByLL), // #145 [ref=43x] + V(000F00,00,0,0,0,0,3,ByLL), // #146 [ref=1x] + V(660F3A,00,0,0,0,0,3,ByLL), // #147 [ref=1x] + E(660F00,00,0,0,0,0,3,ByLL), // #148 [ref=4x] + E(000F00,00,0,0,0,0,4,ByLL), // #149 [ref=2x] + E(F30F00,00,0,0,0,1,4,ByLL), // #150 [ref=3x] + E(00MAP5,00,0,0,0,1,4,ByLL), // #151 [ref=1x] + E(F2MAP5,00,0,0,0,1,3,None), // #152 [ref=1x] + V(F20F00,00,0,0,0,0,3,None), // #153 [ref=2x] + E(F20F00,00,0,0,0,0,3,None), // #154 [ref=2x] + E(00MAP6,00,0,0,0,0,1,None), // #155 [ref=1x] + V(F20F00,00,0,0,0,0,2,T1W ), // #156 [ref=1x] + E(F3MAP5,00,0,0,0,0,2,T1W ), // #157 [ref=2x] + V(F30F00,00,0,0,0,0,2,T1W ), // #158 [ref=1x] + E(00MAP5,00,0,0,0,0,2,None), // #159 [ref=1x] + E(F30F00,00,0,0,0,0,2,None), // #160 [ref=2x] + E(F3MAP5,00,0,0,0,0,3,ByLL), // #161 [ref=1x] + V(F30F00,00,0,0,0,0,4,ByLL), // #162 [ref=4x] + E(F30F00,00,0,0,0,0,3,ByLL), // #163 [ref=1x] + E(F2MAP5,00,0,0,0,0,4,ByLL), // #164 [ref=2x] + E(F20F00,00,0,0,0,0,4,ByLL), // #165 [ref=2x] + E(F2MAP5,00,0,0,0,1,4,ByLL), // #166 [ref=1x] + E(F20F00,00,0,0,0,1,4,ByLL), // #167 [ref=2x] + E(F20F00,00,0,0,0,0,2,T1W ), // #168 [ref=1x] + E(F30F00,00,0,0,0,0,2,T1W ), // #169 [ref=1x] + E(F3MAP5,00,0,0,0,0,4,ByLL), // #170 [ref=1x] + E(F30F38,00,0,0,0,0,4,ByLL), // #171 [ref=3x] + E(660F38,00,0,2,0,1,4,ByLL), // #172 [ref=3x] + E(660F38,00,0,2,0,0,4,ByLL), // #173 [ref=3x] + V(660F3A,00,0,1,0,0,0,None), // #174 [ref=6x] + E(660F3A,00,0,0,0,0,4,None), // #175 [ref=4x] + E(660F3A,00,0,2,0,0,5,None), // #176 [ref=4x] + E(660F3A,00,0,0,0,1,4,None), // #177 [ref=4x] + E(660F3A,00,0,2,0,1,5,None), // #178 [ref=4x] + V(660F3A,00,0,0,0,0,2,None), // #179 [ref=4x] + E(F2MAP6,00,0,0,0,0,4,ByLL), // #180 [ref=2x] + E(F2MAP6,00,0,0,0,0,2,None), // #181 [ref=2x] + E(660F3A,00,0,0,0,1,3,None), // #182 [ref=6x] + E(660F3A,00,0,0,0,0,2,None), // #183 [ref=6x] + V(660F38,00,0,0,1,1,4,ByLL), // #184 [ref=22x] + E(66MAP6,00,0,0,0,0,4,ByLL), // #185 [ref=22x] + V(660F38,00,0,0,1,1,3,None), // #186 [ref=12x] + E(66MAP6,00,0,0,0,0,1,None), // #187 [ref=16x] + E(F3MAP6,00,0,0,0,0,4,ByLL), // #188 [ref=2x] + E(F3MAP6,00,0,0,0,0,2,None), // #189 [ref=2x] + E(000F3A,00,0,0,0,0,1,None), // #190 [ref=4x] + V(660F38,00,0,0,1,0,0,None), // #191 [ref=5x] + E(660F38,00,1,2,0,1,3,None), // #192 [ref=2x] + E(660F38,00,1,2,0,0,2,None), // #193 [ref=2x] + E(660F38,00,2,2,0,1,3,None), // #194 [ref=2x] + E(660F38,00,2,2,0,0,2,None), // #195 [ref=2x] + V(660F3A,00,0,0,1,1,4,ByLL), // #196 [ref=2x] + V(000F00,00,2,0,0,0,0,None), // #197 [ref=1x] + V(660F00,00,0,0,0,0,2,None), // #198 [ref=1x] + V(F20F00,00,0,0,0,1,3,DUP ), // #199 [ref=1x] + E(660F00,00,0,0,0,0,4,ByLL), // #200 [ref=6x] + V(F30F00,00,0,0,0,0,0,None), // #201 [ref=3x] + E(F30F00,00,0,0,0,0,4,ByLL), // #202 [ref=1x] + V(000F00,00,0,0,0,0,3,None), // #203 [ref=2x] + E(66MAP5,00,0,0,0,0,1,None), // #204 [ref=1x] + E(F20F38,00,0,0,0,1,4,ByLL), // #205 [ref=1x] + V(660F3A,00,0,0,0,0,4,ByLL), // #206 [ref=2x] + E(F30F38,00,0,0,0,1,0,None), // #207 [ref=5x] + E(F30F38,00,0,0,0,0,0,None), // #208 [ref=5x] + V(660F38,00,0,0,0,0,1,None), // #209 [ref=1x] + V(XOP_M8,00,0,0,0,0,0,None), // #210 [ref=22x] + V(660F38,00,0,0,0,1,4,ByLL), // #211 [ref=4x] + E(660F38,00,0,0,0,0,0,None), // #212 [ref=2x] + E(660F38,00,0,0,0,1,1,None), // #213 [ref=2x] + E(660F38,00,0,0,1,1,4,ByLL), // #214 [ref=1x] + V(660F3A,00,0,0,1,1,3,None), // #215 [ref=2x] + V(660F3A,00,0,0,0,0,1,None), // #216 [ref=1x] + V(660F00,00,0,0,0,0,1,None), // #217 [ref=1x] + E(F30F38,00,0,0,0,0,2,ByLL), // #218 [ref=6x] + E(F30F38,00,0,0,0,0,3,ByLL), // #219 [ref=9x] + E(F30F38,00,0,0,0,0,1,ByLL), // #220 [ref=3x] + V(660F38,00,0,0,0,0,2,ByLL), // #221 [ref=4x] + V(660F38,00,0,0,0,0,1,ByLL), // #222 [ref=2x] + E(660F00,00,1,0,0,0,4,ByLL), // #223 [ref=1x] + E(660F00,00,1,0,0,1,4,ByLL), // #224 [ref=1x] + V(F20F00,00,0,0,0,0,4,ByLL), // #225 [ref=1x] + V(660F00,00,0,0,0,0,4,None), // #226 [ref=6x] + V(660F00,00,7,0,0,0,4,ByLL), // #227 [ref=1x] + V(660F00,00,0,0,0,1,4,None), // #228 [ref=2x] + E(660F00,00,0,0,0,1,4,None), // #229 [ref=1x] + V(660F00,00,3,0,0,0,4,ByLL), // #230 [ref=1x] + E(F30F38,00,0,0,0,1,4,ByLL), // #231 [ref=2x] + E(660F38,00,5,2,0,1,3,None), // #232 [ref=2x] + E(660F38,00,5,2,0,0,2,None), // #233 [ref=2x] + E(660F38,00,6,2,0,1,3,None), // #234 [ref=2x] + E(660F38,00,6,2,0,0,2,None), // #235 [ref=2x] + V(F20F38,00,0,1,0,0,0,None), // #236 [ref=3x] + V(000F00,00,3,0,0,0,0,None), // #237 [ref=1x] + O(F30F00,00,2,0,0,0,0,0 ), // #238 [ref=1x] + O(F30F00,00,3,0,0,0,0,0 ), // #239 [ref=1x] + O(000F38,00,0,0,1,0,0,0 ), // #240 [ref=1x] + O(660F38,00,0,0,1,0,0,0 ), // #241 [ref=1x] + O(000F00,00,5,0,1,0,0,0 ), // #242 [ref=2x] + O(000F00,00,3,0,1,0,0,0 ), // #243 [ref=1x] + O(000F00,00,4,0,1,0,0,0 ), // #244 [ref=2x] + O(000F00,00,6,0,1,0,0,0 ) // #245 [ref=1x] }; // ---------------------------------------------------------------------------- // ${MainOpcodeTable:End} @@ -1996,7 +2032,7 @@ const uint32_t InstDB::_mainOpcodeTable[] = { // ${AltOpcodeTable:Begin} // ------------------- Automatically generated, do not edit ------------------- const uint32_t InstDB::_altOpcodeTable[] = { - O(000000,00,0,0,0,0,0,0 ), // #0 [ref=1514x] + O(000000,00,0,0,0,0,0,0 ), // #0 [ref=1573x] O(660F00,1B,0,0,0,0,0,0 ), // #1 [ref=1x] O(000F00,BA,4,0,0,0,0,0 ), // #2 [ref=1x] O(000F00,BA,7,0,0,0,0,0 ), // #3 [ref=1x] @@ -2151,449 +2187,461 @@ const uint32_t InstDB::_altOpcodeTable[] = { #define SAME_REG_HINT(VAL) uint8_t(InstSameRegHint::k##VAL) const InstDB::CommonInfo InstDB::_commonInfoTable[] = { { 0 , 0 , 0 , 0 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #0 [ref=1x] - { 0 , 0 , 383, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #1 [ref=4x] - { 0 , 0 , 384, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #2 [ref=2x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 16 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #3 [ref=2x] - { 0 , 0 , 180, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #4 [ref=2x] - { F(Vec) , 0 , 79 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #5 [ref=54x] - { F(Vec) , 0 , 106, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #6 [ref=19x] - { F(Vec) , 0 , 212, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #7 [ref=16x] - { F(Vec) , 0 , 221, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #8 [ref=20x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 28 , 11, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #9 [ref=1x] - { F(Vex) , 0 , 275, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #10 [ref=3x] - { F(Vec) , 0 , 79 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #11 [ref=12x] - { 0 , 0 , 385, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #12 [ref=1x] - { F(Vex) , 0 , 277, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #13 [ref=5x] - { F(Vex) , 0 , 180, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #14 [ref=12x] - { F(Vec) , 0 , 386, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #15 [ref=4x] - { 0 , 0 , 279, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #16 [ref=3x] - { F(Mib) , 0 , 387, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #17 [ref=1x] - { 0 , 0 , 388, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #18 [ref=1x] - { 0 , 0 , 281, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #19 [ref=1x] - { F(Mib) , 0 , 389, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #20 [ref=1x] - { 0 , 0 , 283, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #21 [ref=1x] - { 0 , 0 , 179, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #22 [ref=35x] - { 0 , 0 , 390, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #23 [ref=3x] - { 0 , 0 , 123, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #24 [ref=1x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 123, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #25 [ref=3x] - { F(Rep)|F(RepIgnored) , 0 , 285, 2 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #26 [ref=1x] - { 0 , 0 , 391, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #27 [ref=1x] - { 0 , 0 , 392, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #28 [ref=2x] - { 0 , 0 , 364, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #29 [ref=1x] - { 0 , 0 , 108, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #30 [ref=83x] - { 0 , 0 , 393, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #31 [ref=11x] - { 0 , 0 , 394, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #32 [ref=6x] - { 0 , 0 , 395, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #33 [ref=13x] - { 0 , 0 , 396, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #34 [ref=1x] - { 0 , 0 , 16 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #35 [ref=1x] - { F(Rep) , 0 , 127, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #36 [ref=1x] - { F(Vec) , 0 , 397, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #37 [ref=2x] - { F(Vec) , 0 , 398, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #38 [ref=3x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 131, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #39 [ref=1x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 399, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #40 [ref=1x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 400, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #41 [ref=1x] - { 0 , 0 , 401, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #42 [ref=1x] - { 0 , 0 , 402, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #43 [ref=1x] - { 0 , 0 , 287, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #44 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 403, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #45 [ref=2x] - { F(Mmx)|F(Vec) , 0 , 404, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #46 [ref=2x] - { F(Mmx)|F(Vec) , 0 , 405, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #47 [ref=2x] - { F(Vec) , 0 , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #48 [ref=2x] - { F(Vec) , 0 , 407, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #49 [ref=2x] - { F(Vec) , 0 , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #50 [ref=2x] - { 0 , 0 , 409, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #51 [ref=1x] - { 0 , 0 , 410, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #52 [ref=2x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 289, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #53 [ref=2x] - { 0 , 0 , 39 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #54 [ref=3x] - { F(Mmx) , 0 , 108, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #55 [ref=1x] - { 0 , 0 , 291, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #56 [ref=2x] - { 0 , 0 , 411, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #57 [ref=1x] - { F(Vec) , 0 , 412, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #58 [ref=2x] - { F(Vec) , 0 , 293, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #59 [ref=1x] - { F(FpuM32)|F(FpuM64) , 0 , 182, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #60 [ref=6x] - { 0 , 0 , 295, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #61 [ref=9x] - { F(FpuM80) , 0 , 413, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #62 [ref=2x] - { 0 , 0 , 296, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #63 [ref=13x] - { F(FpuM32)|F(FpuM64) , 0 , 297, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #64 [ref=2x] - { F(FpuM16)|F(FpuM32) , 0 , 414, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #65 [ref=9x] - { F(FpuM16)|F(FpuM32)|F(FpuM64) , 0 , 415, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #66 [ref=3x] - { F(FpuM32)|F(FpuM64)|F(FpuM80) , 0 , 416, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #67 [ref=2x] - { F(FpuM16) , 0 , 417, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #68 [ref=3x] - { 0 , 0 , 418, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #69 [ref=13x] - { F(FpuM16) , 0 , 419, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #70 [ref=2x] - { F(FpuM32)|F(FpuM64) , 0 , 298, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #71 [ref=1x] - { 0 , 0 , 420, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #72 [ref=2x] - { 0 , 0 , 421, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #73 [ref=1x] - { 0 , 0 , 39 , 10, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #74 [ref=1x] - { 0 , 0 , 422, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #75 [ref=1x] - { 0 , 0 , 423, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #76 [ref=2x] - { 0 , 0 , 348, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #77 [ref=3x] - { F(Rep) , 0 , 424, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #78 [ref=1x] - { F(Vec) , 0 , 299, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #79 [ref=1x] - { 0 , 0 , 425, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #80 [ref=2x] - { 0 , 0 , 426, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #81 [ref=8x] - { 0 , 0 , 301, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #82 [ref=3x] - { 0 , 0 , 303, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #83 [ref=1x] - { 0 , 0 , 108, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #84 [ref=2x] - { 0 , 0 , 395, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #85 [ref=1x] - { F(Rep)|F(RepIgnored) , 0 , 305, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #86 [ref=30x] - { F(Rep)|F(RepIgnored) , 0 , 307, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #87 [ref=1x] - { F(Rep)|F(RepIgnored) , 0 , 309, 2 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #88 [ref=1x] - { F(Vex) , 0 , 427, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #89 [ref=19x] - { F(Vex) , 0 , 311, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #90 [ref=1x] - { F(Vex) , 0 , 313, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #91 [ref=1x] - { F(Vex) , 0 , 315, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #92 [ref=1x] - { F(Vex) , 0 , 317, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #93 [ref=1x] - { F(Vex) , 0 , 428, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #94 [ref=12x] - { F(Vex) , 0 , 429, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #95 [ref=8x] - { F(Vex) , 0 , 427, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #96 [ref=8x] - { 0 , 0 , 430, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #97 [ref=2x] - { 0 , 0 , 319, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #98 [ref=1x] - { 0 , 0 , 321, 2 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #99 [ref=1x] - { F(Vec) , 0 , 230, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #100 [ref=2x] - { 0 , 0 , 431, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #101 [ref=2x] - { 0 , 0 , 323, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #102 [ref=2x] - { F(Vex) , 0 , 432, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #103 [ref=2x] - { 0 , 0 , 433, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #104 [ref=1x] - { 0 , 0 , 185, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #105 [ref=3x] - { 0 , 0 , 321, 2 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #106 [ref=1x] - { 0 , 0 , 434, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #107 [ref=5x] - { F(Vex) , 0 , 435, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #108 [ref=2x] - { F(Rep) , 0 , 135, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #109 [ref=1x] - { 0 , 0 , 307, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #110 [ref=3x] - { 0 , 0 , 325, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #111 [ref=1x] - { F(Vex) , 0 , 436, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #112 [ref=2x] - { F(Vec) , 0 , 437, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #113 [ref=1x] - { F(Mmx) , 0 , 438, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #114 [ref=1x] - { 0 , 0 , 439, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #115 [ref=2x] - { F(XRelease) , 0 , 0 , 16, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #116 [ref=1x] - { 0 , 0 , 49 , 9 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #117 [ref=1x] - { F(Vec) , 0 , 79 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #118 [ref=6x] - { 0 , 0 , 73 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #119 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 327, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #120 [ref=1x] - { 0 , 0 , 440, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #121 [ref=1x] - { 0 , 0 , 77 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #122 [ref=2x] - { F(Mmx)|F(Vec) , 0 , 441, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #123 [ref=1x] - { F(Vec) , 0 , 294, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #124 [ref=2x] - { F(Vec) , 0 , 236, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #125 [ref=4x] - { F(Vec) , 0 , 442, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #126 [ref=2x] - { F(Vec) , 0 , 80 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #127 [ref=3x] - { F(Mmx) , 0 , 443, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #128 [ref=1x] - { F(Vec) , 0 , 107, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #129 [ref=1x] - { F(Vec) , 0 , 242, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #130 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 103, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #131 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 444, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #132 [ref=1x] - { F(Rep) , 0 , 139, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #133 [ref=1x] - { F(Vec) , 0 , 106, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #134 [ref=1x] - { F(Vec) , 0 , 329, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #135 [ref=1x] - { 0 , 0 , 331, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #136 [ref=2x] - { 0 , 0 , 333, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #137 [ref=1x] - { F(Vex) , 0 , 335, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #138 [ref=1x] - { 0 , 0 , 445, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #139 [ref=1x] - { 0 , 0 , 446, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #140 [ref=1x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 290, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #141 [ref=2x] - { 0 , 0 , 108, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #142 [ref=1x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 16 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #143 [ref=1x] - { 0 , 0 , 447, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #144 [ref=1x] - { F(Rep) , 0 , 448, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #145 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 337, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #146 [ref=37x] - { F(Mmx)|F(Vec) , 0 , 339, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #147 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 337, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #148 [ref=6x] - { F(Mmx)|F(Vec) , 0 , 337, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #149 [ref=16x] - { F(Mmx) , 0 , 337, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #150 [ref=26x] - { F(Vec) , 0 , 79 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #151 [ref=4x] - { F(Vec) , 0 , 449, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #152 [ref=1x] - { F(Vec) , 0 , 450, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #153 [ref=1x] - { F(Vec) , 0 , 451, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #154 [ref=1x] - { F(Vec) , 0 , 452, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #155 [ref=1x] - { F(Vec) , 0 , 453, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #156 [ref=1x] - { F(Vec) , 0 , 454, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #157 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #158 [ref=1x] - { F(Vec) , 0 , 455, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #159 [ref=1x] - { F(Vec) , 0 , 456, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #160 [ref=1x] - { F(Vec) , 0 , 457, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #161 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 458, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #162 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 459, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #163 [ref=1x] - { F(Vec) , 0 , 263, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #164 [ref=2x] - { 0 , 0 , 143, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #165 [ref=1x] - { F(Mmx) , 0 , 339, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #166 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 343, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #167 [ref=8x] - { F(Vec) , 0 , 460, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #168 [ref=2x] - { 0 , 0 , 461, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #169 [ref=1x] - { F(Mmx)|F(Vec) , 0 , 345, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #170 [ref=3x] - { 0 , 0 , 147, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #171 [ref=1x] - { 0 , 0 , 462, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #172 [ref=8x] - { 0 , 0 , 463, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #173 [ref=4x] - { 0 , 0 , 464, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #174 [ref=8x] - { 0 , 0 , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #175 [ref=1x] - { F(Rep)|F(RepIgnored) , 0 , 349, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #176 [ref=1x] - { 0 , 0 , 349, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #177 [ref=1x] - { F(Vex) , 0 , 351, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #178 [ref=1x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 16 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #179 [ref=3x] - { F(Rep) , 0 , 151, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #180 [ref=1x] - { 0 , 0 , 465, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #181 [ref=30x] - { 0 , 0 , 188, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #182 [ref=2x] - { 0 , 0 , 466, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #183 [ref=3x] - { F(Rep) , 0 , 155, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #184 [ref=1x] - { F(Vex) , 0 , 467, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #185 [ref=5x] - { 0 , 0 , 66 , 7 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #186 [ref=1x] - { F(Tsib)|F(Vex) , 0 , 468, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #187 [ref=2x] - { F(Vex) , 0 , 395, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #188 [ref=1x] - { F(Tsib)|F(Vex) , 0 , 469, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #189 [ref=1x] - { F(Vex) , 0 , 470, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #190 [ref=1x] - { 0 , 0 , 471, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #191 [ref=2x] - { 0 , 0 , 180, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #192 [ref=2x] - { 0 , 0 , 472, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #193 [ref=1x] - { F(Evex)|F(Vec) , X(K)|X(T4X)|X(Z) , 473, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #194 [ref=4x] - { F(Evex)|F(Vec) , X(K)|X(T4X)|X(Z) , 474, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #195 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #196 [ref=22x] - { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #197 [ref=23x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #198 [ref=22x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #199 [ref=18x] - { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 476, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #200 [ref=18x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #201 [ref=17x] - { F(Vec)|F(Vex) , 0 , 191, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #202 [ref=15x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #203 [ref=5x] - { F(Vec)|F(Vex) , 0 , 79 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #204 [ref=17x] - { F(Vec)|F(Vex) , 0 , 221, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #205 [ref=1x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #206 [ref=4x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #207 [ref=4x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #208 [ref=10x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #209 [ref=12x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #210 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #211 [ref=6x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #212 [ref=19x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #213 [ref=12x] - { F(Vec)|F(Vex) , 0 , 194, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #214 [ref=6x] - { F(Vec)|F(Vex) , 0 , 353, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #215 [ref=3x] - { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 478, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #216 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 479, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #217 [ref=1x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 480, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #218 [ref=4x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 481, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #219 [ref=4x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 482, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #220 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 479, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #221 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 483, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #222 [ref=1x] - { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 197, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #223 [ref=1x] - { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE) , 200, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #224 [ref=1x] - { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 197, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #225 [ref=1x] - { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 484, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #226 [ref=1x] - { F(Evex)|F(Vec) , X(K)|X(SAE) , 485, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #227 [ref=1x] - { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 486, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #228 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 106, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #229 [ref=2x] - { F(Evex)|F(Vec) , X(SAE) , 263, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #230 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 212, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #231 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 203, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #232 [ref=6x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #233 [ref=1x] - { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #234 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #235 [ref=3x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #236 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #237 [ref=2x] - { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 487, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #238 [ref=3x] - { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #239 [ref=4x] - { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #240 [ref=3x] - { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #241 [ref=2x] - { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 212, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #242 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #243 [ref=1x] - { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #244 [ref=3x] - { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 212, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #245 [ref=2x] - { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #246 [ref=5x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #247 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 215, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #248 [ref=1x] - { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #249 [ref=2x] - { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #250 [ref=2x] - { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #251 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #252 [ref=1x] - { F(Evex)|F(Vec) , X(ER)|X(SAE) , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #253 [ref=1x] - { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 476, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #254 [ref=5x] - { F(Evex)|F(Vec) , X(ER)|X(SAE) , 488, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #255 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 489, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #256 [ref=2x] - { F(Evex)|F(Vec) , X(ER)|X(SAE) , 489, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #257 [ref=4x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #258 [ref=3x] - { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #259 [ref=6x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #260 [ref=1x] - { F(Evex)|F(Vec) , X(ER)|X(SAE) , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #261 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #262 [ref=1x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #263 [ref=3x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #264 [ref=1x] - { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #265 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #266 [ref=1x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #267 [ref=2x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #268 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #269 [ref=1x] - { F(Evex)|F(Vec) , X(SAE) , 406, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #270 [ref=1x] - { F(Evex)|F(Vec) , X(SAE) , 488, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #271 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #272 [ref=1x] - { F(Evex)|F(Vec) , X(SAE) , 408, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #273 [ref=1x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #274 [ref=1x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #275 [ref=3x] - { F(Vec)|F(Vex) , 0 , 194, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #276 [ref=9x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 83 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #277 [ref=3x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 83 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #278 [ref=3x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #279 [ref=8x] - { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 216, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #280 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 490, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #281 [ref=4x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 217, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #282 [ref=4x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 412, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #283 [ref=2x] - { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #284 [ref=5x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #285 [ref=2x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #286 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 491, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #287 [ref=4x] - { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #288 [ref=4x] - { F(Vec)|F(Vex) , 0 , 159, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #289 [ref=13x] - { F(Vec)|F(Vex) , 0 , 357, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #290 [ref=4x] - { F(Vec)|F(Vex) , 0 , 359, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #291 [ref=4x] - { F(Evex)|F(Vec) , X(B64)|X(K) , 493, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #292 [ref=1x] - { F(Evex)|F(Vec) , X(B16)|X(K) , 493, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #293 [ref=1x] - { F(Evex)|F(Vec) , X(B32)|X(K) , 493, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #294 [ref=1x] - { F(Evex)|F(Vec) , X(K) , 494, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #295 [ref=1x] - { F(Evex)|F(Vec) , X(K) , 495, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #296 [ref=1x] - { F(Evex)|F(Vec) , X(K) , 496, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #297 [ref=1x] - { F(Vec)|F(Vex) , 0 , 209, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #298 [ref=7x] - { F(Vec)|F(Vex) , 0 , 106, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #299 [ref=1x] - { F(Vec)|F(Vex) , 0 , 212, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #300 [ref=1x] - { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 163, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #301 [ref=2x] - { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 113, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #302 [ref=2x] - { F(Evex)|F(Vsib) , X(K) , 497, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #303 [ref=4x] - { F(Evex)|F(Vsib) , X(K) , 498, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #304 [ref=4x] - { F(Evex)|F(Vsib) , X(K) , 499, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #305 [ref=8x] - { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 118, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #306 [ref=2x] - { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 218, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #307 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #308 [ref=3x] - { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #309 [ref=3x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #310 [ref=2x] - { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #311 [ref=3x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #312 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 500, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #313 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #314 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #315 [ref=22x] - { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 361, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #316 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 361, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #317 [ref=4x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 501, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #318 [ref=4x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #319 [ref=1x] - { F(Vec)|F(Vex) , 0 , 230, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #320 [ref=1x] - { F(Vex) , 0 , 431, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #321 [ref=2x] - { F(Vec)|F(Vex) , 0 , 437, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #322 [ref=1x] - { F(Vec)|F(Vex) , 0 , 167, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #323 [ref=4x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #324 [ref=2x] - { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #325 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #326 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #327 [ref=2x] - { 0 , 0 , 363, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #328 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 79 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #329 [ref=4x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 365, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #330 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 224, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #331 [ref=1x] - { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 79 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #332 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 79 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #333 [ref=6x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 238, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #334 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 367, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #335 [ref=4x] - { F(Vec)|F(Vex) , 0 , 502, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #336 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 227, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #337 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 230, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #338 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 233, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #339 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 236, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #340 [ref=1x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 239, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #341 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #342 [ref=4x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 242, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #343 [ref=1x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 369, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #344 [ref=1x] - { 0 , 0 , 371, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #345 [ref=1x] - { 0 , 0 , 373, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #346 [ref=1x] - { F(Evex)|F(Vec) , X(B32) , 245, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #347 [ref=1x] - { F(Evex)|F(Vec) , X(B64) , 245, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #348 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #349 [ref=1x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #350 [ref=5x] - { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 191, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #351 [ref=2x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #352 [ref=2x] - { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 191, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #353 [ref=2x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #354 [ref=2x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #355 [ref=2x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #356 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #357 [ref=13x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 503, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #358 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 504, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #359 [ref=1x] - { F(Evex)|F(Vec) , 0 , 505, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #360 [ref=6x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 248, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #361 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 506, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #362 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #363 [ref=1x] - { F(Evex)|F(Vec) , X(K) , 200, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #364 [ref=2x] - { F(Evex)|F(Vec) , X(B32)|X(K) , 200, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #365 [ref=2x] - { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(K) , 251, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #366 [ref=4x] - { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(K) , 251, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #367 [ref=2x] - { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(K) , 251, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #368 [ref=2x] - { F(Vec)|F(Vex) , 0 , 449, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #369 [ref=1x] - { F(Vec)|F(Vex) , 0 , 450, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #370 [ref=1x] - { F(Vec)|F(Vex) , 0 , 451, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #371 [ref=1x] - { F(Vec)|F(Vex) , 0 , 452, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #372 [ref=1x] - { F(Evex)|F(Vec) , X(B64)|X(K) , 200, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #373 [ref=4x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #374 [ref=6x] - { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #375 [ref=4x] - { F(Vec)|F(Vex) , 0 , 195, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #376 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 192, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #377 [ref=2x] - { F(Vec)|F(Vex) , 0 , 171, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #378 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 85 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #379 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 85 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #380 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 175, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #381 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 453, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #382 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 454, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #383 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 507, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #384 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 508, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #385 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 509, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #386 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 510, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #387 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 511, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #388 [ref=1x] - { F(Vec)|F(Vex) , 0 , 353, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #389 [ref=12x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #390 [ref=8x] - { F(Evex)|F(Vec) , 0 , 512, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #391 [ref=4x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 254, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #392 [ref=6x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 257, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #393 [ref=9x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 260, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #394 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 212, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #395 [ref=4x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 263, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #396 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 206, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #397 [ref=6x] - { F(Vec)|F(Vex) , 0 , 159, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #398 [ref=1x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #399 [ref=3x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #400 [ref=3x] - { F(Vec)|F(Vex) , 0 , 375, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #401 [ref=4x] - { F(Evex)|F(Vec)|F(Vsib) , X(K) , 266, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #402 [ref=2x] - { F(Evex)|F(Vec)|F(Vsib) , X(K) , 377, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #403 [ref=2x] - { F(Evex)|F(Vec)|F(Vsib) , X(K) , 379, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #404 [ref=2x] - { F(Evex)|F(Vec)|F(Vsib) , X(K) , 269, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #405 [ref=2x] - { F(Vec)|F(Vex) , 0 , 381, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #406 [ref=8x] - { F(Evex)|F(Vec) , X(K) , 272, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #407 [ref=5x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #408 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #409 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 91 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #410 [ref=3x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 221, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #411 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 91 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #412 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 91 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #413 [ref=3x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 97 , 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #414 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #415 [ref=6x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #416 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #417 [ref=2x] - { F(Evex)|F(Vec) , X(B32)|X(K) , 272, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #418 [ref=2x] - { F(Evex)|F(Vec) , X(B64)|X(K) , 272, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #419 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #420 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #421 [ref=2x] - { F(Evex)|F(Vec) , X(B16)|X(K)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #422 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 476, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #423 [ref=2x] - { F(Vec)|F(Vex) , 0 , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #424 [ref=2x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 491, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #425 [ref=1x] - { F(Evex)|F(Vec) , X(K)|X(Z) , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #426 [ref=1x] - { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 221, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #427 [ref=2x] - { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 491, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #428 [ref=1x] - { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #429 [ref=1x] - { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 191, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #430 [ref=1x] - { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 195, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #431 [ref=2x] - { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 195, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #432 [ref=2x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #433 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 194, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #434 [ref=1x] - { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 209, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #435 [ref=1x] - { F(Vec)|F(Vex) , 0 , 108, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #436 [ref=2x] - { 0 , 0 , 23 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #437 [ref=2x] - { 0 , 0 , 61 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #438 [ref=2x] - { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 58 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #439 [ref=1x] - { 0 , 0 , 513, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #440 [ref=1x] - { F(Lock)|F(XAcquire) , 0 , 58 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #441 [ref=1x] - { 0 , 0 , 514, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #442 [ref=6x] - { 0 , 0 , 515, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)} // #443 [ref=6x] + { 0 , 0 , 457, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #1 [ref=4x] + { 0 , 0 , 458, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #2 [ref=2x] + { 0 , 0 , 108, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #3 [ref=6x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #4 [ref=2x] + { 0 , 0 , 50 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #5 [ref=2x] + { F(Vec) , 0 , 72 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #6 [ref=54x] + { F(Vec) , 0 , 143, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #7 [ref=19x] + { F(Vec) , 0 , 283, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #8 [ref=16x] + { F(Vec) , 0 , 292, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #9 [ref=20x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 33 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #10 [ref=1x] + { F(Vex) , 0 , 325, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #11 [ref=3x] + { F(Vec) , 0 , 72 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #12 [ref=12x] + { 0 , 0 , 459, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #13 [ref=1x] + { F(Vex) , 0 , 327, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #14 [ref=5x] + { F(Vex) , 0 , 50 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #15 [ref=12x] + { F(Vec) , 0 , 460, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #16 [ref=4x] + { 0 , 0 , 329, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #17 [ref=3x] + { F(Mib) , 0 , 461, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #18 [ref=1x] + { 0 , 0 , 462, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #19 [ref=1x] + { 0 , 0 , 331, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #20 [ref=1x] + { F(Mib) , 0 , 463, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #21 [ref=1x] + { 0 , 0 , 333, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #22 [ref=1x] + { 0 , 0 , 49 , 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #23 [ref=35x] + { 0 , 0 , 335, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #24 [ref=3x] + { 0 , 0 , 134, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #25 [ref=1x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 134, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #26 [ref=3x] + { F(Rep)|F(RepIgnored) , 0 , 235, 3 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #27 [ref=1x] + { 0 , 0 , 464, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #28 [ref=1x] + { 0 , 0 , 465, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #29 [ref=2x] + { 0 , 0 , 436, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #30 [ref=1x] + { 0 , 0 , 110, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #31 [ref=87x] + { 0 , 0 , 466, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #32 [ref=24x] + { 0 , 0 , 467, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #33 [ref=6x] + { 0 , 0 , 468, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #34 [ref=14x] + { 0 , 0 , 469, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #35 [ref=1x] + { 0 , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #36 [ref=1x] + { F(Vex) , 0 , 337, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #37 [ref=16x] + { F(Rep) , 0 , 179, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #38 [ref=1x] + { F(Vec) , 0 , 470, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #39 [ref=2x] + { F(Vec) , 0 , 471, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #40 [ref=3x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 183, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #41 [ref=1x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 472, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #42 [ref=1x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 473, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #43 [ref=1x] + { 0 , 0 , 474, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #44 [ref=1x] + { 0 , 0 , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #45 [ref=1x] + { 0 , 0 , 339, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #46 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 476, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #47 [ref=2x] + { F(Mmx)|F(Vec) , 0 , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #48 [ref=2x] + { F(Mmx)|F(Vec) , 0 , 478, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #49 [ref=2x] + { F(Vec) , 0 , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #50 [ref=2x] + { F(Vec) , 0 , 343, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #51 [ref=1x] + { F(Vec) , 0 , 345, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #52 [ref=1x] + { F(Vec) , 0 , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #53 [ref=1x] + { F(Vec) , 0 , 349, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #54 [ref=1x] + { 0 , 0 , 479, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #55 [ref=1x] + { 0 , 0 , 480, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #56 [ref=3x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 238, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #57 [ref=1x] + { 0 , 0 , 45 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #58 [ref=3x] + { F(Mmx) , 0 , 110, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #59 [ref=1x] + { 0 , 0 , 351, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #60 [ref=2x] + { 0 , 0 , 481, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #61 [ref=1x] + { F(Vec) , 0 , 482, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #62 [ref=2x] + { F(Vec) , 0 , 353, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #63 [ref=1x] + { F(FpuM32)|F(FpuM64) , 0 , 241, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #64 [ref=6x] + { 0 , 0 , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #65 [ref=9x] + { F(FpuM80) , 0 , 483, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #66 [ref=2x] + { 0 , 0 , 356, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #67 [ref=13x] + { F(FpuM32)|F(FpuM64) , 0 , 357, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #68 [ref=2x] + { F(FpuM16)|F(FpuM32) , 0 , 484, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #69 [ref=9x] + { F(FpuM16)|F(FpuM32)|F(FpuM64) , 0 , 485, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #70 [ref=3x] + { F(FpuM32)|F(FpuM64)|F(FpuM80) , 0 , 486, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #71 [ref=2x] + { F(FpuM16) , 0 , 487, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #72 [ref=3x] + { F(FpuM16) , 0 , 488, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #73 [ref=2x] + { F(FpuM32)|F(FpuM64) , 0 , 358, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #74 [ref=1x] + { 0 , 0 , 489, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #75 [ref=4x] + { 0 , 0 , 490, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #76 [ref=1x] + { 0 , 0 , 45 , 10, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #77 [ref=1x] + { 0 , 0 , 491, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #78 [ref=1x] + { F(Lock) , 0 , 238, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #79 [ref=1x] + { 0 , 0 , 379, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #80 [ref=2x] + { 0 , 0 , 336, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #81 [ref=3x] + { F(Rep) , 0 , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #82 [ref=1x] + { F(Vec) , 0 , 359, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #83 [ref=1x] + { 0 , 0 , 493, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #84 [ref=2x] + { 0 , 0 , 494, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #85 [ref=8x] + { 0 , 0 , 361, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #86 [ref=3x] + { 0 , 0 , 363, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #87 [ref=1x] + { 0 , 0 , 365, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #88 [ref=1x] + { 0 , 0 , 110, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #89 [ref=2x] + { 0 , 0 , 468, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #90 [ref=1x] + { F(Rep) , 0 , 244, 1 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #91 [ref=30x] + { F(Rep) , 0 , 367, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #92 [ref=1x] + { F(Rep) , 0 , 244, 3 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #93 [ref=1x] + { F(Vex) , 0 , 495, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #94 [ref=19x] + { F(Vex) , 0 , 369, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #95 [ref=1x] + { F(Vex) , 0 , 371, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #96 [ref=1x] + { F(Vex) , 0 , 187, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #97 [ref=1x] + { F(Vex) , 0 , 373, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #98 [ref=1x] + { F(Vex) , 0 , 496, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #99 [ref=12x] + { F(Vex) , 0 , 497, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #100 [ref=8x] + { F(Vex) , 0 , 495, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #101 [ref=8x] + { 0 , 0 , 498, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #102 [ref=2x] + { 0 , 0 , 253, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #103 [ref=1x] + { 0 , 0 , 247, 3 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #104 [ref=1x] + { F(Vec) , 0 , 169, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #105 [ref=2x] + { 0 , 0 , 499, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #106 [ref=2x] + { 0 , 0 , 375, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #107 [ref=2x] + { F(Vex) , 0 , 500, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #108 [ref=2x] + { 0 , 0 , 377, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #109 [ref=1x] + { 0 , 0 , 250, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #110 [ref=3x] + { 0 , 0 , 247, 3 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #111 [ref=1x] + { 0 , 0 , 501, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #112 [ref=5x] + { F(Vex) , 0 , 379, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #113 [ref=2x] + { F(Rep) , 0 , 191, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #114 [ref=1x] + { 0 , 0 , 367, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #115 [ref=3x] + { 0 , 0 , 253, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #116 [ref=1x] + { F(Vex) , 0 , 381, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #117 [ref=2x] + { F(Vec) , 0 , 502, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #118 [ref=1x] + { F(Mmx) , 0 , 503, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #119 [ref=1x] + { 0 , 0 , 504, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #120 [ref=2x] + { F(XRelease) , 0 , 0 , 20, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #121 [ref=1x] + { 0 , 0 , 55 , 9 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #122 [ref=1x] + { F(Vec) , 0 , 72 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #123 [ref=6x] + { 0 , 0 , 104, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #124 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 383, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #125 [ref=1x] + { 0 , 0 , 385, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #126 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 505, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #127 [ref=1x] + { F(Vec) , 0 , 354, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #128 [ref=2x] + { F(Vec) , 0 , 80 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #129 [ref=4x] + { F(Vec) , 0 , 506, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #130 [ref=2x] + { F(Vec) , 0 , 73 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #131 [ref=3x] + { F(Mmx) , 0 , 507, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #132 [ref=1x] + { F(Vec) , 0 , 80 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #133 [ref=1x] + { F(Vec) , 0 , 88 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #134 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 139, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #135 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 508, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #136 [ref=1x] + { F(Rep) , 0 , 195, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #137 [ref=1x] + { F(Vec) , 0 , 387, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #138 [ref=1x] + { F(Vec) , 0 , 389, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #139 [ref=1x] + { 0 , 0 , 256, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #140 [ref=2x] + { 0 , 0 , 391, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #141 [ref=1x] + { F(Vex) , 0 , 393, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #142 [ref=1x] + { 0 , 0 , 509, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #143 [ref=1x] + { 0 , 0 , 510, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #144 [ref=1x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 239, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #145 [ref=2x] + { 0 , 0 , 110, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #146 [ref=1x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #147 [ref=1x] + { 0 , 0 , 511, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #148 [ref=1x] + { F(Rep) , 0 , 512, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #149 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 395, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #150 [ref=37x] + { F(Mmx)|F(Vec) , 0 , 397, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #151 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 395, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #152 [ref=6x] + { F(Mmx)|F(Vec) , 0 , 395, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #153 [ref=16x] + { F(Mmx) , 0 , 139, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #154 [ref=26x] + { F(Vec) , 0 , 72 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #155 [ref=4x] + { F(Vec) , 0 , 513, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #156 [ref=1x] + { F(Vec) , 0 , 514, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #157 [ref=1x] + { F(Vec) , 0 , 515, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #158 [ref=1x] + { F(Vec) , 0 , 516, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #159 [ref=1x] + { F(Vec) , 0 , 517, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #160 [ref=1x] + { F(Vec) , 0 , 518, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #161 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 399, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #162 [ref=1x] + { F(Vec) , 0 , 519, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #163 [ref=1x] + { F(Vec) , 0 , 520, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #164 [ref=1x] + { F(Vec) , 0 , 521, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #165 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 522, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #166 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 523, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #167 [ref=1x] + { F(Vec) , 0 , 313, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #168 [ref=2x] + { 0 , 0 , 144, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #169 [ref=1x] + { F(Mmx) , 0 , 397, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #170 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 401, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #171 [ref=8x] + { F(Vec) , 0 , 524, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #172 [ref=2x] + { 0 , 0 , 403, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #173 [ref=1x] + { F(Mmx)|F(Vec) , 0 , 405, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #174 [ref=3x] + { 0 , 0 , 149, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #175 [ref=1x] + { 0 , 0 , 407, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #176 [ref=8x] + { 0 , 0 , 525, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #177 [ref=4x] + { 0 , 0 , 526, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #178 [ref=8x] + { 0 , 0 , 409, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #179 [ref=1x] + { F(Rep)|F(RepIgnored) , 0 , 411, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #180 [ref=1x] + { 0 , 0 , 411, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #181 [ref=1x] + { F(Vex) , 0 , 413, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #182 [ref=1x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #183 [ref=3x] + { F(Rep) , 0 , 199, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #184 [ref=1x] + { 0 , 0 , 527, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #185 [ref=30x] + { 0 , 0 , 259, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #186 [ref=2x] + { 0 , 0 , 415, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #187 [ref=3x] + { F(Rep) , 0 , 203, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #188 [ref=1x] + { F(Vex) , 0 , 528, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #189 [ref=8x] + { 0 , 0 , 64 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #190 [ref=1x] + { F(Tsib)|F(Vex) , 0 , 529, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #191 [ref=2x] + { F(Vex) , 0 , 468, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #192 [ref=1x] + { F(Tsib)|F(Vex) , 0 , 530, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #193 [ref=1x] + { F(Vex) , 0 , 531, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #194 [ref=1x] + { 0 , 0 , 532, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #195 [ref=2x] + { 0 , 0 , 50 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #196 [ref=2x] + { 0 , 0 , 417, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #197 [ref=1x] + { F(Evex)|F(Vec) , X(K)|X(T4X)|X(Z) , 533, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #198 [ref=4x] + { F(Evex)|F(Vec) , X(K)|X(T4X)|X(Z) , 534, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #199 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #200 [ref=22x] + { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #201 [ref=23x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #202 [ref=22x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #203 [ref=18x] + { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 536, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #204 [ref=18x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #205 [ref=17x] + { F(Vec)|F(Vex) , 0 , 262, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #206 [ref=29x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #207 [ref=5x] + { F(Vec)|F(Vex) , 0 , 72 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #208 [ref=17x] + { F(Vec)|F(Vex) , 0 , 292, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #209 [ref=1x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #210 [ref=4x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #211 [ref=4x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #212 [ref=10x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #213 [ref=12x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #214 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #215 [ref=6x] + { F(Vec)|F(Vex) , 0 , 538, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #216 [ref=2x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #217 [ref=17x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #218 [ref=12x] + { F(Vec)|F(Vex) , 0 , 265, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #219 [ref=6x] + { F(Vec)|F(Vex) , 0 , 419, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #220 [ref=3x] + { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 539, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #221 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 540, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #222 [ref=1x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 541, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #223 [ref=4x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 542, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #224 [ref=4x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 447, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #225 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 540, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #226 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 543, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #227 [ref=1x] + { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE) , 268, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #228 [ref=1x] + { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE) , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #229 [ref=1x] + { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE) , 268, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #230 [ref=1x] + { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(K)|X(SAE) , 544, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #231 [ref=1x] + { F(Evex)|F(Vec) , X(K)|X(SAE) , 545, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #232 [ref=1x] + { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(K)|X(SAE) , 546, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #233 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 143, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #234 [ref=2x] + { F(Evex)|F(Vec) , X(SAE) , 313, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #235 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 283, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #236 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 274, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #237 [ref=6x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #238 [ref=1x] + { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #239 [ref=3x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #240 [ref=3x] + { F(Vec)|F(Vex) , 0 , 169, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #241 [ref=5x] + { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #242 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #243 [ref=2x] + { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 547, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #244 [ref=3x] + { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #245 [ref=4x] + { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #246 [ref=3x] + { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #247 [ref=2x] + { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 283, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #248 [ref=3x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #249 [ref=1x] + { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #250 [ref=3x] + { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 283, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #251 [ref=2x] + { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #252 [ref=5x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #253 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 286, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #254 [ref=1x] + { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #255 [ref=2x] + { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #256 [ref=2x] + { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #257 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #258 [ref=1x] + { F(Evex)|F(Vec) , X(ER)|X(SAE) , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #259 [ref=1x] + { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 536, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #260 [ref=5x] + { F(Evex)|F(Vec) , X(ER)|X(SAE) , 423, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #261 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 425, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #262 [ref=2x] + { F(Evex)|F(Vec) , X(ER)|X(SAE) , 427, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #263 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #264 [ref=3x] + { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #265 [ref=6x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #266 [ref=1x] + { F(Evex)|F(Vec) , X(ER)|X(SAE) , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #267 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #268 [ref=1x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #269 [ref=3x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #270 [ref=1x] + { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #271 [ref=3x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #272 [ref=1x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #273 [ref=2x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #274 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #275 [ref=1x] + { F(Evex)|F(Vec) , X(SAE) , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #276 [ref=1x] + { F(Evex)|F(Vec) , X(SAE) , 423, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #277 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #278 [ref=1x] + { F(Evex)|F(Vec) , X(SAE) , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #279 [ref=1x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #280 [ref=1x] + { F(Evex)|F(Vec) , X(ER)|X(SAE) , 425, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #281 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #282 [ref=3x] + { F(Vec)|F(Vex) , 0 , 265, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #283 [ref=10x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 78 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #284 [ref=3x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 78 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #285 [ref=3x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #286 [ref=8x] + { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 287, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #287 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 548, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #288 [ref=4x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 288, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #289 [ref=4x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 482, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #290 [ref=2x] + { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #291 [ref=5x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #292 [ref=2x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #293 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 549, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #294 [ref=4x] + { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 550, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #295 [ref=4x] + { F(Vec)|F(Vex) , 0 , 207, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #296 [ref=13x] + { F(Vec)|F(Vex) , 0 , 429, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #297 [ref=4x] + { F(Vec)|F(Vex) , 0 , 431, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #298 [ref=4x] + { F(Evex)|F(Vec) , X(B64)|X(K) , 551, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #299 [ref=1x] + { F(Evex)|F(Vec) , X(B16)|X(K) , 551, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #300 [ref=1x] + { F(Evex)|F(Vec) , X(B32)|X(K) , 551, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #301 [ref=1x] + { F(Evex)|F(Vec) , X(K) , 552, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #302 [ref=1x] + { F(Evex)|F(Vec) , X(K) , 553, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #303 [ref=1x] + { F(Evex)|F(Vec) , X(K) , 554, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #304 [ref=1x] + { F(Vec)|F(Vex) , 0 , 280, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #305 [ref=7x] + { F(Vec)|F(Vex) , 0 , 143, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #306 [ref=1x] + { F(Vec)|F(Vex) , 0 , 283, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #307 [ref=1x] + { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 211, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #308 [ref=2x] + { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 154, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #309 [ref=2x] + { F(Evex)|F(Vsib) , X(K) , 555, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #310 [ref=4x] + { F(Evex)|F(Vsib) , X(K) , 556, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #311 [ref=4x] + { F(Evex)|F(Vsib) , X(K) , 557, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #312 [ref=8x] + { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 159, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #313 [ref=2x] + { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 289, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #314 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #315 [ref=3x] + { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #316 [ref=3x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #317 [ref=2x] + { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #318 [ref=3x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #319 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 558, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #320 [ref=3x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #321 [ref=3x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #322 [ref=22x] + { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 433, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #323 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 433, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #324 [ref=4x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 559, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #325 [ref=4x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 550, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #326 [ref=1x] + { F(Vex) , 0 , 499, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #327 [ref=2x] + { F(Vec)|F(Vex) , 0 , 502, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #328 [ref=1x] + { F(Vec)|F(Vex) , 0 , 215, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #329 [ref=4x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #330 [ref=2x] + { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #331 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #332 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #333 [ref=2x] + { 0 , 0 , 435, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #334 [ref=3x] + { 0 , 0 , 437, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #335 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 72 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #336 [ref=4x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 439, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #337 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #338 [ref=1x] + { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 72 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #339 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 116, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #340 [ref=6x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 82 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #341 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 219, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #342 [ref=4x] + { F(Vec)|F(Vex) , 0 , 560, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #343 [ref=3x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 164, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #344 [ref=3x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 169, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #345 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 174, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #346 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 80 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #347 [ref=1x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 223, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #348 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #349 [ref=4x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 88 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #350 [ref=1x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 441, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #351 [ref=1x] + { 0 , 0 , 443, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #352 [ref=1x] + { 0 , 0 , 445, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #353 [ref=1x] + { F(Evex)|F(Vec) , X(B32) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #354 [ref=1x] + { F(Evex)|F(Vec) , X(B64) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #355 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #356 [ref=1x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #357 [ref=5x] + { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 262, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #358 [ref=2x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #359 [ref=2x] + { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 262, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #360 [ref=2x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #361 [ref=2x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #362 [ref=2x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #363 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #364 [ref=13x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 561, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #365 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 562, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #366 [ref=1x] + { F(Evex)|F(Vec) , 0 , 563, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #367 [ref=6x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 447, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #368 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 564, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #369 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #370 [ref=1x] + { F(Evex)|F(Vec) , X(K) , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #371 [ref=2x] + { F(Evex)|F(Vec) , X(B32)|X(K) , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #372 [ref=2x] + { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(K) , 301, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #373 [ref=4x] + { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(K) , 301, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #374 [ref=2x] + { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(K) , 301, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #375 [ref=2x] + { F(Vec)|F(Vex) , 0 , 513, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #376 [ref=1x] + { F(Vec)|F(Vex) , 0 , 514, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #377 [ref=1x] + { F(Vec)|F(Vex) , 0 , 515, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #378 [ref=1x] + { F(Vec)|F(Vex) , 0 , 516, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #379 [ref=1x] + { F(Evex)|F(Vec) , X(B64)|X(K) , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #380 [ref=4x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #381 [ref=6x] + { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #382 [ref=4x] + { F(Vec)|F(Vex) , 0 , 266, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #383 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 263, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #384 [ref=2x] + { F(Vec)|F(Vex) , 0 , 227, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #385 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 96 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #386 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 96 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #387 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 231, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #388 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 517, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #389 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 518, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #390 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 565, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #391 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 566, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #392 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 567, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #393 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 568, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #394 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 569, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #395 [ref=1x] + { F(Vec)|F(Vex) , 0 , 419, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #396 [ref=12x] + { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #397 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #398 [ref=8x] + { F(Evex)|F(Vec) , 0 , 570, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #399 [ref=4x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 304, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #400 [ref=6x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 307, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #401 [ref=9x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #402 [ref=3x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 283, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #403 [ref=4x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 313, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #404 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #405 [ref=6x] + { F(Vec)|F(Vex) , 0 , 207, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #406 [ref=1x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #407 [ref=3x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #408 [ref=3x] + { F(Vec)|F(Vex) , 0 , 449, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #409 [ref=4x] + { F(Evex)|F(Vec)|F(Vsib) , X(K) , 316, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #410 [ref=2x] + { F(Evex)|F(Vec)|F(Vsib) , X(K) , 451, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #411 [ref=2x] + { F(Evex)|F(Vec)|F(Vsib) , X(K) , 453, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #412 [ref=2x] + { F(Evex)|F(Vec)|F(Vsib) , X(K) , 319, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #413 [ref=2x] + { F(Vec)|F(Vex) , 0 , 455, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #414 [ref=8x] + { F(Evex)|F(Vec) , X(K) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #415 [ref=5x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #416 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #417 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 122, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #418 [ref=3x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #419 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 122, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #420 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 122, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #421 [ref=3x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 128, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #422 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #423 [ref=6x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #424 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #425 [ref=2x] + { F(Evex)|F(Vec) , X(B32)|X(K) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #426 [ref=2x] + { F(Evex)|F(Vec) , X(B64)|X(K) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #427 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #428 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #429 [ref=2x] + { F(Evex)|F(Vec) , X(B16)|X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #430 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 536, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #431 [ref=2x] + { F(Vec)|F(Vex) , 0 , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #432 [ref=2x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 549, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #433 [ref=1x] + { F(Evex)|F(Vec) , X(K)|X(Z) , 550, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #434 [ref=1x] + { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 292, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #435 [ref=2x] + { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 549, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #436 [ref=1x] + { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 550, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #437 [ref=1x] + { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #438 [ref=1x] + { F(Vec)|F(Vex) , 0 , 571, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #439 [ref=1x] + { F(Vec)|F(Vex) , 0 , 572, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #440 [ref=1x] + { F(Vec)|F(Vex) , 0 , 573, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #441 [ref=1x] + { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 266, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #442 [ref=2x] + { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 266, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #443 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #444 [ref=1x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #445 [ref=1x] + { F(Vec)|F(Vex) , 0 , 262, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #446 [ref=2x] + { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #447 [ref=1x] + { F(Vec)|F(Vex) , 0 , 110, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #448 [ref=2x] + { 0 , 0 , 27 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #449 [ref=2x] + { 0 , 0 , 28 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #450 [ref=2x] + { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 25 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #451 [ref=1x] + { 0 , 0 , 236, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #452 [ref=1x] + { F(XAcquire) , 0 , 25 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #453 [ref=1x] + { 0 , 0 , 574, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #454 [ref=6x] + { 0 , 0 , 575, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)} // #455 [ref=6x] }; #undef SAME_REG_HINT #undef CONTROL_FLOW @@ -2609,197 +2657,220 @@ const InstDB::CommonInfo InstDB::_commonInfoTable[] = { // ------------------- Automatically generated, do not edit ------------------- #define EXT(VAL) uint32_t(CpuFeatures::X86::k##VAL) const InstDB::AdditionalInfo InstDB::_additionalInfoTable[] = { - { 0, 0, { 0 } }, // #0 [ref=148x] + { 0, 0, { 0 } }, // #0 [ref=67x] { 0, 1, { 0 } }, // #1 [ref=32x] - { 0, 2, { 0 } }, // #2 [ref=2x] - { 0, 3, { EXT(ADX) } }, // #3 [ref=1x] - { 0, 0, { EXT(SSE2) } }, // #4 [ref=60x] - { 0, 0, { EXT(SSE) } }, // #5 [ref=41x] - { 0, 0, { EXT(SSE3) } }, // #6 [ref=12x] - { 0, 4, { EXT(ADX) } }, // #7 [ref=1x] - { 0, 0, { EXT(AESNI) } }, // #8 [ref=6x] - { 0, 1, { EXT(BMI) } }, // #9 [ref=6x] - { 0, 5, { 0 } }, // #10 [ref=5x] - { 0, 0, { EXT(TBM) } }, // #11 [ref=9x] - { 0, 0, { EXT(SSE4_1) } }, // #12 [ref=47x] - { 0, 0, { EXT(MPX) } }, // #13 [ref=7x] - { 0, 6, { 0 } }, // #14 [ref=4x] - { 0, 1, { EXT(BMI2) } }, // #15 [ref=1x] - { 0, 7, { EXT(SMAP) } }, // #16 [ref=2x] - { 0, 8, { 0 } }, // #17 [ref=2x] - { 0, 9, { 0 } }, // #18 [ref=2x] - { 0, 0, { EXT(CLDEMOTE) } }, // #19 [ref=1x] - { 0, 0, { EXT(CLFLUSH) } }, // #20 [ref=1x] - { 0, 0, { EXT(CLFLUSHOPT) } }, // #21 [ref=1x] - { 0, 0, { EXT(SVM) } }, // #22 [ref=6x] - { 0, 10, { 0 } }, // #23 [ref=2x] - { 0, 1, { EXT(CET_SS) } }, // #24 [ref=3x] - { 0, 0, { EXT(UINTR) } }, // #25 [ref=4x] - { 0, 0, { EXT(CLWB) } }, // #26 [ref=1x] - { 0, 0, { EXT(CLZERO) } }, // #27 [ref=1x] - { 0, 3, { 0 } }, // #28 [ref=1x] - { 0, 11, { EXT(CMOV) } }, // #29 [ref=6x] - { 0, 12, { EXT(CMOV) } }, // #30 [ref=8x] - { 0, 13, { EXT(CMOV) } }, // #31 [ref=6x] - { 0, 14, { EXT(CMOV) } }, // #32 [ref=4x] - { 0, 15, { EXT(CMOV) } }, // #33 [ref=4x] - { 0, 16, { EXT(CMOV) } }, // #34 [ref=2x] - { 0, 17, { EXT(CMOV) } }, // #35 [ref=6x] - { 0, 18, { EXT(CMOV) } }, // #36 [ref=2x] - { 0, 19, { 0 } }, // #37 [ref=2x] - { 0, 1, { EXT(I486) } }, // #38 [ref=2x] - { 0, 5, { EXT(CMPXCHG16B) } }, // #39 [ref=1x] - { 0, 5, { EXT(CMPXCHG8B) } }, // #40 [ref=1x] - { 0, 1, { EXT(SSE2) } }, // #41 [ref=2x] - { 0, 1, { EXT(SSE) } }, // #42 [ref=2x] - { 0, 0, { EXT(I486) } }, // #43 [ref=4x] - { 0, 0, { EXT(SSE4_2) } }, // #44 [ref=2x] - { 0, 20, { 0 } }, // #45 [ref=2x] - { 0, 0, { EXT(MMX) } }, // #46 [ref=1x] - { 0, 0, { EXT(CET_IBT) } }, // #47 [ref=2x] - { 0, 0, { EXT(ENQCMD) } }, // #48 [ref=2x] - { 0, 0, { EXT(SSE4A) } }, // #49 [ref=4x] - { 0, 21, { 0 } }, // #50 [ref=4x] - { 0, 0, { EXT(3DNOW) } }, // #51 [ref=21x] - { 0, 0, { EXT(FXSR) } }, // #52 [ref=4x] - { 0, 0, { EXT(SMX) } }, // #53 [ref=1x] - { 0, 0, { EXT(GFNI) } }, // #54 [ref=3x] - { 0, 0, { EXT(HRESET) } }, // #55 [ref=1x] - { 0, 0, { EXT(CET_SS) } }, // #56 [ref=9x] - { 0, 16, { 0 } }, // #57 [ref=5x] - { 0, 0, { EXT(VMX) } }, // #58 [ref=12x] - { 0, 11, { 0 } }, // #59 [ref=8x] - { 0, 12, { 0 } }, // #60 [ref=12x] - { 0, 13, { 0 } }, // #61 [ref=10x] - { 0, 14, { 0 } }, // #62 [ref=8x] - { 0, 15, { 0 } }, // #63 [ref=8x] - { 0, 17, { 0 } }, // #64 [ref=8x] - { 0, 18, { 0 } }, // #65 [ref=4x] - { 0, 0, { EXT(AVX512_DQ) } }, // #66 [ref=22x] - { 0, 0, { EXT(AVX512_BW) } }, // #67 [ref=20x] - { 0, 0, { EXT(AVX512_F) } }, // #68 [ref=36x] - { 1, 0, { EXT(AVX512_DQ) } }, // #69 [ref=1x] - { 1, 0, { EXT(AVX512_BW) } }, // #70 [ref=2x] - { 1, 0, { EXT(AVX512_F) } }, // #71 [ref=1x] - { 0, 1, { EXT(AVX512_DQ) } }, // #72 [ref=3x] - { 0, 1, { EXT(AVX512_BW) } }, // #73 [ref=4x] - { 0, 1, { EXT(AVX512_F) } }, // #74 [ref=1x] - { 0, 22, { EXT(LAHFSAHF) } }, // #75 [ref=1x] - { 0, 0, { EXT(AMX_TILE) } }, // #76 [ref=7x] - { 0, 0, { EXT(LWP) } }, // #77 [ref=4x] - { 0, 23, { 0 } }, // #78 [ref=3x] - { 0, 1, { EXT(LZCNT) } }, // #79 [ref=1x] - { 0, 0, { EXT(MMX2) } }, // #80 [ref=8x] - { 0, 1, { EXT(MCOMMIT) } }, // #81 [ref=1x] - { 0, 0, { EXT(MONITOR) } }, // #82 [ref=2x] - { 0, 0, { EXT(MONITORX) } }, // #83 [ref=2x] - { 1, 0, { 0 } }, // #84 [ref=1x] - { 1, 0, { EXT(SSE2) } }, // #85 [ref=5x] - { 1, 0, { EXT(SSE) } }, // #86 [ref=3x] - { 0, 0, { EXT(MOVBE) } }, // #87 [ref=1x] - { 0, 0, { EXT(MMX), EXT(SSE2) } }, // #88 [ref=45x] - { 0, 0, { EXT(MOVDIR64B) } }, // #89 [ref=1x] - { 0, 0, { EXT(MOVDIRI) } }, // #90 [ref=1x] - { 1, 0, { EXT(MMX), EXT(SSE2) } }, // #91 [ref=1x] - { 0, 0, { EXT(BMI2) } }, // #92 [ref=7x] - { 0, 0, { EXT(SSSE3) } }, // #93 [ref=15x] - { 0, 0, { EXT(MMX2), EXT(SSE2) } }, // #94 [ref=10x] - { 0, 0, { EXT(PCLMULQDQ) } }, // #95 [ref=1x] - { 0, 1, { EXT(SSE4_2) } }, // #96 [ref=4x] - { 0, 0, { EXT(PCONFIG) } }, // #97 [ref=1x] - { 0, 0, { EXT(MMX2), EXT(SSE2), EXT(SSE4_1) } }, // #98 [ref=1x] - { 0, 0, { EXT(3DNOW2) } }, // #99 [ref=5x] - { 0, 0, { EXT(GEODE) } }, // #100 [ref=2x] - { 0, 1, { EXT(POPCNT) } }, // #101 [ref=1x] - { 0, 24, { 0 } }, // #102 [ref=3x] - { 0, 1, { EXT(PREFETCHW) } }, // #103 [ref=1x] - { 0, 1, { EXT(PREFETCHWT1) } }, // #104 [ref=1x] - { 0, 20, { EXT(SNP) } }, // #105 [ref=3x] - { 0, 1, { EXT(SSE4_1) } }, // #106 [ref=1x] - { 0, 0, { EXT(PTWRITE) } }, // #107 [ref=1x] - { 0, 25, { 0 } }, // #108 [ref=3x] - { 0, 1, { EXT(SNP) } }, // #109 [ref=1x] - { 0, 26, { 0 } }, // #110 [ref=2x] - { 0, 0, { EXT(FSGSBASE) } }, // #111 [ref=4x] - { 0, 0, { EXT(MSR) } }, // #112 [ref=2x] - { 0, 0, { EXT(RDPID) } }, // #113 [ref=1x] - { 0, 0, { EXT(OSPKE) } }, // #114 [ref=1x] - { 0, 0, { EXT(RDPRU) } }, // #115 [ref=1x] - { 0, 1, { EXT(RDRAND) } }, // #116 [ref=1x] - { 0, 1, { EXT(RDSEED) } }, // #117 [ref=1x] - { 0, 0, { EXT(RDTSC) } }, // #118 [ref=1x] - { 0, 0, { EXT(RDTSCP) } }, // #119 [ref=1x] - { 0, 27, { 0 } }, // #120 [ref=2x] - { 0, 28, { EXT(LAHFSAHF) } }, // #121 [ref=1x] - { 0, 0, { EXT(SERIALIZE) } }, // #122 [ref=1x] - { 0, 0, { EXT(SHA) } }, // #123 [ref=7x] - { 0, 0, { EXT(SKINIT) } }, // #124 [ref=2x] - { 0, 0, { EXT(AMX_BF16) } }, // #125 [ref=1x] - { 0, 0, { EXT(AMX_INT8) } }, // #126 [ref=4x] - { 0, 1, { EXT(UINTR) } }, // #127 [ref=1x] - { 0, 1, { EXT(WAITPKG) } }, // #128 [ref=2x] - { 0, 0, { EXT(WAITPKG) } }, // #129 [ref=1x] - { 0, 0, { EXT(AVX512_4FMAPS) } }, // #130 [ref=4x] - { 0, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #131 [ref=42x] - { 0, 0, { EXT(AVX512_FP16), EXT(AVX512_VL) } }, // #132 [ref=63x] - { 0, 0, { EXT(AVX), EXT(AVX512_F) } }, // #133 [ref=29x] - { 0, 0, { EXT(AVX512_FP16) } }, // #134 [ref=43x] - { 0, 0, { EXT(AVX) } }, // #135 [ref=35x] - { 0, 0, { EXT(AESNI), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL), EXT(VAES) } }, // #136 [ref=4x] - { 0, 0, { EXT(AESNI), EXT(AVX) } }, // #137 [ref=2x] - { 0, 0, { EXT(AVX512_F), EXT(AVX512_VL) } }, // #138 [ref=108x] - { 0, 0, { EXT(AVX), EXT(AVX512_DQ), EXT(AVX512_VL) } }, // #139 [ref=8x] - { 0, 0, { EXT(AVX512_DQ), EXT(AVX512_VL) } }, // #140 [ref=30x] - { 0, 0, { EXT(AVX2) } }, // #141 [ref=7x] - { 0, 0, { EXT(AVX), EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) } }, // #142 [ref=39x] - { 0, 1, { EXT(AVX), EXT(AVX512_F) } }, // #143 [ref=4x] - { 0, 0, { EXT(AVX512_BF16), EXT(AVX512_VL) } }, // #144 [ref=3x] - { 0, 0, { EXT(AVX512_F), EXT(AVX512_VL), EXT(F16C) } }, // #145 [ref=2x] - { 0, 0, { EXT(AVX512_BW), EXT(AVX512_VL) } }, // #146 [ref=24x] - { 0, 0, { EXT(AVX512_ERI) } }, // #147 [ref=10x] - { 0, 0, { EXT(AVX512_F), EXT(AVX512_VL), EXT(FMA) } }, // #148 [ref=36x] - { 0, 0, { EXT(AVX512_F), EXT(FMA) } }, // #149 [ref=24x] - { 0, 0, { EXT(FMA4) } }, // #150 [ref=20x] - { 0, 0, { EXT(XOP) } }, // #151 [ref=55x] - { 0, 0, { EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) } }, // #152 [ref=19x] - { 0, 0, { EXT(AVX512_PFI) } }, // #153 [ref=16x] - { 0, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL), EXT(GFNI) } }, // #154 [ref=3x] - { 1, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #155 [ref=4x] - { 1, 0, { EXT(AVX) } }, // #156 [ref=2x] - { 1, 0, { EXT(AVX512_F), EXT(AVX512_VL) } }, // #157 [ref=4x] - { 1, 0, { EXT(AVX512_BW), EXT(AVX512_VL) } }, // #158 [ref=2x] - { 1, 0, { EXT(AVX), EXT(AVX512_F) } }, // #159 [ref=3x] - { 0, 0, { EXT(AVX), EXT(AVX2) } }, // #160 [ref=17x] - { 0, 0, { EXT(AVX512_VP2INTERSECT) } }, // #161 [ref=2x] - { 0, 0, { EXT(AVX512_4VNNIW) } }, // #162 [ref=2x] - { 0, 0, { EXT(AVX), EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) } }, // #163 [ref=54x] - { 0, 0, { EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) } }, // #164 [ref=2x] - { 0, 0, { EXT(AVX512_CDI), EXT(AVX512_VL) } }, // #165 [ref=6x] - { 0, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL), EXT(PCLMULQDQ), EXT(VPCLMULQDQ) } }, // #166 [ref=1x] - { 0, 1, { EXT(AVX) } }, // #167 [ref=7x] - { 0, 0, { EXT(AVX512_VBMI2), EXT(AVX512_VL) } }, // #168 [ref=16x] - { 0, 0, { EXT(AVX512_VL), EXT(AVX512_VNNI), EXT(AVX_VNNI) } }, // #169 [ref=4x] - { 0, 0, { EXT(AVX512_VBMI), EXT(AVX512_VL) } }, // #170 [ref=4x] - { 0, 0, { EXT(AVX), EXT(AVX512_BW) } }, // #171 [ref=4x] - { 0, 0, { EXT(AVX), EXT(AVX512_DQ) } }, // #172 [ref=4x] - { 0, 0, { EXT(AVX512_IFMA), EXT(AVX512_VL) } }, // #173 [ref=2x] - { 0, 0, { EXT(AVX512_BITALG), EXT(AVX512_VL) } }, // #174 [ref=3x] - { 0, 0, { EXT(AVX512_VL), EXT(AVX512_VPOPCNTDQ) } }, // #175 [ref=2x] - { 0, 0, { EXT(WBNOINVD) } }, // #176 [ref=1x] - { 0, 0, { EXT(RTM) } }, // #177 [ref=3x] - { 0, 0, { EXT(XSAVE) } }, // #178 [ref=6x] - { 0, 0, { EXT(TSXLDTRK) } }, // #179 [ref=2x] - { 0, 0, { EXT(XSAVES) } }, // #180 [ref=4x] - { 0, 0, { EXT(XSAVEC) } }, // #181 [ref=2x] - { 0, 0, { EXT(XSAVEOPT) } }, // #182 [ref=2x] - { 0, 1, { EXT(TSX) } } // #183 [ref=1x] + { 0, 0, { EXT(RAO_INT) } }, // #2 [ref=4x] + { 0, 2, { 0 } }, // #3 [ref=2x] + { 0, 3, { EXT(ADX) } }, // #4 [ref=1x] + { 0, 0, { EXT(SSE2) } }, // #5 [ref=60x] + { 0, 0, { EXT(SSE) } }, // #6 [ref=46x] + { 0, 0, { EXT(SSE3) } }, // #7 [ref=10x] + { 0, 4, { EXT(ADX) } }, // #8 [ref=1x] + { 0, 0, { EXT(AESNI) } }, // #9 [ref=6x] + { 0, 1, { EXT(BMI) } }, // #10 [ref=6x] + { 0, 5, { 0 } }, // #11 [ref=5x] + { 0, 0, { EXT(TBM) } }, // #12 [ref=9x] + { 0, 0, { EXT(SSE4_1) } }, // #13 [ref=47x] + { 0, 0, { EXT(MPX) } }, // #14 [ref=7x] + { 0, 6, { 0 } }, // #15 [ref=4x] + { 0, 1, { EXT(BMI2) } }, // #16 [ref=1x] + { 0, 7, { EXT(SMAP) } }, // #17 [ref=2x] + { 0, 8, { 0 } }, // #18 [ref=2x] + { 0, 9, { 0 } }, // #19 [ref=2x] + { 0, 0, { EXT(CLDEMOTE) } }, // #20 [ref=1x] + { 0, 0, { EXT(CLFLUSH) } }, // #21 [ref=1x] + { 0, 0, { EXT(CLFLUSHOPT) } }, // #22 [ref=1x] + { 0, 0, { EXT(SVM) } }, // #23 [ref=6x] + { 0, 10, { 0 } }, // #24 [ref=2x] + { 0, 1, { EXT(CET_SS) } }, // #25 [ref=3x] + { 0, 0, { EXT(UINTR) } }, // #26 [ref=4x] + { 0, 0, { EXT(CLWB) } }, // #27 [ref=1x] + { 0, 0, { EXT(CLZERO) } }, // #28 [ref=1x] + { 0, 3, { 0 } }, // #29 [ref=1x] + { 0, 11, { EXT(CMOV) } }, // #30 [ref=4x] + { 0, 12, { EXT(CMOV) } }, // #31 [ref=6x] + { 0, 13, { EXT(CMOV) } }, // #32 [ref=4x] + { 0, 14, { EXT(CMOV) } }, // #33 [ref=4x] + { 0, 15, { EXT(CMOV) } }, // #34 [ref=4x] + { 0, 16, { EXT(CMOV) } }, // #35 [ref=2x] + { 0, 17, { EXT(CMOV) } }, // #36 [ref=4x] + { 0, 18, { EXT(CMOV) } }, // #37 [ref=2x] + { 0, 1, { EXT(CMPCCXADD) } }, // #38 [ref=16x] + { 0, 19, { 0 } }, // #39 [ref=2x] + { 0, 1, { EXT(I486) } }, // #40 [ref=2x] + { 0, 5, { EXT(CMPXCHG16B) } }, // #41 [ref=1x] + { 0, 5, { EXT(CMPXCHG8B) } }, // #42 [ref=1x] + { 0, 1, { EXT(SSE2) } }, // #43 [ref=2x] + { 0, 1, { EXT(SSE) } }, // #44 [ref=2x] + { 0, 0, { EXT(I486) } }, // #45 [ref=5x] + { 0, 0, { EXT(SSE4_2) } }, // #46 [ref=2x] + { 0, 20, { 0 } }, // #47 [ref=2x] + { 0, 0, { EXT(MMX) } }, // #48 [ref=1x] + { 0, 0, { EXT(CET_IBT) } }, // #49 [ref=2x] + { 0, 1, { EXT(ENQCMD) } }, // #50 [ref=2x] + { 0, 0, { EXT(SSE4A) } }, // #51 [ref=4x] + { 0, 21, { EXT(FPU) } }, // #52 [ref=80x] + { 0, 22, { EXT(CMOV), EXT(FPU) } }, // #53 [ref=2x] + { 0, 23, { EXT(CMOV), EXT(FPU) } }, // #54 [ref=2x] + { 0, 24, { EXT(CMOV), EXT(FPU) } }, // #55 [ref=2x] + { 0, 25, { EXT(CMOV), EXT(FPU) } }, // #56 [ref=2x] + { 0, 26, { EXT(FPU) } }, // #57 [ref=4x] + { 0, 0, { EXT(3DNOW) } }, // #58 [ref=21x] + { 0, 21, { EXT(SSE3), EXT(FPU) } }, // #59 [ref=1x] + { 0, 21, { EXT(FXSR) } }, // #60 [ref=2x] + { 0, 27, { EXT(FXSR) } }, // #61 [ref=2x] + { 0, 0, { EXT(SMX) } }, // #62 [ref=1x] + { 0, 0, { EXT(GFNI) } }, // #63 [ref=3x] + { 0, 0, { EXT(HRESET) } }, // #64 [ref=1x] + { 0, 0, { EXT(CET_SS) } }, // #65 [ref=9x] + { 0, 16, { 0 } }, // #66 [ref=5x] + { 0, 0, { EXT(VMX) } }, // #67 [ref=13x] + { 0, 0, { EXT(INVLPGB) } }, // #68 [ref=2x] + { 0, 11, { 0 } }, // #69 [ref=8x] + { 0, 12, { 0 } }, // #70 [ref=12x] + { 0, 13, { 0 } }, // #71 [ref=10x] + { 0, 14, { 0 } }, // #72 [ref=8x] + { 0, 15, { 0 } }, // #73 [ref=8x] + { 0, 17, { 0 } }, // #74 [ref=8x] + { 0, 18, { 0 } }, // #75 [ref=4x] + { 0, 0, { EXT(AVX512_DQ) } }, // #76 [ref=22x] + { 0, 0, { EXT(AVX512_BW) } }, // #77 [ref=20x] + { 0, 0, { EXT(AVX512_F) } }, // #78 [ref=36x] + { 1, 0, { EXT(AVX512_DQ) } }, // #79 [ref=1x] + { 1, 0, { EXT(AVX512_BW) } }, // #80 [ref=2x] + { 1, 0, { EXT(AVX512_F) } }, // #81 [ref=1x] + { 0, 1, { EXT(AVX512_DQ) } }, // #82 [ref=3x] + { 0, 1, { EXT(AVX512_BW) } }, // #83 [ref=4x] + { 0, 1, { EXT(AVX512_F) } }, // #84 [ref=1x] + { 0, 28, { EXT(LAHFSAHF) } }, // #85 [ref=1x] + { 0, 0, { EXT(AMX_TILE) } }, // #86 [ref=7x] + { 0, 0, { EXT(LWP) } }, // #87 [ref=4x] + { 0, 29, { 0 } }, // #88 [ref=3x] + { 0, 1, { EXT(LZCNT) } }, // #89 [ref=1x] + { 0, 0, { EXT(MMX2) } }, // #90 [ref=3x] + { 0, 1, { EXT(MCOMMIT) } }, // #91 [ref=1x] + { 0, 0, { EXT(MONITOR) } }, // #92 [ref=2x] + { 0, 0, { EXT(MONITORX) } }, // #93 [ref=2x] + { 1, 0, { 0 } }, // #94 [ref=1x] + { 1, 0, { EXT(SSE2) } }, // #95 [ref=5x] + { 1, 0, { EXT(SSE) } }, // #96 [ref=3x] + { 0, 0, { EXT(MOVBE) } }, // #97 [ref=1x] + { 0, 0, { EXT(MMX), EXT(SSE2) } }, // #98 [ref=45x] + { 0, 0, { EXT(MOVDIR64B) } }, // #99 [ref=1x] + { 0, 0, { EXT(MOVDIRI) } }, // #100 [ref=1x] + { 1, 0, { EXT(MMX), EXT(SSE2) } }, // #101 [ref=1x] + { 0, 0, { EXT(BMI2) } }, // #102 [ref=7x] + { 0, 0, { EXT(SSSE3) } }, // #103 [ref=16x] + { 0, 0, { EXT(MMX2), EXT(SSE2) } }, // #104 [ref=10x] + { 0, 0, { EXT(PCLMULQDQ) } }, // #105 [ref=1x] + { 0, 1, { EXT(SSE4_2) } }, // #106 [ref=4x] + { 0, 0, { EXT(PCONFIG) } }, // #107 [ref=1x] + { 0, 0, { EXT(MMX2), EXT(SSE2), EXT(SSE4_1) } }, // #108 [ref=1x] + { 0, 0, { EXT(3DNOW2) } }, // #109 [ref=5x] + { 0, 0, { EXT(GEODE) } }, // #110 [ref=2x] + { 0, 1, { EXT(POPCNT) } }, // #111 [ref=1x] + { 0, 30, { 0 } }, // #112 [ref=3x] + { 0, 0, { EXT(PREFETCHI) } }, // #113 [ref=2x] + { 0, 1, { EXT(PREFETCHW) } }, // #114 [ref=1x] + { 0, 1, { EXT(PREFETCHWT1) } }, // #115 [ref=1x] + { 0, 20, { EXT(SEV_SNP) } }, // #116 [ref=3x] + { 0, 1, { EXT(SSE4_1) } }, // #117 [ref=1x] + { 0, 0, { EXT(PTWRITE) } }, // #118 [ref=1x] + { 0, 31, { 0 } }, // #119 [ref=3x] + { 0, 1, { EXT(SEV_SNP) } }, // #120 [ref=1x] + { 0, 32, { 0 } }, // #121 [ref=2x] + { 0, 0, { EXT(FSGSBASE) } }, // #122 [ref=4x] + { 0, 0, { EXT(MSR) } }, // #123 [ref=2x] + { 0, 0, { EXT(RDPID) } }, // #124 [ref=1x] + { 0, 0, { EXT(OSPKE) } }, // #125 [ref=1x] + { 0, 0, { EXT(RDPRU) } }, // #126 [ref=1x] + { 0, 1, { EXT(RDRAND) } }, // #127 [ref=1x] + { 0, 1, { EXT(RDSEED) } }, // #128 [ref=1x] + { 0, 0, { EXT(RDTSC) } }, // #129 [ref=1x] + { 0, 0, { EXT(RDTSCP) } }, // #130 [ref=1x] + { 0, 33, { 0 } }, // #131 [ref=2x] + { 0, 34, { EXT(LAHFSAHF) } }, // #132 [ref=1x] + { 0, 0, { EXT(SEAM) } }, // #133 [ref=4x] + { 0, 0, { EXT(SERIALIZE) } }, // #134 [ref=1x] + { 0, 0, { EXT(SHA) } }, // #135 [ref=7x] + { 0, 0, { EXT(SKINIT) } }, // #136 [ref=2x] + { 0, 0, { EXT(AMX_COMPLEX) } }, // #137 [ref=2x] + { 0, 0, { EXT(AMX_BF16) } }, // #138 [ref=1x] + { 0, 0, { EXT(AMX_INT8) } }, // #139 [ref=4x] + { 0, 0, { EXT(AMX_FP16) } }, // #140 [ref=1x] + { 0, 1, { EXT(UINTR) } }, // #141 [ref=1x] + { 0, 1, { EXT(WAITPKG) } }, // #142 [ref=2x] + { 0, 0, { EXT(WAITPKG) } }, // #143 [ref=1x] + { 0, 0, { EXT(AVX512_4FMAPS) } }, // #144 [ref=4x] + { 0, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #145 [ref=38x] + { 0, 0, { EXT(AVX512_FP16), EXT(AVX512_VL) } }, // #146 [ref=60x] + { 0, 0, { EXT(AVX), EXT(AVX512_F) } }, // #147 [ref=33x] + { 0, 0, { EXT(AVX512_FP16) } }, // #148 [ref=44x] + { 0, 0, { EXT(AVX) } }, // #149 [ref=35x] + { 0, 0, { EXT(AESNI), EXT(VAES), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #150 [ref=4x] + { 0, 0, { EXT(AESNI), EXT(AVX) } }, // #151 [ref=2x] + { 0, 0, { EXT(AVX512_F), EXT(AVX512_VL) } }, // #152 [ref=108x] + { 0, 0, { EXT(AVX), EXT(AVX512_DQ), EXT(AVX512_VL) } }, // #153 [ref=8x] + { 0, 0, { EXT(AVX_NE_CONVERT) } }, // #154 [ref=6x] + { 0, 0, { EXT(AVX512_DQ), EXT(AVX512_VL) } }, // #155 [ref=30x] + { 0, 0, { EXT(AVX2) } }, // #156 [ref=7x] + { 0, 0, { EXT(AVX), EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) } }, // #157 [ref=39x] + { 0, 1, { EXT(AVX), EXT(AVX512_F) } }, // #158 [ref=4x] + { 0, 1, { EXT(AVX512_FP16) } }, // #159 [ref=2x] + { 0, 0, { EXT(AVX512_BF16), EXT(AVX512_VL) } }, // #160 [ref=2x] + { 0, 0, { EXT(AVX_NE_CONVERT), EXT(AVX512_BF16), EXT(AVX512_VL) } }, // #161 [ref=1x] + { 0, 0, { EXT(F16C), EXT(AVX512_F), EXT(AVX512_VL) } }, // #162 [ref=2x] + { 0, 0, { EXT(AVX512_BW), EXT(AVX512_VL) } }, // #163 [ref=24x] + { 0, 0, { EXT(AVX512_ER) } }, // #164 [ref=10x] + { 0, 0, { EXT(FMA), EXT(AVX512_F), EXT(AVX512_VL) } }, // #165 [ref=36x] + { 0, 0, { EXT(FMA), EXT(AVX512_F) } }, // #166 [ref=24x] + { 0, 0, { EXT(FMA4) } }, // #167 [ref=20x] + { 0, 0, { EXT(XOP) } }, // #168 [ref=55x] + { 0, 0, { EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) } }, // #169 [ref=19x] + { 0, 0, { EXT(AVX512_PF) } }, // #170 [ref=16x] + { 0, 0, { EXT(GFNI), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #171 [ref=3x] + { 0, 0, { EXT(SEV_ES) } }, // #172 [ref=1x] + { 1, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #173 [ref=4x] + { 1, 0, { EXT(AVX) } }, // #174 [ref=2x] + { 1, 0, { EXT(AVX512_F), EXT(AVX512_VL) } }, // #175 [ref=4x] + { 1, 0, { EXT(AVX512_BW), EXT(AVX512_VL) } }, // #176 [ref=2x] + { 1, 0, { EXT(AVX), EXT(AVX512_F) } }, // #177 [ref=3x] + { 0, 0, { EXT(AVX), EXT(AVX2) } }, // #178 [ref=17x] + { 0, 0, { EXT(AVX512_VL), EXT(AVX512_VP2INTERSECT) } }, // #179 [ref=2x] + { 0, 0, { EXT(AVX512_4VNNIW) } }, // #180 [ref=2x] + { 0, 0, { EXT(AVX), EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) } }, // #181 [ref=54x] + { 0, 0, { EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) } }, // #182 [ref=2x] + { 0, 0, { EXT(AVX512_CD), EXT(AVX512_VL) } }, // #183 [ref=6x] + { 0, 0, { EXT(PCLMULQDQ), EXT(VPCLMULQDQ), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #184 [ref=1x] + { 0, 1, { EXT(AVX) } }, // #185 [ref=7x] + { 0, 0, { EXT(AVX512_VBMI2), EXT(AVX512_VL) } }, // #186 [ref=16x] + { 0, 0, { EXT(AVX_VNNI_INT8) } }, // #187 [ref=6x] + { 0, 0, { EXT(AVX_VNNI), EXT(AVX512_VL), EXT(AVX512_VNNI) } }, // #188 [ref=4x] + { 0, 0, { EXT(AVX_VNNI_INT16) } }, // #189 [ref=6x] + { 0, 0, { EXT(AVX512_VBMI), EXT(AVX512_VL) } }, // #190 [ref=4x] + { 0, 0, { EXT(AVX), EXT(AVX512_BW) } }, // #191 [ref=4x] + { 0, 0, { EXT(AVX), EXT(AVX512_DQ) } }, // #192 [ref=4x] + { 0, 0, { EXT(AVX_IFMA), EXT(AVX512_IFMA), EXT(AVX512_VL) } }, // #193 [ref=2x] + { 0, 0, { EXT(AVX512_BITALG), EXT(AVX512_VL) } }, // #194 [ref=3x] + { 0, 0, { EXT(AVX512_VL), EXT(AVX512_VPOPCNTDQ) } }, // #195 [ref=2x] + { 0, 0, { EXT(SHA512), EXT(AVX) } }, // #196 [ref=3x] + { 0, 0, { EXT(SM3), EXT(AVX) } }, // #197 [ref=3x] + { 0, 0, { EXT(SM4), EXT(AVX) } }, // #198 [ref=2x] + { 0, 0, { EXT(WBNOINVD) } }, // #199 [ref=1x] + { 0, 0, { EXT(RTM) } }, // #200 [ref=3x] + { 0, 0, { EXT(XSAVE) } }, // #201 [ref=6x] + { 0, 0, { EXT(TSXLDTRK) } }, // #202 [ref=2x] + { 0, 0, { EXT(XSAVES) } }, // #203 [ref=4x] + { 0, 0, { EXT(XSAVEC) } }, // #204 [ref=2x] + { 0, 0, { EXT(XSAVEOPT) } }, // #205 [ref=2x] + { 0, 1, { EXT(TSX) } } // #206 [ref=1x] }; #undef EXT #define FLAG(VAL) uint32_t(CpuRWFlags::kX86_##VAL) const InstDB::RWFlagsInfoTable InstDB::_rwFlagsInfoTable[] = { - { 0, 0 }, // #0 [ref=1429x] - { 0, FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #1 [ref=84x] + { 0, 0 }, // #0 [ref=1383x] + { 0, FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #1 [ref=104x] { FLAG(CF), FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #2 [ref=2x] { FLAG(CF), FLAG(CF) }, // #3 [ref=2x] { FLAG(OF), FLAG(OF) }, // #4 [ref=1x] @@ -2809,30 +2880,36 @@ const InstDB::RWFlagsInfoTable InstDB::_rwFlagsInfoTable[] = { { 0, FLAG(CF) }, // #8 [ref=2x] { 0, FLAG(DF) }, // #9 [ref=2x] { 0, FLAG(IF) }, // #10 [ref=2x] - { FLAG(CF) | FLAG(ZF), 0 }, // #11 [ref=14x] - { FLAG(CF), 0 }, // #12 [ref=20x] - { FLAG(ZF), 0 }, // #13 [ref=16x] + { FLAG(CF) | FLAG(ZF), 0 }, // #11 [ref=12x] + { FLAG(CF), 0 }, // #12 [ref=18x] + { FLAG(ZF), 0 }, // #13 [ref=14x] { FLAG(OF) | FLAG(SF) | FLAG(ZF), 0 }, // #14 [ref=12x] { FLAG(OF) | FLAG(SF), 0 }, // #15 [ref=12x] { FLAG(OF), 0 }, // #16 [ref=7x] - { FLAG(PF), 0 }, // #17 [ref=14x] + { FLAG(PF), 0 }, // #17 [ref=12x] { FLAG(SF), 0 }, // #18 [ref=6x] { FLAG(DF), FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #19 [ref=2x] { 0, FLAG(AF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #20 [ref=5x] - { 0, FLAG(CF) | FLAG(PF) | FLAG(ZF) }, // #21 [ref=4x] - { FLAG(AF) | FLAG(CF) | FLAG(PF) | FLAG(SF) | FLAG(ZF), 0 }, // #22 [ref=1x] - { FLAG(DF), 0 }, // #23 [ref=3x] - { 0, FLAG(AF) | FLAG(CF) | FLAG(DF) | FLAG(IF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #24 [ref=3x] - { FLAG(AF) | FLAG(CF) | FLAG(DF) | FLAG(IF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF), 0 }, // #25 [ref=3x] - { FLAG(CF) | FLAG(OF), FLAG(CF) | FLAG(OF) }, // #26 [ref=2x] - { 0, FLAG(CF) | FLAG(OF) }, // #27 [ref=2x] - { 0, FLAG(AF) | FLAG(CF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) } // #28 [ref=1x] + { 0, FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #21 [ref=83x] + { FLAG(CF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #22 [ref=2x] + { FLAG(CF) | FLAG(ZF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #23 [ref=2x] + { FLAG(ZF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #24 [ref=2x] + { FLAG(PF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #25 [ref=2x] + { 0, FLAG(C1) | FLAG(CF) | FLAG(PF) | FLAG(ZF) }, // #26 [ref=4x] + { FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3), 0 }, // #27 [ref=2x] + { FLAG(AF) | FLAG(CF) | FLAG(PF) | FLAG(SF) | FLAG(ZF), 0 }, // #28 [ref=1x] + { FLAG(DF), 0 }, // #29 [ref=3x] + { 0, FLAG(AF) | FLAG(CF) | FLAG(DF) | FLAG(IF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #30 [ref=3x] + { FLAG(AF) | FLAG(CF) | FLAG(DF) | FLAG(IF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF), 0 }, // #31 [ref=3x] + { FLAG(CF) | FLAG(OF), FLAG(CF) | FLAG(OF) }, // #32 [ref=2x] + { 0, FLAG(CF) | FLAG(OF) }, // #33 [ref=2x] + { 0, FLAG(AF) | FLAG(CF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) } // #34 [ref=1x] }; #undef FLAG #define FLAG(VAL) uint32_t(InstRWFlags::k##VAL) const InstRWFlags InstDB::_instFlagsTable[] = { - InstRWFlags(FLAG(None)), // #0 [ref=1634x] + InstRWFlags(FLAG(None)), // #0 [ref=1693x] InstRWFlags(FLAG(MovOp)) // #1 [ref=29x] }; #undef FLAG @@ -2845,164 +2922,8 @@ const InstRWFlags InstDB::_instFlagsTable[] = { #ifndef ASMJIT_NO_TEXT // ${NameData:Begin} // ------------------- Automatically generated, do not edit ------------------- -const char InstDB::_nameData[] = - "\0" "aaa\0" "aad\0" "aam\0" "aas\0" "adc\0" "adcx\0" "adox\0" "arpl\0" "bextr\0" "blcfill\0" "blci\0" "blcic\0" - "blcmsk\0" "blcs\0" "blsfill\0" "blsi\0" "blsic\0" "blsmsk\0" "blsr\0" "bndcl\0" "bndcn\0" "bndcu\0" "bndldx\0" - "bndmk\0" "bndmov\0" "bndstx\0" "bound\0" "bsf\0" "bsr\0" "bswap\0" "bt\0" "btc\0" "btr\0" "bts\0" "bzhi\0" "cbw\0" - "cdq\0" "cdqe\0" "clac\0" "clc\0" "cld\0" "cldemote\0" "clflush\0" "clflushopt\0" "clgi\0" "cli\0" "clrssbsy\0" - "clts\0" "clui\0" "clwb\0" "clzero\0" "cmc\0" "cmova\0" "cmovae\0" "cmovc\0" "cmovg\0" "cmovge\0" "cmovl\0" - "cmovle\0" "cmovna\0" "cmovnae\0" "cmovnc\0" "cmovng\0" "cmovnge\0" "cmovnl\0" "cmovnle\0" "cmovno\0" "cmovnp\0" - "cmovns\0" "cmovnz\0" "cmovo\0" "cmovp\0" "cmovpe\0" "cmovpo\0" "cmovs\0" "cmovz\0" "cmp\0" "cmps\0" "cmpxchg\0" - "cmpxchg16b\0" "cmpxchg8b\0" "cpuid\0" "cqo\0" "crc32\0" "cvtpd2pi\0" "cvtpi2pd\0" "cvtpi2ps\0" "cvtps2pi\0" - "cvttpd2pi\0" "cvttps2pi\0" "cwd\0" "cwde\0" "daa\0" "das\0" "endbr32\0" "endbr64\0" "enqcmd\0" "enqcmds\0" "f2xm1\0" - "fabs\0" "faddp\0" "fbld\0" "fbstp\0" "fchs\0" "fclex\0" "fcmovb\0" "fcmovbe\0" "fcmove\0" "fcmovnb\0" "fcmovnbe\0" - "fcmovne\0" "fcmovnu\0" "fcmovu\0" "fcom\0" "fcomi\0" "fcomip\0" "fcomp\0" "fcompp\0" "fcos\0" "fdecstp\0" "fdiv\0" - "fdivp\0" "fdivr\0" "fdivrp\0" "femms\0" "ffree\0" "fiadd\0" "ficom\0" "ficomp\0" "fidiv\0" "fidivr\0" "fild\0" - "fimul\0" "fincstp\0" "finit\0" "fist\0" "fistp\0" "fisttp\0" "fisub\0" "fisubr\0" "fld\0" "fld1\0" "fldcw\0" - "fldenv\0" "fldl2e\0" "fldl2t\0" "fldlg2\0" "fldln2\0" "fldpi\0" "fldz\0" "fmulp\0" "fnclex\0" "fninit\0" "fnop\0" - "fnsave\0" "fnstcw\0" "fnstenv\0" "fnstsw\0" "fpatan\0" "fprem\0" "fprem1\0" "fptan\0" "frndint\0" "frstor\0" - "fsave\0" "fscale\0" "fsin\0" "fsincos\0" "fsqrt\0" "fst\0" "fstcw\0" "fstenv\0" "fstp\0" "fstsw\0" "fsubp\0" - "fsubrp\0" "ftst\0" "fucom\0" "fucomi\0" "fucomip\0" "fucomp\0" "fucompp\0" "fwait\0" "fxam\0" "fxch\0" "fxrstor\0" - "fxrstor64\0" "fxsave\0" "fxsave64\0" "fxtract\0" "fyl2x\0" "fyl2xp1\0" "getsec\0" "hlt\0" "hreset\0" "inc\0" - "incsspd\0" "incsspq\0" "insertq\0" "int3\0" "into\0" "invept\0" "invlpg\0" "invlpga\0" "invpcid\0" "invvpid\0" - "iretd\0" "iretq\0" "ja\0" "jae\0" "jb\0" "jbe\0" "jc\0" "je\0" "jecxz\0" "jg\0" "jge\0" "jl\0" "jle\0" "jna\0" - "jnae\0" "jnb\0" "jnbe\0" "jnc\0" "jne\0" "jng\0" "jnge\0" "jnl\0" "jnle\0" "jno\0" "jnp\0" "jns\0" "jnz\0" "jo\0" - "jp\0" "jpe\0" "jpo\0" "js\0" "jz\0" "kaddb\0" "kaddd\0" "kaddq\0" "kaddw\0" "kandb\0" "kandd\0" "kandnb\0" - "kandnd\0" "kandnq\0" "kandnw\0" "kandq\0" "kandw\0" "kmovb\0" "kmovw\0" "knotb\0" "knotd\0" "knotq\0" "knotw\0" - "korb\0" "kord\0" "korq\0" "kortestb\0" "kortestd\0" "kortestq\0" "kortestw\0" "korw\0" "kshiftlb\0" "kshiftld\0" - "kshiftlq\0" "kshiftlw\0" "kshiftrb\0" "kshiftrd\0" "kshiftrq\0" "kshiftrw\0" "ktestb\0" "ktestd\0" "ktestq\0" - "ktestw\0" "kunpckbw\0" "kunpckdq\0" "kunpckwd\0" "kxnorb\0" "kxnord\0" "kxnorq\0" "kxnorw\0" "kxorb\0" "kxord\0" - "kxorq\0" "kxorw\0" "lahf\0" "lar\0" "lcall\0" "lds\0" "ldtilecfg\0" "lea\0" "leave\0" "les\0" "lfence\0" "lfs\0" - "lgdt\0" "lgs\0" "lidt\0" "ljmp\0" "lldt\0" "llwpcb\0" "lmsw\0" "lods\0" "loop\0" "loope\0" "loopne\0" "lsl\0" - "ltr\0" "lwpins\0" "lwpval\0" "lzcnt\0" "mcommit\0" "mfence\0" "monitorx\0" "movabs\0" "movdir64b\0" "movdiri\0" - "movdq2q\0" "movnti\0" "movntq\0" "movntsd\0" "movntss\0" "movq2dq\0" "movsx\0" "movsxd\0" "movzx\0" "mulx\0" - "mwaitx\0" "neg\0" "not\0" "out\0" "outs\0" "pavgusb\0" "pconfig\0" "pdep\0" "pext\0" "pf2id\0" "pf2iw\0" "pfacc\0" - "pfadd\0" "pfcmpeq\0" "pfcmpge\0" "pfcmpgt\0" "pfmax\0" "pfmin\0" "pfmul\0" "pfnacc\0" "pfpnacc\0" "pfrcp\0" - "pfrcpit1\0" "pfrcpit2\0" "pfrcpv\0" "pfrsqit1\0" "pfrsqrt\0" "pfrsqrtv\0" "pfsub\0" "pfsubr\0" "pi2fd\0" "pi2fw\0" - "pmulhrw\0" "pop\0" "popa\0" "popad\0" "popcnt\0" "popf\0" "popfd\0" "popfq\0" "prefetch\0" "prefetchnta\0" - "prefetcht0\0" "prefetcht1\0" "prefetcht2\0" "prefetchw\0" "prefetchwt1\0" "pshufw\0" "psmash\0" "pswapd\0" - "ptwrite\0" "push\0" "pusha\0" "pushad\0" "pushf\0" "pushfd\0" "pushfq\0" "pvalidate\0" "rcl\0" "rcr\0" "rdfsbase\0" - "rdgsbase\0" "rdmsr\0" "rdpid\0" "rdpkru\0" "rdpmc\0" "rdpru\0" "rdrand\0" "rdseed\0" "rdsspd\0" "rdsspq\0" "rdtsc\0" - "rdtscp\0" "retf\0" "rmpadjust\0" "rmpupdate\0" "rol\0" "ror\0" "rorx\0" "rsm\0" "rstorssp\0" "sahf\0" "sal\0" - "sar\0" "sarx\0" "saveprevssp\0" "sbb\0" "scas\0" "senduipi\0" "serialize\0" "seta\0" "setae\0" "setb\0" "setbe\0" - "setc\0" "sete\0" "setg\0" "setge\0" "setl\0" "setle\0" "setna\0" "setnae\0" "setnb\0" "setnbe\0" "setnc\0" "setne\0" - "setng\0" "setnge\0" "setnl\0" "setnle\0" "setno\0" "setnp\0" "setns\0" "setnz\0" "seto\0" "setp\0" "setpe\0" - "setpo\0" "sets\0" "setssbsy\0" "setz\0" "sfence\0" "sgdt\0" "sha1msg1\0" "sha1msg2\0" "sha1nexte\0" "sha1rnds4\0" - "sha256msg1\0" "sha256msg2\0" "sha256rnds2\0" "shl\0" "shlx\0" "shr\0" "shrd\0" "shrx\0" "sidt\0" "skinit\0" "sldt\0" - "slwpcb\0" "smsw\0" "stac\0" "stc\0" "stgi\0" "sti\0" "stos\0" "str\0" "sttilecfg\0" "swapgs\0" "syscall\0" - "sysenter\0" "sysexit\0" "sysexitq\0" "sysret\0" "sysretq\0" "t1mskc\0" "tdpbf16ps\0" "tdpbssd\0" "tdpbsud\0" - "tdpbusd\0" "tdpbuud\0" "testui\0" "tileloadd\0" "tileloaddt1\0" "tilerelease\0" "tilestored\0" "tilezero\0" - "tpause\0" "tzcnt\0" "tzmsk\0" "ud0\0" "ud1\0" "ud2\0" "uiret\0" "umonitor\0" "umwait\0" "v4fmaddps\0" "v4fmaddss\0" - "v4fnmaddps\0" "v4fnmaddss\0" "vaddpd\0" "vaddph\0" "vaddps\0" "vaddsd\0" "vaddsh\0" "vaddss\0" "vaddsubpd\0" - "vaddsubps\0" "vaesdec\0" "vaesdeclast\0" "vaesenc\0" "vaesenclast\0" "vaesimc\0" "vaeskeygenassist\0" "valignd\0" - "valignq\0" "vandnpd\0" "vandnps\0" "vandpd\0" "vandps\0" "vblendmpd\0" "vblendmps\0" "vblendpd\0" "vblendps\0" - "vblendvpd\0" "vblendvps\0" "vbroadcastf128\0" "vbroadcastf32x2\0" "vbroadcastf32x4\0" "vbroadcastf32x8\0" - "vbroadcastf64x2\0" "vbroadcastf64x4\0" "vbroadcasti128\0" "vbroadcasti32x2\0" "vbroadcasti32x4\0" - "vbroadcasti32x8\0" "vbroadcasti64x2\0" "vbroadcasti64x4\0" "vbroadcastsd\0" "vbroadcastss\0" "vcmppd\0" "vcmpph\0" - "vcmpps\0" "vcmpsd\0" "vcmpsh\0" "vcmpss\0" "vcomisd\0" "vcomish\0" "vcomiss\0" "vcompresspd\0" "vcompressps\0" - "vcvtdq2pd\0" "vcvtdq2ph\0" "vcvtdq2ps\0" "vcvtne2ps2bf16\0" "vcvtneps2bf16\0" "vcvtpd2dq\0" "vcvtpd2ph\0" - "vcvtpd2ps\0" "vcvtpd2qq\0" "vcvtpd2udq\0" "vcvtpd2uqq\0" "vcvtph2dq\0" "vcvtph2pd\0" "vcvtph2ps\0" "vcvtph2psx\0" - "vcvtph2qq\0" "vcvtph2udq\0" "vcvtph2uqq\0" "vcvtph2uw\0" "vcvtph2w\0" "vcvtps2dq\0" "vcvtps2pd\0" "vcvtps2ph\0" - "vcvtps2phx\0" "vcvtps2qq\0" "vcvtps2udq\0" "vcvtps2uqq\0" "vcvtqq2pd\0" "vcvtqq2ph\0" "vcvtqq2ps\0" "vcvtsd2sh\0" - "vcvtsd2si\0" "vcvtsd2ss\0" "vcvtsd2usi\0" "vcvtsh2sd\0" "vcvtsh2si\0" "vcvtsh2ss\0" "vcvtsh2usi\0" "vcvtsi2sd\0" - "vcvtsi2sh\0" "vcvtsi2ss\0" "vcvtss2sd\0" "vcvtss2sh\0" "vcvtss2si\0" "vcvtss2usi\0" "vcvttpd2dq\0" "vcvttpd2qq\0" - "vcvttpd2udq\0" "vcvttpd2uqq\0" "vcvttph2dq\0" "vcvttph2qq\0" "vcvttph2udq\0" "vcvttph2uqq\0" "vcvttph2uw\0" - "vcvttph2w\0" "vcvttps2dq\0" "vcvttps2qq\0" "vcvttps2udq\0" "vcvttps2uqq\0" "vcvttsd2si\0" "vcvttsd2usi\0" - "vcvttsh2si\0" "vcvttsh2usi\0" "vcvttss2si\0" "vcvttss2usi\0" "vcvtudq2pd\0" "vcvtudq2ph\0" "vcvtudq2ps\0" - "vcvtuqq2pd\0" "vcvtuqq2ph\0" "vcvtuqq2ps\0" "vcvtusi2sd\0" "vcvtusi2sh\0" "vcvtusi2ss\0" "vcvtuw2ph\0" "vcvtw2ph\0" - "vdbpsadbw\0" "vdivpd\0" "vdivph\0" "vdivps\0" "vdivsd\0" "vdivsh\0" "vdivss\0" "vdpbf16ps\0" "vdppd\0" "vdpps\0" - "verr\0" "verw\0" "vexp2pd\0" "vexp2ps\0" "vexpandpd\0" "vexpandps\0" "vextractf128\0" "vextractf32x4\0" - "vextractf32x8\0" "vextractf64x2\0" "vextractf64x4\0" "vextracti128\0" "vextracti32x4\0" "vextracti32x8\0" - "vextracti64x2\0" "vextracti64x4\0" "vextractps\0" "vfcmaddcph\0" "vfcmaddcsh\0" "vfcmulcph\0" "vfcmulcsh\0" - "vfixupimmpd\0" "vfixupimmps\0" "vfixupimmsd\0" "vfixupimmss\0" "vfmadd132pd\0" "vfmadd132ph\0" "vfmadd132ps\0" - "vfmadd132sd\0" "vfmadd132sh\0" "vfmadd132ss\0" "vfmadd213pd\0" "vfmadd213ph\0" "vfmadd213ps\0" "vfmadd213sd\0" - "vfmadd213sh\0" "vfmadd213ss\0" "vfmadd231pd\0" "vfmadd231ph\0" "vfmadd231ps\0" "vfmadd231sd\0" "vfmadd231sh\0" - "vfmadd231ss\0" "vfmaddcph\0" "vfmaddcsh\0" "vfmaddpd\0" "vfmaddps\0" "vfmaddsd\0" "vfmaddss\0" "vfmaddsub132pd\0" - "vfmaddsub132ph\0" "vfmaddsub132ps\0" "vfmaddsub213pd\0" "vfmaddsub213ph\0" "vfmaddsub213ps\0" "vfmaddsub231pd\0" - "vfmaddsub231ph\0" "vfmaddsub231ps\0" "vfmaddsubpd\0" "vfmaddsubps\0" "vfmsub132pd\0" "vfmsub132ph\0" "vfmsub132ps\0" - "vfmsub132sd\0" "vfmsub132sh\0" "vfmsub132ss\0" "vfmsub213pd\0" "vfmsub213ph\0" "vfmsub213ps\0" "vfmsub213sd\0" - "vfmsub213sh\0" "vfmsub213ss\0" "vfmsub231pd\0" "vfmsub231ph\0" "vfmsub231ps\0" "vfmsub231sd\0" "vfmsub231sh\0" - "vfmsub231ss\0" "vfmsubadd132pd\0" "vfmsubadd132ph\0" "vfmsubadd132ps\0" "vfmsubadd213pd\0" "vfmsubadd213ph\0" - "vfmsubadd213ps\0" "vfmsubadd231pd\0" "vfmsubadd231ph\0" "vfmsubadd231ps\0" "vfmsubaddpd\0" "vfmsubaddps\0" - "vfmsubpd\0" "vfmsubps\0" "vfmsubsd\0" "vfmsubss\0" "vfmulcph\0" "vfmulcsh\0" "vfnmadd132pd\0" "vfnmadd132ph\0" - "vfnmadd132ps\0" "vfnmadd132sd\0" "vfnmadd132sh\0" "vfnmadd132ss\0" "vfnmadd213pd\0" "vfnmadd213ph\0" - "vfnmadd213ps\0" "vfnmadd213sd\0" "vfnmadd213sh\0" "vfnmadd213ss\0" "vfnmadd231pd\0" "vfnmadd231ph\0" - "vfnmadd231ps\0" "vfnmadd231sd\0" "vfnmadd231sh\0" "vfnmadd231ss\0" "vfnmaddpd\0" "vfnmaddps\0" "vfnmaddsd\0" - "vfnmaddss\0" "vfnmsub132pd\0" "vfnmsub132ph\0" "vfnmsub132ps\0" "vfnmsub132sd\0" "vfnmsub132sh\0" "vfnmsub132ss\0" - "vfnmsub213pd\0" "vfnmsub213ph\0" "vfnmsub213ps\0" "vfnmsub213sd\0" "vfnmsub213sh\0" "vfnmsub213ss\0" - "vfnmsub231pd\0" "vfnmsub231ph\0" "vfnmsub231ps\0" "vfnmsub231sd\0" "vfnmsub231sh\0" "vfnmsub231ss\0" "vfnmsubpd\0" - "vfnmsubps\0" "vfnmsubsd\0" "vfnmsubss\0" "vfpclasspd\0" "vfpclassph\0" "vfpclassps\0" "vfpclasssd\0" "vfpclasssh\0" - "vfpclassss\0" "vfrczpd\0" "vfrczps\0" "vfrczsd\0" "vfrczss\0" "vgatherdpd\0" "vgatherdps\0" "vgatherpf0dpd\0" - "vgatherpf0dps\0" "vgatherpf0qpd\0" "vgatherpf0qps\0" "vgatherpf1dpd\0" "vgatherpf1dps\0" "vgatherpf1qpd\0" - "vgatherpf1qps\0" "vgatherqpd\0" "vgatherqps\0" "vgetexppd\0" "vgetexpph\0" "vgetexpps\0" "vgetexpsd\0" "vgetexpsh\0" - "vgetexpss\0" "vgetmantpd\0" "vgetmantph\0" "vgetmantps\0" "vgetmantsd\0" "vgetmantsh\0" "vgetmantss\0" - "vgf2p8affineinvqb\0" "vgf2p8affineqb\0" "vgf2p8mulb\0" "vhaddpd\0" "vhaddps\0" "vhsubpd\0" "vhsubps\0" - "vinsertf128\0" "vinsertf32x4\0" "vinsertf32x8\0" "vinsertf64x2\0" "vinsertf64x4\0" "vinserti128\0" "vinserti32x4\0" - "vinserti32x8\0" "vinserti64x2\0" "vinserti64x4\0" "vinsertps\0" "vlddqu\0" "vldmxcsr\0" "vmaskmovdqu\0" - "vmaskmovpd\0" "vmaskmovps\0" "vmaxpd\0" "vmaxph\0" "vmaxps\0" "vmaxsd\0" "vmaxsh\0" "vmaxss\0" "vmcall\0" - "vmclear\0" "vmfunc\0" "vminpd\0" "vminph\0" "vminps\0" "vminsd\0" "vminsh\0" "vminss\0" "vmlaunch\0" "vmload\0" - "vmmcall\0" "vmovapd\0" "vmovaps\0" "vmovd\0" "vmovddup\0" "vmovdqa\0" "vmovdqa32\0" "vmovdqa64\0" "vmovdqu\0" - "vmovdqu16\0" "vmovdqu32\0" "vmovdqu64\0" "vmovdqu8\0" "vmovhlps\0" "vmovhpd\0" "vmovhps\0" "vmovlhps\0" "vmovlpd\0" - "vmovlps\0" "vmovmskpd\0" "vmovmskps\0" "vmovntdq\0" "vmovntdqa\0" "vmovntpd\0" "vmovntps\0" "vmovq\0" "vmovsd\0" - "vmovsh\0" "vmovshdup\0" "vmovsldup\0" "vmovss\0" "vmovupd\0" "vmovups\0" "vmovw\0" "vmpsadbw\0" "vmptrld\0" - "vmptrst\0" "vmread\0" "vmresume\0" "vmrun\0" "vmsave\0" "vmulpd\0" "vmulph\0" "vmulps\0" "vmulsd\0" "vmulsh\0" - "vmulss\0" "vmwrite\0" "vmxon\0" "vorpd\0" "vorps\0" "vp2intersectd\0" "vp2intersectq\0" "vp4dpwssd\0" "vp4dpwssds\0" - "vpabsb\0" "vpabsd\0" "vpabsq\0" "vpabsw\0" "vpackssdw\0" "vpacksswb\0" "vpackusdw\0" "vpackuswb\0" "vpaddb\0" - "vpaddd\0" "vpaddq\0" "vpaddsb\0" "vpaddsw\0" "vpaddusb\0" "vpaddusw\0" "vpaddw\0" "vpalignr\0" "vpand\0" "vpandd\0" - "vpandn\0" "vpandnd\0" "vpandnq\0" "vpandq\0" "vpavgb\0" "vpavgw\0" "vpblendd\0" "vpblendmb\0" "vpblendmd\0" - "vpblendmq\0" "vpblendmw\0" "vpblendvb\0" "vpblendw\0" "vpbroadcastb\0" "vpbroadcastd\0" "vpbroadcastmb2q\0" - "vpbroadcastmw2d\0" "vpbroadcastq\0" "vpbroadcastw\0" "vpclmulqdq\0" "vpcmov\0" "vpcmpb\0" "vpcmpd\0" "vpcmpeqb\0" - "vpcmpeqd\0" "vpcmpeqq\0" "vpcmpeqw\0" "vpcmpestri\0" "vpcmpestrm\0" "vpcmpgtb\0" "vpcmpgtd\0" "vpcmpgtq\0" - "vpcmpgtw\0" "vpcmpistri\0" "vpcmpistrm\0" "vpcmpq\0" "vpcmpub\0" "vpcmpud\0" "vpcmpuq\0" "vpcmpuw\0" "vpcmpw\0" - "vpcomb\0" "vpcomd\0" "vpcompressb\0" "vpcompressd\0" "vpcompressq\0" "vpcompressw\0" "vpcomq\0" "vpcomub\0" - "vpcomud\0" "vpcomuq\0" "vpcomuw\0" "vpcomw\0" "vpconflictd\0" "vpconflictq\0" "vpdpbusd\0" "vpdpbusds\0" - "vpdpwssd\0" "vpdpwssds\0" "vperm2f128\0" "vperm2i128\0" "vpermb\0" "vpermd\0" "vpermi2b\0" "vpermi2d\0" - "vpermi2pd\0" "vpermi2ps\0" "vpermi2q\0" "vpermi2w\0" "vpermil2pd\0" "vpermil2ps\0" "vpermilpd\0" "vpermilps\0" - "vpermpd\0" "vpermps\0" "vpermq\0" "vpermt2b\0" "vpermt2d\0" "vpermt2pd\0" "vpermt2ps\0" "vpermt2q\0" "vpermt2w\0" - "vpermw\0" "vpexpandb\0" "vpexpandd\0" "vpexpandq\0" "vpexpandw\0" "vpextrb\0" "vpextrd\0" "vpextrq\0" "vpextrw\0" - "vpgatherdd\0" "vpgatherdq\0" "vpgatherqd\0" "vpgatherqq\0" "vphaddbd\0" "vphaddbq\0" "vphaddbw\0" "vphaddd\0" - "vphadddq\0" "vphaddsw\0" "vphaddubd\0" "vphaddubq\0" "vphaddubw\0" "vphaddudq\0" "vphadduwd\0" "vphadduwq\0" - "vphaddw\0" "vphaddwd\0" "vphaddwq\0" "vphminposuw\0" "vphsubbw\0" "vphsubd\0" "vphsubdq\0" "vphsubsw\0" "vphsubw\0" - "vphsubwd\0" "vpinsrb\0" "vpinsrd\0" "vpinsrq\0" "vpinsrw\0" "vplzcntd\0" "vplzcntq\0" "vpmacsdd\0" "vpmacsdqh\0" - "vpmacsdql\0" "vpmacssdd\0" "vpmacssdqh\0" "vpmacssdql\0" "vpmacsswd\0" "vpmacssww\0" "vpmacswd\0" "vpmacsww\0" - "vpmadcsswd\0" "vpmadcswd\0" "vpmadd52huq\0" "vpmadd52luq\0" "vpmaddubsw\0" "vpmaddwd\0" "vpmaskmovd\0" - "vpmaskmovq\0" "vpmaxsb\0" "vpmaxsd\0" "vpmaxsq\0" "vpmaxsw\0" "vpmaxub\0" "vpmaxud\0" "vpmaxuq\0" "vpmaxuw\0" - "vpminsb\0" "vpminsd\0" "vpminsq\0" "vpminsw\0" "vpminub\0" "vpminud\0" "vpminuq\0" "vpminuw\0" "vpmovb2m\0" - "vpmovd2m\0" "vpmovdb\0" "vpmovdw\0" "vpmovm2b\0" "vpmovm2d\0" "vpmovm2q\0" "vpmovm2w\0" "vpmovmskb\0" "vpmovq2m\0" - "vpmovqb\0" "vpmovqd\0" "vpmovqw\0" "vpmovsdb\0" "vpmovsdw\0" "vpmovsqb\0" "vpmovsqd\0" "vpmovsqw\0" "vpmovswb\0" - "vpmovsxbd\0" "vpmovsxbq\0" "vpmovsxbw\0" "vpmovsxdq\0" "vpmovsxwd\0" "vpmovsxwq\0" "vpmovusdb\0" "vpmovusdw\0" - "vpmovusqb\0" "vpmovusqd\0" "vpmovusqw\0" "vpmovuswb\0" "vpmovw2m\0" "vpmovwb\0" "vpmovzxbd\0" "vpmovzxbq\0" - "vpmovzxbw\0" "vpmovzxdq\0" "vpmovzxwd\0" "vpmovzxwq\0" "vpmuldq\0" "vpmulhrsw\0" "vpmulhuw\0" "vpmulhw\0" - "vpmulld\0" "vpmullq\0" "vpmullw\0" "vpmultishiftqb\0" "vpmuludq\0" "vpopcntb\0" "vpopcntd\0" "vpopcntq\0" - "vpopcntw\0" "vpor\0" "vpord\0" "vporq\0" "vpperm\0" "vprold\0" "vprolq\0" "vprolvd\0" "vprolvq\0" "vprord\0" - "vprorq\0" "vprorvd\0" "vprorvq\0" "vprotb\0" "vprotd\0" "vprotq\0" "vprotw\0" "vpsadbw\0" "vpscatterdd\0" - "vpscatterdq\0" "vpscatterqd\0" "vpscatterqq\0" "vpshab\0" "vpshad\0" "vpshaq\0" "vpshaw\0" "vpshlb\0" "vpshld\0" - "vpshldd\0" "vpshldq\0" "vpshldvd\0" "vpshldvq\0" "vpshldvw\0" "vpshldw\0" "vpshlq\0" "vpshlw\0" "vpshrdd\0" - "vpshrdq\0" "vpshrdvd\0" "vpshrdvq\0" "vpshrdvw\0" "vpshrdw\0" "vpshufb\0" "vpshufbitqmb\0" "vpshufd\0" "vpshufhw\0" - "vpshuflw\0" "vpsignb\0" "vpsignd\0" "vpsignw\0" "vpslld\0" "vpslldq\0" "vpsllq\0" "vpsllvd\0" "vpsllvq\0" - "vpsllvw\0" "vpsllw\0" "vpsrad\0" "vpsraq\0" "vpsravd\0" "vpsravq\0" "vpsravw\0" "vpsraw\0" "vpsrld\0" "vpsrldq\0" - "vpsrlq\0" "vpsrlvd\0" "vpsrlvq\0" "vpsrlvw\0" "vpsrlw\0" "vpsubb\0" "vpsubd\0" "vpsubq\0" "vpsubsb\0" "vpsubsw\0" - "vpsubusb\0" "vpsubusw\0" "vpsubw\0" "vpternlogd\0" "vpternlogq\0" "vptest\0" "vptestmb\0" "vptestmd\0" "vptestmq\0" - "vptestmw\0" "vptestnmb\0" "vptestnmd\0" "vptestnmq\0" "vptestnmw\0" "vpunpckhbw\0" "vpunpckhdq\0" "vpunpckhqdq\0" - "vpunpckhwd\0" "vpunpcklbw\0" "vpunpckldq\0" "vpunpcklqdq\0" "vpunpcklwd\0" "vpxor\0" "vpxord\0" "vpxorq\0" - "vrangepd\0" "vrangeps\0" "vrangesd\0" "vrangess\0" "vrcp14pd\0" "vrcp14ps\0" "vrcp14sd\0" "vrcp14ss\0" "vrcp28pd\0" - "vrcp28ps\0" "vrcp28sd\0" "vrcp28ss\0" "vrcpph\0" "vrcpps\0" "vrcpsh\0" "vrcpss\0" "vreducepd\0" "vreduceph\0" - "vreduceps\0" "vreducesd\0" "vreducesh\0" "vreducess\0" "vrndscalepd\0" "vrndscaleph\0" "vrndscaleps\0" - "vrndscalesd\0" "vrndscalesh\0" "vrndscaless\0" "vroundpd\0" "vroundps\0" "vroundsd\0" "vroundss\0" "vrsqrt14pd\0" - "vrsqrt14ps\0" "vrsqrt14sd\0" "vrsqrt14ss\0" "vrsqrt28pd\0" "vrsqrt28ps\0" "vrsqrt28sd\0" "vrsqrt28ss\0" "vrsqrtph\0" - "vrsqrtps\0" "vrsqrtsh\0" "vrsqrtss\0" "vscalefpd\0" "vscalefph\0" "vscalefps\0" "vscalefsd\0" "vscalefsh\0" - "vscalefss\0" "vscatterdpd\0" "vscatterdps\0" "vscatterpf0dpd\0" "vscatterpf0dps\0" "vscatterpf0qpd\0" - "vscatterpf0qps\0" "vscatterpf1dpd\0" "vscatterpf1dps\0" "vscatterpf1qpd\0" "vscatterpf1qps\0" "vscatterqpd\0" - "vscatterqps\0" "vshuff32x4\0" "vshuff64x2\0" "vshufi32x4\0" "vshufi64x2\0" "vshufpd\0" "vshufps\0" "vsqrtpd\0" - "vsqrtph\0" "vsqrtps\0" "vsqrtsd\0" "vsqrtsh\0" "vsqrtss\0" "vstmxcsr\0" "vsubpd\0" "vsubph\0" "vsubps\0" "vsubsd\0" - "vsubsh\0" "vsubss\0" "vtestpd\0" "vtestps\0" "vucomisd\0" "vucomish\0" "vucomiss\0" "vunpckhpd\0" "vunpckhps\0" - "vunpcklpd\0" "vunpcklps\0" "vxorpd\0" "vxorps\0" "vzeroall\0" "vzeroupper\0" "wbinvd\0" "wbnoinvd\0" "wrfsbase\0" - "wrgsbase\0" "wrmsr\0" "wrssd\0" "wrssq\0" "wrussd\0" "wrussq\0" "xabort\0" "xadd\0" "xbegin\0" "xend\0" "xgetbv\0" - "xlatb\0" "xresldtrk\0" "xrstors\0" "xrstors64\0" "xsavec\0" "xsavec64\0" "xsaveopt\0" "xsaveopt64\0" "xsaves\0" - "xsaves64\0" "xsetbv\0" "xsusldtrk\0" "xtest"; - -const InstDB::InstNameIndex InstDB::instNameIndex[26] = { - { Inst::kIdAaa , Inst::kIdArpl + 1 }, +const InstNameIndex InstDB::instNameIndex = {{ + { Inst::kIdAaa , Inst::kIdAxor + 1 }, { Inst::kIdBextr , Inst::kIdBzhi + 1 }, { Inst::kIdCall , Inst::kIdCwde + 1 }, { Inst::kIdDaa , Inst::kIdDpps + 1 }, @@ -3028,6 +2949,1761 @@ const InstDB::InstNameIndex InstDB::instNameIndex[26] = { { Inst::kIdXabort , Inst::kIdXtest + 1 }, { Inst::kIdNone , Inst::kIdNone + 1 }, { Inst::kIdNone , Inst::kIdNone + 1 } +}, uint16_t(17)}; + +const char InstDB::_instNameStringTable[] = + "vgf2p8affineinvqbvaeskeygenassistvbroadcastf32x464x264x4i32x2i32x4i32x8i64x2i64x" + "4vpbroadcastmb2w2dvbcstnebf162p128i128vcvtne2ps2vcvtneebf16vcvtneobf16vfmaddsub1" + "32ph213pd213ph213ps231pd231ph231psvfmsubadd132vpmultishiftvscatterpf0dqpdqps1dpd" + "1dps1qpd1qpsvcvtneps2vextracvextractfvgatherpf0vp2intersecttcmmimfp16tcmmrlfp16s" + "h2pssdph2psvfnmadd132213sd213sh213ss231sd231sh231ssvfnmsub132vinservinsertfvpshu" + "fbitqvsha512rndprefetchitntawt1saveprevsssha256rndtileloaddtilereleavaesdeclvaes" + "enclvcompressvcvttpd2uqqvcvttph2uvcvttps2uvcvttsd2uvcvttsh2uvcvttss2uvfixupimmvf" + "madd132vfmsub132vmaskmovdqvpcompressvpconflictvphminposuvpmadd52hluqvpscatterqdv" + "punpckhqlqdqvrndscalemsg1msg2clflushopcmpnbexcmpnlexcmpxchg16t0t2tilestorev4fnma" + "ddssvcvtpd2uvcvtph2psudqvcvtps2phvcvtsd2uvcvtsh2uvcvtss2uvcvtudq2vcvtuqq2vcvtusi" + "2vfcmaddcvfpclassvgetmanmulbvp4dpwssvpclmuvpcmpestrvpcmpistrvperm2fvpermil2vpgat" + "hervpmacssdqvpmadcsswubswvpmaskmovpternlogbwwdlbwldqlwdvrsqrt1428pd28ps28sd28ssv" + "shufvshuffvzeroupxsaveoptcmpbexcmplexcmpnbxcmpnlxcmpnoxcmpnpxcmpnsxcmpnzx8bfxrst" + "orldtilecfmovdir64pvalidarmpadjurmpupdaserialisha1nexsha1rndssttilecftdpbf16tdpf" + "p16v4fmadvaddsubvblendmvpdvcvtdq2uwvcvtqq2vcvtsi2vcvtuwvdbpsadvdpbf16vexpanvfcmu" + "lccphcshvgetexpvmovdqau16u32u64vmovmskvmovntvmovshdvmovsldvpackssdwbvpackuswbvpb" + "lendmdvpdpbssudsvpdpbusvpdpwssvpdpwus2pdvpermtvpexpanvphaddubwqdqhvpmovmskvpmovs" + "xbvpmovusqwvpmovzxbvpmulhrvptestnmqvreducevscalefvsm3rndvsm4rndsvunpckhlpdlpsxre" + "sldtrs64xsusldtrcldemoclrssbscmpbxcmplxcmpoxcmppxcmpsxcmpzxcvtpifcmovfxsavekorte" + "stkshiftrbkunpckmonitorpfrcpipfrsqirtvrdfsbrdgsbsspseamcalsenduisetssbssysesysex" + "vcvtwvfmulvldmxcsvmlaundupu8vmovhvmovlhvmpsadvmresumvpadduvpaligngtbgtdgtqgtw2b2" + "qbdbqvphsubvplzcnb2md2mq2mw2mvpopcnvpshldvqvpshrdvwhwvpsubuvrangevrcp14vroundsdv" + "sm4keyvstmxcsvucomiallwbnoinwrfsbwrgsbc64blcfiblsficmovnendbrenqcmnufdecsfincsfn" + "stefrndfsincfucomfyl2xincsspqinvlinvlpinvpcinvvpmcommmovq2pavgupfcmpepfpnaptwris" + "eamoseamrsyscsysretdpbutlbsyvaesivaligvandnvcomivfrczvhadvhsubvmclevmgexvmmcvmov" + "avmovuvmptvmwrivpandvpextrwvpinsvpmaxvpminvprolvprorvpsadvpsigvpslvpsllvpsravpsr" + "lvsqrvtes"; + + +const uint32_t InstDB::_instNameIndexTable[] = { + 0x80000000, // Small ''. + 0x80000421, // Small 'aaa'. + 0x80001021, // Small 'aad'. + 0x80021021, // Small 'aadd'. + 0x80003421, // Small 'aam'. + 0x80023821, // Small 'aand'. + 0x80004C21, // Small 'aas'. + 0x80000C81, // Small 'adc'. + 0x800C0C81, // Small 'adcx'. + 0x80001081, // Small 'add'. + 0x80481081, // Small 'addpd'. + 0x81381081, // Small 'addps'. + 0x80499081, // Small 'addsd'. + 0x81399081, // Small 'addss'. + 0x20A76099, // Large 'addsub|pd'. + 0x207D6099, // Large 'addsub|ps'. + 0x800C3C81, // Small 'adox'. + 0x86524CA1, // Small 'aesdec'. + 0x302871D5, // Large 'aesdecl|ast'. + 0x86E2CCA1, // Small 'aesenc'. + 0x302871DD, // Large 'aesencl|ast'. + 0x86D4CCA1, // Small 'aesimc'. + 0x0000F012, // Large 'aeskeygenassist'. + 0x800011C1, // Small 'and'. + 0x800711C1, // Small 'andn'. + 0x890711C1, // Small 'andnpd'. + 0xA70711C1, // Small 'andnps'. + 0x804811C1, // Small 'andpd'. + 0x813811C1, // Small 'andps'. + 0x800049E1, // Small 'aor'. + 0x80064241, // Small 'arpl'. + 0x80093F01, // Small 'axor'. + 0x812A60A2, // Small 'bextr'. + 0x26F45709, // Large 'blcfi|ll'. + 0x80048D82, // Small 'blci'. + 0x80348D82, // Small 'blcic'. + 0x97368D82, // Small 'blcmsk'. + 0x80098D82, // Small 'blcs'. + 0x20A75471, // Large 'blend|pd'. + 0x207D5471, // Large 'blend|ps'. + 0x34775471, // Large 'blend|vpd'. + 0x318B5471, // Large 'blend|vps'. + 0x26F4570E, // Large 'blsfi|ll'. + 0x8004CD82, // Small 'blsi'. + 0x8034CD82, // Small 'blsic'. + 0x9736CD82, // Small 'blsmsk'. + 0x80094D82, // Small 'blsr'. + 0x80C191C2, // Small 'bndcl'. + 0x80E191C2, // Small 'bndcn'. + 0x815191C2, // Small 'bndcu'. + 0xB04611C2, // Small 'bndldx'. + 0x80B691C2, // Small 'bndmk'. + 0xACF691C2, // Small 'bndmov'. + 0xB14991C2, // Small 'bndstx'. + 0x804755E2, // Small 'bound'. + 0x80001A62, // Small 'bsf'. + 0x80004A62, // Small 'bsr'. + 0x8100DE62, // Small 'bswap'. + 0x80000282, // Small 'bt'. + 0x80000E82, // Small 'btc'. + 0x80004A82, // Small 'btr'. + 0x80004E82, // Small 'bts'. + 0x8004A342, // Small 'bzhi'. + 0x80063023, // Small 'call'. + 0x80005C43, // Small 'cbw'. + 0x80004483, // Small 'cdq'. + 0x8002C483, // Small 'cdqe'. + 0x80018583, // Small 'clac'. + 0x80000D83, // Small 'clc'. + 0x80001183, // Small 'cld'. + 0x20DF65B0, // Large 'cldemo|te'. + 0x0000729D, // Large 'clflush'. + 0x1020929D, // Large 'clflushop|t'. + 0x80049D83, // Small 'clgi'. + 0x80002583, // Small 'cli'. + 0x101775B6, // Large 'clrssbs|y'. + 0x8009D183, // Small 'clts'. + 0x8004D583, // Small 'clui'. + 0x80015D83, // Small 'clwb'. + 0x9F22E983, // Small 'clzero'. + 0x80000DA3, // Small 'cmc'. + 0x801B3DA3, // Small 'cmova'. + 0x8A1B3DA3, // Small 'cmovae'. + 0x802B3DA3, // Small 'cmovb'. + 0x8A2B3DA3, // Small 'cmovbe'. + 0x803B3DA3, // Small 'cmovc'. + 0x805B3DA3, // Small 'cmove'. + 0x807B3DA3, // Small 'cmovg'. + 0x8A7B3DA3, // Small 'cmovge'. + 0x80CB3DA3, // Small 'cmovl'. + 0x8ACB3DA3, // Small 'cmovle'. + 0x82EB3DA3, // Small 'cmovna'. + 0x20125713, // Large 'cmovn|ae'. + 0x84EB3DA3, // Small 'cmovnb'. + 0x22AA5713, // Large 'cmovn|be'. + 0x86EB3DA3, // Small 'cmovnc'. + 0x8AEB3DA3, // Small 'cmovne'. + 0x8EEB3DA3, // Small 'cmovng'. + 0x20185713, // Large 'cmovn|ge'. + 0x98EB3DA3, // Small 'cmovnl'. + 0x21C45713, // Large 'cmovn|le'. + 0x9EEB3DA3, // Small 'cmovno'. + 0xA0EB3DA3, // Small 'cmovnp'. + 0xA6EB3DA3, // Small 'cmovns'. + 0xB4EB3DA3, // Small 'cmovnz'. + 0x80FB3DA3, // Small 'cmovo'. + 0x810B3DA3, // Small 'cmovp'. + 0x8B0B3DA3, // Small 'cmovpe'. + 0x9F0B3DA3, // Small 'cmovpo'. + 0x813B3DA3, // Small 'cmovs'. + 0x81AB3DA3, // Small 'cmovz'. + 0x800041A3, // Small 'cmp'. + 0x309963D9, // Large 'cmpbex|add'. + 0x309955BD, // Large 'cmpbx|add'. + 0x309963DF, // Large 'cmplex|add'. + 0x309955C2, // Large 'cmplx|add'. + 0x309972A6, // Large 'cmpnbex|add'. + 0x309963E5, // Large 'cmpnbx|add'. + 0x309972AD, // Large 'cmpnlex|add'. + 0x309963EB, // Large 'cmpnlx|add'. + 0x309963F1, // Large 'cmpnox|add'. + 0x309963F7, // Large 'cmpnpx|add'. + 0x309963FD, // Large 'cmpnsx|add'. + 0x30996403, // Large 'cmpnzx|add'. + 0x309955C7, // Large 'cmpox|add'. + 0x804841A3, // Small 'cmppd'. + 0x813841A3, // Small 'cmpps'. + 0x309955CC, // Large 'cmppx|add'. + 0x8009C1A3, // Small 'cmps'. + 0x8049C1A3, // Small 'cmpsd'. + 0x8139C1A3, // Small 'cmpss'. + 0x309955D1, // Large 'cmpsx|add'. + 0x000072B4, // Large 'cmpxchg'. + 0x101092B4, // Large 'cmpxchg16|b'. + 0x240972B4, // Large 'cmpxchg|8b'. + 0x309955D6, // Large 'cmpzx|add'. + 0x8934B5E3, // Small 'comisd'. + 0xA734B5E3, // Small 'comiss'. + 0x8044D603, // Small 'cpuid'. + 0x80003E23, // Small 'cqo'. + 0x81DF0E43, // Small 'crc32'. + 0x20A7647B, // Large 'cvtdq2|pd'. + 0x207D647B, // Large 'cvtdq2|ps'. + 0x20E562D5, // Large 'cvtpd2|dq'. + 0x222A62D5, // Large 'cvtpd2|pi'. + 0x207D62D5, // Large 'cvtpd2|ps'. + 0x352555DB, // Large 'cvtpi|2pd'. + 0x307C55DB, // Large 'cvtpi|2ps'. + 0x20E562E9, // Large 'cvtps2|dq'. + 0x102672E9, // Large 'cvtps2p|d'. + 0x100972E9, // Large 'cvtps2p|i'. + 0x201D62F2, // Large 'cvtsd2|si'. + 0x201C62F2, // Large 'cvtsd2|ss'. + 0x2144648B, // Large 'cvtsi2|sd'. + 0x201C648B, // Large 'cvtsi2|ss'. + 0x21446302, // Large 'cvtss2|sd'. + 0x201D6302, // Large 'cvtss2|si'. + 0x20E571EE, // Large 'cvttpd2|dq'. + 0x222A71EE, // Large 'cvttpd2|pi'. + 0x20E57202, // Large 'cvttps2|dq'. + 0x222A7202, // Large 'cvttps2|pi'. + 0x201D720B, // Large 'cvttsd2|si'. + 0x201D721D, // Large 'cvttss2|si'. + 0x800012E3, // Small 'cwd'. + 0x800292E3, // Small 'cwde'. + 0x80000424, // Small 'daa'. + 0x80004C24, // Small 'das'. + 0x80000CA4, // Small 'dec'. + 0x80005924, // Small 'div'. + 0x80485924, // Small 'divpd'. + 0x81385924, // Small 'divps'. + 0x8049D924, // Small 'divsd'. + 0x8139D924, // Small 'divss'. + 0x80024204, // Small 'dppd'. + 0x8009C204, // Small 'dpps'. + 0x8009B5A5, // Small 'emms'. + 0x202C5718, // Large 'endbr|32'. + 0x20305718, // Large 'endbr|64'. + 0x88D1C5C5, // Small 'enqcmd'. + 0x209B571D, // Large 'enqcm|ds'. + 0x8122D1C5, // Small 'enter'. + 0x207D710D, // Large 'extract|ps'. + 0x81195305, // Small 'extrq'. + 0x81C6E3A6, // Small 'f2xm1'. + 0x80098826, // Small 'fabs'. + 0x80021026, // Small 'fadd'. + 0x81021026, // Small 'faddp'. + 0x80023046, // Small 'fbld'. + 0x810A4C46, // Small 'fbstp'. + 0x8009A066, // Small 'fchs'. + 0x8182B066, // Small 'fclex'. + 0x8567B466, // Small 'fcmovb'. + 0x22AA55E0, // Large 'fcmov|be'. + 0x8B67B466, // Small 'fcmove'. + 0x22A955E0, // Large 'fcmov|nb'. + 0x32A955E0, // Large 'fcmov|nbe'. + 0x200A55E0, // Large 'fcmov|ne'. + 0x272255E0, // Large 'fcmov|nu'. + 0xAB67B466, // Small 'fcmovu'. + 0x8006BC66, // Small 'fcom'. + 0x8096BC66, // Small 'fcomi'. + 0xA096BC66, // Small 'fcomip'. + 0x8106BC66, // Small 'fcomp'. + 0xA106BC66, // Small 'fcompp'. + 0x8009BC66, // Small 'fcos'. + 0x21F15724, // Large 'fdecs|tp'. + 0x800B2486, // Small 'fdiv'. + 0x810B2486, // Small 'fdivp'. + 0x812B2486, // Small 'fdivr'. + 0xA12B2486, // Small 'fdivrp'. + 0x8136B4A6, // Small 'femms'. + 0x8052C8C6, // Small 'ffree'. + 0x80420526, // Small 'fiadd'. + 0x80D78D26, // Small 'ficom'. + 0xA0D78D26, // Small 'ficomp'. + 0x81649126, // Small 'fidiv'. + 0xA5649126, // Small 'fidivr'. + 0x80023126, // Small 'fild'. + 0x80CAB526, // Small 'fimul'. + 0x21F15729, // Large 'fincs|tp'. + 0x8144B926, // Small 'finit'. + 0x800A4D26, // Small 'fist'. + 0x810A4D26, // Small 'fistp'. + 0xA14A4D26, // Small 'fisttp'. + 0x802ACD26, // Small 'fisub'. + 0xA42ACD26, // Small 'fisubr'. + 0x80001186, // Small 'fld'. + 0x800E1186, // Small 'fld1'. + 0x81719186, // Small 'fldcw'. + 0xACE29186, // Small 'fldenv'. + 0x8BD61186, // Small 'fldl2e'. + 0xA9D61186, // Small 'fldl2t'. + 0xBA761186, // Small 'fldlg2'. + 0xBAE61186, // Small 'fldln2'. + 0x80981186, // Small 'fldpi'. + 0x800D1186, // Small 'fldz'. + 0x800655A6, // Small 'fmul'. + 0x810655A6, // Small 'fmulp'. + 0xB0560DC6, // Small 'fnclex'. + 0xA89725C6, // Small 'fninit'. + 0x80083DC6, // Small 'fnop'. + 0x8B60CDC6, // Small 'fnsave'. + 0xAE3A4DC6, // Small 'fnstcw'. + 0x200D572E, // Large 'fnste|nv'. + 0xAF3A4DC6, // Small 'fnstsw'. + 0x9C1A0606, // Small 'fpatan'. + 0x80D2CA06, // Small 'fprem'. + 0xB8D2CA06, // Small 'fprem1'. + 0x80E0D206, // Small 'fptan'. + 0x31224733, // Large 'frnd|int'. + 0xA4FA4E46, // Small 'frstor'. + 0x805B0666, // Small 'fsave'. + 0x8AC08E66, // Small 'fscale'. + 0x80072666, // Small 'fsin'. + 0x22655737, // Large 'fsinc|os'. + 0x81494666, // Small 'fsqrt'. + 0x80005266, // Small 'fst'. + 0x8171D266, // Small 'fstcw'. + 0xACE2D266, // Small 'fstenv'. + 0x80085266, // Small 'fstp'. + 0x8179D266, // Small 'fstsw'. + 0x80015666, // Small 'fsub'. + 0x81015666, // Small 'fsubp'. + 0x81215666, // Small 'fsubr'. + 0xA1215666, // Small 'fsubrp'. + 0x800A4E86, // Small 'ftst'. + 0x80D78EA6, // Small 'fucom'. + 0x92D78EA6, // Small 'fucomi'. + 0x260C573C, // Large 'fucom|ip'. + 0xA0D78EA6, // Small 'fucomp'. + 0x25CE573C, // Large 'fucom|pp'. + 0x814486E6, // Small 'fwait'. + 0x80068706, // Small 'fxam'. + 0x80040F06, // Small 'fxch'. + 0x0000740B, // Large 'fxrstor'. + 0x2030740B, // Large 'fxrstor|64'. + 0x8B60CF06, // Small 'fxsave'. + 0x203065E5, // Large 'fxsave|64'. + 0x510F240B, // Large 'fx|tract'. + 0x818EB326, // Small 'fyl2x'. + 0x206E5741, // Large 'fyl2x|p1'. + 0x8659D0A7, // Small 'getsec'. + 0x1010F001, // Large 'gf2p8affineinvq|b'. + 0x200FB001, // Large 'gf2p8affine|qb'. + 0x43385001, // Large 'gf2p8|mulb'. + 0x89021028, // Small 'haddpd'. + 0xA7021028, // Small 'haddps'. + 0x80005188, // Small 'hlt'. + 0xA8599648, // Small 'hreset'. + 0x89015668, // Small 'hsubpd'. + 0xA7015668, // Small 'hsubps'. + 0x800B2489, // Small 'idiv'. + 0x800655A9, // Small 'imul'. + 0x800001C9, // Small 'in'. + 0x80000DC9, // Small 'inc'. + 0x20A75746, // Large 'incss|pd'. + 0x274B5746, // Large 'incss|pq'. + 0x80004DC9, // Small 'ins'. + 0x207D6184, // Large 'insert|ps'. + 0x100F6184, // Large 'insert|q'. + 0x800051C9, // Small 'int'. + 0x800F51C9, // Small 'int3'. + 0x8007D1C9, // Small 'into'. + 0x800259C9, // Small 'invd'. + 0xA902D9C9, // Small 'invept'. + 0x8F0659C9, // Small 'invlpg'. + 0x336C474D, // Large 'invl|pga'. + 0x23995751, // Large 'invlp|gb'. + 0x24265756, // Large 'invpc|id'. + 0x2426575B, // Large 'invvp|id'. + 0x800A1649, // Small 'iret'. + 0x804A1649, // Small 'iretd'. + 0x811A1649, // Small 'iretq'. + 0x8000002A, // Small 'ja'. + 0x8000142A, // Small 'jae'. + 0x8000004A, // Small 'jb'. + 0x8000144A, // Small 'jbe'. + 0x8000006A, // Small 'jc'. + 0x800000AA, // Small 'je'. + 0x81AC0CAA, // Small 'jecxz'. + 0x800000EA, // Small 'jg'. + 0x800014EA, // Small 'jge'. + 0x8000018A, // Small 'jl'. + 0x8000158A, // Small 'jle'. + 0x800041AA, // Small 'jmp'. + 0x800005CA, // Small 'jna'. + 0x800285CA, // Small 'jnae'. + 0x800009CA, // Small 'jnb'. + 0x800289CA, // Small 'jnbe'. + 0x80000DCA, // Small 'jnc'. + 0x800015CA, // Small 'jne'. + 0x80001DCA, // Small 'jng'. + 0x80029DCA, // Small 'jnge'. + 0x800031CA, // Small 'jnl'. + 0x8002B1CA, // Small 'jnle'. + 0x80003DCA, // Small 'jno'. + 0x800041CA, // Small 'jnp'. + 0x80004DCA, // Small 'jns'. + 0x800069CA, // Small 'jnz'. + 0x800001EA, // Small 'jo'. + 0x8000020A, // Small 'jp'. + 0x8000160A, // Small 'jpe'. + 0x80003E0A, // Small 'jpo'. + 0x8000026A, // Small 'js'. + 0x8000034A, // Small 'jz'. + 0x8022102B, // Small 'kaddb'. + 0x8042102B, // Small 'kaddd'. + 0x8112102B, // Small 'kaddq'. + 0x8172102B, // Small 'kaddw'. + 0x8022382B, // Small 'kandb'. + 0x8042382B, // Small 'kandd'. + 0x84E2382B, // Small 'kandnb'. + 0x88E2382B, // Small 'kandnd'. + 0xA2E2382B, // Small 'kandnq'. + 0xAEE2382B, // Small 'kandnw'. + 0x8112382B, // Small 'kandq'. + 0x8172382B, // Small 'kandw'. + 0x802B3DAB, // Small 'kmovb'. + 0x804B3DAB, // Small 'kmovd'. + 0x811B3DAB, // Small 'kmovq'. + 0x817B3DAB, // Small 'kmovw'. + 0x802A3DCB, // Small 'knotb'. + 0x804A3DCB, // Small 'knotd'. + 0x811A3DCB, // Small 'knotq'. + 0x817A3DCB, // Small 'knotw'. + 0x800149EB, // Small 'korb'. + 0x800249EB, // Small 'kord'. + 0x8008C9EB, // Small 'korq'. + 0x101075EB, // Large 'kortest|b'. + 0x102675EB, // Large 'kortest|d'. + 0x100F75EB, // Large 'kortest|q'. + 0x105F75EB, // Large 'kortest|w'. + 0x800BC9EB, // Small 'korw'. + 0x233A65F2, // Large 'kshift|lb'. + 0x23A165F2, // Large 'kshift|ld'. + 0x228865F2, // Large 'kshift|lq'. + 0x23A465F2, // Large 'kshift|lw'. + 0x25F865F2, // Large 'kshift|rb'. + 0x102675F2, // Large 'kshiftr|d'. + 0x100F75F2, // Large 'kshiftr|q'. + 0x105F75F2, // Large 'kshiftr|w'. + 0x8549968B, // Small 'ktestb'. + 0x8949968B, // Small 'ktestd'. + 0xA349968B, // Small 'ktestq'. + 0xAF49968B, // Small 'ktestw'. + 0x239A65FA, // Large 'kunpck|bw'. + 0x20E565FA, // Large 'kunpck|dq'. + 0x239C65FA, // Large 'kunpck|wd'. + 0x8527BB0B, // Small 'kxnorb'. + 0x8927BB0B, // Small 'kxnord'. + 0xA327BB0B, // Small 'kxnorq'. + 0xAF27BB0B, // Small 'kxnorw'. + 0x80293F0B, // Small 'kxorb'. + 0x80493F0B, // Small 'kxord'. + 0x81193F0B, // Small 'kxorq'. + 0x81793F0B, // Small 'kxorw'. + 0x8003202C, // Small 'lahf'. + 0x8000482C, // Small 'lar'. + 0x80C6046C, // Small 'lcall'. + 0x8158908C, // Small 'lddqu'. + 0x1023664B, // Large 'ldmxcs|r'. + 0x80004C8C, // Small 'lds'. + 0x10018412, // Large 'ldtilecf|g'. + 0x800004AC, // Small 'lea'. + 0x805B04AC, // Small 'leave'. + 0x80004CAC, // Small 'les'. + 0x8A3714CC, // Small 'lfence'. + 0x80004CCC, // Small 'lfs'. + 0x800A10EC, // Small 'lgdt'. + 0x80004CEC, // Small 'lgs'. + 0x800A112C, // Small 'lidt'. + 0x8008354C, // Small 'ljmp'. + 0x800A118C, // Small 'lldt'. + 0x84385D8C, // Small 'llwpcb'. + 0x800BCDAC, // Small 'lmsw'. + 0x800991EC, // Small 'lods'. + 0x80083DEC, // Small 'loop'. + 0x80583DEC, // Small 'loope'. + 0x8AE83DEC, // Small 'loopne'. + 0x8000326C, // Small 'lsl'. + 0x80004E6C, // Small 'lss'. + 0x80004A8C, // Small 'ltr'. + 0xA6E4C2EC, // Small 'lwpins'. + 0x981B42EC, // Small 'lwpval'. + 0x81470F4C, // Small 'lzcnt'. + 0x109D9241, // Large 'maskmovdq|u'. + 0x100F7241, // Large 'maskmov|q'. + 0x8048602D, // Small 'maxpd'. + 0x8138602D, // Small 'maxps'. + 0x8049E02D, // Small 'maxsd'. + 0x8139E02D, // Small 'maxss'. + 0x21925760, // Large 'mcomm|it'. + 0x8A3714CD, // Small 'mfence'. + 0x8048392D, // Small 'minpd'. + 0x8138392D, // Small 'minps'. + 0x8049B92D, // Small 'minsd'. + 0x8139B92D, // Small 'minss'. + 0x00007600, // Large 'monitor'. + 0x102E7600, // Large 'monitor|x'. + 0x800059ED, // Small 'mov'. + 0xA620D9ED, // Small 'movabs'. + 0x8900D9ED, // Small 'movapd'. + 0xA700D9ED, // Small 'movaps'. + 0x805159ED, // Small 'movbe'. + 0x800259ED, // Small 'movd'. + 0x36574245, // Large 'movd|dup'. + 0x1010841A, // Large 'movdir64|b'. + 0x1009641A, // Large 'movdir|i'. + 0x268F5245, // Large 'movdq|2q'. + 0x831259ED, // Small 'movdqa'. + 0xAB1259ED, // Small 'movdqu'. + 0x359A465D, // Large 'movh|lps'. + 0x890459ED, // Small 'movhpd'. + 0xA70459ED, // Small 'movhps'. + 0x207D5662, // Large 'movlh|ps'. + 0x890659ED, // Small 'movlpd'. + 0xA70659ED, // Small 'movlps'. + 0x20A764D0, // Large 'movmsk|pd'. + 0x207D64D0, // Large 'movmsk|ps'. + 0x20E554D7, // Large 'movnt|dq'. + 0x34C354D7, // Large 'movnt|dqa'. + 0x934759ED, // Small 'movnti'. + 0x20A754D7, // Large 'movnt|pd'. + 0x207D54D7, // Large 'movnt|ps'. + 0xA34759ED, // Small 'movntq'. + 0x214454D7, // Large 'movnt|sd'. + 0x201C54D7, // Large 'movnt|ss'. + 0x8008D9ED, // Small 'movq'. + 0x20E55765, // Large 'movq2|dq'. + 0x8009D9ED, // Small 'movs'. + 0x8049D9ED, // Small 'movsd'. + 0x222964DD, // Large 'movshd|up'. + 0x222964E4, // Large 'movsld|up'. + 0x8139D9ED, // Small 'movss'. + 0x8189D9ED, // Small 'movsx'. + 0x8989D9ED, // Small 'movsxd'. + 0x890AD9ED, // Small 'movupd'. + 0xA70AD9ED, // Small 'movups'. + 0x818D59ED, // Small 'movzx'. + 0x239A5668, // Large 'mpsad|bw'. + 0x800032AD, // Small 'mul'. + 0x804832AD, // Small 'mulpd'. + 0x813832AD, // Small 'mulps'. + 0x8049B2AD, // Small 'mulsd'. + 0x8139B2AD, // Small 'mulss'. + 0x800C32AD, // Small 'mulx'. + 0x814486ED, // Small 'mwait'. + 0xB14486ED, // Small 'mwaitx'. + 0x80001CAE, // Small 'neg'. + 0x800041EE, // Small 'nop'. + 0x800051EE, // Small 'not'. + 0x8000024F, // Small 'or'. + 0x8002424F, // Small 'orpd'. + 0x8009C24F, // Small 'orps'. + 0x800052AF, // Small 'out'. + 0x8009D2AF, // Small 'outs'. + 0x80298830, // Small 'pabsb'. + 0x80498830, // Small 'pabsd'. + 0x81798830, // Small 'pabsw'. + 0x000084EB, // Large 'packssdw'. + 0x24F264EB, // Large 'packss|wb'. + 0x24F164F5, // Large 'packus|dw'. + 0x000084F5, // Large 'packuswb'. + 0x80221030, // Small 'paddb'. + 0x80421030, // Small 'paddd'. + 0x81121030, // Small 'paddq'. + 0x85321030, // Small 'paddsb'. + 0xAF321030, // Small 'paddsw'. + 0x25BA5675, // Large 'paddu|sb'. + 0x23835675, // Large 'paddu|sw'. + 0x81721030, // Small 'paddw'. + 0x1023667B, // Large 'palign|r'. + 0x80023830, // Small 'pand'. + 0x80E23830, // Small 'pandn'. + 0x8059D430, // Small 'pause'. + 0x8023D830, // Small 'pavgb'. + 0x25BA576A, // Large 'pavgu|sb'. + 0x8173D830, // Small 'pavgw'. + 0x202164FE, // Large 'pblend|vb'. + 0x105F64FE, // Large 'pblend|w'. + 0x42885345, // Large 'pclmu|lqdq'. + 0x200F534B, // Large 'pcmpe|qb'. + 0x227D534B, // Large 'pcmpe|qd'. + 0x21F6534B, // Large 'pcmpe|qq'. + 0x2559534B, // Large 'pcmpe|qw'. + 0x1009834B, // Large 'pcmpestr|i'. + 0x105C834B, // Large 'pcmpestr|m'. + 0x368142A5, // Large 'pcmp|gtb'. + 0x368442A5, // Large 'pcmp|gtd'. + 0x368742A5, // Large 'pcmp|gtq'. + 0x368A42A5, // Large 'pcmp|gtw'. + 0x10098354, // Large 'pcmpistr|i'. + 0x105C8354, // Large 'pcmpistr|m'. + 0x267E5255, // Large 'pconf|ig'. + 0x80081490, // Small 'pdep'. + 0x800A60B0, // Small 'pext'. + 0x852A60B0, // Small 'pextrb'. + 0x892A60B0, // Small 'pextrd'. + 0xA32A60B0, // Small 'pextrq'. + 0xAF2A60B0, // Small 'pextrw'. + 0x8044F4D0, // Small 'pf2id'. + 0x8174F4D0, // Small 'pf2iw'. + 0x803184D0, // Small 'pfacc'. + 0x804204D0, // Small 'pfadd'. + 0x100F676F, // Large 'pfcmpe|q'. + 0x2018576F, // Large 'pfcmp|ge'. + 0x2681576F, // Large 'pfcmp|gt'. + 0x8180B4D0, // Small 'pfmax'. + 0x80E4B4D0, // Small 'pfmin'. + 0x80CAB4D0, // Small 'pfmul'. + 0x8630B8D0, // Small 'pfnacc'. + 0x24B15775, // Large 'pfpna|cc'. + 0x8101C8D0, // Small 'pfrcp'. + 0x21AD6607, // Large 'pfrcpi|t1'. + 0x22BF6607, // Large 'pfrcpi|t2'. + 0xAD01C8D0, // Small 'pfrcpv'. + 0x21AD660D, // Large 'pfrsqi|t1'. + 0x2188560D, // Large 'pfrsq|rt'. + 0x3613560D, // Large 'pfrsq|rtv'. + 0x802ACCD0, // Small 'pfsub'. + 0xA42ACCD0, // Small 'pfsubr'. + 0x88420510, // Small 'phaddd'. + 0x23835536, // Large 'phadd|sw'. + 0xAE420510, // Small 'phaddw'. + 0x105F925F, // Large 'phminposu|w'. + 0x882ACD10, // Small 'phsubd'. + 0x23835696, // Large 'phsub|sw'. + 0xAE2ACD10, // Small 'phsubw'. + 0x80437530, // Small 'pi2fd'. + 0x81737530, // Small 'pi2fw'. + 0x8529B930, // Small 'pinsrb'. + 0x8929B930, // Small 'pinsrd'. + 0xA329B930, // Small 'pinsrq'. + 0xAF29B930, // Small 'pinsrw'. + 0x43855269, // Large 'pmadd|ubsw'. + 0x239C5269, // Large 'pmadd|wd'. + 0x853C05B0, // Small 'pmaxsb'. + 0x893C05B0, // Small 'pmaxsd'. + 0xAF3C05B0, // Small 'pmaxsw'. + 0x855C05B0, // Small 'pmaxub'. + 0x895C05B0, // Small 'pmaxud'. + 0xAF5C05B0, // Small 'pmaxuw'. + 0x853725B0, // Small 'pminsb'. + 0x893725B0, // Small 'pminsd'. + 0xAF3725B0, // Small 'pminsw'. + 0x855725B0, // Small 'pminub'. + 0x895725B0, // Small 'pminud'. + 0xAF5725B0, // Small 'pminuw'. + 0x10107543, // Large 'pmovmsk|b'. + 0x1026754B, // Large 'pmovsxb|d'. + 0x100F754B, // Large 'pmovsxb|q'. + 0x105F754B, // Large 'pmovsxb|w'. + 0x20E5654B, // Large 'pmovsx|dq'. + 0x239C654B, // Large 'pmovsx|wd'. + 0x253D654B, // Large 'pmovsx|wq'. + 0x1026755C, // Large 'pmovzxb|d'. + 0x100F755C, // Large 'pmovzxb|q'. + 0x105F755C, // Large 'pmovzxb|w'. + 0x20E5655C, // Large 'pmovzx|dq'. + 0x239C655C, // Large 'pmovzx|wd'. + 0x253D655C, // Large 'pmovzx|wq'. + 0xA24655B0, // Small 'pmuldq'. + 0x23836564, // Large 'pmulhr|sw'. + 0x105F6564, // Large 'pmulhr|w'. + 0x24815564, // Large 'pmulh|uw'. + 0xAE8655B0, // Small 'pmulhw'. + 0x88C655B0, // Small 'pmulld'. + 0xAEC655B0, // Small 'pmullw'. + 0x32E540CF, // Large 'pmul|udq'. + 0x800041F0, // Small 'pop'. + 0x8000C1F0, // Small 'popa'. + 0x8040C1F0, // Small 'popad'. + 0xA8E1C1F0, // Small 'popcnt'. + 0x800341F0, // Small 'popf'. + 0x804341F0, // Small 'popfd'. + 0x811341F0, // Small 'popfq'. + 0x800049F0, // Small 'por'. + 0x0000819F, // Large 'prefetch'. + 0x10E4A19F, // Large 'prefetchit|0'. + 0x106BA19F, // Large 'prefetchit|1'. + 0x31A9819F, // Large 'prefetch|nta'. + 0x22BD819F, // Large 'prefetch|t0'. + 0x21AD819F, // Large 'prefetch|t1'. + 0x22BF819F, // Large 'prefetch|t2'. + 0x105F819F, // Large 'prefetch|w'. + 0x31AC819F, // Large 'prefetch|wt1'. + 0xAE220670, // Small 'psadbw'. + 0x846AA270, // Small 'pshufb'. + 0x886AA270, // Small 'pshufd'. + 0x26C3518C, // Large 'pshuf|hw'. + 0x23A4518C, // Large 'pshuf|lw'. + 0xAE6AA270, // Small 'pshufw'. + 0x84E3A670, // Small 'psignb'. + 0x88E3A670, // Small 'psignd'. + 0xAEE3A670, // Small 'psignw'. + 0x80463270, // Small 'pslld'. + 0xA2463270, // Small 'pslldq'. + 0x81163270, // Small 'psllq'. + 0x81763270, // Small 'psllw'. + 0x9130B670, // Small 'psmash'. + 0x8040CA70, // Small 'psrad'. + 0x8170CA70, // Small 'psraw'. + 0x80464A70, // Small 'psrld'. + 0xA2464A70, // Small 'psrldq'. + 0x81164A70, // Small 'psrlq'. + 0x81764A70, // Small 'psrlw'. + 0x80215670, // Small 'psubb'. + 0x80415670, // Small 'psubd'. + 0x81115670, // Small 'psubq'. + 0x85315670, // Small 'psubsb'. + 0xAF315670, // Small 'psubsw'. + 0x25BA56C6, // Large 'psubu|sb'. + 0x238356C6, // Large 'psubu|sw'. + 0x81715670, // Small 'psubw'. + 0x8900DE70, // Small 'pswapd'. + 0x81499690, // Small 'ptest'. + 0x20DF577A, // Large 'ptwri|te'. + 0x239A7280, // Large 'punpckh|bw'. + 0x20E57280, // Large 'punpckh|dq'. + 0x20E58280, // Large 'punpckhq|dq'. + 0x239C7280, // Large 'punpckh|wd'. + 0x339E6280, // Large 'punpck|lbw'. + 0x33A16280, // Large 'punpck|ldq'. + 0x42886280, // Large 'punpck|lqdq'. + 0x33A46280, // Large 'punpck|lwd'. + 0x80044EB0, // Small 'push'. + 0x80144EB0, // Small 'pusha'. + 0x88144EB0, // Small 'pushad'. + 0x80644EB0, // Small 'pushf'. + 0x88644EB0, // Small 'pushfd'. + 0xA2644EB0, // Small 'pushfq'. + 0x20DF7422, // Large 'pvalida|te'. + 0x80093F10, // Small 'pxor'. + 0x80003072, // Small 'rcl'. + 0x81384072, // Small 'rcpps'. + 0x8139C072, // Small 'rcpss'. + 0x80004872, // Small 'rcr'. + 0x34365616, // Large 'rdfsb|ase'. + 0x3436561B, // Large 'rdgsb|ase'. + 0x8129B492, // Small 'rdmsr'. + 0x8044C092, // Small 'rdpid'. + 0xAB25C092, // Small 'rdpkru'. + 0x8036C092, // Small 'rdpmc'. + 0x81594092, // Small 'rdpru'. + 0x88E0C892, // Small 'rdrand'. + 0x8852CC92, // Small 'rdseed'. + 0x8909CC92, // Small 'rdsspd'. + 0xA309CC92, // Small 'rdsspq'. + 0x8039D092, // Small 'rdtsc'. + 0xA039D092, // Small 'rdtscp'. + 0x800050B2, // Small 'ret'. + 0x800350B2, // Small 'retf'. + 0x201F7429, // Large 'rmpadju|st'. + 0x20DF7430, // Large 'rmpupda|te'. + 0x800031F2, // Small 'rol'. + 0x800049F2, // Small 'ror'. + 0x800C49F2, // Small 'rorx'. + 0x20A756D8, // Large 'round|pd'. + 0x207D56D8, // Large 'round|ps'. + 0x000076D8, // Large 'roundsd'. + 0x101466D8, // Large 'rounds|s'. + 0x80003672, // Small 'rsm'. + 0x207D53A8, // Large 'rsqrt|ps'. + 0x201C53A8, // Large 'rsqrt|ss'. + 0x3620540D, // Large 'rstor|ssp'. + 0x80032033, // Small 'sahf'. + 0x80003033, // Small 'sal'. + 0x80004833, // Small 'sar'. + 0x800C4833, // Small 'sarx'. + 0x1004A1AF, // Large 'saveprevss|p'. + 0x80000853, // Small 'sbb'. + 0x80098473, // Small 'scas'. + 0x10D27623, // Large 'seamcal|l'. + 0x207D577F, // Large 'seamo|ps'. + 0x21A35784, // Large 'seamr|et'. + 0x222A662A, // Large 'sendui|pi'. + 0x23CB7437, // Large 'seriali|ze'. + 0x8000D0B3, // Small 'seta'. + 0x8050D0B3, // Small 'setae'. + 0x800150B3, // Small 'setb'. + 0x805150B3, // Small 'setbe'. + 0x8001D0B3, // Small 'setc'. + 0x8002D0B3, // Small 'sete'. + 0x8003D0B3, // Small 'setg'. + 0x8053D0B3, // Small 'setge'. + 0x800650B3, // Small 'setl'. + 0x805650B3, // Small 'setle'. + 0x801750B3, // Small 'setna'. + 0x8A1750B3, // Small 'setnae'. + 0x802750B3, // Small 'setnb'. + 0x8A2750B3, // Small 'setnbe'. + 0x803750B3, // Small 'setnc'. + 0x805750B3, // Small 'setne'. + 0x807750B3, // Small 'setng'. + 0x8A7750B3, // Small 'setnge'. + 0x80C750B3, // Small 'setnl'. + 0x8AC750B3, // Small 'setnle'. + 0x80F750B3, // Small 'setno'. + 0x810750B3, // Small 'setnp'. + 0x813750B3, // Small 'setns'. + 0x81A750B3, // Small 'setnz'. + 0x8007D0B3, // Small 'seto'. + 0x800850B3, // Small 'setp'. + 0x805850B3, // Small 'setpe'. + 0x80F850B3, // Small 'setpo'. + 0x8009D0B3, // Small 'sets'. + 0x10177630, // Large 'setssbs|y'. + 0x800D50B3, // Small 'setz'. + 0x8A3714D3, // Small 'sfence'. + 0x800A10F3, // Small 'sgdt'. + 0x4295443E, // Large 'sha1|msg1'. + 0x4299443E, // Large 'sha1|msg2'. + 0x20DF743E, // Large 'sha1nex|te'. + 0x102F8445, // Large 'sha1rnds|4'. + 0x429561B9, // Large 'sha256|msg1'. + 0x429961B9, // Large 'sha256|msg2'. + 0x207E91B9, // Large 'sha256rnd|s2'. + 0x80003113, // Small 'shl'. + 0x80023113, // Small 'shld'. + 0x800C3113, // Small 'shlx'. + 0x80004913, // Small 'shr'. + 0x80024913, // Small 'shrd'. + 0x800C4913, // Small 'shrx'. + 0x89035513, // Small 'shufpd'. + 0xA7035513, // Small 'shufps'. + 0x800A1133, // Small 'sidt'. + 0xA8972573, // Small 'skinit'. + 0x800A1193, // Small 'sldt'. + 0x84385D93, // Small 'slwpcb'. + 0x800BCDB3, // Small 'smsw'. + 0x890A4A33, // Small 'sqrtpd'. + 0xA70A4A33, // Small 'sqrtps'. + 0x893A4A33, // Small 'sqrtsd'. + 0xA73A4A33, // Small 'sqrtss'. + 0x80018693, // Small 'stac'. + 0x80000E93, // Small 'stc'. + 0x80001293, // Small 'std'. + 0x80049E93, // Small 'stgi'. + 0x80002693, // Small 'sti'. + 0x102366E7, // Large 'stmxcs|r'. + 0x8009BE93, // Small 'stos'. + 0x80004A93, // Small 'str'. + 0x1001844D, // Large 'sttilecf|g'. + 0x8004D693, // Small 'stui'. + 0x80000AB3, // Small 'sub'. + 0x80480AB3, // Small 'subpd'. + 0x81380AB3, // Small 'subps'. + 0x80498AB3, // Small 'subsd'. + 0x81398AB3, // Small 'subss'. + 0xA67806F3, // Small 'swapgs'. + 0x36F34789, // Large 'sysc|all'. + 0x41234637, // Large 'syse|nter'. + 0x2192563B, // Large 'sysex|it'. + 0x3192563B, // Large 'sysex|itq'. + 0xA8594F33, // Small 'sysret'. + 0x2193578D, // Large 'sysre|tq'. + 0x86B9B794, // Small 't1mskc'. + 0x207DA12B, // Large 'tcmmimfp16|ps'. + 0x207DA135, // Large 'tcmmrlfp16|ps'. + 0x98C08C94, // Small 'tdcall'. + 0x207D7455, // Large 'tdpbf16|ps'. + 0x31434455, // Large 'tdpb|ssd'. + 0x32E44455, // Large 'tdpb|sud'. + 0x21445792, // Large 'tdpbu|sd'. + 0x22E55792, // Large 'tdpbu|ud'. + 0x207D745C, // Large 'tdpfp16|ps'. + 0x800A4CB4, // Small 'test'. + 0x935A4CB4, // Small 'testui'. + 0x000091C2, // Large 'tileloadd'. + 0x21AD91C2, // Large 'tileloadd|t1'. + 0x212791CB, // Large 'tilerelea|se'. + 0x102692C1, // Large 'tilestore|d'. + 0x43CB41C2, // Large 'tile|zero'. + 0x21E15797, // Large 'tlbsy|nc'. + 0x8B3A8614, // Small 'tpause'. + 0x81470F54, // Small 'tzcnt'. + 0x80B9B754, // Small 'tzmsk'. + 0x214456EE, // Large 'ucomi|sd'. + 0x201C56EE, // Large 'ucomi|ss'. + 0x80006C95, // Small 'ud0'. + 0x80007095, // Small 'ud1'. + 0x80007495, // Small 'ud2'. + 0x8142C935, // Small 'uiret'. + 0x7600109D, // Large 'u|monitor'. + 0xA890DDB5, // Small 'umwait'. + 0x20A76281, // Large 'unpckh|pd'. + 0x207D6281, // Large 'unpckh|ps'. + 0x35975281, // Large 'unpck|lpd'. + 0x359A5281, // Large 'unpck|lps'. + 0x30F16463, // Large 'v4fmad|dps'. + 0x32D16463, // Large 'v4fmad|dss'. + 0x30F172CA, // Large 'v4fnmad|dps'. + 0x32D172CA, // Large 'v4fnmad|dss'. + 0x89021036, // Small 'vaddpd'. + 0x91021036, // Small 'vaddph'. + 0xA7021036, // Small 'vaddps'. + 0x89321036, // Small 'vaddsd'. + 0x91321036, // Small 'vaddsh'. + 0xA7321036, // Small 'vaddss'. + 0x20A77469, // Large 'vaddsub|pd'. + 0x207D7469, // Large 'vaddsub|ps'. + 0x000071D4, // Large 'vaesdec'. + 0x302881D4, // Large 'vaesdecl|ast'. + 0x000071DC, // Large 'vaesenc'. + 0x302881DC, // Large 'vaesencl|ast'. + 0x2626579C, // Large 'vaesi|mc'. + 0x1020F011, // Large 'vaeskeygenassis|t'. + 0x219D57A1, // Large 'valig|nd'. + 0x271E57A1, // Large 'valig|nq'. + 0x20A757A6, // Large 'vandn|pd'. + 0x207D57A6, // Large 'vandn|ps'. + 0x89023836, // Small 'vandpd'. + 0xA7023836, // Small 'vandps'. + 0x1014D062, // Large 'vbcstnebf162p|s'. + 0x513F7062, // Large 'vbcstne|sh2ps'. + 0x20A77470, // Large 'vblendm|pd'. + 0x207D7470, // Large 'vblendm|ps'. + 0x20A76470, // Large 'vblend|pd'. + 0x207D6470, // Large 'vblend|ps'. + 0x34776470, // Large 'vblend|vpd'. + 0x318B6470, // Large 'vblend|vps'. + 0x306FB021, // Large 'vbroadcastf|128'. + 0x1003E021, // Large 'vbroadcastf32x|2'. + 0x102FE021, // Large 'vbroadcastf32x|4'. + 0x1005E021, // Large 'vbroadcastf32x|8'. + 0x4030B021, // Large 'vbroadcastf|64x2'. + 0x4034B021, // Large 'vbroadcastf|64x4'. + 0x4072A021, // Large 'vbroadcast|i128'. + 0x5038A021, // Large 'vbroadcast|i32x2'. + 0x503DA021, // Large 'vbroadcast|i32x4'. + 0x5042A021, // Large 'vbroadcast|i32x8'. + 0x5047A021, // Large 'vbroadcast|i64x2'. + 0x504CA021, // Large 'vbroadcast|i64x4'. + 0x2144A021, // Large 'vbroadcast|sd'. + 0x201CA021, // Large 'vbroadcast|ss'. + 0x89083476, // Small 'vcmppd'. + 0x91083476, // Small 'vcmpph'. + 0xA7083476, // Small 'vcmpps'. + 0x89383476, // Small 'vcmpsd'. + 0x91383476, // Small 'vcmpsh'. + 0xA7383476, // Small 'vcmpss'. + 0x214457AB, // Large 'vcomi|sd'. + 0x20D557AB, // Large 'vcomi|sh'. + 0x201C57AB, // Large 'vcomi|ss'. + 0x20A791E4, // Large 'vcompress|pd'. + 0x207D91E4, // Large 'vcompress|ps'. + 0x20A7747A, // Large 'vcvtdq2|pd'. + 0x20A2747A, // Large 'vcvtdq2|ph'. + 0x207D747A, // Large 'vcvtdq2|ps'. + 0x4069A076, // Large 'vcvtne2ps2|bf16'. + 0x307CB080, // Large 'vcvtneebf16|2ps'. + 0x51467080, // Large 'vcvtnee|ph2ps'. + 0x307CB08B, // Large 'vcvtneobf16|2ps'. + 0x5146708B, // Large 'vcvtneo|ph2ps'. + 0x406990FC, // Large 'vcvtneps2|bf16'. + 0x20E572D4, // Large 'vcvtpd2|dq'. + 0x20A272D4, // Large 'vcvtpd2|ph'. + 0x207D72D4, // Large 'vcvtpd2|ps'. + 0x21F672D4, // Large 'vcvtpd2|qq'. + 0x20E582D4, // Large 'vcvtpd2u|dq'. + 0x21F682D4, // Large 'vcvtpd2u|qq'. + 0x20E572DC, // Large 'vcvtph2|dq'. + 0x102682DC, // Large 'vcvtph2p|d'. + 0x000092DC, // Large 'vcvtph2ps'. + 0x102E92DC, // Large 'vcvtph2ps|x'. + 0x21F672DC, // Large 'vcvtph2|qq'. + 0x32E572DC, // Large 'vcvtph2|udq'. + 0x31F572DC, // Large 'vcvtph2|uqq'. + 0x248172DC, // Large 'vcvtph2|uw'. + 0x105F72DC, // Large 'vcvtph2|w'. + 0x20E572E8, // Large 'vcvtps2|dq'. + 0x102682E8, // Large 'vcvtps2p|d'. + 0x000092E8, // Large 'vcvtps2ph'. + 0x102E92E8, // Large 'vcvtps2ph|x'. + 0x21F672E8, // Large 'vcvtps2|qq'. + 0x32E572E8, // Large 'vcvtps2|udq'. + 0x31F572E8, // Large 'vcvtps2|uqq'. + 0x20A77483, // Large 'vcvtqq2|pd'. + 0x20A27483, // Large 'vcvtqq2|ph'. + 0x207D7483, // Large 'vcvtqq2|ps'. + 0x20D572F1, // Large 'vcvtsd2|sh'. + 0x201D72F1, // Large 'vcvtsd2|si'. + 0x201C72F1, // Large 'vcvtsd2|ss'. + 0x201D82F1, // Large 'vcvtsd2u|si'. + 0x214472F9, // Large 'vcvtsh2|sd'. + 0x201D72F9, // Large 'vcvtsh2|si'. + 0x201C72F9, // Large 'vcvtsh2|ss'. + 0x201D82F9, // Large 'vcvtsh2u|si'. + 0x2144748A, // Large 'vcvtsi2|sd'. + 0x20D5748A, // Large 'vcvtsi2|sh'. + 0x201C748A, // Large 'vcvtsi2|ss'. + 0x21447301, // Large 'vcvtss2|sd'. + 0x20D57301, // Large 'vcvtss2|sh'. + 0x201D7301, // Large 'vcvtss2|si'. + 0x201D8301, // Large 'vcvtss2u|si'. + 0x20E581ED, // Large 'vcvttpd2|dq'. + 0x21F681ED, // Large 'vcvttpd2|qq'. + 0x20E591ED, // Large 'vcvttpd2u|dq'. + 0x21F691ED, // Large 'vcvttpd2u|qq'. + 0x20E581F8, // Large 'vcvttph2|dq'. + 0x21F681F8, // Large 'vcvttph2|qq'. + 0x20E591F8, // Large 'vcvttph2u|dq'. + 0x21F691F8, // Large 'vcvttph2u|qq'. + 0x105F91F8, // Large 'vcvttph2u|w'. + 0x105F81F8, // Large 'vcvttph2|w'. + 0x20E58201, // Large 'vcvttps2|dq'. + 0x21F68201, // Large 'vcvttps2|qq'. + 0x20E59201, // Large 'vcvttps2u|dq'. + 0x21F69201, // Large 'vcvttps2u|qq'. + 0x201D820A, // Large 'vcvttsd2|si'. + 0x201D920A, // Large 'vcvttsd2u|si'. + 0x201D8213, // Large 'vcvttsh2|si'. + 0x201D9213, // Large 'vcvttsh2u|si'. + 0x201D821C, // Large 'vcvttss2|si'. + 0x201D921C, // Large 'vcvttss2u|si'. + 0x20A78309, // Large 'vcvtudq2|pd'. + 0x20A28309, // Large 'vcvtudq2|ph'. + 0x207D8309, // Large 'vcvtudq2|ps'. + 0x20A78311, // Large 'vcvtuqq2|pd'. + 0x20A28311, // Large 'vcvtuqq2|ph'. + 0x207D8311, // Large 'vcvtuqq2|ps'. + 0x21448319, // Large 'vcvtusi2|sd'. + 0x20D58319, // Large 'vcvtusi2|sh'. + 0x201C8319, // Large 'vcvtusi2|ss'. + 0x30A16491, // Large 'vcvtuw|2ph'. + 0x30A15640, // Large 'vcvtw|2ph'. + 0x239A7497, // Large 'vdbpsad|bw'. + 0x890B2496, // Small 'vdivpd'. + 0x910B2496, // Small 'vdivph'. + 0xA70B2496, // Small 'vdivps'. + 0x893B2496, // Small 'vdivsd'. + 0x913B2496, // Small 'vdivsh'. + 0xA73B2496, // Small 'vdivss'. + 0x207D749E, // Large 'vdpbf16|ps'. + 0x80484096, // Small 'vdppd'. + 0x81384096, // Small 'vdpps'. + 0x800948B6, // Small 'verr'. + 0x800BC8B6, // Small 'verw'. + 0x352544A5, // Large 'vexp|2pd'. + 0x307C44A5, // Large 'vexp|2ps'. + 0x30ED64A5, // Large 'vexpan|dpd'. + 0x30F164A5, // Large 'vexpan|dps'. + 0x306F910C, // Large 'vextractf|128'. + 0x602A7105, // Large 'vextrac|tf32x4'. + 0x4043910C, // Large 'vextractf|32x8'. + 0x4030910C, // Large 'vextractf|64x2'. + 0x4034910C, // Large 'vextractf|64x4'. + 0x4072810C, // Large 'vextract|i128'. + 0x503D810C, // Large 'vextract|i32x4'. + 0x5042810C, // Large 'vextract|i32x8'. + 0x5047810C, // Large 'vextract|i64x2'. + 0x504C810C, // Large 'vextract|i64x4'. + 0x207D810C, // Large 'vextract|ps'. + 0x20A28321, // Large 'vfcmaddc|ph'. + 0x20D58321, // Large 'vfcmaddc|sh'. + 0x20A274AB, // Large 'vfcmulc|ph'. + 0x20D574AB, // Large 'vfcmulc|sh'. + 0x20A79225, // Large 'vfixupimm|pd'. + 0x207D9225, // Large 'vfixupimm|ps'. + 0x21449225, // Large 'vfixupimm|sd'. + 0x201C9225, // Large 'vfixupimm|ss'. + 0x20A7922E, // Large 'vfmadd132|pd'. + 0x20A2922E, // Large 'vfmadd132|ph'. + 0x207D922E, // Large 'vfmadd132|ps'. + 0x2144922E, // Large 'vfmadd132|sd'. + 0x20D5922E, // Large 'vfmadd132|sh'. + 0x201C922E, // Large 'vfmadd132|ss'. + 0x50A46096, // Large 'vfmadd|213pd'. + 0x50A96096, // Large 'vfmadd|213ph'. + 0x50AE6096, // Large 'vfmadd|213ps'. + 0x51556096, // Large 'vfmadd|213sd'. + 0x515A6096, // Large 'vfmadd|213sh'. + 0x515F6096, // Large 'vfmadd|213ss'. + 0x50B36096, // Large 'vfmadd|231pd'. + 0x50B86096, // Large 'vfmadd|231ph'. + 0x50BD6096, // Large 'vfmadd|231ps'. + 0x51646096, // Large 'vfmadd|231sd'. + 0x51696096, // Large 'vfmadd|231sh'. + 0x516E6096, // Large 'vfmadd|231ss'. + 0x34B26096, // Large 'vfmadd|cph'. + 0x34B56096, // Large 'vfmadd|csh'. + 0x20A76096, // Large 'vfmadd|pd'. + 0x207D6096, // Large 'vfmadd|ps'. + 0x10267096, // Large 'vfmadds|d'. + 0x10147096, // Large 'vfmadds|s'. + 0x1026D096, // Large 'vfmaddsub132p|d'. + 0x10A3D096, // Large 'vfmaddsub132p|h'. + 0x1014D096, // Large 'vfmaddsub132p|s'. + 0x50A49096, // Large 'vfmaddsub|213pd'. + 0x50A99096, // Large 'vfmaddsub|213ph'. + 0x50AE9096, // Large 'vfmaddsub|213ps'. + 0x50B39096, // Large 'vfmaddsub|231pd'. + 0x50B89096, // Large 'vfmaddsub|231ph'. + 0x50BD9096, // Large 'vfmaddsub|231ps'. + 0x20A79096, // Large 'vfmaddsub|pd'. + 0x207D9096, // Large 'vfmaddsub|ps'. + 0x20A79237, // Large 'vfmsub132|pd'. + 0x20A29237, // Large 'vfmsub132|ph'. + 0x207D9237, // Large 'vfmsub132|ps'. + 0x21449237, // Large 'vfmsub132|sd'. + 0x20D59237, // Large 'vfmsub132|sh'. + 0x201C9237, // Large 'vfmsub132|ss'. + 0x50A460C2, // Large 'vfmsub|213pd'. + 0x50A960C2, // Large 'vfmsub|213ph'. + 0x50AE60C2, // Large 'vfmsub|213ps'. + 0x515560C2, // Large 'vfmsub|213sd'. + 0x515A60C2, // Large 'vfmsub|213sh'. + 0x515F60C2, // Large 'vfmsub|213ss'. + 0x50B360C2, // Large 'vfmsub|231pd'. + 0x50B860C2, // Large 'vfmsub|231ph'. + 0x50BD60C2, // Large 'vfmsub|231ps'. + 0x516460C2, // Large 'vfmsub|231sd'. + 0x516960C2, // Large 'vfmsub|231sh'. + 0x516E60C2, // Large 'vfmsub|231ss'. + 0x20A7C0C2, // Large 'vfmsubadd132|pd'. + 0x20A2C0C2, // Large 'vfmsubadd132|ph'. + 0x207DC0C2, // Large 'vfmsubadd132|ps'. + 0x50A490C2, // Large 'vfmsubadd|213pd'. + 0x50A990C2, // Large 'vfmsubadd|213ph'. + 0x50AE90C2, // Large 'vfmsubadd|213ps'. + 0x50B390C2, // Large 'vfmsubadd|231pd'. + 0x50B890C2, // Large 'vfmsubadd|231ph'. + 0x50BD90C2, // Large 'vfmsubadd|231ps'. + 0x20A790C2, // Large 'vfmsubadd|pd'. + 0x207D90C2, // Large 'vfmsubadd|ps'. + 0x20A760C2, // Large 'vfmsub|pd'. + 0x207D60C2, // Large 'vfmsub|ps'. + 0x214460C2, // Large 'vfmsub|sd'. + 0x201C60C2, // Large 'vfmsub|ss'. + 0x34B25645, // Large 'vfmul|cph'. + 0x34B55645, // Large 'vfmul|csh'. + 0x20A7A14B, // Large 'vfnmadd132|pd'. + 0x20A2A14B, // Large 'vfnmadd132|ph'. + 0x207DA14B, // Large 'vfnmadd132|ps'. + 0x2144A14B, // Large 'vfnmadd132|sd'. + 0x20D5A14B, // Large 'vfnmadd132|sh'. + 0x201CA14B, // Large 'vfnmadd132|ss'. + 0x50A4714B, // Large 'vfnmadd|213pd'. + 0x50A9714B, // Large 'vfnmadd|213ph'. + 0x50AE714B, // Large 'vfnmadd|213ps'. + 0x5155714B, // Large 'vfnmadd|213sd'. + 0x515A714B, // Large 'vfnmadd|213sh'. + 0x515F714B, // Large 'vfnmadd|213ss'. + 0x50B3714B, // Large 'vfnmadd|231pd'. + 0x50B8714B, // Large 'vfnmadd|231ph'. + 0x50BD714B, // Large 'vfnmadd|231ps'. + 0x5164714B, // Large 'vfnmadd|231sd'. + 0x5169714B, // Large 'vfnmadd|231sh'. + 0x516E714B, // Large 'vfnmadd|231ss'. + 0x20A7714B, // Large 'vfnmadd|pd'. + 0x207D714B, // Large 'vfnmadd|ps'. + 0x2144714B, // Large 'vfnmadd|sd'. + 0x201C714B, // Large 'vfnmadd|ss'. + 0x20A7A173, // Large 'vfnmsub132|pd'. + 0x20A2A173, // Large 'vfnmsub132|ph'. + 0x207DA173, // Large 'vfnmsub132|ps'. + 0x2144A173, // Large 'vfnmsub132|sd'. + 0x20D5A173, // Large 'vfnmsub132|sh'. + 0x201CA173, // Large 'vfnmsub132|ss'. + 0x50A47173, // Large 'vfnmsub|213pd'. + 0x50A97173, // Large 'vfnmsub|213ph'. + 0x50AE7173, // Large 'vfnmsub|213ps'. + 0x51557173, // Large 'vfnmsub|213sd'. + 0x515A7173, // Large 'vfnmsub|213sh'. + 0x515F7173, // Large 'vfnmsub|213ss'. + 0x50B37173, // Large 'vfnmsub|231pd'. + 0x50B87173, // Large 'vfnmsub|231ph'. + 0x50BD7173, // Large 'vfnmsub|231ps'. + 0x51647173, // Large 'vfnmsub|231sd'. + 0x51697173, // Large 'vfnmsub|231sh'. + 0x516E7173, // Large 'vfnmsub|231ss'. + 0x20A77173, // Large 'vfnmsub|pd'. + 0x207D7173, // Large 'vfnmsub|ps'. + 0x21447173, // Large 'vfnmsub|sd'. + 0x201C7173, // Large 'vfnmsub|ss'. + 0x20A78329, // Large 'vfpclass|pd'. + 0x20A28329, // Large 'vfpclass|ph'. + 0x207D8329, // Large 'vfpclass|ps'. + 0x21448329, // Large 'vfpclass|sd'. + 0x20D58329, // Large 'vfpclass|sh'. + 0x201C8329, // Large 'vfpclass|ss'. + 0x20A757B0, // Large 'vfrcz|pd'. + 0x207D57B0, // Large 'vfrcz|ps'. + 0x214457B0, // Large 'vfrcz|sd'. + 0x201C57B0, // Large 'vfrcz|ss'. + 0x30ED7115, // Large 'vgather|dpd'. + 0x30F17115, // Large 'vgather|dps'. + 0x30EDA115, // Large 'vgatherpf0|dpd'. + 0x30F1A115, // Large 'vgatherpf0|dps'. + 0x30E6A115, // Large 'vgatherpf0|qpd'. + 0x30E9A115, // Large 'vgatherpf0|qps'. + 0x40EC9115, // Large 'vgatherpf|1dpd'. + 0x40F09115, // Large 'vgatherpf|1dps'. + 0x40F49115, // Large 'vgatherpf|1qpd'. + 0x40F89115, // Large 'vgatherpf|1qps'. + 0x30E67115, // Large 'vgather|qpd'. + 0x30E97115, // Large 'vgather|qps'. + 0x20A774B8, // Large 'vgetexp|pd'. + 0x20A274B8, // Large 'vgetexp|ph'. + 0x207D74B8, // Large 'vgetexp|ps'. + 0x214474B8, // Large 'vgetexp|sd'. + 0x20D574B8, // Large 'vgetexp|sh'. + 0x201C74B8, // Large 'vgetexp|ss'. + 0x31F17331, // Large 'vgetman|tpd'. + 0x31FC7331, // Large 'vgetman|tph'. + 0x32057331, // Large 'vgetman|tps'. + 0x320E7331, // Large 'vgetman|tsd'. + 0x32177331, // Large 'vgetman|tsh'. + 0x32207331, // Large 'vgetman|tss'. + 0x200FF000, // Large 'vgf2p8affineinv|qb'. + 0x200FC000, // Large 'vgf2p8affine|qb'. + 0x43386000, // Large 'vgf2p8|mulb'. + 0x30ED47B5, // Large 'vhad|dpd'. + 0x30F147B5, // Large 'vhad|dps'. + 0x20A757B9, // Large 'vhsub|pd'. + 0x207D57B9, // Large 'vhsub|ps'. + 0x306F8183, // Large 'vinsertf|128'. + 0x602A617D, // Large 'vinser|tf32x4'. + 0x40438183, // Large 'vinsertf|32x8'. + 0x40308183, // Large 'vinsertf|64x2'. + 0x40348183, // Large 'vinsertf|64x4'. + 0x40727183, // Large 'vinsert|i128'. + 0x503D7183, // Large 'vinsert|i32x4'. + 0x50427183, // Large 'vinsert|i32x8'. + 0x50477183, // Large 'vinsert|i64x2'. + 0x504C7183, // Large 'vinsert|i64x4'. + 0x207D7183, // Large 'vinsert|ps'. + 0xAB121196, // Small 'vlddqu'. + 0x1023764A, // Large 'vldmxcs|r'. + 0x109DA240, // Large 'vmaskmovdq|u'. + 0x20A78240, // Large 'vmaskmov|pd'. + 0x207D8240, // Large 'vmaskmov|ps'. + 0x890C05B6, // Small 'vmaxpd'. + 0x910C05B6, // Small 'vmaxph'. + 0xA70C05B6, // Small 'vmaxps'. + 0x893C05B6, // Small 'vmaxsd'. + 0x913C05B6, // Small 'vmaxsh'. + 0xA73C05B6, // Small 'vmaxss'. + 0x98C08DB6, // Small 'vmcall'. + 0x242857BE, // Large 'vmcle|ar'. + 0x86EA99B6, // Small 'vmfunc'. + 0x219257C3, // Large 'vmgex|it'. + 0x890725B6, // Small 'vminpd'. + 0x910725B6, // Small 'vminph'. + 0xA70725B6, // Small 'vminps'. + 0x893725B6, // Small 'vminsd'. + 0x913725B6, // Small 'vminsh'. + 0xA73725B6, // Small 'vminss'. + 0x21A56651, // Large 'vmlaun|ch'. + 0x8817B1B6, // Small 'vmload'. + 0x36F347C8, // Large 'vmmc|all'. + 0x20A757CC, // Large 'vmova|pd'. + 0x207D57CC, // Large 'vmova|ps'. + 0x804B3DB6, // Small 'vmovd'. + 0x365754BF, // Large 'vmovd|dup'. + 0x000074BF, // Large 'vmovdqa'. + 0x202C74BF, // Large 'vmovdqa|32'. + 0x203074BF, // Large 'vmovdqa|64'. + 0x109D64BF, // Large 'vmovdq|u'. + 0x34C664BF, // Large 'vmovdq|u16'. + 0x34C964BF, // Large 'vmovdq|u32'. + 0x34CC64BF, // Large 'vmovdq|u64'. + 0x265A64BF, // Large 'vmovdq|u8'. + 0x359A565C, // Large 'vmovh|lps'. + 0x20A7565C, // Large 'vmovh|pd'. + 0x207D565C, // Large 'vmovh|ps'. + 0x207D6661, // Large 'vmovlh|ps'. + 0x20A75661, // Large 'vmovl|pd'. + 0x207D5661, // Large 'vmovl|ps'. + 0x20A774CF, // Large 'vmovmsk|pd'. + 0x207D74CF, // Large 'vmovmsk|ps'. + 0x20E564D6, // Large 'vmovnt|dq'. + 0x34C364D6, // Large 'vmovnt|dqa'. + 0x20A764D6, // Large 'vmovnt|pd'. + 0x207D64D6, // Large 'vmovnt|ps'. + 0x811B3DB6, // Small 'vmovq'. + 0x893B3DB6, // Small 'vmovsd'. + 0x913B3DB6, // Small 'vmovsh'. + 0x222974DC, // Large 'vmovshd|up'. + 0x222974E3, // Large 'vmovsld|up'. + 0xA73B3DB6, // Small 'vmovss'. + 0x343344BF, // Large 'vmov|upd'. + 0x207D57D1, // Large 'vmovu|ps'. + 0x817B3DB6, // Small 'vmovw'. + 0x239A6667, // Large 'vmpsad|bw'. + 0x341147D6, // Large 'vmpt|rld'. + 0x340D47D6, // Large 'vmpt|rst'. + 0x8812C9B6, // Small 'vmread'. + 0x100B766D, // Large 'vmresum|e'. + 0x80EAC9B6, // Small 'vmrun'. + 0x8B60CDB6, // Small 'vmsave'. + 0x890655B6, // Small 'vmulpd'. + 0x910655B6, // Small 'vmulph'. + 0xA70655B6, // Small 'vmulps'. + 0x893655B6, // Small 'vmulsd'. + 0x913655B6, // Small 'vmulsh'. + 0xA73655B6, // Small 'vmulss'. + 0x20DF57DA, // Large 'vmwri|te'. + 0x8C67E1B6, // Small 'vmxoff'. + 0x80E7E1B6, // Small 'vmxon'. + 0x804849F6, // Small 'vorpd'. + 0x813849F6, // Small 'vorps'. + 0x1026C11F, // Large 'vp2intersect|d'. + 0x100FC11F, // Large 'vp2intersect|q'. + 0x1026833C, // Large 'vp4dpwss|d'. + 0x209B833C, // Large 'vp4dpwss|ds'. + 0x85310616, // Small 'vpabsb'. + 0x89310616, // Small 'vpabsd'. + 0xA3310616, // Small 'vpabsq'. + 0xAF310616, // Small 'vpabsw'. + 0x105F84EA, // Large 'vpackssd|w'. + 0x24F274EA, // Large 'vpackss|wb'. + 0x34F064F4, // Large 'vpacku|sdw'. + 0x34FA64F4, // Large 'vpacku|swb'. + 0x84420616, // Small 'vpaddb'. + 0x88420616, // Small 'vpaddd'. + 0xA2420616, // Small 'vpaddq'. + 0x25BA5674, // Large 'vpadd|sb'. + 0x23835674, // Large 'vpadd|sw'. + 0x25BA6674, // Large 'vpaddu|sb'. + 0x23836674, // Large 'vpaddu|sw'. + 0xAE420616, // Small 'vpaddw'. + 0x1023767A, // Large 'vpalign|r'. + 0x80470616, // Small 'vpand'. + 0x88470616, // Small 'vpandd'. + 0x9C470616, // Small 'vpandn'. + 0x219D57DF, // Large 'vpand|nd'. + 0x271E57DF, // Large 'vpand|nq'. + 0xA2470616, // Small 'vpandq'. + 0x847B0616, // Small 'vpavgb'. + 0xAE7B0616, // Small 'vpavgw'. + 0x102674FD, // Large 'vpblend|d'. + 0x205C74FD, // Large 'vpblend|mb'. + 0x250474FD, // Large 'vpblend|md'. + 0x100F84FD, // Large 'vpblendm|q'. + 0x105F84FD, // Large 'vpblendm|w'. + 0x202174FD, // Large 'vpblend|vb'. + 0x105F74FD, // Large 'vpblend|w'. + 0x1010B051, // Large 'vpbroadcast|b'. + 0x1026B051, // Large 'vpbroadcast|d'. + 0x100FE051, // Large 'vpbroadcastmb2|q'. + 0x305FC051, // Large 'vpbroadcastm|w2d'. + 0x100FB051, // Large 'vpbroadcast|q'. + 0x105FB051, // Large 'vpbroadcast|w'. + 0x42886344, // Large 'vpclmu|lqdq'. + 0xACF68E16, // Small 'vpcmov'. + 0x85068E16, // Small 'vpcmpb'. + 0x89068E16, // Small 'vpcmpd'. + 0x200F634A, // Large 'vpcmpe|qb'. + 0x227D634A, // Large 'vpcmpe|qd'. + 0x21F6634A, // Large 'vpcmpe|qq'. + 0x2559634A, // Large 'vpcmpe|qw'. + 0x1009934A, // Large 'vpcmpestr|i'. + 0x105C934A, // Large 'vpcmpestr|m'. + 0x3681534A, // Large 'vpcmp|gtb'. + 0x3684534A, // Large 'vpcmp|gtd'. + 0x3687534A, // Large 'vpcmp|gtq'. + 0x368A534A, // Large 'vpcmp|gtw'. + 0x10099353, // Large 'vpcmpistr|i'. + 0x105C9353, // Large 'vpcmpistr|m'. + 0xA3068E16, // Small 'vpcmpq'. + 0x209D534A, // Large 'vpcmp|ub'. + 0x22E5534A, // Large 'vpcmp|ud'. + 0x21F5534A, // Large 'vpcmp|uq'. + 0x2481534A, // Large 'vpcmp|uw'. + 0xAF068E16, // Small 'vpcmpw'. + 0x84D78E16, // Small 'vpcomb'. + 0x88D78E16, // Small 'vpcomd'. + 0x1010A24A, // Large 'vpcompress|b'. + 0x1026A24A, // Large 'vpcompress|d'. + 0x100FA24A, // Large 'vpcompress|q'. + 0x105FA24A, // Large 'vpcompress|w'. + 0xA2D78E16, // Small 'vpcomq'. + 0x209D524A, // Large 'vpcom|ub'. + 0x22E5524A, // Large 'vpcom|ud'. + 0x21F5524A, // Large 'vpcom|uq'. + 0x2481524A, // Large 'vpcom|uw'. + 0xAED78E16, // Small 'vpcomw'. + 0x1026A254, // Large 'vpconflict|d'. + 0x100FA254, // Large 'vpconflict|q'. + 0x10267506, // Large 'vpdpbss|d'. + 0x209B7506, // Large 'vpdpbss|ds'. + 0x22E56506, // Large 'vpdpbs|ud'. + 0x350D6506, // Large 'vpdpbs|uds'. + 0x10267510, // Large 'vpdpbus|d'. + 0x209B7510, // Large 'vpdpbus|ds'. + 0x22E56510, // Large 'vpdpbu|ud'. + 0x350D6510, // Large 'vpdpbu|uds'. + 0x10267517, // Large 'vpdpwss|d'. + 0x209B7517, // Large 'vpdpwss|ds'. + 0x22E56517, // Large 'vpdpws|ud'. + 0x350D6517, // Large 'vpdpws|uds'. + 0x1026751E, // Large 'vpdpwus|d'. + 0x209B751E, // Large 'vpdpwus|ds'. + 0x22E5651E, // Large 'vpdpwu|ud'. + 0x350D651E, // Large 'vpdpwu|uds'. + 0x306F735C, // Large 'vperm2f|128'. + 0x4072635C, // Large 'vperm2|i128'. + 0x84D91616, // Small 'vpermb'. + 0x88D91616, // Small 'vpermd'. + 0x268D6363, // Large 'vpermi|2b'. + 0x20606363, // Large 'vpermi|2d'. + 0x35256363, // Large 'vpermi|2pd'. + 0x307C6363, // Large 'vpermi|2ps'. + 0x268F6363, // Large 'vpermi|2q'. + 0x205E6363, // Large 'vpermi|2w'. + 0x20A78363, // Large 'vpermil2|pd'. + 0x207D8363, // Large 'vpermil2|ps'. + 0x20A77363, // Large 'vpermil|pd'. + 0x207D7363, // Large 'vpermil|ps'. + 0x20A7535C, // Large 'vperm|pd'. + 0x207D535C, // Large 'vperm|ps'. + 0xA2D91616, // Small 'vpermq'. + 0x268D6528, // Large 'vpermt|2b'. + 0x20606528, // Large 'vpermt|2d'. + 0x35256528, // Large 'vpermt|2pd'. + 0x307C6528, // Large 'vpermt|2ps'. + 0x268F6528, // Large 'vpermt|2q'. + 0x205E6528, // Large 'vpermt|2w'. + 0xAED91616, // Small 'vpermw'. + 0x2498752E, // Large 'vpexpan|db'. + 0x209A752E, // Large 'vpexpan|dd'. + 0x20E5752E, // Large 'vpexpan|dq'. + 0x24F1752E, // Large 'vpexpan|dw'. + 0x35F7452E, // Large 'vpex|trb'. + 0x261657E4, // Large 'vpext|rd'. + 0x227C57E4, // Large 'vpext|rq'. + 0x27E957E4, // Large 'vpext|rw'. + 0x209A836B, // Large 'vpgather|dd'. + 0x20E5836B, // Large 'vpgather|dq'. + 0x227D836B, // Large 'vpgather|qd'. + 0x21F6836B, // Large 'vpgather|qq'. + 0x26916535, // Large 'vphadd|bd'. + 0x26936535, // Large 'vphadd|bq'. + 0x239A6535, // Large 'vphadd|bw'. + 0x10266535, // Large 'vphadd|d'. + 0x20E56535, // Large 'vphadd|dq'. + 0x23836535, // Large 'vphadd|sw'. + 0x10268535, // Large 'vphaddub|d'. + 0x100F8535, // Large 'vphaddub|q'. + 0x105F8535, // Large 'vphaddub|w'. + 0x20E57535, // Large 'vphaddu|dq'. + 0x239C7535, // Large 'vphaddu|wd'. + 0x253D7535, // Large 'vphaddu|wq'. + 0x105F6535, // Large 'vphadd|w'. + 0x239C6535, // Large 'vphadd|wd'. + 0x253D6535, // Large 'vphadd|wq'. + 0x105FA25E, // Large 'vphminposu|w'. + 0x239A6695, // Large 'vphsub|bw'. + 0x10266695, // Large 'vphsub|d'. + 0x20E56695, // Large 'vphsub|dq'. + 0x23836695, // Large 'vphsub|sw'. + 0x105F6695, // Large 'vphsub|w'. + 0x239C6695, // Large 'vphsub|wd'. + 0x25F857EB, // Large 'vpins|rb'. + 0x261657EB, // Large 'vpins|rd'. + 0x227C57EB, // Large 'vpins|rq'. + 0x27E957EB, // Large 'vpins|rw'. + 0x2455669B, // Large 'vplzcn|td'. + 0x2193669B, // Large 'vplzcn|tq'. + 0x209A6373, // Large 'vpmacs|dd'. + 0x353F6373, // Large 'vpmacs|dqh'. + 0x33A26373, // Large 'vpmacs|dql'. + 0x10268373, // Large 'vpmacssd|d'. + 0x10A39373, // Large 'vpmacssdq|h'. + 0x10D29373, // Large 'vpmacssdq|l'. + 0x239C7373, // Large 'vpmacss|wd'. + 0x239B7373, // Large 'vpmacss|ww'. + 0x239C6373, // Large 'vpmacs|wd'. + 0x239B6373, // Large 'vpmacs|ww'. + 0x1026937C, // Large 'vpmadcssw|d'. + 0x239C737C, // Large 'vpmadcs|wd'. + 0x21F59268, // Large 'vpmadd52h|uq'. + 0x32718268, // Large 'vpmadd52|luq'. + 0x43856268, // Large 'vpmadd|ubsw'. + 0x239C6268, // Large 'vpmadd|wd'. + 0x62434268, // Large 'vpma|skmovd'. + 0x200E8389, // Large 'vpmaskmo|vq'. + 0x25BA57F0, // Large 'vpmax|sb'. + 0x214457F0, // Large 'vpmax|sd'. + 0x23A957F0, // Large 'vpmax|sq'. + 0x238357F0, // Large 'vpmax|sw'. + 0x209D57F0, // Large 'vpmax|ub'. + 0x22E557F0, // Large 'vpmax|ud'. + 0x21F557F0, // Large 'vpmax|uq'. + 0x248157F0, // Large 'vpmax|uw'. + 0x25BA57F5, // Large 'vpmin|sb'. + 0x214457F5, // Large 'vpmin|sd'. + 0x23A957F5, // Large 'vpmin|sq'. + 0x238357F5, // Large 'vpmin|sw'. + 0x209D57F5, // Large 'vpmin|ub'. + 0x22E557F5, // Large 'vpmin|ud'. + 0x21F557F5, // Large 'vpmin|uq'. + 0x248157F5, // Large 'vpmin|uw'. + 0x36A15542, // Large 'vpmov|b2m'. + 0x36A45542, // Large 'vpmov|d2m'. + 0x24985542, // Large 'vpmov|db'. + 0x24F15542, // Large 'vpmov|dw'. + 0x268D6542, // Large 'vpmovm|2b'. + 0x20606542, // Large 'vpmovm|2d'. + 0x268F6542, // Large 'vpmovm|2q'. + 0x205E6542, // Large 'vpmovm|2w'. + 0x10108542, // Large 'vpmovmsk|b'. + 0x36A75542, // Large 'vpmov|q2m'. + 0x200F5542, // Large 'vpmov|qb'. + 0x227D5542, // Large 'vpmov|qd'. + 0x25595542, // Large 'vpmov|qw'. + 0x2498654A, // Large 'vpmovs|db'. + 0x24F1654A, // Large 'vpmovs|dw'. + 0x200F654A, // Large 'vpmovs|qb'. + 0x227D654A, // Large 'vpmovs|qd'. + 0x2559654A, // Large 'vpmovs|qw'. + 0x24F2654A, // Large 'vpmovs|wb'. + 0x1026854A, // Large 'vpmovsxb|d'. + 0x100F854A, // Large 'vpmovsxb|q'. + 0x105F854A, // Large 'vpmovsxb|w'. + 0x20E5754A, // Large 'vpmovsx|dq'. + 0x239C754A, // Large 'vpmovsx|wd'. + 0x253D754A, // Large 'vpmovsx|wq'. + 0x24987552, // Large 'vpmovus|db'. + 0x24F17552, // Large 'vpmovus|dw'. + 0x200F7552, // Large 'vpmovus|qb'. + 0x227D7552, // Large 'vpmovus|qd'. + 0x25597552, // Large 'vpmovus|qw'. + 0x24F27552, // Large 'vpmovus|wb'. + 0x36AA5542, // Large 'vpmov|w2m'. + 0x24F25542, // Large 'vpmov|wb'. + 0x1026855B, // Large 'vpmovzxb|d'. + 0x100F855B, // Large 'vpmovzxb|q'. + 0x105F855B, // Large 'vpmovzxb|w'. + 0x20E5755B, // Large 'vpmovzx|dq'. + 0x239C755B, // Large 'vpmovzx|wd'. + 0x253D755B, // Large 'vpmovzx|wq'. + 0x20E550CE, // Large 'vpmul|dq'. + 0x23837563, // Large 'vpmulhr|sw'. + 0x24816563, // Large 'vpmulh|uw'. + 0x105F6563, // Large 'vpmulh|w'. + 0x23A150CE, // Large 'vpmul|ld'. + 0x228850CE, // Large 'vpmul|lq'. + 0x23A450CE, // Large 'vpmul|lw'. + 0x200FC0CE, // Large 'vpmultishift|qb'. + 0x32E550CE, // Large 'vpmul|udq'. + 0x268266AD, // Large 'vpopcn|tb'. + 0x245566AD, // Large 'vpopcn|td'. + 0x219366AD, // Large 'vpopcn|tq'. + 0x264366AD, // Large 'vpopcn|tw'. + 0x80093E16, // Small 'vpor'. + 0x80493E16, // Small 'vpord'. + 0x81193E16, // Small 'vporq'. + 0x9B22C216, // Small 'vpperm'. + 0x88C7CA16, // Small 'vprold'. + 0xA2C7CA16, // Small 'vprolq'. + 0x224757FA, // Large 'vprol|vd'. + 0x200E57FA, // Large 'vprol|vq'. + 0x8927CA16, // Small 'vprord'. + 0xA327CA16, // Small 'vprorq'. + 0x224757FF, // Large 'vpror|vd'. + 0x200E57FF, // Large 'vpror|vq'. + 0x8547CA16, // Small 'vprotb'. + 0x8947CA16, // Small 'vprotd'. + 0xA347CA16, // Small 'vprotq'. + 0xAF47CA16, // Small 'vprotw'. + 0x239A5804, // Large 'vpsad|bw'. + 0x209A9274, // Large 'vpscatter|dd'. + 0x20E59274, // Large 'vpscatter|dq'. + 0x227D9274, // Large 'vpscatter|qd'. + 0x100FA274, // Large 'vpscatterq|q'. + 0x84144E16, // Small 'vpshab'. + 0x88144E16, // Small 'vpshad'. + 0xA2144E16, // Small 'vpshaq'. + 0xAE144E16, // Small 'vpshaw'. + 0x84C44E16, // Small 'vpshlb'. + 0x88C44E16, // Small 'vpshld'. + 0x102666B3, // Large 'vpshld|d'. + 0x100F66B3, // Large 'vpshld|q'. + 0x349D56B3, // Large 'vpshl|dvd'. + 0x36B856B3, // Large 'vpshl|dvq'. + 0x105F76B3, // Large 'vpshldv|w'. + 0x105F66B3, // Large 'vpshld|w'. + 0xA2C44E16, // Small 'vpshlq'. + 0xAEC44E16, // Small 'vpshlw'. + 0x102666BB, // Large 'vpshrd|d'. + 0x100F66BB, // Large 'vpshrd|q'. + 0x349D56BB, // Large 'vpshr|dvd'. + 0x36B856BB, // Large 'vpshr|dvq'. + 0x36C056BB, // Large 'vpshr|dvw'. + 0x105F66BB, // Large 'vpshrd|w'. + 0x0000718B, // Large 'vpshufb'. + 0x205CA18B, // Large 'vpshufbitq|mb'. + 0x1026618B, // Large 'vpshuf|d'. + 0x26C3618B, // Large 'vpshuf|hw'. + 0x23A4618B, // Large 'vpshuf|lw'. + 0x22A95809, // Large 'vpsig|nb'. + 0x219D5809, // Large 'vpsig|nd'. + 0x26FB5809, // Large 'vpsig|nw'. + 0x88C64E16, // Small 'vpslld'. + 0x33A1480E, // Large 'vpsl|ldq'. + 0xA2C64E16, // Small 'vpsllq'. + 0x22475812, // Large 'vpsll|vd'. + 0x200E5812, // Large 'vpsll|vq'. + 0x26C15812, // Large 'vpsll|vw'. + 0xAEC64E16, // Small 'vpsllw'. + 0x88194E16, // Small 'vpsrad'. + 0xA2194E16, // Small 'vpsraq'. + 0x22475817, // Large 'vpsra|vd'. + 0x200E5817, // Large 'vpsra|vq'. + 0x26C15817, // Large 'vpsra|vw'. + 0xAE194E16, // Small 'vpsraw'. + 0x88C94E16, // Small 'vpsrld'. + 0x33A14817, // Large 'vpsr|ldq'. + 0xA2C94E16, // Small 'vpsrlq'. + 0x2247581C, // Large 'vpsrl|vd'. + 0x200E581C, // Large 'vpsrl|vq'. + 0x26C1581C, // Large 'vpsrl|vw'. + 0xAEC94E16, // Small 'vpsrlw'. + 0x842ACE16, // Small 'vpsubb'. + 0x882ACE16, // Small 'vpsubd'. + 0xA22ACE16, // Small 'vpsubq'. + 0x25BA56C5, // Large 'vpsub|sb'. + 0x238356C5, // Large 'vpsub|sw'. + 0x25BA66C5, // Large 'vpsubu|sb'. + 0x238366C5, // Large 'vpsubu|sw'. + 0xAE2ACE16, // Small 'vpsubw'. + 0x10269391, // Large 'vpternlog|d'. + 0x100F9391, // Large 'vpternlog|q'. + 0xA932D216, // Small 'vptest'. + 0x205C656A, // Large 'vptest|mb'. + 0x2504656A, // Large 'vptest|md'. + 0x2571656A, // Large 'vptest|mq'. + 0x26A9656A, // Large 'vptest|mw'. + 0x205C756A, // Large 'vptestn|mb'. + 0x2504756A, // Large 'vptestn|md'. + 0x2571756A, // Large 'vptestn|mq'. + 0x105F856A, // Large 'vptestnm|w'. + 0x239A827F, // Large 'vpunpckh|bw'. + 0x20E5827F, // Large 'vpunpckh|dq'. + 0x20E5927F, // Large 'vpunpckhq|dq'. + 0x239C827F, // Large 'vpunpckh|wd'. + 0x339E727F, // Large 'vpunpck|lbw'. + 0x33A1727F, // Large 'vpunpck|ldq'. + 0x4288727F, // Large 'vpunpck|lqdq'. + 0x33A4727F, // Large 'vpunpck|lwd'. + 0x8127E216, // Small 'vpxor'. + 0x8927E216, // Small 'vpxord'. + 0xA327E216, // Small 'vpxorq'. + 0x20A766CB, // Large 'vrange|pd'. + 0x207D66CB, // Large 'vrange|ps'. + 0x214466CB, // Large 'vrange|sd'. + 0x201C66CB, // Large 'vrange|ss'. + 0x20A766D1, // Large 'vrcp14|pd'. + 0x207D66D1, // Large 'vrcp14|ps'. + 0x214466D1, // Large 'vrcp14|sd'. + 0x201C66D1, // Large 'vrcp14|ss'. + 0x43AF46D1, // Large 'vrcp|28pd'. + 0x43B346D1, // Large 'vrcp|28ps'. + 0x43B746D1, // Large 'vrcp|28sd'. + 0x43BB46D1, // Large 'vrcp|28ss'. + 0x91080E56, // Small 'vrcpph'. + 0xA7080E56, // Small 'vrcpps'. + 0x91380E56, // Small 'vrcpsh'. + 0xA7380E56, // Small 'vrcpss'. + 0x20A77573, // Large 'vreduce|pd'. + 0x20A27573, // Large 'vreduce|ph'. + 0x207D7573, // Large 'vreduce|ps'. + 0x21447573, // Large 'vreduce|sd'. + 0x20D57573, // Large 'vreduce|sh'. + 0x201C7573, // Large 'vreduce|ss'. + 0x20A7928C, // Large 'vrndscale|pd'. + 0x20A2928C, // Large 'vrndscale|ph'. + 0x207D928C, // Large 'vrndscale|ps'. + 0x2144928C, // Large 'vrndscale|sd'. + 0x20D5928C, // Large 'vrndscale|sh'. + 0x201C928C, // Large 'vrndscale|ss'. + 0x30ED56D7, // Large 'vroun|dpd'. + 0x30F156D7, // Large 'vroun|dps'. + 0x36DC56D7, // Large 'vroun|dsd'. + 0x101476D7, // Large 'vrounds|s'. + 0x20A783A7, // Large 'vrsqrt14|pd'. + 0x207D83A7, // Large 'vrsqrt14|ps'. + 0x214483A7, // Large 'vrsqrt14|sd'. + 0x201C83A7, // Large 'vrsqrt14|ss'. + 0x43AF63A7, // Large 'vrsqrt|28pd'. + 0x43B363A7, // Large 'vrsqrt|28ps'. + 0x43B763A7, // Large 'vrsqrt|28sd'. + 0x43BB63A7, // Large 'vrsqrt|28ss'. + 0x20A263A7, // Large 'vrsqrt|ph'. + 0x207D63A7, // Large 'vrsqrt|ps'. + 0x20D563A7, // Large 'vrsqrt|sh'. + 0x201C63A7, // Large 'vrsqrt|ss'. + 0x20A7757A, // Large 'vscalef|pd'. + 0x20A2757A, // Large 'vscalef|ph'. + 0x207D757A, // Large 'vscalef|ps'. + 0x2144757A, // Large 'vscalef|sd'. + 0x20D5757A, // Large 'vscalef|sh'. + 0x201C757A, // Large 'vscalef|ss'. + 0x30ED80DA, // Large 'vscatter|dpd'. + 0x30F180DA, // Large 'vscatter|dps'. + 0x20A7C0DA, // Large 'vscatterpf0d|pd'. + 0x207DC0DA, // Large 'vscatterpf0d|ps'. + 0x30E6B0DA, // Large 'vscatterpf0|qpd'. + 0x30E9B0DA, // Large 'vscatterpf0|qps'. + 0x40ECA0DA, // Large 'vscatterpf|1dpd'. + 0x40F0A0DA, // Large 'vscatterpf|1dps'. + 0x40F4A0DA, // Large 'vscatterpf|1qpd'. + 0x40F8A0DA, // Large 'vscatterpf|1qps'. + 0x30E680DA, // Large 'vscatter|qpd'. + 0x30E980DA, // Large 'vscatter|qps'. + 0x42957195, // Large 'vsha512|msg1'. + 0x42997195, // Large 'vsha512|msg2'. + 0x207EA195, // Large 'vsha512rnd|s2'. + 0x502B53BF, // Large 'vshuf|f32x4'. + 0x403063C4, // Large 'vshuff|64x2'. + 0x503D53BF, // Large 'vshuf|i32x4'. + 0x504753BF, // Large 'vshuf|i64x2'. + 0x20A753BF, // Large 'vshuf|pd'. + 0x207D53BF, // Large 'vshuf|ps'. + 0x42954581, // Large 'vsm3|msg1'. + 0x42994581, // Large 'vsm3|msg2'. + 0x207E7581, // Large 'vsm3rnd|s2'. + 0x102F76DF, // Large 'vsm4key|4'. + 0x102F8588, // Large 'vsm4rnds|4'. + 0x31F14821, // Large 'vsqr|tpd'. + 0x31FC4821, // Large 'vsqr|tph'. + 0x32054821, // Large 'vsqr|tps'. + 0x320E4821, // Large 'vsqr|tsd'. + 0x32174821, // Large 'vsqr|tsh'. + 0x32204821, // Large 'vsqr|tss'. + 0x102376E6, // Large 'vstmxcs|r'. + 0x89015676, // Small 'vsubpd'. + 0x91015676, // Small 'vsubph'. + 0xA7015676, // Small 'vsubps'. + 0x89315676, // Small 'vsubsd'. + 0x91315676, // Small 'vsubsh'. + 0xA7315676, // Small 'vsubss'. + 0x31F14825, // Large 'vtes|tpd'. + 0x32054825, // Large 'vtes|tps'. + 0x214466ED, // Large 'vucomi|sd'. + 0x20D566ED, // Large 'vucomi|sh'. + 0x201C66ED, // Large 'vucomi|ss'. + 0x20A77590, // Large 'vunpckh|pd'. + 0x207D7590, // Large 'vunpckh|ps'. + 0x35976590, // Large 'vunpck|lpd'. + 0x359A6590, // Large 'vunpck|lps'. + 0x89093F16, // Small 'vxorpd'. + 0xA7093F16, // Small 'vxorps'. + 0x36F353CA, // Large 'vzero|all'. + 0x335D73CA, // Large 'vzeroup|per'. + 0x89672457, // Small 'wbinvd'. + 0x224766F6, // Large 'wbnoin|vd'. + 0x343656FC, // Large 'wrfsb|ase'. + 0x34365701, // Large 'wrgsb|ase'. + 0x8129B657, // Small 'wrmsr'. + 0x8049CE57, // Small 'wrssd'. + 0x8119CE57, // Small 'wrssq'. + 0x8939D657, // Small 'wrussd'. + 0xA339D657, // Small 'wrussq'. + 0xA9278838, // Small 'xabort'. + 0x80021038, // Small 'xadd'. + 0x9C939458, // Small 'xbegin'. + 0x8003A078, // Small 'xchg'. + 0x800238B8, // Small 'xend'. + 0xAC2A14F8, // Small 'xgetbv'. + 0x802A0598, // Small 'xlatb'. + 0x800049F8, // Small 'xor'. + 0x804849F8, // Small 'xorpd'. + 0x813849F8, // Small 'xorps'. + 0x1015859D, // Large 'xresldtr|k'. + 0xA4FA4E58, // Small 'xrstor'. + 0x2030640C, // Large 'xrstor|64'. + 0x1014640C, // Large 'xrstor|s'. + 0x35A5640C, // Large 'xrstor|s64'. + 0x805B0678, // Small 'xsave'. + 0x203053D1, // Large 'xsave|64'. + 0x865B0678, // Small 'xsavec'. + 0x370653D1, // Large 'xsave|c64'. + 0x000083D1, // Large 'xsaveopt'. + 0x203083D1, // Large 'xsaveopt|64'. + 0xA65B0678, // Small 'xsaves'. + 0x35A553D1, // Large 'xsave|s64'. + 0xAC2A1678, // Small 'xsetbv'. + 0x101585A8, // Large 'xsusldtr|k'. + 0x81499698 // Small 'xtest'. }; // ---------------------------------------------------------------------------- // ${NameData:End} @@ -3054,515 +4730,575 @@ const InstDB::InstSignature InstDB::_instSignatureTable[] = { ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8, i8|u8} ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16} ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32} - ROW(2, 0, 1, 0, 15 , 16 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, i32} + ROW(2, 0, 1, 0, 15 , 16 , 0 , 0 , 0 , 0 ), // {r64|m64, i32} ROW(2, 0, 1, 0, 8 , 17 , 0 , 0 , 0 , 0 ), // {r64, i64|u64|m64|mem|sreg|creg|dreg} ROW(2, 1, 1, 0, 2 , 18 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem} ROW(2, 1, 1, 0, 4 , 19 , 0 , 0 , 0 , 0 ), // {r16, m16|mem|sreg} ROW(2, 1, 1, 0, 6 , 20 , 0 , 0 , 0 , 0 ), // {r32, m32|mem|sreg} ROW(2, 1, 1, 0, 21 , 22 , 0 , 0 , 0 , 0 ), // {m16|mem, sreg} + ROW(2, 1, 1, 0, 21 , 22 , 0 , 0 , 0 , 0 ), // {m16|mem, sreg} + ROW(2, 0, 1, 0, 21 , 22 , 0 , 0 , 0 , 0 ), // {m16|mem, sreg} ROW(2, 1, 1, 0, 22 , 21 , 0 , 0 , 0 , 0 ), // {sreg, m16|mem} + ROW(2, 1, 1, 0, 22 , 21 , 0 , 0 , 0 , 0 ), // {sreg, m16|mem} + ROW(2, 0, 1, 0, 22 , 21 , 0 , 0 , 0 , 0 ), // {sreg, m16|mem} ROW(2, 1, 0, 0, 6 , 23 , 0 , 0 , 0 , 0 ), // {r32, creg|dreg} ROW(2, 1, 0, 0, 23 , 6 , 0 , 0 , 0 , 0 ), // {creg|dreg, r32} - ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // #16 {r8lo|r8hi|m8, i8|u8} + ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // #20 {r8lo|r8hi|m8, i8|u8} ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16} ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32} - ROW(2, 0, 1, 0, 15 , 24 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, i32|r64} - ROW(2, 1, 1, 0, 25 , 26 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32|r64|m64|mem, i8} - ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8|mem, r8lo|r8hi} + ROW(2, 0, 1, 0, 15 , 24 , 0 , 0 , 0 , 0 ), // {r64|m64, i32|i8} + ROW(2, 1, 1, 0, 25 , 26 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32, i8} + ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #25 {r8lo|r8hi|m8|mem, r8lo|r8hi} ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16} - ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // #23 {r32|m32|mem, r32} + ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // #27 {r32|m32|mem, r32} + ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // #28 {r64|m64|mem, r64} ROW(2, 1, 1, 0, 2 , 18 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem} ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem} - ROW(2, 1, 1, 0, 6 , 29 , 0 , 0 , 0 , 0 ), // {r32, m32|mem} - ROW(2, 0, 1, 0, 8 , 30 , 0 , 0 , 0 , 0 ), // {r64, m64|mem} - ROW(2, 1, 1, 0, 31 , 10 , 0 , 0 , 0 , 0 ), // #28 {r8lo|r8hi|m8|r16|m16|r32|m32|r64|m64|mem, i8|u8} + ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem} + ROW(2, 0, 1, 0, 8 , 31 , 0 , 0 , 0 , 0 ), // {r64, m64|mem} + ROW(2, 1, 1, 0, 32 , 10 , 0 , 0 , 0 , 0 ), // #33 {r8lo|r8hi|m8|r16|m16|r32|m32, i8|u8} ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16} ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32} - ROW(2, 0, 1, 0, 8 , 32 , 0 , 0 , 0 , 0 ), // {r64, u32|i32|r64|m64|mem} - ROW(2, 0, 1, 0, 30 , 24 , 0 , 0 , 0 , 0 ), // {m64|mem, i32|r64} + ROW(2, 0, 1, 0, 8 , 33 , 0 , 0 , 0 , 0 ), // {r64, u32|i32|i8|u8|r64|m64|mem} + ROW(2, 0, 1, 0, 34 , 35 , 0 , 0 , 0 , 0 ), // {m64, i32|i8|u8} ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8|mem, r8lo|r8hi} ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16} ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32} + ROW(2, 0, 1, 0, 31 , 8 , 0 , 0 , 0 , 0 ), // {m64|mem, r64} ROW(2, 1, 1, 0, 2 , 18 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem} ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem} - ROW(2, 1, 1, 0, 6 , 29 , 0 , 0 , 0 , 0 ), // {r32, m32|mem} - ROW(2, 1, 1, 1, 33 , 1 , 0 , 0 , 0 , 0 ), // #39 {, r8lo|r8hi|m8|mem} - ROW(3, 1, 1, 2, 34 , 33 , 27 , 0 , 0 , 0 ), // {, , r16|m16|mem} - ROW(3, 1, 1, 2, 35 , 36 , 28 , 0 , 0 , 0 ), // {, , r32|m32|mem} - ROW(3, 0, 1, 2, 37 , 38 , 15 , 0 , 0 , 0 ), // {, , r64|m64|mem} - ROW(2, 1, 1, 0, 4 , 39 , 0 , 0 , 0 , 0 ), // {r16, r16|m16|mem|i8|i16} - ROW(2, 1, 1, 0, 6 , 40 , 0 , 0 , 0 , 0 ), // {r32, r32|m32|mem|i8|i32} - ROW(2, 0, 1, 0, 8 , 41 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem|i8|i32} + ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem} + ROW(2, 1, 1, 1, 36 , 1 , 0 , 0 , 0 , 0 ), // #45 {, r8lo|r8hi|m8|mem} + ROW(3, 1, 1, 2, 37 , 36 , 27 , 0 , 0 , 0 ), // {, , r16|m16|mem} + ROW(3, 1, 1, 2, 38 , 39 , 28 , 0 , 0 , 0 ), // {, , r32|m32|mem} + ROW(3, 0, 1, 2, 40 , 41 , 29 , 0 , 0 , 0 ), // {, , r64|m64|mem} + ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #49 {r16, r16|m16|mem} + ROW(2, 1, 1, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #50 {r32, r32|m32|mem} + ROW(2, 0, 1, 0, 8 , 29 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem} ROW(3, 1, 1, 0, 4 , 27 , 42 , 0 , 0 , 0 ), // {r16, r16|m16|mem, i8|i16|u16} ROW(3, 1, 1, 0, 6 , 28 , 43 , 0 , 0 , 0 ), // {r32, r32|m32|mem, i8|i32|u32} - ROW(3, 0, 1, 0, 8 , 15 , 44 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|i32} - ROW(2, 0, 1, 0, 8 , 45 , 0 , 0 , 0 , 0 ), // #49 {r64, i64|u64} - ROW(2, 0, 1, 0, 46 , 18 , 0 , 0 , 0 , 0 ), // {al, m8|mem} - ROW(2, 0, 1, 0, 47 , 21 , 0 , 0 , 0 , 0 ), // {ax, m16|mem} - ROW(2, 0, 1, 0, 48 , 29 , 0 , 0 , 0 , 0 ), // {eax, m32|mem} - ROW(2, 0, 1, 0, 49 , 30 , 0 , 0 , 0 , 0 ), // {rax, m64|mem} - ROW(2, 0, 1, 0, 18 , 46 , 0 , 0 , 0 , 0 ), // {m8|mem, al} - ROW(2, 0, 1, 0, 21 , 47 , 0 , 0 , 0 , 0 ), // {m16|mem, ax} - ROW(2, 0, 1, 0, 29 , 48 , 0 , 0 , 0 , 0 ), // {m32|mem, eax} - ROW(2, 0, 1, 0, 30 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, rax} - ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #58 {r8lo|r8hi|m8|mem, r8lo|r8hi} - ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16} - ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32} - ROW(2, 0, 1, 0, 15 , 8 , 0 , 0 , 0 , 0 ), // #61 {r64|m64|mem, r64} - ROW(2, 1, 1, 0, 2 , 18 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem} - ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem} - ROW(2, 1, 1, 0, 6 , 29 , 0 , 0 , 0 , 0 ), // {r32, m32|mem} - ROW(2, 0, 1, 0, 8 , 30 , 0 , 0 , 0 , 0 ), // {r64, m64|mem} - ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // #66 {r8lo|r8hi|m8, i8|u8} + ROW(3, 0, 1, 0, 8 , 29 , 24 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|i32} + ROW(2, 0, 1, 0, 8 , 44 , 0 , 0 , 0 , 0 ), // #55 {r64, i64|u64} + ROW(2, 1, 1, 0, 45 , 18 , 0 , 0 , 0 , 0 ), // {al, m8|mem} + ROW(2, 1, 1, 0, 46 , 21 , 0 , 0 , 0 , 0 ), // {ax, m16|mem} + ROW(2, 1, 1, 0, 47 , 30 , 0 , 0 , 0 , 0 ), // {eax, m32|mem} + ROW(2, 0, 1, 0, 48 , 31 , 0 , 0 , 0 , 0 ), // {rax, m64|mem} + ROW(2, 1, 1, 0, 18 , 45 , 0 , 0 , 0 , 0 ), // {m8|mem, al} + ROW(2, 1, 1, 0, 21 , 46 , 0 , 0 , 0 , 0 ), // {m16|mem, ax} + ROW(2, 1, 1, 0, 30 , 47 , 0 , 0 , 0 , 0 ), // {m32|mem, eax} + ROW(2, 0, 1, 0, 31 , 48 , 0 , 0 , 0 , 0 ), // {m64|mem, rax} + ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // #64 {r8lo|r8hi|m8, i8|u8} ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16} ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32} - ROW(2, 0, 1, 0, 15 , 24 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, i32|r64} + ROW(2, 0, 1, 0, 15 , 16 , 0 , 0 , 0 , 0 ), // {r64|m64, i32} ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8|mem, r8lo|r8hi} ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16} ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32} - ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // #73 {r16, m16|mem} - ROW(2, 1, 1, 0, 6 , 29 , 0 , 0 , 0 , 0 ), // {r32, m32|mem} - ROW(2, 0, 1, 0, 8 , 30 , 0 , 0 , 0 , 0 ), // {r64, m64|mem} + ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64} + ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // #72 {xmm, xmm|m128|mem} + ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // #73 {m128|mem, xmm} + ROW(2, 1, 1, 0, 52 , 53 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem} + ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm} + ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm} + ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm} + ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // #78 {zmm, zmm|m512|mem} + ROW(2, 1, 1, 0, 57 , 55 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm} + ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // #80 {m64|mem, xmm} + ROW(2, 1, 1, 0, 49 , 31 , 0 , 0 , 0 , 0 ), // {xmm, m64|mem} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // #82 {xmm, xmm, xmm} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm} + ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm} + ROW(2, 1, 1, 0, 49 , 31 , 0 , 0 , 0 , 0 ), // {xmm, m64|mem} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm} + ROW(2, 1, 1, 0, 30 , 49 , 0 , 0 , 0 , 0 ), // #88 {m32|mem, xmm} + ROW(2, 1, 1, 0, 49 , 30 , 0 , 0 , 0 , 0 ), // {xmm, m32|mem} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm} + ROW(2, 1, 1, 0, 30 , 49 , 0 , 0 , 0 , 0 ), // {m32|mem, xmm} + ROW(2, 1, 1, 0, 49 , 30 , 0 , 0 , 0 , 0 ), // {xmm, m32|mem} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm} + ROW(3, 1, 1, 0, 49 , 49 , 58 , 0 , 0 , 0 ), // #96 {xmm, xmm, xmm|m128|mem|i8|u8} + ROW(3, 1, 1, 0, 49 , 51 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8} + ROW(3, 1, 1, 0, 52 , 52 , 59 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem|i8|u8} + ROW(3, 1, 1, 0, 52 , 54 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8} + ROW(3, 1, 1, 0, 55 , 55 , 60 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8} + ROW(3, 1, 1, 0, 49 , 51 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8} + ROW(3, 1, 1, 0, 52 , 54 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8} + ROW(3, 1, 1, 0, 55 , 57 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8} + ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // #104 {r16, m16|mem} + ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem} + ROW(2, 0, 1, 0, 8 , 31 , 0 , 0 , 0 , 0 ), // {r64, m64|mem} ROW(2, 1, 1, 0, 21 , 4 , 0 , 0 , 0 , 0 ), // {m16|mem, r16} - ROW(2, 1, 1, 0, 29 , 6 , 0 , 0 , 0 , 0 ), // #77 {m32|mem, r32} - ROW(2, 0, 1, 0, 30 , 8 , 0 , 0 , 0 , 0 ), // {m64|mem, r64} - ROW(2, 1, 1, 0, 50 , 51 , 0 , 0 , 0 , 0 ), // #79 {xmm, xmm|m128|mem} - ROW(2, 1, 1, 0, 52 , 50 , 0 , 0 , 0 , 0 ), // #80 {m128|mem, xmm} - ROW(2, 1, 1, 0, 53 , 54 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem} - ROW(2, 1, 1, 0, 55 , 53 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm} - ROW(2, 1, 1, 0, 56 , 57 , 0 , 0 , 0 , 0 ), // #83 {zmm, zmm|m512|mem} - ROW(2, 1, 1, 0, 58 , 56 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm} - ROW(3, 1, 1, 0, 50 , 50 , 59 , 0 , 0 , 0 ), // #85 {xmm, xmm, xmm|m128|mem|i8|u8} - ROW(3, 1, 1, 0, 50 , 52 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8} - ROW(3, 1, 1, 0, 53 , 53 , 60 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem|i8|u8} - ROW(3, 1, 1, 0, 53 , 55 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8} - ROW(3, 1, 1, 0, 56 , 56 , 61 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8} - ROW(3, 1, 1, 0, 56 , 58 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8} - ROW(3, 1, 1, 0, 50 , 50 , 59 , 0 , 0 , 0 ), // #91 {xmm, xmm, i8|u8|xmm|m128|mem} - ROW(3, 1, 1, 0, 53 , 53 , 59 , 0 , 0 , 0 ), // {ymm, ymm, i8|u8|xmm|m128|mem} - ROW(3, 1, 1, 0, 50 , 52 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8} - ROW(3, 1, 1, 0, 53 , 55 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8} - ROW(3, 1, 1, 0, 56 , 56 , 59 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8} - ROW(3, 1, 1, 0, 56 , 58 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8} - ROW(3, 1, 1, 0, 50 , 50 , 59 , 0 , 0 , 0 ), // #97 {xmm, xmm, xmm|m128|mem|i8|u8} - ROW(3, 1, 1, 0, 50 , 52 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8} - ROW(3, 1, 1, 0, 53 , 53 , 59 , 0 , 0 , 0 ), // {ymm, ymm, xmm|m128|mem|i8|u8} - ROW(3, 1, 1, 0, 53 , 55 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8} - ROW(3, 1, 1, 0, 56 , 56 , 59 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8} - ROW(3, 1, 1, 0, 56 , 58 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8} - ROW(2, 1, 1, 0, 62 , 63 , 0 , 0 , 0 , 0 ), // #103 {mm, mm|m64|mem|r64} - ROW(2, 1, 1, 0, 15 , 64 , 0 , 0 , 0 , 0 ), // {m64|mem|r64, mm|xmm} - ROW(2, 0, 1, 0, 50 , 15 , 0 , 0 , 0 , 0 ), // {xmm, r64|m64|mem} - ROW(2, 1, 1, 0, 50 , 65 , 0 , 0 , 0 , 0 ), // #106 {xmm, xmm|m64|mem} - ROW(2, 1, 1, 0, 30 , 50 , 0 , 0 , 0 , 0 ), // #107 {m64|mem, xmm} - ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #108 {} - ROW(1, 1, 1, 0, 66 , 0 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32|r64|m64} + ROW(2, 1, 1, 0, 30 , 6 , 0 , 0 , 0 , 0 ), // #108 {m32|mem, r32} + ROW(2, 0, 1, 0, 31 , 8 , 0 , 0 , 0 , 0 ), // {m64|mem, r64} + ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #110 {} + ROW(1, 1, 1, 0, 25 , 0 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32} + ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64} ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16} ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32} - ROW(2, 1, 1, 0, 15 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64} - ROW(3, 1, 1, 0, 50 , 67 , 50 , 0 , 0 , 0 ), // #113 {xmm, vm32x, xmm} - ROW(3, 1, 1, 0, 53 , 68 , 53 , 0 , 0 , 0 ), // {ymm, vm32y, ymm} - ROW(2, 1, 1, 0, 50 , 67 , 0 , 0 , 0 , 0 ), // {xmm, vm32x} - ROW(2, 1, 1, 0, 53 , 68 , 0 , 0 , 0 , 0 ), // {ymm, vm32y} - ROW(2, 1, 1, 0, 56 , 69 , 0 , 0 , 0 , 0 ), // {zmm, vm32z} - ROW(3, 1, 1, 0, 50 , 70 , 50 , 0 , 0 , 0 ), // #118 {xmm, vm64x, xmm} - ROW(3, 1, 1, 0, 53 , 71 , 53 , 0 , 0 , 0 ), // {ymm, vm64y, ymm} - ROW(2, 1, 1, 0, 50 , 70 , 0 , 0 , 0 , 0 ), // {xmm, vm64x} - ROW(2, 1, 1, 0, 53 , 71 , 0 , 0 , 0 , 0 ), // {ymm, vm64y} - ROW(2, 1, 1, 0, 56 , 72 , 0 , 0 , 0 , 0 ), // {zmm, vm64z} - ROW(2, 1, 1, 0, 25 , 10 , 0 , 0 , 0 , 0 ), // #123 {r16|m16|r32|m32|r64|m64|mem, i8|u8} + ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64} + ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // #116 {xmm, xmm|m128|mem} + ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm} + ROW(2, 1, 1, 0, 52 , 53 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem} + ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm} + ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem} + ROW(2, 1, 1, 0, 57 , 55 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm} + ROW(3, 1, 1, 0, 49 , 49 , 58 , 0 , 0 , 0 ), // #122 {xmm, xmm, i8|u8|xmm|m128|mem} + ROW(3, 1, 1, 0, 52 , 52 , 58 , 0 , 0 , 0 ), // {ymm, ymm, i8|u8|xmm|m128|mem} + ROW(3, 1, 1, 0, 49 , 51 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8} + ROW(3, 1, 1, 0, 52 , 54 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8} + ROW(3, 1, 1, 0, 55 , 55 , 58 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8} + ROW(3, 1, 1, 0, 55 , 57 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8} + ROW(3, 1, 1, 0, 49 , 49 , 58 , 0 , 0 , 0 ), // #128 {xmm, xmm, xmm|m128|mem|i8|u8} + ROW(3, 1, 1, 0, 49 , 51 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8} + ROW(3, 1, 1, 0, 52 , 52 , 58 , 0 , 0 , 0 ), // {ymm, ymm, xmm|m128|mem|i8|u8} + ROW(3, 1, 1, 0, 52 , 54 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8} + ROW(3, 1, 1, 0, 55 , 55 , 58 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8} + ROW(3, 1, 1, 0, 55 , 57 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8} + ROW(2, 1, 1, 0, 25 , 10 , 0 , 0 , 0 , 0 ), // #134 {r16|m16|r32|m32, i8|u8} + ROW(2, 0, 1, 0, 15 , 10 , 0 , 0 , 0 , 0 ), // {r64|m64, i8|u8} ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16} ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32} - ROW(2, 0, 1, 0, 15 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64} - ROW(2, 1, 1, 2, 73 , 74 , 0 , 0 , 0 , 0 ), // #127 {, } - ROW(2, 1, 1, 2, 75 , 76 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 1, 1, 2, 77 , 78 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 0, 1, 2, 79 , 80 , 0 , 0 , 0 , 0 ), // {, } - ROW(3, 1, 1, 1, 1 , 2 , 81 , 0 , 0 , 0 ), // #131 {r8lo|r8hi|m8|mem, r8lo|r8hi, } - ROW(3, 1, 1, 1, 27 , 4 , 33 , 0 , 0 , 0 ), // {r16|m16|mem, r16, } - ROW(3, 1, 1, 1, 28 , 6 , 36 , 0 , 0 , 0 ), // {r32|m32|mem, r32, } - ROW(3, 0, 1, 1, 15 , 8 , 38 , 0 , 0 , 0 ), // {r64|m64|mem, r64, } - ROW(2, 1, 1, 2, 81 , 82 , 0 , 0 , 0 , 0 ), // #135 {, } - ROW(2, 1, 1, 2, 33 , 83 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 1, 1, 2, 36 , 84 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 0, 1, 2, 38 , 85 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 1, 1, 2, 74 , 73 , 0 , 0 , 0 , 0 ), // #139 {, } - ROW(2, 1, 1, 2, 76 , 75 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 1, 1, 2, 78 , 77 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 0, 1, 2, 80 , 79 , 0 , 0 , 0 , 0 ), // {, } - ROW(1, 1, 1, 0, 86 , 0 , 0 , 0 , 0 , 0 ), // #143 {r16|m16|r64|m64} + ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64} + ROW(2, 1, 1, 0, 61 , 62 , 0 , 0 , 0 , 0 ), // #139 {mm, mm|m64|mem} + ROW(2, 0, 1, 0, 63 , 29 , 0 , 0 , 0 , 0 ), // {mm|xmm, r64|m64|mem} + ROW(2, 1, 1, 0, 31 , 63 , 0 , 0 , 0 , 0 ), // {m64|mem, mm|xmm} + ROW(2, 0, 1, 0, 29 , 63 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, mm|xmm} + ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // #143 {xmm, xmm|m64|mem} + ROW(1, 1, 1, 0, 11 , 0 , 0 , 0 , 0 , 0 ), // #144 {r16|m16} ROW(1, 1, 0, 0, 13 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32} - ROW(1, 1, 0, 0, 87 , 0 , 0 , 0 , 0 , 0 ), // {ds|es|ss} - ROW(1, 1, 1, 0, 88 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs} - ROW(1, 1, 1, 0, 89 , 0 , 0 , 0 , 0 , 0 ), // #147 {r16|m16|r64|m64|i8|i16|i32} - ROW(1, 1, 0, 0, 90 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32|i32|u32} - ROW(1, 1, 0, 0, 91 , 0 , 0 , 0 , 0 , 0 ), // {cs|ss|ds|es} - ROW(1, 1, 1, 0, 88 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs} - ROW(2, 1, 1, 2, 81 , 92 , 0 , 0 , 0 , 0 ), // #151 {, } - ROW(2, 1, 1, 2, 33 , 93 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 1, 1, 2, 36 , 94 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 0, 1, 2, 38 , 95 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 1, 1, 2, 92 , 81 , 0 , 0 , 0 , 0 ), // #155 {, } - ROW(2, 1, 1, 2, 93 , 33 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 1, 1, 2, 94 , 36 , 0 , 0 , 0 , 0 ), // {, } - ROW(2, 0, 1, 2, 95 , 38 , 0 , 0 , 0 , 0 ), // {, } - ROW(4, 1, 1, 0, 50 , 50 , 50 , 51 , 0 , 0 ), // #159 {xmm, xmm, xmm, xmm|m128|mem} - ROW(4, 1, 1, 0, 50 , 50 , 52 , 50 , 0 , 0 ), // {xmm, xmm, m128|mem, xmm} - ROW(4, 1, 1, 0, 53 , 53 , 53 , 54 , 0 , 0 ), // {ymm, ymm, ymm, ymm|m256|mem} - ROW(4, 1, 1, 0, 53 , 53 , 55 , 53 , 0 , 0 ), // {ymm, ymm, m256|mem, ymm} - ROW(3, 1, 1, 0, 50 , 67 , 50 , 0 , 0 , 0 ), // #163 {xmm, vm32x, xmm} - ROW(3, 1, 1, 0, 53 , 67 , 53 , 0 , 0 , 0 ), // {ymm, vm32x, ymm} - ROW(2, 1, 1, 0, 96 , 67 , 0 , 0 , 0 , 0 ), // {xmm|ymm, vm32x} - ROW(2, 1, 1, 0, 56 , 68 , 0 , 0 , 0 , 0 ), // {zmm, vm32y} - ROW(3, 1, 1, 0, 52 , 50 , 50 , 0 , 0 , 0 ), // #167 {m128|mem, xmm, xmm} - ROW(3, 1, 1, 0, 55 , 53 , 53 , 0 , 0 , 0 ), // {m256|mem, ymm, ymm} - ROW(3, 1, 1, 0, 50 , 50 , 52 , 0 , 0 , 0 ), // {xmm, xmm, m128|mem} - ROW(3, 1, 1, 0, 53 , 53 , 55 , 0 , 0 , 0 ), // {ymm, ymm, m256|mem} - ROW(5, 1, 1, 0, 50 , 50 , 51 , 50 , 97 , 0 ), // #171 {xmm, xmm, xmm|m128|mem, xmm, i4|u4} - ROW(5, 1, 1, 0, 50 , 50 , 50 , 52 , 97 , 0 ), // {xmm, xmm, xmm, m128|mem, i4|u4} - ROW(5, 1, 1, 0, 53 , 53 , 54 , 53 , 97 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm, i4|u4} - ROW(5, 1, 1, 0, 53 , 53 , 53 , 55 , 97 , 0 ), // {ymm, ymm, ymm, m256|mem, i4|u4} - ROW(3, 1, 1, 0, 53 , 54 , 10 , 0 , 0 , 0 ), // #175 {ymm, ymm|m256|mem, i8|u8} - ROW(3, 1, 1, 0, 53 , 53 , 54 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem} - ROW(3, 1, 1, 0, 56 , 56 , 61 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8} - ROW(3, 1, 1, 0, 56 , 58 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8} - ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #179 {r16, r16|m16|mem} - ROW(2, 1, 1, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #180 {r32, r32|m32|mem} - ROW(2, 0, 1, 0, 8 , 15 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem} - ROW(1, 1, 1, 0, 98 , 0 , 0 , 0 , 0 , 0 ), // #182 {m32|m64} - ROW(2, 1, 1, 0, 99 , 100, 0 , 0 , 0 , 0 ), // {st0, st} - ROW(2, 1, 1, 0, 100, 99 , 0 , 0 , 0 , 0 ), // {st, st0} - ROW(2, 1, 1, 0, 4 , 29 , 0 , 0 , 0 , 0 ), // #185 {r16, m32|mem} - ROW(2, 1, 1, 0, 6 , 101, 0 , 0 , 0 , 0 ), // {r32, m48|mem} - ROW(2, 0, 1, 0, 8 , 102, 0 , 0 , 0 , 0 ), // {r64, m80|mem} - ROW(3, 1, 1, 0, 27 , 4 , 103, 0 , 0 , 0 ), // #188 {r16|m16|mem, r16, cl|i8|u8} - ROW(3, 1, 1, 0, 28 , 6 , 103, 0 , 0 , 0 ), // {r32|m32|mem, r32, cl|i8|u8} - ROW(3, 0, 1, 0, 15 , 8 , 103, 0 , 0 , 0 ), // {r64|m64|mem, r64, cl|i8|u8} - ROW(3, 1, 1, 0, 50 , 50 , 51 , 0 , 0 , 0 ), // #191 {xmm, xmm, xmm|m128|mem} - ROW(3, 1, 1, 0, 53 , 53 , 54 , 0 , 0 , 0 ), // #192 {ymm, ymm, ymm|m256|mem} - ROW(3, 1, 1, 0, 56 , 56 , 57 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem} - ROW(4, 1, 1, 0, 50 , 50 , 51 , 10 , 0 , 0 ), // #194 {xmm, xmm, xmm|m128|mem, i8|u8} - ROW(4, 1, 1, 0, 53 , 53 , 54 , 10 , 0 , 0 ), // #195 {ymm, ymm, ymm|m256|mem, i8|u8} - ROW(4, 1, 1, 0, 56 , 56 , 57 , 10 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem, i8|u8} - ROW(4, 1, 1, 0, 104, 50 , 51 , 10 , 0 , 0 ), // #197 {xmm|k, xmm, xmm|m128|mem, i8|u8} - ROW(4, 1, 1, 0, 105, 53 , 54 , 10 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem, i8|u8} - ROW(4, 1, 1, 0, 106, 56 , 57 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8} - ROW(4, 1, 1, 0, 106, 50 , 51 , 10 , 0 , 0 ), // #200 {k, xmm, xmm|m128|mem, i8|u8} - ROW(4, 1, 1, 0, 106, 53 , 54 , 10 , 0 , 0 ), // {k, ymm, ymm|m256|mem, i8|u8} - ROW(4, 1, 1, 0, 106, 56 , 57 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8} - ROW(2, 1, 1, 0, 51 , 50 , 0 , 0 , 0 , 0 ), // #203 {xmm|m128|mem, xmm} - ROW(2, 1, 1, 0, 54 , 53 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, ymm} - ROW(2, 1, 1, 0, 57 , 56 , 0 , 0 , 0 , 0 ), // {zmm|m512|mem, zmm} - ROW(2, 1, 1, 0, 50 , 65 , 0 , 0 , 0 , 0 ), // #206 {xmm, xmm|m64|mem} - ROW(2, 1, 1, 0, 53 , 51 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m128|mem} - ROW(2, 1, 1, 0, 56 , 54 , 0 , 0 , 0 , 0 ), // {zmm, ymm|m256|mem} - ROW(2, 1, 1, 0, 50 , 51 , 0 , 0 , 0 , 0 ), // #209 {xmm, xmm|m128|mem} - ROW(2, 1, 1, 0, 53 , 54 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem} - ROW(2, 1, 1, 0, 56 , 57 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem} - ROW(2, 1, 1, 0, 50 , 107, 0 , 0 , 0 , 0 ), // #212 {xmm, xmm|m32|mem} - ROW(2, 1, 1, 0, 53 , 65 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m64|mem} - ROW(2, 1, 1, 0, 56 , 51 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m128|mem} - ROW(3, 1, 1, 0, 65 , 50 , 10 , 0 , 0 , 0 ), // #215 {xmm|m64|mem, xmm, i8|u8} - ROW(3, 1, 1, 0, 51 , 53 , 10 , 0 , 0 , 0 ), // #216 {xmm|m128|mem, ymm, i8|u8} - ROW(3, 1, 1, 0, 54 , 56 , 10 , 0 , 0 , 0 ), // #217 {ymm|m256|mem, zmm, i8|u8} - ROW(3, 1, 1, 0, 50 , 108, 50 , 0 , 0 , 0 ), // #218 {xmm, vm64x|vm64y, xmm} - ROW(2, 1, 1, 0, 50 , 108, 0 , 0 , 0 , 0 ), // {xmm, vm64x|vm64y} - ROW(2, 1, 1, 0, 53 , 72 , 0 , 0 , 0 , 0 ), // {ymm, vm64z} - ROW(3, 1, 1, 0, 50 , 51 , 10 , 0 , 0 , 0 ), // #221 {xmm, xmm|m128|mem, i8|u8} - ROW(3, 1, 1, 0, 53 , 54 , 10 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem, i8|u8} - ROW(3, 1, 1, 0, 56 , 57 , 10 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem, i8|u8} - ROW(2, 1, 1, 0, 50 , 65 , 0 , 0 , 0 , 0 ), // #224 {xmm, xmm|m64|mem} - ROW(2, 1, 1, 0, 53 , 54 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem} - ROW(2, 1, 1, 0, 56 , 57 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem} - ROW(2, 1, 1, 0, 52 , 50 , 0 , 0 , 0 , 0 ), // #227 {m128|mem, xmm} - ROW(2, 1, 1, 0, 55 , 53 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm} - ROW(2, 1, 1, 0, 58 , 56 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm} - ROW(2, 1, 1, 0, 50 , 52 , 0 , 0 , 0 , 0 ), // #230 {xmm, m128|mem} - ROW(2, 1, 1, 0, 53 , 55 , 0 , 0 , 0 , 0 ), // {ymm, m256|mem} - ROW(2, 1, 1, 0, 56 , 58 , 0 , 0 , 0 , 0 ), // {zmm, m512|mem} - ROW(2, 0, 1, 0, 15 , 50 , 0 , 0 , 0 , 0 ), // #233 {r64|m64|mem, xmm} - ROW(2, 1, 1, 0, 50 , 109, 0 , 0 , 0 , 0 ), // {xmm, xmm|m64|mem|r64} - ROW(2, 1, 1, 0, 30 , 50 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm} - ROW(2, 1, 1, 0, 30 , 50 , 0 , 0 , 0 , 0 ), // #236 {m64|mem, xmm} - ROW(2, 1, 1, 0, 50 , 30 , 0 , 0 , 0 , 0 ), // {xmm, m64|mem} - ROW(3, 1, 1, 0, 50 , 50 , 50 , 0 , 0 , 0 ), // #238 {xmm, xmm, xmm} - ROW(2, 1, 1, 0, 21 , 50 , 0 , 0 , 0 , 0 ), // #239 {m16|mem, xmm} - ROW(2, 1, 1, 0, 50 , 21 , 0 , 0 , 0 , 0 ), // {xmm, m16|mem} - ROW(3, 1, 1, 0, 50 , 50 , 50 , 0 , 0 , 0 ), // {xmm, xmm, xmm} - ROW(2, 1, 1, 0, 29 , 50 , 0 , 0 , 0 , 0 ), // #242 {m32|mem, xmm} - ROW(2, 1, 1, 0, 50 , 29 , 0 , 0 , 0 , 0 ), // {xmm, m32|mem} - ROW(3, 1, 1, 0, 50 , 50 , 50 , 0 , 0 , 0 ), // {xmm, xmm, xmm} - ROW(4, 1, 1, 0, 106, 106, 50 , 51 , 0 , 0 ), // #245 {k, k, xmm, xmm|m128|mem} - ROW(4, 1, 1, 0, 106, 106, 53 , 54 , 0 , 0 ), // {k, k, ymm, ymm|m256|mem} - ROW(4, 1, 1, 0, 106, 106, 56 , 57 , 0 , 0 ), // {k, k, zmm, zmm|m512|mem} - ROW(2, 1, 1, 0, 96 , 109, 0 , 0 , 0 , 0 ), // #248 {xmm|ymm, xmm|m64|mem|r64} - ROW(2, 0, 1, 0, 56 , 8 , 0 , 0 , 0 , 0 ), // {zmm, r64} - ROW(2, 1, 1, 0, 56 , 65 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m64|mem} - ROW(3, 1, 1, 0, 104, 50 , 51 , 0 , 0 , 0 ), // #251 {xmm|k, xmm, xmm|m128|mem} - ROW(3, 1, 1, 0, 105, 53 , 54 , 0 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem} - ROW(3, 1, 1, 0, 106, 56 , 57 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem} - ROW(2, 1, 1, 0, 107, 50 , 0 , 0 , 0 , 0 ), // #254 {xmm|m32|mem, xmm} - ROW(2, 1, 1, 0, 65 , 53 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, ymm} - ROW(2, 1, 1, 0, 51 , 56 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, zmm} - ROW(2, 1, 1, 0, 65 , 50 , 0 , 0 , 0 , 0 ), // #257 {xmm|m64|mem, xmm} - ROW(2, 1, 1, 0, 51 , 53 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, ymm} - ROW(2, 1, 1, 0, 54 , 56 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, zmm} - ROW(2, 1, 1, 0, 110, 50 , 0 , 0 , 0 , 0 ), // #260 {xmm|m16|mem, xmm} - ROW(2, 1, 1, 0, 107, 53 , 0 , 0 , 0 , 0 ), // {xmm|m32|mem, ymm} - ROW(2, 1, 1, 0, 65 , 56 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, zmm} - ROW(2, 1, 1, 0, 50 , 110, 0 , 0 , 0 , 0 ), // #263 {xmm, xmm|m16|mem} - ROW(2, 1, 1, 0, 53 , 107, 0 , 0 , 0 , 0 ), // {ymm, xmm|m32|mem} - ROW(2, 1, 1, 0, 56 , 65 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m64|mem} - ROW(2, 1, 1, 0, 67 , 50 , 0 , 0 , 0 , 0 ), // #266 {vm32x, xmm} - ROW(2, 1, 1, 0, 68 , 53 , 0 , 0 , 0 , 0 ), // {vm32y, ymm} - ROW(2, 1, 1, 0, 69 , 56 , 0 , 0 , 0 , 0 ), // {vm32z, zmm} - ROW(2, 1, 1, 0, 70 , 50 , 0 , 0 , 0 , 0 ), // #269 {vm64x, xmm} - ROW(2, 1, 1, 0, 71 , 53 , 0 , 0 , 0 , 0 ), // {vm64y, ymm} - ROW(2, 1, 1, 0, 72 , 56 , 0 , 0 , 0 , 0 ), // {vm64z, zmm} - ROW(3, 1, 1, 0, 106, 50 , 51 , 0 , 0 , 0 ), // #272 {k, xmm, xmm|m128|mem} - ROW(3, 1, 1, 0, 106, 53 , 54 , 0 , 0 , 0 ), // {k, ymm, ymm|m256|mem} - ROW(3, 1, 1, 0, 106, 56 , 57 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem} - ROW(3, 1, 1, 0, 6 , 6 , 28 , 0 , 0 , 0 ), // #275 {r32, r32, r32|m32|mem} - ROW(3, 0, 1, 0, 8 , 8 , 15 , 0 , 0 , 0 ), // {r64, r64, r64|m64|mem} - ROW(3, 1, 1, 0, 6 , 28 , 6 , 0 , 0 , 0 ), // #277 {r32, r32|m32|mem, r32} - ROW(3, 0, 1, 0, 8 , 15 , 8 , 0 , 0 , 0 ), // {r64, r64|m64|mem, r64} - ROW(2, 1, 0, 0, 111, 28 , 0 , 0 , 0 , 0 ), // #279 {bnd, r32|m32|mem} - ROW(2, 0, 1, 0, 111, 15 , 0 , 0 , 0 , 0 ), // {bnd, r64|m64|mem} - ROW(2, 1, 1, 0, 111, 112, 0 , 0 , 0 , 0 ), // #281 {bnd, bnd|mem} - ROW(2, 1, 1, 0, 113, 111, 0 , 0 , 0 , 0 ), // {mem, bnd} - ROW(2, 1, 0, 0, 4 , 29 , 0 , 0 , 0 , 0 ), // #283 {r16, m32|mem} - ROW(2, 1, 0, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m64|mem} - ROW(1, 1, 0, 0, 114, 0 , 0 , 0 , 0 , 0 ), // #285 {rel16|r16|m16|r32|m32} - ROW(1, 1, 1, 0, 115, 0 , 0 , 0 , 0 , 0 ), // {rel32|r64|m64|mem} - ROW(2, 1, 1, 0, 6 , 116, 0 , 0 , 0 , 0 ), // #287 {r32, r8lo|r8hi|m8|r16|m16|r32|m32} - ROW(2, 0, 1, 0, 8 , 117, 0 , 0 , 0 , 0 ), // {r64, r8lo|r8hi|m8|r64|m64} - ROW(1, 1, 0, 0, 118, 0 , 0 , 0 , 0 , 0 ), // #289 {r16|r32} - ROW(1, 1, 1, 0, 31 , 0 , 0 , 0 , 0 , 0 ), // #290 {r8lo|r8hi|m8|r16|m16|r32|m32|r64|m64|mem} - ROW(2, 1, 0, 0, 119, 58 , 0 , 0 , 0 , 0 ), // #291 {es:[mem|m512|memBase], m512|mem} - ROW(2, 0, 1, 0, 119, 58 , 0 , 0 , 0 , 0 ), // {es:[mem|m512|memBase], m512|mem} - ROW(3, 1, 1, 0, 50 , 10 , 10 , 0 , 0 , 0 ), // #293 {xmm, i8|u8, i8|u8} - ROW(2, 1, 1, 0, 50 , 50 , 0 , 0 , 0 , 0 ), // #294 {xmm, xmm} - ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #295 {} - ROW(1, 1, 1, 0, 100, 0 , 0 , 0 , 0 , 0 ), // #296 {st} - ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #297 {} - ROW(1, 1, 1, 0, 120, 0 , 0 , 0 , 0 , 0 ), // #298 {m32|m64|st} - ROW(2, 1, 1, 0, 50 , 50 , 0 , 0 , 0 , 0 ), // #299 {xmm, xmm} - ROW(4, 1, 1, 0, 50 , 50 , 10 , 10 , 0 , 0 ), // {xmm, xmm, i8|u8, i8|u8} - ROW(2, 1, 0, 0, 6 , 52 , 0 , 0 , 0 , 0 ), // #301 {r32, m128|mem} - ROW(2, 0, 1, 0, 8 , 52 , 0 , 0 , 0 , 0 ), // {r64, m128|mem} - ROW(2, 1, 0, 2, 36 , 121, 0 , 0 , 0 , 0 ), // #303 {, } - ROW(2, 0, 1, 2, 122, 121, 0 , 0 , 0 , 0 ), // {, } - ROW(1, 1, 1, 0, 123, 0 , 0 , 0 , 0 , 0 ), // #305 {rel8|rel32} - ROW(1, 1, 0, 0, 124, 0 , 0 , 0 , 0 , 0 ), // {rel16} - ROW(2, 1, 0, 1, 125, 126, 0 , 0 , 0 , 0 ), // #307 {, rel8} - ROW(2, 0, 1, 1, 127, 126, 0 , 0 , 0 , 0 ), // {, rel8} - ROW(1, 1, 1, 0, 128, 0 , 0 , 0 , 0 , 0 ), // #309 {rel8|rel32|r64|m64|mem} - ROW(1, 1, 0, 0, 129, 0 , 0 , 0 , 0 , 0 ), // {rel16|r32|m32|mem} - ROW(2, 1, 1, 0, 106, 130, 0 , 0 , 0 , 0 ), // #311 {k, k|m8|mem|r32} - ROW(2, 1, 1, 0, 131, 106, 0 , 0 , 0 , 0 ), // {m8|mem|r32, k} - ROW(2, 1, 1, 0, 106, 132, 0 , 0 , 0 , 0 ), // #313 {k, k|m32|mem|r32} - ROW(2, 1, 1, 0, 28 , 106, 0 , 0 , 0 , 0 ), // {m32|mem|r32, k} - ROW(2, 1, 1, 0, 106, 133, 0 , 0 , 0 , 0 ), // #315 {k, k|m64|mem|r64} - ROW(2, 1, 1, 0, 15 , 106, 0 , 0 , 0 , 0 ), // {m64|mem|r64, k} - ROW(2, 1, 1, 0, 106, 134, 0 , 0 , 0 , 0 ), // #317 {k, k|m16|mem|r32} - ROW(2, 1, 1, 0, 135, 106, 0 , 0 , 0 , 0 ), // {m16|mem|r32, k} - ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #319 {r16, r16|m16|mem} - ROW(2, 1, 1, 0, 6 , 135, 0 , 0 , 0 , 0 ), // {r32, r32|m16|mem} - ROW(2, 1, 0, 0, 136, 137, 0 , 0 , 0 , 0 ), // #321 {i16, i16|i32} - ROW(1, 1, 1, 0, 138, 0 , 0 , 0 , 0 , 0 ), // {m32|m48|m80|mem} - ROW(2, 1, 0, 0, 4 , 29 , 0 , 0 , 0 , 0 ), // #323 {r16, m32|mem} - ROW(2, 1, 0, 0, 6 , 101, 0 , 0 , 0 , 0 ), // {r32, m48|mem} - ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #325 {r16, r16|m16|mem} - ROW(2, 1, 1, 0, 139, 135, 0 , 0 , 0 , 0 ), // {r32|r64, r32|m16|mem} - ROW(2, 1, 1, 0, 64 , 28 , 0 , 0 , 0 , 0 ), // #327 {mm|xmm, r32|m32|mem} - ROW(2, 1, 1, 0, 28 , 64 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, mm|xmm} - ROW(2, 1, 1, 0, 50 , 107, 0 , 0 , 0 , 0 ), // #329 {xmm, xmm|m32|mem} - ROW(2, 1, 1, 0, 29 , 50 , 0 , 0 , 0 , 0 ), // {m32|mem, xmm} - ROW(2, 1, 1, 0, 4 , 9 , 0 , 0 , 0 , 0 ), // #331 {r16, r8lo|r8hi|m8} - ROW(2, 1, 1, 0, 139, 140, 0 , 0 , 0 , 0 ), // {r32|r64, r8lo|r8hi|m8|r16|m16} - ROW(2, 0, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #333 {r16, r16|m16|mem} - ROW(2, 0, 1, 0, 139, 28 , 0 , 0 , 0 , 0 ), // {r32|r64, r32|m32|mem} - ROW(4, 1, 1, 1, 6 , 6 , 28 , 35 , 0 , 0 ), // #335 {r32, r32, r32|m32|mem, } - ROW(4, 0, 1, 1, 8 , 8 , 15 , 37 , 0 , 0 ), // {r64, r64, r64|m64|mem, } - ROW(2, 1, 1, 0, 62 , 141, 0 , 0 , 0 , 0 ), // #337 {mm, mm|m64|mem} - ROW(2, 1, 1, 0, 50 , 51 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem} - ROW(3, 1, 1, 0, 62 , 141, 10 , 0 , 0 , 0 ), // #339 {mm, mm|m64|mem, i8|u8} - ROW(3, 1, 1, 0, 50 , 51 , 10 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem, i8|u8} - ROW(3, 1, 1, 0, 6 , 64 , 10 , 0 , 0 , 0 ), // #341 {r32, mm|xmm, i8|u8} - ROW(3, 1, 1, 0, 21 , 50 , 10 , 0 , 0 , 0 ), // {m16|mem, xmm, i8|u8} - ROW(2, 1, 1, 0, 62 , 142, 0 , 0 , 0 , 0 ), // #343 {mm, i8|u8|mm|m64|mem} - ROW(2, 1, 1, 0, 50 , 59 , 0 , 0 , 0 , 0 ), // {xmm, i8|u8|xmm|m128|mem} - ROW(2, 1, 1, 0, 62 , 143, 0 , 0 , 0 , 0 ), // #345 {mm, mm|m32|mem} - ROW(2, 1, 1, 0, 50 , 51 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem} - ROW(1, 1, 0, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #347 {r32} - ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // #348 {r64} - ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #349 {} - ROW(1, 1, 1, 0, 144, 0 , 0 , 0 , 0 , 0 ), // {u16} - ROW(3, 1, 1, 0, 6 , 28 , 10 , 0 , 0 , 0 ), // #351 {r32, r32|m32|mem, i8|u8} - ROW(3, 0, 1, 0, 8 , 15 , 10 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|u8} - ROW(4, 1, 1, 0, 50 , 50 , 51 , 50 , 0 , 0 ), // #353 {xmm, xmm, xmm|m128|mem, xmm} - ROW(4, 1, 1, 0, 53 , 53 , 54 , 53 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm} - ROW(2, 1, 1, 0, 50 , 145, 0 , 0 , 0 , 0 ), // #355 {xmm, xmm|m128|ymm|m256} - ROW(2, 1, 1, 0, 53 , 57 , 0 , 0 , 0 , 0 ), // {ymm, zmm|m512|mem} - ROW(4, 1, 1, 0, 50 , 50 , 50 , 65 , 0 , 0 ), // #357 {xmm, xmm, xmm, xmm|m64|mem} - ROW(4, 1, 1, 0, 50 , 50 , 30 , 50 , 0 , 0 ), // {xmm, xmm, m64|mem, xmm} - ROW(4, 1, 1, 0, 50 , 50 , 50 , 107, 0 , 0 ), // #359 {xmm, xmm, xmm, xmm|m32|mem} - ROW(4, 1, 1, 0, 50 , 50 , 29 , 50 , 0 , 0 ), // {xmm, xmm, m32|mem, xmm} - ROW(4, 1, 1, 0, 53 , 53 , 51 , 10 , 0 , 0 ), // #361 {ymm, ymm, xmm|m128|mem, i8|u8} - ROW(4, 1, 1, 0, 56 , 56 , 51 , 10 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem, i8|u8} - ROW(1, 1, 0, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #363 {} - ROW(1, 0, 1, 1, 38 , 0 , 0 , 0 , 0 , 0 ), // #364 {} - ROW(2, 1, 1, 0, 28 , 50 , 0 , 0 , 0 , 0 ), // #365 {r32|m32|mem, xmm} - ROW(2, 1, 1, 0, 50 , 28 , 0 , 0 , 0 , 0 ), // {xmm, r32|m32|mem} - ROW(2, 1, 1, 0, 30 , 50 , 0 , 0 , 0 , 0 ), // #367 {m64|mem, xmm} - ROW(3, 1, 1, 0, 50 , 50 , 30 , 0 , 0 , 0 ), // {xmm, xmm, m64|mem} - ROW(2, 1, 1, 0, 135, 50 , 0 , 0 , 0 , 0 ), // #369 {r32|m16|mem, xmm} - ROW(2, 1, 1, 0, 50 , 135, 0 , 0 , 0 , 0 ), // {xmm, r32|m16|mem} - ROW(2, 1, 0, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // #371 {r32|m32|mem, r32} - ROW(2, 0, 1, 0, 15 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64} - ROW(2, 1, 0, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #373 {r32, r32|m32|mem} - ROW(2, 0, 1, 0, 8 , 15 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem} - ROW(3, 1, 1, 0, 50 , 50 , 59 , 0 , 0 , 0 ), // #375 {xmm, xmm, xmm|m128|mem|i8|u8} - ROW(3, 1, 1, 0, 50 , 52 , 146, 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8|xmm} - ROW(2, 1, 1, 0, 67 , 96 , 0 , 0 , 0 , 0 ), // #377 {vm32x, xmm|ymm} - ROW(2, 1, 1, 0, 68 , 56 , 0 , 0 , 0 , 0 ), // {vm32y, zmm} - ROW(2, 1, 1, 0, 108, 50 , 0 , 0 , 0 , 0 ), // #379 {vm64x|vm64y, xmm} - ROW(2, 1, 1, 0, 72 , 53 , 0 , 0 , 0 , 0 ), // {vm64z, ymm} - ROW(3, 1, 1, 0, 50 , 50 , 51 , 0 , 0 , 0 ), // #381 {xmm, xmm, xmm|m128|mem} - ROW(3, 1, 1, 0, 50 , 52 , 50 , 0 , 0 , 0 ), // {xmm, m128|mem, xmm} - ROW(1, 1, 0, 1, 33 , 0 , 0 , 0 , 0 , 0 ), // #383 {} - ROW(2, 1, 0, 1, 33 , 10 , 0 , 0 , 0 , 0 ), // #384 {, i8|u8} - ROW(2, 1, 0, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // #385 {r16|m16|mem, r16} - ROW(3, 1, 1, 1, 50 , 51 , 147, 0 , 0 , 0 ), // #386 {xmm, xmm|m128|mem, } - ROW(2, 1, 1, 0, 111, 148, 0 , 0 , 0 , 0 ), // #387 {bnd, mib} - ROW(2, 1, 1, 0, 111, 113, 0 , 0 , 0 , 0 ), // #388 {bnd, mem} - ROW(2, 1, 1, 0, 148, 111, 0 , 0 , 0 , 0 ), // #389 {mib, bnd} - ROW(1, 1, 1, 0, 149, 0 , 0 , 0 , 0 , 0 ), // #390 {r16|r32|r64} - ROW(1, 1, 1, 1, 33 , 0 , 0 , 0 , 0 , 0 ), // #391 {} - ROW(2, 1, 1, 2, 35 , 36 , 0 , 0 , 0 , 0 ), // #392 {, } - ROW(1, 1, 1, 0, 150, 0 , 0 , 0 , 0 , 0 ), // #393 {mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024} - ROW(1, 1, 1, 0, 30 , 0 , 0 , 0 , 0 , 0 ), // #394 {m64|mem} - ROW(0, 0, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #395 {} - ROW(1, 1, 1, 1, 151, 0 , 0 , 0 , 0 , 0 ), // #396 {} - ROW(3, 1, 1, 0, 50 , 65 , 10 , 0 , 0 , 0 ), // #397 {xmm, xmm|m64|mem, i8|u8} - ROW(3, 1, 1, 0, 50 , 107, 10 , 0 , 0 , 0 ), // #398 {xmm, xmm|m32|mem, i8|u8} - ROW(5, 0, 1, 4, 52 , 37 , 38 , 152, 153, 0 ), // #399 {m128|mem, , , , } - ROW(5, 1, 1, 4, 30 , 35 , 36 , 121, 154, 0 ), // #400 {m64|mem, , , , } - ROW(4, 1, 1, 4, 36 , 154, 121, 35 , 0 , 0 ), // #401 {, , , } - ROW(2, 0, 1, 2, 37 , 38 , 0 , 0 , 0 , 0 ), // #402 {, } - ROW(2, 1, 1, 0, 62 , 51 , 0 , 0 , 0 , 0 ), // #403 {mm, xmm|m128|mem} - ROW(2, 1, 1, 0, 50 , 141, 0 , 0 , 0 , 0 ), // #404 {xmm, mm|m64|mem} - ROW(2, 1, 1, 0, 62 , 65 , 0 , 0 , 0 , 0 ), // #405 {mm, xmm|m64|mem} - ROW(2, 1, 1, 0, 139, 65 , 0 , 0 , 0 , 0 ), // #406 {r32|r64, xmm|m64|mem} - ROW(2, 1, 1, 0, 50 , 155, 0 , 0 , 0 , 0 ), // #407 {xmm, r32|m32|mem|r64|m64} - ROW(2, 1, 1, 0, 139, 107, 0 , 0 , 0 , 0 ), // #408 {r32|r64, xmm|m32|mem} - ROW(2, 1, 1, 2, 34 , 33 , 0 , 0 , 0 , 0 ), // #409 {, } - ROW(1, 1, 1, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #410 {} - ROW(2, 1, 1, 0, 12 , 10 , 0 , 0 , 0 , 0 ), // #411 {i16|u16, i8|u8} - ROW(3, 1, 1, 0, 28 , 50 , 10 , 0 , 0 , 0 ), // #412 {r32|m32|mem, xmm, i8|u8} - ROW(1, 1, 1, 0, 102, 0 , 0 , 0 , 0 , 0 ), // #413 {m80|mem} - ROW(1, 1, 1, 0, 156, 0 , 0 , 0 , 0 , 0 ), // #414 {m16|m32} - ROW(1, 1, 1, 0, 157, 0 , 0 , 0 , 0 , 0 ), // #415 {m16|m32|m64} - ROW(1, 1, 1, 0, 158, 0 , 0 , 0 , 0 , 0 ), // #416 {m32|m64|m80|st} - ROW(1, 1, 1, 0, 21 , 0 , 0 , 0 , 0 , 0 ), // #417 {m16|mem} - ROW(1, 1, 1, 0, 113, 0 , 0 , 0 , 0 , 0 ), // #418 {mem} - ROW(1, 1, 1, 0, 159, 0 , 0 , 0 , 0 , 0 ), // #419 {ax|m16|mem} - ROW(1, 0, 1, 0, 113, 0 , 0 , 0 , 0 , 0 ), // #420 {mem} - ROW(2, 1, 1, 1, 10 , 36 , 0 , 0 , 0 , 0 ), // #421 {i8|u8, } - ROW(2, 1, 1, 0, 160, 161, 0 , 0 , 0 , 0 ), // #422 {al|ax|eax, i8|u8|dx} - ROW(1, 1, 1, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #423 {r32} - ROW(2, 1, 1, 0, 162, 163, 0 , 0 , 0 , 0 ), // #424 {es:[m8|memBase|zdi|m16|m32], dx} - ROW(1, 1, 1, 0, 10 , 0 , 0 , 0 , 0 , 0 ), // #425 {i8|u8} - ROW(0, 1, 0, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #426 {} - ROW(3, 1, 1, 0, 106, 106, 106, 0 , 0 , 0 ), // #427 {k, k, k} - ROW(2, 1, 1, 0, 106, 106, 0 , 0 , 0 , 0 ), // #428 {k, k} - ROW(3, 1, 1, 0, 106, 106, 10 , 0 , 0 , 0 ), // #429 {k, k, i8|u8} - ROW(1, 1, 1, 1, 164, 0 , 0 , 0 , 0 , 0 ), // #430 {} - ROW(1, 1, 1, 0, 29 , 0 , 0 , 0 , 0 , 0 ), // #431 {m32|mem} - ROW(1, 0, 1, 0, 58 , 0 , 0 , 0 , 0 , 0 ), // #432 {m512|mem} - ROW(2, 1, 1, 0, 149, 150, 0 , 0 , 0 , 0 ), // #433 {r16|r32|r64, mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024} - ROW(1, 1, 1, 0, 27 , 0 , 0 , 0 , 0 , 0 ), // #434 {r16|m16|mem} - ROW(1, 1, 1, 0, 139, 0 , 0 , 0 , 0 , 0 ), // #435 {r32|r64} - ROW(3, 1, 1, 0, 139, 28 , 14 , 0 , 0 , 0 ), // #436 {r32|r64, r32|m32|mem, i32|u32} - ROW(3, 1, 1, 1, 50 , 50 , 165, 0 , 0 , 0 ), // #437 {xmm, xmm, } - ROW(3, 1, 1, 1, 62 , 62 , 166, 0 , 0 , 0 ), // #438 {mm, mm, } - ROW(3, 1, 1, 3, 167, 121, 35 , 0 , 0 , 0 ), // #439 {, , } - ROW(2, 1, 1, 0, 119, 58 , 0 , 0 , 0 , 0 ), // #440 {es:[mem|m512|memBase], m512|mem} - ROW(2, 1, 1, 0, 62 , 50 , 0 , 0 , 0 , 0 ), // #441 {mm, xmm} - ROW(2, 1, 1, 0, 6 , 50 , 0 , 0 , 0 , 0 ), // #442 {r32, xmm} - ROW(2, 1, 1, 0, 30 , 62 , 0 , 0 , 0 , 0 ), // #443 {m64|mem, mm} - ROW(2, 1, 1, 0, 50 , 62 , 0 , 0 , 0 , 0 ), // #444 {xmm, mm} - ROW(2, 1, 1, 2, 36 , 121, 0 , 0 , 0 , 0 ), // #445 {, } - ROW(3, 1, 1, 3, 36 , 121, 154, 0 , 0 , 0 ), // #446 {, , } - ROW(2, 1, 1, 0, 168, 160, 0 , 0 , 0 , 0 ), // #447 {u8|dx, al|ax|eax} - ROW(2, 1, 1, 0, 163, 169, 0 , 0 , 0 , 0 ), // #448 {dx, ds:[m8|memBase|zsi|m16|m32]} - ROW(6, 1, 1, 3, 50 , 51 , 10 , 121, 36 , 35 ), // #449 {xmm, xmm|m128|mem, i8|u8, , , } - ROW(6, 1, 1, 3, 50 , 51 , 10 , 147, 36 , 35 ), // #450 {xmm, xmm|m128|mem, i8|u8, , , } - ROW(4, 1, 1, 1, 50 , 51 , 10 , 121, 0 , 0 ), // #451 {xmm, xmm|m128|mem, i8|u8, } - ROW(4, 1, 1, 1, 50 , 51 , 10 , 147, 0 , 0 ), // #452 {xmm, xmm|m128|mem, i8|u8, } - ROW(3, 1, 1, 0, 131, 50 , 10 , 0 , 0 , 0 ), // #453 {r32|m8|mem, xmm, i8|u8} - ROW(3, 0, 1, 0, 15 , 50 , 10 , 0 , 0 , 0 ), // #454 {r64|m64|mem, xmm, i8|u8} - ROW(3, 1, 1, 0, 50 , 131, 10 , 0 , 0 , 0 ), // #455 {xmm, r32|m8|mem, i8|u8} - ROW(3, 1, 1, 0, 50 , 28 , 10 , 0 , 0 , 0 ), // #456 {xmm, r32|m32|mem, i8|u8} - ROW(3, 0, 1, 0, 50 , 15 , 10 , 0 , 0 , 0 ), // #457 {xmm, r64|m64|mem, i8|u8} - ROW(3, 1, 1, 0, 64 , 135, 10 , 0 , 0 , 0 ), // #458 {mm|xmm, r32|m16|mem, i8|u8} - ROW(2, 1, 1, 0, 6 , 64 , 0 , 0 , 0 , 0 ), // #459 {r32, mm|xmm} - ROW(2, 1, 1, 0, 50 , 10 , 0 , 0 , 0 , 0 ), // #460 {xmm, i8|u8} - ROW(1, 1, 1, 0, 155, 0 , 0 , 0 , 0 , 0 ), // #461 {r32|m32|mem|r64|m64} - ROW(2, 1, 1, 0, 31 , 103, 0 , 0 , 0 , 0 ), // #462 {r8lo|r8hi|m8|r16|m16|r32|m32|r64|m64|mem, cl|i8|u8} - ROW(1, 0, 1, 0, 139, 0 , 0 , 0 , 0 , 0 ), // #463 {r32|r64} - ROW(3, 1, 1, 3, 35 , 36 , 121, 0 , 0 , 0 ), // #464 {, , } - ROW(1, 1, 1, 0, 1 , 0 , 0 , 0 , 0 , 0 ), // #465 {r8lo|r8hi|m8|mem} - ROW(1, 1, 1, 0, 170, 0 , 0 , 0 , 0 , 0 ), // #466 {r16|m16|mem|r32|r64} - ROW(3, 0, 1, 0, 171, 171, 171, 0 , 0 , 0 ), // #467 {tmm, tmm, tmm} - ROW(2, 0, 1, 0, 171, 172, 0 , 0 , 0 , 0 ), // #468 {tmm, tmem} - ROW(2, 0, 1, 0, 172, 171, 0 , 0 , 0 , 0 ), // #469 {tmem, tmm} - ROW(1, 0, 1, 0, 171, 0 , 0 , 0 , 0 , 0 ), // #470 {tmm} - ROW(3, 1, 1, 2, 6 , 35 , 36 , 0 , 0 , 0 ), // #471 {r32, , } - ROW(1, 1, 1, 0, 173, 0 , 0 , 0 , 0 , 0 ), // #472 {ds:[mem|memBase]} - ROW(6, 1, 1, 0, 56 , 56 , 56 , 56 , 56 , 52 ), // #473 {zmm, zmm, zmm, zmm, zmm, m128|mem} - ROW(6, 1, 1, 0, 50 , 50 , 50 , 50 , 50 , 52 ), // #474 {xmm, xmm, xmm, xmm, xmm, m128|mem} - ROW(3, 1, 1, 0, 50 , 50 , 65 , 0 , 0 , 0 ), // #475 {xmm, xmm, xmm|m64|mem} - ROW(3, 1, 1, 0, 50 , 50 , 110, 0 , 0 , 0 ), // #476 {xmm, xmm, xmm|m16|mem} - ROW(3, 1, 1, 0, 50 , 50 , 107, 0 , 0 , 0 ), // #477 {xmm, xmm, xmm|m32|mem} - ROW(2, 1, 1, 0, 53 , 52 , 0 , 0 , 0 , 0 ), // #478 {ymm, m128|mem} - ROW(2, 1, 1, 0, 174, 65 , 0 , 0 , 0 , 0 ), // #479 {ymm|zmm, xmm|m64|mem} - ROW(2, 1, 1, 0, 174, 52 , 0 , 0 , 0 , 0 ), // #480 {ymm|zmm, m128|mem} - ROW(2, 1, 1, 0, 56 , 55 , 0 , 0 , 0 , 0 ), // #481 {zmm, m256|mem} - ROW(2, 1, 1, 0, 175, 65 , 0 , 0 , 0 , 0 ), // #482 {xmm|ymm|zmm, xmm|m64|mem} - ROW(2, 1, 1, 0, 175, 107, 0 , 0 , 0 , 0 ), // #483 {xmm|ymm|zmm, m32|mem|xmm} - ROW(4, 1, 1, 0, 104, 50 , 65 , 10 , 0 , 0 ), // #484 {xmm|k, xmm, xmm|m64|mem, i8|u8} - ROW(4, 1, 1, 0, 106, 50 , 110, 10 , 0 , 0 ), // #485 {k, xmm, xmm|m16|mem, i8|u8} - ROW(4, 1, 1, 0, 104, 50 , 107, 10 , 0 , 0 ), // #486 {xmm|k, xmm, xmm|m32|mem, i8|u8} - ROW(2, 1, 1, 0, 50 , 176, 0 , 0 , 0 , 0 ), // #487 {xmm, xmm|m128|ymm|m256|zmm|m512} - ROW(2, 1, 1, 0, 139, 110, 0 , 0 , 0 , 0 ), // #488 {r32|r64, xmm|m16|mem} - ROW(3, 1, 1, 0, 50 , 50 , 155, 0 , 0 , 0 ), // #489 {xmm, xmm, r32|m32|mem|r64|m64} - ROW(3, 1, 1, 0, 51 , 174, 10 , 0 , 0 , 0 ), // #490 {xmm|m128|mem, ymm|zmm, i8|u8} - ROW(4, 1, 1, 0, 50 , 50 , 65 , 10 , 0 , 0 ), // #491 {xmm, xmm, xmm|m64|mem, i8|u8} - ROW(4, 1, 1, 0, 50 , 50 , 107, 10 , 0 , 0 ), // #492 {xmm, xmm, xmm|m32|mem, i8|u8} - ROW(3, 1, 1, 0, 106, 176, 10 , 0 , 0 , 0 ), // #493 {k, xmm|m128|ymm|m256|zmm|m512, i8|u8} - ROW(3, 1, 1, 0, 106, 65 , 10 , 0 , 0 , 0 ), // #494 {k, xmm|m64|mem, i8|u8} - ROW(3, 1, 1, 0, 106, 110, 10 , 0 , 0 , 0 ), // #495 {k, xmm|m16|mem, i8|u8} - ROW(3, 1, 1, 0, 106, 107, 10 , 0 , 0 , 0 ), // #496 {k, xmm|m32|mem, i8|u8} - ROW(1, 1, 1, 0, 68 , 0 , 0 , 0 , 0 , 0 ), // #497 {vm32y} - ROW(1, 1, 1, 0, 69 , 0 , 0 , 0 , 0 , 0 ), // #498 {vm32z} - ROW(1, 1, 1, 0, 72 , 0 , 0 , 0 , 0 , 0 ), // #499 {vm64z} - ROW(4, 1, 1, 0, 50 , 50 , 110, 10 , 0 , 0 ), // #500 {xmm, xmm, xmm|m16|mem, i8|u8} - ROW(4, 1, 1, 0, 56 , 56 , 54 , 10 , 0 , 0 ), // #501 {zmm, zmm, ymm|m256|mem, i8|u8} - ROW(2, 1, 1, 0, 6 , 96 , 0 , 0 , 0 , 0 ), // #502 {r32, xmm|ymm} - ROW(2, 1, 1, 0, 175, 177, 0 , 0 , 0 , 0 ), // #503 {xmm|ymm|zmm, xmm|m8|mem|r32} - ROW(2, 1, 1, 0, 175, 178, 0 , 0 , 0 , 0 ), // #504 {xmm|ymm|zmm, xmm|m32|mem|r32} - ROW(2, 1, 1, 0, 175, 106, 0 , 0 , 0 , 0 ), // #505 {xmm|ymm|zmm, k} - ROW(2, 1, 1, 0, 175, 179, 0 , 0 , 0 , 0 ), // #506 {xmm|ymm|zmm, xmm|m16|mem|r32} - ROW(3, 1, 1, 0, 135, 50 , 10 , 0 , 0 , 0 ), // #507 {r32|m16|mem, xmm, i8|u8} - ROW(4, 1, 1, 0, 50 , 50 , 131, 10 , 0 , 0 ), // #508 {xmm, xmm, r32|m8|mem, i8|u8} - ROW(4, 1, 1, 0, 50 , 50 , 28 , 10 , 0 , 0 ), // #509 {xmm, xmm, r32|m32|mem, i8|u8} - ROW(4, 0, 1, 0, 50 , 50 , 15 , 10 , 0 , 0 ), // #510 {xmm, xmm, r64|m64|mem, i8|u8} - ROW(4, 1, 1, 0, 50 , 50 , 135, 10 , 0 , 0 ), // #511 {xmm, xmm, r32|m16|mem, i8|u8} - ROW(2, 1, 1, 0, 106, 175, 0 , 0 , 0 , 0 ), // #512 {k, xmm|ymm|zmm} - ROW(1, 1, 1, 0, 124, 0 , 0 , 0 , 0 , 0 ), // #513 {rel16|rel32} - ROW(3, 1, 1, 2, 113, 35 , 36 , 0 , 0 , 0 ), // #514 {mem, , } - ROW(3, 0, 1, 2, 113, 35 , 36 , 0 , 0 , 0 ) // #515 {mem, , } + ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64} + ROW(1, 1, 0, 0, 65 , 0 , 0 , 0 , 0 , 0 ), // {ds|es|ss} + ROW(1, 1, 1, 0, 66 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs} + ROW(1, 1, 1, 0, 67 , 0 , 0 , 0 , 0 , 0 ), // #149 {r16|m16|i8|i16} + ROW(1, 1, 0, 0, 68 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32|i32|u32} + ROW(1, 0, 1, 0, 69 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64|i32} + ROW(1, 1, 0, 0, 70 , 0 , 0 , 0 , 0 , 0 ), // {cs|ss|ds|es} + ROW(1, 1, 1, 0, 66 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs} + ROW(3, 1, 1, 0, 49 , 71 , 49 , 0 , 0 , 0 ), // #154 {xmm, vm32x, xmm} + ROW(3, 1, 1, 0, 52 , 72 , 52 , 0 , 0 , 0 ), // {ymm, vm32y, ymm} + ROW(2, 1, 1, 0, 49 , 71 , 0 , 0 , 0 , 0 ), // {xmm, vm32x} + ROW(2, 1, 1, 0, 52 , 72 , 0 , 0 , 0 , 0 ), // {ymm, vm32y} + ROW(2, 1, 1, 0, 55 , 73 , 0 , 0 , 0 , 0 ), // {zmm, vm32z} + ROW(3, 1, 1, 0, 49 , 74 , 49 , 0 , 0 , 0 ), // #159 {xmm, vm64x, xmm} + ROW(3, 1, 1, 0, 52 , 75 , 52 , 0 , 0 , 0 ), // {ymm, vm64y, ymm} + ROW(2, 1, 1, 0, 49 , 74 , 0 , 0 , 0 , 0 ), // {xmm, vm64x} + ROW(2, 1, 1, 0, 52 , 75 , 0 , 0 , 0 , 0 ), // {ymm, vm64y} + ROW(2, 1, 1, 0, 55 , 76 , 0 , 0 , 0 , 0 ), // {zmm, vm64z} + ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // #164 {m128|mem, xmm} + ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm} + ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm} + ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm} + ROW(2, 1, 1, 0, 57 , 55 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm} + ROW(2, 1, 1, 0, 49 , 51 , 0 , 0 , 0 , 0 ), // #169 {xmm, m128|mem} + ROW(2, 1, 1, 0, 52 , 54 , 0 , 0 , 0 , 0 ), // {ymm, m256|mem} + ROW(2, 1, 1, 0, 49 , 51 , 0 , 0 , 0 , 0 ), // {xmm, m128|mem} + ROW(2, 1, 1, 0, 52 , 54 , 0 , 0 , 0 , 0 ), // {ymm, m256|mem} + ROW(2, 1, 1, 0, 55 , 57 , 0 , 0 , 0 , 0 ), // {zmm, m512|mem} + ROW(2, 0, 1, 0, 29 , 49 , 0 , 0 , 0 , 0 ), // #174 {r64|m64|mem, xmm} + ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m64|mem} + ROW(2, 0, 1, 0, 49 , 29 , 0 , 0 , 0 , 0 ), // {xmm, r64|m64|mem} + ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm} + ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm} + ROW(2, 1, 1, 0, 77 , 78 , 0 , 0 , 0 , 0 ), // #179 {ds:[memBase|zsi|m8], es:[memBase|zdi|m8]} + ROW(2, 1, 1, 0, 79 , 80 , 0 , 0 , 0 , 0 ), // {ds:[memBase|zsi|m16], es:[memBase|zdi|m16]} + ROW(2, 1, 1, 0, 81 , 82 , 0 , 0 , 0 , 0 ), // {ds:[memBase|zsi|m32], es:[memBase|zdi|m32]} + ROW(2, 0, 1, 0, 83 , 84 , 0 , 0 , 0 , 0 ), // {ds:[memBase|zsi|m64], es:[memBase|zdi|m64]} + ROW(3, 1, 1, 1, 1 , 2 , 85 , 0 , 0 , 0 ), // #183 {r8lo|r8hi|m8|mem, r8lo|r8hi, } + ROW(3, 1, 1, 1, 27 , 4 , 36 , 0 , 0 , 0 ), // {r16|m16|mem, r16, } + ROW(3, 1, 1, 1, 28 , 6 , 39 , 0 , 0 , 0 ), // {r32|m32|mem, r32, } + ROW(3, 0, 1, 1, 29 , 8 , 41 , 0 , 0 , 0 ), // {r64|m64|mem, r64, } + ROW(2, 1, 1, 0, 86 , 87 , 0 , 0 , 0 , 0 ), // #187 {k, k|m64|mem} + ROW(2, 0, 1, 0, 86 , 8 , 0 , 0 , 0 , 0 ), // {k, r64} + ROW(2, 1, 1, 0, 31 , 86 , 0 , 0 , 0 , 0 ), // {m64|mem, k} + ROW(2, 0, 1, 0, 8 , 86 , 0 , 0 , 0 , 0 ), // {r64, k} + ROW(2, 1, 1, 0, 45 , 88 , 0 , 0 , 0 , 0 ), // #191 {al, ds:[memBase|zsi|m8|mem]} + ROW(2, 1, 1, 0, 46 , 89 , 0 , 0 , 0 , 0 ), // {ax, ds:[memBase|zsi|m16|mem]} + ROW(2, 1, 1, 0, 47 , 90 , 0 , 0 , 0 , 0 ), // {eax, ds:[memBase|zsi|m32|mem]} + ROW(2, 0, 1, 0, 48 , 91 , 0 , 0 , 0 , 0 ), // {rax, ds:[memBase|zsi|m64|mem]} + ROW(2, 1, 1, 0, 78 , 77 , 0 , 0 , 0 , 0 ), // #195 {es:[memBase|zdi|m8], ds:[memBase|zsi|m8]} + ROW(2, 1, 1, 0, 80 , 79 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m16], ds:[memBase|zsi|m16]} + ROW(2, 1, 1, 0, 82 , 81 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m32], ds:[memBase|zsi|m32]} + ROW(2, 0, 1, 0, 84 , 83 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m64], ds:[memBase|zsi|m64]} + ROW(2, 1, 1, 0, 45 , 92 , 0 , 0 , 0 , 0 ), // #199 {al, es:[memBase|zdi|m8|mem]} + ROW(2, 1, 1, 0, 46 , 93 , 0 , 0 , 0 , 0 ), // {ax, es:[memBase|zdi|m16|mem]} + ROW(2, 1, 1, 0, 47 , 94 , 0 , 0 , 0 , 0 ), // {eax, es:[memBase|zdi|m32|mem]} + ROW(2, 0, 1, 0, 48 , 95 , 0 , 0 , 0 , 0 ), // {rax, es:[memBase|zdi|m64|mem]} + ROW(2, 1, 1, 0, 92 , 45 , 0 , 0 , 0 , 0 ), // #203 {es:[memBase|zdi|m8|mem], al} + ROW(2, 1, 1, 0, 93 , 46 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m16|mem], ax} + ROW(2, 1, 1, 0, 94 , 47 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m32|mem], eax} + ROW(2, 0, 1, 0, 95 , 48 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m64|mem], rax} + ROW(4, 1, 1, 0, 49 , 49 , 49 , 50 , 0 , 0 ), // #207 {xmm, xmm, xmm, xmm|m128|mem} + ROW(4, 1, 1, 0, 49 , 49 , 51 , 49 , 0 , 0 ), // {xmm, xmm, m128|mem, xmm} + ROW(4, 1, 1, 0, 52 , 52 , 52 , 53 , 0 , 0 ), // {ymm, ymm, ymm, ymm|m256|mem} + ROW(4, 1, 1, 0, 52 , 52 , 54 , 52 , 0 , 0 ), // {ymm, ymm, m256|mem, ymm} + ROW(3, 1, 1, 0, 49 , 71 , 49 , 0 , 0 , 0 ), // #211 {xmm, vm32x, xmm} + ROW(3, 1, 1, 0, 52 , 71 , 52 , 0 , 0 , 0 ), // {ymm, vm32x, ymm} + ROW(2, 1, 1, 0, 96 , 71 , 0 , 0 , 0 , 0 ), // {xmm|ymm, vm32x} + ROW(2, 1, 1, 0, 55 , 72 , 0 , 0 , 0 , 0 ), // {zmm, vm32y} + ROW(3, 1, 1, 0, 51 , 49 , 49 , 0 , 0 , 0 ), // #215 {m128|mem, xmm, xmm} + ROW(3, 1, 1, 0, 54 , 52 , 52 , 0 , 0 , 0 ), // {m256|mem, ymm, ymm} + ROW(3, 1, 1, 0, 49 , 49 , 51 , 0 , 0 , 0 ), // {xmm, xmm, m128|mem} + ROW(3, 1, 1, 0, 52 , 52 , 54 , 0 , 0 , 0 ), // {ymm, ymm, m256|mem} + ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // #219 {m64|mem, xmm} + ROW(3, 1, 1, 0, 49 , 49 , 31 , 0 , 0 , 0 ), // {xmm, xmm, m64|mem} + ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm} + ROW(3, 1, 1, 0, 49 , 49 , 31 , 0 , 0 , 0 ), // {xmm, xmm, m64|mem} + ROW(2, 1, 1, 0, 21 , 49 , 0 , 0 , 0 , 0 ), // #223 {m16|mem, xmm} + ROW(2, 1, 1, 0, 49 , 21 , 0 , 0 , 0 , 0 ), // {xmm, m16|mem} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm} + ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm} + ROW(5, 1, 1, 0, 49 , 49 , 50 , 49 , 97 , 0 ), // #227 {xmm, xmm, xmm|m128|mem, xmm, i4|u4} + ROW(5, 1, 1, 0, 49 , 49 , 49 , 51 , 97 , 0 ), // {xmm, xmm, xmm, m128|mem, i4|u4} + ROW(5, 1, 1, 0, 52 , 52 , 53 , 52 , 97 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm, i4|u4} + ROW(5, 1, 1, 0, 52 , 52 , 52 , 54 , 97 , 0 ), // {ymm, ymm, ymm, m256|mem, i4|u4} + ROW(3, 1, 1, 0, 52 , 53 , 10 , 0 , 0 , 0 ), // #231 {ymm, ymm|m256|mem, i8|u8} + ROW(3, 1, 1, 0, 52 , 52 , 53 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem} + ROW(3, 1, 1, 0, 55 , 55 , 60 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8} + ROW(3, 1, 1, 0, 55 , 57 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8} + ROW(1, 1, 0, 0, 98 , 0 , 0 , 0 , 0 , 0 ), // #235 {rel16|r16|m16|mem|r32|m32} + ROW(1, 1, 1, 0, 99 , 0 , 0 , 0 , 0 , 0 ), // #236 {rel32} + ROW(1, 0, 1, 0, 29 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64|mem} + ROW(1, 1, 0, 0, 100, 0 , 0 , 0 , 0 , 0 ), // #238 {r16|r32} + ROW(1, 1, 1, 0, 32 , 0 , 0 , 0 , 0 , 0 ), // #239 {r8lo|r8hi|m8|r16|m16|r32|m32} + ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64} + ROW(1, 1, 1, 0, 101, 0 , 0 , 0 , 0 , 0 ), // #241 {m32|m64} + ROW(2, 1, 1, 0, 102, 103, 0 , 0 , 0 , 0 ), // {st0, st} + ROW(2, 1, 1, 0, 103, 102, 0 , 0 , 0 , 0 ), // {st, st0} + ROW(1, 1, 1, 0, 104, 0 , 0 , 0 , 0 , 0 ), // #244 {rel8|rel32} + ROW(1, 1, 0, 0, 105, 0 , 0 , 0 , 0 , 0 ), // {rel16|r32|m32} + ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64} + ROW(2, 1, 0, 0, 106, 107, 0 , 0 , 0 , 0 ), // #247 {i16, i16|i32} + ROW(1, 1, 1, 0, 108, 0 , 0 , 0 , 0 , 0 ), // {m32|mem|m48} + ROW(1, 0, 1, 0, 109, 0 , 0 , 0 , 0 , 0 ), // {m80|mem} + ROW(2, 1, 1, 0, 4 , 30 , 0 , 0 , 0 , 0 ), // #250 {r16, m32|mem} + ROW(2, 1, 1, 0, 6 , 110, 0 , 0 , 0 , 0 ), // {r32, m48|mem} + ROW(2, 0, 1, 0, 8 , 109, 0 , 0 , 0 , 0 ), // {r64, m80|mem} + ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #253 {r16, r16|m16|mem} + ROW(2, 1, 1, 0, 6 , 111, 0 , 0 , 0 , 0 ), // {r32, r32|m16|mem} + ROW(2, 0, 1, 0, 8 , 111, 0 , 0 , 0 , 0 ), // {r64, r32|m16|mem} + ROW(2, 1, 1, 0, 4 , 9 , 0 , 0 , 0 , 0 ), // #256 {r16, r8lo|r8hi|m8} + ROW(2, 1, 1, 0, 6 , 112, 0 , 0 , 0 , 0 ), // {r32, r8lo|r8hi|m8|r16|m16} + ROW(2, 0, 1, 0, 8 , 113, 0 , 0 , 0 , 0 ), // {r64, r8lo|m8|r16|m16} + ROW(3, 1, 1, 0, 27 , 4 , 114, 0 , 0 , 0 ), // #259 {r16|m16|mem, r16, cl|i8|u8} + ROW(3, 1, 1, 0, 28 , 6 , 114, 0 , 0 , 0 ), // {r32|m32|mem, r32, cl|i8|u8} + ROW(3, 0, 1, 0, 29 , 8 , 114, 0 , 0 , 0 ), // {r64|m64|mem, r64, cl|i8|u8} + ROW(3, 1, 1, 0, 49 , 49 , 50 , 0 , 0 , 0 ), // #262 {xmm, xmm, xmm|m128|mem} + ROW(3, 1, 1, 0, 52 , 52 , 53 , 0 , 0 , 0 ), // #263 {ymm, ymm, ymm|m256|mem} + ROW(3, 1, 1, 0, 55 , 55 , 56 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem} + ROW(4, 1, 1, 0, 49 , 49 , 50 , 10 , 0 , 0 ), // #265 {xmm, xmm, xmm|m128|mem, i8|u8} + ROW(4, 1, 1, 0, 52 , 52 , 53 , 10 , 0 , 0 ), // #266 {ymm, ymm, ymm|m256|mem, i8|u8} + ROW(4, 1, 1, 0, 55 , 55 , 56 , 10 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem, i8|u8} + ROW(4, 1, 1, 0, 115, 49 , 50 , 10 , 0 , 0 ), // #268 {xmm|k, xmm, xmm|m128|mem, i8|u8} + ROW(4, 1, 1, 0, 116, 52 , 53 , 10 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem, i8|u8} + ROW(4, 1, 1, 0, 86 , 55 , 56 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8} + ROW(4, 1, 1, 0, 86 , 49 , 50 , 10 , 0 , 0 ), // #271 {k, xmm, xmm|m128|mem, i8|u8} + ROW(4, 1, 1, 0, 86 , 52 , 53 , 10 , 0 , 0 ), // {k, ymm, ymm|m256|mem, i8|u8} + ROW(4, 1, 1, 0, 86 , 55 , 56 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8} + ROW(2, 1, 1, 0, 50 , 49 , 0 , 0 , 0 , 0 ), // #274 {xmm|m128|mem, xmm} + ROW(2, 1, 1, 0, 53 , 52 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, ymm} + ROW(2, 1, 1, 0, 56 , 55 , 0 , 0 , 0 , 0 ), // {zmm|m512|mem, zmm} + ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // #277 {xmm, xmm|m64|mem} + ROW(2, 1, 1, 0, 52 , 50 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m128|mem} + ROW(2, 1, 1, 0, 55 , 53 , 0 , 0 , 0 , 0 ), // {zmm, ymm|m256|mem} + ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // #280 {xmm, xmm|m128|mem} + ROW(2, 1, 1, 0, 52 , 53 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem} + ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem} + ROW(2, 1, 1, 0, 49 , 117, 0 , 0 , 0 , 0 ), // #283 {xmm, xmm|m32|mem} + ROW(2, 1, 1, 0, 52 , 64 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m64|mem} + ROW(2, 1, 1, 0, 55 , 50 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m128|mem} + ROW(3, 1, 1, 0, 64 , 49 , 10 , 0 , 0 , 0 ), // #286 {xmm|m64|mem, xmm, i8|u8} + ROW(3, 1, 1, 0, 50 , 52 , 10 , 0 , 0 , 0 ), // #287 {xmm|m128|mem, ymm, i8|u8} + ROW(3, 1, 1, 0, 53 , 55 , 10 , 0 , 0 , 0 ), // #288 {ymm|m256|mem, zmm, i8|u8} + ROW(3, 1, 1, 0, 49 , 118, 49 , 0 , 0 , 0 ), // #289 {xmm, vm64x|vm64y, xmm} + ROW(2, 1, 1, 0, 49 , 118, 0 , 0 , 0 , 0 ), // {xmm, vm64x|vm64y} + ROW(2, 1, 1, 0, 52 , 76 , 0 , 0 , 0 , 0 ), // {ymm, vm64z} + ROW(3, 1, 1, 0, 49 , 50 , 10 , 0 , 0 , 0 ), // #292 {xmm, xmm|m128|mem, i8|u8} + ROW(3, 1, 1, 0, 52 , 53 , 10 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem, i8|u8} + ROW(3, 1, 1, 0, 55 , 56 , 10 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem, i8|u8} + ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // #295 {xmm, xmm|m64|mem} + ROW(2, 1, 1, 0, 52 , 53 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem} + ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem} + ROW(4, 1, 1, 0, 86 , 86 , 49 , 50 , 0 , 0 ), // #298 {k, k, xmm, xmm|m128|mem} + ROW(4, 1, 1, 0, 86 , 86 , 52 , 53 , 0 , 0 ), // {k, k, ymm, ymm|m256|mem} + ROW(4, 1, 1, 0, 86 , 86 , 55 , 56 , 0 , 0 ), // {k, k, zmm, zmm|m512|mem} + ROW(3, 1, 1, 0, 115, 49 , 50 , 0 , 0 , 0 ), // #301 {xmm|k, xmm, xmm|m128|mem} + ROW(3, 1, 1, 0, 116, 52 , 53 , 0 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem} + ROW(3, 1, 1, 0, 86 , 55 , 56 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem} + ROW(2, 1, 1, 0, 117, 49 , 0 , 0 , 0 , 0 ), // #304 {xmm|m32|mem, xmm} + ROW(2, 1, 1, 0, 64 , 52 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, ymm} + ROW(2, 1, 1, 0, 50 , 55 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, zmm} + ROW(2, 1, 1, 0, 64 , 49 , 0 , 0 , 0 , 0 ), // #307 {xmm|m64|mem, xmm} + ROW(2, 1, 1, 0, 50 , 52 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, ymm} + ROW(2, 1, 1, 0, 53 , 55 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, zmm} + ROW(2, 1, 1, 0, 119, 49 , 0 , 0 , 0 , 0 ), // #310 {xmm|m16|mem, xmm} + ROW(2, 1, 1, 0, 117, 52 , 0 , 0 , 0 , 0 ), // {xmm|m32|mem, ymm} + ROW(2, 1, 1, 0, 64 , 55 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, zmm} + ROW(2, 1, 1, 0, 49 , 119, 0 , 0 , 0 , 0 ), // #313 {xmm, xmm|m16|mem} + ROW(2, 1, 1, 0, 52 , 117, 0 , 0 , 0 , 0 ), // {ymm, xmm|m32|mem} + ROW(2, 1, 1, 0, 55 , 64 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m64|mem} + ROW(2, 1, 1, 0, 71 , 49 , 0 , 0 , 0 , 0 ), // #316 {vm32x, xmm} + ROW(2, 1, 1, 0, 72 , 52 , 0 , 0 , 0 , 0 ), // {vm32y, ymm} + ROW(2, 1, 1, 0, 73 , 55 , 0 , 0 , 0 , 0 ), // {vm32z, zmm} + ROW(2, 1, 1, 0, 74 , 49 , 0 , 0 , 0 , 0 ), // #319 {vm64x, xmm} + ROW(2, 1, 1, 0, 75 , 52 , 0 , 0 , 0 , 0 ), // {vm64y, ymm} + ROW(2, 1, 1, 0, 76 , 55 , 0 , 0 , 0 , 0 ), // {vm64z, zmm} + ROW(3, 1, 1, 0, 86 , 49 , 50 , 0 , 0 , 0 ), // #322 {k, xmm, xmm|m128|mem} + ROW(3, 1, 1, 0, 86 , 52 , 53 , 0 , 0 , 0 ), // {k, ymm, ymm|m256|mem} + ROW(3, 1, 1, 0, 86 , 55 , 56 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem} + ROW(3, 1, 1, 0, 6 , 6 , 28 , 0 , 0 , 0 ), // #325 {r32, r32, r32|m32|mem} + ROW(3, 0, 1, 0, 8 , 8 , 29 , 0 , 0 , 0 ), // {r64, r64, r64|m64|mem} + ROW(3, 1, 1, 0, 6 , 28 , 6 , 0 , 0 , 0 ), // #327 {r32, r32|m32|mem, r32} + ROW(3, 0, 1, 0, 8 , 29 , 8 , 0 , 0 , 0 ), // {r64, r64|m64|mem, r64} + ROW(2, 1, 0, 0, 120, 28 , 0 , 0 , 0 , 0 ), // #329 {bnd, r32|m32|mem} + ROW(2, 0, 1, 0, 120, 29 , 0 , 0 , 0 , 0 ), // {bnd, r64|m64|mem} + ROW(2, 1, 1, 0, 120, 121, 0 , 0 , 0 , 0 ), // #331 {bnd, bnd|mem} + ROW(2, 1, 1, 0, 122, 120, 0 , 0 , 0 , 0 ), // {mem, bnd} + ROW(2, 1, 0, 0, 4 , 30 , 0 , 0 , 0 , 0 ), // #333 {r16, m32|mem} + ROW(2, 1, 0, 0, 6 , 31 , 0 , 0 , 0 , 0 ), // {r32, m64|mem} + ROW(1, 1, 1, 0, 100, 0 , 0 , 0 , 0 , 0 ), // #335 {r16|r32} + ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // #336 {r64} + ROW(3, 1, 1, 0, 30 , 6 , 6 , 0 , 0 , 0 ), // #337 {m32|mem, r32, r32} + ROW(3, 0, 1, 0, 31 , 8 , 8 , 0 , 0 , 0 ), // {m64|mem, r64, r64} + ROW(2, 1, 1, 0, 6 , 32 , 0 , 0 , 0 , 0 ), // #339 {r32, r8lo|r8hi|m8|r16|m16|r32|m32} + ROW(2, 0, 1, 0, 8 , 123, 0 , 0 , 0 , 0 ), // {r64, r8lo|m8|r64|m64} + ROW(2, 1, 1, 0, 6 , 64 , 0 , 0 , 0 , 0 ), // #341 {r32, xmm|m64|mem} + ROW(2, 0, 1, 0, 8 , 64 , 0 , 0 , 0 , 0 ), // {r64, xmm|m64|mem} + ROW(2, 1, 1, 0, 49 , 28 , 0 , 0 , 0 , 0 ), // #343 {xmm, r32|m32|mem} + ROW(2, 0, 1, 0, 49 , 29 , 0 , 0 , 0 , 0 ), // {xmm, r64|m64|mem} + ROW(2, 0, 1, 0, 49 , 29 , 0 , 0 , 0 , 0 ), // #345 {xmm, r64|m64|mem} + ROW(2, 1, 1, 0, 49 , 28 , 0 , 0 , 0 , 0 ), // {xmm, r32|m32|mem} + ROW(2, 1, 1, 0, 6 , 117, 0 , 0 , 0 , 0 ), // #347 {r32, xmm|m32|mem} + ROW(2, 0, 1, 0, 8 , 117, 0 , 0 , 0 , 0 ), // {r64, xmm|m32|mem} + ROW(2, 0, 1, 0, 8 , 117, 0 , 0 , 0 , 0 ), // #349 {r64, xmm|m32|mem} + ROW(2, 1, 1, 0, 6 , 117, 0 , 0 , 0 , 0 ), // {r32, xmm|m32|mem} + ROW(2, 1, 0, 0, 124, 57 , 0 , 0 , 0 , 0 ), // #351 {es:[mem|m512|memBase], m512|mem} + ROW(2, 0, 1, 0, 124, 57 , 0 , 0 , 0 , 0 ), // {es:[mem|m512|memBase], m512|mem} + ROW(3, 1, 1, 0, 49 , 10 , 10 , 0 , 0 , 0 ), // #353 {xmm, i8|u8, i8|u8} + ROW(2, 1, 1, 0, 49 , 49 , 0 , 0 , 0 , 0 ), // #354 {xmm, xmm} + ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #355 {} + ROW(1, 1, 1, 0, 103, 0 , 0 , 0 , 0 , 0 ), // #356 {st} + ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #357 {} + ROW(1, 1, 1, 0, 125, 0 , 0 , 0 , 0 , 0 ), // #358 {m32|m64|st} + ROW(2, 1, 1, 0, 49 , 49 , 0 , 0 , 0 , 0 ), // #359 {xmm, xmm} + ROW(4, 1, 1, 0, 49 , 49 , 10 , 10 , 0 , 0 ), // {xmm, xmm, i8|u8, i8|u8} + ROW(2, 1, 0, 0, 6 , 51 , 0 , 0 , 0 , 0 ), // #361 {r32, m128|mem} + ROW(2, 0, 1, 0, 8 , 51 , 0 , 0 , 0 , 0 ), // {r64, m128|mem} + ROW(2, 1, 0, 2, 39 , 126, 0 , 0 , 0 , 0 ), // #363 {, } + ROW(2, 0, 1, 2, 127, 126, 0 , 0 , 0 , 0 ), // {, } + ROW(3, 1, 0, 3, 39 , 38 , 126, 0 , 0 , 0 ), // #365 {, , } + ROW(3, 0, 1, 3, 127, 38 , 126, 0 , 0 , 0 ), // {, , } + ROW(2, 1, 0, 1, 128, 129, 0 , 0 , 0 , 0 ), // #367 {, rel8} + ROW(2, 0, 1, 1, 130, 129, 0 , 0 , 0 , 0 ), // {, rel8} + ROW(2, 1, 1, 0, 86 , 131, 0 , 0 , 0 , 0 ), // #369 {k, k|m8|mem|r32} + ROW(2, 1, 1, 0, 132, 86 , 0 , 0 , 0 , 0 ), // {m8|mem|r32, k} + ROW(2, 1, 1, 0, 86 , 133, 0 , 0 , 0 , 0 ), // #371 {k, k|m32|mem|r32} + ROW(2, 1, 1, 0, 28 , 86 , 0 , 0 , 0 , 0 ), // {m32|mem|r32, k} + ROW(2, 1, 1, 0, 86 , 134, 0 , 0 , 0 , 0 ), // #373 {k, k|m16|mem|r32} + ROW(2, 1, 1, 0, 111, 86 , 0 , 0 , 0 , 0 ), // {m16|mem|r32, k} + ROW(2, 1, 0, 0, 4 , 30 , 0 , 0 , 0 , 0 ), // #375 {r16, m32|mem} + ROW(2, 1, 0, 0, 6 , 110, 0 , 0 , 0 , 0 ), // {r32, m48|mem} + ROW(2, 1, 1, 0, 100, 135, 0 , 0 , 0 , 0 ), // #377 {r16|r32, mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024} + ROW(2, 0, 1, 0, 8 , 135, 0 , 0 , 0 , 0 ), // {r64, mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024} + ROW(1, 1, 1, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #379 {r32} + ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // {r64} + ROW(3, 1, 1, 0, 6 , 28 , 14 , 0 , 0 , 0 ), // #381 {r32, r32|m32|mem, i32|u32} + ROW(3, 0, 1, 0, 8 , 28 , 14 , 0 , 0 , 0 ), // {r64, r32|m32|mem, i32|u32} + ROW(2, 1, 1, 0, 63 , 28 , 0 , 0 , 0 , 0 ), // #383 {mm|xmm, r32|m32|mem} + ROW(2, 1, 1, 0, 28 , 63 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, mm|xmm} + ROW(2, 1, 1, 0, 124, 57 , 0 , 0 , 0 , 0 ), // #385 {es:[mem|m512|memBase], m512|mem} + ROW(2, 1, 1, 0, 124, 57 , 0 , 0 , 0 , 0 ), // {es:[mem|m512|memBase], m512|mem} + ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // #387 {xmm, xmm|m64|mem} + ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm} + ROW(2, 1, 1, 0, 49 , 117, 0 , 0 , 0 , 0 ), // #389 {xmm, xmm|m32|mem} + ROW(2, 1, 1, 0, 30 , 49 , 0 , 0 , 0 , 0 ), // {m32|mem, xmm} + ROW(2, 0, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #391 {r16, r16|m16|mem} + ROW(2, 0, 1, 0, 136, 28 , 0 , 0 , 0 , 0 ), // {r32|r64, r32|m32|mem} + ROW(4, 1, 1, 1, 6 , 6 , 28 , 38 , 0 , 0 ), // #393 {r32, r32, r32|m32|mem, } + ROW(4, 0, 1, 1, 8 , 8 , 29 , 40 , 0 , 0 ), // {r64, r64, r64|m64|mem, } + ROW(2, 1, 1, 0, 61 , 62 , 0 , 0 , 0 , 0 ), // #395 {mm, mm|m64|mem} + ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem} + ROW(3, 1, 1, 0, 61 , 62 , 10 , 0 , 0 , 0 ), // #397 {mm, mm|m64|mem, i8|u8} + ROW(3, 1, 1, 0, 49 , 50 , 10 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem, i8|u8} + ROW(3, 1, 1, 0, 6 , 63 , 10 , 0 , 0 , 0 ), // #399 {r32, mm|xmm, i8|u8} + ROW(3, 1, 1, 0, 21 , 49 , 10 , 0 , 0 , 0 ), // {m16|mem, xmm, i8|u8} + ROW(2, 1, 1, 0, 61 , 137, 0 , 0 , 0 , 0 ), // #401 {mm, i8|u8|mm|m64|mem} + ROW(2, 1, 1, 0, 49 , 58 , 0 , 0 , 0 , 0 ), // {xmm, i8|u8|xmm|m128|mem} + ROW(1, 1, 1, 0, 28 , 0 , 0 , 0 , 0 , 0 ), // #403 {r32|m32|mem} + ROW(1, 0, 1, 0, 29 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64|mem} + ROW(2, 1, 1, 0, 61 , 138, 0 , 0 , 0 , 0 ), // #405 {mm, mm|m32|mem} + ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem} + ROW(2, 1, 1, 0, 32 , 114, 0 , 0 , 0 , 0 ), // #407 {r8lo|r8hi|m8|r16|m16|r32|m32, cl|i8|u8} + ROW(2, 0, 1, 0, 15 , 114, 0 , 0 , 0 , 0 ), // {r64|m64, cl|i8|u8} + ROW(1, 1, 0, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #409 {r32} + ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // {r64} + ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #411 {} + ROW(1, 1, 1, 0, 139, 0 , 0 , 0 , 0 , 0 ), // {u16} + ROW(3, 1, 1, 0, 6 , 28 , 10 , 0 , 0 , 0 ), // #413 {r32, r32|m32|mem, i8|u8} + ROW(3, 0, 1, 0, 8 , 29 , 10 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|u8} + ROW(1, 1, 1, 0, 140, 0 , 0 , 0 , 0 , 0 ), // #415 {r16|m16|mem|r32} + ROW(1, 0, 1, 0, 141, 0 , 0 , 0 , 0 , 0 ), // {r64|m16|mem} + ROW(1, 1, 0, 0, 142, 0 , 0 , 0 , 0 , 0 ), // #417 {ds:[mem|memBase]} + ROW(1, 0, 1, 0, 142, 0 , 0 , 0 , 0 , 0 ), // {ds:[mem|memBase]} + ROW(4, 1, 1, 0, 49 , 49 , 50 , 49 , 0 , 0 ), // #419 {xmm, xmm, xmm|m128|mem, xmm} + ROW(4, 1, 1, 0, 52 , 52 , 53 , 52 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm} + ROW(2, 1, 1, 0, 49 , 143, 0 , 0 , 0 , 0 ), // #421 {xmm, xmm|m128|ymm|m256} + ROW(2, 1, 1, 0, 52 , 56 , 0 , 0 , 0 , 0 ), // {ymm, zmm|m512|mem} + ROW(2, 1, 1, 0, 6 , 119, 0 , 0 , 0 , 0 ), // #423 {r32, xmm|m16|mem} + ROW(2, 0, 1, 0, 8 , 119, 0 , 0 , 0 , 0 ), // {r64, xmm|m16|mem} + ROW(3, 1, 1, 0, 49 , 49 , 28 , 0 , 0 , 0 ), // #425 {xmm, xmm, r32|m32|mem} + ROW(3, 0, 1, 0, 49 , 49 , 29 , 0 , 0 , 0 ), // {xmm, xmm, r64|m64|mem} + ROW(3, 1, 1, 0, 49 , 49 , 13 , 0 , 0 , 0 ), // #427 {xmm, xmm, r32|m32} + ROW(3, 0, 1, 0, 49 , 49 , 15 , 0 , 0 , 0 ), // {xmm, xmm, r64|m64} + ROW(4, 1, 1, 0, 49 , 49 , 49 , 64 , 0 , 0 ), // #429 {xmm, xmm, xmm, xmm|m64|mem} + ROW(4, 1, 1, 0, 49 , 49 , 31 , 49 , 0 , 0 ), // {xmm, xmm, m64|mem, xmm} + ROW(4, 1, 1, 0, 49 , 49 , 49 , 117, 0 , 0 ), // #431 {xmm, xmm, xmm, xmm|m32|mem} + ROW(4, 1, 1, 0, 49 , 49 , 30 , 49 , 0 , 0 ), // {xmm, xmm, m32|mem, xmm} + ROW(4, 1, 1, 0, 52 , 52 , 50 , 10 , 0 , 0 ), // #433 {ymm, ymm, xmm|m128|mem, i8|u8} + ROW(4, 1, 1, 0, 55 , 55 , 50 , 10 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem, i8|u8} + ROW(1, 1, 0, 1, 39 , 0 , 0 , 0 , 0 , 0 ), // #435 {} + ROW(1, 0, 1, 1, 41 , 0 , 0 , 0 , 0 , 0 ), // #436 {} + ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #437 {} + ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // {} + ROW(2, 1, 1, 0, 28 , 49 , 0 , 0 , 0 , 0 ), // #439 {r32|m32|mem, xmm} + ROW(2, 1, 1, 0, 49 , 28 , 0 , 0 , 0 , 0 ), // {xmm, r32|m32|mem} + ROW(2, 1, 1, 0, 111, 49 , 0 , 0 , 0 , 0 ), // #441 {r32|m16|mem, xmm} + ROW(2, 1, 1, 0, 49 , 111, 0 , 0 , 0 , 0 ), // {xmm, r32|m16|mem} + ROW(2, 1, 0, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // #443 {r32|m32|mem, r32} + ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64} + ROW(2, 1, 0, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #445 {r32, r32|m32|mem} + ROW(2, 0, 1, 0, 8 , 29 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem} + ROW(2, 1, 1, 0, 144, 64 , 0 , 0 , 0 , 0 ), // #447 {xmm|ymm|zmm, xmm|m64|mem} + ROW(2, 0, 1, 0, 144, 8 , 0 , 0 , 0 , 0 ), // {xmm|ymm|zmm, r64} + ROW(3, 1, 1, 0, 49 , 49 , 58 , 0 , 0 , 0 ), // #449 {xmm, xmm, xmm|m128|mem|i8|u8} + ROW(3, 1, 1, 0, 49 , 51 , 145, 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8|xmm} + ROW(2, 1, 1, 0, 71 , 96 , 0 , 0 , 0 , 0 ), // #451 {vm32x, xmm|ymm} + ROW(2, 1, 1, 0, 72 , 55 , 0 , 0 , 0 , 0 ), // {vm32y, zmm} + ROW(2, 1, 1, 0, 118, 49 , 0 , 0 , 0 , 0 ), // #453 {vm64x|vm64y, xmm} + ROW(2, 1, 1, 0, 76 , 52 , 0 , 0 , 0 , 0 ), // {vm64z, ymm} + ROW(3, 1, 1, 0, 49 , 49 , 50 , 0 , 0 , 0 ), // #455 {xmm, xmm, xmm|m128|mem} + ROW(3, 1, 1, 0, 49 , 51 , 49 , 0 , 0 , 0 ), // {xmm, m128|mem, xmm} + ROW(1, 1, 0, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #457 {} + ROW(2, 1, 0, 1, 36 , 10 , 0 , 0 , 0 , 0 ), // #458 {, i8|u8} + ROW(2, 1, 0, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // #459 {r16|m16|mem, r16} + ROW(3, 1, 1, 1, 49 , 50 , 146, 0 , 0 , 0 ), // #460 {xmm, xmm|m128|mem, } + ROW(2, 1, 1, 0, 120, 147, 0 , 0 , 0 , 0 ), // #461 {bnd, mib} + ROW(2, 1, 1, 0, 120, 122, 0 , 0 , 0 , 0 ), // #462 {bnd, mem} + ROW(2, 1, 1, 0, 147, 120, 0 , 0 , 0 , 0 ), // #463 {mib, bnd} + ROW(1, 1, 1, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #464 {} + ROW(2, 1, 1, 2, 38 , 39 , 0 , 0 , 0 , 0 ), // #465 {, } + ROW(1, 1, 1, 0, 122, 0 , 0 , 0 , 0 , 0 ), // #466 {mem} + ROW(1, 1, 1, 0, 31 , 0 , 0 , 0 , 0 , 0 ), // #467 {m64|mem} + ROW(0, 0, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #468 {} + ROW(1, 1, 1, 1, 148, 0 , 0 , 0 , 0 , 0 ), // #469 {} + ROW(3, 1, 1, 0, 49 , 64 , 10 , 0 , 0 , 0 ), // #470 {xmm, xmm|m64|mem, i8|u8} + ROW(3, 1, 1, 0, 49 , 117, 10 , 0 , 0 , 0 ), // #471 {xmm, xmm|m32|mem, i8|u8} + ROW(5, 0, 1, 4, 51 , 40 , 41 , 149, 150, 0 ), // #472 {m128|mem, , , , } + ROW(5, 1, 1, 4, 31 , 38 , 39 , 126, 151, 0 ), // #473 {m64|mem, , , , } + ROW(4, 1, 1, 4, 39 , 151, 126, 38 , 0 , 0 ), // #474 {, , , } + ROW(2, 0, 1, 2, 40 , 41 , 0 , 0 , 0 , 0 ), // #475 {, } + ROW(2, 1, 1, 0, 61 , 50 , 0 , 0 , 0 , 0 ), // #476 {mm, xmm|m128|mem} + ROW(2, 1, 1, 0, 49 , 62 , 0 , 0 , 0 , 0 ), // #477 {xmm, mm|m64|mem} + ROW(2, 1, 1, 0, 61 , 64 , 0 , 0 , 0 , 0 ), // #478 {mm, xmm|m64|mem} + ROW(2, 1, 1, 2, 37 , 36 , 0 , 0 , 0 , 0 ), // #479 {, } + ROW(1, 1, 1, 1, 39 , 0 , 0 , 0 , 0 , 0 ), // #480 {} + ROW(2, 1, 1, 0, 12 , 10 , 0 , 0 , 0 , 0 ), // #481 {i16|u16, i8|u8} + ROW(3, 1, 1, 0, 28 , 49 , 10 , 0 , 0 , 0 ), // #482 {r32|m32|mem, xmm, i8|u8} + ROW(1, 1, 1, 0, 109, 0 , 0 , 0 , 0 , 0 ), // #483 {m80|mem} + ROW(1, 1, 1, 0, 152, 0 , 0 , 0 , 0 , 0 ), // #484 {m16|m32} + ROW(1, 1, 1, 0, 153, 0 , 0 , 0 , 0 , 0 ), // #485 {m16|m32|m64} + ROW(1, 1, 1, 0, 154, 0 , 0 , 0 , 0 , 0 ), // #486 {m32|m64|m80|st} + ROW(1, 1, 1, 0, 21 , 0 , 0 , 0 , 0 , 0 ), // #487 {m16|mem} + ROW(1, 1, 1, 0, 155, 0 , 0 , 0 , 0 , 0 ), // #488 {ax|m16|mem} + ROW(1, 0, 1, 0, 122, 0 , 0 , 0 , 0 , 0 ), // #489 {mem} + ROW(2, 1, 1, 1, 10 , 39 , 0 , 0 , 0 , 0 ), // #490 {i8|u8, } + ROW(2, 1, 1, 0, 156, 157, 0 , 0 , 0 , 0 ), // #491 {al|ax|eax, i8|u8|dx} + ROW(2, 1, 1, 0, 158, 159, 0 , 0 , 0 , 0 ), // #492 {es:[memBase|zdi|m8|m16|m32], dx} + ROW(1, 1, 1, 0, 10 , 0 , 0 , 0 , 0 , 0 ), // #493 {i8|u8} + ROW(0, 1, 0, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #494 {} + ROW(3, 1, 1, 0, 86 , 86 , 86 , 0 , 0 , 0 ), // #495 {k, k, k} + ROW(2, 1, 1, 0, 86 , 86 , 0 , 0 , 0 , 0 ), // #496 {k, k} + ROW(3, 1, 1, 0, 86 , 86 , 10 , 0 , 0 , 0 ), // #497 {k, k, i8|u8} + ROW(1, 1, 1, 1, 160, 0 , 0 , 0 , 0 , 0 ), // #498 {} + ROW(1, 1, 1, 0, 30 , 0 , 0 , 0 , 0 , 0 ), // #499 {m32|mem} + ROW(1, 0, 1, 0, 57 , 0 , 0 , 0 , 0 , 0 ), // #500 {m512|mem} + ROW(1, 1, 1, 0, 27 , 0 , 0 , 0 , 0 , 0 ), // #501 {r16|m16|mem} + ROW(3, 1, 1, 1, 49 , 49 , 161, 0 , 0 , 0 ), // #502 {xmm, xmm, } + ROW(3, 1, 1, 1, 61 , 61 , 162, 0 , 0 , 0 ), // #503 {mm, mm, } + ROW(3, 1, 1, 3, 163, 126, 38 , 0 , 0 , 0 ), // #504 {, , } + ROW(2, 1, 1, 0, 61 , 49 , 0 , 0 , 0 , 0 ), // #505 {mm, xmm} + ROW(2, 1, 1, 0, 6 , 49 , 0 , 0 , 0 , 0 ), // #506 {r32, xmm} + ROW(2, 1, 1, 0, 31 , 61 , 0 , 0 , 0 , 0 ), // #507 {m64|mem, mm} + ROW(2, 1, 1, 0, 49 , 61 , 0 , 0 , 0 , 0 ), // #508 {xmm, mm} + ROW(2, 1, 1, 2, 39 , 126, 0 , 0 , 0 , 0 ), // #509 {, } + ROW(3, 1, 1, 3, 39 , 126, 151, 0 , 0 , 0 ), // #510 {, , } + ROW(2, 1, 1, 0, 164, 156, 0 , 0 , 0 , 0 ), // #511 {u8|dx, al|ax|eax} + ROW(2, 1, 1, 0, 159, 165, 0 , 0 , 0 , 0 ), // #512 {dx, ds:[memBase|zsi|m8|m16|m32]} + ROW(6, 1, 1, 3, 49 , 50 , 10 , 126, 39 , 38 ), // #513 {xmm, xmm|m128|mem, i8|u8, , , } + ROW(6, 1, 1, 3, 49 , 50 , 10 , 146, 39 , 38 ), // #514 {xmm, xmm|m128|mem, i8|u8, , , } + ROW(4, 1, 1, 1, 49 , 50 , 10 , 126, 0 , 0 ), // #515 {xmm, xmm|m128|mem, i8|u8, } + ROW(4, 1, 1, 1, 49 , 50 , 10 , 146, 0 , 0 ), // #516 {xmm, xmm|m128|mem, i8|u8, } + ROW(3, 1, 1, 0, 132, 49 , 10 , 0 , 0 , 0 ), // #517 {r32|m8|mem, xmm, i8|u8} + ROW(3, 0, 1, 0, 29 , 49 , 10 , 0 , 0 , 0 ), // #518 {r64|m64|mem, xmm, i8|u8} + ROW(3, 1, 1, 0, 49 , 132, 10 , 0 , 0 , 0 ), // #519 {xmm, r32|m8|mem, i8|u8} + ROW(3, 1, 1, 0, 49 , 28 , 10 , 0 , 0 , 0 ), // #520 {xmm, r32|m32|mem, i8|u8} + ROW(3, 0, 1, 0, 49 , 29 , 10 , 0 , 0 , 0 ), // #521 {xmm, r64|m64|mem, i8|u8} + ROW(3, 1, 1, 0, 63 , 111, 10 , 0 , 0 , 0 ), // #522 {mm|xmm, r32|m16|mem, i8|u8} + ROW(2, 1, 1, 0, 6 , 63 , 0 , 0 , 0 , 0 ), // #523 {r32, mm|xmm} + ROW(2, 1, 1, 0, 49 , 10 , 0 , 0 , 0 , 0 ), // #524 {xmm, i8|u8} + ROW(1, 0, 1, 0, 136, 0 , 0 , 0 , 0 , 0 ), // #525 {r32|r64} + ROW(3, 1, 1, 3, 38 , 39 , 126, 0 , 0 , 0 ), // #526 {, , } + ROW(1, 1, 1, 0, 1 , 0 , 0 , 0 , 0 , 0 ), // #527 {r8lo|r8hi|m8|mem} + ROW(3, 0, 1, 0, 166, 166, 166, 0 , 0 , 0 ), // #528 {tmm, tmm, tmm} + ROW(2, 0, 1, 0, 166, 167, 0 , 0 , 0 , 0 ), // #529 {tmm, tmem} + ROW(2, 0, 1, 0, 167, 166, 0 , 0 , 0 , 0 ), // #530 {tmem, tmm} + ROW(1, 0, 1, 0, 166, 0 , 0 , 0 , 0 , 0 ), // #531 {tmm} + ROW(3, 1, 1, 2, 6 , 38 , 39 , 0 , 0 , 0 ), // #532 {r32, , } + ROW(6, 1, 1, 0, 55 , 55 , 55 , 55 , 55 , 51 ), // #533 {zmm, zmm, zmm, zmm, zmm, m128|mem} + ROW(6, 1, 1, 0, 49 , 49 , 49 , 49 , 49 , 51 ), // #534 {xmm, xmm, xmm, xmm, xmm, m128|mem} + ROW(3, 1, 1, 0, 49 , 49 , 64 , 0 , 0 , 0 ), // #535 {xmm, xmm, xmm|m64|mem} + ROW(3, 1, 1, 0, 49 , 49 , 119, 0 , 0 , 0 ), // #536 {xmm, xmm, xmm|m16|mem} + ROW(3, 1, 1, 0, 49 , 49 , 117, 0 , 0 , 0 ), // #537 {xmm, xmm, xmm|m32|mem} + ROW(2, 1, 1, 0, 96 , 21 , 0 , 0 , 0 , 0 ), // #538 {xmm|ymm, m16|mem} + ROW(2, 1, 1, 0, 52 , 51 , 0 , 0 , 0 , 0 ), // #539 {ymm, m128|mem} + ROW(2, 1, 1, 0, 168, 64 , 0 , 0 , 0 , 0 ), // #540 {ymm|zmm, xmm|m64|mem} + ROW(2, 1, 1, 0, 168, 51 , 0 , 0 , 0 , 0 ), // #541 {ymm|zmm, m128|mem} + ROW(2, 1, 1, 0, 55 , 54 , 0 , 0 , 0 , 0 ), // #542 {zmm, m256|mem} + ROW(2, 1, 1, 0, 144, 117, 0 , 0 , 0 , 0 ), // #543 {xmm|ymm|zmm, m32|mem|xmm} + ROW(4, 1, 1, 0, 115, 49 , 64 , 10 , 0 , 0 ), // #544 {xmm|k, xmm, xmm|m64|mem, i8|u8} + ROW(4, 1, 1, 0, 86 , 49 , 119, 10 , 0 , 0 ), // #545 {k, xmm, xmm|m16|mem, i8|u8} + ROW(4, 1, 1, 0, 115, 49 , 117, 10 , 0 , 0 ), // #546 {xmm|k, xmm, xmm|m32|mem, i8|u8} + ROW(2, 1, 1, 0, 49 , 169, 0 , 0 , 0 , 0 ), // #547 {xmm, xmm|m128|ymm|m256|zmm|m512} + ROW(3, 1, 1, 0, 50 , 168, 10 , 0 , 0 , 0 ), // #548 {xmm|m128|mem, ymm|zmm, i8|u8} + ROW(4, 1, 1, 0, 49 , 49 , 64 , 10 , 0 , 0 ), // #549 {xmm, xmm, xmm|m64|mem, i8|u8} + ROW(4, 1, 1, 0, 49 , 49 , 117, 10 , 0 , 0 ), // #550 {xmm, xmm, xmm|m32|mem, i8|u8} + ROW(3, 1, 1, 0, 86 , 169, 10 , 0 , 0 , 0 ), // #551 {k, xmm|m128|ymm|m256|zmm|m512, i8|u8} + ROW(3, 1, 1, 0, 86 , 64 , 10 , 0 , 0 , 0 ), // #552 {k, xmm|m64|mem, i8|u8} + ROW(3, 1, 1, 0, 86 , 119, 10 , 0 , 0 , 0 ), // #553 {k, xmm|m16|mem, i8|u8} + ROW(3, 1, 1, 0, 86 , 117, 10 , 0 , 0 , 0 ), // #554 {k, xmm|m32|mem, i8|u8} + ROW(1, 1, 1, 0, 72 , 0 , 0 , 0 , 0 , 0 ), // #555 {vm32y} + ROW(1, 1, 1, 0, 73 , 0 , 0 , 0 , 0 , 0 ), // #556 {vm32z} + ROW(1, 1, 1, 0, 76 , 0 , 0 , 0 , 0 , 0 ), // #557 {vm64z} + ROW(4, 1, 1, 0, 49 , 49 , 119, 10 , 0 , 0 ), // #558 {xmm, xmm, xmm|m16|mem, i8|u8} + ROW(4, 1, 1, 0, 55 , 55 , 53 , 10 , 0 , 0 ), // #559 {zmm, zmm, ymm|m256|mem, i8|u8} + ROW(2, 1, 1, 0, 6 , 96 , 0 , 0 , 0 , 0 ), // #560 {r32, xmm|ymm} + ROW(2, 1, 1, 0, 144, 170, 0 , 0 , 0 , 0 ), // #561 {xmm|ymm|zmm, xmm|m8|mem|r32} + ROW(2, 1, 1, 0, 144, 171, 0 , 0 , 0 , 0 ), // #562 {xmm|ymm|zmm, xmm|m32|mem|r32} + ROW(2, 1, 1, 0, 144, 86 , 0 , 0 , 0 , 0 ), // #563 {xmm|ymm|zmm, k} + ROW(2, 1, 1, 0, 144, 172, 0 , 0 , 0 , 0 ), // #564 {xmm|ymm|zmm, xmm|m16|mem|r32} + ROW(3, 1, 1, 0, 111, 49 , 10 , 0 , 0 , 0 ), // #565 {r32|m16|mem, xmm, i8|u8} + ROW(4, 1, 1, 0, 49 , 49 , 132, 10 , 0 , 0 ), // #566 {xmm, xmm, r32|m8|mem, i8|u8} + ROW(4, 1, 1, 0, 49 , 49 , 28 , 10 , 0 , 0 ), // #567 {xmm, xmm, r32|m32|mem, i8|u8} + ROW(4, 0, 1, 0, 49 , 49 , 29 , 10 , 0 , 0 ), // #568 {xmm, xmm, r64|m64|mem, i8|u8} + ROW(4, 1, 1, 0, 49 , 49 , 111, 10 , 0 , 0 ), // #569 {xmm, xmm, r32|m16|mem, i8|u8} + ROW(2, 1, 1, 0, 86 , 144, 0 , 0 , 0 , 0 ), // #570 {k, xmm|ymm|zmm} + ROW(2, 1, 1, 0, 52 , 49 , 0 , 0 , 0 , 0 ), // #571 {ymm, xmm} + ROW(2, 1, 1, 0, 52 , 52 , 0 , 0 , 0 , 0 ), // #572 {ymm, ymm} + ROW(3, 1, 1, 0, 52 , 52 , 49 , 0 , 0 , 0 ), // #573 {ymm, ymm, xmm} + ROW(3, 1, 1, 2, 122, 38 , 39 , 0 , 0 , 0 ), // #574 {mem, , } + ROW(3, 0, 1, 2, 122, 38 , 39 , 0 , 0 , 0 ) // #575 {mem, , } }; #undef ROW @@ -3584,7 +5320,7 @@ const InstDB::OpSignature InstDB::_opSignatureTable[] = { ROW(F(ImmI16) | F(ImmU16), 0x00), ROW(F(RegGpd) | F(Mem32), 0x00), ROW(F(ImmI32) | F(ImmU32), 0x00), - ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64), 0x00), + ROW(F(RegGpq) | F(Mem64), 0x00), ROW(F(ImmI32), 0x00), ROW(F(RegSReg) | F(RegCReg) | F(RegDReg) | F(MemUnspecified) | F(Mem64) | F(ImmI64) | F(ImmU64), 0x00), ROW(F(MemUnspecified) | F(Mem8), 0x00), @@ -3593,27 +5329,26 @@ const InstDB::OpSignature InstDB::_opSignatureTable[] = { ROW(F(MemUnspecified) | F(Mem16), 0x00), ROW(F(RegSReg), 0x00), ROW(F(RegCReg) | F(RegDReg), 0x00), - ROW(F(RegGpq) | F(ImmI32), 0x00), - ROW(F(RegGpw) | F(RegGpd) | F(RegGpq) | F(MemUnspecified) | F(Mem16) | F(Mem32) | F(Mem64), 0x00), + ROW(F(ImmI8) | F(ImmI32), 0x00), + ROW(F(RegGpw) | F(RegGpd) | F(Mem16) | F(Mem32), 0x00), ROW(F(ImmI8), 0x00), ROW(F(RegGpw) | F(MemUnspecified) | F(Mem16), 0x00), ROW(F(RegGpd) | F(MemUnspecified) | F(Mem32), 0x00), + ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64), 0x00), ROW(F(MemUnspecified) | F(Mem32), 0x00), ROW(F(MemUnspecified) | F(Mem64), 0x00), - ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(RegGpd) | F(RegGpq) | F(MemUnspecified) | F(Mem8) | F(Mem16) | F(Mem32) | F(Mem64), 0x00), - ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI32) | F(ImmU32), 0x00), + ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(RegGpd) | F(Mem8) | F(Mem16) | F(Mem32), 0x00), + ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmU8) | F(ImmI32) | F(ImmU32), 0x00), + ROW(F(Mem64), 0x00), + ROW(F(ImmI8) | F(ImmU8) | F(ImmI32), 0x00), ROW(F(RegGpw) | F(FlagImplicit), 0x01), ROW(F(RegGpw) | F(FlagImplicit), 0x04), ROW(F(RegGpd) | F(FlagImplicit), 0x04), ROW(F(RegGpd) | F(FlagImplicit), 0x01), ROW(F(RegGpq) | F(FlagImplicit), 0x04), ROW(F(RegGpq) | F(FlagImplicit), 0x01), - ROW(F(RegGpw) | F(MemUnspecified) | F(Mem16) | F(ImmI8) | F(ImmI16), 0x00), - ROW(F(RegGpd) | F(MemUnspecified) | F(Mem32) | F(ImmI8) | F(ImmI32), 0x00), - ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmI32), 0x00), ROW(F(ImmI8) | F(ImmI16) | F(ImmU16), 0x00), ROW(F(ImmI8) | F(ImmI32) | F(ImmU32), 0x00), - ROW(F(ImmI8) | F(ImmI32), 0x00), ROW(F(ImmI64) | F(ImmU64), 0x00), ROW(F(RegGpbLo), 0x01), ROW(F(RegGpw), 0x01), @@ -3632,99 +5367,96 @@ const InstDB::OpSignature InstDB::_opSignatureTable[] = { ROW(F(RegYmm) | F(MemUnspecified) | F(Mem256) | F(ImmI8) | F(ImmU8), 0x00), ROW(F(RegZmm) | F(MemUnspecified) | F(Mem512) | F(ImmI8) | F(ImmU8), 0x00), ROW(F(RegMm), 0x00), - ROW(F(RegGpq) | F(RegMm) | F(MemUnspecified) | F(Mem64), 0x00), + ROW(F(RegMm) | F(MemUnspecified) | F(Mem64), 0x00), ROW(F(RegXmm) | F(RegMm), 0x00), ROW(F(RegXmm) | F(MemUnspecified) | F(Mem64), 0x00), - ROW(F(RegGpw) | F(RegGpd) | F(RegGpq) | F(Mem16) | F(Mem32) | F(Mem64), 0x00), + ROW(F(RegSReg), 0x1A), + ROW(F(RegSReg), 0x60), + ROW(F(RegGpw) | F(Mem16) | F(ImmI8) | F(ImmI16), 0x00), + ROW(F(RegGpd) | F(Mem32) | F(ImmI32) | F(ImmU32), 0x00), + ROW(F(RegGpq) | F(Mem64) | F(ImmI32), 0x00), + ROW(F(RegSReg), 0x1E), ROW(F(Vm32x), 0x00), ROW(F(Vm32y), 0x00), ROW(F(Vm32z), 0x00), ROW(F(Vm64x), 0x00), ROW(F(Vm64y), 0x00), ROW(F(Vm64z), 0x00), - ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40), - ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80), - ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40), - ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80), - ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40), - ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80), - ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40), - ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80), + ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemDs), 0x40), + ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemEs), 0x80), + ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemDs), 0x40), + ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemEs), 0x80), + ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40), + ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemEs), 0x80), + ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemDs), 0x40), + ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemEs), 0x80), ROW(F(RegGpbLo) | F(FlagImplicit), 0x01), - ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40), - ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40), - ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40), - ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x40), - ROW(F(RegGpw) | F(RegGpq) | F(Mem16) | F(Mem64), 0x00), - ROW(F(RegSReg), 0x1A), - ROW(F(RegSReg), 0x60), - ROW(F(RegGpw) | F(RegGpq) | F(Mem16) | F(Mem64) | F(ImmI8) | F(ImmI16) | F(ImmI32), 0x00), - ROW(F(RegGpd) | F(Mem32) | F(ImmI32) | F(ImmU32), 0x00), - ROW(F(RegSReg), 0x1E), - ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80), - ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80), - ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80), - ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemEs) | F(FlagImplicit), 0x80), + ROW(F(RegKReg), 0x00), + ROW(F(RegKReg) | F(MemUnspecified) | F(Mem64), 0x00), + ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemDs), 0x40), + ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemDs), 0x40), + ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40), + ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemDs), 0x40), + ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemEs), 0x80), + ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemEs), 0x80), + ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemEs), 0x80), + ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemEs), 0x80), ROW(F(RegXmm) | F(RegYmm), 0x00), ROW(F(ImmI4) | F(ImmU4), 0x00), + ROW(F(RegGpw) | F(RegGpd) | F(MemUnspecified) | F(Mem16) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00), + ROW(F(ImmI32) | F(ImmI64) | F(Rel32), 0x00), + ROW(F(RegGpw) | F(RegGpd), 0x00), ROW(F(Mem32) | F(Mem64), 0x00), ROW(F(RegSt), 0x01), ROW(F(RegSt), 0x00), - ROW(F(MemUnspecified) | F(Mem48), 0x00), + ROW(F(ImmI32) | F(ImmI64) | F(Rel8) | F(Rel32), 0x00), + ROW(F(RegGpd) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00), + ROW(F(ImmI16), 0x00), + ROW(F(ImmI16) | F(ImmI32), 0x00), + ROW(F(MemUnspecified) | F(Mem32) | F(Mem48), 0x00), ROW(F(MemUnspecified) | F(Mem80), 0x00), + ROW(F(MemUnspecified) | F(Mem48), 0x00), + ROW(F(RegGpd) | F(MemUnspecified) | F(Mem16), 0x00), + ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(Mem8) | F(Mem16), 0x00), + ROW(F(RegGpbLo) | F(RegGpw) | F(Mem8) | F(Mem16), 0x00), ROW(F(RegGpbLo) | F(ImmI8) | F(ImmU8), 0x02), ROW(F(RegXmm) | F(RegKReg), 0x00), ROW(F(RegYmm) | F(RegKReg), 0x00), - ROW(F(RegKReg), 0x00), ROW(F(RegXmm) | F(MemUnspecified) | F(Mem32), 0x00), ROW(F(Vm64x) | F(Vm64y), 0x00), - ROW(F(RegGpq) | F(RegXmm) | F(MemUnspecified) | F(Mem64), 0x00), ROW(F(RegXmm) | F(MemUnspecified) | F(Mem16), 0x00), ROW(F(RegBnd), 0x00), ROW(F(RegBnd) | F(MemUnspecified), 0x00), ROW(F(MemUnspecified), 0x00), - ROW(F(RegGpw) | F(RegGpd) | F(Mem16) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00), - ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00), - ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(RegGpd) | F(Mem8) | F(Mem16) | F(Mem32), 0x00), - ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpq) | F(Mem8) | F(Mem64), 0x00), - ROW(F(RegGpw) | F(RegGpd), 0x00), + ROW(F(RegGpbLo) | F(RegGpq) | F(Mem8) | F(Mem64), 0x00), ROW(F(MemUnspecified) | F(Mem512) | F(FlagMemBase) | F(FlagMemEs), 0x00), ROW(F(RegSt) | F(Mem32) | F(Mem64), 0x00), ROW(F(RegGpd) | F(FlagImplicit), 0x02), ROW(F(RegGpd) | F(RegGpq) | F(FlagImplicit), 0x01), - ROW(F(ImmI32) | F(ImmI64) | F(Rel8) | F(Rel32), 0x00), - ROW(F(ImmI32) | F(ImmI64) | F(Rel32), 0x00), ROW(F(RegGpw) | F(RegGpd) | F(FlagImplicit), 0x02), ROW(F(ImmI32) | F(ImmI64) | F(Rel8), 0x00), ROW(F(RegGpd) | F(RegGpq) | F(FlagImplicit), 0x02), - ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI32) | F(ImmI64) | F(Rel8) | F(Rel32), 0x00), - ROW(F(RegGpd) | F(MemUnspecified) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00), ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem8), 0x00), ROW(F(RegGpd) | F(MemUnspecified) | F(Mem8), 0x00), ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem32), 0x00), - ROW(F(RegGpq) | F(RegKReg) | F(MemUnspecified) | F(Mem64), 0x00), ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem16), 0x00), - ROW(F(RegGpd) | F(MemUnspecified) | F(Mem16), 0x00), - ROW(F(ImmI16), 0x00), - ROW(F(ImmI16) | F(ImmI32), 0x00), - ROW(F(MemUnspecified) | F(Mem32) | F(Mem48) | F(Mem80), 0x00), + ROW(F(MemUnspecified) | F(Mem8) | F(Mem16) | F(Mem32) | F(Mem48) | F(Mem64) | F(Mem80) | F(Mem128) | F(Mem256) | F(Mem512) | F(Mem1024), 0x00), ROW(F(RegGpd) | F(RegGpq), 0x00), - ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(Mem8) | F(Mem16), 0x00), - ROW(F(RegMm) | F(MemUnspecified) | F(Mem64), 0x00), ROW(F(RegMm) | F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmU8), 0x00), ROW(F(RegMm) | F(MemUnspecified) | F(Mem32), 0x00), ROW(F(ImmU16), 0x00), + ROW(F(RegGpw) | F(RegGpd) | F(MemUnspecified) | F(Mem16), 0x00), + ROW(F(RegGpq) | F(MemUnspecified) | F(Mem16), 0x00), + ROW(F(MemUnspecified) | F(FlagMemBase) | F(FlagMemDs), 0x00), ROW(F(RegXmm) | F(RegYmm) | F(Mem128) | F(Mem256), 0x00), + ROW(F(RegXmm) | F(RegYmm) | F(RegZmm), 0x00), ROW(F(RegXmm) | F(ImmI8) | F(ImmU8), 0x00), ROW(F(RegXmm) | F(FlagImplicit), 0x01), ROW(F(MemUnspecified) | F(FlagMib), 0x00), - ROW(F(RegGpw) | F(RegGpd) | F(RegGpq), 0x00), - ROW(F(MemUnspecified) | F(Mem8) | F(Mem16) | F(Mem32) | F(Mem48) | F(Mem64) | F(Mem80) | F(Mem128) | F(Mem256) | F(Mem512) | F(Mem1024), 0x00), ROW(F(MemUnspecified) | F(Mem512) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x01), ROW(F(RegGpq) | F(FlagImplicit), 0x02), ROW(F(RegGpq) | F(FlagImplicit), 0x08), ROW(F(RegGpd) | F(FlagImplicit), 0x08), - ROW(F(RegGpd) | F(RegGpq) | F(MemUnspecified) | F(Mem32) | F(Mem64), 0x00), ROW(F(Mem16) | F(Mem32), 0x00), ROW(F(Mem16) | F(Mem32) | F(Mem64), 0x00), ROW(F(RegSt) | F(Mem32) | F(Mem64) | F(Mem80), 0x00), @@ -3739,12 +5471,9 @@ const InstDB::OpSignature InstDB::_opSignatureTable[] = { ROW(F(MemUnspecified) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x01), ROW(F(RegGpw) | F(ImmU8), 0x04), ROW(F(Mem8) | F(Mem16) | F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40), - ROW(F(RegGpw) | F(RegGpd) | F(RegGpq) | F(MemUnspecified) | F(Mem16), 0x00), ROW(F(RegTmm), 0x00), ROW(F(MemUnspecified) | F(FlagTMem), 0x00), - ROW(F(MemUnspecified) | F(FlagMemBase) | F(FlagMemDs), 0x00), ROW(F(RegYmm) | F(RegZmm), 0x00), - ROW(F(RegXmm) | F(RegYmm) | F(RegZmm), 0x00), ROW(F(RegXmm) | F(RegYmm) | F(RegZmm) | F(Mem128) | F(Mem256) | F(Mem512), 0x00), ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem8), 0x00), ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem32), 0x00), @@ -3762,506 +5491,520 @@ const InstDB::OpSignature InstDB::_opSignatureTable[] = { // ${InstRWInfoTable:Begin} // ------------------- Automatically generated, do not edit ------------------- const uint8_t InstDB::rwInfoIndexA[Inst::_kIdCount] = { - 0, 0, 1, 1, 0, 2, 3, 2, 4, 4, 5, 6, 4, 4, 3, 4, 4, 4, 4, 7, 0, 2, 0, 4, 4, 4, - 4, 8, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 13, - 14, 9, 9, 0, 15, 16, 16, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 18, 0, 0, 19, 0, 0, 0, 0, 0, 20, 21, 0, 22, 23, 24, 7, 25, - 25, 25, 24, 26, 7, 24, 27, 28, 29, 30, 31, 32, 33, 25, 25, 7, 27, 28, 33, 34, - 0, 0, 0, 0, 35, 4, 4, 5, 6, 0, 0, 0, 0, 0, 36, 36, 0, 0, 37, 0, 0, 38, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 38, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 38, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 39, 4, - 4, 35, 40, 41, 0, 0, 0, 42, 0, 37, 0, 0, 0, 0, 43, 0, 44, 43, 43, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 48, 49, 50, 51, - 52, 53, 0, 0, 0, 54, 55, 56, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 56, 57, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 59, 0, 60, 0, 61, 0, 60, 0, 60, 0, 60, - 0, 0, 0, 0, 0, 62, 63, 63, 63, 58, 60, 0, 0, 0, 9, 0, 0, 4, 4, 5, 6, 0, 0, 4, - 4, 5, 6, 0, 0, 64, 65, 66, 66, 67, 47, 24, 36, 67, 52, 66, 66, 68, 69, 69, 70, - 71, 71, 72, 72, 59, 59, 67, 59, 59, 71, 71, 73, 48, 52, 74, 75, 7, 7, 76, 77, - 9, 66, 66, 77, 0, 35, 4, 4, 5, 6, 0, 78, 0, 0, 79, 0, 2, 4, 4, 80, 81, 9, 9, - 9, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 82, 3, 0, 0, 0, 3, 3, - 4, 3, 0, 0, 3, 3, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 83, 27, 27, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 27, 82, 82, 82, 27, 27, 82, 82, 82, 3, 3, 3, 84, 3, 3, 3, - 27, 27, 0, 0, 0, 0, 3, 3, 4, 4, 3, 3, 4, 4, 4, 4, 3, 3, 4, 4, 85, 86, 87, 24, - 24, 24, 86, 86, 87, 24, 24, 24, 86, 4, 3, 82, 3, 3, 4, 3, 3, 0, 0, 0, 9, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 3, 3, 3, 3, 88, 3, 3, 0, 3, 3, - 3, 88, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 27, 89, 0, 3, 3, 4, 3, 90, 90, 4, 90, 0, - 0, 0, 0, 0, 0, 0, 3, 91, 7, 92, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, - 0, 0, 0, 91, 91, 0, 0, 0, 0, 0, 0, 7, 92, 0, 0, 91, 91, 0, 0, 2, 94, 0, 0, 0, + 0, 0, 1, 2, 1, 2, 0, 3, 4, 3, 5, 5, 6, 7, 5, 5, 4, 5, 5, 5, 5, 8, 0, 3, 0, 5, + 5, 5, 5, 2, 9, 2, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 10, 10, 10, 10, 11, 11, + 11, 12, 12, 13, 14, 15, 10, 10, 0, 16, 17, 17, 17, 0, 0, 0, 18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 21, 22, 0, 23, 24, 25, 8, 26, 26, + 26, 25, 27, 8, 25, 28, 29, 30, 31, 32, 33, 34, 26, 26, 8, 28, 29, 34, 35, 0, + 0, 0, 0, 36, 5, 5, 6, 7, 0, 0, 0, 0, 0, 37, 37, 0, 0, 38, 0, 0, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 39, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 40, 5, 5, 36, + 41, 42, 0, 0, 0, 43, 0, 38, 0, 0, 0, 0, 44, 0, 45, 0, 44, 44, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 48, 49, 50, 51, 52, 53, + 54, 0, 0, 0, 55, 56, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 60, 0, 2, 0, 61, 0, 2, 0, 2, 0, 2, 0, 0, + 0, 0, 0, 62, 63, 63, 63, 59, 2, 0, 0, 0, 10, 0, 0, 5, 5, 6, 7, 0, 0, 5, 5, 6, + 7, 0, 0, 64, 65, 66, 66, 67, 48, 25, 37, 67, 53, 66, 66, 68, 69, 69, 70, 71, + 71, 72, 72, 60, 60, 67, 60, 60, 71, 71, 73, 49, 53, 74, 75, 8, 8, 76, 77, 10, + 66, 66, 77, 0, 36, 5, 5, 6, 7, 0, 78, 0, 0, 79, 0, 3, 5, 5, 80, 81, 10, 10, 10, + 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4, 82, 4, 0, 0, 0, 4, 4, 5, + 4, 0, 0, 4, 4, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 83, 28, 28, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 28, 82, 82, 82, 28, 28, 82, 82, 82, 4, 4, 4, 84, 4, 4, 4, 28, + 28, 0, 0, 0, 0, 4, 4, 5, 5, 4, 4, 5, 5, 5, 5, 4, 4, 5, 5, 85, 86, 87, 25, 25, + 25, 86, 86, 87, 25, 25, 25, 86, 5, 4, 82, 4, 4, 5, 4, 4, 0, 0, 0, 10, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 88, 4, 4, 0, 4, + 4, 4, 88, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 28, 89, 0, 4, 4, 5, 4, 90, 90, 5, 90, + 0, 0, 0, 0, 0, 0, 0, 4, 91, 8, 92, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, + 0, 0, 0, 0, 0, 91, 91, 0, 0, 0, 0, 0, 0, 8, 92, 0, 0, 91, 91, 0, 0, 3, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 4, 4, 0, 91, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 7, 26, 92, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 2, 4, 4, 5, 6, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, 15, 0, 96, 96, 0, 97, 0, 0, 9, 9, 20, 21, 98, 98, 0, - 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 28, 100, 101, 100, 101, 99, 28, 100, 101, - 100, 101, 102, 103, 0, 0, 0, 0, 0, 0, 20, 104, 21, 105, 105, 106, 77, 9, 0, 77, - 107, 108, 107, 9, 107, 9, 109, 110, 106, 109, 110, 109, 110, 9, 9, 9, 106, - 0, 77, 106, 9, 106, 9, 108, 107, 0, 28, 0, 28, 0, 111, 0, 111, 0, 0, 0, 0, 0, - 33, 33, 107, 9, 107, 9, 109, 110, 109, 110, 9, 9, 9, 106, 9, 106, 28, 28, 111, - 111, 33, 33, 106, 77, 9, 9, 108, 107, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 112, 112, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 5, 0, 91, 0, 0, 91, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 27, 92, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 3, 5, 5, 6, 7, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 96, 96, 0, 97, 0, 0, + 0, 10, 10, 21, 22, 98, 98, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 99, 99, 0, 0, 0, 0, 0, 0, 100, 29, + 101, 102, 101, 102, 100, 29, 101, 102, 101, 102, 103, 104, 0, 0, 0, 0, 0, 0, + 21, 105, 22, 106, 106, 107, 77, 10, 0, 67, 67, 67, 67, 77, 108, 109, 108, 10, + 108, 10, 110, 111, 107, 110, 111, 110, 111, 10, 10, 10, 107, 0, 77, 107, 10, + 107, 10, 109, 108, 0, 29, 0, 29, 0, 112, 0, 112, 0, 0, 0, 0, 0, 34, 34, 108, + 10, 108, 10, 110, 111, 110, 111, 10, 10, 10, 107, 10, 107, 29, 29, 112, 112, 34, + 34, 107, 77, 10, 10, 109, 108, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 113, 113, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 27, 113, 60, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 60, 114, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 28, 114, 2, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 115, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 115, 47, 116, 115, 115, 115, 115, 115, - 115, 115, 115, 0, 117, 117, 0, 71, 71, 118, 119, 67, 67, 67, 67, 120, 71, 121, - 9, 9, 73, 115, 115, 49, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 33, 124, 124, 28, 125, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 0, - 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 60, 60, 114, 60, 7, 7, 7, - 0, 7, 0, 7, 7, 7, 7, 7, 7, 0, 7, 7, 84, 7, 0, 7, 0, 0, 7, 0, 0, 0, 0, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 116, 48, 117, 116, 116, 116, 116, + 116, 116, 116, 116, 0, 118, 118, 0, 71, 71, 119, 120, 67, 67, 67, 67, 121, 71, + 122, 10, 10, 73, 116, 116, 50, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 34, 125, 125, 29, 126, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 106, + 106, 106, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 126, 126, 127, 128, 124, 124, 124, 124, 85, 126, 129, 128, - 127, 127, 128, 129, 128, 127, 128, 130, 131, 106, 106, 106, 130, 127, 128, - 129, 128, 127, 128, 126, 128, 130, 131, 106, 106, 106, 130, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 67, - 132, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 0, 0, 0, 0, 2, 2, 115, 2, 8, 8, 8, 0, 8, 0, 8, 8, 8, 8, 8, 8, + 0, 8, 8, 84, 8, 0, 8, 0, 0, 8, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, + 127, 128, 129, 125, 125, 125, 125, 85, 127, 130, 129, 128, 128, 129, 130, + 129, 128, 129, 131, 132, 107, 107, 107, 131, 128, 129, 130, 129, 128, 129, 127, + 129, 131, 132, 107, 107, 107, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 67, 133, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 112, 112, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 112, 112, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 67, 132, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 20, 104, 21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 133, 134, 133, 134, 0, 135, 0, 136, 0, 0, 0, 2, 4, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 10, 0, 0, 113, 113, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 113, 113, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 67, 133, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 123, 21, 105, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 136, 137, 0, 138, 0, 139, 0, + 0, 0, 3, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const uint8_t InstDB::rwInfoIndexB[Inst::_kIdCount] = { - 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 5, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 0, 4, 8, 1, 0, 9, 0, 0, 0, 10, 10, 10, 0, 0, 11, 0, 0, 10, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 5, 0, 13, 14, 15, 16, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 1, 20, 21, 0, 0, - 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 24, 25, 26, 27, 0, 0, 25, 25, 25, - 25, 25, 25, 25, 25, 28, 29, 29, 28, 0, 0, 0, 24, 25, 24, 25, 0, 25, 24, 24, 24, - 24, 24, 24, 24, 0, 0, 30, 30, 30, 24, 24, 28, 0, 31, 10, 0, 0, 0, 0, 0, 0, 24, - 25, 0, 0, 0, 32, 33, 32, 34, 0, 0, 0, 0, 0, 10, 32, 0, 0, 0, 0, 35, 33, 32, - 35, 34, 24, 25, 24, 25, 0, 29, 29, 29, 29, 0, 0, 0, 25, 10, 10, 32, 32, 0, 0, - 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 21, 36, 0, 20, 37, 38, 0, 39, 40, 0, 0, 0, 0, - 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 41, 42, 41, 42, 43, - 44, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 0, 0, 0, 0, 44, 45, 46, 47, - 48, 45, 46, 47, 48, 0, 0, 0, 0, 49, 50, 51, 41, 42, 43, 44, 41, 42, 43, 44, 52, - 0, 24, 0, 53, 0, 54, 0, 0, 0, 0, 0, 10, 0, 10, 24, 55, 56, 55, 0, 0, 0, 0, - 0, 0, 55, 57, 57, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 4, 8, 1, 0, 9, 0, 0, 0, 10, 10, 10, 0, 0, 11, 0, + 0, 10, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 5, 5, 13, 0, 14, 15, 13, 16, 17, 18, 13, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 1, 21, 22, 0, 0, 0, + 0, 5, 5, 0, 0, 0, 0, 0, 0, 23, 24, 0, 0, 25, 26, 27, 28, 0, 0, 26, 26, 26, 26, + 26, 26, 26, 26, 29, 30, 30, 29, 0, 0, 0, 25, 26, 25, 26, 0, 26, 25, 25, 25, + 25, 25, 25, 25, 0, 0, 31, 31, 31, 25, 25, 29, 0, 32, 10, 0, 0, 0, 0, 0, 0, 25, + 26, 0, 0, 0, 33, 34, 33, 35, 0, 0, 0, 0, 0, 10, 33, 0, 0, 0, 0, 36, 34, 33, 36, + 35, 25, 26, 25, 26, 0, 30, 30, 30, 30, 0, 0, 0, 26, 10, 10, 33, 33, 0, 0, 0, + 20, 5, 5, 0, 0, 0, 0, 0, 0, 0, 22, 37, 0, 21, 38, 39, 0, 40, 41, 0, 0, 0, 0, + 0, 10, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 43, 44, 43, 44, + 45, 46, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 46, 47, 48, + 49, 50, 47, 48, 49, 50, 0, 0, 0, 0, 51, 52, 53, 43, 44, 45, 46, 43, 44, 45, 46, + 54, 0, 25, 0, 55, 0, 56, 0, 0, 0, 0, 0, 10, 0, 10, 25, 57, 58, 57, 0, 0, 0, + 0, 0, 0, 57, 59, 59, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 61, 0, 0, 61, 0, 0, 0, 0, 0, 5, 62, 0, 0, 0, 0, 63, 0, 64, 20, 65, 20, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, - 6, 5, 5, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 69, 70, 0, 3, 3, 71, 22, 72, 73, 0, + 0, 0, 63, 0, 0, 63, 0, 0, 0, 0, 0, 5, 64, 0, 0, 0, 0, 65, 0, 66, 21, 67, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, + 0, 6, 5, 5, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 71, 72, 0, 3, 3, 73, 23, 74, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 74, 39, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 10, - 10, 10, 10, 10, 10, 10, 0, 0, 2, 2, 2, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 81, 80, 81, 81, 81, 80, 80, 82, 83, 0, 84, - 0, 0, 0, 0, 0, 0, 85, 2, 2, 86, 87, 0, 0, 0, 11, 88, 0, 0, 4, 0, 0, 0, 89, 0, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 90, 0, 32, 0, 0, 0, 5, 0, 0, 6, 0, 91, - 4, 0, 91, 4, 5, 5, 32, 19, 92, 80, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 92, - 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 95, 0, 0, 0, 0, - 0, 0, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 56, 97, 0, 0, 0, 0, 98, 99, 98, 99, 3, - 3, 3, 100, 101, 102, 3, 3, 3, 3, 3, 3, 0, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 103, - 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 104, 3, 105, 106, 107, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 108, 0, 0, 0, 0, 0, 0, 0, 109, 0, 110, 0, 111, 0, 111, 0, 112, 113, 114, 115, - 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 112, 113, 114, 0, 0, 3, 3, 3, 3, 100, 111, 102, 3, 117, 3, 55, 55, - 0, 0, 0, 0, 118, 119, 120, 119, 120, 118, 119, 120, 119, 120, 22, 121, 122, 121, - 122, 121, 121, 123, 124, 121, 121, 121, 125, 126, 127, 121, 121, 121, 125, - 126, 127, 121, 121, 121, 125, 126, 127, 121, 122, 128, 128, 129, 130, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 128, 128, 121, 121, 121, 125, 131, 127, 121, - 121, 121, 125, 131, 127, 121, 121, 121, 125, 131, 127, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 128, 128, 128, 128, 129, 130, 121, 122, 121, 121, 121, - 125, 126, 127, 121, 121, 121, 125, 126, 127, 121, 121, 121, 125, 126, 127, - 128, 128, 129, 130, 121, 121, 121, 125, 131, 127, 121, 121, 121, 125, 131, 127, - 121, 121, 121, 132, 131, 133, 128, 128, 129, 130, 134, 134, 134, 78, 135, 136, - 0, 0, 0, 0, 137, 138, 10, 10, 10, 10, 10, 10, 10, 10, 138, 139, 0, 0, 0, 140, - 141, 142, 85, 85, 85, 140, 141, 142, 3, 3, 3, 3, 3, 3, 3, 143, 144, 145, 144, - 145, 143, 144, 145, 144, 145, 102, 0, 53, 58, 146, 146, 3, 3, 3, 100, 101, - 102, 0, 147, 0, 3, 3, 3, 100, 101, 102, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 149, 150, 150, 151, 152, 152, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 155, - 0, 0, 0, 3, 11, 147, 0, 0, 156, 148, 3, 3, 3, 100, 101, 102, 0, 11, 3, 3, 157, - 157, 158, 158, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 103, 3, 0, 0, 0, 0, 0, 0, 3, 128, 104, 104, 3, - 3, 3, 3, 67, 68, 3, 3, 3, 3, 69, 70, 104, 104, 104, 104, 104, 104, 117, 117, 0, - 0, 0, 0, 117, 117, 117, 117, 117, 117, 0, 0, 121, 121, 121, 121, 159, 159, 3, - 3, 3, 121, 3, 3, 121, 121, 128, 128, 160, 160, 160, 3, 160, 3, 121, 121, 121, - 121, 121, 3, 0, 0, 0, 0, 71, 22, 72, 161, 138, 137, 139, 138, 0, 0, 0, 3, 0, - 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 3, 0, 162, 102, 100, 101, 0, 0, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 121, 121, 3, 3, 146, - 146, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 164, 85, 85, - 3, 3, 85, 85, 3, 3, 165, 165, 165, 165, 3, 0, 0, 0, 0, 165, 165, 165, 165, 165, - 165, 3, 3, 121, 121, 121, 3, 165, 165, 3, 3, 121, 121, 121, 3, 3, 104, 85, 85, - 85, 3, 3, 3, 166, 167, 166, 3, 3, 3, 168, 166, 169, 3, 3, 3, 168, 166, 167, - 166, 3, 3, 3, 168, 3, 3, 3, 3, 3, 3, 3, 3, 121, 121, 0, 104, 104, 104, 104, 104, - 104, 104, 104, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 140, 142, 0, 0, 140, - 142, 0, 0, 140, 142, 0, 0, 141, 142, 85, 85, 85, 140, 141, 142, 85, 85, 85, 140, - 141, 142, 85, 85, 140, 142, 0, 0, 140, 142, 0, 0, 140, 142, 0, 0, 141, 142, - 3, 3, 3, 100, 101, 102, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 3, 3, 3, - 3, 3, 3, 0, 0, 0, 140, 141, 142, 93, 3, 3, 3, 100, 101, 102, 0, 0, 0, 0, 0, 3, - 3, 3, 3, 3, 3, 0, 0, 0, 0, 56, 56, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 0, 171, 171, 171, 171, 172, 172, 172, 172, 172, 172, 172, 172, 170, 0, + 0, 0, 0, 0, 76, 40, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 2, 2, 2, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 82, 81, 82, 82, 82, 81, 81, 83, + 84, 0, 85, 0, 0, 0, 0, 0, 0, 86, 2, 2, 87, 88, 0, 0, 0, 11, 89, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 90, 0, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 91, 0, 33, 0, 0, + 0, 5, 0, 0, 6, 0, 92, 4, 0, 92, 4, 5, 5, 33, 20, 93, 81, 93, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 94, 0, 93, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 96, 0, + 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 97, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 98, 0, 0, 0, 0, 99, 100, 99, 100, 3, 3, 3, 101, 102, 103, 3, 3, 3, 3, 3, 3, + 0, 2, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 105, 3, 106, 107, 108, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, + 0, 0, 110, 0, 111, 0, 112, 0, 112, 0, 113, 114, 115, 116, 117, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 114, + 115, 0, 0, 3, 3, 3, 3, 101, 112, 103, 3, 118, 3, 57, 57, 0, 0, 0, 0, 119, 120, + 121, 120, 121, 119, 120, 121, 120, 121, 23, 122, 123, 122, 123, 124, 124, 125, + 126, 124, 124, 124, 127, 128, 129, 124, 124, 124, 127, 128, 129, 124, 124, + 124, 127, 128, 129, 122, 123, 130, 130, 131, 132, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 130, 130, 124, 124, 124, 127, 133, 129, 124, 124, 124, 127, 133, + 129, 124, 124, 124, 127, 133, 129, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 130, 130, 130, 130, 131, 132, 122, 123, 124, 124, 124, 127, 128, 129, 124, + 124, 124, 127, 128, 129, 124, 124, 124, 127, 128, 129, 130, 130, 131, 132, + 124, 124, 124, 127, 133, 129, 124, 124, 124, 127, 133, 129, 124, 124, 124, 134, + 133, 135, 130, 130, 131, 132, 136, 136, 136, 80, 137, 138, 0, 0, 0, 0, 139, + 140, 10, 10, 10, 10, 10, 10, 10, 10, 140, 141, 0, 0, 0, 142, 143, 144, 86, 86, + 86, 142, 143, 144, 3, 3, 3, 3, 3, 3, 3, 145, 146, 147, 146, 147, 145, 146, 147, + 146, 147, 103, 0, 55, 60, 148, 148, 3, 3, 3, 101, 102, 103, 0, 149, 0, 0, 3, + 3, 3, 101, 102, 103, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 152, + 152, 153, 154, 154, 0, 0, 0, 0, 0, 0, 0, 155, 156, 0, 0, 157, 0, 0, 0, 3, 11, + 149, 0, 0, 158, 150, 3, 3, 3, 101, 102, 103, 0, 0, 11, 3, 3, 159, 159, 160, + 160, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 104, 3, 0, 0, 0, 0, 0, 0, 3, 130, 105, 105, 3, 3, 3, 3, 69, 70, + 3, 3, 3, 3, 71, 72, 105, 105, 105, 105, 105, 105, 118, 118, 0, 0, 0, 0, 118, + 118, 118, 118, 118, 118, 0, 0, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 161, 161, 3, 3, 3, 124, 3, 3, 124, 124, 130, + 130, 162, 162, 162, 3, 162, 3, 124, 124, 124, 124, 124, 3, 0, 0, 0, 0, 73, 23, + 74, 163, 140, 139, 141, 140, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 3, 0, 3, 3, 0, 164, 103, 101, 102, 0, 0, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 124, 124, 3, 3, 148, 148, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 166, 86, 86, 3, 3, 86, 86, 3, 3, 167, 167, 167, + 167, 3, 0, 0, 0, 0, 167, 167, 167, 167, 167, 167, 3, 3, 124, 124, 124, 3, 167, + 167, 3, 3, 124, 124, 124, 3, 3, 105, 86, 86, 86, 3, 3, 3, 168, 169, 168, 3, + 3, 3, 170, 168, 171, 3, 3, 3, 170, 168, 169, 168, 3, 3, 3, 170, 3, 3, 3, 3, + 3, 3, 3, 3, 172, 172, 0, 105, 105, 105, 105, 105, 105, 105, 105, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 142, 144, 0, 0, 142, 144, 0, 0, 142, 144, 0, 0, 143, + 144, 86, 86, 86, 142, 143, 144, 86, 86, 86, 142, 143, 144, 86, 86, 142, 144, + 0, 0, 142, 144, 0, 0, 142, 144, 0, 0, 143, 144, 3, 3, 3, 101, 102, 103, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 173, 3, 3, 3, 3, 3, 3, 174, 174, 174, + 3, 3, 0, 0, 0, 142, 143, 144, 94, 3, 3, 3, 101, 102, 103, 0, 0, 0, 0, 0, 3, + 3, 3, 3, 3, 3, 0, 0, 0, 0, 58, 58, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, + 0, 0, 0, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, 175, 0, 0 }; const InstDB::RWInfo InstDB::rwInfoA[] = { - { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=1007x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=1054x] { InstDB::RWInfo::kCategoryGeneric , 0 , { 1 , 0 , 0 , 0 , 0 , 0 } }, // #1 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 1 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #2 [ref=7x] - { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #3 [ref=96x] - { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #4 [ref=55x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #5 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #6 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #7 [ref=26x] - { InstDB::RWInfo::kCategoryGeneric , 7 , { 12, 13, 0 , 0 , 0 , 0 } }, // #8 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #9 [ref=75x] - { InstDB::RWInfo::kCategoryGeneric , 2 , { 5 , 3 , 0 , 0 , 0 , 0 } }, // #10 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 8 , { 10, 3 , 0 , 0 , 0 , 0 } }, // #11 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 9 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #12 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 8 , { 15, 5 , 0 , 0 , 0 , 0 } }, // #13 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #15 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #16 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 17, 0 , 0 , 0 , 0 } }, // #17 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 1 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #18 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 20, 21, 0 , 0 , 0 , 0 } }, // #19 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #20 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #21 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 33, 34, 0 , 0 , 0 , 0 } }, // #22 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 14, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #23 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 10, 7 , 0 , 0 , 0 , 0 } }, // #24 [ref=10x] - { InstDB::RWInfo::kCategoryGeneric , 3 , { 35, 5 , 0 , 0 , 0 , 0 } }, // #25 [ref=5x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #26 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #27 [ref=11x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #28 [ref=9x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 37, 7 , 0 , 0 , 0 , 0 } }, // #29 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 14, { 36, 3 , 0 , 0 , 0 , 0 } }, // #30 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 14, { 37, 3 , 0 , 0 , 0 , 0 } }, // #31 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 36, 9 , 0 , 0 , 0 , 0 } }, // #32 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 11, 9 , 0 , 0 , 0 , 0 } }, // #33 [ref=7x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 38, 39, 0 , 0 , 0 , 0 } }, // #34 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 15, { 1 , 40, 0 , 0 , 0 , 0 } }, // #35 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 16, { 11, 43, 0 , 0 , 0 , 0 } }, // #36 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #37 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 46, 0 , 0 , 0 , 0 } }, // #38 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 50, 0 , 0 , 0 , 0 } }, // #39 [ref=1x] - { InstDB::RWInfo::kCategoryImul , 2 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #40 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 51, 52, 0 , 0 , 0 , 0 } }, // #41 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 54, 52, 0 , 0 , 0 , 0 } }, // #42 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 13, { 3 , 5 , 0 , 0 , 0 , 0 } }, // #43 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 29, 0 , 0 , 0 , 0 } }, // #44 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 55, 0 , 0 , 0 , 0 , 0 } }, // #45 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 23, { 56, 40, 0 , 0 , 0 , 0 } }, // #46 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 24, { 44, 9 , 0 , 0 , 0 , 0 } }, // #47 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 25, { 35, 7 , 0 , 0 , 0 , 0 } }, // #48 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 26, { 48, 13, 0 , 0 , 0 , 0 } }, // #49 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 40, 0 , 0 , 0 , 0 } }, // #50 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 9 , 0 , 0 , 0 , 0 } }, // #51 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #52 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 48, 13, 0 , 0 , 0 , 0 } }, // #53 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 40, 40, 0 , 0 , 0 , 0 } }, // #54 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #55 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #56 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 13, 13, 0 , 0 , 0 , 0 } }, // #57 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 3 , 0 , 0 , 0 , 0 } }, // #58 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 13, { 10, 5 , 0 , 0 , 0 , 0 } }, // #59 [ref=5x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #60 [ref=11x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #2 [ref=15x] + { InstDB::RWInfo::kCategoryGeneric , 1 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #3 [ref=7x] + { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #4 [ref=96x] + { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #5 [ref=55x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #6 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #7 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #8 [ref=26x] + { InstDB::RWInfo::kCategoryGeneric , 7 , { 12, 13, 0 , 0 , 0 , 0 } }, // #9 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #10 [ref=75x] + { InstDB::RWInfo::kCategoryGeneric , 2 , { 5 , 3 , 0 , 0 , 0 , 0 } }, // #11 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 10, 3 , 0 , 0 , 0 , 0 } }, // #12 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 9 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #13 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 15, 5 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #15 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #16 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #17 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 17, 0 , 0 , 0 , 0 } }, // #18 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 1 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #19 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 14, { 20, 21, 0 , 0 , 0 , 0 } }, // #20 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #21 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #22 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 33, 34, 0 , 0 , 0 , 0 } }, // #23 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 16, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #24 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 10, 7 , 0 , 0 , 0 , 0 } }, // #25 [ref=10x] + { InstDB::RWInfo::kCategoryGeneric , 3 , { 35, 5 , 0 , 0 , 0 , 0 } }, // #26 [ref=5x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #27 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #28 [ref=11x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #29 [ref=9x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 37, 7 , 0 , 0 , 0 , 0 } }, // #30 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 16, { 36, 3 , 0 , 0 , 0 , 0 } }, // #31 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 16, { 37, 3 , 0 , 0 , 0 , 0 } }, // #32 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 36, 9 , 0 , 0 , 0 , 0 } }, // #33 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 11, 9 , 0 , 0 , 0 , 0 } }, // #34 [ref=7x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 38, 39, 0 , 0 , 0 , 0 } }, // #35 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 17, { 1 , 40, 0 , 0 , 0 , 0 } }, // #36 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 13, { 43, 44, 0 , 0 , 0 , 0 } }, // #37 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #38 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 46, 47, 0 , 0 , 0 , 0 } }, // #39 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 51, 0 , 0 , 0 , 0 } }, // #40 [ref=1x] + { InstDB::RWInfo::kCategoryImul , 2 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #41 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 53, 0 , 0 , 0 , 0 } }, // #42 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 14, { 55, 53, 0 , 0 , 0 , 0 } }, // #43 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 15, { 3 , 5 , 0 , 0 , 0 , 0 } }, // #44 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 29, 0 , 0 , 0 , 0 } }, // #45 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 57, 0 , 0 , 0 , 0 , 0 } }, // #46 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 23, { 58, 40, 0 , 0 , 0 , 0 } }, // #47 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 24, { 45, 9 , 0 , 0 , 0 , 0 } }, // #48 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 25, { 35, 7 , 0 , 0 , 0 , 0 } }, // #49 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 26, { 49, 13, 0 , 0 , 0 , 0 } }, // #50 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 40, 0 , 0 , 0 , 0 } }, // #51 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 9 , 0 , 0 , 0 , 0 } }, // #52 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #53 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 13, 0 , 0 , 0 , 0 } }, // #54 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 40, 40, 0 , 0 , 0 , 0 } }, // #55 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #56 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #57 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 13, 13, 0 , 0 , 0 , 0 } }, // #58 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 3 , 0 , 0 , 0 , 0 } }, // #59 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 15, { 10, 5 , 0 , 0 , 0 , 0 } }, // #60 [ref=5x] { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #61 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 51, 20, 0 , 0 , 0 , 0 } }, // #62 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 0 , 0 , 0 , 0 , 0 } }, // #63 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 20, 0 , 0 , 0 , 0 } }, // #62 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 60, 0 , 0 , 0 , 0 , 0 } }, // #63 [ref=3x] { InstDB::RWInfo::kCategoryMov , 29, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #64 [ref=1x] { InstDB::RWInfo::kCategoryMovabs , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #65 [ref=1x] { InstDB::RWInfo::kCategoryGeneric , 30, { 10, 5 , 0 , 0 , 0 , 0 } }, // #66 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #67 [ref=14x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 36, 61, 0 , 0 , 0 , 0 } }, // #68 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #67 [ref=18x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 36, 64, 0 , 0 , 0 , 0 } }, // #68 [ref=1x] { InstDB::RWInfo::kCategoryMovh64 , 12, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #69 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 62, 7 , 0 , 0 , 0 , 0 } }, // #70 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 65, 7 , 0 , 0 , 0 , 0 } }, // #70 [ref=1x] { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 7 , 0 , 0 , 0 , 0 } }, // #71 [ref=7x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 5 , 0 , 0 , 0 , 0 } }, // #72 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 28, { 44, 9 , 0 , 0 , 0 , 0 } }, // #73 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 63, 20, 0 , 0 , 0 , 0 } }, // #74 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 5 , 0 , 0 , 0 , 0 } }, // #72 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 28, { 45, 9 , 0 , 0 , 0 , 0 } }, // #73 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 14, { 66, 20, 0 , 0 , 0 , 0 } }, // #74 [ref=1x] { InstDB::RWInfo::kCategoryGeneric , 31, { 35, 7 , 0 , 0 , 0 , 0 } }, // #75 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 33, { 44, 9 , 0 , 0 , 0 , 0 } }, // #76 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 14, { 11, 3 , 0 , 0 , 0 , 0 } }, // #77 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 33, { 45, 9 , 0 , 0 , 0 , 0 } }, // #76 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 16, { 11, 3 , 0 , 0 , 0 , 0 } }, // #77 [ref=6x] { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 29, 0 , 0 , 0 , 0 } }, // #78 [ref=1x] { InstDB::RWInfo::kCategoryGeneric , 11, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #79 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 22, 0 , 0 , 0 , 0 } }, // #80 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 66, 0 , 0 , 0 , 0 } }, // #81 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 53, 22, 0 , 0 , 0 , 0 } }, // #80 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 14, { 53, 69, 0 , 0 , 0 , 0 } }, // #81 [ref=1x] { InstDB::RWInfo::kCategoryGeneric , 4 , { 26, 7 , 0 , 0 , 0 , 0 } }, // #82 [ref=18x] { InstDB::RWInfo::kCategoryGeneric , 36, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #83 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 3 , { 69, 5 , 0 , 0 , 0 , 0 } }, // #84 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 3 , { 72, 5 , 0 , 0 , 0 , 0 } }, // #84 [ref=2x] { InstDB::RWInfo::kCategoryVmov1_8 , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #85 [ref=2x] { InstDB::RWInfo::kCategoryGeneric , 5 , { 10, 9 , 0 , 0 , 0 , 0 } }, // #86 [ref=4x] { InstDB::RWInfo::kCategoryGeneric , 27, { 10, 13, 0 , 0 , 0 , 0 } }, // #87 [ref=2x] { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #88 [ref=2x] { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 0 , 0 , 0 } }, // #89 [ref=1x] { InstDB::RWInfo::kCategoryPunpcklxx , 38, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #90 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 71, 0 , 0 , 0 , 0 } }, // #91 [ref=8x] + { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 73, 0 , 0 , 0 , 0 } }, // #91 [ref=8x] { InstDB::RWInfo::kCategoryGeneric , 5 , { 37, 9 , 0 , 0 , 0 , 0 } }, // #92 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 50, 0 , 0 , 0 , 0 } }, // #93 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 51, 0 , 0 , 0 , 0 } }, // #93 [ref=1x] { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 21, 0 , 0 , 0 , 0 } }, // #94 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 63, 22, 0 , 0 , 0 , 0 } }, // #95 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 8 , { 74, 3 , 0 , 0 , 0 , 0 } }, // #96 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 43, 0 , 0 , 0 , 0 } }, // #97 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 53, 9 , 0 , 0 , 0 , 0 } }, // #98 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 13, { 80, 5 , 0 , 0 , 0 , 0 } }, // #99 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 13, { 11, 5 , 0 , 0 , 0 , 0 } }, // #100 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 43, { 74, 81, 0 , 0 , 0 , 0 } }, // #101 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 44, { 11, 7 , 0 , 0 , 0 , 0 } }, // #102 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 45, { 11, 9 , 0 , 0 , 0 , 0 } }, // #103 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 27, { 13, 13, 0 , 0 , 0 , 0 } }, // #104 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 11, { 11, 3 , 0 , 0 , 0 , 0 } }, // #105 [ref=7x] - { InstDB::RWInfo::kCategoryVmov2_1 , 46, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #106 [ref=14x] - { InstDB::RWInfo::kCategoryVmov1_2 , 14, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #107 [ref=7x] - { InstDB::RWInfo::kCategoryGeneric , 14, { 10, 3 , 0 , 0 , 0 , 0 } }, // #108 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 46, { 11, 3 , 0 , 0 , 0 , 0 } }, // #109 [ref=5x] - { InstDB::RWInfo::kCategoryGeneric , 47, { 11, 5 , 0 , 0 , 0 , 0 } }, // #110 [ref=5x] - { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 5 , 0 , 0 , 0 , 0 } }, // #111 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 51, { 74, 43, 0 , 0 , 0 , 0 } }, // #112 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 44, 9 , 0 , 0 , 0 , 0 } }, // #113 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 18, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #114 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 58, { 11, 3 , 0 , 0 , 0 , 0 } }, // #115 [ref=12x] - { InstDB::RWInfo::kCategoryVmovddup , 38, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #116 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 61, 0 , 0 , 0 , 0 } }, // #117 [ref=2x] - { InstDB::RWInfo::kCategoryVmovmskpd , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #118 [ref=1x] - { InstDB::RWInfo::kCategoryVmovmskps , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #119 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 59, { 35, 7 , 0 , 0 , 0 , 0 } }, // #120 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 21, { 48, 13, 0 , 0 , 0 , 0 } }, // #121 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 2 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #122 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 15, { 11, 40, 0 , 0 , 0 , 0 } }, // #123 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #124 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 13, 0 , 0 , 0 , 0 } }, // #125 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 3 , 0 , 0 , 0 , 0 } }, // #126 [ref=4x] - { InstDB::RWInfo::kCategoryVmov1_4 , 62, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #127 [ref=6x] - { InstDB::RWInfo::kCategoryVmov1_2 , 48, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #128 [ref=9x] - { InstDB::RWInfo::kCategoryVmov1_8 , 63, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #129 [ref=3x] - { InstDB::RWInfo::kCategoryVmov4_1 , 47, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #130 [ref=4x] - { InstDB::RWInfo::kCategoryVmov8_1 , 64, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #131 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 18, { 11, 3 , 0 , 0 , 0 , 0 } }, // #132 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 17, { 44, 9 , 0 , 0 , 0 , 0 } }, // #133 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 35, { 35, 7 , 0 , 0 , 0 , 0 } }, // #134 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 2 , 0 , 0 , 0 , 0 } }, // #135 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 58, { 2 , 2 , 0 , 0 , 0 , 0 } } // #136 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 66, 22, 0 , 0 , 0 , 0 } }, // #95 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 43, 3 , 0 , 0 , 0 , 0 } }, // #96 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 44, 0 , 0 , 0 , 0 } }, // #97 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 54, 9 , 0 , 0 , 0 , 0 } }, // #98 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 21, { 11, 13, 0 , 0 , 0 , 0 } }, // #99 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 15, { 81, 5 , 0 , 0 , 0 , 0 } }, // #100 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 15, { 11, 5 , 0 , 0 , 0 , 0 } }, // #101 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 43, { 43, 82, 0 , 0 , 0 , 0 } }, // #102 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 44, { 11, 7 , 0 , 0 , 0 , 0 } }, // #103 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 45, { 11, 9 , 0 , 0 , 0 , 0 } }, // #104 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 27, { 13, 13, 0 , 0 , 0 , 0 } }, // #105 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 11, { 11, 3 , 0 , 0 , 0 , 0 } }, // #106 [ref=7x] + { InstDB::RWInfo::kCategoryVmov2_1 , 46, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #107 [ref=14x] + { InstDB::RWInfo::kCategoryVmov1_2 , 16, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #108 [ref=7x] + { InstDB::RWInfo::kCategoryGeneric , 16, { 10, 3 , 0 , 0 , 0 , 0 } }, // #109 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 46, { 11, 3 , 0 , 0 , 0 , 0 } }, // #110 [ref=5x] + { InstDB::RWInfo::kCategoryGeneric , 47, { 11, 5 , 0 , 0 , 0 , 0 } }, // #111 [ref=5x] + { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 5 , 0 , 0 , 0 , 0 } }, // #112 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 51, { 43, 44, 0 , 0 , 0 , 0 } }, // #113 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 45, 9 , 0 , 0 , 0 , 0 } }, // #114 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 14, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #115 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 58, { 11, 3 , 0 , 0 , 0 , 0 } }, // #116 [ref=12x] + { InstDB::RWInfo::kCategoryVmovddup , 38, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #117 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 64, 0 , 0 , 0 , 0 } }, // #118 [ref=2x] + { InstDB::RWInfo::kCategoryVmovmskpd , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #119 [ref=1x] + { InstDB::RWInfo::kCategoryVmovmskps , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #120 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 59, { 35, 7 , 0 , 0 , 0 , 0 } }, // #121 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 21, { 49, 13, 0 , 0 , 0 , 0 } }, // #122 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 2 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #123 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 17, { 11, 40, 0 , 0 , 0 , 0 } }, // #124 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #125 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 13, 0 , 0 , 0 , 0 } }, // #126 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 3 , 0 , 0 , 0 , 0 } }, // #127 [ref=4x] + { InstDB::RWInfo::kCategoryVmov1_4 , 62, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #128 [ref=6x] + { InstDB::RWInfo::kCategoryVmov1_2 , 48, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #129 [ref=9x] + { InstDB::RWInfo::kCategoryVmov1_8 , 63, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #130 [ref=3x] + { InstDB::RWInfo::kCategoryVmov4_1 , 47, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #131 [ref=4x] + { InstDB::RWInfo::kCategoryVmov8_1 , 64, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #132 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 14, { 11, 3 , 0 , 0 , 0 , 0 } }, // #133 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 90, 5 , 0 , 0 , 0 , 0 } }, // #134 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 90, 82, 0 , 0 , 0 , 0 } }, // #135 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 18, { 45, 9 , 0 , 0 , 0 , 0 } }, // #136 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 35, { 35, 7 , 0 , 0 , 0 , 0 } }, // #137 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 2 , 0 , 0 , 0 , 0 } }, // #138 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 58, { 2 , 2 , 0 , 0 , 0 , 0 } } // #139 [ref=1x] }; const InstDB::RWInfo InstDB::rwInfoB[] = { - { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=773x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=791x] { InstDB::RWInfo::kCategoryGeneric , 0 , { 1 , 0 , 0 , 0 , 0 , 0 } }, // #1 [ref=5x] { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #2 [ref=7x] - { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #3 [ref=193x] + { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #3 [ref=195x] { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #4 [ref=5x] { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #5 [ref=14x] { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 14, 0 , 0 , 0 } }, // #6 [ref=4x] { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 0 , 0 , 0 , 0 , 0 } }, // #7 [ref=1x] { InstDB::RWInfo::kCategoryGeneric , 11, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #8 [ref=2x] { InstDB::RWInfo::kCategoryGeneric , 0 , { 18, 0 , 0 , 0 , 0 , 0 } }, // #9 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #10 [ref=34x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #10 [ref=37x] { InstDB::RWInfo::kCategoryGeneric , 12, { 7 , 0 , 0 , 0 , 0 , 0 } }, // #11 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 19, 0 , 0 , 0 , 0 , 0 } }, // #12 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #13 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 22, 0 , 0 , 0 } }, // #15 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 13, { 4 , 23, 18, 24, 25, 0 } }, // #16 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 12, { 26, 27, 28, 29, 30, 0 } }, // #17 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 31, 32, 16, 0 , 0 } }, // #18 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 0 , 0 , 0 , 0 , 0 } }, // #19 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 0 , 0 , 0 , 0 , 0 } }, // #20 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 6 , { 41, 42, 3 , 0 , 0 , 0 } }, // #21 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 17, { 44, 5 , 0 , 0 , 0 , 0 } }, // #22 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #23 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 18, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #24 [ref=17x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 0 , 0 , 0 , 0 , 0 } }, // #25 [ref=16x] - { InstDB::RWInfo::kCategoryGeneric , 19, { 46, 0 , 0 , 0 , 0 , 0 } }, // #26 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 13, { 19, 0 , 0 , 0 , 0 , 0 } }, // #12 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 2 , 3 , 0 , 0 , 0 } }, // #13 [ref=16x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #15 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 22, 0 , 0 , 0 } }, // #16 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 15, { 4 , 23, 18, 24, 25, 0 } }, // #17 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 12, { 26, 27, 28, 29, 30, 0 } }, // #18 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 31, 32, 16, 0 , 0 } }, // #19 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 0 , 0 , 0 , 0 , 0 } }, // #20 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 0 , 0 , 0 , 0 , 0 } }, // #21 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 6 , { 41, 42, 3 , 0 , 0 , 0 } }, // #22 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 18, { 45, 5 , 0 , 0 , 0 , 0 } }, // #23 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #24 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 14, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #25 [ref=17x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 46, 0 , 0 , 0 , 0 , 0 } }, // #26 [ref=16x] { InstDB::RWInfo::kCategoryGeneric , 19, { 47, 0 , 0 , 0 , 0 , 0 } }, // #27 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 20, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #28 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 46, 0 , 0 , 0 , 0 , 0 } }, // #29 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 18, { 11, 0 , 0 , 0 , 0 , 0 } }, // #30 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 21, { 13, 0 , 0 , 0 , 0 , 0 } }, // #31 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #32 [ref=8x] - { InstDB::RWInfo::kCategoryGeneric , 21, { 48, 0 , 0 , 0 , 0 , 0 } }, // #33 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 7 , { 49, 0 , 0 , 0 , 0 , 0 } }, // #34 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 20, { 11, 0 , 0 , 0 , 0 , 0 } }, // #35 [ref=2x] - { InstDB::RWInfo::kCategoryImul , 22, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #36 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 53, 0 , 0 , 0 , 0 , 0 } }, // #37 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 26, 0 , 0 , 0 , 0 , 0 } }, // #38 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 4 , 9 , 0 , 0 , 0 , 0 } }, // #39 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #40 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 40, 40, 0 , 0 , 0 } }, // #41 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 9 , 9 , 0 , 0 , 0 } }, // #42 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 7 , 0 , 0 , 0 } }, // #43 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 48, 13, 13, 0 , 0 , 0 } }, // #44 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 40, 0 , 0 , 0 , 0 } }, // #45 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 9 , 0 , 0 , 0 , 0 } }, // #46 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #47 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 48, 13, 0 , 0 , 0 , 0 } }, // #48 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 48, 40, 40, 0 , 0 , 0 } }, // #49 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 9 , 9 , 0 , 0 , 0 } }, // #50 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 13, 13, 0 , 0 , 0 } }, // #51 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 57, 0 , 0 , 0 , 0 , 0 } }, // #52 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 28, { 9 , 0 , 0 , 0 , 0 , 0 } }, // #53 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 16, { 43, 0 , 0 , 0 , 0 , 0 } }, // #54 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 7 , { 13, 0 , 0 , 0 , 0 , 0 } }, // #55 [ref=5x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #56 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 3 , 9 , 0 , 0 , 0 , 0 } }, // #57 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 5 , 5 , 59, 0 , 0 , 0 } }, // #58 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 7 , 59, 0 , 0 , 0 } }, // #59 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 19, 29, 60, 0 , 0 , 0 } }, // #60 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 32, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #61 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 6 , { 64, 42, 3 , 0 , 0 , 0 } }, // #62 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 11, 3 , 65, 0 , 0 } }, // #63 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 29, 30, 0 , 0 , 0 } }, // #64 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #65 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #66 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 67, 17, 60 } }, // #67 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 68, 17, 60 } }, // #68 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 67, 0 , 0 } }, // #69 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 68, 0 , 0 } }, // #70 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 34, { 56, 5 , 0 , 0 , 0 , 0 } }, // #71 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 35, { 35, 5 , 0 , 0 , 0 , 0 } }, // #72 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 37, { 48, 3 , 0 , 0 , 0 , 0 } }, // #73 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 15, { 4 , 40, 0 , 0 , 0 , 0 } }, // #74 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 4 , 7 , 0 , 0 , 0 , 0 } }, // #75 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 27, { 2 , 13, 0 , 0 , 0 , 0 } }, // #76 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 10, { 70, 0 , 0 , 0 , 0 , 0 } }, // #77 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #78 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 10, { 65, 0 , 0 , 0 , 0 , 0 } }, // #79 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #80 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 50, 29, 0 , 0 , 0 } }, // #81 [ref=5x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 44, 0 , 0 , 0 , 0 , 0 } }, // #82 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 0 , 0 , 0 , 0 , 0 } }, // #83 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 50, 67, 0 , 0 , 0 } }, // #84 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #85 [ref=19x] - { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #86 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 37, 9 , 0 , 0 , 0 , 0 } }, // #87 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 72, 0 , 0 , 0 , 0 , 0 } }, // #88 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 0 , 0 , 0 , 0 , 0 } }, // #89 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 34, { 73, 0 , 0 , 0 , 0 , 0 } }, // #90 [ref=30x] - { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 71, 0 , 0 , 0 } }, // #91 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 39, { 11, 0 , 0 , 0 , 0 , 0 } }, // #92 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 28, { 44, 0 , 0 , 0 , 0 , 0 } }, // #93 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 16, { 74, 0 , 0 , 0 , 0 , 0 } }, // #94 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 75, 43, 43, 0 , 0 , 0 } }, // #95 [ref=5x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 74, 0 , 0 , 0 , 0 , 0 } }, // #96 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 60, 17, 0 , 0 , 0 } }, // #97 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 13, { 75, 76, 77, 77, 77, 5 } }, // #98 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 13, { 4 , 78, 79, 79, 79, 5 } }, // #99 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 5 , 7 , 0 , 0 , 0 } }, // #100 [ref=8x] - { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 5 , 13, 0 , 0 , 0 } }, // #101 [ref=7x] - { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 5 , 9 , 0 , 0 , 0 } }, // #102 [ref=9x] - { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 3 , 0 , 0 } }, // #103 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 6 , { 35, 3 , 3 , 0 , 0 , 0 } }, // #104 [ref=18x] - { InstDB::RWInfo::kCategoryGeneric , 40, { 11, 5 , 7 , 0 , 0 , 0 } }, // #105 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 41, { 35, 13, 13, 0 , 0 , 0 } }, // #106 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 42, { 11, 5 , 9 , 0 , 0 , 0 } }, // #107 [ref=1x] - { InstDB::RWInfo::kCategoryVmov1_2 , 48, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #108 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 5 , 5 , 0 , 0 , 0 } }, // #109 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 82, 7 , 0 , 0 , 0 } }, // #110 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 5 , 5 , 0 , 0 , 0 } }, // #111 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 61, 3 , 0 , 0 , 0 } }, // #112 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 3 , 3 , 0 , 0 , 0 } }, // #113 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 82, 3 , 0 , 0 , 0 } }, // #114 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 61, 9 , 0 , 0 , 0 } }, // #115 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 5 , 5 , 0 , 0 , 0 } }, // #116 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 50, { 10, 5 , 5 , 0 , 0 , 0 } }, // #117 [ref=9x] - { InstDB::RWInfo::kCategoryGeneric , 52, { 10, 81, 0 , 0 , 0 , 0 } }, // #118 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 52, { 10, 3 , 0 , 0 , 0 , 0 } }, // #119 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 53, { 80, 43, 0 , 0 , 0 , 0 } }, // #120 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #121 [ref=82x] - { InstDB::RWInfo::kCategoryGeneric , 42, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #122 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 40, { 4 , 61, 7 , 0 , 0 , 0 } }, // #123 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 42, { 4 , 82, 9 , 0 , 0 , 0 } }, // #124 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 40, { 6 , 7 , 7 , 0 , 0 , 0 } }, // #125 [ref=11x] - { InstDB::RWInfo::kCategoryGeneric , 41, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #126 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 42, { 8 , 9 , 9 , 0 , 0 , 0 } }, // #127 [ref=11x] - { InstDB::RWInfo::kCategoryGeneric , 54, { 11, 3 , 3 , 3 , 0 , 0 } }, // #128 [ref=15x] - { InstDB::RWInfo::kCategoryGeneric , 55, { 35, 7 , 7 , 7 , 0 , 0 } }, // #129 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 56, { 44, 9 , 9 , 9 , 0 , 0 } }, // #130 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 41, { 4 , 5 , 13, 0 , 0 , 0 } }, // #131 [ref=6x] - { InstDB::RWInfo::kCategoryGeneric , 40, { 26, 7 , 7 , 0 , 0 , 0 } }, // #132 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 42, { 53, 9 , 9 , 0 , 0 , 0 } }, // #133 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 14, { 35, 3 , 0 , 0 , 0 , 0 } }, // #134 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 27, { 35, 13, 0 , 0 , 0 , 0 } }, // #135 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 5 , { 35, 9 , 0 , 0 , 0 , 0 } }, // #136 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 8 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #137 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #138 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 18, { 4 , 3 , 4 , 0 , 0 , 0 } }, // #139 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 61, 7 , 0 , 0 , 0 } }, // #140 [ref=11x] - { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 83, 13, 0 , 0 , 0 } }, // #141 [ref=7x] - { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 82, 9 , 0 , 0 , 0 } }, // #142 [ref=13x] - { InstDB::RWInfo::kCategoryGeneric , 50, { 80, 81, 5 , 0 , 0 , 0 } }, // #143 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 50, { 11, 3 , 5 , 0 , 0 , 0 } }, // #144 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 57, { 74, 43, 81, 0 , 0 , 0 } }, // #145 [ref=4x] - { InstDB::RWInfo::kCategoryVmaskmov , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #146 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 0 , 0 , 0 , 0 , 0 } }, // #147 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 0 , 0 , 0 , 0 , 0 } }, // #148 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 61, 61, 0 , 0 , 0 } }, // #149 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 7 , 7 , 0 , 0 , 0 } }, // #150 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 7 , 7 , 0 , 0 , 0 } }, // #151 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 61, 7 , 0 , 0 , 0 } }, // #152 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 61, 7 , 0 , 0 , 0 } }, // #153 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 83, 13, 0 , 0 , 0 } }, // #154 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 82, 9 , 0 , 0 , 0 } }, // #155 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 84, 0 , 0 , 0 , 0 , 0 } }, // #156 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 60, { 85, 86, 3 , 3 , 0 , 0 } }, // #157 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 13, { 74, 76, 77, 77, 77, 5 } }, // #158 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 57, { 80, 81, 81, 0 , 0 , 0 } }, // #159 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 3 , 0 , 0 , 0 } }, // #160 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 7 , { 48, 5 , 0 , 0 , 0 , 0 } }, // #161 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 61, { 10, 5 , 40, 0 , 0 , 0 } }, // #162 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 50, { 10, 5 , 5 , 5 , 0 , 0 } }, // #163 [ref=12x] - { InstDB::RWInfo::kCategoryGeneric , 65, { 10, 5 , 5 , 5 , 0 , 0 } }, // #164 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 66, { 10, 5 , 5 , 0 , 0 , 0 } }, // #165 [ref=12x] - { InstDB::RWInfo::kCategoryGeneric , 67, { 11, 3 , 5 , 0 , 0 , 0 } }, // #166 [ref=5x] - { InstDB::RWInfo::kCategoryGeneric , 68, { 11, 3 , 0 , 0 , 0 , 0 } }, // #167 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 69, { 11, 3 , 5 , 0 , 0 , 0 } }, // #168 [ref=3x] - { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 5 , 0 , 0 , 0 } }, // #169 [ref=1x] - { InstDB::RWInfo::kCategoryGeneric , 0 , { 60, 17, 29, 0 , 0 , 0 } }, // #170 [ref=2x] - { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 60, 17, 0 , 0 , 0 } }, // #171 [ref=4x] - { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 60, 17, 0 , 0 , 0 } } // #172 [ref=8x] + { InstDB::RWInfo::kCategoryGeneric , 19, { 48, 0 , 0 , 0 , 0 , 0 } }, // #28 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 20, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #29 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 47, 0 , 0 , 0 , 0 , 0 } }, // #30 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 14, { 11, 0 , 0 , 0 , 0 , 0 } }, // #31 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 21, { 13, 0 , 0 , 0 , 0 , 0 } }, // #32 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #33 [ref=8x] + { InstDB::RWInfo::kCategoryGeneric , 21, { 49, 0 , 0 , 0 , 0 , 0 } }, // #34 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 7 , { 50, 0 , 0 , 0 , 0 , 0 } }, // #35 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 20, { 11, 0 , 0 , 0 , 0 , 0 } }, // #36 [ref=2x] + { InstDB::RWInfo::kCategoryImul , 22, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #37 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 54, 0 , 0 , 0 , 0 , 0 } }, // #38 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 26, 0 , 0 , 0 , 0 , 0 } }, // #39 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 4 , 9 , 0 , 0 , 0 , 0 } }, // #40 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #41 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 56, 57, 0 , 0 , 0 } }, // #42 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 40, 40, 0 , 0 , 0 } }, // #43 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 9 , 9 , 0 , 0 , 0 } }, // #44 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 7 , 0 , 0 , 0 } }, // #45 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 13, 13, 0 , 0 , 0 } }, // #46 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 40, 0 , 0 , 0 , 0 } }, // #47 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 9 , 0 , 0 , 0 , 0 } }, // #48 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #49 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 13, 0 , 0 , 0 , 0 } }, // #50 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 40, 40, 0 , 0 , 0 } }, // #51 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 9 , 9 , 0 , 0 , 0 } }, // #52 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 13, 13, 0 , 0 , 0 } }, // #53 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 59, 0 , 0 , 0 , 0 , 0 } }, // #54 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 28, { 9 , 0 , 0 , 0 , 0 , 0 } }, // #55 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 13, { 44, 0 , 0 , 0 , 0 , 0 } }, // #56 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 7 , { 13, 0 , 0 , 0 , 0 , 0 } }, // #57 [ref=5x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #58 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 3 , 9 , 0 , 0 , 0 , 0 } }, // #59 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 15, { 5 , 5 , 61, 0 , 0 , 0 } }, // #60 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 12, { 7 , 7 , 62, 0 , 0 , 0 } }, // #61 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 63, 29, 56, 0 , 0 , 0 } }, // #62 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 32, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #63 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 6 , { 67, 42, 3 , 0 , 0 , 0 } }, // #64 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 11, 3 , 68, 0 , 0 } }, // #65 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 29, 30, 0 , 0 , 0 } }, // #66 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #67 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #68 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 70, 17, 56 } }, // #69 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 71, 17, 56 } }, // #70 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 70, 0 , 0 } }, // #71 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 71, 0 , 0 } }, // #72 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 34, { 58, 5 , 0 , 0 , 0 , 0 } }, // #73 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 35, { 35, 5 , 0 , 0 , 0 , 0 } }, // #74 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 37, { 49, 3 , 0 , 0 , 0 , 0 } }, // #75 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 17, { 4 , 40, 0 , 0 , 0 , 0 } }, // #76 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 4 , 7 , 0 , 0 , 0 , 0 } }, // #77 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 27, { 2 , 13, 0 , 0 , 0 , 0 } }, // #78 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 10, { 11, 0 , 0 , 0 , 0 , 0 } }, // #79 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #80 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #81 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 51, 29, 0 , 0 , 0 } }, // #82 [ref=5x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 0 , 0 , 0 , 0 , 0 } }, // #83 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 0 , 0 , 0 , 0 , 0 } }, // #84 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 51, 70, 0 , 0 , 0 } }, // #85 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #86 [ref=19x] + { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #87 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 37, 9 , 0 , 0 , 0 , 0 } }, // #88 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 74, 0 , 0 , 0 , 0 , 0 } }, // #89 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 0 , 0 , 0 , 0 , 0 } }, // #90 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 34, { 75, 0 , 0 , 0 , 0 , 0 } }, // #91 [ref=30x] + { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 73, 0 , 0 , 0 } }, // #92 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 39, { 11, 0 , 0 , 0 , 0 , 0 } }, // #93 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 28, { 45, 0 , 0 , 0 , 0 , 0 } }, // #94 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 13, { 43, 0 , 0 , 0 , 0 , 0 } }, // #95 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 76, 44, 44, 0 , 0 , 0 } }, // #96 [ref=8x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 43, 0 , 0 , 0 , 0 , 0 } }, // #97 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 56, 17, 0 , 0 , 0 } }, // #98 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 15, { 76, 77, 78, 78, 78, 5 } }, // #99 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 15, { 4 , 79, 80, 80, 80, 5 } }, // #100 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 5 , 7 , 0 , 0 , 0 } }, // #101 [ref=8x] + { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 5 , 13, 0 , 0 , 0 } }, // #102 [ref=7x] + { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 5 , 9 , 0 , 0 , 0 } }, // #103 [ref=9x] + { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 3 , 0 , 0 } }, // #104 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 6 , { 35, 3 , 3 , 0 , 0 , 0 } }, // #105 [ref=18x] + { InstDB::RWInfo::kCategoryGeneric , 40, { 11, 5 , 7 , 0 , 0 , 0 } }, // #106 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 41, { 35, 13, 13, 0 , 0 , 0 } }, // #107 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 42, { 11, 5 , 9 , 0 , 0 , 0 } }, // #108 [ref=1x] + { InstDB::RWInfo::kCategoryVmov1_2 , 48, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #109 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 5 , 5 , 0 , 0 , 0 } }, // #110 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 83, 7 , 0 , 0 , 0 } }, // #111 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 5 , 5 , 0 , 0 , 0 } }, // #112 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 64, 3 , 0 , 0 , 0 } }, // #113 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 3 , 3 , 0 , 0 , 0 } }, // #114 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 83, 3 , 0 , 0 , 0 } }, // #115 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 64, 9 , 0 , 0 , 0 } }, // #116 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 5 , 5 , 0 , 0 , 0 } }, // #117 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 50, { 10, 5 , 5 , 0 , 0 , 0 } }, // #118 [ref=9x] + { InstDB::RWInfo::kCategoryGeneric , 52, { 10, 82, 0 , 0 , 0 , 0 } }, // #119 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 52, { 10, 3 , 0 , 0 , 0 , 0 } }, // #120 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 53, { 81, 44, 0 , 0 , 0 , 0 } }, // #121 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 6 , { 84, 3 , 3 , 0 , 0 , 0 } }, // #122 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 42, { 85, 5 , 5 , 0 , 0 , 0 } }, // #123 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #124 [ref=88x] + { InstDB::RWInfo::kCategoryGeneric , 40, { 4 , 64, 7 , 0 , 0 , 0 } }, // #125 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 42, { 4 , 83, 9 , 0 , 0 , 0 } }, // #126 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 40, { 6 , 7 , 7 , 0 , 0 , 0 } }, // #127 [ref=11x] + { InstDB::RWInfo::kCategoryGeneric , 41, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #128 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 42, { 8 , 9 , 9 , 0 , 0 , 0 } }, // #129 [ref=11x] + { InstDB::RWInfo::kCategoryGeneric , 54, { 11, 3 , 3 , 3 , 0 , 0 } }, // #130 [ref=15x] + { InstDB::RWInfo::kCategoryGeneric , 55, { 35, 7 , 7 , 7 , 0 , 0 } }, // #131 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 56, { 45, 9 , 9 , 9 , 0 , 0 } }, // #132 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 41, { 4 , 5 , 13, 0 , 0 , 0 } }, // #133 [ref=6x] + { InstDB::RWInfo::kCategoryGeneric , 40, { 26, 7 , 7 , 0 , 0 , 0 } }, // #134 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 42, { 54, 9 , 9 , 0 , 0 , 0 } }, // #135 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 16, { 35, 3 , 0 , 0 , 0 , 0 } }, // #136 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 27, { 35, 13, 0 , 0 , 0 , 0 } }, // #137 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 5 , { 35, 9 , 0 , 0 , 0 , 0 } }, // #138 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #139 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #140 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 14, { 4 , 3 , 4 , 0 , 0 , 0 } }, // #141 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 64, 7 , 0 , 0 , 0 } }, // #142 [ref=11x] + { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 86, 13, 0 , 0 , 0 } }, // #143 [ref=7x] + { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 83, 9 , 0 , 0 , 0 } }, // #144 [ref=13x] + { InstDB::RWInfo::kCategoryGeneric , 50, { 81, 82, 5 , 0 , 0 , 0 } }, // #145 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 50, { 11, 3 , 5 , 0 , 0 , 0 } }, // #146 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 57, { 43, 44, 82, 0 , 0 , 0 } }, // #147 [ref=4x] + { InstDB::RWInfo::kCategoryVmaskmov , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #148 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 0 , 0 , 0 , 0 , 0 } }, // #149 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 0 , 0 , 0 , 0 , 0 } }, // #150 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 64, 64, 0 , 0 , 0 } }, // #151 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 7 , 7 , 0 , 0 , 0 } }, // #152 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 7 , 7 , 0 , 0 , 0 } }, // #153 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 64, 7 , 0 , 0 , 0 } }, // #154 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 64, 7 , 0 , 0 , 0 } }, // #155 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 86, 13, 0 , 0 , 0 } }, // #156 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 83, 9 , 0 , 0 , 0 } }, // #157 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 87, 0 , 0 , 0 , 0 , 0 } }, // #158 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 60, { 88, 89, 3 , 3 , 0 , 0 } }, // #159 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 15, { 43, 77, 78, 78, 78, 5 } }, // #160 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 57, { 81, 82, 82, 0 , 0 , 0 } }, // #161 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 3 , 0 , 0 , 0 } }, // #162 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 7 , { 49, 5 , 0 , 0 , 0 , 0 } }, // #163 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 61, { 10, 5 , 40, 0 , 0 , 0 } }, // #164 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 50, { 10, 5 , 5 , 5 , 0 , 0 } }, // #165 [ref=12x] + { InstDB::RWInfo::kCategoryGeneric , 65, { 10, 5 , 5 , 5 , 0 , 0 } }, // #166 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 66, { 10, 5 , 5 , 0 , 0 , 0 } }, // #167 [ref=12x] + { InstDB::RWInfo::kCategoryGeneric , 67, { 11, 3 , 5 , 0 , 0 , 0 } }, // #168 [ref=5x] + { InstDB::RWInfo::kCategoryGeneric , 68, { 11, 3 , 0 , 0 , 0 , 0 } }, // #169 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 69, { 11, 3 , 5 , 0 , 0 , 0 } }, // #170 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 5 , 0 , 0 , 0 } }, // #171 [ref=1x] + { InstDB::RWInfo::kCategoryGenericEx , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #172 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 90, 82, 5 , 0 , 0 , 0 } }, // #173 [ref=1x] + { InstDB::RWInfo::kCategoryGeneric , 50, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #174 [ref=3x] + { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 17, 29, 0 , 0 , 0 } }, // #175 [ref=2x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 56, 17, 0 , 0 , 0 } }, // #176 [ref=4x] + { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 56, 17, 0 , 0 , 0 } } // #177 [ref=8x] }; const InstDB::RWInfoOp InstDB::rwInfoOp[] = { - { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kNone }, // #0 [ref=16519x] + { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kNone }, // #0 [ref=17086x] { 0x0000000000000003u, 0x0000000000000003u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId }, // #1 [ref=10x] - { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #2 [ref=236x] - { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #3 [ref=1077x] - { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #4 [ref=108x] - { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #5 [ref=348x] + { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #2 [ref=280x] + { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #3 [ref=1132x] + { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #4 [ref=107x] + { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #5 [ref=356x] { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #6 [ref=18x] { 0x00000000000000FFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #7 [ref=186x] { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #8 [ref=18x] { 0x000000000000000Fu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #9 [ref=135x] { 0x0000000000000000u, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #10 [ref=184x] - { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #11 [ref=455x] + { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #11 [ref=461x] { 0x0000000000000003u, 0x0000000000000003u, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #12 [ref=1x] - { 0x0000000000000003u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #13 [ref=63x] + { 0x0000000000000003u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #13 [ref=65x] { 0x000000000000FFFFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #14 [ref=4x] { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemBaseWrite | OpRWFlags::kMemIndexWrite }, // #15 [ref=1x] { 0x0000000000000000u, 0x000000000000000Fu, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #16 [ref=9x] { 0x000000000000000Fu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #17 [ref=23x] { 0x00000000000000FFu, 0x00000000000000FFu, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #18 [ref=2x] - { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #19 [ref=3x] + { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #19 [ref=1x] { 0x0000000000000000u, 0x0000000000000000u, 0x06, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #20 [ref=3x] { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #21 [ref=2x] - { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #22 [ref=7x] + { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #22 [ref=8x] { 0x00000000000000FFu, 0x00000000000000FFu, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #23 [ref=1x] { 0x00000000000000FFu, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #24 [ref=1x] { 0x00000000000000FFu, 0x0000000000000000u, 0x03, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #25 [ref=1x] { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #26 [ref=21x] { 0x000000000000000Fu, 0x000000000000000Fu, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #27 [ref=1x] - { 0x000000000000000Fu, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #28 [ref=4x] + { 0x000000000000000Fu, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #28 [ref=5x] { 0x000000000000000Fu, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #29 [ref=13x] { 0x000000000000000Fu, 0x0000000000000000u, 0x03, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #30 [ref=2x] { 0x0000000000000000u, 0x000000000000000Fu, 0x03, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #31 [ref=1x] @@ -4276,75 +6019,79 @@ const InstDB::RWInfoOp InstDB::rwInfoOp[] = { { 0x0000000000000001u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #40 [ref=28x] { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #41 [ref=2x] { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #42 [ref=3x] - { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #43 [ref=29x] - { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #44 [ref=30x] - { 0x00000000000003FFu, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #45 [ref=22x] - { 0x00000000000003FFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #46 [ref=13x] - { 0x0000000000000000u, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #47 [ref=1x] - { 0x0000000000000000u, 0x0000000000000003u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #48 [ref=17x] - { 0x0000000000000000u, 0x0000000000000003u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #49 [ref=2x] - { 0x0000000000000000u, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #50 [ref=8x] - { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #51 [ref=2x] - { 0x0000000000000003u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #52 [ref=4x] - { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #53 [ref=4x] - { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #54 [ref=1x] - { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #55 [ref=1x] - { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #56 [ref=14x] - { 0x0000000000000000u, 0x0000000000000001u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId }, // #57 [ref=1x] - { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #58 [ref=3x] - { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #59 [ref=3x] - { 0x000000000000000Fu, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #60 [ref=22x] - { 0x000000000000FF00u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #61 [ref=23x] - { 0x0000000000000000u, 0x000000000000FF00u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #62 [ref=1x] - { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #63 [ref=2x] - { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #64 [ref=1x] - { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #65 [ref=2x] - { 0x0000000000000000u, 0x0000000000000000u, 0x06, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #66 [ref=1x] - { 0x0000000000000000u, 0x000000000000000Fu, 0x01, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #67 [ref=5x] - { 0x0000000000000000u, 0x000000000000FFFFu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #68 [ref=4x] - { 0x0000000000000000u, 0x0000000000000007u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #69 [ref=2x] - { 0x0000000000000000u, 0x0000000000000000u, 0x04, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #70 [ref=1x] - { 0x0000000000000001u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #71 [ref=10x] - { 0x0000000000000001u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #72 [ref=1x] - { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #73 [ref=30x] - { 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #74 [ref=20x] - { 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #75 [ref=7x] - { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 4, { 0 }, OpRWFlags::kRead }, // #76 [ref=4x] - { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kConsecutive }, // #77 [ref=12x] - { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 4, { 0 }, OpRWFlags::kRead }, // #78 [ref=2x] - { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kConsecutive }, // #79 [ref=6x] - { 0x0000000000000000u, 0x00000000FFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #80 [ref=10x] - { 0x00000000FFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #81 [ref=16x] - { 0x000000000000FFF0u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #82 [ref=18x] - { 0x000000000000FFFCu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #83 [ref=8x] - { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #84 [ref=1x] - { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 2, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #85 [ref=2x] - { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kConsecutive } // #86 [ref=2x] + { 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #43 [ref=23x] + { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #44 [ref=35x] + { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #45 [ref=30x] + { 0x00000000000003FFu, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #46 [ref=22x] + { 0x00000000000003FFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #47 [ref=13x] + { 0x0000000000000000u, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #48 [ref=1x] + { 0x0000000000000000u, 0x0000000000000003u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #49 [ref=17x] + { 0x0000000000000000u, 0x0000000000000003u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #50 [ref=2x] + { 0x0000000000000000u, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #51 [ref=8x] + { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #52 [ref=2x] + { 0x0000000000000003u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #53 [ref=4x] + { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #54 [ref=4x] + { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #55 [ref=1x] + { 0x000000000000000Fu, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #56 [ref=23x] + { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #57 [ref=2x] + { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #58 [ref=14x] + { 0x0000000000000000u, 0x0000000000000001u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId }, // #59 [ref=1x] + { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #60 [ref=3x] + { 0x000000000000FFFFu, 0x000000000000FFFFu, 0x07, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #61 [ref=2x] + { 0x00000000000000FFu, 0x00000000000000FFu, 0x07, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #62 [ref=1x] + { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #63 [ref=2x] + { 0x000000000000FF00u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #64 [ref=23x] + { 0x0000000000000000u, 0x000000000000FF00u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #65 [ref=1x] + { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #66 [ref=2x] + { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #67 [ref=1x] + { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #68 [ref=1x] + { 0x0000000000000000u, 0x0000000000000000u, 0x06, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #69 [ref=1x] + { 0x0000000000000000u, 0x000000000000000Fu, 0x01, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #70 [ref=5x] + { 0x0000000000000000u, 0x000000000000FFFFu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #71 [ref=4x] + { 0x0000000000000000u, 0x0000000000000007u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #72 [ref=2x] + { 0x0000000000000001u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #73 [ref=10x] + { 0x0000000000000001u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #74 [ref=1x] + { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #75 [ref=30x] + { 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #76 [ref=10x] + { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 4, { 0 }, OpRWFlags::kRead }, // #77 [ref=4x] + { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kConsecutive }, // #78 [ref=12x] + { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 4, { 0 }, OpRWFlags::kRead }, // #79 [ref=2x] + { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kConsecutive }, // #80 [ref=6x] + { 0x0000000000000000u, 0x00000000FFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #81 [ref=10x] + { 0x00000000FFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #82 [ref=18x] + { 0x000000000000FFF0u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #83 [ref=18x] + { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kUnique | OpRWFlags::kZExt }, // #84 [ref=4x] + { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kUnique | OpRWFlags::kZExt }, // #85 [ref=4x] + { 0x000000000000FFFCu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #86 [ref=8x] + { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #87 [ref=1x] + { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 2, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #88 [ref=2x] + { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kConsecutive }, // #89 [ref=2x] + { 0x00000000FFFFFFFFu, 0x00000000FFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt } // #90 [ref=3x] }; const InstDB::RWInfoRm InstDB::rwInfoRm[] = { - { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , 0, 0 }, // #0 [ref=1997x] + { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , 0, 0 }, // #0 [ref=2083x] { InstDB::RWInfoRm::kCategoryConsistent, 0x03, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #1 [ref=8x] { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , 0, 0 }, // #2 [ref=204x] { InstDB::RWInfoRm::kCategoryFixed , 0x02, 16, 0, 0 }, // #3 [ref=122x] { InstDB::RWInfoRm::kCategoryFixed , 0x02, 8 , 0, 0 }, // #4 [ref=66x] { InstDB::RWInfoRm::kCategoryFixed , 0x02, 4 , 0, 0 }, // #5 [ref=35x] - { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , 0, 0 }, // #6 [ref=300x] + { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , 0, 0 }, // #6 [ref=314x] { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , 0, 0 }, // #7 [ref=9x] - { InstDB::RWInfoRm::kCategoryFixed , 0x00, 0 , 0, 0 }, // #8 [ref=63x] + { InstDB::RWInfoRm::kCategoryFixed , 0x00, 0 , 0, 0 }, // #8 [ref=68x] { InstDB::RWInfoRm::kCategoryFixed , 0x03, 0 , 0, 0 }, // #9 [ref=1x] { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #10 [ref=21x] { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , 0, 0 }, // #11 [ref=14x] - { InstDB::RWInfoRm::kCategoryFixed , 0x00, 8 , 0, 0 }, // #12 [ref=22x] - { InstDB::RWInfoRm::kCategoryFixed , 0x00, 16, 0, 0 }, // #13 [ref=21x] - { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #14 [ref=22x] - { InstDB::RWInfoRm::kCategoryFixed , 0x02, 1 , 0, 0 }, // #15 [ref=5x] - { InstDB::RWInfoRm::kCategoryFixed , 0x00, 64, 0, 0 }, // #16 [ref=5x] - { InstDB::RWInfoRm::kCategoryFixed , 0x01, 4 , 0, 0 }, // #17 [ref=6x] - { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #18 [ref=26x] + { InstDB::RWInfoRm::kCategoryFixed , 0x00, 8 , 0, 0 }, // #12 [ref=23x] + { InstDB::RWInfoRm::kCategoryFixed , 0x00, 64, 0, 0 }, // #13 [ref=6x] + { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #14 [ref=30x] + { InstDB::RWInfoRm::kCategoryFixed , 0x00, 16, 0, 0 }, // #15 [ref=23x] + { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #16 [ref=22x] + { InstDB::RWInfoRm::kCategoryFixed , 0x02, 1 , 0, 0 }, // #17 [ref=5x] + { InstDB::RWInfoRm::kCategoryFixed , 0x01, 4 , 0, 0 }, // #18 [ref=6x] { InstDB::RWInfoRm::kCategoryFixed , 0x00, 10, 0, 0 }, // #19 [ref=2x] { InstDB::RWInfoRm::kCategoryNone , 0x01, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #20 [ref=5x] - { InstDB::RWInfoRm::kCategoryFixed , 0x00, 2 , 0, 0 }, // #21 [ref=4x] + { InstDB::RWInfoRm::kCategoryFixed , 0x00, 2 , 0, 0 }, // #21 [ref=6x] { InstDB::RWInfoRm::kCategoryConsistent, 0x06, 0 , 0, 0 }, // #22 [ref=6x] { InstDB::RWInfoRm::kCategoryFixed , 0x03, 1 , 0, 0 }, // #23 [ref=1x] { InstDB::RWInfoRm::kCategoryFixed , 0x03, 4 , 0, 0 }, // #24 [ref=3x] @@ -4373,7 +6120,7 @@ const InstDB::RWInfoRm InstDB::rwInfoRm[] = { { InstDB::RWInfoRm::kCategoryQuarter , 0x02, 0 , 0, 0 }, // #47 [ref=9x] { InstDB::RWInfoRm::kCategoryHalf , 0x01, 0 , 0, 0 }, // #48 [ref=10x] { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #49 [ref=6x] - { InstDB::RWInfoRm::kCategoryFixed , 0x04, 16, 0, 0 }, // #50 [ref=27x] + { InstDB::RWInfoRm::kCategoryFixed , 0x04, 16, 0, 0 }, // #50 [ref=30x] { InstDB::RWInfoRm::kCategoryFixed , 0x02, 64, 0, 0 }, // #51 [ref=6x] { InstDB::RWInfoRm::kCategoryFixed , 0x01, 16, 0, 0 }, // #52 [ref=6x] { InstDB::RWInfoRm::kCategoryFixed , 0x01, 32, 0, 0 }, // #53 [ref=4x] @@ -4405,20 +6152,33 @@ UNIT(x86_inst_db) { INFO("Checking validity of Inst enums"); // Cross-validate prefixes. - EXPECT(uint32_t(InstOptions::kX86_Rex ) == 0x40000000u, "REX prefix must be at 0x40000000"); - EXPECT(uint32_t(InstOptions::kX86_Evex) == 0x00001000u, "EVEX prefix must be at 0x00001000"); + EXPECT_EQ(uint32_t(InstOptions::kX86_Rex ), 0x40000000u) + .message("REX prefix must be at 0x40000000"); + + EXPECT_EQ(uint32_t(InstOptions::kX86_Evex), 0x00001000u) + .message("EVEX prefix must be at 0x00001000"); // These could be combined together to form a valid REX prefix, they must match. - EXPECT(uint32_t(InstOptions::kX86_OpCodeB) == uint32_t(Opcode::kB), "Opcode::kB must match InstOptions::kX86_OpCodeB"); - EXPECT(uint32_t(InstOptions::kX86_OpCodeX) == uint32_t(Opcode::kX), "Opcode::kX must match InstOptions::kX86_OpCodeX"); - EXPECT(uint32_t(InstOptions::kX86_OpCodeR) == uint32_t(Opcode::kR), "Opcode::kR must match InstOptions::kX86_OpCodeR"); - EXPECT(uint32_t(InstOptions::kX86_OpCodeW) == uint32_t(Opcode::kW), "Opcode::kW must match InstOptions::kX86_OpCodeW"); + EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeB), uint32_t(Opcode::kB)) + .message("Opcode::kB must match InstOptions::kX86_OpCodeB"); + + EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeX), uint32_t(Opcode::kX)) + .message("Opcode::kX must match InstOptions::kX86_OpCodeX"); + + EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeR), uint32_t(Opcode::kR)) + .message("Opcode::kR must match InstOptions::kX86_OpCodeR"); + + EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeW), uint32_t(Opcode::kW)) + .message("Opcode::kW must match InstOptions::kX86_OpCodeW"); uint32_t rex_rb = (Opcode::kR >> Opcode::kREX_Shift) | (Opcode::kB >> Opcode::kREX_Shift) | 0x40; uint32_t rex_rw = (Opcode::kR >> Opcode::kREX_Shift) | (Opcode::kW >> Opcode::kREX_Shift) | 0x40; - EXPECT(rex_rb == 0x45, "Opcode::kR|B must form a valid REX prefix (0x45) if combined with 0x40"); - EXPECT(rex_rw == 0x4C, "Opcode::kR|W must form a valid REX prefix (0x4C) if combined with 0x40"); + EXPECT_EQ(rex_rb, 0x45u) + .message("Opcode::kR|B must form a valid REX prefix (0x45) if combined with 0x40"); + + EXPECT_EQ(rex_rw, 0x4Cu) + .message("Opcode::kR|W must form a valid REX prefix (0x4C) if combined with 0x40"); } #endif diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instdb.h b/3rdparty/asmjit/src/asmjit/x86/x86instdb.h index 87a286c282958..2bf7d14895754 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86instdb.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86instdb.h @@ -30,7 +30,7 @@ enum class Mode : uint8_t { ASMJIT_DEFINE_ENUM_FLAGS(Mode) //! Converts architecture to operation mode, see \ref Mode. -static constexpr Mode modeFromArch(Arch arch) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mode modeFromArch(Arch arch) noexcept { return arch == Arch::kX86 ? Mode::kX86 : arch == Arch::kX64 ? Mode::kX64 : Mode::kNone; } @@ -348,92 +348,92 @@ struct CommonInfo { //! \{ //! Returns instruction flags. - inline InstFlags flags() const noexcept { return (InstFlags)_flags; } + ASMJIT_INLINE_NODEBUG InstFlags flags() const noexcept { return (InstFlags)_flags; } //! Tests whether the instruction has a `flag`. - inline bool hasFlag(InstFlags flag) const noexcept { return Support::test(_flags, flag); } + ASMJIT_INLINE_NODEBUG bool hasFlag(InstFlags flag) const noexcept { return Support::test(_flags, flag); } //! Returns instruction AVX-512 flags. - inline Avx512Flags avx512Flags() const noexcept { return (Avx512Flags)_avx512Flags; } + ASMJIT_INLINE_NODEBUG Avx512Flags avx512Flags() const noexcept { return (Avx512Flags)_avx512Flags; } //! Tests whether the instruction has an AVX-512 `flag`. - inline bool hasAvx512Flag(Avx512Flags flag) const noexcept { return Support::test(_avx512Flags, flag); } + ASMJIT_INLINE_NODEBUG bool hasAvx512Flag(Avx512Flags flag) const noexcept { return Support::test(_avx512Flags, flag); } //! Tests whether the instruction is FPU instruction. - inline bool isFpu() const noexcept { return hasFlag(InstFlags::kFpu); } + ASMJIT_INLINE_NODEBUG bool isFpu() const noexcept { return hasFlag(InstFlags::kFpu); } //! Tests whether the instruction is MMX/3DNOW instruction that accesses MMX registers (includes EMMS and FEMMS). - inline bool isMmx() const noexcept { return hasFlag(InstFlags::kMmx); } + ASMJIT_INLINE_NODEBUG bool isMmx() const noexcept { return hasFlag(InstFlags::kMmx); } //! Tests whether the instruction is SSE|AVX|AVX512 instruction that accesses XMM|YMM|ZMM registers. - inline bool isVec() const noexcept { return hasFlag(InstFlags::kVec); } + ASMJIT_INLINE_NODEBUG bool isVec() const noexcept { return hasFlag(InstFlags::kVec); } //! Tests whether the instruction is SSE+ (SSE4.2, AES, SHA included) instruction that accesses XMM registers. - inline bool isSse() const noexcept { return (flags() & (InstFlags::kVec | InstFlags::kVex | InstFlags::kEvex)) == InstFlags::kVec; } + ASMJIT_INLINE_NODEBUG bool isSse() const noexcept { return (flags() & (InstFlags::kVec | InstFlags::kVex | InstFlags::kEvex)) == InstFlags::kVec; } //! Tests whether the instruction is AVX+ (FMA included) instruction that accesses XMM|YMM|ZMM registers. - inline bool isAvx() const noexcept { return isVec() && isVexOrEvex(); } + ASMJIT_INLINE_NODEBUG bool isAvx() const noexcept { return isVec() && isVexOrEvex(); } //! Tests whether the instruction can be prefixed with LOCK prefix. - inline bool hasLockPrefix() const noexcept { return hasFlag(InstFlags::kLock); } + ASMJIT_INLINE_NODEBUG bool hasLockPrefix() const noexcept { return hasFlag(InstFlags::kLock); } //! Tests whether the instruction can be prefixed with REP (REPE|REPZ) prefix. - inline bool hasRepPrefix() const noexcept { return hasFlag(InstFlags::kRep); } + ASMJIT_INLINE_NODEBUG bool hasRepPrefix() const noexcept { return hasFlag(InstFlags::kRep); } //! Tests whether the instruction can be prefixed with XACQUIRE prefix. - inline bool hasXAcquirePrefix() const noexcept { return hasFlag(InstFlags::kXAcquire); } + ASMJIT_INLINE_NODEBUG bool hasXAcquirePrefix() const noexcept { return hasFlag(InstFlags::kXAcquire); } //! Tests whether the instruction can be prefixed with XRELEASE prefix. - inline bool hasXReleasePrefix() const noexcept { return hasFlag(InstFlags::kXRelease); } + ASMJIT_INLINE_NODEBUG bool hasXReleasePrefix() const noexcept { return hasFlag(InstFlags::kXRelease); } //! Tests whether the rep prefix is supported by the instruction, but ignored (has no effect). - inline bool isRepIgnored() const noexcept { return hasFlag(InstFlags::kRepIgnored); } + ASMJIT_INLINE_NODEBUG bool isRepIgnored() const noexcept { return hasFlag(InstFlags::kRepIgnored); } //! Tests whether the instruction uses MIB. - inline bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); } + ASMJIT_INLINE_NODEBUG bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); } //! Tests whether the instruction uses VSIB. - inline bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); } + ASMJIT_INLINE_NODEBUG bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); } //! Tests whether the instruction uses TSIB (AMX, instruction requires MOD+SIB). - inline bool isTsibOp() const noexcept { return hasFlag(InstFlags::kTsib); } + ASMJIT_INLINE_NODEBUG bool isTsibOp() const noexcept { return hasFlag(InstFlags::kTsib); } //! Tests whether the instruction uses VEX (can be set together with EVEX if both are encodable). - inline bool isVex() const noexcept { return hasFlag(InstFlags::kVex); } + ASMJIT_INLINE_NODEBUG bool isVex() const noexcept { return hasFlag(InstFlags::kVex); } //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable). - inline bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); } + ASMJIT_INLINE_NODEBUG bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); } //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable). - inline bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); } + ASMJIT_INLINE_NODEBUG bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); } //! Tests whether the instruction should prefer EVEX prefix instead of VEX prefix. - inline bool preferEvex() const noexcept { return hasFlag(InstFlags::kPreferEvex); } + ASMJIT_INLINE_NODEBUG bool preferEvex() const noexcept { return hasFlag(InstFlags::kPreferEvex); } - inline bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); } - inline bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); } - inline bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); } - inline bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); } + ASMJIT_INLINE_NODEBUG bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); } + ASMJIT_INLINE_NODEBUG bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); } + ASMJIT_INLINE_NODEBUG bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); } + ASMJIT_INLINE_NODEBUG bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); } //! Tests whether the instruction supports AVX512 masking {k}. - inline bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); } + ASMJIT_INLINE_NODEBUG bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); } //! Tests whether the instruction supports AVX512 zeroing {k}{z}. - inline bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); } + ASMJIT_INLINE_NODEBUG bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); } //! Tests whether the instruction supports AVX512 embedded-rounding {er}. - inline bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); } + ASMJIT_INLINE_NODEBUG bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); } //! Tests whether the instruction supports AVX512 suppress-all-exceptions {sae}. - inline bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); } + ASMJIT_INLINE_NODEBUG bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); } //! Tests whether the instruction supports AVX512 broadcast (either 32-bit or 64-bit). - inline bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); } + ASMJIT_INLINE_NODEBUG bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); } //! Tests whether the instruction supports AVX512 broadcast (16-bit). - inline bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); } + ASMJIT_INLINE_NODEBUG bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); } //! Tests whether the instruction supports AVX512 broadcast (32-bit). - inline bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); } + ASMJIT_INLINE_NODEBUG bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); } //! Tests whether the instruction supports AVX512 broadcast (64-bit). - inline bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); } + ASMJIT_INLINE_NODEBUG bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); } // Returns the size of the broadcast - either 2, 4, or 8, or 0 if broadcast is not supported. - inline uint32_t broadcastSize() const noexcept { + ASMJIT_INLINE_NODEBUG uint32_t broadcastSize() const noexcept { constexpr uint32_t kShift = Support::ConstCTZ::value; return (uint32_t(_avx512Flags) & uint32_t(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64)) >> (kShift - 1); } - inline uint32_t signatureIndex() const noexcept { return _iSignatureIndex; } - inline uint32_t signatureCount() const noexcept { return _iSignatureCount; } + ASMJIT_INLINE_NODEBUG uint32_t signatureIndex() const noexcept { return _iSignatureIndex; } + ASMJIT_INLINE_NODEBUG uint32_t signatureCount() const noexcept { return _iSignatureCount; } - inline const InstSignature* signatureData() const noexcept { return _instSignatureTable + _iSignatureIndex; } - inline const InstSignature* signatureEnd() const noexcept { return _instSignatureTable + _iSignatureIndex + _iSignatureCount; } + ASMJIT_INLINE_NODEBUG const InstSignature* signatureData() const noexcept { return _instSignatureTable + _iSignatureIndex; } + ASMJIT_INLINE_NODEBUG const InstSignature* signatureEnd() const noexcept { return _instSignatureTable + _iSignatureIndex + _iSignatureCount; } //! Returns a control flow category of the instruction. - inline InstControlFlow controlFlow() const noexcept { return (InstControlFlow)_controlFlow; } + ASMJIT_INLINE_NODEBUG InstControlFlow controlFlow() const noexcept { return (InstControlFlow)_controlFlow; } //! Returns a hint that can be used when both inputs are the same register. - inline InstSameRegHint sameRegHint() const noexcept { return (InstSameRegHint)_sameRegHint; } + ASMJIT_INLINE_NODEBUG InstSameRegHint sameRegHint() const noexcept { return (InstSameRegHint)_sameRegHint; } //! \} }; @@ -442,8 +442,8 @@ ASMJIT_VARAPI const CommonInfo _commonInfoTable[]; //! Instruction information. struct InstInfo { - //! Index to \ref _nameData. - uint32_t _nameDataIndex : 14; + //! Reserved for future use. + uint32_t _reserved : 14; //! Index to \ref _commonInfoTable. uint32_t _commonInfoIndex : 10; //! Index to \ref _additionalInfoTable. @@ -462,83 +462,83 @@ struct InstInfo { //! \{ //! Returns common information, see \ref CommonInfo. - inline const CommonInfo& commonInfo() const noexcept { return _commonInfoTable[_commonInfoIndex]; } + ASMJIT_INLINE_NODEBUG const CommonInfo& commonInfo() const noexcept { return _commonInfoTable[_commonInfoIndex]; } - //! Returns instruction flags, see \ref Flags. - inline InstFlags flags() const noexcept { return commonInfo().flags(); } - //! Tests whether the instruction has flag `flag`, see \ref Flags. - inline bool hasFlag(InstFlags flag) const noexcept { return commonInfo().hasFlag(flag); } + //! Returns instruction flags, see \ref InstFlags. + ASMJIT_INLINE_NODEBUG InstFlags flags() const noexcept { return commonInfo().flags(); } + //! Tests whether the instruction has flag `flag`, see \ref InstFlags. + ASMJIT_INLINE_NODEBUG bool hasFlag(InstFlags flag) const noexcept { return commonInfo().hasFlag(flag); } //! Returns instruction AVX-512 flags, see \ref Avx512Flags. - inline Avx512Flags avx512Flags() const noexcept { return commonInfo().avx512Flags(); } + ASMJIT_INLINE_NODEBUG Avx512Flags avx512Flags() const noexcept { return commonInfo().avx512Flags(); } //! Tests whether the instruction has an AVX-512 `flag`, see \ref Avx512Flags. - inline bool hasAvx512Flag(Avx512Flags flag) const noexcept { return commonInfo().hasAvx512Flag(flag); } + ASMJIT_INLINE_NODEBUG bool hasAvx512Flag(Avx512Flags flag) const noexcept { return commonInfo().hasAvx512Flag(flag); } //! Tests whether the instruction is FPU instruction. - inline bool isFpu() const noexcept { return commonInfo().isFpu(); } + ASMJIT_INLINE_NODEBUG bool isFpu() const noexcept { return commonInfo().isFpu(); } //! Tests whether the instruction is MMX/3DNOW instruction that accesses MMX registers (includes EMMS and FEMMS). - inline bool isMmx() const noexcept { return commonInfo().isMmx(); } + ASMJIT_INLINE_NODEBUG bool isMmx() const noexcept { return commonInfo().isMmx(); } //! Tests whether the instruction is SSE|AVX|AVX512 instruction that accesses XMM|YMM|ZMM registers. - inline bool isVec() const noexcept { return commonInfo().isVec(); } + ASMJIT_INLINE_NODEBUG bool isVec() const noexcept { return commonInfo().isVec(); } //! Tests whether the instruction is SSE+ (SSE4.2, AES, SHA included) instruction that accesses XMM registers. - inline bool isSse() const noexcept { return commonInfo().isSse(); } + ASMJIT_INLINE_NODEBUG bool isSse() const noexcept { return commonInfo().isSse(); } //! Tests whether the instruction is AVX+ (FMA included) instruction that accesses XMM|YMM|ZMM registers. - inline bool isAvx() const noexcept { return commonInfo().isAvx(); } + ASMJIT_INLINE_NODEBUG bool isAvx() const noexcept { return commonInfo().isAvx(); } //! Tests whether the instruction can be prefixed with LOCK prefix. - inline bool hasLockPrefix() const noexcept { return commonInfo().hasLockPrefix(); } + ASMJIT_INLINE_NODEBUG bool hasLockPrefix() const noexcept { return commonInfo().hasLockPrefix(); } //! Tests whether the instruction can be prefixed with REP (REPE|REPZ) prefix. - inline bool hasRepPrefix() const noexcept { return commonInfo().hasRepPrefix(); } + ASMJIT_INLINE_NODEBUG bool hasRepPrefix() const noexcept { return commonInfo().hasRepPrefix(); } //! Tests whether the instruction can be prefixed with XACQUIRE prefix. - inline bool hasXAcquirePrefix() const noexcept { return commonInfo().hasXAcquirePrefix(); } + ASMJIT_INLINE_NODEBUG bool hasXAcquirePrefix() const noexcept { return commonInfo().hasXAcquirePrefix(); } //! Tests whether the instruction can be prefixed with XRELEASE prefix. - inline bool hasXReleasePrefix() const noexcept { return commonInfo().hasXReleasePrefix(); } + ASMJIT_INLINE_NODEBUG bool hasXReleasePrefix() const noexcept { return commonInfo().hasXReleasePrefix(); } //! Tests whether the rep prefix is supported by the instruction, but ignored (has no effect). - inline bool isRepIgnored() const noexcept { return commonInfo().isRepIgnored(); } + ASMJIT_INLINE_NODEBUG bool isRepIgnored() const noexcept { return commonInfo().isRepIgnored(); } //! Tests whether the instruction uses MIB. - inline bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); } + ASMJIT_INLINE_NODEBUG bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); } //! Tests whether the instruction uses VSIB. - inline bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); } + ASMJIT_INLINE_NODEBUG bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); } //! Tests whether the instruction uses VEX (can be set together with EVEX if both are encodable). - inline bool isVex() const noexcept { return hasFlag(InstFlags::kVex); } + ASMJIT_INLINE_NODEBUG bool isVex() const noexcept { return hasFlag(InstFlags::kVex); } //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable). - inline bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); } + ASMJIT_INLINE_NODEBUG bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); } //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable). - inline bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); } + ASMJIT_INLINE_NODEBUG bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); } - inline bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); } - inline bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); } - inline bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); } - inline bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); } + ASMJIT_INLINE_NODEBUG bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); } + ASMJIT_INLINE_NODEBUG bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); } + ASMJIT_INLINE_NODEBUG bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); } + ASMJIT_INLINE_NODEBUG bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); } //! Tests whether the instruction supports AVX512 masking {k}. - inline bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); } + ASMJIT_INLINE_NODEBUG bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); } //! Tests whether the instruction supports AVX512 zeroing {k}{z}. - inline bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); } + ASMJIT_INLINE_NODEBUG bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); } //! Tests whether the instruction supports AVX512 embedded-rounding {er}. - inline bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); } + ASMJIT_INLINE_NODEBUG bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); } //! Tests whether the instruction supports AVX512 suppress-all-exceptions {sae}. - inline bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); } + ASMJIT_INLINE_NODEBUG bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); } //! Tests whether the instruction supports AVX512 broadcast (either 32-bit or 64-bit). - inline bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); } + ASMJIT_INLINE_NODEBUG bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); } //! Tests whether the instruction supports AVX512 broadcast (16-bit). - inline bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); } + ASMJIT_INLINE_NODEBUG bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); } //! Tests whether the instruction supports AVX512 broadcast (32-bit). - inline bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); } + ASMJIT_INLINE_NODEBUG bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); } //! Tests whether the instruction supports AVX512 broadcast (64-bit). - inline bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); } + ASMJIT_INLINE_NODEBUG bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); } //! Returns a control flow category of the instruction. - inline InstControlFlow controlFlow() const noexcept { return commonInfo().controlFlow(); } + ASMJIT_INLINE_NODEBUG InstControlFlow controlFlow() const noexcept { return commonInfo().controlFlow(); } //! Returns a hint that can be used when both inputs are the same register. - inline InstSameRegHint sameRegHint() const noexcept { return commonInfo().sameRegHint(); } + ASMJIT_INLINE_NODEBUG InstSameRegHint sameRegHint() const noexcept { return commonInfo().sameRegHint(); } - inline uint32_t signatureIndex() const noexcept { return commonInfo().signatureIndex(); } - inline uint32_t signatureCount() const noexcept { return commonInfo().signatureCount(); } + ASMJIT_INLINE_NODEBUG uint32_t signatureIndex() const noexcept { return commonInfo().signatureIndex(); } + ASMJIT_INLINE_NODEBUG uint32_t signatureCount() const noexcept { return commonInfo().signatureCount(); } - inline const InstSignature* signatureData() const noexcept { return commonInfo().signatureData(); } - inline const InstSignature* signatureEnd() const noexcept { return commonInfo().signatureEnd(); } + ASMJIT_INLINE_NODEBUG const InstSignature* signatureData() const noexcept { return commonInfo().signatureData(); } + ASMJIT_INLINE_NODEBUG const InstSignature* signatureEnd() const noexcept { return commonInfo().signatureEnd(); } //! \} }; diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h b/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h index b8e12e16b454a..cb006060832c4 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h @@ -6,6 +6,7 @@ #ifndef ASMJIT_X86_X86INSTDB_P_H_INCLUDED #define ASMJIT_X86_X86INSTDB_P_H_INCLUDED +#include "../core/instdb_p.h" #include "../x86/x86instdb.h" ASMJIT_BEGIN_SUB_NAMESPACE(x86) @@ -38,11 +39,11 @@ enum EncodingId : uint32_t { kEncodingX86M_GPB, //!< X86 [M] (handles single-byte size). kEncodingX86M_GPB_MulDiv, //!< X86 [M] (like GPB, handles implicit|explicit MUL|DIV|IDIV). kEncodingX86M_Only, //!< X86 [M] (restricted to memory operand of any size). - kEncodingX86M_Only_EDX_EAX, //!< X86 [M] (memory operand only, followed by implicit and ). + kEncodingX86M_Only_EDX_EAX, //!< X86 [M] (memory operand only, followed by implicit `EDX` and `EAX`). kEncodingX86M_Nop, //!< X86 [M] (special case of NOP instruction). kEncodingX86R_Native, //!< X86 [R] (register must be either 32-bit or 64-bit depending on arch). kEncodingX86R_FromM, //!< X86 [R] - which specifies memory address. - kEncodingX86R32_EDX_EAX, //!< X86 [R32] followed by implicit EDX and EAX. + kEncodingX86R32_EDX_EAX, //!< X86 [R32] followed by implicit `EDX` and `EAX`. kEncodingX86Rm, //!< X86 [RM] (doesn't handle single-byte size). kEncodingX86Rm_Raw66H, //!< X86 [RM] (used by LZCNT, POPCNT, and TZCNT). kEncodingX86Rm_NoSize, //!< X86 [RM] (doesn't add REX.W prefix if 64-bit reg is used). @@ -126,6 +127,7 @@ enum EncodingId : uint32_t { kEncodingVexMri, //!< VEX|EVEX [MRI]. kEncodingVexMri_Lx, //!< VEX|EVEX [MRI] (propagates VEX|EVEX.L if YMM used). kEncodingVexMri_Vpextrw, //!< VEX|EVEX [MRI] (special case required by VPEXTRW instruction). + kEncodingVexMvr_Wx, //!< VEX|EVEX [MVR] (propagates VEX|EVEX.W if GPQ used). kEncodingVexRm, //!< VEX|EVEX [RM]. kEncodingVexRm_ZDI, //!< VEX|EVEX [RM]. kEncodingVexRm_Wx, //!< VEX|EVEX [RM] (propagates VEX|EVEX.W if GPQ used). @@ -200,20 +202,10 @@ struct AdditionalInfo { inline const uint8_t* featuresEnd() const noexcept { return _features + ASMJIT_ARRAY_SIZE(_features); } }; -// ${NameLimits:Begin} -// ------------------- Automatically generated, do not edit ------------------- -enum : uint32_t { kMaxNameSize = 17 }; -// ---------------------------------------------------------------------------- -// ${NameLimits:End} - -struct InstNameIndex { - uint16_t start; - uint16_t end; -}; - struct RWInfo { enum Category : uint8_t { - kCategoryGeneric, + kCategoryGeneric = 0, + kCategoryGenericEx, kCategoryMov, kCategoryMovabs, kCategoryImul, @@ -295,8 +287,9 @@ extern const uint32_t _mainOpcodeTable[]; extern const uint32_t _altOpcodeTable[]; #ifndef ASMJIT_NO_TEXT -extern const char _nameData[]; -extern const InstNameIndex instNameIndex[26]; +extern const InstNameIndex instNameIndex; +extern const char _instNameStringTable[]; +extern const uint32_t _instNameIndexTable[]; #endif // !ASMJIT_NO_TEXT extern const AdditionalInfo _additionalInfoTable[]; diff --git a/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h b/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h index 94a76f0481802..ab0b13e1a5006 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h @@ -45,7 +45,7 @@ struct Opcode { //! `pp` in instruction manuals. //! //! - `LL` field is used exclusively by AVX+ and AVX512+ instruction sets. It describes vector size, which is `L.128` - //! for XMM register, `L.256` for for YMM register, and `L.512` for ZMM register. The `LL` field is omitted in case + //! for XMM register, `L.256` for YMM register, and `L.512` for ZMM register. The `LL` field is omitted in case //! that instruction supports multiple vector lengths, however, if the instruction requires specific `L` value it //! must be specified as a part of the opcode. //! @@ -244,7 +244,7 @@ struct Opcode { // REX|VEX|EVEX B|X|R|W Bits // ------------------------- // - // NOTE: REX.[B|X|R] are never stored within the opcode itself, they are reserved by AsmJit are are added + // NOTE: REX.[B|X|R] are never stored within the opcode itself, they are reserved by AsmJit and are added // dynamically to the opcode to represent [REX|VEX|EVEX].[B|X|R] bits. REX.W can be stored in DB as it's sometimes // part of the opcode itself. @@ -280,7 +280,7 @@ struct Opcode { // `L` or `LL` field in AVX/XOP/AVX-512 // ------------------------------------ // - // VEX/XOP prefix can only use the first bit `L.128` or `L.256`. EVEX prefix prefix makes it possible to use also + // VEX/XOP prefix can only use the first bit `L.128` or `L.256`. EVEX prefix makes it possible to use also // `L.512`. If the instruction set manual describes an instruction by `LIG` it means that the `L` field is ignored // and AsmJit defaults to `0` in such case. kLL_Shift = 29, @@ -336,27 +336,27 @@ struct Opcode { // Opcode Builder // -------------- - inline uint32_t get() const noexcept { return v; } + ASMJIT_INLINE_NODEBUG uint32_t get() const noexcept { return v; } - inline bool hasW() const noexcept { return (v & kW) != 0; } - inline bool has66h() const noexcept { return (v & kPP_66) != 0; } + ASMJIT_INLINE_NODEBUG bool hasW() const noexcept { return (v & kW) != 0; } + ASMJIT_INLINE_NODEBUG bool has66h() const noexcept { return (v & kPP_66) != 0; } - inline Opcode& add(uint32_t x) noexcept { return operator+=(x); } + ASMJIT_INLINE_NODEBUG Opcode& add(uint32_t x) noexcept { return operator+=(x); } - inline Opcode& add66h() noexcept { return operator|=(kPP_66); } + ASMJIT_INLINE_NODEBUG Opcode& add66h() noexcept { return operator|=(kPP_66); } template - inline Opcode& add66hIf(T exp) noexcept { return operator|=(uint32_t(exp) << kPP_Shift); } + ASMJIT_INLINE_NODEBUG Opcode& add66hIf(T exp) noexcept { return operator|=(uint32_t(exp) << kPP_Shift); } template - inline Opcode& add66hBySize(T size) noexcept { return add66hIf(size == 2); } + ASMJIT_INLINE_NODEBUG Opcode& add66hBySize(T size) noexcept { return add66hIf(size == 2); } - inline Opcode& addW() noexcept { return operator|=(kW); } + ASMJIT_INLINE_NODEBUG Opcode& addW() noexcept { return operator|=(kW); } template - inline Opcode& addWIf(T exp) noexcept { return operator|=(uint32_t(exp) << kW_Shift); } + ASMJIT_INLINE_NODEBUG Opcode& addWIf(T exp) noexcept { return operator|=(uint32_t(exp) << kW_Shift); } template - inline Opcode& addWBySize(T size) noexcept { return addWIf(size == 8); } + ASMJIT_INLINE_NODEBUG Opcode& addWBySize(T size) noexcept { return addWIf(size == 8); } template - inline Opcode& addPrefixBySize(T size) noexcept { + ASMJIT_INLINE_NODEBUG Opcode& addPrefixBySize(T size) noexcept { static const uint32_t mask[16] = { 0, // #0 0, // #1 -> nothing (already handled or not possible) @@ -372,7 +372,7 @@ struct Opcode { } template - inline Opcode& addArithBySize(T size) noexcept { + ASMJIT_INLINE_NODEBUG Opcode& addArithBySize(T size) noexcept { static const uint32_t mask[16] = { 0, // #0 0, // #1 -> nothing @@ -387,45 +387,45 @@ struct Opcode { return operator|=(mask[size & 0xF]); } - inline Opcode& forceEvex() noexcept { return operator|=(kMM_ForceEvex); } + ASMJIT_INLINE_NODEBUG Opcode& forceEvex() noexcept { return operator|=(kMM_ForceEvex); } template - inline Opcode& forceEvexIf(T exp) noexcept { return operator|=(uint32_t(exp) << Support::ConstCTZ::value); } + ASMJIT_INLINE_NODEBUG Opcode& forceEvexIf(T exp) noexcept { return operator|=(uint32_t(exp) << Support::ConstCTZ::value); } //! Extract `O` field (R) from the opcode (specified as /0..7 in instruction manuals). - inline uint32_t extractModO() const noexcept { + ASMJIT_INLINE_NODEBUG uint32_t extractModO() const noexcept { return (v >> kModO_Shift) & 0x07; } //! Extract `RM` field (RM) from the opcode (usually specified as another opcode value). - inline uint32_t extractModRM() const noexcept { + ASMJIT_INLINE_NODEBUG uint32_t extractModRM() const noexcept { return (v >> kModRM_Shift) & 0x07; } //! Extract `REX` prefix from opcode combined with `options`. - inline uint32_t extractRex(InstOptions options) const noexcept { + ASMJIT_INLINE_NODEBUG uint32_t extractRex(InstOptions options) const noexcept { // kREX was designed in a way that when shifted there will be no bytes set except REX.[B|X|R|W]. // The returned value forms a real REX prefix byte. This case should be unit-tested as well. return (v | uint32_t(options)) >> kREX_Shift; } - inline uint32_t extractLLMMMMM(InstOptions options) const noexcept { + ASMJIT_INLINE_NODEBUG uint32_t extractLLMMMMM(InstOptions options) const noexcept { uint32_t llMmmmm = uint32_t(v & (kLL_Mask | kMM_Mask)); uint32_t vexEvex = uint32_t(options & InstOptions::kX86_Evex); return (llMmmmm | vexEvex) >> kMM_Shift; } - inline Opcode& operator=(uint32_t x) noexcept { v = x; return *this; } - inline Opcode& operator+=(uint32_t x) noexcept { v += x; return *this; } - inline Opcode& operator-=(uint32_t x) noexcept { v -= x; return *this; } - inline Opcode& operator&=(uint32_t x) noexcept { v &= x; return *this; } - inline Opcode& operator|=(uint32_t x) noexcept { v |= x; return *this; } - inline Opcode& operator^=(uint32_t x) noexcept { v ^= x; return *this; } - - inline uint32_t operator&(uint32_t x) const noexcept { return v & x; } - inline uint32_t operator|(uint32_t x) const noexcept { return v | x; } - inline uint32_t operator^(uint32_t x) const noexcept { return v ^ x; } - inline uint32_t operator<<(uint32_t x) const noexcept { return v << x; } - inline uint32_t operator>>(uint32_t x) const noexcept { return v >> x; } + ASMJIT_INLINE_NODEBUG Opcode& operator=(uint32_t x) noexcept { v = x; return *this; } + ASMJIT_INLINE_NODEBUG Opcode& operator+=(uint32_t x) noexcept { v += x; return *this; } + ASMJIT_INLINE_NODEBUG Opcode& operator-=(uint32_t x) noexcept { v -= x; return *this; } + ASMJIT_INLINE_NODEBUG Opcode& operator&=(uint32_t x) noexcept { v &= x; return *this; } + ASMJIT_INLINE_NODEBUG Opcode& operator|=(uint32_t x) noexcept { v |= x; return *this; } + ASMJIT_INLINE_NODEBUG Opcode& operator^=(uint32_t x) noexcept { v ^= x; return *this; } + + ASMJIT_INLINE_NODEBUG uint32_t operator&(uint32_t x) const noexcept { return v & x; } + ASMJIT_INLINE_NODEBUG uint32_t operator|(uint32_t x) const noexcept { return v | x; } + ASMJIT_INLINE_NODEBUG uint32_t operator^(uint32_t x) const noexcept { return v ^ x; } + ASMJIT_INLINE_NODEBUG uint32_t operator<<(uint32_t x) const noexcept { return v << x; } + ASMJIT_INLINE_NODEBUG uint32_t operator>>(uint32_t x) const noexcept { return v >> x; } }; //! \} diff --git a/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp b/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp index a47fec2b5b293..5ab50de570e0d 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp @@ -19,210 +19,210 @@ UNIT(x86_operand) { Label L(1000); // Label with some ID. INFO("Checking basic properties of built-in X86 registers"); - EXPECT(gpb(Gp::kIdAx) == al); - EXPECT(gpb(Gp::kIdBx) == bl); - EXPECT(gpb(Gp::kIdCx) == cl); - EXPECT(gpb(Gp::kIdDx) == dl); - - EXPECT(gpb_lo(Gp::kIdAx) == al); - EXPECT(gpb_lo(Gp::kIdBx) == bl); - EXPECT(gpb_lo(Gp::kIdCx) == cl); - EXPECT(gpb_lo(Gp::kIdDx) == dl); - - EXPECT(gpb_hi(Gp::kIdAx) == ah); - EXPECT(gpb_hi(Gp::kIdBx) == bh); - EXPECT(gpb_hi(Gp::kIdCx) == ch); - EXPECT(gpb_hi(Gp::kIdDx) == dh); - - EXPECT(gpw(Gp::kIdAx) == ax); - EXPECT(gpw(Gp::kIdBx) == bx); - EXPECT(gpw(Gp::kIdCx) == cx); - EXPECT(gpw(Gp::kIdDx) == dx); - - EXPECT(gpd(Gp::kIdAx) == eax); - EXPECT(gpd(Gp::kIdBx) == ebx); - EXPECT(gpd(Gp::kIdCx) == ecx); - EXPECT(gpd(Gp::kIdDx) == edx); - - EXPECT(gpq(Gp::kIdAx) == rax); - EXPECT(gpq(Gp::kIdBx) == rbx); - EXPECT(gpq(Gp::kIdCx) == rcx); - EXPECT(gpq(Gp::kIdDx) == rdx); - - EXPECT(gpb(Gp::kIdAx) != dl); - EXPECT(gpw(Gp::kIdBx) != cx); - EXPECT(gpd(Gp::kIdCx) != ebx); - EXPECT(gpq(Gp::kIdDx) != rax); + EXPECT_EQ(gpb(Gp::kIdAx), al); + EXPECT_EQ(gpb(Gp::kIdBx), bl); + EXPECT_EQ(gpb(Gp::kIdCx), cl); + EXPECT_EQ(gpb(Gp::kIdDx), dl); + + EXPECT_EQ(gpb_lo(Gp::kIdAx), al); + EXPECT_EQ(gpb_lo(Gp::kIdBx), bl); + EXPECT_EQ(gpb_lo(Gp::kIdCx), cl); + EXPECT_EQ(gpb_lo(Gp::kIdDx), dl); + + EXPECT_EQ(gpb_hi(Gp::kIdAx), ah); + EXPECT_EQ(gpb_hi(Gp::kIdBx), bh); + EXPECT_EQ(gpb_hi(Gp::kIdCx), ch); + EXPECT_EQ(gpb_hi(Gp::kIdDx), dh); + + EXPECT_EQ(gpw(Gp::kIdAx), ax); + EXPECT_EQ(gpw(Gp::kIdBx), bx); + EXPECT_EQ(gpw(Gp::kIdCx), cx); + EXPECT_EQ(gpw(Gp::kIdDx), dx); + + EXPECT_EQ(gpd(Gp::kIdAx), eax); + EXPECT_EQ(gpd(Gp::kIdBx), ebx); + EXPECT_EQ(gpd(Gp::kIdCx), ecx); + EXPECT_EQ(gpd(Gp::kIdDx), edx); + + EXPECT_EQ(gpq(Gp::kIdAx), rax); + EXPECT_EQ(gpq(Gp::kIdBx), rbx); + EXPECT_EQ(gpq(Gp::kIdCx), rcx); + EXPECT_EQ(gpq(Gp::kIdDx), rdx); + + EXPECT_NE(gpb(Gp::kIdAx), dl); + EXPECT_NE(gpw(Gp::kIdBx), cx); + EXPECT_NE(gpd(Gp::kIdCx), ebx); + EXPECT_NE(gpq(Gp::kIdDx), rax); INFO("Checking if x86::reg(...) matches built-in IDs"); - EXPECT(gpb(5) == bpl); - EXPECT(gpw(5) == bp); - EXPECT(gpd(5) == ebp); - EXPECT(gpq(5) == rbp); - EXPECT(st(5) == st5); - EXPECT(mm(5) == mm5); - EXPECT(k(5) == k5); - EXPECT(cr(5) == cr5); - EXPECT(dr(5) == dr5); - EXPECT(xmm(5) == xmm5); - EXPECT(ymm(5) == ymm5); - EXPECT(zmm(5) == zmm5); + EXPECT_EQ(gpb(5), bpl); + EXPECT_EQ(gpw(5), bp); + EXPECT_EQ(gpd(5), ebp); + EXPECT_EQ(gpq(5), rbp); + EXPECT_EQ(st(5) , st5); + EXPECT_EQ(mm(5) , mm5); + EXPECT_EQ(k(5) , k5); + EXPECT_EQ(cr(5) , cr5); + EXPECT_EQ(dr(5) , dr5); + EXPECT_EQ(xmm(5), xmm5); + EXPECT_EQ(ymm(5), ymm5); + EXPECT_EQ(zmm(5), zmm5); INFO("Checking x86::Gp register properties"); - EXPECT(Gp().isReg() == true); - EXPECT(eax.isReg() == true); - EXPECT(eax.id() == 0); - EXPECT(eax.size() == 4); - EXPECT(eax.type() == RegType::kX86_Gpd); - EXPECT(eax.group() == RegGroup::kGp); + EXPECT_TRUE(Gp().isReg()); + EXPECT_TRUE(eax.isReg()); + EXPECT_EQ(eax.id(), 0u); + EXPECT_EQ(eax.size(), 4u); + EXPECT_EQ(eax.type(), RegType::kX86_Gpd); + EXPECT_EQ(eax.group(), RegGroup::kGp); INFO("Checking x86::Xmm register properties"); - EXPECT(Xmm().isReg() == true); - EXPECT(xmm4.isReg() == true); - EXPECT(xmm4.id() == 4); - EXPECT(xmm4.size() == 16); - EXPECT(xmm4.type() == RegType::kX86_Xmm); - EXPECT(xmm4.group() == RegGroup::kVec); - EXPECT(xmm4.isVec()); + EXPECT_TRUE(Xmm().isReg()); + EXPECT_TRUE(xmm4.isReg()); + EXPECT_EQ(xmm4.id(), 4u); + EXPECT_EQ(xmm4.size(), 16u); + EXPECT_EQ(xmm4.type(), RegType::kX86_Xmm); + EXPECT_EQ(xmm4.group(), RegGroup::kVec); + EXPECT_TRUE(xmm4.isVec()); INFO("Checking x86::Ymm register properties"); - EXPECT(Ymm().isReg() == true); - EXPECT(ymm5.isReg() == true); - EXPECT(ymm5.id() == 5); - EXPECT(ymm5.size() == 32); - EXPECT(ymm5.type() == RegType::kX86_Ymm); - EXPECT(ymm5.group() == RegGroup::kVec); - EXPECT(ymm5.isVec()); + EXPECT_TRUE(Ymm().isReg()); + EXPECT_TRUE(ymm5.isReg()); + EXPECT_EQ(ymm5.id(), 5u); + EXPECT_EQ(ymm5.size(), 32u); + EXPECT_EQ(ymm5.type(), RegType::kX86_Ymm); + EXPECT_EQ(ymm5.group(), RegGroup::kVec); + EXPECT_TRUE(ymm5.isVec()); INFO("Checking x86::Zmm register properties"); - EXPECT(Zmm().isReg() == true); - EXPECT(zmm6.isReg() == true); - EXPECT(zmm6.id() == 6); - EXPECT(zmm6.size() == 64); - EXPECT(zmm6.type() == RegType::kX86_Zmm); - EXPECT(zmm6.group() == RegGroup::kVec); - EXPECT(zmm6.isVec()); + EXPECT_TRUE(Zmm().isReg()); + EXPECT_TRUE(zmm6.isReg()); + EXPECT_EQ(zmm6.id(), 6u); + EXPECT_EQ(zmm6.size(), 64u); + EXPECT_EQ(zmm6.type(), RegType::kX86_Zmm); + EXPECT_EQ(zmm6.group(), RegGroup::kVec); + EXPECT_TRUE(zmm6.isVec()); INFO("Checking x86::Vec register properties"); - EXPECT(Vec().isReg() == true); + EXPECT_TRUE(Vec().isReg()); // Converts a VEC register to a type of the passed register, but keeps the ID. - EXPECT(xmm4.cloneAs(ymm10) == ymm4); - EXPECT(xmm4.cloneAs(zmm11) == zmm4); - EXPECT(ymm5.cloneAs(xmm12) == xmm5); - EXPECT(ymm5.cloneAs(zmm13) == zmm5); - EXPECT(zmm6.cloneAs(xmm14) == xmm6); - EXPECT(zmm6.cloneAs(ymm15) == ymm6); + EXPECT_EQ(xmm4.cloneAs(ymm10), ymm4); + EXPECT_EQ(xmm4.cloneAs(zmm11), zmm4); + EXPECT_EQ(ymm5.cloneAs(xmm12), xmm5); + EXPECT_EQ(ymm5.cloneAs(zmm13), zmm5); + EXPECT_EQ(zmm6.cloneAs(xmm14), xmm6); + EXPECT_EQ(zmm6.cloneAs(ymm15), ymm6); - EXPECT(xmm7.xmm() == xmm7); - EXPECT(xmm7.ymm() == ymm7); - EXPECT(xmm7.zmm() == zmm7); + EXPECT_EQ(xmm7.xmm(), xmm7); + EXPECT_EQ(xmm7.ymm(), ymm7); + EXPECT_EQ(xmm7.zmm(), zmm7); - EXPECT(ymm7.xmm() == xmm7); - EXPECT(ymm7.ymm() == ymm7); - EXPECT(ymm7.zmm() == zmm7); + EXPECT_EQ(ymm7.xmm(), xmm7); + EXPECT_EQ(ymm7.ymm(), ymm7); + EXPECT_EQ(ymm7.zmm(), zmm7); - EXPECT(zmm7.xmm() == xmm7); - EXPECT(zmm7.ymm() == ymm7); - EXPECT(zmm7.zmm() == zmm7); + EXPECT_EQ(zmm7.xmm(), xmm7); + EXPECT_EQ(zmm7.ymm(), ymm7); + EXPECT_EQ(zmm7.zmm(), zmm7); INFO("Checking x86::Mm register properties"); - EXPECT(Mm().isReg() == true); - EXPECT(mm2.isReg() == true); - EXPECT(mm2.id() == 2); - EXPECT(mm2.size() == 8); - EXPECT(mm2.type() == RegType::kX86_Mm); - EXPECT(mm2.group() == RegGroup::kX86_MM); + EXPECT_TRUE(Mm().isReg()); + EXPECT_TRUE(mm2.isReg()); + EXPECT_EQ(mm2.id(), 2u); + EXPECT_EQ(mm2.size(), 8u); + EXPECT_EQ(mm2.type(), RegType::kX86_Mm); + EXPECT_EQ(mm2.group(), RegGroup::kX86_MM); INFO("Checking x86::KReg register properties"); - EXPECT(KReg().isReg() == true); - EXPECT(k3.isReg() == true); - EXPECT(k3.id() == 3); - EXPECT(k3.size() == 0); - EXPECT(k3.type() == RegType::kX86_KReg); - EXPECT(k3.group() == RegGroup::kX86_K); + EXPECT_TRUE(KReg().isReg()); + EXPECT_TRUE(k3.isReg()); + EXPECT_EQ(k3.id(), 3u); + EXPECT_EQ(k3.size(), 0u); + EXPECT_EQ(k3.type(), RegType::kX86_KReg); + EXPECT_EQ(k3.group(), RegGroup::kX86_K); INFO("Checking x86::St register properties"); - EXPECT(St().isReg() == true); - EXPECT(st1.isReg() == true); - EXPECT(st1.id() == 1); - EXPECT(st1.size() == 10); - EXPECT(st1.type() == RegType::kX86_St); - EXPECT(st1.group() == RegGroup::kX86_St); + EXPECT_TRUE(St().isReg()); + EXPECT_TRUE(st1.isReg()); + EXPECT_EQ(st1.id(), 1u); + EXPECT_EQ(st1.size(), 10u); + EXPECT_EQ(st1.type(), RegType::kX86_St); + EXPECT_EQ(st1.group(), RegGroup::kX86_St); INFO("Checking if default constructed regs behave as expected"); - EXPECT(Reg().isValid() == false); - EXPECT(Gp().isValid() == false); - EXPECT(Xmm().isValid() == false); - EXPECT(Ymm().isValid() == false); - EXPECT(Zmm().isValid() == false); - EXPECT(Mm().isValid() == false); - EXPECT(KReg().isValid() == false); - EXPECT(SReg().isValid() == false); - EXPECT(CReg().isValid() == false); - EXPECT(DReg().isValid() == false); - EXPECT(St().isValid() == false); - EXPECT(Bnd().isValid() == false); + EXPECT_FALSE(Reg().isValid()); + EXPECT_FALSE(Gp().isValid()); + EXPECT_FALSE(Xmm().isValid()); + EXPECT_FALSE(Ymm().isValid()); + EXPECT_FALSE(Zmm().isValid()); + EXPECT_FALSE(Mm().isValid()); + EXPECT_FALSE(KReg().isValid()); + EXPECT_FALSE(SReg().isValid()); + EXPECT_FALSE(CReg().isValid()); + EXPECT_FALSE(DReg().isValid()); + EXPECT_FALSE(St().isValid()); + EXPECT_FALSE(Bnd().isValid()); INFO("Checking x86::Mem operand"); Mem m; - EXPECT(m == Mem(), "Two default constructed x86::Mem operands must be equal"); + EXPECT_EQ(m, Mem()); m = ptr(L); - EXPECT(m.hasBase() == true); - EXPECT(m.hasBaseReg() == false); - EXPECT(m.hasBaseLabel() == true); - EXPECT(m.hasOffset() == false); - EXPECT(m.isOffset64Bit() == false); - EXPECT(m.offset() == 0); - EXPECT(m.offsetLo32() == 0); + EXPECT_TRUE(m.hasBase()); + EXPECT_FALSE(m.hasBaseReg()); + EXPECT_TRUE(m.hasBaseLabel()); + EXPECT_FALSE(m.hasOffset()); + EXPECT_FALSE(m.isOffset64Bit()); + EXPECT_EQ(m.offset(), 0); + EXPECT_EQ(m.offsetLo32(), 0); m = ptr(0x0123456789ABCDEFu); - EXPECT(m.hasBase() == false); - EXPECT(m.hasBaseReg() == false); - EXPECT(m.hasIndex() == false); - EXPECT(m.hasIndexReg() == false); - EXPECT(m.hasOffset() == true); - EXPECT(m.isOffset64Bit() == true); - EXPECT(m.offset() == int64_t(0x0123456789ABCDEFu)); - EXPECT(m.offsetLo32() == int32_t(0x89ABCDEFu)); + EXPECT_FALSE(m.hasBase()); + EXPECT_FALSE(m.hasBaseReg()); + EXPECT_FALSE(m.hasIndex()); + EXPECT_FALSE(m.hasIndexReg()); + EXPECT_TRUE(m.hasOffset()); + EXPECT_TRUE(m.isOffset64Bit()); + EXPECT_EQ(m.offset(), int64_t(0x0123456789ABCDEFu)); + EXPECT_EQ(m.offsetLo32(), int32_t(0x89ABCDEFu)); m.addOffset(1); - EXPECT(m.offset() == int64_t(0x0123456789ABCDF0u)); + EXPECT_EQ(m.offset(), int64_t(0x0123456789ABCDF0u)); m = ptr(0x0123456789ABCDEFu, rdi, 3); - EXPECT(m.hasSegment() == false); - EXPECT(m.hasBase() == false); - EXPECT(m.hasBaseReg() == false); - EXPECT(m.hasIndex() == true); - EXPECT(m.hasIndexReg() == true); - EXPECT(m.indexType() == rdi.type()); - EXPECT(m.indexId() == rdi.id()); - EXPECT(m.shift() == 3); - EXPECT(m.hasOffset() == true); - EXPECT(m.isOffset64Bit() == true); - EXPECT(m.offset() == int64_t(0x0123456789ABCDEFu)); - EXPECT(m.offsetLo32() == int32_t(0x89ABCDEFu)); + EXPECT_FALSE(m.hasSegment()); + EXPECT_FALSE(m.hasBase()); + EXPECT_FALSE(m.hasBaseReg()); + EXPECT_TRUE(m.hasIndex()); + EXPECT_TRUE(m.hasIndexReg()); + EXPECT_EQ(m.indexType(), rdi.type()); + EXPECT_EQ(m.indexId(), rdi.id()); + EXPECT_EQ(m.shift(), 3u); + EXPECT_TRUE(m.hasOffset()); + EXPECT_TRUE(m.isOffset64Bit()); + EXPECT_EQ(m.offset(), int64_t(0x0123456789ABCDEFu)); + EXPECT_EQ(m.offsetLo32(), int32_t(0x89ABCDEFu)); m.resetIndex(); - EXPECT(m.hasIndex() == false); - EXPECT(m.hasIndexReg() == false); + EXPECT_FALSE(m.hasIndex()); + EXPECT_FALSE(m.hasIndexReg()); m = ptr(rax); - EXPECT(m.hasBase() == true); - EXPECT(m.hasBaseReg() == true); - EXPECT(m.baseType() == rax.type()); - EXPECT(m.baseId() == rax.id()); - EXPECT(m.hasIndex() == false); - EXPECT(m.hasIndexReg() == false); - EXPECT(m.indexType() == RegType::kNone); - EXPECT(m.indexId() == 0); - EXPECT(m.hasOffset() == false); - EXPECT(m.isOffset64Bit() == false); - EXPECT(m.offset() == 0); - EXPECT(m.offsetLo32() == 0); + EXPECT_TRUE(m.hasBase()); + EXPECT_TRUE(m.hasBaseReg()); + EXPECT_EQ(m.baseType(), rax.type()); + EXPECT_EQ(m.baseId(), rax.id()); + EXPECT_FALSE(m.hasIndex()); + EXPECT_FALSE(m.hasIndexReg()); + EXPECT_EQ(m.indexType(), RegType::kNone); + EXPECT_EQ(m.indexId(), 0u); + EXPECT_FALSE(m.hasOffset()); + EXPECT_FALSE(m.isOffset64Bit()); + EXPECT_EQ(m.offset(), 0); + EXPECT_EQ(m.offsetLo32(), 0); m.setIndex(rsi); - EXPECT(m.hasIndex() == true); - EXPECT(m.hasIndexReg() == true); - EXPECT(m.indexType() == rsi.type()); - EXPECT(m.indexId() == rsi.id()); + EXPECT_TRUE(m.hasIndex()); + EXPECT_TRUE(m.hasIndexReg()); + EXPECT_EQ(m.indexType(), rsi.type()); + EXPECT_EQ(m.indexId(), rsi.id()); } #endif diff --git a/3rdparty/asmjit/src/asmjit/x86/x86operand.h b/3rdparty/asmjit/src/asmjit/x86/x86operand.h index 037d4af4ddf60..ac56731c98265 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86operand.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86operand.h @@ -49,26 +49,26 @@ template struct RegTraits : public BaseRegTraits {}; //! \cond -// <--------------------+-----+-------------------------+------------------------+---+---+------------------+ -// | Reg | Reg-Type | Reg-Group |Sz |Cnt| TypeId | -// <--------------------+-----+-------------------------+------------------------+---+---+------------------+ -ASMJIT_DEFINE_REG_TRAITS(Rip , RegType::kX86_Rip , RegGroup::kX86_Rip , 0 , 1 , TypeId::kVoid ); -ASMJIT_DEFINE_REG_TRAITS(GpbLo, RegType::kX86_GpbLo , RegGroup::kGp , 1 , 16, TypeId::kInt8 ); -ASMJIT_DEFINE_REG_TRAITS(GpbHi, RegType::kX86_GpbHi , RegGroup::kGp , 1 , 4 , TypeId::kInt8 ); -ASMJIT_DEFINE_REG_TRAITS(Gpw , RegType::kX86_Gpw , RegGroup::kGp , 2 , 16, TypeId::kInt16 ); -ASMJIT_DEFINE_REG_TRAITS(Gpd , RegType::kX86_Gpd , RegGroup::kGp , 4 , 16, TypeId::kInt32 ); -ASMJIT_DEFINE_REG_TRAITS(Gpq , RegType::kX86_Gpq , RegGroup::kGp , 8 , 16, TypeId::kInt64 ); -ASMJIT_DEFINE_REG_TRAITS(Xmm , RegType::kX86_Xmm , RegGroup::kVec , 16, 32, TypeId::kInt32x4 ); -ASMJIT_DEFINE_REG_TRAITS(Ymm , RegType::kX86_Ymm , RegGroup::kVec , 32, 32, TypeId::kInt32x8 ); -ASMJIT_DEFINE_REG_TRAITS(Zmm , RegType::kX86_Zmm , RegGroup::kVec , 64, 32, TypeId::kInt32x16); -ASMJIT_DEFINE_REG_TRAITS(KReg , RegType::kX86_KReg , RegGroup::kX86_K , 0 , 8 , TypeId::kVoid ); -ASMJIT_DEFINE_REG_TRAITS(Mm , RegType::kX86_Mm , RegGroup::kX86_MM , 8 , 8 , TypeId::kMmx64 ); -ASMJIT_DEFINE_REG_TRAITS(SReg , RegType::kX86_SReg , RegGroup::kX86_SReg , 2 , 7 , TypeId::kVoid ); -ASMJIT_DEFINE_REG_TRAITS(CReg , RegType::kX86_CReg , RegGroup::kX86_CReg , 0 , 16, TypeId::kVoid ); -ASMJIT_DEFINE_REG_TRAITS(DReg , RegType::kX86_DReg , RegGroup::kX86_DReg , 0 , 16, TypeId::kVoid ); -ASMJIT_DEFINE_REG_TRAITS(St , RegType::kX86_St , RegGroup::kX86_St , 10, 8 , TypeId::kFloat80 ); -ASMJIT_DEFINE_REG_TRAITS(Bnd , RegType::kX86_Bnd , RegGroup::kX86_Bnd , 16, 4 , TypeId::kVoid ); -ASMJIT_DEFINE_REG_TRAITS(Tmm , RegType::kX86_Tmm , RegGroup::kX86_Tmm , 0 , 8 , TypeId::kVoid ); +// <--------------------+------------------------+------------------------+---+------------------+ +// | Reg-Type | Reg-Group |Sz | TypeId | +// <--------------------+------------------------+------------------------+---+------------------+ +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Rip , RegGroup::kX86_Rip , 0 , TypeId::kVoid ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_GpbLo , RegGroup::kGp , 1 , TypeId::kInt8 ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_GpbHi , RegGroup::kGp , 1 , TypeId::kInt8 ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Gpw , RegGroup::kGp , 2 , TypeId::kInt16 ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Gpd , RegGroup::kGp , 4 , TypeId::kInt32 ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Gpq , RegGroup::kGp , 8 , TypeId::kInt64 ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Xmm , RegGroup::kVec , 16, TypeId::kInt32x4 ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Ymm , RegGroup::kVec , 32, TypeId::kInt32x8 ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Zmm , RegGroup::kVec , 64, TypeId::kInt32x16); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_KReg , RegGroup::kX86_K , 0 , TypeId::kVoid ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Mm , RegGroup::kX86_MM , 8 , TypeId::kMmx64 ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_SReg , RegGroup::kX86_SReg , 2 , TypeId::kVoid ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_CReg , RegGroup::kX86_CReg , 0 , TypeId::kVoid ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_DReg , RegGroup::kX86_DReg , 0 , TypeId::kVoid ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_St , RegGroup::kX86_St , 10, TypeId::kFloat80 ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Bnd , RegGroup::kX86_Bnd , 16, TypeId::kVoid ); +ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Tmm , RegGroup::kX86_Tmm , 0 , TypeId::kVoid ); //! \endcond //! Register (X86). @@ -77,121 +77,135 @@ class Reg : public BaseReg { ASMJIT_DEFINE_ABSTRACT_REG(Reg, BaseReg) //! Tests whether the register is a GPB register (8-bit). - inline constexpr bool isGpb() const noexcept { return size() == 1; } + ASMJIT_INLINE_NODEBUG constexpr bool isGpb() const noexcept { return size() == 1; } //! Tests whether the register is a low GPB register (8-bit). - inline constexpr bool isGpbLo() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isGpbLo() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a high GPB register (8-bit). - inline constexpr bool isGpbHi() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isGpbHi() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a GPW register (16-bit). - inline constexpr bool isGpw() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isGpw() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a GPD register (32-bit). - inline constexpr bool isGpd() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isGpd() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a GPQ register (64-bit). - inline constexpr bool isGpq() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isGpq() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + + //! Tests whether the register is a 32-bit general purpose register, alias of \ref isGpd(). + ASMJIT_INLINE_NODEBUG constexpr bool isGp32() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + //! Tests whether the register is a 64-bit general purpose register, alias of \ref isGpq() + ASMJIT_INLINE_NODEBUG constexpr bool isGp64() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + //! Tests whether the register is an XMM register (128-bit). - inline constexpr bool isXmm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isXmm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a YMM register (256-bit). - inline constexpr bool isYmm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isYmm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a ZMM register (512-bit). - inline constexpr bool isZmm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isZmm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + + //! Tests whether the register is a 128-bit vector register, alias of \ref isXmm(). + ASMJIT_INLINE_NODEBUG constexpr bool isVec128() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + //! Tests whether the register is a 256-bit vector register, alias of \ref isYmm(). + ASMJIT_INLINE_NODEBUG constexpr bool isVec256() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + //! Tests whether the register is a 512-bit vector register, alias of \ref isZmm(). + ASMJIT_INLINE_NODEBUG constexpr bool isVec512() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + //! Tests whether the register is an MMX register (64-bit). - inline constexpr bool isMm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isMm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a K register (64-bit). - inline constexpr bool isKReg() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isKReg() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a segment register. - inline constexpr bool isSReg() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isSReg() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a control register. - inline constexpr bool isCReg() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isCReg() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a debug register. - inline constexpr bool isDReg() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isDReg() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is an FPU register (80-bit). - inline constexpr bool isSt() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isSt() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a bound register. - inline constexpr bool isBnd() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isBnd() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is a TMM register. - inline constexpr bool isTmm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isTmm() const noexcept { return hasBaseSignature(RegTraits::kSignature); } //! Tests whether the register is RIP. - inline constexpr bool isRip() const noexcept { return hasBaseSignature(RegTraits::kSignature); } + ASMJIT_INLINE_NODEBUG constexpr bool isRip() const noexcept { return hasBaseSignature(RegTraits::kSignature); } template - inline void setRegT(uint32_t rId) noexcept { + ASMJIT_INLINE_NODEBUG void setRegT(uint32_t rId) noexcept { setSignature(OperandSignature{RegTraits::kSignature}); setId(rId); } - inline void setTypeAndId(RegType type, uint32_t id) noexcept { + ASMJIT_INLINE_NODEBUG void setTypeAndId(RegType type, uint32_t id) noexcept { setSignature(signatureOf(type)); setId(id); } - static inline RegGroup groupOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToGroup(type); } - static inline TypeId typeIdOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToTypeId(type); } - static inline OperandSignature signatureOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToSignature(type); } + static ASMJIT_INLINE_NODEBUG RegGroup groupOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToGroup(type); } + static ASMJIT_INLINE_NODEBUG TypeId typeIdOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToTypeId(type); } + static ASMJIT_INLINE_NODEBUG OperandSignature signatureOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToSignature(type); } template - static inline RegGroup groupOfT() noexcept { return RegGroup(RegTraits::kGroup); } + static ASMJIT_INLINE_NODEBUG RegGroup groupOfT() noexcept { return RegGroup(RegTraits::kGroup); } template - static inline TypeId typeIdOfT() noexcept { return TypeId(RegTraits::kTypeId); } + static ASMJIT_INLINE_NODEBUG TypeId typeIdOfT() noexcept { return TypeId(RegTraits::kTypeId); } template - static inline OperandSignature signatureOfT() noexcept { return OperandSignature{RegTraits::kSignature}; } + static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfT() noexcept { return OperandSignature{RegTraits::kSignature}; } - static inline OperandSignature signatureOfVecByType(TypeId typeId) noexcept { + static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfVecByType(TypeId typeId) noexcept { return OperandSignature{typeId <= TypeId::_kVec128End ? uint32_t(RegTraits::kSignature) : typeId <= TypeId::_kVec256End ? uint32_t(RegTraits::kSignature) : uint32_t(RegTraits::kSignature)}; } - static inline OperandSignature signatureOfVecBySize(uint32_t size) noexcept { + static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfVecBySize(uint32_t size) noexcept { return OperandSignature{size <= 16 ? uint32_t(RegTraits::kSignature) : size <= 32 ? uint32_t(RegTraits::kSignature) : uint32_t(RegTraits::kSignature)}; } //! Tests whether the `op` operand is either a low or high 8-bit GPB register. - static inline bool isGpb(const Operand_& op) noexcept { + static ASMJIT_INLINE_NODEBUG bool isGpb(const Operand_& op) noexcept { // Check operand type, register group, and size. Not interested in register type. return op.signature().subset(Signature::kOpTypeMask | Signature::kRegGroupMask | Signature::kSizeMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(RegGroup::kGp) | Signature::fromSize(1)); } - static inline bool isGpbLo(const Operand_& op) noexcept { return op.as().isGpbLo(); } - static inline bool isGpbHi(const Operand_& op) noexcept { return op.as().isGpbHi(); } - static inline bool isGpw(const Operand_& op) noexcept { return op.as().isGpw(); } - static inline bool isGpd(const Operand_& op) noexcept { return op.as().isGpd(); } - static inline bool isGpq(const Operand_& op) noexcept { return op.as().isGpq(); } - static inline bool isXmm(const Operand_& op) noexcept { return op.as().isXmm(); } - static inline bool isYmm(const Operand_& op) noexcept { return op.as().isYmm(); } - static inline bool isZmm(const Operand_& op) noexcept { return op.as().isZmm(); } - static inline bool isMm(const Operand_& op) noexcept { return op.as().isMm(); } - static inline bool isKReg(const Operand_& op) noexcept { return op.as().isKReg(); } - static inline bool isSReg(const Operand_& op) noexcept { return op.as().isSReg(); } - static inline bool isCReg(const Operand_& op) noexcept { return op.as().isCReg(); } - static inline bool isDReg(const Operand_& op) noexcept { return op.as().isDReg(); } - static inline bool isSt(const Operand_& op) noexcept { return op.as().isSt(); } - static inline bool isBnd(const Operand_& op) noexcept { return op.as().isBnd(); } - static inline bool isTmm(const Operand_& op) noexcept { return op.as().isTmm(); } - static inline bool isRip(const Operand_& op) noexcept { return op.as().isRip(); } - - static inline bool isGpb(const Operand_& op, uint32_t rId) noexcept { return isGpb(op) & (op.id() == rId); } - static inline bool isGpbLo(const Operand_& op, uint32_t rId) noexcept { return isGpbLo(op) & (op.id() == rId); } - static inline bool isGpbHi(const Operand_& op, uint32_t rId) noexcept { return isGpbHi(op) & (op.id() == rId); } - static inline bool isGpw(const Operand_& op, uint32_t rId) noexcept { return isGpw(op) & (op.id() == rId); } - static inline bool isGpd(const Operand_& op, uint32_t rId) noexcept { return isGpd(op) & (op.id() == rId); } - static inline bool isGpq(const Operand_& op, uint32_t rId) noexcept { return isGpq(op) & (op.id() == rId); } - static inline bool isXmm(const Operand_& op, uint32_t rId) noexcept { return isXmm(op) & (op.id() == rId); } - static inline bool isYmm(const Operand_& op, uint32_t rId) noexcept { return isYmm(op) & (op.id() == rId); } - static inline bool isZmm(const Operand_& op, uint32_t rId) noexcept { return isZmm(op) & (op.id() == rId); } - static inline bool isMm(const Operand_& op, uint32_t rId) noexcept { return isMm(op) & (op.id() == rId); } - static inline bool isKReg(const Operand_& op, uint32_t rId) noexcept { return isKReg(op) & (op.id() == rId); } - static inline bool isSReg(const Operand_& op, uint32_t rId) noexcept { return isSReg(op) & (op.id() == rId); } - static inline bool isCReg(const Operand_& op, uint32_t rId) noexcept { return isCReg(op) & (op.id() == rId); } - static inline bool isDReg(const Operand_& op, uint32_t rId) noexcept { return isDReg(op) & (op.id() == rId); } - static inline bool isSt(const Operand_& op, uint32_t rId) noexcept { return isSt(op) & (op.id() == rId); } - static inline bool isBnd(const Operand_& op, uint32_t rId) noexcept { return isBnd(op) & (op.id() == rId); } - static inline bool isTmm(const Operand_& op, uint32_t rId) noexcept { return isTmm(op) & (op.id() == rId); } - static inline bool isRip(const Operand_& op, uint32_t rId) noexcept { return isRip(op) & (op.id() == rId); } + static ASMJIT_INLINE_NODEBUG bool isGpbLo(const Operand_& op) noexcept { return op.as().isGpbLo(); } + static ASMJIT_INLINE_NODEBUG bool isGpbHi(const Operand_& op) noexcept { return op.as().isGpbHi(); } + static ASMJIT_INLINE_NODEBUG bool isGpw(const Operand_& op) noexcept { return op.as().isGpw(); } + static ASMJIT_INLINE_NODEBUG bool isGpd(const Operand_& op) noexcept { return op.as().isGpd(); } + static ASMJIT_INLINE_NODEBUG bool isGpq(const Operand_& op) noexcept { return op.as().isGpq(); } + static ASMJIT_INLINE_NODEBUG bool isXmm(const Operand_& op) noexcept { return op.as().isXmm(); } + static ASMJIT_INLINE_NODEBUG bool isYmm(const Operand_& op) noexcept { return op.as().isYmm(); } + static ASMJIT_INLINE_NODEBUG bool isZmm(const Operand_& op) noexcept { return op.as().isZmm(); } + static ASMJIT_INLINE_NODEBUG bool isMm(const Operand_& op) noexcept { return op.as().isMm(); } + static ASMJIT_INLINE_NODEBUG bool isKReg(const Operand_& op) noexcept { return op.as().isKReg(); } + static ASMJIT_INLINE_NODEBUG bool isSReg(const Operand_& op) noexcept { return op.as().isSReg(); } + static ASMJIT_INLINE_NODEBUG bool isCReg(const Operand_& op) noexcept { return op.as().isCReg(); } + static ASMJIT_INLINE_NODEBUG bool isDReg(const Operand_& op) noexcept { return op.as().isDReg(); } + static ASMJIT_INLINE_NODEBUG bool isSt(const Operand_& op) noexcept { return op.as().isSt(); } + static ASMJIT_INLINE_NODEBUG bool isBnd(const Operand_& op) noexcept { return op.as().isBnd(); } + static ASMJIT_INLINE_NODEBUG bool isTmm(const Operand_& op) noexcept { return op.as().isTmm(); } + static ASMJIT_INLINE_NODEBUG bool isRip(const Operand_& op) noexcept { return op.as().isRip(); } + + static ASMJIT_INLINE_NODEBUG bool isGpb(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpb(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isGpbLo(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpbLo(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isGpbHi(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpbHi(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isGpw(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpw(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isGpd(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpd(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isGpq(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpq(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isXmm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isXmm(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isYmm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isYmm(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isZmm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isZmm(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isMm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isMm(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isKReg(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isKReg(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isSReg(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isSReg(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isCReg(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isCReg(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isDReg(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isDReg(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isSt(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isSt(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isBnd(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isBnd(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isTmm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isTmm(op)) & unsigned(op.id() == rId)); } + static ASMJIT_INLINE_NODEBUG bool isRip(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isRip(op)) & unsigned(op.id() == rId)); } }; //! General purpose register (X86). @@ -223,17 +237,17 @@ class Gp : public Reg { }; //! Casts this register to 8-bit (LO) part. - inline GpbLo r8() const noexcept; + ASMJIT_INLINE_NODEBUG GpbLo r8() const noexcept; //! Casts this register to 8-bit (LO) part. - inline GpbLo r8Lo() const noexcept; + ASMJIT_INLINE_NODEBUG GpbLo r8Lo() const noexcept; //! Casts this register to 8-bit (HI) part. - inline GpbHi r8Hi() const noexcept; + ASMJIT_INLINE_NODEBUG GpbHi r8Hi() const noexcept; //! Casts this register to 16-bit. - inline Gpw r16() const noexcept; + ASMJIT_INLINE_NODEBUG Gpw r16() const noexcept; //! Casts this register to 32-bit. - inline Gpd r32() const noexcept; + ASMJIT_INLINE_NODEBUG Gpd r32() const noexcept; //! Casts this register to 64-bit. - inline Gpq r64() const noexcept; + ASMJIT_INLINE_NODEBUG Gpq r64() const noexcept; }; //! Vector register (XMM|YMM|ZMM) (X86). @@ -241,14 +255,21 @@ class Vec : public Reg { ASMJIT_DEFINE_ABSTRACT_REG(Vec, Reg) //! Casts this register to XMM (clone). - inline Xmm xmm() const noexcept; - //! Casts this register to YMM. - inline Ymm ymm() const noexcept; - //! Casts this register to ZMM. - inline Zmm zmm() const noexcept; + ASMJIT_INLINE_NODEBUG Xmm xmm() const noexcept; + //! Casts this register to YMM (clone). + ASMJIT_INLINE_NODEBUG Ymm ymm() const noexcept; + //! Casts this register to ZMM (clone). + ASMJIT_INLINE_NODEBUG Zmm zmm() const noexcept; + + //! Casts this register to XMM (clone). + ASMJIT_INLINE_NODEBUG Vec v128() const noexcept; + //! Casts this register to YMM (clone). + ASMJIT_INLINE_NODEBUG Vec v256() const noexcept; + //! Casts this register to ZMM (clone). + ASMJIT_INLINE_NODEBUG Vec v512() const noexcept; //! Casts this register to a register that has half the size (or XMM if it's already XMM). - inline Vec half() const noexcept { + ASMJIT_INLINE_NODEBUG Vec half() const noexcept { return Vec(type() == RegType::kX86_Zmm ? signatureOfT() : signatureOfT(), id()); } }; @@ -300,21 +321,21 @@ class Gpq : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpq, Gp, RegTraits) //! Casts this register to a register that has half the size (XMM). - inline Xmm half() const noexcept { return Xmm(id()); } + ASMJIT_INLINE_NODEBUG Xmm half() const noexcept { return Xmm(id()); } }; //! 256-bit YMM register (AVX+). class Ymm : public Vec { ASMJIT_DEFINE_FINAL_REG(Ymm, Vec, RegTraits) //! Casts this register to a register that has half the size (XMM). - inline Xmm half() const noexcept { return Xmm(id()); } + ASMJIT_INLINE_NODEBUG Xmm half() const noexcept { return Xmm(id()); } }; //! 512-bit ZMM register (AVX512+). class Zmm : public Vec { ASMJIT_DEFINE_FINAL_REG(Zmm, Vec, RegTraits) //! Casts this register to a register that has half the size (YMM). - inline Ymm half() const noexcept { return Ymm(id()); } + ASMJIT_INLINE_NODEBUG Ymm half() const noexcept { return Ymm(id()); } }; //! 64-bit MMX register (MMX+). @@ -335,60 +356,61 @@ class Tmm : public Reg { ASMJIT_DEFINE_FINAL_REG(Tmm, Reg, RegTraits) }; //! \cond -inline GpbLo Gp::r8() const noexcept { return GpbLo(id()); } -inline GpbLo Gp::r8Lo() const noexcept { return GpbLo(id()); } -inline GpbHi Gp::r8Hi() const noexcept { return GpbHi(id()); } -inline Gpw Gp::r16() const noexcept { return Gpw(id()); } -inline Gpd Gp::r32() const noexcept { return Gpd(id()); } -inline Gpq Gp::r64() const noexcept { return Gpq(id()); } -inline Xmm Vec::xmm() const noexcept { return Xmm(id()); } -inline Ymm Vec::ymm() const noexcept { return Ymm(id()); } -inline Zmm Vec::zmm() const noexcept { return Zmm(id()); } +ASMJIT_INLINE_NODEBUG GpbLo Gp::r8() const noexcept { return GpbLo(id()); } +ASMJIT_INLINE_NODEBUG GpbLo Gp::r8Lo() const noexcept { return GpbLo(id()); } +ASMJIT_INLINE_NODEBUG GpbHi Gp::r8Hi() const noexcept { return GpbHi(id()); } +ASMJIT_INLINE_NODEBUG Gpw Gp::r16() const noexcept { return Gpw(id()); } +ASMJIT_INLINE_NODEBUG Gpd Gp::r32() const noexcept { return Gpd(id()); } +ASMJIT_INLINE_NODEBUG Gpq Gp::r64() const noexcept { return Gpq(id()); } +ASMJIT_INLINE_NODEBUG Xmm Vec::xmm() const noexcept { return Xmm(id()); } +ASMJIT_INLINE_NODEBUG Ymm Vec::ymm() const noexcept { return Ymm(id()); } +ASMJIT_INLINE_NODEBUG Zmm Vec::zmm() const noexcept { return Zmm(id()); } +ASMJIT_INLINE_NODEBUG Vec Vec::v128() const noexcept { return Xmm(id()); } +ASMJIT_INLINE_NODEBUG Vec Vec::v256() const noexcept { return Ymm(id()); } +ASMJIT_INLINE_NODEBUG Vec Vec::v512() const noexcept { return Zmm(id()); } //! \endcond //! \namespace asmjit::x86::regs //! -//! Registers provided by X86 and X64 ISAs are in both `asmjit::x86` and -//! `asmjit::x86::regs` namespaces so they can be included with using directive. -//! For example `using namespace asmjit::x86::regs` would include all registers, -//! but not other X86-specific API, whereas `using namespace asmjit::x86` would -//! include everything X86-specific. +//! Registers provided by X86 and X64 ISAs are in both `asmjit::x86` and `asmjit::x86::regs` namespaces so they can +//! be included with using directive. For example `using namespace asmjit::x86::regs` would include all registers, +//! but not other X86-specific API, whereas `using namespace asmjit::x86` would include everything X86-specific. #ifndef _DOXYGEN namespace regs { #endif //! Creates an 8-bit low GPB register operand. -static constexpr GpbLo gpb(uint32_t rId) noexcept { return GpbLo(rId); } +static ASMJIT_INLINE_NODEBUG constexpr GpbLo gpb(uint32_t rId) noexcept { return GpbLo(rId); } //! Creates an 8-bit low GPB register operand. -static constexpr GpbLo gpb_lo(uint32_t rId) noexcept { return GpbLo(rId); } +static ASMJIT_INLINE_NODEBUG constexpr GpbLo gpb_lo(uint32_t rId) noexcept { return GpbLo(rId); } //! Creates an 8-bit high GPB register operand. -static constexpr GpbHi gpb_hi(uint32_t rId) noexcept { return GpbHi(rId); } +static ASMJIT_INLINE_NODEBUG constexpr GpbHi gpb_hi(uint32_t rId) noexcept { return GpbHi(rId); } //! Creates a 16-bit GPW register operand. -static constexpr Gpw gpw(uint32_t rId) noexcept { return Gpw(rId); } +static ASMJIT_INLINE_NODEBUG constexpr Gpw gpw(uint32_t rId) noexcept { return Gpw(rId); } //! Creates a 32-bit GPD register operand. -static constexpr Gpd gpd(uint32_t rId) noexcept { return Gpd(rId); } +static ASMJIT_INLINE_NODEBUG constexpr Gpd gpd(uint32_t rId) noexcept { return Gpd(rId); } //! Creates a 64-bit GPQ register operand (64-bit). -static constexpr Gpq gpq(uint32_t rId) noexcept { return Gpq(rId); } +static ASMJIT_INLINE_NODEBUG constexpr Gpq gpq(uint32_t rId) noexcept { return Gpq(rId); } //! Creates a 128-bit XMM register operand. -static constexpr Xmm xmm(uint32_t rId) noexcept { return Xmm(rId); } +static ASMJIT_INLINE_NODEBUG constexpr Xmm xmm(uint32_t rId) noexcept { return Xmm(rId); } //! Creates a 256-bit YMM register operand. -static constexpr Ymm ymm(uint32_t rId) noexcept { return Ymm(rId); } +static ASMJIT_INLINE_NODEBUG constexpr Ymm ymm(uint32_t rId) noexcept { return Ymm(rId); } //! Creates a 512-bit ZMM register operand. -static constexpr Zmm zmm(uint32_t rId) noexcept { return Zmm(rId); } +static ASMJIT_INLINE_NODEBUG constexpr Zmm zmm(uint32_t rId) noexcept { return Zmm(rId); } //! Creates a 64-bit Mm register operand. -static constexpr Mm mm(uint32_t rId) noexcept { return Mm(rId); } +static ASMJIT_INLINE_NODEBUG constexpr Mm mm(uint32_t rId) noexcept { return Mm(rId); } //! Creates a 64-bit K register operand. -static constexpr KReg k(uint32_t rId) noexcept { return KReg(rId); } +static ASMJIT_INLINE_NODEBUG constexpr KReg k(uint32_t rId) noexcept { return KReg(rId); } //! Creates a 32-bit or 64-bit control register operand. -static constexpr CReg cr(uint32_t rId) noexcept { return CReg(rId); } +static ASMJIT_INLINE_NODEBUG constexpr CReg cr(uint32_t rId) noexcept { return CReg(rId); } //! Creates a 32-bit or 64-bit debug register operand. -static constexpr DReg dr(uint32_t rId) noexcept { return DReg(rId); } +static ASMJIT_INLINE_NODEBUG constexpr DReg dr(uint32_t rId) noexcept { return DReg(rId); } //! Creates an 80-bit st register operand. -static constexpr St st(uint32_t rId) noexcept { return St(rId); } +static ASMJIT_INLINE_NODEBUG constexpr St st(uint32_t rId) noexcept { return St(rId); } //! Creates a 128-bit bound register operand. -static constexpr Bnd bnd(uint32_t rId) noexcept { return Bnd(rId); } +static ASMJIT_INLINE_NODEBUG constexpr Bnd bnd(uint32_t rId) noexcept { return Bnd(rId); } //! Creates a TMM register operand. -static constexpr Tmm tmm(uint32_t rId) noexcept { return Tmm(rId); } +static ASMJIT_INLINE_NODEBUG constexpr Tmm tmm(uint32_t rId) noexcept { return Tmm(rId); } static constexpr GpbLo al = GpbLo(Gp::kIdAx); static constexpr GpbLo bl = GpbLo(Gp::kIdBx); @@ -723,25 +745,25 @@ class Mem : public BaseMem { //! \{ //! Creates a default `Mem` operand that points to [0]. - inline constexpr Mem() noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem() noexcept : BaseMem() {} - inline constexpr Mem(const Mem& other) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const Mem& other) noexcept : BaseMem(other) {} - inline explicit Mem(Globals::NoInit_) noexcept + ASMJIT_INLINE_NODEBUG explicit Mem(Globals::NoInit_) noexcept : BaseMem(Globals::NoInit) {} - inline constexpr Mem(const Signature& signature, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const Signature& signature, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept : BaseMem(signature, baseId, indexId, offset) {} - inline constexpr Mem(const Label& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const Label& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(RegType::kLabelTag) | Signature::fromSize(size) | signature, base.id(), 0, off) {} - inline constexpr Mem(const Label& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const Label& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(RegType::kLabelTag) | Signature::fromMemIndexType(index.type()) | @@ -749,13 +771,13 @@ class Mem : public BaseMem { Signature::fromSize(size) | signature, base.id(), index.id(), off) {} - inline constexpr Mem(const BaseReg& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const BaseReg& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(base.type()) | Signature::fromSize(size) | signature, base.id(), 0, off) {} - inline constexpr Mem(const BaseReg& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(const BaseReg& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(base.type()) | Signature::fromMemIndexType(index.type()) | @@ -763,12 +785,12 @@ class Mem : public BaseMem { Signature::fromSize(size) | signature, base.id(), index.id(), off) {} - inline constexpr explicit Mem(uint64_t base, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr explicit Mem(uint64_t base, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromSize(size) | signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {} - inline constexpr Mem(uint64_t base, const BaseReg& index, uint32_t shift = 0, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept + ASMJIT_INLINE_NODEBUG constexpr Mem(uint64_t base, const BaseReg& index, uint32_t shift = 0, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept : BaseMem(Signature::fromOpType(OperandType::kMem) | Signature::fromMemIndexType(index.type()) | Signature::fromValue(shift) | @@ -780,7 +802,7 @@ class Mem : public BaseMem { //! \name Overloaded Operators //! \{ - inline Mem& operator=(const Mem& other) noexcept = default; + ASMJIT_INLINE_NODEBUG Mem& operator=(const Mem& other) noexcept = default; //! \} @@ -788,17 +810,25 @@ class Mem : public BaseMem { //! \{ //! Clones the memory operand. - inline constexpr Mem clone() const noexcept { return Mem(*this); } + ASMJIT_INLINE_NODEBUG constexpr Mem clone() const noexcept { return Mem(*this); } - //! Creates a new copy of this memory operand adjusted by `off`. + //! Creates a copy of this memory operand adjusted by `off`. inline Mem cloneAdjusted(int64_t off) const noexcept { Mem result(*this); result.addOffset(off); return result; } - inline constexpr Mem cloneBroadcasted(Broadcast b) const noexcept { - return Mem((_signature & ~Signature{kSignatureMemBroadcastMask}) | Signature::fromValue(b), _baseId, _data[0], int32_t(_data[1])); + //! Creates a copy of this memory operand resized to `size`. + inline Mem cloneResized(uint32_t size) const noexcept { + Mem result(*this); + result.setSize(size); + return result; + } + + //! Creates a copy of this memory operand with a broadcast `bcst`. + ASMJIT_INLINE_NODEBUG constexpr Mem cloneBroadcasted(Broadcast bcst) const noexcept { + return Mem((_signature & ~Signature{kSignatureMemBroadcastMask}) | Signature::fromValue(bcst), _baseId, _data[0], int32_t(_data[1])); } //! \} @@ -809,43 +839,61 @@ class Mem : public BaseMem { //! Converts memory `baseType` and `baseId` to `x86::Reg` instance. //! //! The memory must have a valid base register otherwise the result will be wrong. - inline Reg baseReg() const noexcept { return Reg::fromTypeAndId(baseType(), baseId()); } + ASMJIT_INLINE_NODEBUG Reg baseReg() const noexcept { return Reg::fromTypeAndId(baseType(), baseId()); } //! Converts memory `indexType` and `indexId` to `x86::Reg` instance. //! //! The memory must have a valid index register otherwise the result will be wrong. - inline Reg indexReg() const noexcept { return Reg::fromTypeAndId(indexType(), indexId()); } + ASMJIT_INLINE_NODEBUG Reg indexReg() const noexcept { return Reg::fromTypeAndId(indexType(), indexId()); } using BaseMem::setIndex; - inline void setIndex(const BaseReg& index, uint32_t shift) noexcept { + ASMJIT_INLINE_NODEBUG void setIndex(const BaseReg& index, uint32_t shift) noexcept { setIndex(index); setShift(shift); } //! \} + //! \name Memory Size + //! \{ + + //! Tests whether the memory operand specifies a size (i.e. the size is not zero). + ASMJIT_INLINE_NODEBUG constexpr bool hasSize() const noexcept { return _signature.hasField(); } + //! Tests whether the memory operand size matches size `s`. + ASMJIT_INLINE_NODEBUG constexpr bool hasSize(uint32_t s) const noexcept { return size() == s; } + + //! Returns the size of the memory operand in bytes. + //! + //! \note Most instructions would deduce the size of the memory operand, so in most cases it's expected that the + //! returned value would be zero. However, some instruction require the size to select between multiple variations, + //! so in some cases size is required would be non-zero (for example `inc [mem], immediate` requires size to + //! distinguish between 8-bit, 16-bit, 32-bit, and 64-bit increments. + ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return _signature.getField(); } + + //! \} + //! \name Address Type //! \{ //! Returns the address type of the memory operand. //! //! By default, address type of newly created memory operands is always \ref AddrType::kDefault. - inline constexpr AddrType addrType() const noexcept { return (AddrType)_signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr AddrType addrType() const noexcept { return (AddrType)_signature.getField(); } //! Sets the address type to `addrType`. - inline void setAddrType(AddrType addrType) noexcept { _signature.setField(uint32_t(addrType)); } + ASMJIT_INLINE_NODEBUG void setAddrType(AddrType addrType) noexcept { _signature.setField(uint32_t(addrType)); } //! Resets the address type to \ref AddrType::kDefault. - inline void resetAddrType() noexcept { _signature.setField(uint32_t(AddrType::kDefault)); } + ASMJIT_INLINE_NODEBUG void resetAddrType() noexcept { _signature.setField(uint32_t(AddrType::kDefault)); } //! Tests whether the address type is \ref AddrType::kAbs. - inline constexpr bool isAbs() const noexcept { return addrType() == AddrType::kAbs; } + ASMJIT_INLINE_NODEBUG constexpr bool isAbs() const noexcept { return addrType() == AddrType::kAbs; } //! Sets the address type to \ref AddrType::kAbs. - inline void setAbs() noexcept { setAddrType(AddrType::kAbs); } + ASMJIT_INLINE_NODEBUG void setAbs() noexcept { setAddrType(AddrType::kAbs); } //! Tests whether the address type is \ref AddrType::kRel. - inline constexpr bool isRel() const noexcept { return addrType() == AddrType::kRel; } + ASMJIT_INLINE_NODEBUG constexpr bool isRel() const noexcept { return addrType() == AddrType::kRel; } //! Sets the address type to \ref AddrType::kRel. - inline void setRel() noexcept { setAddrType(AddrType::kRel); } + ASMJIT_INLINE_NODEBUG void setRel() noexcept { setAddrType(AddrType::kRel); } //! \} @@ -853,18 +901,18 @@ class Mem : public BaseMem { //! \{ //! Tests whether the memory operand has a segment override. - inline constexpr bool hasSegment() const noexcept { return _signature.hasField(); } + ASMJIT_INLINE_NODEBUG constexpr bool hasSegment() const noexcept { return _signature.hasField(); } //! Returns the associated segment override as `SReg` operand. - inline constexpr SReg segment() const noexcept { return SReg(segmentId()); } + ASMJIT_INLINE_NODEBUG constexpr SReg segment() const noexcept { return SReg(segmentId()); } //! Returns segment override register id, see `SReg::Id`. - inline constexpr uint32_t segmentId() const noexcept { return _signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t segmentId() const noexcept { return _signature.getField(); } //! Sets the segment override to `seg`. - inline void setSegment(const SReg& seg) noexcept { setSegment(seg.id()); } + ASMJIT_INLINE_NODEBUG void setSegment(const SReg& seg) noexcept { setSegment(seg.id()); } //! Sets the segment override to `id`. - inline void setSegment(uint32_t rId) noexcept { _signature.setField(rId); } + ASMJIT_INLINE_NODEBUG void setSegment(uint32_t rId) noexcept { _signature.setField(rId); } //! Resets the segment override. - inline void resetSegment() noexcept { _signature.setField(0); } + ASMJIT_INLINE_NODEBUG void resetSegment() noexcept { _signature.setField(0); } //! \} @@ -872,13 +920,13 @@ class Mem : public BaseMem { //! \{ //! Tests whether the memory operand has shift (aka scale) value. - inline constexpr bool hasShift() const noexcept { return _signature.hasField(); } + ASMJIT_INLINE_NODEBUG constexpr bool hasShift() const noexcept { return _signature.hasField(); } //! Returns the memory operand's shift (aka scale) value. - inline constexpr uint32_t shift() const noexcept { return _signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr uint32_t shift() const noexcept { return _signature.getField(); } //! Sets the memory operand's shift (aka scale) value. - inline void setShift(uint32_t shift) noexcept { _signature.setField(shift); } + ASMJIT_INLINE_NODEBUG void setShift(uint32_t shift) noexcept { _signature.setField(shift); } //! Resets the memory operand's shift (aka scale) value to zero. - inline void resetShift() noexcept { _signature.setField(0); } + ASMJIT_INLINE_NODEBUG void resetShift() noexcept { _signature.setField(0); } //! \} @@ -886,156 +934,168 @@ class Mem : public BaseMem { //! \{ //! Tests whether the memory operand has broadcast {1tox}. - inline constexpr bool hasBroadcast() const noexcept { return _signature.hasField(); } + ASMJIT_INLINE_NODEBUG constexpr bool hasBroadcast() const noexcept { return _signature.hasField(); } //! Returns the memory operand's broadcast. - inline constexpr Broadcast getBroadcast() const noexcept { return (Broadcast)_signature.getField(); } + ASMJIT_INLINE_NODEBUG constexpr Broadcast getBroadcast() const noexcept { return (Broadcast)_signature.getField(); } //! Sets the memory operand's broadcast. - inline void setBroadcast(Broadcast b) noexcept { _signature.setField(uint32_t(b)); } + ASMJIT_INLINE_NODEBUG void setBroadcast(Broadcast b) noexcept { _signature.setField(uint32_t(b)); } //! Resets the memory operand's broadcast to none. - inline void resetBroadcast() noexcept { _signature.setField(0); } + ASMJIT_INLINE_NODEBUG void resetBroadcast() noexcept { _signature.setField(0); } //! Returns a new `Mem` without a broadcast (the possible broadcast is cleared). - inline constexpr Mem _1to1() const noexcept { return cloneBroadcasted(Broadcast::kNone); } + ASMJIT_INLINE_NODEBUG constexpr Mem _1to1() const noexcept { return cloneBroadcasted(Broadcast::kNone); } //! Returns a new `Mem` with {1to2} broadcast (AVX-512). - inline constexpr Mem _1to2() const noexcept { return cloneBroadcasted(Broadcast::k1To2); } + ASMJIT_INLINE_NODEBUG constexpr Mem _1to2() const noexcept { return cloneBroadcasted(Broadcast::k1To2); } //! Returns a new `Mem` with {1to4} broadcast (AVX-512). - inline constexpr Mem _1to4() const noexcept { return cloneBroadcasted(Broadcast::k1To4); } + ASMJIT_INLINE_NODEBUG constexpr Mem _1to4() const noexcept { return cloneBroadcasted(Broadcast::k1To4); } //! Returns a new `Mem` with {1to8} broadcast (AVX-512). - inline constexpr Mem _1to8() const noexcept { return cloneBroadcasted(Broadcast::k1To8); } + ASMJIT_INLINE_NODEBUG constexpr Mem _1to8() const noexcept { return cloneBroadcasted(Broadcast::k1To8); } //! Returns a new `Mem` with {1to16} broadcast (AVX-512). - inline constexpr Mem _1to16() const noexcept { return cloneBroadcasted(Broadcast::k1To16); } + ASMJIT_INLINE_NODEBUG constexpr Mem _1to16() const noexcept { return cloneBroadcasted(Broadcast::k1To16); } //! Returns a new `Mem` with {1to32} broadcast (AVX-512). - inline constexpr Mem _1to32() const noexcept { return cloneBroadcasted(Broadcast::k1To32); } + ASMJIT_INLINE_NODEBUG constexpr Mem _1to32() const noexcept { return cloneBroadcasted(Broadcast::k1To32); } //! Returns a new `Mem` with {1to64} broadcast (AVX-512). - inline constexpr Mem _1to64() const noexcept { return cloneBroadcasted(Broadcast::k1To64); } + ASMJIT_INLINE_NODEBUG constexpr Mem _1to64() const noexcept { return cloneBroadcasted(Broadcast::k1To64); } //! \} }; //! Creates `[base.reg + offset]` memory operand. -static inline constexpr Mem ptr(const Gp& base, int32_t offset = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, int32_t offset = 0, uint32_t size = 0) noexcept { return Mem(base, offset, size); } //! Creates `[base.reg + (index << shift) + offset]` memory operand (scalar index). -static inline constexpr Mem ptr(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, offset, size); } //! Creates `[base.reg + (index << shift) + offset]` memory operand (vector index). -static inline constexpr Mem ptr(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, offset, size); } //! Creates `[base + offset]` memory operand. -static inline constexpr Mem ptr(const Label& base, int32_t offset = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, int32_t offset = 0, uint32_t size = 0) noexcept { return Mem(base, offset, size); } //! Creates `[base + (index << shift) + offset]` memory operand. -static inline constexpr Mem ptr(const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, offset, size); } //! Creates `[base + (index << shift) + offset]` memory operand. -static inline constexpr Mem ptr(const Label& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, offset, size); } //! Creates `[rip + offset]` memory operand. -static inline constexpr Mem ptr(const Rip& rip_, int32_t offset = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Rip& rip_, int32_t offset = 0, uint32_t size = 0) noexcept { return Mem(rip_, offset, size); } //! Creates `[base]` absolute memory operand. -static inline constexpr Mem ptr(uint64_t base, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(uint64_t base, uint32_t size = 0) noexcept { return Mem(base, size); } //! Creates `[base + (index.reg << shift)]` absolute memory operand. -static inline constexpr Mem ptr(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, size); } //! Creates `[base + (index.reg << shift)]` absolute memory operand. -static inline constexpr Mem ptr(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, size); } //! Creates `[base]` absolute memory operand (absolute). -static inline constexpr Mem ptr_abs(uint64_t base, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_abs(uint64_t base, uint32_t size = 0) noexcept { return Mem(base, size, OperandSignature::fromValue(Mem::AddrType::kAbs)); } //! Creates `[base + (index.reg << shift)]` absolute memory operand (absolute). -static inline constexpr Mem ptr_abs(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_abs(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, size, OperandSignature::fromValue(Mem::AddrType::kAbs)); } //! Creates `[base + (index.reg << shift)]` absolute memory operand (absolute). -static inline constexpr Mem ptr_abs(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_abs(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, size, OperandSignature::fromValue(Mem::AddrType::kAbs)); } //! Creates `[base]` relative memory operand (relative). -static inline constexpr Mem ptr_rel(uint64_t base, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_rel(uint64_t base, uint32_t size = 0) noexcept { return Mem(base, size, OperandSignature::fromValue(Mem::AddrType::kRel)); } //! Creates `[base + (index.reg << shift)]` relative memory operand (relative). -static inline constexpr Mem ptr_rel(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_rel(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, size, OperandSignature::fromValue(Mem::AddrType::kRel)); } //! Creates `[base + (index.reg << shift)]` relative memory operand (relative). -static inline constexpr Mem ptr_rel(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept { +static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_rel(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept { return Mem(base, index, shift, size, OperandSignature::fromValue(Mem::AddrType::kRel)); } -#define ASMJIT_MEM_PTR(FUNC, SIZE) \ - static constexpr Mem FUNC(const Gp& base, int32_t offset = 0) noexcept { \ - return Mem(base, offset, SIZE); \ - } \ - static constexpr Mem FUNC(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept { \ - return Mem(base, index, shift, offset, SIZE); \ - } \ - static constexpr Mem FUNC(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0) noexcept { \ - return Mem(base, index, shift, offset, SIZE); \ - } \ - static constexpr Mem FUNC(const Label& base, int32_t offset = 0) noexcept { \ - return Mem(base, offset, SIZE); \ - } \ - static constexpr Mem FUNC(const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept { \ - return Mem(base, index, shift, offset, SIZE); \ - } \ - static constexpr Mem FUNC(const Rip& rip_, int32_t offset = 0) noexcept { \ - return Mem(rip_, offset, SIZE); \ - } \ - static constexpr Mem FUNC(uint64_t base) noexcept { \ - return Mem(base, SIZE); \ - } \ - static constexpr Mem FUNC(uint64_t base, const Gp& index, uint32_t shift = 0) noexcept { \ - return Mem(base, index, shift, SIZE); \ - } \ - static constexpr Mem FUNC(uint64_t base, const Vec& index, uint32_t shift = 0) noexcept { \ - return Mem(base, index, shift, SIZE); \ - } \ - \ - static constexpr Mem FUNC##_abs(uint64_t base) noexcept { \ - return Mem(base, SIZE, \ - OperandSignature::fromValue(Mem::AddrType::kAbs)); \ - } \ - static constexpr Mem FUNC##_abs(uint64_t base, const Gp& index, uint32_t shift = 0) noexcept { \ - return Mem(base, index, shift, SIZE, \ - OperandSignature::fromValue(Mem::AddrType::kAbs)); \ - } \ - static constexpr Mem FUNC##_abs(uint64_t base, const Vec& index, uint32_t shift = 0) noexcept { \ - return Mem(base, index, shift, SIZE, \ - OperandSignature::fromValue(Mem::AddrType::kAbs)); \ - } \ - \ - static constexpr Mem FUNC##_rel(uint64_t base) noexcept { \ - return Mem(base, SIZE, \ - OperandSignature::fromValue(Mem::AddrType::kRel)); \ - } \ - static constexpr Mem FUNC##_rel(uint64_t base, const Gp& index, uint32_t shift = 0) noexcept { \ - return Mem(base, index, shift, SIZE, \ - OperandSignature::fromValue(Mem::AddrType::kRel)); \ - } \ - static constexpr Mem FUNC##_rel(uint64_t base, const Vec& index, uint32_t shift = 0) noexcept { \ - return Mem(base, index, shift, SIZE, \ - OperandSignature::fromValue(Mem::AddrType::kRel)); \ - } +#define ASMJIT_MEM_PTR(FUNC, SIZE) \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \ + const Gp& base, int32_t offset = 0) noexcept \ + { return Mem(base, offset, SIZE); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \ + const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept \ + { return Mem(base, index, shift, offset, SIZE); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \ + const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0) noexcept \ + { return Mem(base, index, shift, offset, SIZE); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \ + const Label& base, int32_t offset = 0) noexcept \ + { return Mem(base, offset, SIZE); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \ + const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept \ + { return Mem(base, index, shift, offset, SIZE); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \ + const Rip& rip_, int32_t offset = 0) noexcept \ + { return Mem(rip_, offset, SIZE); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \ + uint64_t base) noexcept \ + { return Mem(base, SIZE); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \ + uint64_t base, const Gp& index, uint32_t shift = 0) noexcept \ + { return Mem(base, index, shift, SIZE); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \ + uint64_t base, const Vec& index, uint32_t shift = 0) noexcept \ + { return Mem(base, index, shift, SIZE); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_abs( \ + uint64_t base) noexcept \ + { return Mem(base, SIZE, \ + OperandSignature::fromValue(Mem::AddrType::kAbs)); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_abs( \ + uint64_t base, const Gp& index, uint32_t shift = 0) noexcept \ + { return Mem(base, index, shift, SIZE, \ + OperandSignature::fromValue(Mem::AddrType::kAbs)); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_abs( \ + uint64_t base, const Vec& index, uint32_t shift = 0) noexcept \ + { return Mem(base, index, shift, SIZE, \ + OperandSignature::fromValue(Mem::AddrType::kAbs)); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_rel( \ + uint64_t base) noexcept \ + { return Mem(base, SIZE, \ + OperandSignature::fromValue(Mem::AddrType::kRel)); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_rel( \ + uint64_t base, const Gp& index, uint32_t shift = 0) noexcept \ + { return Mem(base, index, shift, SIZE, \ + OperandSignature::fromValue(Mem::AddrType::kRel)); } \ + \ + static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_rel( \ + uint64_t base, const Vec& index, uint32_t shift = 0) noexcept \ + { return Mem(base, index, shift, SIZE, \ + OperandSignature::fromValue(Mem::AddrType::kRel)); } // Definition of memory operand constructors that use platform independent naming. ASMJIT_MEM_PTR(ptr_8, 1) diff --git a/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp b/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp index 02870d95ffee6..88a8b39a0b0ce 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp +++ b/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp @@ -183,6 +183,9 @@ Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& cf, RAInstBuilder& i RATiedFlags flags = raRegRwFlags(opRwInfo.opFlags()); RegMask allowedRegs = instructionAllowedRegs; + if (opRwInfo.isUnique()) + flags |= RATiedFlags::kUnique; + // X86-specific constraints related to LO|HI general purpose registers. This is only required when the // register is part of the encoding. If the register is fixed we won't restrict anything as it doesn't // restrict encoding of other registers. @@ -220,9 +223,11 @@ Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& cf, RAInstBuilder& i } } - // Do not use RegMem flag if changing Reg to Mem requires additional CPU feature that may not be enabled. + // Do not use RegMem flag if changing Reg to Mem requires a CPU feature that is not available. if (rwInfo.rmFeature() && Support::test(flags, RATiedFlags::kUseRM | RATiedFlags::kOutRM)) { - flags &= ~(RATiedFlags::kUseRM | RATiedFlags::kOutRM); + if (!cc()->code()->cpuFeatures().has(rwInfo.rmFeature())) { + flags &= ~(RATiedFlags::kUseRM | RATiedFlags::kOutRM); + } } RegGroup group = workReg->group(); @@ -818,7 +823,7 @@ Error RACFGBuilder::moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& a stackPtr.setSize(4); imm[0] = imm_; - uint32_t nMovs = 0; + uint32_t movCount = 0; // One stack entry has the same size as the native register size. That means that if we want to move a 32-bit // integer on the stack in 64-bit mode, we need to extend it to a 64-bit integer first. In 32-bit mode, pushing @@ -834,7 +839,7 @@ Error RACFGBuilder::moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& a case TypeId::kFloat32: MovU32: imm[0].zeroExtend32Bits(); - nMovs = 1; + movCount = 1; break; case TypeId::kInt64: @@ -844,20 +849,20 @@ Error RACFGBuilder::moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& a case TypeId::kMmx64: if (_is64Bit && imm[0].isInt32()) { stackPtr.setSize(8); - nMovs = 1; + movCount = 1; break; } imm[1].setValue(imm[0].uint32Hi()); imm[0].zeroExtend32Bits(); - nMovs = 2; + movCount = 2; break; default: return DebugUtils::errored(kErrorInvalidAssignment); } - for (uint32_t i = 0; i < nMovs; i++) { + for (uint32_t i = 0; i < movCount; i++) { ASMJIT_PROPAGATE(cc()->mov(stackPtr, imm[i])); stackPtr.addOffsetLo32(int32_t(stackPtr.size())); } diff --git a/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h b/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h index b9603c21afcb5..67227a1a619d6 100644 --- a/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h +++ b/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h @@ -36,7 +36,7 @@ class X86RAPass : public BaseRAPass { //! \{ X86RAPass() noexcept; - virtual ~X86RAPass() noexcept; + ~X86RAPass() noexcept override; //! \} @@ -44,20 +44,20 @@ class X86RAPass : public BaseRAPass { //! \{ //! Returns the compiler casted to `x86::Compiler`. - inline Compiler* cc() const noexcept { return static_cast(_cb); } + ASMJIT_INLINE_NODEBUG Compiler* cc() const noexcept { return static_cast(_cb); } //! Returns emit helper. - inline EmitHelper* emitHelper() noexcept { return &_emitHelper; } + ASMJIT_INLINE_NODEBUG EmitHelper* emitHelper() noexcept { return &_emitHelper; } - inline bool avxEnabled() const noexcept { return _emitHelper._avxEnabled; } - inline bool avx512Enabled() const noexcept { return _emitHelper._avx512Enabled; } + ASMJIT_INLINE_NODEBUG bool avxEnabled() const noexcept { return _emitHelper._avxEnabled; } + ASMJIT_INLINE_NODEBUG bool avx512Enabled() const noexcept { return _emitHelper._avx512Enabled; } //! \} //! \name Utilities //! \{ - inline uint32_t choose(uint32_t sseInstId, uint32_t avxInstId) noexcept { + ASMJIT_INLINE_NODEBUG InstId choose(InstId sseInstId, InstId avxInstId) noexcept { return avxEnabled() ? avxInstId : sseInstId; } diff --git a/3rdparty/asmjit/test/asmjit_test_assembler.cpp b/3rdparty/asmjit/test/asmjit_test_assembler.cpp index 4b40a751fe499..6a56b67a80cd4 100644 --- a/3rdparty/asmjit/test/asmjit_test_assembler.cpp +++ b/3rdparty/asmjit/test/asmjit_test_assembler.cpp @@ -26,7 +26,7 @@ int main(int argc, char* argv[]) { CmdLine cmdLine(argc, argv); TestSettings settings {}; - settings.quiet = cmdLine.hasArg("--quiet"); + settings.verbose = cmdLine.hasArg("--verbose"); settings.validate = cmdLine.hasArg("--validate"); printf("AsmJit Assembler Test-Suite v%u.%u.%u:\n\n", @@ -35,12 +35,21 @@ int main(int argc, char* argv[]) { unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF)); printf("Usage:\n"); - printf(" --help Show usage only\n"); - printf(" --arch= Select architecture to run ('all' by default)\n"); - printf(" --quiet Show only assembling errors [%s]\n", settings.quiet ? "x" : " "); - printf(" --validate Use instruction validation [%s]\n", settings.validate ? "x" : " "); + printf(" --help Show usage only\n"); + printf(" --verbose Show only assembling errors [%s]\n", settings.verbose ? "x" : " "); + printf(" --validate Use instruction validation [%s]\n", settings.validate ? "x" : " "); + printf(" --arch= Select architecture to run ('all' by default)\n"); printf("\n"); + printf("Architectures:\n"); +#if !defined(ASMJIT_NO_X86) + printf(" --arch=x86 32-bit X86 architecture (X86)\n"); + printf(" --arch=x64 64-bit X86 architecture (X86_64)\n"); +#endif +#if !defined(ASMJIT_NO_AARCH64) + printf(" --arch=aarch64 64-bit ARM architecture (AArch64)\n"); +#endif + printf("\n"); if (cmdLine.hasArg("--help")) return 0; diff --git a/3rdparty/asmjit/test/asmjit_test_assembler.h b/3rdparty/asmjit/test/asmjit_test_assembler.h index 61d774bbb1dfc..26f2c97ed9822 100644 --- a/3rdparty/asmjit/test/asmjit_test_assembler.h +++ b/3rdparty/asmjit/test/asmjit_test_assembler.h @@ -10,7 +10,7 @@ #include struct TestSettings { - bool quiet; + bool verbose; bool validate; }; @@ -52,7 +52,7 @@ class AssemblerTester { assembler.addDiagnosticOptions(asmjit::DiagnosticOptions::kValidateAssembler); } - ASMJIT_NOINLINE bool testInstruction(const char* expectedOpcode, const char* s, uint32_t err) noexcept { + ASMJIT_NOINLINE bool testValidInstruction(const char* s, const char* expectedOpcode, asmjit::Error err = asmjit::kErrorOk) noexcept { count++; if (err) { @@ -73,13 +73,36 @@ class AssemblerTester { return false; } - if (!settings.quiet) + if (settings.verbose) printf(" OK [%s] <- %s\n", encodedOpcode.data(), s); passed++; prepare(); return true; } + + ASMJIT_NOINLINE bool testInvalidInstruction(const char* s, asmjit::Error expectedError, asmjit::Error err) noexcept { + count++; + + if (err == asmjit::kErrorOk) { + printf(" !! %s passed, but should have failed with <%s> error\n", s, asmjit::DebugUtils::errorAsString(expectedError)); + prepare(); + return false; + } + + if (err != asmjit::kErrorOk) { + printf(" !! %s failed with <%s>, but should have failed with <%s>\n", s, asmjit::DebugUtils::errorAsString(err), asmjit::DebugUtils::errorAsString(expectedError)); + prepare(); + return false; + } + + if (settings.verbose) + printf(" OK [%s] <- %s\n", asmjit::DebugUtils::errorAsString(err), s); + + passed++; + prepare(); + return true; + } }; #endif // ASMJIT_TEST_ASSEMBLER_H_INCLUDED diff --git a/3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp b/3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp index a1d1178532f0b..8da77b3ff5035 100644 --- a/3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp +++ b/3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp @@ -17,7 +17,7 @@ using namespace asmjit; #define TEST_INSTRUCTION(OPCODE, ...) \ - tester.testInstruction(OPCODE, #__VA_ARGS__, tester.assembler.__VA_ARGS__) + tester.testValidInstruction(#__VA_ARGS__, OPCODE, tester.assembler.__VA_ARGS__) static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester& tester) noexcept { using namespace a64; @@ -485,16 +485,24 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester TEST_INSTRUCTION("41104078", ldrh(w1, ptr(x2, 1))); // LDURH TEST_INSTRUCTION("41D05F78", ldrh(w1, ptr(x2, -3))); // LDURH TEST_INSTRUCTION("41705F78", ldrh(w1, ptr(x2, -9))); // LDURH + TEST_INSTRUCTION("4168E338", ldrsb(w1, ptr(x2, x3))); TEST_INSTRUCTION("4104C039", ldrsb(w1, ptr(x2, 1))); + TEST_INSTRUCTION("4120C039", ldrsb(w1, ptr(x2, 8))); TEST_INSTRUCTION("41D0DF38", ldrsb(w1, ptr(x2, -3))); // LDURSB TEST_INSTRUCTION("4170DF38", ldrsb(w1, ptr(x2, -9))); // LDURSB + TEST_INSTRUCTION("4168A338", ldrsb(x1, ptr(x2, x3))); TEST_INSTRUCTION("41048039", ldrsb(x1, ptr(x2, 1))); + TEST_INSTRUCTION("41208039", ldrsb(x1, ptr(x2, 8))); TEST_INSTRUCTION("41D09F38", ldrsb(x1, ptr(x2, -3))); // LDURSB TEST_INSTRUCTION("41709F38", ldrsb(x1, ptr(x2, -9))); // LDURSB + TEST_INSTRUCTION("4168E378", ldrsh(w1, ptr(x2, x3))); TEST_INSTRUCTION("4110C078", ldrsh(w1, ptr(x2, 1))); // LDURSH + TEST_INSTRUCTION("4110C079", ldrsh(w1, ptr(x2, 8))); TEST_INSTRUCTION("41D0DF78", ldrsh(w1, ptr(x2, -3))); // LDURSH TEST_INSTRUCTION("4170DF78", ldrsh(w1, ptr(x2, -9))); // LDURSH + TEST_INSTRUCTION("4168A378", ldrsh(x1, ptr(x2, x3))); TEST_INSTRUCTION("41108078", ldrsh(x1, ptr(x2, 1))); // LDURSH + TEST_INSTRUCTION("41108079", ldrsh(x1, ptr(x2, 8))); TEST_INSTRUCTION("41D09F78", ldrsh(x1, ptr(x2, -3))); // LDURSH TEST_INSTRUCTION("41709F78", ldrsh(x1, ptr(x2, -9))); // LDURSH TEST_INSTRUCTION("410080B9", ldrsw(x1, ptr(x2))); @@ -738,6 +746,10 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester TEST_INSTRUCTION("411088B8", ldursw(x1, ptr(x2, 129))); TEST_INSTRUCTION("E10380B8", ldursw(x1, ptr(sp))); TEST_INSTRUCTION("E11388B8", ldursw(x1, ptr(sp, 129))); + TEST_INSTRUCTION("420080B8", ldursw(x2, ptr(x2))); + TEST_INSTRUCTION("421088B8", ldursw(x2, ptr(x2, 129))); + TEST_INSTRUCTION("E20380B8", ldursw(x2, ptr(sp))); + TEST_INSTRUCTION("E21388B8", ldursw(x2, ptr(sp, 129))); TEST_INSTRUCTION("61087F88", ldxp(w1, w2, ptr(x3))); TEST_INSTRUCTION("E10B7F88", ldxp(w1, w2, ptr(sp))); TEST_INSTRUCTION("61087FC8", ldxp(x1, x2, ptr(x3))); @@ -850,6 +862,13 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester TEST_INSTRUCTION("F42FC1DA", pacdzb(x20)); TEST_INSTRUCTION("4130C39A", pacga(x1, x2, x3)); TEST_INSTRUCTION("4130DF9A", pacga(x1, x2, sp)); + TEST_INSTRUCTION("204080F9", prfm(Predicate::PRFOp::kPLDL1KEEP, ptr(x1, 128))); + TEST_INSTRUCTION("401098F8", prfm(Predicate::PRFOp::kPLDL1KEEP, ptr(x2, -127))); + TEST_INSTRUCTION("601088F8", prfm(Predicate::PRFOp::kPLDL1KEEP, ptr(x3, 129))); + TEST_INSTRUCTION("6068A4F8", prfm(Predicate::PRFOp::kPLDL1KEEP, ptr(x3, x4))); + TEST_INSTRUCTION("6078A4F8", prfm(Predicate::PRFOp::kPLDL1KEEP, ptr(x3, x4, lsl(3)))); + TEST_INSTRUCTION("60C8A4F8", prfm(Predicate::PRFOp::kPLDL1KEEP, ptr(x3, x4, sxtw(0)))); + TEST_INSTRUCTION("73D8A4F8", prfm(Predicate::PRFOp::kPSTL2STRM, ptr(x3, x4, sxtw(3)))); TEST_INSTRUCTION("9F3403D5", pssbb()); TEST_INSTRUCTION("4100C05A", rbit(w1, w2)); TEST_INSTRUCTION("4100C0DA", rbit(x1, x2)); diff --git a/3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp b/3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp index bedf796454124..556c0eb9f5cec 100644 --- a/3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp +++ b/3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp @@ -17,7 +17,7 @@ using namespace asmjit; #define TEST_INSTRUCTION(OPCODE, ...) \ - tester.testInstruction(OPCODE, #__VA_ARGS__, tester.assembler.__VA_ARGS__) + tester.testValidInstruction(#__VA_ARGS__, OPCODE, tester.assembler.__VA_ARGS__) static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester& tester) noexcept { using namespace x86; @@ -58,12 +58,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("138C1A80000000" , adc(ecx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("48138C1A80000000" , adc(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("48138C1A80000000" , adc(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38F6CA" , adcx(ecx, edx)); - TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("66480F38F6CA" , adcx(rcx, rdx)); - TEST_INSTRUCTION("66480F38F68C1A80000000" , adcx(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("66480F38F68C1A80000000" , adcx(rcx, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("80C101" , add(cl, 1)); TEST_INSTRUCTION("80C501" , add(ch, 1)); TEST_INSTRUCTION("8084118000000001" , add(byte_ptr(rcx, rdx, 0, 128), 1)); @@ -100,12 +94,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("038C1A80000000" , add(ecx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("48038C1A80000000" , add(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("48038C1A80000000" , add(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30F38F6CA" , adox(ecx, edx)); - TEST_INSTRUCTION("F30F38F68C1A80000000" , adox(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30F38F68C1A80000000" , adox(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F3480F38F6CA" , adox(rcx, rdx)); - TEST_INSTRUCTION("F3480F38F68C1A80000000" , adox(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F3480F38F68C1A80000000" , adox(rcx, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("80E101" , and_(cl, 1)); TEST_INSTRUCTION("80E501" , and_(ch, 1)); TEST_INSTRUCTION("6683E101" , and_(cx, 1)); @@ -142,93 +130,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("66238C1A80000000" , and_(cx, word_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("238C1A80000000" , and_(ecx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("238C1A80000000" , and_(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E268F2CB" , andn(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E8F2CB" , andn(rcx, rdx, rbx)); - TEST_INSTRUCTION("C4E2E8F28C2B80000000" , andn(rcx, rdx, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E8F28C2B80000000" , andn(rcx, rdx, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E260F7CA" , bextr(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E2E0F7CA" , bextr(rcx, rdx, rbx)); - TEST_INSTRUCTION("C4E2D8F78C1A80000000" , bextr(rcx, ptr(rdx, rbx, 0, 128), rsp)); - TEST_INSTRUCTION("C4E2D8F78C1A80000000" , bextr(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); - TEST_INSTRUCTION("8FE97001CA" , blcfill(ecx, edx)); - TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001CA" , blcfill(rcx, rdx)); - TEST_INSTRUCTION("8FE9F0018C1A80000000" , blcfill(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F0018C1A80000000" , blcfill(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97002F2" , blci(ecx, edx)); - TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F002F2" , blci(rcx, rdx)); - TEST_INSTRUCTION("8FE9F002B41A80000000" , blci(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F002B41A80000000" , blci(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001EA" , blcic(ecx, edx)); - TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001EA" , blcic(rcx, rdx)); - TEST_INSTRUCTION("8FE9F001AC1A80000000" , blcic(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001AC1A80000000" , blcic(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97002CA" , blcmsk(ecx, edx)); - TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F002CA" , blcmsk(rcx, rdx)); - TEST_INSTRUCTION("8FE9F0028C1A80000000" , blcmsk(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F0028C1A80000000" , blcmsk(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001DA" , blcs(ecx, edx)); - TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001DA" , blcs(rcx, rdx)); - TEST_INSTRUCTION("8FE9F0019C1A80000000" , blcs(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F0019C1A80000000" , blcs(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001D2" , blsfill(ecx, edx)); - TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001D2" , blsfill(rcx, rdx)); - TEST_INSTRUCTION("8FE9F001941A80000000" , blsfill(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001941A80000000" , blsfill(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E270F3DA" , blsi(ecx, edx)); - TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2F0F3DA" , blsi(rcx, rdx)); - TEST_INSTRUCTION("C4E2F0F39C1A80000000" , blsi(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2F0F39C1A80000000" , blsi(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001F2" , blsic(ecx, edx)); - TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001F2" , blsic(rcx, rdx)); - TEST_INSTRUCTION("8FE9F001B41A80000000" , blsic(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001B41A80000000" , blsic(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E270F3D2" , blsmsk(ecx, edx)); - TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2F0F3D2" , blsmsk(rcx, rdx)); - TEST_INSTRUCTION("C4E2F0F3941A80000000" , blsmsk(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2F0F3941A80000000" , blsmsk(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E270F3CA" , blsr(ecx, edx)); - TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2F0F3CA" , blsr(rcx, rdx)); - TEST_INSTRUCTION("C4E2F0F38C1A80000000" , blsr(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2F0F38C1A80000000" , blsr(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30F1ACA" , bndcl(bnd1, rdx)); - TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20F1BCA" , bndcn(bnd1, rdx)); - TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20F1ACA" , bndcu(bnd1, rdx)); - TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F1A8C1A80000000" , bndldx(bnd1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30F1B8C1A80000000" , bndmk(bnd1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F1ACA" , bndmov(bnd1, bnd2)); - TEST_INSTRUCTION("660F1A8C1A80000000" , bndmov(bnd1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F1B9C1180000000" , bndmov(ptr(rcx, rdx, 0, 128), bnd3)); - TEST_INSTRUCTION("0F1B9C1180000000" , bndstx(ptr(rcx, rdx, 0, 128), bnd3)); TEST_INSTRUCTION("660FBCCA" , bsf(cx, dx)); TEST_INSTRUCTION("660FBC8C1A80000000" , bsf(cx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("660FBC8C1A80000000" , bsf(cx, word_ptr(rdx, rbx, 0, 128))); @@ -310,30 +211,12 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("480FABD1" , bts(rcx, rdx)); TEST_INSTRUCTION("480FAB9C1180000000" , bts(ptr(rcx, rdx, 0, 128), rbx)); TEST_INSTRUCTION("480FAB9C1180000000" , bts(qword_ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("C4E260F5CA" , bzhi(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E2E0F5CA" , bzhi(rcx, rdx, rbx)); - TEST_INSTRUCTION("C4E2D8F58C1A80000000" , bzhi(rcx, ptr(rdx, rbx, 0, 128), rsp)); - TEST_INSTRUCTION("C4E2D8F58C1A80000000" , bzhi(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); TEST_INSTRUCTION("6698" , cbw(ax)); TEST_INSTRUCTION("99" , cdq(edx, eax)); TEST_INSTRUCTION("4898" , cdqe(rax)); - TEST_INSTRUCTION("0F01CA" , clac()); TEST_INSTRUCTION("F8" , clc()); TEST_INSTRUCTION("FC" , cld()); - TEST_INSTRUCTION("0F1C841180000000" , cldemote(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0FAEBC1180000000" , clflush(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("660FAEBC1180000000" , clflushopt(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F01DD" , clgi()); TEST_INSTRUCTION("FA" , cli()); - TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(qword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F06" , clts()); - TEST_INSTRUCTION("F30F01EE" , clui()); - TEST_INSTRUCTION("660FAEB41180000000" , clwb(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F01FC" , clzero(ptr(rax))); - TEST_INSTRUCTION("0F01FC" , clzero(zmmword_ptr(rax))); TEST_INSTRUCTION("F5" , cmc()); TEST_INSTRUCTION("660F47CA" , cmova(cx, dx)); TEST_INSTRUCTION("660F478C1A80000000" , cmova(cx, ptr(rdx, rbx, 0, 128))); @@ -668,17 +551,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("0FC78C1180000000" , cmpxchg8b(qword_ptr(rcx, rdx, 0, 128), edx, eax, ecx, ebx)); TEST_INSTRUCTION("0FA2" , cpuid(eax, ebx, ecx, edx)); TEST_INSTRUCTION("4899" , cqo(rdx, rax)); - TEST_INSTRUCTION("F20F38F0CA" , crc32(ecx, dl)); - TEST_INSTRUCTION("F20F38F0CE" , crc32(ecx, dh)); - TEST_INSTRUCTION("66F20F38F1CA" , crc32(ecx, dx)); - TEST_INSTRUCTION("F20F38F1CA" , crc32(ecx, edx)); - TEST_INSTRUCTION("F20F38F08C1A80000000" , crc32(ecx, byte_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("66F20F38F18C1A80000000" , crc32(ecx, word_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20F38F18C1A80000000" , crc32(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F2480F38F0CA" , crc32(rcx, dl)); - TEST_INSTRUCTION("F2480F38F1CA" , crc32(rcx, rdx)); - TEST_INSTRUCTION("F2480F38F08C1A80000000" , crc32(rcx, byte_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F2480F38F18C1A80000000" , crc32(rcx, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("6699" , cwd(dx, ax)); TEST_INSTRUCTION("98" , cwde(eax)); TEST_INSTRUCTION("FEC9" , dec(cl)); @@ -703,19 +575,8 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("48F7F1" , div(rdx, rax, rcx)); TEST_INSTRUCTION("48F7B41180000000" , div(rdx, rax, ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("48F7B41180000000" , div(rdx, rax, qword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("F30F1EFB" , endbr32()); - TEST_INSTRUCTION("F30F1EFA" , endbr64()); - TEST_INSTRUCTION("F20F38F88C1A80000000" , enqcmd(zmmword_ptr(rcx), zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30F38F88C1A80000000" , enqcmds(zmmword_ptr(rcx), zmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("C8010002" , enter(1, 2)); - TEST_INSTRUCTION("0FAE8C1180000000" , fxrstor(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("480FAE8C1180000000" , fxrstor64(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0FAE841180000000" , fxsave(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("480FAE841180000000" , fxsave64(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("D9F4" , fxtract()); - TEST_INSTRUCTION("0F37" , getsec()); TEST_INSTRUCTION("F4" , hlt()); - TEST_INSTRUCTION("F30F3AF0C001" , hreset(1, eax)); TEST_INSTRUCTION("F6F9" , idiv(ax, cl)); TEST_INSTRUCTION("F6FD" , idiv(ax, ch)); TEST_INSTRUCTION("F6BC1180000000" , idiv(ax, ptr(rcx, rdx, 0, 128))); @@ -754,12 +615,15 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("486BC901" , imul(rcx, 1)); TEST_INSTRUCTION("480FAF8C1A80000000" , imul(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("480FAF8C1A80000000" , imul(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("666BC901" , imul(cx, cx, 1)); TEST_INSTRUCTION("666BCA01" , imul(cx, dx, 1)); TEST_INSTRUCTION("666B8C1A8000000001" , imul(cx, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("666B8C1A8000000001" , imul(cx, word_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("6BC901" , imul(ecx, ecx, 1)); TEST_INSTRUCTION("6BCA01" , imul(ecx, edx, 1)); TEST_INSTRUCTION("6B8C1A8000000001" , imul(ecx, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("6B8C1A8000000001" , imul(ecx, dword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("486BC901" , imul(rcx, rcx, 1)); TEST_INSTRUCTION("486BCA01" , imul(rcx, rdx, 1)); TEST_INSTRUCTION("486B8C1A8000000001" , imul(rcx, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("486B8C1A8000000001" , imul(rcx, qword_ptr(rdx, rbx, 0, 128), 1)); @@ -778,101 +642,18 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("66FF841180000000" , inc(word_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("FF841180000000" , inc(dword_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("48FF841180000000" , inc(qword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("F30FAEE9" , incsspd(ecx)); - TEST_INSTRUCTION("F3480FAEE9" , incsspq(rcx)); TEST_INSTRUCTION("6C" , ins(byte_ptr(rdi), dx)); TEST_INSTRUCTION("666D" , ins(word_ptr(rdi), dx)); TEST_INSTRUCTION("6D" , ins(dword_ptr(rdi), dx)); TEST_INSTRUCTION("CD01" , int_(1)); TEST_INSTRUCTION("CC" , int3()); TEST_INSTRUCTION("0F08" , invd()); - TEST_INSTRUCTION("660F38808C1A80000000" , invept(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38808C1A80000000" , invept(rcx, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("0F01BC1180000000" , invlpg(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("670F01DF" , invlpga(eax, ecx)); - TEST_INSTRUCTION("0F01DF" , invlpga(rax, ecx)); TEST_INSTRUCTION("660F38828C1A80000000" , invpcid(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("660F38828C1A80000000" , invpcid(rcx, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(rcx, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("66CF" , iret()); TEST_INSTRUCTION("CF" , iretd()); TEST_INSTRUCTION("48CF" , iretq()); - TEST_INSTRUCTION("C5ED4ACB" , kaddb(k1, k2, k3)); - TEST_INSTRUCTION("C4E1ED4ACB" , kaddd(k1, k2, k3)); - TEST_INSTRUCTION("C4E1EC4ACB" , kaddq(k1, k2, k3)); - TEST_INSTRUCTION("C5EC4ACB" , kaddw(k1, k2, k3)); - TEST_INSTRUCTION("C5ED41CB" , kandb(k1, k2, k3)); - TEST_INSTRUCTION("C4E1ED41CB" , kandd(k1, k2, k3)); - TEST_INSTRUCTION("C5ED42CB" , kandnb(k1, k2, k3)); - TEST_INSTRUCTION("C4E1ED42CB" , kandnd(k1, k2, k3)); - TEST_INSTRUCTION("C4E1EC42CB" , kandnq(k1, k2, k3)); - TEST_INSTRUCTION("C5EC42CB" , kandnw(k1, k2, k3)); - TEST_INSTRUCTION("C4E1EC41CB" , kandq(k1, k2, k3)); - TEST_INSTRUCTION("C5EC41CB" , kandw(k1, k2, k3)); - TEST_INSTRUCTION("C5F992CA" , kmovb(k1, edx)); - TEST_INSTRUCTION("C5F990CA" , kmovb(k1, k2)); - TEST_INSTRUCTION("C5F9908C1A80000000" , kmovb(k1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F9908C1A80000000" , kmovb(k1, byte_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F993CA" , kmovb(ecx, k2)); - TEST_INSTRUCTION("C5F9919C1180000000" , kmovb(ptr(rcx, rdx, 0, 128), k3)); - TEST_INSTRUCTION("C5F9919C1180000000" , kmovb(byte_ptr(rcx, rdx, 0, 128), k3)); - TEST_INSTRUCTION("C5FB92CA" , kmovd(k1, edx)); - TEST_INSTRUCTION("C4E1F990CA" , kmovd(k1, k2)); - TEST_INSTRUCTION("C4E1F9908C1A80000000" , kmovd(k1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1F9908C1A80000000" , kmovd(k1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FB93CA" , kmovd(ecx, k2)); - TEST_INSTRUCTION("C4E1F9919C1180000000" , kmovd(ptr(rcx, rdx, 0, 128), k3)); - TEST_INSTRUCTION("C4E1F9919C1180000000" , kmovd(dword_ptr(rcx, rdx, 0, 128), k3)); - TEST_INSTRUCTION("C4E1FB92CA" , kmovq(k1, rdx)); - TEST_INSTRUCTION("C4E1F890CA" , kmovq(k1, k2)); - TEST_INSTRUCTION("C4E1F8908C1A80000000" , kmovq(k1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1F8908C1A80000000" , kmovq(k1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1FB93CA" , kmovq(rcx, k2)); - TEST_INSTRUCTION("C4E1F8919C1180000000" , kmovq(ptr(rcx, rdx, 0, 128), k3)); - TEST_INSTRUCTION("C4E1F8919C1180000000" , kmovq(qword_ptr(rcx, rdx, 0, 128), k3)); - TEST_INSTRUCTION("C5F892CA" , kmovw(k1, edx)); - TEST_INSTRUCTION("C5F890CA" , kmovw(k1, k2)); - TEST_INSTRUCTION("C5F8908C1A80000000" , kmovw(k1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F8908C1A80000000" , kmovw(k1, word_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F893CA" , kmovw(ecx, k2)); - TEST_INSTRUCTION("C5F8919C1180000000" , kmovw(ptr(rcx, rdx, 0, 128), k3)); - TEST_INSTRUCTION("C5F8919C1180000000" , kmovw(word_ptr(rcx, rdx, 0, 128), k3)); - TEST_INSTRUCTION("C5F944CA" , knotb(k1, k2)); - TEST_INSTRUCTION("C4E1F944CA" , knotd(k1, k2)); - TEST_INSTRUCTION("C4E1F844CA" , knotq(k1, k2)); - TEST_INSTRUCTION("C5F844CA" , knotw(k1, k2)); - TEST_INSTRUCTION("C5ED45CB" , korb(k1, k2, k3)); - TEST_INSTRUCTION("C4E1ED45CB" , kord(k1, k2, k3)); - TEST_INSTRUCTION("C4E1EC45CB" , korq(k1, k2, k3)); - TEST_INSTRUCTION("C5F998CA" , kortestb(k1, k2)); - TEST_INSTRUCTION("C4E1F998CA" , kortestd(k1, k2)); - TEST_INSTRUCTION("C4E1F898CA" , kortestq(k1, k2)); - TEST_INSTRUCTION("C5F898CA" , kortestw(k1, k2)); - TEST_INSTRUCTION("C5EC45CB" , korw(k1, k2, k3)); - TEST_INSTRUCTION("C4E37932CA01" , kshiftlb(k1, k2, 1)); - TEST_INSTRUCTION("C4E37933CA01" , kshiftld(k1, k2, 1)); - TEST_INSTRUCTION("C4E3F933CA01" , kshiftlq(k1, k2, 1)); - TEST_INSTRUCTION("C4E3F932CA01" , kshiftlw(k1, k2, 1)); - TEST_INSTRUCTION("C4E37930CA01" , kshiftrb(k1, k2, 1)); - TEST_INSTRUCTION("C4E37931CA01" , kshiftrd(k1, k2, 1)); - TEST_INSTRUCTION("C4E3F931CA01" , kshiftrq(k1, k2, 1)); - TEST_INSTRUCTION("C4E3F930CA01" , kshiftrw(k1, k2, 1)); - TEST_INSTRUCTION("C5F999CA" , ktestb(k1, k2)); - TEST_INSTRUCTION("C4E1F999CA" , ktestd(k1, k2)); - TEST_INSTRUCTION("C4E1F899CA" , ktestq(k1, k2)); - TEST_INSTRUCTION("C5F899CA" , ktestw(k1, k2)); - TEST_INSTRUCTION("C5ED4BCB" , kunpckbw(k1, k2, k3)); - TEST_INSTRUCTION("C4E1EC4BCB" , kunpckdq(k1, k2, k3)); - TEST_INSTRUCTION("C5EC4BCB" , kunpckwd(k1, k2, k3)); - TEST_INSTRUCTION("C5ED46CB" , kxnorb(k1, k2, k3)); - TEST_INSTRUCTION("C4E1ED46CB" , kxnord(k1, k2, k3)); - TEST_INSTRUCTION("C4E1EC46CB" , kxnorq(k1, k2, k3)); - TEST_INSTRUCTION("C5EC46CB" , kxnorw(k1, k2, k3)); - TEST_INSTRUCTION("C5ED47CB" , kxorb(k1, k2, k3)); - TEST_INSTRUCTION("C4E1ED47CB" , kxord(k1, k2, k3)); - TEST_INSTRUCTION("C4E1EC47CB" , kxorq(k1, k2, k3)); - TEST_INSTRUCTION("C5EC47CB" , kxorw(k1, k2, k3)); TEST_INSTRUCTION("9F" , lahf(ah)); TEST_INSTRUCTION("660F02CA" , lar(cx, dx)); TEST_INSTRUCTION("660F028C1A80000000" , lar(cx, ptr(rdx, rbx, 0, 128))); @@ -884,13 +665,10 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("66FF9C1180000000" , lcall(dword_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("FF9C1180000000" , lcall(fword_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("48FF9C1180000000" , lcall(tbyte_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(dword_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("668D8C1A80000000" , lea(cx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("8D8C1A80000000" , lea(ecx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("488D8C1A80000000" , lea(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("C9" , leave()); - TEST_INSTRUCTION("0FAEE8" , lfence()); TEST_INSTRUCTION("660FB48C1A80000000" , lfs(cx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("660FB48C1A80000000" , lfs(cx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("0FB48C1A80000000" , lfs(ecx, ptr(rdx, rbx, 0, 128))); @@ -912,8 +690,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("0F00D1" , lldt(cx)); TEST_INSTRUCTION("0F00941180000000" , lldt(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F00941180000000" , lldt(word_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("8FE97812C1" , llwpcb(ecx)); - TEST_INSTRUCTION("8FE9F812C1" , llwpcb(rcx)); TEST_INSTRUCTION("0F01F1" , lmsw(cx)); TEST_INSTRUCTION("0F01B41180000000" , lmsw(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F01B41180000000" , lmsw(word_ptr(rcx, rdx, 0, 128))); @@ -943,31 +719,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("0F00D9" , ltr(cx)); TEST_INSTRUCTION("0F009C1180000000" , ltr(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F009C1180000000" , ltr(word_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("8FEA7012C201000000" , lwpins(ecx, edx, 1)); - TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, dword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FEAF012C201000000" , lwpins(rcx, edx, 1)); - TEST_INSTRUCTION("8FEAF012841A8000000001000000" , lwpins(rcx, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FEAF012841A8000000001000000" , lwpins(rcx, dword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FEA7012CA01000000" , lwpval(ecx, edx, 1)); - TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, dword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FEAF012CA01000000" , lwpval(rcx, edx, 1)); - TEST_INSTRUCTION("8FEAF0128C1A8000000001000000" , lwpval(rcx, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FEAF0128C1A8000000001000000" , lwpval(rcx, dword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("66F30FBDCA" , lzcnt(cx, dx)); - TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, word_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30FBDCA" , lzcnt(ecx, edx)); - TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F3480FBDCA" , lzcnt(rcx, rdx)); - TEST_INSTRUCTION("F3480FBD8C1A80000000" , lzcnt(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F3480FBD8C1A80000000" , lzcnt(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30F01FA" , mcommit()); - TEST_INSTRUCTION("0FAEF0" , mfence()); - TEST_INSTRUCTION("0F01C8" , monitor(ptr(rax), ecx, edx)); - TEST_INSTRUCTION("0F01FA" , monitorx(ptr(rax), ecx, edx)); TEST_INSTRUCTION("88D1" , mov(cl, dl)); TEST_INSTRUCTION("88F1" , mov(cl, dh)); TEST_INSTRUCTION("88D5" , mov(ch, dl)); @@ -1019,27 +770,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("8EA41A80000000" , mov(fs, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("668EA41A80000000" , mov(fs, word_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("48B90100000000000000" , movabs(rcx, 1)); - TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, word_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("480F38F08C1A80000000" , movbe(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("480F38F08C1A80000000" , movbe(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38F19C1180000000" , movbe(ptr(rcx, rdx, 0, 128), bx)); - TEST_INSTRUCTION("660F38F19C1180000000" , movbe(word_ptr(rcx, rdx, 0, 128), bx)); - TEST_INSTRUCTION("0F38F19C1180000000" , movbe(ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("0F38F19C1180000000" , movbe(dword_ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("480F38F19C1180000000" , movbe(ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("480F38F19C1180000000" , movbe(qword_ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("660F38F88C1A80000000" , movdir64b(zmmword_ptr(rcx), zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(dword_ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("480F38F99C1180000000" , movdiri(ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("480F38F99C1180000000" , movdiri(qword_ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("0FC39C1180000000" , movnti(ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("0FC39C1180000000" , movnti(dword_ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("480FC39C1180000000" , movnti(ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("480FC39C1180000000" , movnti(qword_ptr(rcx, rdx, 0, 128), rbx)); TEST_INSTRUCTION("A4" , movs(byte_ptr(rdi), byte_ptr(rsi))); TEST_INSTRUCTION("66A5" , movs(word_ptr(rdi), word_ptr(rsi))); TEST_INSTRUCTION("A5" , movs(dword_ptr(rdi), dword_ptr(rsi))); @@ -1090,14 +820,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("48F7E1" , mul(rdx, rax, rcx)); TEST_INSTRUCTION("48F7A41180000000" , mul(rdx, rax, ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("48F7A41180000000" , mul(rdx, rax, qword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("C4E26BF6CB" , mulx(ecx, edx, ebx, edx)); - TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, ptr(rbx, rbp, 0, 128), edx)); - TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, dword_ptr(rbx, rbp, 0, 128), edx)); - TEST_INSTRUCTION("C4E2EBF6CB" , mulx(rcx, rdx, rbx, rdx)); - TEST_INSTRUCTION("C4E2EBF68C2B80000000" , mulx(rcx, rdx, ptr(rbx, rbp, 0, 128), rdx)); - TEST_INSTRUCTION("C4E2EBF68C2B80000000" , mulx(rcx, rdx, qword_ptr(rbx, rbp, 0, 128), rdx)); - TEST_INSTRUCTION("0F01C9" , mwait(eax, ecx)); - TEST_INSTRUCTION("0F01FB" , mwaitx(eax, ecx, ebx)); TEST_INSTRUCTION("F6D9" , neg(cl)); TEST_INSTRUCTION("F6DD" , neg(ch)); TEST_INSTRUCTION("66F7D9" , neg(cx)); @@ -1178,48 +900,13 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("666F" , outs(dx, word_ptr(rsi))); TEST_INSTRUCTION("6F" , outs(dx, dword_ptr(rsi))); TEST_INSTRUCTION("F390" , pause()); - TEST_INSTRUCTION("0F01C5" , pconfig()); - TEST_INSTRUCTION("C4E26BF5CB" , pdep(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EBF5CB" , pdep(rcx, rdx, rbx)); - TEST_INSTRUCTION("C4E2EBF58C2B80000000" , pdep(rcx, rdx, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EBF58C2B80000000" , pdep(rcx, rdx, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26AF5CB" , pext(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EAF5CB" , pext(rcx, rdx, rbx)); - TEST_INSTRUCTION("C4E2EAF58C2B80000000" , pext(rcx, rdx, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EAF58C2B80000000" , pext(rcx, rdx, qword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("6659" , pop(cx)); TEST_INSTRUCTION("59" , pop(rcx)); TEST_INSTRUCTION("668F841180000000" , pop(word_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("8F841180000000" , pop(qword_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0FA1" , pop(fs)); - TEST_INSTRUCTION("66F30FB8CA" , popcnt(cx, dx)); - TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, word_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30FB8CA" , popcnt(ecx, edx)); - TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F3480FB8CA" , popcnt(rcx, rdx)); - TEST_INSTRUCTION("F3480FB88C1A80000000" , popcnt(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F3480FB88C1A80000000" , popcnt(rcx, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("669D" , popf()); TEST_INSTRUCTION("9D" , popfq()); - TEST_INSTRUCTION("0F0D841180000000" , prefetch(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F18841180000000" , prefetchnta(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F188C1180000000" , prefetcht0(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F18941180000000" , prefetcht1(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F189C1180000000" , prefetcht2(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F0D8C1180000000" , prefetchw(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F0D941180000000" , prefetchwt1(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("F30F01FF" , psmash()); - TEST_INSTRUCTION("F30FAEE1" , ptwrite(ecx)); - TEST_INSTRUCTION("F3480FAEE1" , ptwrite(rcx)); - TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(dword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("F3480FAEA41180000000" , ptwrite(qword_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("6651" , push(cx)); TEST_INSTRUCTION("51" , push(rcx)); TEST_INSTRUCTION("6A01" , push(1)); @@ -1228,7 +915,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("0FA0" , push(fs)); TEST_INSTRUCTION("669C" , pushf()); TEST_INSTRUCTION("9C" , pushfq()); - TEST_INSTRUCTION("F20F01FF" , pvalidate()); TEST_INSTRUCTION("D2D1" , rcl(cl, cl)); TEST_INSTRUCTION("D0D1" , rcl(cl, 1)); TEST_INSTRUCTION("D2D5" , rcl(ch, cl)); @@ -1265,31 +951,11 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("D19C1180000000" , rcr(dword_ptr(rcx, rdx, 0, 128), 1)); TEST_INSTRUCTION("48D39C1180000000" , rcr(qword_ptr(rcx, rdx, 0, 128), cl)); TEST_INSTRUCTION("48D19C1180000000" , rcr(qword_ptr(rcx, rdx, 0, 128), 1)); - TEST_INSTRUCTION("F30FAEC1" , rdfsbase(ecx)); - TEST_INSTRUCTION("F3480FAEC1" , rdfsbase(rcx)); - TEST_INSTRUCTION("F30FAEC9" , rdgsbase(ecx)); - TEST_INSTRUCTION("F3480FAEC9" , rdgsbase(rcx)); TEST_INSTRUCTION("0F32" , rdmsr(edx, eax, ecx)); - TEST_INSTRUCTION("F30FC7F9" , rdpid(rcx)); - TEST_INSTRUCTION("0F01EE" , rdpkru(edx, eax, ecx)); - TEST_INSTRUCTION("0F33" , rdpmc(edx, eax, ecx)); - TEST_INSTRUCTION("0F01FD" , rdpru(edx, eax, ecx)); - TEST_INSTRUCTION("660FC7F1" , rdrand(cx)); - TEST_INSTRUCTION("0FC7F1" , rdrand(ecx)); - TEST_INSTRUCTION("480FC7F1" , rdrand(rcx)); - TEST_INSTRUCTION("660FC7F9" , rdseed(cx)); - TEST_INSTRUCTION("0FC7F9" , rdseed(ecx)); - TEST_INSTRUCTION("480FC7F9" , rdseed(rcx)); - TEST_INSTRUCTION("F30F1EC9" , rdsspd(ecx)); - TEST_INSTRUCTION("F3480F1EC9" , rdsspq(rcx)); - TEST_INSTRUCTION("0F31" , rdtsc(edx, eax)); - TEST_INSTRUCTION("0F01F9" , rdtscp(edx, eax, ecx)); TEST_INSTRUCTION("C3" , ret()); TEST_INSTRUCTION("C20100" , ret(1)); TEST_INSTRUCTION("CB" , retf()); TEST_INSTRUCTION("CA0100" , retf(1)); - TEST_INSTRUCTION("F30F01FE" , rmpadjust()); - TEST_INSTRUCTION("F20F01FE" , rmpupdate()); TEST_INSTRUCTION("D2C1" , rol(cl, cl)); TEST_INSTRUCTION("D0C1" , rol(cl, 1)); TEST_INSTRUCTION("D2C5" , rol(ch, cl)); @@ -1326,12 +992,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("D18C1180000000" , ror(dword_ptr(rcx, rdx, 0, 128), 1)); TEST_INSTRUCTION("48D38C1180000000" , ror(qword_ptr(rcx, rdx, 0, 128), cl)); TEST_INSTRUCTION("48D18C1180000000" , ror(qword_ptr(rcx, rdx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37BF0CA01" , rorx(ecx, edx, 1)); - TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, dword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3FBF0CA01" , rorx(rcx, rdx, 1)); - TEST_INSTRUCTION("C4E3FBF08C1A8000000001" , rorx(rcx, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3FBF08C1A8000000001" , rorx(rcx, qword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("9E" , sahf(ah)); TEST_INSTRUCTION("D2E1" , sal(cl, cl)); TEST_INSTRUCTION("D0E1" , sal(cl, 1)); @@ -1369,13 +1029,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("D1BC1180000000" , sar(dword_ptr(rcx, rdx, 0, 128), 1)); TEST_INSTRUCTION("48D3BC1180000000" , sar(qword_ptr(rcx, rdx, 0, 128), cl)); TEST_INSTRUCTION("48D1BC1180000000" , sar(qword_ptr(rcx, rdx, 0, 128), 1)); - TEST_INSTRUCTION("C4E262F7CA" , sarx(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E2E2F7CA" , sarx(rcx, rdx, rbx)); - TEST_INSTRUCTION("C4E2DAF78C1A80000000" , sarx(rcx, ptr(rdx, rbx, 0, 128), rsp)); - TEST_INSTRUCTION("C4E2DAF78C1A80000000" , sarx(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); - TEST_INSTRUCTION("F30F01EA" , saveprevssp()); TEST_INSTRUCTION("80D901" , sbb(cl, 1)); TEST_INSTRUCTION("80DD01" , sbb(ch, 1)); TEST_INSTRUCTION("809C118000000001" , sbb(byte_ptr(rcx, rdx, 0, 128), 1)); @@ -1420,8 +1073,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("AF" , scas(eax, dword_ptr(rdi))); TEST_INSTRUCTION("48AF" , scas(rax, ptr(rdi))); TEST_INSTRUCTION("48AF" , scas(rax, qword_ptr(rdi))); - TEST_INSTRUCTION("F30FC7F1" , senduipi(rcx)); - TEST_INSTRUCTION("0F01E8" , serialize()); TEST_INSTRUCTION("0F97C1" , seta(cl)); TEST_INSTRUCTION("0F97C5" , seta(ch)); TEST_INSTRUCTION("0F97841180000000" , seta(ptr(rcx, rdx, 0, 128))); @@ -1538,12 +1189,10 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("0F98C5" , sets(ch)); TEST_INSTRUCTION("0F98841180000000" , sets(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F98841180000000" , sets(byte_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("F30F01E8" , setssbsy()); TEST_INSTRUCTION("0F94C1" , setz(cl)); TEST_INSTRUCTION("0F94C5" , setz(ch)); TEST_INSTRUCTION("0F94841180000000" , setz(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F94841180000000" , setz(byte_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0FAEF8" , sfence()); TEST_INSTRUCTION("0F01841180000000" , sgdt(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("D2E1" , shl(cl, cl)); TEST_INSTRUCTION("D0E1" , shl(cl, 1)); @@ -1581,12 +1230,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("480FA49C118000000001" , shld(ptr(rcx, rdx, 0, 128), rbx, 1)); TEST_INSTRUCTION("480FA59C1180000000" , shld(qword_ptr(rcx, rdx, 0, 128), rbx, cl)); TEST_INSTRUCTION("480FA49C118000000001" , shld(qword_ptr(rcx, rdx, 0, 128), rbx, 1)); - TEST_INSTRUCTION("C4E261F7CA" , shlx(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E2E1F7CA" , shlx(rcx, rdx, rbx)); - TEST_INSTRUCTION("C4E2D9F78C1A80000000" , shlx(rcx, ptr(rdx, rbx, 0, 128), rsp)); - TEST_INSTRUCTION("C4E2D9F78C1A80000000" , shlx(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); TEST_INSTRUCTION("D2E9" , shr(cl, cl)); TEST_INSTRUCTION("D0E9" , shr(cl, 1)); TEST_INSTRUCTION("D2ED" , shr(ch, cl)); @@ -1623,33 +1266,20 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("480FAC9C118000000001" , shrd(ptr(rcx, rdx, 0, 128), rbx, 1)); TEST_INSTRUCTION("480FAD9C1180000000" , shrd(qword_ptr(rcx, rdx, 0, 128), rbx, cl)); TEST_INSTRUCTION("480FAC9C118000000001" , shrd(qword_ptr(rcx, rdx, 0, 128), rbx, 1)); - TEST_INSTRUCTION("C4E263F7CA" , shrx(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); - TEST_INSTRUCTION("C4E2E3F7CA" , shrx(rcx, rdx, rbx)); - TEST_INSTRUCTION("C4E2DBF78C1A80000000" , shrx(rcx, ptr(rdx, rbx, 0, 128), rsp)); - TEST_INSTRUCTION("C4E2DBF78C1A80000000" , shrx(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); TEST_INSTRUCTION("0F018C1180000000" , sidt(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F01DE" , skinit(eax)); TEST_INSTRUCTION("660F00C1" , sldt(cx)); TEST_INSTRUCTION("0F00C1" , sldt(ecx)); TEST_INSTRUCTION("480F00C1" , sldt(rcx)); TEST_INSTRUCTION("0F00841180000000" , sldt(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F00841180000000" , sldt(word_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("8FE97812C9" , slwpcb(ecx)); - TEST_INSTRUCTION("8FE9F812C9" , slwpcb(rcx)); TEST_INSTRUCTION("660F01E1" , smsw(cx)); TEST_INSTRUCTION("0F01E1" , smsw(ecx)); TEST_INSTRUCTION("480F01E1" , smsw(rcx)); TEST_INSTRUCTION("0F01A41180000000" , smsw(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F01A41180000000" , smsw(word_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F01CB" , stac()); TEST_INSTRUCTION("F9" , stc()); TEST_INSTRUCTION("FD" , std()); - TEST_INSTRUCTION("0F01DC" , stgi()); TEST_INSTRUCTION("FB" , sti()); - TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(dword_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("AA" , stos(ptr(rdi), al)); TEST_INSTRUCTION("AA" , stos(byte_ptr(rdi), al)); TEST_INSTRUCTION("66AB" , stos(ptr(rdi), ax)); @@ -1663,7 +1293,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("480F00C9" , str(rcx)); TEST_INSTRUCTION("0F008C1180000000" , str(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F008C1180000000" , str(word_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("F30F01EF" , stui()); TEST_INSTRUCTION("80E901" , sub(cl, 1)); TEST_INSTRUCTION("80ED01" , sub(ch, 1)); TEST_INSTRUCTION("80AC118000000001" , sub(byte_ptr(rcx, rdx, 0, 128), 1)); @@ -1700,19 +1329,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("2B8C1A80000000" , sub(ecx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("482B8C1A80000000" , sub(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("482B8C1A80000000" , sub(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F01F8" , swapgs()); - TEST_INSTRUCTION("0F05" , syscall()); - TEST_INSTRUCTION("0F34" , sysenter()); - TEST_INSTRUCTION("0F35" , sysexit()); - TEST_INSTRUCTION("480F35" , sysexitq()); - TEST_INSTRUCTION("0F07" , sysret()); - TEST_INSTRUCTION("480F07" , sysretq()); - TEST_INSTRUCTION("8FE97001FA" , t1mskc(ecx, edx)); - TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001FA" , t1mskc(rcx, rdx)); - TEST_INSTRUCTION("8FE9F001BC1A80000000" , t1mskc(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001BC1A80000000" , t1mskc(rcx, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("F6C101" , test(cl, 1)); TEST_INSTRUCTION("F6C501" , test(ch, 1)); TEST_INSTRUCTION("F684118000000001" , test(byte_ptr(rcx, rdx, 0, 128), 1)); @@ -1739,23 +1355,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("85D1" , test(ecx, edx)); TEST_INSTRUCTION("859C1180000000" , test(ptr(rcx, rdx, 0, 128), ebx)); TEST_INSTRUCTION("859C1180000000" , test(dword_ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("F30F01ED" , testui()); - TEST_INSTRUCTION("660FAEF1" , tpause(ecx, edx, eax)); - TEST_INSTRUCTION("66F30FBCCA" , tzcnt(cx, dx)); - TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, word_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30FBCCA" , tzcnt(ecx, edx)); - TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F3480FBCCA" , tzcnt(rcx, rdx)); - TEST_INSTRUCTION("F3480FBC8C1A80000000" , tzcnt(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F3480FBC8C1A80000000" , tzcnt(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001E2" , tzmsk(ecx, edx)); - TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001E2" , tzmsk(rcx, rdx)); - TEST_INSTRUCTION("8FE9F001A41A80000000" , tzmsk(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE9F001A41A80000000" , tzmsk(rcx, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("0FFFCA" , ud0(ecx, edx)); TEST_INSTRUCTION("0FFF8C1A80000000" , ud0(ecx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("0FFF8C1A80000000" , ud0(ecx, dword_ptr(rdx, rbx, 0, 128))); @@ -1764,55 +1363,14 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("0FB98C1A80000000" , ud1(ecx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("0F0B" , ud2()); TEST_INSTRUCTION("F30F01EC" , uiret()); - TEST_INSTRUCTION("F30FAEF1" , umonitor(ptr(rcx))); - TEST_INSTRUCTION("F20FAEF1" , umwait(ecx, edx, eax)); TEST_INSTRUCTION("0F00E1" , verr(cx)); TEST_INSTRUCTION("0F00A41180000000" , verr(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F00A41180000000" , verr(word_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F00E9" , verw(cx)); TEST_INSTRUCTION("0F00AC1180000000" , verw(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F00AC1180000000" , verw(word_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F01C1" , vmcall()); - TEST_INSTRUCTION("660FC7B41180000000" , vmclear(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("660FC7B41180000000" , vmclear(qword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F01D4" , vmfunc()); - TEST_INSTRUCTION("0F01C2" , vmlaunch()); - TEST_INSTRUCTION("0F01DA" , vmload(rax)); - TEST_INSTRUCTION("0F01D9" , vmmcall()); - TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(qword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(qword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("0F78D1" , vmread(rcx, rdx)); - TEST_INSTRUCTION("0F789C1180000000" , vmread(ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("0F789C1180000000" , vmread(qword_ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("0F01C3" , vmresume()); - TEST_INSTRUCTION("0F01D8" , vmrun(rax)); - TEST_INSTRUCTION("0F01DB" , vmsave(rax)); - TEST_INSTRUCTION("0F79CA" , vmwrite(rcx, rdx)); - TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(qword_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("0F09" , wbinvd()); - TEST_INSTRUCTION("F30F09" , wbnoinvd()); - TEST_INSTRUCTION("F30FAED1" , wrfsbase(ecx)); - TEST_INSTRUCTION("F3480FAED1" , wrfsbase(rcx)); - TEST_INSTRUCTION("F30FAED9" , wrgsbase(ecx)); - TEST_INSTRUCTION("F3480FAED9" , wrgsbase(rcx)); TEST_INSTRUCTION("0F30" , wrmsr(edx, eax, ecx)); - TEST_INSTRUCTION("0F38F6D1" , wrssd(ecx, edx)); - TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(dword_ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("480F38F6D1" , wrssq(rcx, rdx)); - TEST_INSTRUCTION("480F38F69C1180000000" , wrssq(ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("480F38F69C1180000000" , wrssq(qword_ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("660F38F5D1" , wrussd(ecx, edx)); - TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(dword_ptr(rcx, rdx, 0, 128), ebx)); - TEST_INSTRUCTION("66480F38F5D1" , wrussq(rcx, rdx)); - TEST_INSTRUCTION("66480F38F59C1180000000" , wrussq(ptr(rcx, rdx, 0, 128), rbx)); - TEST_INSTRUCTION("66480F38F59C1180000000" , wrussq(qword_ptr(rcx, rdx, 0, 128), rbx)); TEST_INSTRUCTION("C6F801" , xabort(1)); TEST_INSTRUCTION("0FC0D1" , xadd(cl, dl)); TEST_INSTRUCTION("0FC0F1" , xadd(cl, dh)); @@ -1858,8 +1416,6 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("878C1A80000000" , xchg(ecx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("48878C1A80000000" , xchg(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("48878C1A80000000" , xchg(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F01D5" , xend()); - TEST_INSTRUCTION("0F01D0" , xgetbv(edx, eax, ecx)); TEST_INSTRUCTION("D7" , xlatb()); TEST_INSTRUCTION("80F101" , xor_(cl, 1)); TEST_INSTRUCTION("80F501" , xor_(ch, 1)); @@ -1897,75 +1453,530 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester TEST_INSTRUCTION("338C1A80000000" , xor_(ecx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("48338C1A80000000" , xor_(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("48338C1A80000000" , xor_(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20F01E9" , xresldtrk()); - TEST_INSTRUCTION("0FAEAC1180000000" , xrstor(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("480FAEAC1180000000" , xrstor64(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FC79C1180000000" , xrstors(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("480FC79C1180000000" , xrstors64(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FAEA41180000000" , xsave(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("480FAEA41180000000" , xsave64(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FC7A41180000000" , xsavec(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("480FC7A41180000000" , xsavec64(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FAEB41180000000" , xsaveopt(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("480FAEB41180000000" , xsaveopt64(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FC7AC1180000000" , xsaves(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("480FC7AC1180000000" , xsaves64(ptr(rcx, rdx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0F01D1" , xsetbv(edx, eax, ecx)); - TEST_INSTRUCTION("F20F01E8" , xsusldtrk()); - TEST_INSTRUCTION("0F01D6" , xtest()); } -static void ASMJIT_NOINLINE testX64AssemblerMMX_SSE(AssemblerTester& tester) noexcept { +static void ASMJIT_NOINLINE testX64AssemblerBaseExt(AssemblerTester& tester) noexcept { using namespace x86; - TEST_INSTRUCTION("660F58CA" , addpd(xmm1, xmm2)); - TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F58CA" , addps(xmm1, xmm2)); - TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20F58CA" , addsd(xmm1, xmm2)); - TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30F58CA" , addss(xmm1, xmm2)); - TEST_INSTRUCTION("F30F588C1A80000000" , addss(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F30F588C1A80000000" , addss(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660FD0CA" , addsubpd(xmm1, xmm2)); - TEST_INSTRUCTION("660FD08C1A80000000" , addsubpd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660FD08C1A80000000" , addsubpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20FD0CA" , addsubps(xmm1, xmm2)); - TEST_INSTRUCTION("F20FD08C1A80000000" , addsubps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("F20FD08C1A80000000" , addsubps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DECA" , aesdec(xmm1, xmm2)); - TEST_INSTRUCTION("660F38DE8C1A80000000" , aesdec(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DE8C1A80000000" , aesdec(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DFCA" , aesdeclast(xmm1, xmm2)); - TEST_INSTRUCTION("660F38DF8C1A80000000" , aesdeclast(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DF8C1A80000000" , aesdeclast(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DCCA" , aesenc(xmm1, xmm2)); - TEST_INSTRUCTION("660F38DC8C1A80000000" , aesenc(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DC8C1A80000000" , aesenc(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DDCA" , aesenclast(xmm1, xmm2)); - TEST_INSTRUCTION("660F38DD8C1A80000000" , aesenclast(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DD8C1A80000000" , aesenclast(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DBCA" , aesimc(xmm1, xmm2)); - TEST_INSTRUCTION("660F38DB8C1A80000000" , aesimc(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F38DB8C1A80000000" , aesimc(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F3ADFCA01" , aeskeygenassist(xmm1, xmm2, 1)); - TEST_INSTRUCTION("660F3ADF8C1A8000000001" , aeskeygenassist(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("660F3ADF8C1A8000000001" , aeskeygenassist(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("660F55CA" , andnpd(xmm1, xmm2)); - TEST_INSTRUCTION("660F558C1A80000000" , andnpd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F558C1A80000000" , andnpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F55CA" , andnps(xmm1, xmm2)); - TEST_INSTRUCTION("0F558C1A80000000" , andnps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F558C1A80000000" , andnps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F54CA" , andpd(xmm1, xmm2)); - TEST_INSTRUCTION("660F548C1A80000000" , andpd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("660F548C1A80000000" , andpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F54CA" , andps(xmm1, xmm2)); - TEST_INSTRUCTION("0F548C1A80000000" , andps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("0F548C1A80000000" , andps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F38FC9C1180000000" , aadd(ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("0F38FC9C1180000000" , aadd(dword_ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("480F38FC9C1180000000" , aadd(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("480F38FC9C1180000000" , aadd(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("660F38FC9C1180000000" , aand(ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("660F38FC9C1180000000" , aand(dword_ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("66480F38FC9C1180000000" , aand(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("66480F38FC9C1180000000" , aand(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("660F38F6CA" , adcx(ecx, edx)); + TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("66480F38F6CA" , adcx(rcx, rdx)); + TEST_INSTRUCTION("66480F38F68C1A80000000" , adcx(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("66480F38F68C1A80000000" , adcx(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F38F6CA" , adox(ecx, edx)); + TEST_INSTRUCTION("F30F38F68C1A80000000" , adox(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F38F68C1A80000000" , adox(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F3480F38F6CA" , adox(rcx, rdx)); + TEST_INSTRUCTION("F3480F38F68C1A80000000" , adox(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F3480F38F68C1A80000000" , adox(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E268F2CB" , andn(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E8F2CB" , andn(rcx, rdx, rbx)); + TEST_INSTRUCTION("C4E2E8F28C2B80000000" , andn(rcx, rdx, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E8F28C2B80000000" , andn(rcx, rdx, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("F20F38FC9C1180000000" , aor(ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("F20F38FC9C1180000000" , aor(dword_ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("F2480F38FC9C1180000000" , aor(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("F2480F38FC9C1180000000" , aor(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("F30F38FC9C1180000000" , axor(ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("F30F38FC9C1180000000" , axor(dword_ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("F3480F38FC9C1180000000" , axor(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("F3480F38FC9C1180000000" , axor(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("C4E260F7CA" , bextr(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E2E0F7CA" , bextr(rcx, rdx, rbx)); + TEST_INSTRUCTION("C4E2D8F78C1A80000000" , bextr(rcx, ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("C4E2D8F78C1A80000000" , bextr(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("8FE97001CA" , blcfill(ecx, edx)); + TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001CA" , blcfill(rcx, rdx)); + TEST_INSTRUCTION("8FE9F0018C1A80000000" , blcfill(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F0018C1A80000000" , blcfill(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97002F2" , blci(ecx, edx)); + TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F002F2" , blci(rcx, rdx)); + TEST_INSTRUCTION("8FE9F002B41A80000000" , blci(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F002B41A80000000" , blci(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001EA" , blcic(ecx, edx)); + TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001EA" , blcic(rcx, rdx)); + TEST_INSTRUCTION("8FE9F001AC1A80000000" , blcic(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001AC1A80000000" , blcic(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97002CA" , blcmsk(ecx, edx)); + TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F002CA" , blcmsk(rcx, rdx)); + TEST_INSTRUCTION("8FE9F0028C1A80000000" , blcmsk(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F0028C1A80000000" , blcmsk(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001DA" , blcs(ecx, edx)); + TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001DA" , blcs(rcx, rdx)); + TEST_INSTRUCTION("8FE9F0019C1A80000000" , blcs(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F0019C1A80000000" , blcs(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001D2" , blsfill(ecx, edx)); + TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001D2" , blsfill(rcx, rdx)); + TEST_INSTRUCTION("8FE9F001941A80000000" , blsfill(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001941A80000000" , blsfill(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E270F3DA" , blsi(ecx, edx)); + TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2F0F3DA" , blsi(rcx, rdx)); + TEST_INSTRUCTION("C4E2F0F39C1A80000000" , blsi(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2F0F39C1A80000000" , blsi(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001F2" , blsic(ecx, edx)); + TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001F2" , blsic(rcx, rdx)); + TEST_INSTRUCTION("8FE9F001B41A80000000" , blsic(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001B41A80000000" , blsic(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E270F3D2" , blsmsk(ecx, edx)); + TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2F0F3D2" , blsmsk(rcx, rdx)); + TEST_INSTRUCTION("C4E2F0F3941A80000000" , blsmsk(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2F0F3941A80000000" , blsmsk(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E270F3CA" , blsr(ecx, edx)); + TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2F0F3CA" , blsr(rcx, rdx)); + TEST_INSTRUCTION("C4E2F0F38C1A80000000" , blsr(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2F0F38C1A80000000" , blsr(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F1ACA" , bndcl(bnd1, rdx)); + TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F20F1BCA" , bndcn(bnd1, rdx)); + TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F20F1ACA" , bndcu(bnd1, rdx)); + TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F1A8C1A80000000" , bndldx(bnd1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F1B8C1A80000000" , bndmk(bnd1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F1ACA" , bndmov(bnd1, bnd2)); + TEST_INSTRUCTION("660F1A8C1A80000000" , bndmov(bnd1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F1B9C1180000000" , bndmov(ptr(rcx, rdx, 0, 128), bnd3)); + TEST_INSTRUCTION("0F1B9C1180000000" , bndstx(ptr(rcx, rdx, 0, 128), bnd3)); + TEST_INSTRUCTION("C4E260F5CA" , bzhi(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E2E0F5CA" , bzhi(rcx, rdx, rbx)); + TEST_INSTRUCTION("C4E2D8F58C1A80000000" , bzhi(rcx, ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("C4E2D8F58C1A80000000" , bzhi(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("0F01CA" , clac()); + TEST_INSTRUCTION("0F1C841180000000" , cldemote(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0FAEBC1180000000" , clflush(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("660FAEBC1180000000" , clflushopt(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F01DD" , clgi()); + TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(qword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F06" , clts()); + TEST_INSTRUCTION("F30F01EE" , clui()); + TEST_INSTRUCTION("660FAEB41180000000" , clwb(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F01FC" , clzero(ptr(rax))); + TEST_INSTRUCTION("0F01FC" , clzero(zmmword_ptr(rax))); + TEST_INSTRUCTION("C4E259E69C1180000000" , cmpbexadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E69C1180000000" , cmpbexadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9E69C1180000000" , cmpbexadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9E69C1180000000" , cmpbexadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259E29C1180000000" , cmpbxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E29C1180000000" , cmpbxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9E29C1180000000" , cmpbxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9E29C1180000000" , cmpbxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259EE9C1180000000" , cmplexadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EE9C1180000000" , cmplexadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9EE9C1180000000" , cmplexadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9EE9C1180000000" , cmplexadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259EC9C1180000000" , cmplxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EC9C1180000000" , cmplxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9EC9C1180000000" , cmplxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9EC9C1180000000" , cmplxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259E79C1180000000" , cmpnbexadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E79C1180000000" , cmpnbexadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9E79C1180000000" , cmpnbexadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9E79C1180000000" , cmpnbexadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259E39C1180000000" , cmpnbxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E39C1180000000" , cmpnbxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9E39C1180000000" , cmpnbxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9E39C1180000000" , cmpnbxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259EF9C1180000000" , cmpnlexadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EF9C1180000000" , cmpnlexadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9EF9C1180000000" , cmpnlexadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9EF9C1180000000" , cmpnlexadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259ED9C1180000000" , cmpnlxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259ED9C1180000000" , cmpnlxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9ED9C1180000000" , cmpnlxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9ED9C1180000000" , cmpnlxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259E19C1180000000" , cmpnoxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E19C1180000000" , cmpnoxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9E19C1180000000" , cmpnoxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9E19C1180000000" , cmpnoxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259EB9C1180000000" , cmpnpxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EB9C1180000000" , cmpnpxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9EB9C1180000000" , cmpnpxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9EB9C1180000000" , cmpnpxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259E99C1180000000" , cmpnsxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E99C1180000000" , cmpnsxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9E99C1180000000" , cmpnsxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9E99C1180000000" , cmpnsxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259E59C1180000000" , cmpnzxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E59C1180000000" , cmpnzxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9E59C1180000000" , cmpnzxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9E59C1180000000" , cmpnzxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259E09C1180000000" , cmpoxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E09C1180000000" , cmpoxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9E09C1180000000" , cmpoxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9E09C1180000000" , cmpoxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259EA9C1180000000" , cmppxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EA9C1180000000" , cmppxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9EA9C1180000000" , cmppxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9EA9C1180000000" , cmppxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E259E89C1180000000" , cmpsxadd(ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E89C1180000000" , cmpsxadd(dword_ptr(rcx, rdx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E2D9E89C1180000000" , cmpsxadd(ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("C4E2D9E89C1180000000" , cmpsxadd(qword_ptr(rcx, rdx, 0, 128), rbx, rsp)); + TEST_INSTRUCTION("F20F38F0CA" , crc32(ecx, dl)); + TEST_INSTRUCTION("F20F38F0CE" , crc32(ecx, dh)); + TEST_INSTRUCTION("66F20F38F1CA" , crc32(ecx, dx)); + TEST_INSTRUCTION("F20F38F1CA" , crc32(ecx, edx)); + TEST_INSTRUCTION("F20F38F08C1A80000000" , crc32(ecx, byte_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("66F20F38F18C1A80000000" , crc32(ecx, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F20F38F18C1A80000000" , crc32(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F2480F38F0CA" , crc32(rcx, dl)); + TEST_INSTRUCTION("F2480F38F1CA" , crc32(rcx, rdx)); + TEST_INSTRUCTION("F2480F38F08C1A80000000" , crc32(rcx, byte_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F2480F38F18C1A80000000" , crc32(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F1EFB" , endbr32()); + TEST_INSTRUCTION("F30F1EFA" , endbr64()); + TEST_INSTRUCTION("F20F38F88C1A80000000" , enqcmd(zmmword_ptr(rcx), zmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F38F88C1A80000000" , enqcmds(zmmword_ptr(rcx), zmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0FAE8C1180000000" , fxrstor(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("480FAE8C1180000000" , fxrstor64(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0FAE841180000000" , fxsave(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("480FAE841180000000" , fxsave64(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("D9F4" , fxtract()); + TEST_INSTRUCTION("0F37" , getsec()); + TEST_INSTRUCTION("F30F3AF0C001" , hreset(1, eax)); + TEST_INSTRUCTION("F30FAEE9" , incsspd(ecx)); + TEST_INSTRUCTION("F3480FAEE9" , incsspq(rcx)); + TEST_INSTRUCTION("660F38808C1A80000000" , invept(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38808C1A80000000" , invept(rcx, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("670F01DF" , invlpga(eax, ecx)); + TEST_INSTRUCTION("0F01DF" , invlpga(rax, ecx)); + TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(rcx, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(dword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0FAEE8" , lfence()); + TEST_INSTRUCTION("8FE97812C1" , llwpcb(ecx)); + TEST_INSTRUCTION("8FE9F812C1" , llwpcb(rcx)); + TEST_INSTRUCTION("8FEA7012C201000000" , lwpins(ecx, edx, 1)); + TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, dword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FEAF012C201000000" , lwpins(rcx, edx, 1)); + TEST_INSTRUCTION("8FEAF012841A8000000001000000" , lwpins(rcx, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FEAF012841A8000000001000000" , lwpins(rcx, dword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FEA7012CA01000000" , lwpval(ecx, edx, 1)); + TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, dword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FEAF012CA01000000" , lwpval(rcx, edx, 1)); + TEST_INSTRUCTION("8FEAF0128C1A8000000001000000" , lwpval(rcx, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FEAF0128C1A8000000001000000" , lwpval(rcx, dword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("66F30FBDCA" , lzcnt(cx, dx)); + TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30FBDCA" , lzcnt(ecx, edx)); + TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F3480FBDCA" , lzcnt(rcx, rdx)); + TEST_INSTRUCTION("F3480FBD8C1A80000000" , lzcnt(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F3480FBD8C1A80000000" , lzcnt(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F01FA" , mcommit()); + TEST_INSTRUCTION("0FAEF0" , mfence()); + TEST_INSTRUCTION("0F01C8" , monitor(ptr(rax), ecx, edx)); + TEST_INSTRUCTION("0F01FA" , monitorx(ptr(rax), ecx, edx)); + TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("480F38F08C1A80000000" , movbe(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("480F38F08C1A80000000" , movbe(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38F19C1180000000" , movbe(ptr(rcx, rdx, 0, 128), bx)); + TEST_INSTRUCTION("660F38F19C1180000000" , movbe(word_ptr(rcx, rdx, 0, 128), bx)); + TEST_INSTRUCTION("0F38F19C1180000000" , movbe(ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("0F38F19C1180000000" , movbe(dword_ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("480F38F19C1180000000" , movbe(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("480F38F19C1180000000" , movbe(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("660F38F88C1A80000000" , movdir64b(zmmword_ptr(rcx), zmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(dword_ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("480F38F99C1180000000" , movdiri(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("480F38F99C1180000000" , movdiri(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("0FC39C1180000000" , movnti(ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("0FC39C1180000000" , movnti(dword_ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("480FC39C1180000000" , movnti(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("480FC39C1180000000" , movnti(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("C4E26BF6CB" , mulx(ecx, edx, ebx, edx)); + TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, ptr(rbx, rbp, 0, 128), edx)); + TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, dword_ptr(rbx, rbp, 0, 128), edx)); + TEST_INSTRUCTION("C4E2EBF6CB" , mulx(rcx, rdx, rbx, rdx)); + TEST_INSTRUCTION("C4E2EBF68C2B80000000" , mulx(rcx, rdx, ptr(rbx, rbp, 0, 128), rdx)); + TEST_INSTRUCTION("C4E2EBF68C2B80000000" , mulx(rcx, rdx, qword_ptr(rbx, rbp, 0, 128), rdx)); + TEST_INSTRUCTION("0F01C9" , mwait(eax, ecx)); + TEST_INSTRUCTION("0F01FB" , mwaitx(eax, ecx, ebx)); + TEST_INSTRUCTION("0F01C5" , pconfig()); + TEST_INSTRUCTION("C4E26BF5CB" , pdep(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EBF5CB" , pdep(rcx, rdx, rbx)); + TEST_INSTRUCTION("C4E2EBF58C2B80000000" , pdep(rcx, rdx, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EBF58C2B80000000" , pdep(rcx, rdx, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26AF5CB" , pext(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EAF5CB" , pext(rcx, rdx, rbx)); + TEST_INSTRUCTION("C4E2EAF58C2B80000000" , pext(rcx, rdx, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EAF58C2B80000000" , pext(rcx, rdx, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("66F30FB8CA" , popcnt(cx, dx)); + TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30FB8CA" , popcnt(ecx, edx)); + TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F3480FB8CA" , popcnt(rcx, rdx)); + TEST_INSTRUCTION("F3480FB88C1A80000000" , popcnt(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F3480FB88C1A80000000" , popcnt(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F0D841180000000" , prefetch(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F18BC1180000000" , prefetchit0(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F18B41180000000" , prefetchit1(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F18841180000000" , prefetchnta(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F188C1180000000" , prefetcht0(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F18941180000000" , prefetcht1(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F189C1180000000" , prefetcht2(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F0D8C1180000000" , prefetchw(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F0D941180000000" , prefetchwt1(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("F30F01FF" , psmash()); + TEST_INSTRUCTION("F30FAEE1" , ptwrite(ecx)); + TEST_INSTRUCTION("F3480FAEE1" , ptwrite(rcx)); + TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(dword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("F3480FAEA41180000000" , ptwrite(qword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("F20F01FF" , pvalidate()); + TEST_INSTRUCTION("F30FAEC1" , rdfsbase(ecx)); + TEST_INSTRUCTION("F3480FAEC1" , rdfsbase(rcx)); + TEST_INSTRUCTION("F30FAEC9" , rdgsbase(ecx)); + TEST_INSTRUCTION("F3480FAEC9" , rdgsbase(rcx)); + TEST_INSTRUCTION("F30FC7F9" , rdpid(rcx)); + TEST_INSTRUCTION("0F01EE" , rdpkru(edx, eax, ecx)); + TEST_INSTRUCTION("0F33" , rdpmc(edx, eax, ecx)); + TEST_INSTRUCTION("0F01FD" , rdpru(edx, eax, ecx)); + TEST_INSTRUCTION("660FC7F1" , rdrand(cx)); + TEST_INSTRUCTION("0FC7F1" , rdrand(ecx)); + TEST_INSTRUCTION("480FC7F1" , rdrand(rcx)); + TEST_INSTRUCTION("660FC7F9" , rdseed(cx)); + TEST_INSTRUCTION("0FC7F9" , rdseed(ecx)); + TEST_INSTRUCTION("480FC7F9" , rdseed(rcx)); + TEST_INSTRUCTION("F30F1EC9" , rdsspd(ecx)); + TEST_INSTRUCTION("F3480F1EC9" , rdsspq(rcx)); + TEST_INSTRUCTION("0F31" , rdtsc(edx, eax)); + TEST_INSTRUCTION("0F01F9" , rdtscp(edx, eax, ecx)); + TEST_INSTRUCTION("F30F01FE" , rmpadjust()); + TEST_INSTRUCTION("F20F01FE" , rmpupdate()); + TEST_INSTRUCTION("C4E37BF0CA01" , rorx(ecx, edx, 1)); + TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, dword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3FBF0CA01" , rorx(rcx, rdx, 1)); + TEST_INSTRUCTION("C4E3FBF08C1A8000000001" , rorx(rcx, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3FBF08C1A8000000001" , rorx(rcx, qword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E262F7CA" , sarx(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E2E2F7CA" , sarx(rcx, rdx, rbx)); + TEST_INSTRUCTION("C4E2DAF78C1A80000000" , sarx(rcx, ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("C4E2DAF78C1A80000000" , sarx(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("F30F01EA" , saveprevssp()); + TEST_INSTRUCTION("F30FC7F1" , senduipi(rcx)); + TEST_INSTRUCTION("0F01E8" , serialize()); + TEST_INSTRUCTION("F30F01E8" , setssbsy()); + TEST_INSTRUCTION("0FAEF8" , sfence()); + TEST_INSTRUCTION("C4E261F7CA" , shlx(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E2E1F7CA" , shlx(rcx, rdx, rbx)); + TEST_INSTRUCTION("C4E2D9F78C1A80000000" , shlx(rcx, ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("C4E2D9F78C1A80000000" , shlx(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("C4E263F7CA" , shrx(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, dword_ptr(rdx, rbx, 0, 128), esp)); + TEST_INSTRUCTION("C4E2E3F7CA" , shrx(rcx, rdx, rbx)); + TEST_INSTRUCTION("C4E2DBF78C1A80000000" , shrx(rcx, ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("C4E2DBF78C1A80000000" , shrx(rcx, qword_ptr(rdx, rbx, 0, 128), rsp)); + TEST_INSTRUCTION("0F01DE" , skinit(eax)); + TEST_INSTRUCTION("8FE97812C9" , slwpcb(ecx)); + TEST_INSTRUCTION("8FE9F812C9" , slwpcb(rcx)); + TEST_INSTRUCTION("0F01CB" , stac()); + TEST_INSTRUCTION("0F01DC" , stgi()); + TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(dword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("F30F01EF" , stui()); + TEST_INSTRUCTION("0F01F8" , swapgs()); + TEST_INSTRUCTION("0F05" , syscall()); + TEST_INSTRUCTION("0F34" , sysenter()); + TEST_INSTRUCTION("0F35" , sysexit()); + TEST_INSTRUCTION("480F35" , sysexitq()); + TEST_INSTRUCTION("0F07" , sysret()); + TEST_INSTRUCTION("480F07" , sysretq()); + TEST_INSTRUCTION("8FE97001FA" , t1mskc(ecx, edx)); + TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001FA" , t1mskc(rcx, rdx)); + TEST_INSTRUCTION("8FE9F001BC1A80000000" , t1mskc(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001BC1A80000000" , t1mskc(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F01ED" , testui()); + TEST_INSTRUCTION("660FAEF1" , tpause(ecx, edx, eax)); + TEST_INSTRUCTION("66F30FBCCA" , tzcnt(cx, dx)); + TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30FBCCA" , tzcnt(ecx, edx)); + TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F3480FBCCA" , tzcnt(rcx, rdx)); + TEST_INSTRUCTION("F3480FBC8C1A80000000" , tzcnt(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F3480FBC8C1A80000000" , tzcnt(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001E2" , tzmsk(ecx, edx)); + TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001E2" , tzmsk(rcx, rdx)); + TEST_INSTRUCTION("8FE9F001A41A80000000" , tzmsk(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE9F001A41A80000000" , tzmsk(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30FAEF1" , umonitor(ptr(rcx))); + TEST_INSTRUCTION("F20FAEF1" , umwait(ecx, edx, eax)); + TEST_INSTRUCTION("0F01C1" , vmcall()); + TEST_INSTRUCTION("660FC7B41180000000" , vmclear(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("660FC7B41180000000" , vmclear(qword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F01D4" , vmfunc()); + TEST_INSTRUCTION("0F01C2" , vmlaunch()); + TEST_INSTRUCTION("0F01DA" , vmload(rax)); + TEST_INSTRUCTION("0F01D9" , vmmcall()); + TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(qword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(qword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("0F78D1" , vmread(rcx, rdx)); + TEST_INSTRUCTION("0F789C1180000000" , vmread(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("0F789C1180000000" , vmread(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("0F01C3" , vmresume()); + TEST_INSTRUCTION("0F01D8" , vmrun(rax)); + TEST_INSTRUCTION("0F01DB" , vmsave(rax)); + TEST_INSTRUCTION("0F79CA" , vmwrite(rcx, rdx)); + TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(qword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("F30F09" , wbnoinvd()); + TEST_INSTRUCTION("F30FAED1" , wrfsbase(ecx)); + TEST_INSTRUCTION("F3480FAED1" , wrfsbase(rcx)); + TEST_INSTRUCTION("F30FAED9" , wrgsbase(ecx)); + TEST_INSTRUCTION("F3480FAED9" , wrgsbase(rcx)); + TEST_INSTRUCTION("0F38F6D1" , wrssd(ecx, edx)); + TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(dword_ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("480F38F6D1" , wrssq(rcx, rdx)); + TEST_INSTRUCTION("480F38F69C1180000000" , wrssq(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("480F38F69C1180000000" , wrssq(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("660F38F5D1" , wrussd(ecx, edx)); + TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(dword_ptr(rcx, rdx, 0, 128), ebx)); + TEST_INSTRUCTION("66480F38F5D1" , wrussq(rcx, rdx)); + TEST_INSTRUCTION("66480F38F59C1180000000" , wrussq(ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("66480F38F59C1180000000" , wrussq(qword_ptr(rcx, rdx, 0, 128), rbx)); + TEST_INSTRUCTION("0F01D5" , xend()); + TEST_INSTRUCTION("0F01D0" , xgetbv(edx, eax, ecx)); + TEST_INSTRUCTION("F20F01E9" , xresldtrk()); + TEST_INSTRUCTION("0FAEAC1180000000" , xrstor(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("480FAEAC1180000000" , xrstor64(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FC79C1180000000" , xrstors(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("480FC79C1180000000" , xrstors64(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FAEA41180000000" , xsave(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("480FAEA41180000000" , xsave64(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FC7A41180000000" , xsavec(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("480FC7A41180000000" , xsavec64(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FAEB41180000000" , xsaveopt(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("480FAEB41180000000" , xsaveopt64(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FC7AC1180000000" , xsaves(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("480FC7AC1180000000" , xsaves64(ptr(rcx, rdx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0F01D1" , xsetbv(edx, eax, ecx)); + TEST_INSTRUCTION("F20F01E8" , xsusldtrk()); + TEST_INSTRUCTION("0F01D6" , xtest()); +} + +static void ASMJIT_NOINLINE testX64AssemblerMMX_SSE(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("660F58CA" , addpd(xmm1, xmm2)); + TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F58CA" , addps(xmm1, xmm2)); + TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F20F58CA" , addsd(xmm1, xmm2)); + TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F58CA" , addss(xmm1, xmm2)); + TEST_INSTRUCTION("F30F588C1A80000000" , addss(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F30F588C1A80000000" , addss(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660FD0CA" , addsubpd(xmm1, xmm2)); + TEST_INSTRUCTION("660FD08C1A80000000" , addsubpd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660FD08C1A80000000" , addsubpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F20FD0CA" , addsubps(xmm1, xmm2)); + TEST_INSTRUCTION("F20FD08C1A80000000" , addsubps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("F20FD08C1A80000000" , addsubps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DECA" , aesdec(xmm1, xmm2)); + TEST_INSTRUCTION("660F38DE8C1A80000000" , aesdec(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DE8C1A80000000" , aesdec(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DFCA" , aesdeclast(xmm1, xmm2)); + TEST_INSTRUCTION("660F38DF8C1A80000000" , aesdeclast(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DF8C1A80000000" , aesdeclast(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DCCA" , aesenc(xmm1, xmm2)); + TEST_INSTRUCTION("660F38DC8C1A80000000" , aesenc(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DC8C1A80000000" , aesenc(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DDCA" , aesenclast(xmm1, xmm2)); + TEST_INSTRUCTION("660F38DD8C1A80000000" , aesenclast(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DD8C1A80000000" , aesenclast(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DBCA" , aesimc(xmm1, xmm2)); + TEST_INSTRUCTION("660F38DB8C1A80000000" , aesimc(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F38DB8C1A80000000" , aesimc(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F3ADFCA01" , aeskeygenassist(xmm1, xmm2, 1)); + TEST_INSTRUCTION("660F3ADF8C1A8000000001" , aeskeygenassist(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("660F3ADF8C1A8000000001" , aeskeygenassist(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("660F55CA" , andnpd(xmm1, xmm2)); + TEST_INSTRUCTION("660F558C1A80000000" , andnpd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F558C1A80000000" , andnpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F55CA" , andnps(xmm1, xmm2)); + TEST_INSTRUCTION("0F558C1A80000000" , andnps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F558C1A80000000" , andnps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F54CA" , andpd(xmm1, xmm2)); + TEST_INSTRUCTION("660F548C1A80000000" , andpd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("660F548C1A80000000" , andpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F54CA" , andps(xmm1, xmm2)); + TEST_INSTRUCTION("0F548C1A80000000" , andps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("0F548C1A80000000" , andps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("660F3A0DCA01" , blendpd(xmm1, xmm2, 1)); TEST_INSTRUCTION("660F3A0D8C1A8000000001" , blendpd(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("660F3A0D8C1A8000000001" , blendpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); @@ -3065,9 +3076,2473 @@ static void ASMJIT_NOINLINE testX64AssemblerMMX_SSE(AssemblerTester& tester) noexcept { +static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C5E958CB" , vaddpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED58CB" , vaddpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E858CB" , vaddps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC58CB" , vaddps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB58CB" , vaddsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA58CB" , vaddss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D0CB" , vaddsubpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD0CB" , vaddsubpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EBD0CB" , vaddsubps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EFD0CB" , vaddsubps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DECB" , vaesdec(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DDECB" , vaesdec(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DFCB" , vaesdeclast(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DDFCB" , vaesdeclast(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DCCB" , vaesenc(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DDCCB" , vaesenc(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DDCB" , vaesenclast(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DDDCB" , vaesenclast(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E279DBCA" , vaesimc(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E379DFCA01" , vaeskeygenassist(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5E955CB" , vandnpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED55CB" , vandnpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E855CB" , vandnps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC55CB" , vandnps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E954CB" , vandpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED54CB" , vandpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E854CB" , vandps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC54CB" , vandps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E3690DCB01" , vblendpd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0DCB01" , vblendpd(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690CCB01" , vblendps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0CCB01" , vblendps(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3694BCB40" , vblendvpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E36D4BCB40" , vblendvpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3694ACB40" , vblendvps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E36D4ACB40" , vblendvps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D19CA" , vbroadcastsd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27918CA" , vbroadcastss(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D18CA" , vbroadcastss(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5E9C2CB01" , vcmppd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5EDC2CB01" , vcmppd(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E8C2CB01" , vcmpps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5ECC2CB01" , vcmpps(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5EBC2CB01" , vcmpsd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5EAC2CB01" , vcmpss(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5F92FCA" , vcomisd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F82FCA" , vcomiss(xmm1, xmm2)); + TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FAE6CA" , vcvtdq2pd(xmm1, xmm2)); + TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FEE6CA" , vcvtdq2pd(ymm1, xmm2)); + TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F85BCA" , vcvtdq2ps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC5BCA" , vcvtdq2ps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FBE6CA" , vcvtpd2dq(xmm1, xmm2)); + TEST_INSTRUCTION("C5FFE6CA" , vcvtpd2dq(xmm1, ymm2)); + TEST_INSTRUCTION("C5FBE68C1A80000000" , vcvtpd2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FFE68C1A80000000" , vcvtpd2dq(xmm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F95ACA" , vcvtpd2ps(xmm1, xmm2)); + TEST_INSTRUCTION("C5FD5ACA" , vcvtpd2ps(xmm1, ymm2)); + TEST_INSTRUCTION("C5F95A8C1A80000000" , vcvtpd2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD5A8C1A80000000" , vcvtpd2ps(xmm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27913CA" , vcvtph2ps(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D13CA" , vcvtph2ps(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F95BCA" , vcvtps2dq(xmm1, xmm2)); + TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD5BCA" , vcvtps2dq(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F85ACA" , vcvtps2pd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC5ACA" , vcvtps2pd(ymm1, xmm2)); + TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E3791DD101" , vcvtps2ph(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(qword_ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E37D1DD101" , vcvtps2ph(xmm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(ptr(rcx, rdx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C5FB2DCA" , vcvtsd2si(ecx, xmm2)); + TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1FB2DCA" , vcvtsd2si(rcx, xmm2)); + TEST_INSTRUCTION("C4E1FB2D8C1A80000000" , vcvtsd2si(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1FB2D8C1A80000000" , vcvtsd2si(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5EB5ACB" , vcvtsd2ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB2ACB" , vcvtsi2sd(xmm1, xmm2, ebx)); + TEST_INSTRUCTION("C4E1EB2ACB" , vcvtsi2sd(xmm1, xmm2, rbx)); + TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E1EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA2ACB" , vcvtsi2ss(xmm1, xmm2, ebx)); + TEST_INSTRUCTION("C4E1EA2ACB" , vcvtsi2ss(xmm1, xmm2, rbx)); + TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E1EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5ACB" , vcvtss2sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5FA2DCA" , vcvtss2si(ecx, xmm2)); + TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1FA2DCA" , vcvtss2si(rcx, xmm2)); + TEST_INSTRUCTION("C4E1FA2D8C1A80000000" , vcvtss2si(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1FA2D8C1A80000000" , vcvtss2si(rcx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F9E6CA" , vcvttpd2dq(xmm1, xmm2)); + TEST_INSTRUCTION("C5FDE6CA" , vcvttpd2dq(xmm1, ymm2)); + TEST_INSTRUCTION("C5F9E68C1A80000000" , vcvttpd2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FDE68C1A80000000" , vcvttpd2dq(xmm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA5BCA" , vcvttps2dq(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FE5BCA" , vcvttps2dq(ymm1, ymm2)); + TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FB2CCA" , vcvttsd2si(ecx, xmm2)); + TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1FB2CCA" , vcvttsd2si(rcx, xmm2)); + TEST_INSTRUCTION("C4E1FB2C8C1A80000000" , vcvttsd2si(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1FB2C8C1A80000000" , vcvttsd2si(rcx, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA2CCA" , vcvttss2si(ecx, xmm2)); + TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1FA2CCA" , vcvttss2si(rcx, xmm2)); + TEST_INSTRUCTION("C4E1FA2C8C1A80000000" , vcvttss2si(rcx, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1FA2C8C1A80000000" , vcvttss2si(rcx, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5E95ECB" , vdivpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED5ECB" , vdivpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E85ECB" , vdivps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC5ECB" , vdivps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB5ECB" , vdivsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5ECB" , vdivss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E36941CB01" , vdppd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36940CB01" , vdpps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D40CB01" , vdpps(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D19D101" , vextractf128(xmm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(ptr(rcx, rdx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37D39D101" , vextracti128(xmm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(ptr(rcx, rdx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37917D101" , vextractps(ecx, xmm2, 1)); + TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(dword_ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E2D9928C1A80000000" , vgatherdpd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2DD928C1A80000000" , vgatherdpd(ymm1, ptr(rdx, xmm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E259928C1A80000000" , vgatherdps(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E25D928C1A80000000" , vgatherdps(ymm1, ptr(rdx, ymm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E2D9938C1A80000000" , vgatherqpd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2DD938C1A80000000" , vgatherqpd(ymm1, ptr(rdx, ymm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E259938C1A80000000" , vgatherqps(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E25D938C1A80000000" , vgatherqps(xmm1, ptr(rdx, ymm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E3E9CFCB01" , vgf2p8affineinvqb(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3EDCFCB01" , vgf2p8affineinvqb(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9CECB01" , vgf2p8affineqb(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3EDCECB01" , vgf2p8affineqb(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E269CFCB" , vgf2p8mulb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DCFCB" , vgf2p8mulb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E97CCB" , vhaddpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED7CCB" , vhaddpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB7CCB" , vhaddps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EF7CCB" , vhaddps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E97DCB" , vhsubpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED7DCB" , vhsubpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB7DCB" , vhsubps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EF7DCB" , vhsubps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E36D18CB01" , vinsertf128(ymm1, ymm2, xmm3, 1)); + TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D38CB01" , vinserti128(ymm1, ymm2, xmm3, 1)); + TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36921CB01" , vinsertps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(dword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, ptr(rdi))); + TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, xmmword_ptr(rdi))); + TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(ptr(rcx, rdx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ptr(rcx, rdx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(ptr(rcx, rdx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ptr(rcx, rdx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E95FCB" , vmaxpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED5FCB" , vmaxpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E85FCB" , vmaxps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC5FCB" , vmaxps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB5FCB" , vmaxsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5FCB" , vmaxss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E95DCB" , vminpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED5DCB" , vminpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E85DCB" , vminps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC5DCB" , vminps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB5DCB" , vminsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5DCB" , vminss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F928CA" , vmovapd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FD28CA" , vmovapd(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5F828CA" , vmovaps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FC28CA" , vmovaps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5F97ED1" , vmovd(ecx, xmm2)); + TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(dword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F96ECA" , vmovd(xmm1, edx)); + TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FB12CA" , vmovddup(xmm1, xmm2)); + TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FF12CA" , vmovddup(ymm1, ymm2)); + TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F96FCA" , vmovdqa(xmm1, xmm2)); + TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FD6FCA" , vmovdqa(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FA6FCA" , vmovdqu(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FE6FCA" , vmovdqu(ymm1, ymm2)); + TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5E812CB" , vmovhlps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(qword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(qword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E816CB" , vmovlhps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(qword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(qword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F950CA" , vmovmskpd(ecx, xmm2)); + TEST_INSTRUCTION("C5FD50CA" , vmovmskpd(ecx, ymm2)); + TEST_INSTRUCTION("C5F850CA" , vmovmskps(ecx, xmm2)); + TEST_INSTRUCTION("C5FC50CA" , vmovmskps(ecx, ymm2)); + TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C4E1F97ED1" , vmovq(rcx, xmm2)); + TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(qword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C4E1F96ECA" , vmovq(xmm1, rdx)); + TEST_INSTRUCTION("C5FA7ECA" , vmovq(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(qword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5EB10CB" , vmovsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5FA16CA" , vmovshdup(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FE16CA" , vmovshdup(ymm1, ymm2)); + TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA12CA" , vmovsldup(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FE12CA" , vmovsldup(ymm1, ymm2)); + TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(dword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5EA10CB" , vmovss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F910CA" , vmovupd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FD10CA" , vmovupd(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5F810CA" , vmovups(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FC10CA" , vmovups(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C4E36942CB01" , vmpsadbw(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D42CB01" , vmpsadbw(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E959CB" , vmulpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED59CB" , vmulpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E859CB" , vmulps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC59CB" , vmulps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB59CB" , vmulsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA59CB" , vmulss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E956CB" , vorpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED56CB" , vorpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E856CB" , vorps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC56CB" , vorps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2791CCA" , vpabsb(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D1CCA" , vpabsb(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2791ECA" , vpabsd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D1ECA" , vpabsd(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2791DCA" , vpabsw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D1DCA" , vpabsw(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5E96BCB" , vpackssdw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED6BCB" , vpackssdw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E963CB" , vpacksswb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED63CB" , vpacksswb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2692BCB" , vpackusdw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D2BCB" , vpackusdw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E967CB" , vpackuswb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED67CB" , vpackuswb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FCCB" , vpaddb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFCCB" , vpaddb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FECB" , vpaddd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFECB" , vpaddd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D4CB" , vpaddq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD4CB" , vpaddq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9ECCB" , vpaddsb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDECCB" , vpaddsb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EDCB" , vpaddsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEDCB" , vpaddsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DCCB" , vpaddusb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDCCB" , vpaddusb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DDCB" , vpaddusw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDDCB" , vpaddusw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FDCB" , vpaddw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFDCB" , vpaddw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E3690FCB01" , vpalignr(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0FCB01" , vpalignr(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9DBCB" , vpand(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDBCB" , vpand(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DFCB" , vpandn(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDFCB" , vpandn(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E0CB" , vpavgb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE0CB" , vpavgb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E3CB" , vpavgw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE3CB" , vpavgw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E36902CB01" , vpblendd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D02CB01" , vpblendd(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3694CCB40" , vpblendvb(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E36D4CCB40" , vpblendvb(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3690ECB01" , vpblendw(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0ECB01" , vpblendw(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E27978CA" , vpbroadcastb(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, byte_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D78CA" , vpbroadcastb(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, byte_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27958CA" , vpbroadcastd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D58CA" , vpbroadcastd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27959CA" , vpbroadcastq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D59CA" , vpbroadcastq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27979CA" , vpbroadcastw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D79CA" , vpbroadcastw(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E36944CB01" , vpclmulqdq(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D44CB01" , vpclmulqdq(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E974CB" , vpcmpeqb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED74CB" , vpcmpeqb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E976CB" , vpcmpeqd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED76CB" , vpcmpeqd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26929CB" , vpcmpeqq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D29CB" , vpcmpeqq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E975CB" , vpcmpeqw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED75CB" , vpcmpeqw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E37961CA01" , vpcmpestri(xmm1, xmm2, 1, ecx, eax, edx)); + TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, ptr(rdx, rbx, 0, 128), 1, ecx, eax, edx)); + TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, ecx, eax, edx)); + TEST_INSTRUCTION("C4E37960CA01" , vpcmpestrm(xmm1, xmm2, 1, xmm0, eax, edx)); + TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, ptr(rdx, rbx, 0, 128), 1, xmm0, eax, edx)); + TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, xmm0, eax, edx)); + TEST_INSTRUCTION("C5E964CB" , vpcmpgtb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED64CB" , vpcmpgtb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E966CB" , vpcmpgtd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED66CB" , vpcmpgtd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26937CB" , vpcmpgtq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D37CB" , vpcmpgtq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E965CB" , vpcmpgtw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED65CB" , vpcmpgtw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E37963CA01" , vpcmpistri(xmm1, xmm2, 1, ecx)); + TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, ptr(rdx, rbx, 0, 128), 1, ecx)); + TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, ecx)); + TEST_INSTRUCTION("C4E37962CA01" , vpcmpistrm(xmm1, xmm2, 1, xmm0)); + TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, ptr(rdx, rbx, 0, 128), 1, xmm0)); + TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, xmm0)); + TEST_INSTRUCTION("C4E36D06CB01" , vperm2f128(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D46CB01" , vperm2i128(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E26D36CB" , vpermd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E36949CB41" , vpermil2pd(xmm1, xmm2, xmm3, xmm4, 1)); + TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6, 1)); + TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6, 1)); + TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D49CB41" , vpermil2pd(ymm1, ymm2, ymm3, ymm4, 1)); + TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6, 1)); + TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6, 1)); + TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128), 1)); + TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128), 1)); + TEST_INSTRUCTION("C4E36948CB41" , vpermil2ps(xmm1, xmm2, xmm3, xmm4, 1)); + TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6, 1)); + TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6, 1)); + TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D48CB41" , vpermil2ps(ymm1, ymm2, ymm3, ymm4, 1)); + TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6, 1)); + TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6, 1)); + TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128), 1)); + TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128), 1)); + TEST_INSTRUCTION("C4E2690DCB" , vpermilpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E37905CA01" , vpermilpd(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E26D0DCB" , vpermilpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E37D05CA01" , vpermilpd(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E2690CCB" , vpermilps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E37904CA01" , vpermilps(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E26D0CCB" , vpermilps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E37D04CA01" , vpermilps(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3FD01CA01" , vpermpd(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E26D16CB" , vpermps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E3FD00CA01" , vpermq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37914D101" , vpextrb(ecx, xmm2, 1)); + TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(byte_ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E37916D101" , vpextrd(ecx, xmm2, 1)); + TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(dword_ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E3F916D101" , vpextrq(rcx, xmm2, 1)); + TEST_INSTRUCTION("C4E3F9169C118000000001" , vpextrq(ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E3F9169C118000000001" , vpextrq(qword_ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C5F9C5CA01" , vpextrw(ecx, xmm2, 1)); + TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(word_ptr(rcx, rdx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E259908C1A80000000" , vpgatherdd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E25D908C1A80000000" , vpgatherdd(ymm1, ptr(rdx, ymm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E2D9908C1A80000000" , vpgatherdq(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2DD908C1A80000000" , vpgatherdq(ymm1, ptr(rdx, xmm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E259918C1A80000000" , vpgatherqd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E25D918C1A80000000" , vpgatherqd(xmm1, ptr(rdx, ymm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2D9918C1A80000000" , vpgatherqq(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2DD918C1A80000000" , vpgatherqq(ymm1, ptr(rdx, ymm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E26902CB" , vphaddd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D02CB" , vphaddd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26903CB" , vphaddsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D03CB" , vphaddsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26901CB" , vphaddw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D01CB" , vphaddw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E27941CA" , vphminposuw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E26906CB" , vphsubd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D06CB" , vphsubd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26907CB" , vphsubsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D07CB" , vphsubsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26905CB" , vphsubw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D05CB" , vphsubw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E36920CB01" , vpinsrb(xmm1, xmm2, ebx, 1)); + TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, byte_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36922CB01" , vpinsrd(xmm1, xmm2, ebx, 1)); + TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E922CB01" , vpinsrq(xmm1, xmm2, rbx, 1)); + TEST_INSTRUCTION("C4E3E9228C2B8000000001" , vpinsrq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9228C2B8000000001" , vpinsrq(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9C4CB01" , vpinsrw(xmm1, xmm2, ebx, 1)); + TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, word_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E26904CB" , vpmaddubsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D04CB" , vpmaddubsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F5CB" , vpmaddwd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF5CB" , vpmaddwd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(ptr(rcx, rdx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ptr(rcx, rdx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(ptr(rcx, rdx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ptr(rcx, rdx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693CCB" , vpmaxsb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3CCB" , vpmaxsb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693DCB" , vpmaxsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3DCB" , vpmaxsd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EECB" , vpmaxsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEECB" , vpmaxsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DECB" , vpmaxub(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDECB" , vpmaxub(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693FCB" , vpmaxud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3FCB" , vpmaxud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693ECB" , vpmaxuw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3ECB" , vpmaxuw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26938CB" , vpminsb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D38CB" , vpminsb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26939CB" , vpminsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D39CB" , vpminsd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EACB" , vpminsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEACB" , vpminsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DACB" , vpminub(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDACB" , vpminub(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693BCB" , vpminud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3BCB" , vpminud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693ACB" , vpminuw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3ACB" , vpminuw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F9D7CA" , vpmovmskb(ecx, xmm2)); + TEST_INSTRUCTION("C5FDD7CA" , vpmovmskb(ecx, ymm2)); + TEST_INSTRUCTION("C4E27921CA" , vpmovsxbd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D21CA" , vpmovsxbd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27922CA" , vpmovsxbq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D22CA" , vpmovsxbq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27920CA" , vpmovsxbw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D20CA" , vpmovsxbw(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27925CA" , vpmovsxdq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D25CA" , vpmovsxdq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27923CA" , vpmovsxwd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D23CA" , vpmovsxwd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27924CA" , vpmovsxwq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D24CA" , vpmovsxwq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27931CA" , vpmovzxbd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D31CA" , vpmovzxbd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27932CA" , vpmovzxbq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D32CA" , vpmovzxbq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27930CA" , vpmovzxbw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D30CA" , vpmovzxbw(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27935CA" , vpmovzxdq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D35CA" , vpmovzxdq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27933CA" , vpmovzxwd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D33CA" , vpmovzxwd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27934CA" , vpmovzxwq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D34CA" , vpmovzxwq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E26928CB" , vpmuldq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D28CB" , vpmuldq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2690BCB" , vpmulhrsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D0BCB" , vpmulhrsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E4CB" , vpmulhuw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE4CB" , vpmulhuw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E5CB" , vpmulhw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE5CB" , vpmulhw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26940CB" , vpmulld(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D40CB" , vpmulld(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D5CB" , vpmullw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD5CB" , vpmullw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F4CB" , vpmuludq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF4CB" , vpmuludq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EBCB" , vpor(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEBCB" , vpor(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F6CB" , vpsadbw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF6CB" , vpsadbw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26900CB" , vpshufb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D00CB" , vpshufb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F970CA01" , vpshufd(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FD70CA01" , vpshufd(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FA70CA01" , vpshufhw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FE70CA01" , vpshufhw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FB70CA01" , vpshuflw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FF70CA01" , vpshuflw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E26908CB" , vpsignb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D08CB" , vpsignb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2690ACB" , vpsignd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D0ACB" , vpsignd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26909CB" , vpsignw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D09CB" , vpsignw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F2CB" , vpslld(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F172F201" , vpslld(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF2CB" , vpslld(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F572F201" , vpslld(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F173FA01" , vpslldq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5F573FA01" , vpslldq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5E9F3CB" , vpsllq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F173F201" , vpsllq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF3CB" , vpsllq(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F573F201" , vpsllq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26947CB" , vpsllvd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D47CB" , vpsllvd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E947CB" , vpsllvq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED47CB" , vpsllvq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F1CB" , vpsllw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F171F201" , vpsllw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF1CB" , vpsllw(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F571F201" , vpsllw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E2CB" , vpsrad(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F172E201" , vpsrad(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE2CB" , vpsrad(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F572E201" , vpsrad(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26946CB" , vpsravd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D46CB" , vpsravd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E1CB" , vpsraw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F171E201" , vpsraw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE1CB" , vpsraw(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F571E201" , vpsraw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D2CB" , vpsrld(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F172D201" , vpsrld(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD2CB" , vpsrld(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F572D201" , vpsrld(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F173DA01" , vpsrldq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5F573DA01" , vpsrldq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5E9D3CB" , vpsrlq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F173D201" , vpsrlq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD3CB" , vpsrlq(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F573D201" , vpsrlq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26945CB" , vpsrlvd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D45CB" , vpsrlvd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E945CB" , vpsrlvq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED45CB" , vpsrlvq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D1CB" , vpsrlw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F171D201" , vpsrlw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD1CB" , vpsrlw(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F571D201" , vpsrlw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F8CB" , vpsubb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF8CB" , vpsubb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FACB" , vpsubd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFACB" , vpsubd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FBCB" , vpsubq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFBCB" , vpsubq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E8CB" , vpsubsb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE8CB" , vpsubsb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E9CB" , vpsubsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE9CB" , vpsubsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D8CB" , vpsubusb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD8CB" , vpsubusb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D9CB" , vpsubusw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD9CB" , vpsubusw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F9CB" , vpsubw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF9CB" , vpsubw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E27917CA" , vptest(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D17CA" , vptest(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5E968CB" , vpunpckhbw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED68CB" , vpunpckhbw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E96ACB" , vpunpckhdq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED6ACB" , vpunpckhdq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E96DCB" , vpunpckhqdq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED6DCB" , vpunpckhqdq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E969CB" , vpunpckhwd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED69CB" , vpunpckhwd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E960CB" , vpunpcklbw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED60CB" , vpunpcklbw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E962CB" , vpunpckldq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED62CB" , vpunpckldq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E96CCB" , vpunpcklqdq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED6CCB" , vpunpcklqdq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E961CB" , vpunpcklwd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED61CB" , vpunpcklwd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EFCB" , vpxor(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEFCB" , vpxor(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F853CA" , vrcpps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC53CA" , vrcpps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5EA53CB" , vrcpss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E37909CA01" , vroundpd(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D09CA01" , vroundpd(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37908CA01" , vroundps(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D08CA01" , vroundps(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690BCB01" , vroundsd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690ACB01" , vroundss(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5F852CA" , vrsqrtps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC52CA" , vrsqrtps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5EA52CB" , vrsqrtss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9C6CB01" , vshufpd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5EDC6CB01" , vshufpd(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E8C6CB01" , vshufps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5ECC6CB01" , vshufps(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C5F951CA" , vsqrtpd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD51CA" , vsqrtpd(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F851CA" , vsqrtps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC51CA" , vsqrtps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5EB51CB" , vsqrtsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA51CB" , vsqrtss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(dword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("C5E95CCB" , vsubpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED5CCB" , vsubpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E85CCB" , vsubps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC5CCB" , vsubps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB5CCB" , vsubsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5CCB" , vsubss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2790FCA" , vtestpd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D0FCA" , vtestpd(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2790ECA" , vtestps(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D0ECA" , vtestps(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F92ECA" , vucomisd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F82ECA" , vucomiss(xmm1, xmm2)); + TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5E915CB" , vunpckhpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED15CB" , vunpckhpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E815CB" , vunpckhps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC15CB" , vunpckhps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E914CB" , vunpcklpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED14CB" , vunpcklpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E814CB" , vunpcklps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC14CB" , vunpcklps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E957CB" , vxorpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED57CB" , vxorpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E857CB" , vxorps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC57CB" , vxorps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C5FC77" , vzeroall()); + TEST_INSTRUCTION("C5F877" , vzeroupper()); +} + +static void ASMJIT_NOINLINE testX64AssemblerAVX_NE_CONVERT(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E27AB18C1A80000000" , vbcstnebf162ps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27AB18C1A80000000" , vbcstnebf162ps(xmm1, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27EB18C1A80000000" , vbcstnebf162ps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27EB18C1A80000000" , vbcstnebf162ps(ymm1, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279B18C1A80000000" , vbcstnesh2ps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279B18C1A80000000" , vbcstnesh2ps(xmm1, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27DB18C1A80000000" , vbcstnesh2ps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27DB18C1A80000000" , vbcstnesh2ps(ymm1, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27AB08C1A80000000" , vcvtneebf162ps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27AB08C1A80000000" , vcvtneebf162ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27EB08C1A80000000" , vcvtneebf162ps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27EB08C1A80000000" , vcvtneebf162ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279B08C1A80000000" , vcvtneeph2ps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E279B08C1A80000000" , vcvtneeph2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27DB08C1A80000000" , vcvtneeph2ps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27DB08C1A80000000" , vcvtneeph2ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27BB08C1A80000000" , vcvtneobf162ps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27BB08C1A80000000" , vcvtneobf162ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27FB08C1A80000000" , vcvtneobf162ps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27FB08C1A80000000" , vcvtneobf162ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E278B08C1A80000000" , vcvtneoph2ps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E278B08C1A80000000" , vcvtneoph2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27CB08C1A80000000" , vcvtneoph2ps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27CB08C1A80000000" , vcvtneoph2ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27A72CA" , vex().vcvtneps2bf16(xmm1, xmm2)); + TEST_INSTRUCTION("C4E27E72CA" , vex().vcvtneps2bf16(xmm1, ymm2)); + TEST_INSTRUCTION("C4E27A728C1A80000000" , vex().vcvtneps2bf16(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E27E728C1A80000000" , vex().vcvtneps2bf16(xmm1, ymmword_ptr(rdx, rbx, 0, 128))); +} + +static void ASMJIT_NOINLINE testX64AssemblerAVX_VNNI(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E25150F4" , vex().vpdpbusd(xmm6, xmm5, xmm4)); + TEST_INSTRUCTION("C4E25550F4" , vex().vpdpbusd(ymm6, ymm5, ymm4)); + TEST_INSTRUCTION("C4E25151F4" , vex().vpdpbusds(xmm6, xmm5, xmm4)); + TEST_INSTRUCTION("C4E25551F4" , vex().vpdpbusds(ymm6, ymm5, ymm4)); + TEST_INSTRUCTION("C4E25152F4" , vex().vpdpwssd(xmm6, xmm5, xmm4)); + TEST_INSTRUCTION("C4E25552F4" , vex().vpdpwssd(ymm6, ymm5, ymm4)); + TEST_INSTRUCTION("C4E25153F4" , vex().vpdpwssds(xmm6, xmm5, xmm4)); + TEST_INSTRUCTION("C4E25553F4" , vex().vpdpwssds(ymm6, ymm5, ymm4)); +} + +static void ASMJIT_NOINLINE testX64AssemblerAVX_VNNI_INT8(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E26B50CB" , vpdpbssd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26B508C2B80000000" , vpdpbssd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26B508C2B80000000" , vpdpbssd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26F50CB" , vpdpbssd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26F508C2B80000000" , vpdpbssd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26F508C2B80000000" , vpdpbssd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26B51CB" , vpdpbssds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26B518C2B80000000" , vpdpbssds(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26B518C2B80000000" , vpdpbssds(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26F51CB" , vpdpbssds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26F518C2B80000000" , vpdpbssds(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26F518C2B80000000" , vpdpbssds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26A50CB" , vpdpbsud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26A508C2B80000000" , vpdpbsud(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26A508C2B80000000" , vpdpbsud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26E50CB" , vpdpbsud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26E508C2B80000000" , vpdpbsud(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26E508C2B80000000" , vpdpbsud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26A51CB" , vpdpbsuds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26A518C2B80000000" , vpdpbsuds(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26A518C2B80000000" , vpdpbsuds(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26E51CB" , vpdpbsuds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26E518C2B80000000" , vpdpbsuds(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26E518C2B80000000" , vpdpbsuds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26850CB" , vpdpbuud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268508C2B80000000" , vpdpbuud(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E268508C2B80000000" , vpdpbuud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26C50CB" , vpdpbuud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26C508C2B80000000" , vpdpbuud(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26C508C2B80000000" , vpdpbuud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26851CB" , vpdpbuuds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268518C2B80000000" , vpdpbuuds(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E268518C2B80000000" , vpdpbuuds(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26C51CB" , vpdpbuuds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26C518C2B80000000" , vpdpbuuds(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26C518C2B80000000" , vpdpbuuds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); +} + +static void ASMJIT_NOINLINE testX64AssemblerAVX_VNNI_INT16(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E26AD2CB" , vpdpwsud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26AD28C2B80000000" , vpdpwsud(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26AD28C2B80000000" , vpdpwsud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26ED2CB" , vpdpwsud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26ED28C2B80000000" , vpdpwsud(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26ED28C2B80000000" , vpdpwsud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26AD3CB" , vpdpwsuds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26AD38C2B80000000" , vpdpwsuds(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26AD38C2B80000000" , vpdpwsuds(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26ED3CB" , vpdpwsuds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26ED38C2B80000000" , vpdpwsuds(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26ED38C2B80000000" , vpdpwsuds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269D2CB" , vpdpwusd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269D28C2B80000000" , vpdpwusd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269D28C2B80000000" , vpdpwusd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DD2CB" , vpdpwusd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DD28C2B80000000" , vpdpwusd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DD28C2B80000000" , vpdpwusd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269D3CB" , vpdpwusds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269D38C2B80000000" , vpdpwusds(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269D38C2B80000000" , vpdpwusds(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DD3CB" , vpdpwusds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DD38C2B80000000" , vpdpwusds(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DD38C2B80000000" , vpdpwusds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E268D2CB" , vpdpwuud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268D28C2B80000000" , vpdpwuud(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E268D28C2B80000000" , vpdpwuud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26CD2CB" , vpdpwuud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26CD28C2B80000000" , vpdpwuud(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26CD28C2B80000000" , vpdpwuud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E268D3CB" , vpdpwuuds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268D38C2B80000000" , vpdpwuuds(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E268D38C2B80000000" , vpdpwuuds(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26CD3CB" , vpdpwuuds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26CD38C2B80000000" , vpdpwuuds(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26CD38C2B80000000" , vpdpwuuds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); +} + +static void ASMJIT_NOINLINE testX64AssemblerAVX_SHA512(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E27FCCCA" , vsha512msg1(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27FCDCA" , vsha512msg2(ymm1, ymm2)); + TEST_INSTRUCTION("C4E26FCBCB" , vsha512rnds2(ymm1, ymm2, xmm3)); +} + +static void ASMJIT_NOINLINE testX64AssemblerAVX_SM3(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E268DACB" , vsm3msg1(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268DA8C2B80000000" , vsm3msg1(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E268DA8C2B80000000" , vsm3msg1(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DACB" , vsm3msg2(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DA8C2B80000000" , vsm3msg2(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269DA8C2B80000000" , vsm3msg2(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E369DECB01" , vsm3rnds2(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369DE8C2B8000000001" , vsm3rnds2(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369DE8C2B8000000001" , vsm3rnds2(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); +} + +static void ASMJIT_NOINLINE testX64AssemblerAVX_SM4(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E26ADACB" , vsm4key4(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26ADA8C2B80000000" , vsm4key4(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26ADA8C2B80000000" , vsm4key4(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26EDACB" , vsm4key4(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26EDA8C2B80000000" , vsm4key4(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26EDA8C2B80000000" , vsm4key4(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26BDACB" , vsm4rnds4(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26BDA8C2B80000000" , vsm4rnds4(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26BDA8C2B80000000" , vsm4rnds4(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26FDACB" , vsm4rnds4(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26FDA8C2B80000000" , vsm4rnds4(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26FDA8C2B80000000" , vsm4rnds4(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); +} + +static void ASMJIT_NOINLINE testX64AssemblerFMA(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E2E998CB" , vfmadd132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED98CB" , vfmadd132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26998CB" , vfmadd132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D98CB" , vfmadd132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E999CB" , vfmadd132sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26999CB" , vfmadd132ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A8CB" , vfmadd213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA8CB" , vfmadd213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269A8CB" , vfmadd213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DA8CB" , vfmadd213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A9CB" , vfmadd213sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269A9CB" , vfmadd213ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B8CB" , vfmadd231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB8CB" , vfmadd231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269B8CB" , vfmadd231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DB8CB" , vfmadd231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B9CB" , vfmadd231sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269B9CB" , vfmadd231ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E996CB" , vfmaddsub132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED96CB" , vfmaddsub132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26996CB" , vfmaddsub132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D96CB" , vfmaddsub132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A6CB" , vfmaddsub213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA6CB" , vfmaddsub213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269A6CB" , vfmaddsub213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DA6CB" , vfmaddsub213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B6CB" , vfmaddsub231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB6CB" , vfmaddsub231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269B6CB" , vfmaddsub231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DB6CB" , vfmaddsub231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99ACB" , vfmsub132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9ACB" , vfmsub132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699ACB" , vfmsub132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D9ACB" , vfmsub132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99BCB" , vfmsub132sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699BCB" , vfmsub132ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AACB" , vfmsub213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAACB" , vfmsub213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269AACB" , vfmsub213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DAACB" , vfmsub213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9ABCB" , vfmsub213sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269ABCB" , vfmsub213ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BACB" , vfmsub231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBACB" , vfmsub231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BACB" , vfmsub231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DBACB" , vfmsub231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BBCB" , vfmsub231sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BBCB" , vfmsub231ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E997CB" , vfmsubadd132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED97CB" , vfmsubadd132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26997CB" , vfmsubadd132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D97CB" , vfmsubadd132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A7CB" , vfmsubadd213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA7CB" , vfmsubadd213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269A7CB" , vfmsubadd213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DA7CB" , vfmsubadd213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B7CB" , vfmsubadd231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB7CB" , vfmsubadd231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269B7CB" , vfmsubadd231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DB7CB" , vfmsubadd231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99CCB" , vfnmadd132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9CCB" , vfnmadd132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699CCB" , vfnmadd132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D9CCB" , vfnmadd132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99DCB" , vfnmadd132sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699DCB" , vfnmadd132ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9ACCB" , vfnmadd213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDACCB" , vfnmadd213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269ACCB" , vfnmadd213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DACCB" , vfnmadd213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9ADCB" , vfnmadd213sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269ADCB" , vfnmadd213ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BCCB" , vfnmadd231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBCCB" , vfnmadd231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BCCB" , vfnmadd231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DBCCB" , vfnmadd231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BDCB" , vfnmadd231sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BDCB" , vfnmadd231ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99ECB" , vfnmsub132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9ECB" , vfnmsub132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699ECB" , vfnmsub132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D9ECB" , vfnmsub132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99FCB" , vfnmsub132sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699FCB" , vfnmsub132ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AECB" , vfnmsub213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAECB" , vfnmsub213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269AECB" , vfnmsub213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DAECB" , vfnmsub213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AFCB" , vfnmsub213sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269AFCB" , vfnmsub213ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BECB" , vfnmsub231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBECB" , vfnmsub231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BECB" , vfnmsub231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DBECB" , vfnmsub231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BFCB" , vfnmsub231sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BFCB" , vfnmsub231ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); +} + +static void ASMJIT_NOINLINE testX64AssemblerFMA4(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E3E969CC30" , vfmaddpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED69CC30" , vfmaddpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E968CC30" , vfmaddps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED68CC30" , vfmaddps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E96BCC30" , vfmaddsd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E96ACC30" , vfmaddss(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E95DCC30" , vfmaddsubpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED5DCC30" , vfmaddsubpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E95CCC30" , vfmaddsubps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED5CCC30" , vfmaddsubps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E95FCC30" , vfmsubaddpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED5FCC30" , vfmsubaddpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E95ECC30" , vfmsubaddps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED5ECC30" , vfmsubaddps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E96DCC30" , vfmsubpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED6DCC30" , vfmsubpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E96CCC30" , vfmsubps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED6CCC30" , vfmsubps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E96FCC30" , vfmsubsd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E96ECC30" , vfmsubss(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E979CC30" , vfnmaddpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED79CC30" , vfnmaddpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E978CC30" , vfnmaddps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED78CC30" , vfnmaddps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E97BCC30" , vfnmaddsd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E97ACC30" , vfnmaddss(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E97DCC30" , vfnmsubpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED7DCC30" , vfnmsubpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E97CCC30" , vfnmsubps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED7CCC30" , vfnmsubps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E97FCC30" , vfnmsubsd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E97ECC30" , vfnmsubss(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6)); +} + +static void ASMJIT_NOINLINE testX64AssemblerXOP(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("8FE97881CA" , vfrczpd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97C81CA" , vfrczpd(ymm1, ymm2)); + TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97880CA" , vfrczps(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97C80CA" , vfrczps(ymm1, ymm2)); + TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97883CA" , vfrczsd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE97882CA" , vfrczss(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE868A2CB40" , vpcmov(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86CA2CB40" , vpcmov(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); + TEST_INSTRUCTION("8FE868CCCB01" , vpcomb(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CECB01" , vpcomd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CFCB01" , vpcomq(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868ECCB01" , vpcomub(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EECB01" , vpcomud(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EFCB01" , vpcomuq(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EDCB01" , vpcomuw(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CDCB01" , vpcomw(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("8FE978C2CA" , vphaddbd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978C3CA" , vphaddbq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978C1CA" , vphaddbw(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978CBCA" , vphadddq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D2CA" , vphaddubd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D3CA" , vphaddubq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D1CA" , vphaddubw(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978DBCA" , vphaddudq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D6CA" , vphadduwd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D7CA" , vphadduwq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978C6CA" , vphaddwd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978C7CA" , vphaddwq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978E1CA" , vphsubbw(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978E3CA" , vphsubdq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978E2CA" , vphsubwd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("8FE8689ECB40" , vpmacsdd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8689FCB40" , vpmacsdqh(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86897CB40" , vpmacsdql(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8688ECB40" , vpmacssdd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8688FCB40" , vpmacssdqh(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86887CB40" , vpmacssdql(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86886CB40" , vpmacsswd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86885CB40" , vpmacssww(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86896CB40" , vpmacswd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86895CB40" , vpmacsww(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A6CB40" , vpmadcsswd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868B6CB40" , vpmadcswd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A3CB40" , vpperm(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); + TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE96090CA" , vprotb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE878C0CA01" , vprotb(xmm1, xmm2, 1)); + TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FE96092CA" , vprotd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE878C2CA01" , vprotd(xmm1, xmm2, 1)); + TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FE96093CA" , vprotq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE878C3CA01" , vprotq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FE96091CA" , vprotw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE878C1CA01" , vprotw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("8FE96098CA" , vpshab(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE9609ACA" , vpshad(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE9609BCA" , vpshaq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96099CA" , vpshaw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96094CA" , vpshlb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96096CA" , vpshld(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96097CA" , vpshlq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96095CA" , vpshlw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); +} + +static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester& tester) noexcept { using namespace x86; + TEST_INSTRUCTION("C5ED4ACB" , kaddb(k1, k2, k3)); + TEST_INSTRUCTION("C4E1ED4ACB" , kaddd(k1, k2, k3)); + TEST_INSTRUCTION("C4E1EC4ACB" , kaddq(k1, k2, k3)); + TEST_INSTRUCTION("C5EC4ACB" , kaddw(k1, k2, k3)); + TEST_INSTRUCTION("C5ED41CB" , kandb(k1, k2, k3)); + TEST_INSTRUCTION("C4E1ED41CB" , kandd(k1, k2, k3)); + TEST_INSTRUCTION("C5ED42CB" , kandnb(k1, k2, k3)); + TEST_INSTRUCTION("C4E1ED42CB" , kandnd(k1, k2, k3)); + TEST_INSTRUCTION("C4E1EC42CB" , kandnq(k1, k2, k3)); + TEST_INSTRUCTION("C5EC42CB" , kandnw(k1, k2, k3)); + TEST_INSTRUCTION("C4E1EC41CB" , kandq(k1, k2, k3)); + TEST_INSTRUCTION("C5EC41CB" , kandw(k1, k2, k3)); + TEST_INSTRUCTION("C5F992CA" , kmovb(k1, edx)); + TEST_INSTRUCTION("C5F990CA" , kmovb(k1, k2)); + TEST_INSTRUCTION("C5F9908C1A80000000" , kmovb(k1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F9908C1A80000000" , kmovb(k1, byte_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F993CA" , kmovb(ecx, k2)); + TEST_INSTRUCTION("C5F9919C1180000000" , kmovb(ptr(rcx, rdx, 0, 128), k3)); + TEST_INSTRUCTION("C5F9919C1180000000" , kmovb(byte_ptr(rcx, rdx, 0, 128), k3)); + TEST_INSTRUCTION("C5FB92CA" , kmovd(k1, edx)); + TEST_INSTRUCTION("C4E1F990CA" , kmovd(k1, k2)); + TEST_INSTRUCTION("C4E1F9908C1A80000000" , kmovd(k1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1F9908C1A80000000" , kmovd(k1, dword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5FB93CA" , kmovd(ecx, k2)); + TEST_INSTRUCTION("C4E1F9919C1180000000" , kmovd(ptr(rcx, rdx, 0, 128), k3)); + TEST_INSTRUCTION("C4E1F9919C1180000000" , kmovd(dword_ptr(rcx, rdx, 0, 128), k3)); + TEST_INSTRUCTION("C4E1FB92CA" , kmovq(k1, rdx)); + TEST_INSTRUCTION("C4E1F890CA" , kmovq(k1, k2)); + TEST_INSTRUCTION("C4E1F8908C1A80000000" , kmovq(k1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1F8908C1A80000000" , kmovq(k1, qword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C4E1FB93CA" , kmovq(rcx, k2)); + TEST_INSTRUCTION("C4E1F8919C1180000000" , kmovq(ptr(rcx, rdx, 0, 128), k3)); + TEST_INSTRUCTION("C4E1F8919C1180000000" , kmovq(qword_ptr(rcx, rdx, 0, 128), k3)); + TEST_INSTRUCTION("C5F892CA" , kmovw(k1, edx)); + TEST_INSTRUCTION("C5F890CA" , kmovw(k1, k2)); + TEST_INSTRUCTION("C5F8908C1A80000000" , kmovw(k1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F8908C1A80000000" , kmovw(k1, word_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("C5F893CA" , kmovw(ecx, k2)); + TEST_INSTRUCTION("C5F8919C1180000000" , kmovw(ptr(rcx, rdx, 0, 128), k3)); + TEST_INSTRUCTION("C5F8919C1180000000" , kmovw(word_ptr(rcx, rdx, 0, 128), k3)); + TEST_INSTRUCTION("C5F944CA" , knotb(k1, k2)); + TEST_INSTRUCTION("C4E1F944CA" , knotd(k1, k2)); + TEST_INSTRUCTION("C4E1F844CA" , knotq(k1, k2)); + TEST_INSTRUCTION("C5F844CA" , knotw(k1, k2)); + TEST_INSTRUCTION("C5ED45CB" , korb(k1, k2, k3)); + TEST_INSTRUCTION("C4E1ED45CB" , kord(k1, k2, k3)); + TEST_INSTRUCTION("C4E1EC45CB" , korq(k1, k2, k3)); + TEST_INSTRUCTION("C5F998CA" , kortestb(k1, k2)); + TEST_INSTRUCTION("C4E1F998CA" , kortestd(k1, k2)); + TEST_INSTRUCTION("C4E1F898CA" , kortestq(k1, k2)); + TEST_INSTRUCTION("C5F898CA" , kortestw(k1, k2)); + TEST_INSTRUCTION("C5EC45CB" , korw(k1, k2, k3)); + TEST_INSTRUCTION("C4E37932CA01" , kshiftlb(k1, k2, 1)); + TEST_INSTRUCTION("C4E37933CA01" , kshiftld(k1, k2, 1)); + TEST_INSTRUCTION("C4E3F933CA01" , kshiftlq(k1, k2, 1)); + TEST_INSTRUCTION("C4E3F932CA01" , kshiftlw(k1, k2, 1)); + TEST_INSTRUCTION("C4E37930CA01" , kshiftrb(k1, k2, 1)); + TEST_INSTRUCTION("C4E37931CA01" , kshiftrd(k1, k2, 1)); + TEST_INSTRUCTION("C4E3F931CA01" , kshiftrq(k1, k2, 1)); + TEST_INSTRUCTION("C4E3F930CA01" , kshiftrw(k1, k2, 1)); + TEST_INSTRUCTION("C5F999CA" , ktestb(k1, k2)); + TEST_INSTRUCTION("C4E1F999CA" , ktestd(k1, k2)); + TEST_INSTRUCTION("C4E1F899CA" , ktestq(k1, k2)); + TEST_INSTRUCTION("C5F899CA" , ktestw(k1, k2)); + TEST_INSTRUCTION("C5ED4BCB" , kunpckbw(k1, k2, k3)); + TEST_INSTRUCTION("C4E1EC4BCB" , kunpckdq(k1, k2, k3)); + TEST_INSTRUCTION("C5EC4BCB" , kunpckwd(k1, k2, k3)); + TEST_INSTRUCTION("C5ED46CB" , kxnorb(k1, k2, k3)); + TEST_INSTRUCTION("C4E1ED46CB" , kxnord(k1, k2, k3)); + TEST_INSTRUCTION("C4E1EC46CB" , kxnorq(k1, k2, k3)); + TEST_INSTRUCTION("C5EC46CB" , kxnorw(k1, k2, k3)); + TEST_INSTRUCTION("C5ED47CB" , kxorb(k1, k2, k3)); + TEST_INSTRUCTION("C4E1ED47CB" , kxord(k1, k2, k3)); + TEST_INSTRUCTION("C4E1EC47CB" , kxorq(k1, k2, k3)); + TEST_INSTRUCTION("C5EC47CB" , kxorw(k1, k2, k3)); TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F25F089B4C1A08" , v4fmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(rdx, rbx, 0, 128))); @@ -3076,84 +5551,24 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5E958CB" , vaddpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED58CB" , vaddpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED4858CB" , vaddpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E858CB" , vaddps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC58CB" , vaddps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C4858CB" , vaddps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48584C2B02" , vaddps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C48584C2B02" , vaddps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB58CB" , vaddsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA58CB" , vaddss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D0CB" , vaddsubpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD0CB" , vaddsubpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EBD0CB" , vaddsubps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EFD0CB" , vaddsubps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269DECB" , vaesdec(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DDECB" , vaesdec(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48DECB" , vaesdec(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48DE4C2B02" , vaesdec(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48DE4C2B02" , vaesdec(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269DFCB" , vaesdeclast(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DDFCB" , vaesdeclast(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48DFCB" , vaesdeclast(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48DF4C2B02" , vaesdeclast(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48DF4C2B02" , vaesdeclast(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269DCCB" , vaesenc(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DDCCB" , vaesenc(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48DCCB" , vaesenc(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48DC4C2B02" , vaesenc(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48DC4C2B02" , vaesenc(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269DDCB" , vaesenclast(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DDDCB" , vaesenclast(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48DDCB" , vaesenclast(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48DD4C2B02" , vaesenclast(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48DD4C2B02" , vaesenclast(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E279DBCA" , vaesimc(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E379DFCA01" , vaeskeygenassist(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F36D0803CB01" , valignd(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08034C2B0801" , valignd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08034C2B0801" , valignd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); @@ -3172,39 +5587,15 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4803CB01" , valignq(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48034C2B0201" , valignq(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48034C2B0201" , valignq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E955CB" , vandnpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED55CB" , vandnpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED4855CB" , vandnpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48554C2B02" , vandnpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48554C2B02" , vandnpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E855CB" , vandnps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC55CB" , vandnps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C4855CB" , vandnps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48554C2B02" , vandnps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C48554C2B02" , vandnps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E954CB" , vandpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED54CB" , vandpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED4854CB" , vandpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48544C2B02" , vandpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48544C2B02" , vandpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E854CB" , vandps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC54CB" , vandps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C4854CB" , vandps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48544C2B02" , vandps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C48544C2B02" , vandps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -3226,32 +5617,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D4865CB" , vblendmps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48654C2B02" , vblendmps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48654C2B02" , vblendmps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E3690DCB01" , vblendpd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0DCB01" , vblendpd(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690CCB01" , vblendps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0CCB01" , vblendps(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3694BCB40" , vblendvpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E36D4BCB40" , vblendvpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3694ACB40" , vblendvps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E36D4ACB40" , vblendvps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D2819CA" , vbroadcastf32x2(ymm1, xmm2)); TEST_INSTRUCTION("62F27D28194C1A10" , vbroadcastf32x2(ymm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D28194C1A10" , vbroadcastf32x2(ymm1, qword_ptr(rdx, rbx, 0, 128))); @@ -3270,8 +5635,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD481A4C1A08" , vbroadcastf64x2(zmm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD481B4C1A04" , vbroadcastf64x4(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD481B4C1A04" , vbroadcastf64x4(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D0859CA" , vbroadcasti32x2(xmm1, xmm2)); TEST_INSTRUCTION("62F27D08594C1A10" , vbroadcasti32x2(xmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D08594C1A10" , vbroadcasti32x2(xmm1, qword_ptr(rdx, rbx, 0, 128))); @@ -3293,69 +5656,36 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD485A4C1A08" , vbroadcasti64x2(zmm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD485B4C1A04" , vbroadcasti64x4(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD485B4C1A04" , vbroadcasti64x4(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D19CA" , vbroadcastsd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD4819CA" , vbroadcastsd(zmm1, xmm2)); TEST_INSTRUCTION("62F2FD48194C1A10" , vbroadcastsd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD48194C1A10" , vbroadcastsd(zmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27918CA" , vbroadcastss(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D18CA" , vbroadcastss(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4818CA" , vbroadcastss(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48184C1A20" , vbroadcastss(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48184C1A20" , vbroadcastss(zmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5E9C2CB01" , vcmppd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED08C2CB01" , vcmppd(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F1ED08C24C2B0801" , vcmppd(k1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED08C24C2B0801" , vcmppd(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5EDC2CB01" , vcmppd(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED28C2CB01" , vcmppd(k1, ymm2, ymm3, 1)); TEST_INSTRUCTION("62F1ED28C24C2B0401" , vcmppd(k1, ymm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED28C24C2B0401" , vcmppd(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED48C2CB01" , vcmppd(k1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F1ED48C24C2B0201" , vcmppd(k1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED48C24C2B0201" , vcmppd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E8C2CB01" , vcmpps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16C08C2CB01" , vcmpps(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F16C08C24C2B0801" , vcmpps(k1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16C08C24C2B0801" , vcmpps(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5ECC2CB01" , vcmpps(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16C28C2CB01" , vcmpps(k1, ymm2, ymm3, 1)); TEST_INSTRUCTION("62F16C28C24C2B0401" , vcmpps(k1, ymm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16C28C24C2B0401" , vcmpps(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16C48C2CB01" , vcmpps(k1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F16C48C24C2B0201" , vcmpps(k1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16C48C24C2B0201" , vcmpps(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5EBC2CB01" , vcmpsd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1EF08C2CB01" , vcmpsd(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F1EF08C24C2B1001" , vcmpsd(k1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1EF08C24C2B1001" , vcmpsd(k1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5EAC2CB01" , vcmpss(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16E08C2CB01" , vcmpss(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F16E08C24C2B2001" , vcmpss(k1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16E08C24C2B2001" , vcmpss(k1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5F92FCA" , vcomisd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F82FCA" , vcomiss(xmm1, xmm2)); - TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD088AD1" , vcompresspd(xmm1, xmm2)); TEST_INSTRUCTION("62F2FD088A5C1110" , vcompresspd(ptr(rcx, rdx, 0, 128), xmm3)); TEST_INSTRUCTION("62F2FD088A5C1110" , vcompresspd(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); @@ -3374,21 +5704,9 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27D488AD1" , vcompressps(zmm1, zmm2)); TEST_INSTRUCTION("62F27D488A5C1120" , vcompressps(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F27D488A5C1120" , vcompressps(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5FAE6CA" , vcvtdq2pd(xmm1, xmm2)); - TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FEE6CA" , vcvtdq2pd(ymm1, xmm2)); - TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17E48E6CA" , vcvtdq2pd(zmm1, ymm2)); TEST_INSTRUCTION("62F17E48E64C1A04" , vcvtdq2pd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17E48E64C1A04" , vcvtdq2pd(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F85BCA" , vcvtdq2ps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC5BCA" , vcvtdq2ps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C485BCA" , vcvtdq2ps(zmm1, zmm2)); TEST_INSTRUCTION("62F17C485B4C1A02" , vcvtdq2ps(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C485B4C1A02" , vcvtdq2ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); @@ -3408,17 +5726,9 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27E4872CA" , vcvtneps2bf16(ymm1, zmm2)); TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FBE6CA" , vcvtpd2dq(xmm1, xmm2)); - TEST_INSTRUCTION("C5FFE6CA" , vcvtpd2dq(xmm1, ymm2)); - TEST_INSTRUCTION("C5FBE68C1A80000000" , vcvtpd2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FFE68C1A80000000" , vcvtpd2dq(xmm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FF48E6CA" , vcvtpd2dq(ymm1, zmm2)); TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F95ACA" , vcvtpd2ps(xmm1, xmm2)); - TEST_INSTRUCTION("C5FD5ACA" , vcvtpd2ps(xmm1, ymm2)); - TEST_INSTRUCTION("C5F95A8C1A80000000" , vcvtpd2ps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD5A8C1A80000000" , vcvtpd2ps(xmm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD485ACA" , vcvtpd2ps(ymm1, zmm2)); TEST_INSTRUCTION("62F1FD485A4C1A02" , vcvtpd2ps(ymm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD485A4C1A02" , vcvtpd2ps(ymm1, zmmword_ptr(rdx, rbx, 0, 128))); @@ -3447,39 +5757,15 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1FD4879CA" , vcvtpd2uqq(zmm1, zmm2)); TEST_INSTRUCTION("62F1FD48794C1A02" , vcvtpd2uqq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD48794C1A02" , vcvtpd2uqq(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27913CA" , vcvtph2ps(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D13CA" , vcvtph2ps(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4813CA" , vcvtph2ps(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48134C1A04" , vcvtph2ps(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48134C1A04" , vcvtph2ps(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F95BCA" , vcvtps2dq(xmm1, xmm2)); - TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD5BCA" , vcvtps2dq(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17D485BCA" , vcvtps2dq(zmm1, zmm2)); TEST_INSTRUCTION("62F17D485B4C1A02" , vcvtps2dq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17D485B4C1A02" , vcvtps2dq(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F85ACA" , vcvtps2pd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC5ACA" , vcvtps2pd(ymm1, xmm2)); - TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C485ACA" , vcvtps2pd(zmm1, ymm2)); TEST_INSTRUCTION("62F17C485A4C1A04" , vcvtps2pd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C485A4C1A04" , vcvtps2pd(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E3791DD101" , vcvtps2ph(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(qword_ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E37D1DD101" , vcvtps2ph(xmm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(ptr(rcx, rdx, 0, 128), ymm3, 1)); - TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1)); TEST_INSTRUCTION("62F37D481DD101" , vcvtps2ph(ymm1, zmm2, 1)); TEST_INSTRUCTION("62F37D481D5C110401" , vcvtps2ph(ptr(rcx, rdx, 0, 128), zmm3, 1)); TEST_INSTRUCTION("62F37D481D5C110401" , vcvtps2ph(ymmword_ptr(rcx, rdx, 0, 128), zmm3, 1)); @@ -3526,50 +5812,18 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1FC485BCA" , vcvtqq2ps(ymm1, zmm2)); TEST_INSTRUCTION("62F1FC485B4C1A02" , vcvtqq2ps(ymm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FC485B4C1A02" , vcvtqq2ps(ymm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FB2DCA" , vcvtsd2si(ecx, xmm2)); - TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1FB2DCA" , vcvtsd2si(rcx, xmm2)); - TEST_INSTRUCTION("C4E1FB2D8C1A80000000" , vcvtsd2si(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1FB2D8C1A80000000" , vcvtsd2si(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5EB5ACB" , vcvtsd2ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F17F0879CA" , vcvtsd2usi(ecx, xmm2)); TEST_INSTRUCTION("62F17F08794C1A10" , vcvtsd2usi(ecx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17F08794C1A10" , vcvtsd2usi(ecx, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FF0879CA" , vcvtsd2usi(rcx, xmm2)); TEST_INSTRUCTION("62F1FF08794C1A10" , vcvtsd2usi(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FF08794C1A10" , vcvtsd2usi(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5EB2ACB" , vcvtsi2sd(xmm1, xmm2, ebx)); - TEST_INSTRUCTION("C4E1EB2ACB" , vcvtsi2sd(xmm1, xmm2, rbx)); - TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E1EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA2ACB" , vcvtsi2ss(xmm1, xmm2, ebx)); - TEST_INSTRUCTION("C4E1EA2ACB" , vcvtsi2ss(xmm1, xmm2, rbx)); - TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E1EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5ACB" , vcvtss2sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5FA2DCA" , vcvtss2si(ecx, xmm2)); - TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1FA2DCA" , vcvtss2si(rcx, xmm2)); - TEST_INSTRUCTION("C4E1FA2D8C1A80000000" , vcvtss2si(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1FA2D8C1A80000000" , vcvtss2si(rcx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17E0879CA" , vcvtss2usi(ecx, xmm2)); TEST_INSTRUCTION("62F17E08794C1A20" , vcvtss2usi(ecx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17E08794C1A20" , vcvtss2usi(ecx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FE0879CA" , vcvtss2usi(rcx, xmm2)); TEST_INSTRUCTION("62F1FE08794C1A20" , vcvtss2usi(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FE08794C1A20" , vcvtss2usi(rcx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F9E6CA" , vcvttpd2dq(xmm1, xmm2)); - TEST_INSTRUCTION("C5FDE6CA" , vcvttpd2dq(xmm1, ymm2)); - TEST_INSTRUCTION("C5F9E68C1A80000000" , vcvttpd2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FDE68C1A80000000" , vcvttpd2dq(xmm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD48E6CA" , vcvttpd2dq(ymm1, zmm2)); TEST_INSTRUCTION("62F1FD48E64C1A02" , vcvttpd2dq(ymm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD48E64C1A02" , vcvttpd2dq(ymm1, zmmword_ptr(rdx, rbx, 0, 128))); @@ -3598,12 +5852,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1FD4878CA" , vcvttpd2uqq(zmm1, zmm2)); TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA5BCA" , vcvttps2dq(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FE5BCA" , vcvttps2dq(ymm1, ymm2)); - TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17E485BCA" , vcvttps2dq(zmm1, zmm2)); TEST_INSTRUCTION("62F17E485B4C1A02" , vcvttps2dq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17E485B4C1A02" , vcvttps2dq(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); @@ -3634,24 +5882,12 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F17D4878CA" , vcvttps2uqq(zmm1, ymm2)); TEST_INSTRUCTION("62F17D48784C1A04" , vcvttps2uqq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17D48784C1A04" , vcvttps2uqq(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FB2CCA" , vcvttsd2si(ecx, xmm2)); - TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1FB2CCA" , vcvttsd2si(rcx, xmm2)); - TEST_INSTRUCTION("C4E1FB2C8C1A80000000" , vcvttsd2si(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1FB2C8C1A80000000" , vcvttsd2si(rcx, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17F0878CA" , vcvttsd2usi(ecx, xmm2)); TEST_INSTRUCTION("62F17F08784C1A10" , vcvttsd2usi(ecx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17F08784C1A10" , vcvttsd2usi(ecx, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FF0878CA" , vcvttsd2usi(rcx, xmm2)); TEST_INSTRUCTION("62F1FF08784C1A10" , vcvttsd2usi(rcx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FF08784C1A10" , vcvttsd2usi(rcx, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA2CCA" , vcvttss2si(ecx, xmm2)); - TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1FA2CCA" , vcvttss2si(rcx, xmm2)); - TEST_INSTRUCTION("C4E1FA2C8C1A80000000" , vcvttss2si(rcx, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E1FA2C8C1A80000000" , vcvttss2si(rcx, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17E0878CA" , vcvttss2usi(ecx, xmm2)); TEST_INSTRUCTION("62F17E08784C1A20" , vcvttss2usi(ecx, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17E08784C1A20" , vcvttss2usi(ecx, dword_ptr(rdx, rbx, 0, 128))); @@ -3703,38 +5939,17 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16E087B4C2B20" , vcvtusi2ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1EE087B4C2B10" , vcvtusi2ss(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F36D0842CB01" , vdbpsadbw(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("62F36D2842CB01" , vdbpsadbw(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("62F36D28424C2B0401" , vdbpsadbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("62F36D28424C2B0401" , vdbpsadbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("62F36D4842CB01" , vdbpsadbw(zmm1, zmm2, zmm3, 1)); - TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E95ECB" , vdivpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED5ECB" , vdivpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("62F1ED485ECB" , vdivpd(zmm1, zmm2, zmm3)); - TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E85ECB" , vdivps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC5ECB" , vdivps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("62F36D2842CB01" , vdbpsadbw(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("62F36D28424C2B0401" , vdbpsadbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("62F36D28424C2B0401" , vdbpsadbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("62F36D4842CB01" , vdbpsadbw(zmm1, zmm2, zmm3, 1)); + TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16C485ECB" , vdivps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C485E4C2B02" , vdivps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C485E4C2B02" , vdivps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB5ECB" , vdivsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5ECB" , vdivss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26E0852CB" , vdpbf16ps(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26E08524C2B08" , vdpbf16ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26E08524C2B08" , vdpbf16ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -3744,15 +5959,9 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26E4852CB" , vdpbf16ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E36941CB01" , vdppd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36940CB01" , vdpps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D40CB01" , vdpps(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("62F1ED485ECB" , vdivpd(zmm1, zmm2, zmm3)); + TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2FD48C8CA" , vexp2pd(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); @@ -3777,9 +5986,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27D4888CA" , vexpandps(zmm1, zmm2)); TEST_INSTRUCTION("62F27D48884C1A20" , vexpandps(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48884C1A20" , vexpandps(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E37D19D101" , vextractf128(xmm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(ptr(rcx, rdx, 0, 128), ymm3, 1)); - TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1)); TEST_INSTRUCTION("62F37D2819D101" , vextractf32x4(xmm1, ymm2, 1)); TEST_INSTRUCTION("62F37D4819D101" , vextractf32x4(xmm1, zmm2, 1)); TEST_INSTRUCTION("62F37D28195C110801" , vextractf32x4(ptr(rcx, rdx, 0, 128), ymm3, 1)); @@ -3798,9 +6004,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3FD481BD101" , vextractf64x4(ymm1, zmm2, 1)); TEST_INSTRUCTION("62F3FD481B5C110401" , vextractf64x4(ptr(rcx, rdx, 0, 128), zmm3, 1)); TEST_INSTRUCTION("62F3FD481B5C110401" , vextractf64x4(ymmword_ptr(rcx, rdx, 0, 128), zmm3, 1)); - TEST_INSTRUCTION("C4E37D39D101" , vextracti128(xmm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(ptr(rcx, rdx, 0, 128), ymm3, 1)); - TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(xmmword_ptr(rcx, rdx, 0, 128), ymm3, 1)); TEST_INSTRUCTION("62F37D2839D101" , vextracti32x4(xmm1, ymm2, 1)); TEST_INSTRUCTION("62F37D4839D101" , vextracti32x4(xmm1, zmm2, 1)); TEST_INSTRUCTION("62F37D28395C110801" , vextracti32x4(ptr(rcx, rdx, 0, 128), ymm3, 1)); @@ -3819,9 +6022,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3FD483BD101" , vextracti64x4(ymm1, zmm2, 1)); TEST_INSTRUCTION("62F3FD483B5C110401" , vextracti64x4(ptr(rcx, rdx, 0, 128), zmm3, 1)); TEST_INSTRUCTION("62F3FD483B5C110401" , vextracti64x4(ymmword_ptr(rcx, rdx, 0, 128), zmm3, 1)); - TEST_INSTRUCTION("C4E37917D101" , vextractps(ecx, xmm2, 1)); - TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(dword_ptr(rcx, rdx, 0, 128), xmm3, 1)); TEST_INSTRUCTION("62F3ED0854CB01" , vfixupimmpd(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F3ED08544C2B0801" , vfixupimmpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED08544C2B0801" , vfixupimmpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); @@ -3846,562 +6046,114 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F36D0855CB01" , vfixupimmss(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08554C2B2001" , vfixupimmss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08554C2B2001" , vfixupimmss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E2E998CB" , vfmadd132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED98CB" , vfmadd132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED4898CB" , vfmadd132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48984C2B02" , vfmadd132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48984C2B02" , vfmadd132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26998CB" , vfmadd132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D98CB" , vfmadd132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4898CB" , vfmadd132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48984C2B02" , vfmadd132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48984C2B02" , vfmadd132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E999CB" , vfmadd132sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26999CB" , vfmadd132ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A8CB" , vfmadd213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA8CB" , vfmadd213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48A8CB" , vfmadd213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48A84C2B02" , vfmadd213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48A84C2B02" , vfmadd213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269A8CB" , vfmadd213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DA8CB" , vfmadd213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48A8CB" , vfmadd213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48A84C2B02" , vfmadd213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48A84C2B02" , vfmadd213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A9CB" , vfmadd213sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269A9CB" , vfmadd213ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B8CB" , vfmadd231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB8CB" , vfmadd231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48B8CB" , vfmadd231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48B84C2B02" , vfmadd231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48B84C2B02" , vfmadd231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269B8CB" , vfmadd231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DB8CB" , vfmadd231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48B8CB" , vfmadd231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48B84C2B02" , vfmadd231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48B84C2B02" , vfmadd231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B9CB" , vfmadd231sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269B9CB" , vfmadd231ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E3E969CC30" , vfmaddpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED69CC30" , vfmaddpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E968CC30" , vfmaddps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED68CC30" , vfmaddps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E96BCC30" , vfmaddsd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3E96ACC30" , vfmaddss(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E2E996CB" , vfmaddsub132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED96CB" , vfmaddsub132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED4896CB" , vfmaddsub132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48964C2B02" , vfmaddsub132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48964C2B02" , vfmaddsub132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26996CB" , vfmaddsub132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D96CB" , vfmaddsub132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4896CB" , vfmaddsub132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48964C2B02" , vfmaddsub132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48964C2B02" , vfmaddsub132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A6CB" , vfmaddsub213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA6CB" , vfmaddsub213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48A6CB" , vfmaddsub213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48A64C2B02" , vfmaddsub213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48A64C2B02" , vfmaddsub213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269A6CB" , vfmaddsub213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DA6CB" , vfmaddsub213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48A6CB" , vfmaddsub213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48A64C2B02" , vfmaddsub213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48A64C2B02" , vfmaddsub213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B6CB" , vfmaddsub231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB6CB" , vfmaddsub231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48B6CB" , vfmaddsub231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48B64C2B02" , vfmaddsub231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48B64C2B02" , vfmaddsub231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269B6CB" , vfmaddsub231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DB6CB" , vfmaddsub231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48B6CB" , vfmaddsub231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48B64C2B02" , vfmaddsub231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48B64C2B02" , vfmaddsub231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E3E95DCC30" , vfmaddsubpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED5DCC30" , vfmaddsubpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E95CCC30" , vfmaddsubps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED5CCC30" , vfmaddsubps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E2E99ACB" , vfmsub132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9ACB" , vfmsub132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED489ACB" , vfmsub132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED489A4C2B02" , vfmsub132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED489A4C2B02" , vfmsub132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699ACB" , vfmsub132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D9ACB" , vfmsub132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D489ACB" , vfmsub132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D489A4C2B02" , vfmsub132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D489A4C2B02" , vfmsub132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E99BCB" , vfmsub132sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699BCB" , vfmsub132ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AACB" , vfmsub213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAACB" , vfmsub213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48AACB" , vfmsub213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48AA4C2B02" , vfmsub213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48AA4C2B02" , vfmsub213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269AACB" , vfmsub213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DAACB" , vfmsub213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48AACB" , vfmsub213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48AA4C2B02" , vfmsub213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48AA4C2B02" , vfmsub213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9ABCB" , vfmsub213sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269ABCB" , vfmsub213ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BACB" , vfmsub231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBACB" , vfmsub231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48BACB" , vfmsub231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48BA4C2B02" , vfmsub231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48BA4C2B02" , vfmsub231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BACB" , vfmsub231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DBACB" , vfmsub231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48BACB" , vfmsub231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48BA4C2B02" , vfmsub231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48BA4C2B02" , vfmsub231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BBCB" , vfmsub231sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BBCB" , vfmsub231ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E997CB" , vfmsubadd132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED97CB" , vfmsubadd132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED4897CB" , vfmsubadd132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48974C2B02" , vfmsubadd132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48974C2B02" , vfmsubadd132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26997CB" , vfmsubadd132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D97CB" , vfmsubadd132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4897CB" , vfmsubadd132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48974C2B02" , vfmsubadd132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48974C2B02" , vfmsubadd132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A7CB" , vfmsubadd213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA7CB" , vfmsubadd213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("62F2ED48A7CB" , vfmsubadd213pd(zmm1, zmm2, zmm3)); - TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269A7CB" , vfmsubadd213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DA7CB" , vfmsubadd213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("62F2ED48A7CB" , vfmsubadd213pd(zmm1, zmm2, zmm3)); + TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48A7CB" , vfmsubadd213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48A74C2B02" , vfmsubadd213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48A74C2B02" , vfmsubadd213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B7CB" , vfmsubadd231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB7CB" , vfmsubadd231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48B7CB" , vfmsubadd231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48B74C2B02" , vfmsubadd231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48B74C2B02" , vfmsubadd231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269B7CB" , vfmsubadd231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DB7CB" , vfmsubadd231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48B7CB" , vfmsubadd231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48B74C2B02" , vfmsubadd231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48B74C2B02" , vfmsubadd231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E3E95FCC30" , vfmsubaddpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED5FCC30" , vfmsubaddpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E95ECC30" , vfmsubaddps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED5ECC30" , vfmsubaddps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E96DCC30" , vfmsubpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED6DCC30" , vfmsubpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E96CCC30" , vfmsubps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED6CCC30" , vfmsubps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E96FCC30" , vfmsubsd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3E96ECC30" , vfmsubss(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E2E99CCB" , vfnmadd132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9CCB" , vfnmadd132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED489CCB" , vfnmadd132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED489C4C2B02" , vfnmadd132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED489C4C2B02" , vfnmadd132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699CCB" , vfnmadd132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D9CCB" , vfnmadd132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D489CCB" , vfnmadd132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D489C4C2B02" , vfnmadd132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D489C4C2B02" , vfnmadd132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E99DCB" , vfnmadd132sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699DCB" , vfnmadd132ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9ACCB" , vfnmadd213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDACCB" , vfnmadd213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48ACCB" , vfnmadd213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48AC4C2B02" , vfnmadd213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48AC4C2B02" , vfnmadd213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269ACCB" , vfnmadd213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DACCB" , vfnmadd213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48ACCB" , vfnmadd213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48AC4C2B02" , vfnmadd213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48AC4C2B02" , vfnmadd213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9ADCB" , vfnmadd213sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269ADCB" , vfnmadd213ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BCCB" , vfnmadd231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBCCB" , vfnmadd231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48BCCB" , vfnmadd231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48BC4C2B02" , vfnmadd231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48BC4C2B02" , vfnmadd231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BCCB" , vfnmadd231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DBCCB" , vfnmadd231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48BCCB" , vfnmadd231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48BC4C2B02" , vfnmadd231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48BC4C2B02" , vfnmadd231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BDCB" , vfnmadd231sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BDCB" , vfnmadd231ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E3E979CC30" , vfnmaddpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED79CC30" , vfnmaddpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E978CC30" , vfnmaddps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED78CC30" , vfnmaddps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E97BCC30" , vfnmaddsd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3E97ACC30" , vfnmaddss(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E2E99ECB" , vfnmsub132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9ECB" , vfnmsub132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED489ECB" , vfnmsub132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED489E4C2B02" , vfnmsub132pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED489E4C2B02" , vfnmsub132pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699ECB" , vfnmsub132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D9ECB" , vfnmsub132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D489ECB" , vfnmsub132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D489E4C2B02" , vfnmsub132ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D489E4C2B02" , vfnmsub132ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E99FCB" , vfnmsub132sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699FCB" , vfnmsub132ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AECB" , vfnmsub213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAECB" , vfnmsub213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48AECB" , vfnmsub213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48AE4C2B02" , vfnmsub213pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48AE4C2B02" , vfnmsub213pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269AECB" , vfnmsub213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DAECB" , vfnmsub213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48AECB" , vfnmsub213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48AE4C2B02" , vfnmsub213ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48AE4C2B02" , vfnmsub213ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AFCB" , vfnmsub213sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269AFCB" , vfnmsub213ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BECB" , vfnmsub231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBECB" , vfnmsub231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48BECB" , vfnmsub231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48BE4C2B02" , vfnmsub231pd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48BE4C2B02" , vfnmsub231pd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BECB" , vfnmsub231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DBECB" , vfnmsub231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48BECB" , vfnmsub231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48BE4C2B02" , vfnmsub231ps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48BE4C2B02" , vfnmsub231ps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BFCB" , vfnmsub231sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BFCB" , vfnmsub231ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E3E97DCC30" , vfnmsubpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED7DCC30" , vfnmsubpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E97CCC30" , vfnmsubps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED7CCC30" , vfnmsubps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E97FCC30" , vfnmsubsd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, qword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3E97ECC30" , vfnmsubss(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, dword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6)); TEST_INSTRUCTION("62F3FD0866CA01" , vfpclasspd(k1, xmm2, 1)); TEST_INSTRUCTION("62F3FD2866CA01" , vfpclasspd(k1, ymm2, 1)); TEST_INSTRUCTION("62F3FD4866CA01" , vfpclasspd(k1, zmm2, 1)); @@ -4417,34 +6169,12 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3FD0867CA01" , vfpclasssd(k1, xmm2, 1)); TEST_INSTRUCTION("62F3FD08674C1A1001" , vfpclasssd(k1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F3FD08674C1A1001" , vfpclasssd(k1, qword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("62F37D0867CA01" , vfpclassss(k1, xmm2, 1)); - TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, dword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FE97881CA" , vfrczpd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97C81CA" , vfrczpd(ymm1, ymm2)); - TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97880CA" , vfrczps(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97C80CA" , vfrczps(ymm1, ymm2)); - TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97883CA" , vfrczsd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE97882CA" , vfrczss(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2D9928C1A80000000" , vgatherdpd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E2DD928C1A80000000" , vgatherdpd(ymm1, ptr(rdx, xmm3, 0, 128), ymm4)); + TEST_INSTRUCTION("62F37D0867CA01" , vfpclassss(k1, xmm2, 1)); + TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, ptr(rdx, rbx, 0, 128), 1)); + TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, dword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F2FD09924C1A10" , k(k1).vgatherdpd(xmm1, ptr(rdx, xmm3, 0, 128))); TEST_INSTRUCTION("62F2FD29924C1A10" , k(k1).vgatherdpd(ymm1, ptr(rdx, xmm3, 0, 128))); TEST_INSTRUCTION("62F2FD49924C1A10" , k(k1).vgatherdpd(zmm1, ptr(rdx, ymm3, 0, 128))); - TEST_INSTRUCTION("C4E259928C1A80000000" , vgatherdps(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E25D928C1A80000000" , vgatherdps(ymm1, ptr(rdx, ymm3, 0, 128), ymm4)); TEST_INSTRUCTION("62F27D09924C1A20" , k(k1).vgatherdps(xmm1, ptr(rdx, xmm3, 0, 128))); TEST_INSTRUCTION("62F27D29924C1A20" , k(k1).vgatherdps(ymm1, ptr(rdx, ymm3, 0, 128))); TEST_INSTRUCTION("62F27D49924C1A20" , k(k1).vgatherdps(zmm1, ptr(rdx, zmm3, 0, 128))); @@ -4456,13 +6186,9 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27D49C6541120" , k(k1).vgatherpf1dps(ptr(rcx, zmm2, 0, 128))); TEST_INSTRUCTION("62F2FD49C7541110" , k(k1).vgatherpf1qpd(ptr(rcx, zmm2, 0, 128))); TEST_INSTRUCTION("62F27D49C7541120" , k(k1).vgatherpf1qps(ptr(rcx, zmm2, 0, 128))); - TEST_INSTRUCTION("C4E2D9938C1A80000000" , vgatherqpd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E2DD938C1A80000000" , vgatherqpd(ymm1, ptr(rdx, ymm3, 0, 128), ymm4)); TEST_INSTRUCTION("62F2FD09934C1A10" , k(k1).vgatherqpd(xmm1, ptr(rdx, xmm3, 0, 128))); TEST_INSTRUCTION("62F2FD29934C1A10" , k(k1).vgatherqpd(ymm1, ptr(rdx, ymm3, 0, 128))); TEST_INSTRUCTION("62F2FD49934C1A10" , k(k1).vgatherqpd(zmm1, ptr(rdx, zmm3, 0, 128))); - TEST_INSTRUCTION("C4E259938C1A80000000" , vgatherqps(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E25D938C1A80000000" , vgatherqps(xmm1, ptr(rdx, ymm3, 0, 128), xmm4)); TEST_INSTRUCTION("62F27D09934C1A20" , k(k1).vgatherqps(xmm1, ptr(rdx, xmm3, 0, 128))); TEST_INSTRUCTION("62F27D29934C1A20" , k(k1).vgatherqps(xmm1, ptr(rdx, ymm3, 0, 128))); TEST_INSTRUCTION("62F27D49934C1A20" , k(k1).vgatherqps(ymm1, ptr(rdx, zmm3, 0, 128))); @@ -4514,60 +6240,15 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F36D0827CB01" , vgetmantss(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08274C2B2001" , vgetmantss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08274C2B2001" , vgetmantss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9CFCB01" , vgf2p8affineinvqb(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3EDCFCB01" , vgf2p8affineinvqb(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48CFCB01" , vgf2p8affineinvqb(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48CF4C2B0201" , vgf2p8affineinvqb(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48CF4C2B0201" , vgf2p8affineinvqb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9CECB01" , vgf2p8affineqb(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3EDCECB01" , vgf2p8affineqb(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48CECB01" , vgf2p8affineqb(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48CE4C2B0201" , vgf2p8affineqb(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48CE4C2B0201" , vgf2p8affineqb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E269CFCB" , vgf2p8mulb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DCFCB" , vgf2p8mulb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48CFCB" , vgf2p8mulb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48CF4C2B02" , vgf2p8mulb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48CF4C2B02" , vgf2p8mulb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E97CCB" , vhaddpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED7CCB" , vhaddpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB7CCB" , vhaddps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EF7CCB" , vhaddps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E97DCB" , vhsubpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED7DCB" , vhsubpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB7DCB" , vhsubps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EF7DCB" , vhsubps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E36D18CB01" , vinsertf128(ymm1, ymm2, xmm3, 1)); - TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D2818CB01" , vinsertf32x4(ymm1, ymm2, xmm3, 1)); TEST_INSTRUCTION("62F36D28184C2B0801" , vinsertf32x4(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D28184C2B0801" , vinsertf32x4(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); @@ -4586,9 +6267,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED481ACB01" , vinsertf64x4(zmm1, zmm2, ymm3, 1)); TEST_INSTRUCTION("62F3ED481A4C2B0401" , vinsertf64x4(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED481A4C2B0401" , vinsertf64x4(zmm1, zmm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D38CB01" , vinserti128(ymm1, ymm2, xmm3, 1)); - TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D2838CB01" , vinserti32x4(ymm1, ymm2, xmm3, 1)); TEST_INSTRUCTION("62F36D28384C2B0801" , vinserti32x4(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D28384C2B0801" , vinserti32x4(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); @@ -4607,136 +6285,31 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED483ACB01" , vinserti64x4(zmm1, zmm2, ymm3, 1)); TEST_INSTRUCTION("62F3ED483A4C2B0401" , vinserti64x4(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED483A4C2B0401" , vinserti64x4(zmm1, zmm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36921CB01" , vinsertps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(dword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, ptr(rdi))); - TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, xmmword_ptr(rdi))); - TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(ptr(rcx, rdx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ptr(rcx, rdx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(ptr(rcx, rdx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ptr(rcx, rdx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E95FCB" , vmaxpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED5FCB" , vmaxpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED485FCB" , vmaxpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED485F4C2B02" , vmaxpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED485F4C2B02" , vmaxpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E85FCB" , vmaxps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC5FCB" , vmaxps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C485FCB" , vmaxps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C485F4C2B02" , vmaxps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C485F4C2B02" , vmaxps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB5FCB" , vmaxsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5FCB" , vmaxss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E95DCB" , vminpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED5DCB" , vminpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED485DCB" , vminpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED485D4C2B02" , vminpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED485D4C2B02" , vminpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E85DCB" , vminps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC5DCB" , vminps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C485DCB" , vminps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C485D4C2B02" , vminps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C485D4C2B02" , vminps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB5DCB" , vminsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5DCB" , vminss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5F928CA" , vmovapd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FD28CA" , vmovapd(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ptr(rcx, rdx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); TEST_INSTRUCTION("62F1FD4828CA" , vmovapd(zmm1, zmm2)); TEST_INSTRUCTION("62F1FD48284C1A02" , vmovapd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD48284C1A02" , vmovapd(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD48295C1102" , vmovapd(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F1FD48295C1102" , vmovapd(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5F828CA" , vmovaps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FC28CA" , vmovaps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ptr(rcx, rdx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); TEST_INSTRUCTION("62F17C4828CA" , vmovaps(zmm1, zmm2)); TEST_INSTRUCTION("62F17C48284C1A02" , vmovaps(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C48284C1A02" , vmovaps(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C48295C1102" , vmovaps(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17C48295C1102" , vmovaps(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5F97ED1" , vmovd(ecx, xmm2)); - TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(dword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F96ECA" , vmovd(xmm1, edx)); - TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FB12CA" , vmovddup(xmm1, xmm2)); - TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FF12CA" , vmovddup(ymm1, ymm2)); - TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FF4812CA" , vmovddup(zmm1, zmm2)); TEST_INSTRUCTION("62F1FF48124C1A02" , vmovddup(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FF48124C1A02" , vmovddup(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F96FCA" , vmovdqa(xmm1, xmm2)); - TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FD6FCA" , vmovdqa(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ptr(rcx, rdx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); TEST_INSTRUCTION("62F17D086FCA" , vmovdqa32(xmm1, xmm2)); TEST_INSTRUCTION("62F17D086F4C1A08" , vmovdqa32(xmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17D086F4C1A08" , vmovdqa32(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); @@ -4767,16 +6340,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1FD486F4C1A02" , vmovdqa64(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD487F5C1102" , vmovdqa64(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F1FD487F5C1102" , vmovdqa64(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5FA6FCA" , vmovdqu(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FE6FCA" , vmovdqu(ymm1, ymm2)); - TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ptr(rcx, rdx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); TEST_INSTRUCTION("62F1FF086FCA" , vmovdqu16(xmm1, xmm2)); TEST_INSTRUCTION("62F1FF086F4C1A08" , vmovdqu16(xmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FF086F4C1A08" , vmovdqu16(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); @@ -4837,162 +6400,43 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F17F486F4C1A02" , vmovdqu8(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17F487F5C1102" , vmovdqu8(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17F487F5C1102" , vmovdqu8(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5E812CB" , vmovhlps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(qword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(qword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E816CB" , vmovlhps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(qword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(qword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5F950CA" , vmovmskpd(ecx, xmm2)); - TEST_INSTRUCTION("C5FD50CA" , vmovmskpd(ecx, ymm2)); - TEST_INSTRUCTION("C5F850CA" , vmovmskps(ecx, xmm2)); - TEST_INSTRUCTION("C5FC50CA" , vmovmskps(ecx, ymm2)); - TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ptr(rcx, rdx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); TEST_INSTRUCTION("62F17D48E75C1102" , vmovntdq(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17D48E75C1102" , vmovntdq(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D482A4C1A02" , vmovntdqa(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D482A4C1A02" , vmovntdqa(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ptr(rcx, rdx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); TEST_INSTRUCTION("62F1FD482B5C1102" , vmovntpd(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F1FD482B5C1102" , vmovntpd(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ptr(rcx, rdx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); TEST_INSTRUCTION("62F17C482B5C1102" , vmovntps(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17C482B5C1102" , vmovntps(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C4E1F97ED1" , vmovq(rcx, xmm2)); - TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(qword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C4E1F96ECA" , vmovq(xmm1, rdx)); - TEST_INSTRUCTION("C5FA7ECA" , vmovq(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(qword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5EB10CB" , vmovsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5FA16CA" , vmovshdup(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FE16CA" , vmovshdup(ymm1, ymm2)); - TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("62F17E4816CA" , vmovshdup(zmm1, zmm2)); - TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA12CA" , vmovsldup(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FE12CA" , vmovsldup(ymm1, ymm2)); - TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("62F17E4812CA" , vmovsldup(zmm1, zmm2)); - TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(dword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5EA10CB" , vmovss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F910CA" , vmovupd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FD10CA" , vmovupd(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ptr(rcx, rdx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); + TEST_INSTRUCTION("62F17E4816CA" , vmovshdup(zmm1, zmm2)); + TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("62F17E4812CA" , vmovsldup(zmm1, zmm2)); + TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD4810CA" , vmovupd(zmm1, zmm2)); TEST_INSTRUCTION("62F1FD48104C1A02" , vmovupd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD48104C1A02" , vmovupd(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5F810CA" , vmovups(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FC10CA" , vmovups(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ptr(rcx, rdx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ymmword_ptr(rcx, rdx, 0, 128), ymm3)); TEST_INSTRUCTION("62F17C4810CA" , vmovups(zmm1, zmm2)); TEST_INSTRUCTION("62F17C48104C1A02" , vmovups(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C48104C1A02" , vmovups(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C48115C1102" , vmovups(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17C48115C1102" , vmovups(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C4E36942CB01" , vmpsadbw(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D42CB01" , vmpsadbw(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E959CB" , vmulpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED59CB" , vmulpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED4859CB" , vmulpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48594C2B02" , vmulpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48594C2B02" , vmulpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E859CB" , vmulps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC59CB" , vmulps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C4859CB" , vmulps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48594C2B02" , vmulps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C48594C2B02" , vmulps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB59CB" , vmulsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA59CB" , vmulss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E956CB" , vorpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED56CB" , vorpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED4856CB" , vorpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48564C2B02" , vorpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48564C2B02" , vorpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E856CB" , vorps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC56CB" , vorps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C4856CB" , vorps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48564C2B02" , vorps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C48564C2B02" , vorps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -5018,21 +6462,9 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2791CCA" , vpabsb(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D1CCA" , vpabsb(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D481CCA" , vpabsb(zmm1, zmm2)); TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2791ECA" , vpabsd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D1ECA" , vpabsd(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D481ECA" , vpabsd(zmm1, zmm2)); TEST_INSTRUCTION("62F27D481E4C1A02" , vpabsd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D481E4C1A02" , vpabsd(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); @@ -5045,138 +6477,48 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD481FCA" , vpabsq(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD481F4C1A02" , vpabsq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD481F4C1A02" , vpabsq(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2791DCA" , vpabsw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D1DCA" , vpabsw(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D481DCA" , vpabsw(zmm1, zmm2)); TEST_INSTRUCTION("62F27D481D4C1A02" , vpabsw(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D481D4C1A02" , vpabsw(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5E96BCB" , vpackssdw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED6BCB" , vpackssdw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D486BCB" , vpackssdw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D486B4C2B02" , vpackssdw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D486B4C2B02" , vpackssdw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E963CB" , vpacksswb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED63CB" , vpacksswb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4863CB" , vpacksswb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48634C2B02" , vpacksswb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48634C2B02" , vpacksswb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2692BCB" , vpackusdw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D2BCB" , vpackusdw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D482BCB" , vpackusdw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D482B4C2B02" , vpackusdw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D482B4C2B02" , vpackusdw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E967CB" , vpackuswb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED67CB" , vpackuswb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4867CB" , vpackuswb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48674C2B02" , vpackuswb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48674C2B02" , vpackuswb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FCCB" , vpaddb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFCCB" , vpaddb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48FCCB" , vpaddb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48FC4C2B02" , vpaddb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48FC4C2B02" , vpaddb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FECB" , vpaddd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFECB" , vpaddd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48FECB" , vpaddd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48FE4C2B02" , vpaddd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48FE4C2B02" , vpaddd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D4CB" , vpaddq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD4CB" , vpaddq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48D4CB" , vpaddq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48D44C2B02" , vpaddq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48D44C2B02" , vpaddq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9ECCB" , vpaddsb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDECCB" , vpaddsb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48ECCB" , vpaddsb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48EC4C2B02" , vpaddsb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48EC4C2B02" , vpaddsb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9EDCB" , vpaddsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEDCB" , vpaddsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48EDCB" , vpaddsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48ED4C2B02" , vpaddsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48ED4C2B02" , vpaddsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DCCB" , vpaddusb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDCCB" , vpaddusb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48DCCB" , vpaddusb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DC4C2B02" , vpaddusb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48DC4C2B02" , vpaddusb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DDCB" , vpaddusw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDDCB" , vpaddusw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48DDCB" , vpaddusw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DD4C2B02" , vpaddusw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48DD4C2B02" , vpaddusw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FDCB" , vpaddw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFDCB" , vpaddw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48FDCB" , vpaddw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48FD4C2B02" , vpaddw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48FD4C2B02" , vpaddw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E3690FCB01" , vpalignr(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0FCB01" , vpalignr(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D480FCB01" , vpalignr(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F36D480F4C2B0201" , vpalignr(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D480F4C2B0201" , vpalignr(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9DBCB" , vpand(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDBCB" , vpand(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08DBCB" , vpandd(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08DB4C2B08" , vpandd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08DB4C2B08" , vpandd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -5186,12 +6528,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48DBCB" , vpandd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DB4C2B02" , vpandd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48DB4C2B02" , vpandd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DFCB" , vpandn(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDFCB" , vpandn(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08DFCB" , vpandnd(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08DF4C2B08" , vpandnd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08DF4C2B08" , vpandnd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -5219,30 +6555,12 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48DBCB" , vpandq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48DB4C2B02" , vpandq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48DB4C2B02" , vpandq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E0CB" , vpavgb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE0CB" , vpavgb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E0CB" , vpavgb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E04C2B02" , vpavgb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E04C2B02" , vpavgb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E3CB" , vpavgw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE3CB" , vpavgw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E3CB" , vpavgw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E34C2B02" , vpavgw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E34C2B02" , vpavgw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E36902CB01" , vpblendd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D02CB01" , vpblendd(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F26D0866CB" , vpblendmb(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D08664C2B08" , vpblendmb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D08664C2B08" , vpblendmb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -5279,38 +6597,14 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4866CB" , vpblendmw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48664C2B02" , vpblendmw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48664C2B02" , vpblendmw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E3694CCB40" , vpblendvb(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E36D4CCB40" , vpblendvb(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3690ECB01" , vpblendw(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0ECB01" , vpblendw(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F27D087ACA" , vpbroadcastb(xmm1, edx)); - TEST_INSTRUCTION("C4E27978CA" , vpbroadcastb(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, byte_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D287ACA" , vpbroadcastb(ymm1, edx)); - TEST_INSTRUCTION("C4E27D78CA" , vpbroadcastb(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, byte_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D487ACA" , vpbroadcastb(zmm1, edx)); TEST_INSTRUCTION("62F27D4878CA" , vpbroadcastb(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48788C1A80000000" , vpbroadcastb(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48788C1A80000000" , vpbroadcastb(zmm1, byte_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D087CCA" , vpbroadcastd(xmm1, edx)); - TEST_INSTRUCTION("C4E27958CA" , vpbroadcastd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D287CCA" , vpbroadcastd(ymm1, edx)); - TEST_INSTRUCTION("C4E27D58CA" , vpbroadcastd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D487CCA" , vpbroadcastd(zmm1, edx)); TEST_INSTRUCTION("62F27D4858CA" , vpbroadcastd(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48584C1A20" , vpbroadcastd(zmm1, ptr(rdx, rbx, 0, 128))); @@ -5322,48 +6616,20 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27E283ACA" , vpbroadcastmw2d(ymm1, k2)); TEST_INSTRUCTION("62F27E483ACA" , vpbroadcastmw2d(zmm1, k2)); TEST_INSTRUCTION("62F2FD087CCA" , vpbroadcastq(xmm1, rdx)); - TEST_INSTRUCTION("C4E27959CA" , vpbroadcastq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD287CCA" , vpbroadcastq(ymm1, rdx)); - TEST_INSTRUCTION("C4E27D59CA" , vpbroadcastq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD487CCA" , vpbroadcastq(zmm1, rdx)); TEST_INSTRUCTION("62F2FD4859CA" , vpbroadcastq(zmm1, xmm2)); TEST_INSTRUCTION("62F2FD48594C1A10" , vpbroadcastq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD48594C1A10" , vpbroadcastq(zmm1, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D087BCA" , vpbroadcastw(xmm1, edx)); - TEST_INSTRUCTION("C4E27979CA" , vpbroadcastw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, word_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D287BCA" , vpbroadcastw(ymm1, edx)); - TEST_INSTRUCTION("C4E27D79CA" , vpbroadcastw(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, word_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D487BCA" , vpbroadcastw(zmm1, edx)); TEST_INSTRUCTION("62F27D4879CA" , vpbroadcastw(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48794C1A40" , vpbroadcastw(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48794C1A40" , vpbroadcastw(zmm1, word_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E36944CB01" , vpclmulqdq(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D44CB01" , vpclmulqdq(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D4844CB01" , vpclmulqdq(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F36D48444C2B0201" , vpclmulqdq(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D48444C2B0201" , vpclmulqdq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868A2CB40" , vpcmov(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86CA2CB40" , vpcmov(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6)); - TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6)); TEST_INSTRUCTION("62F36D083FCB01" , vpcmpb(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D083F4C2B0801" , vpcmpb(k1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D083F4C2B0801" , vpcmpb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); @@ -5382,138 +6648,78 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F36D481FCB01" , vpcmpd(k1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F36D481F4C2B0201" , vpcmpd(k1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D481F4C2B0201" , vpcmpd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E974CB" , vpcmpeqb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D0874CB" , vpcmpeqb(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08744C2B08" , vpcmpeqb(k1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08744C2B08" , vpcmpeqb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED74CB" , vpcmpeqb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D2874CB" , vpcmpeqb(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28744C2B04" , vpcmpeqb(k1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D28744C2B04" , vpcmpeqb(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4874CB" , vpcmpeqb(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48744C2B02" , vpcmpeqb(k1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48744C2B02" , vpcmpeqb(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E976CB" , vpcmpeqd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D0876CB" , vpcmpeqd(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08764C2B08" , vpcmpeqd(k1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08764C2B08" , vpcmpeqd(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED76CB" , vpcmpeqd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D2876CB" , vpcmpeqd(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28764C2B04" , vpcmpeqd(k1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D28764C2B04" , vpcmpeqd(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4876CB" , vpcmpeqd(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48764C2B02" , vpcmpeqd(k1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48764C2B02" , vpcmpeqd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26929CB" , vpcmpeqq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED0829CB" , vpcmpeqq(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F2ED08294C2B08" , vpcmpeqq(k1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED08294C2B08" , vpcmpeqq(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D29CB" , vpcmpeqq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED2829CB" , vpcmpeqq(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F2ED28294C2B04" , vpcmpeqq(k1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED28294C2B04" , vpcmpeqq(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED4829CB" , vpcmpeqq(k1, zmm2, zmm3)); - TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E975CB" , vpcmpeqw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D0875CB" , vpcmpeqw(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08754C2B08" , vpcmpeqw(k1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08754C2B08" , vpcmpeqw(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED75CB" , vpcmpeqw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D2875CB" , vpcmpeqw(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4875CB" , vpcmpeqw(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E37961CA01" , vpcmpestri(xmm1, xmm2, 1, ecx, eax, edx)); - TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, ptr(rdx, rbx, 0, 128), 1, ecx, eax, edx)); - TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, ecx, eax, edx)); - TEST_INSTRUCTION("C4E37960CA01" , vpcmpestrm(xmm1, xmm2, 1, xmm0, eax, edx)); - TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, ptr(rdx, rbx, 0, 128), 1, xmm0, eax, edx)); - TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, xmm0, eax, edx)); - TEST_INSTRUCTION("C5E964CB" , vpcmpgtb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D0864CB" , vpcmpgtb(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08644C2B08" , vpcmpgtb(k1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08644C2B08" , vpcmpgtb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED64CB" , vpcmpgtb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D2864CB" , vpcmpgtb(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28644C2B04" , vpcmpgtb(k1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D28644C2B04" , vpcmpgtb(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4864CB" , vpcmpgtb(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48644C2B02" , vpcmpgtb(k1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48644C2B02" , vpcmpgtb(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E966CB" , vpcmpgtd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D0866CB" , vpcmpgtd(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08664C2B08" , vpcmpgtd(k1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08664C2B08" , vpcmpgtd(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED66CB" , vpcmpgtd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D2866CB" , vpcmpgtd(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28664C2B04" , vpcmpgtd(k1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D28664C2B04" , vpcmpgtd(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4866CB" , vpcmpgtd(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48664C2B02" , vpcmpgtd(k1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48664C2B02" , vpcmpgtd(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26937CB" , vpcmpgtq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED0837CB" , vpcmpgtq(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F2ED08374C2B08" , vpcmpgtq(k1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED08374C2B08" , vpcmpgtq(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D37CB" , vpcmpgtq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED2837CB" , vpcmpgtq(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F2ED28374C2B04" , vpcmpgtq(k1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED28374C2B04" , vpcmpgtq(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED4837CB" , vpcmpgtq(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48374C2B02" , vpcmpgtq(k1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48374C2B02" , vpcmpgtq(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E965CB" , vpcmpgtw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D0865CB" , vpcmpgtw(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08654C2B08" , vpcmpgtw(k1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08654C2B08" , vpcmpgtw(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED65CB" , vpcmpgtw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D2865CB" , vpcmpgtw(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28654C2B04" , vpcmpgtw(k1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D28654C2B04" , vpcmpgtw(k1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4865CB" , vpcmpgtw(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48654C2B02" , vpcmpgtw(k1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48654C2B02" , vpcmpgtw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E37963CA01" , vpcmpistri(xmm1, xmm2, 1, ecx)); - TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, ptr(rdx, rbx, 0, 128), 1, ecx)); - TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, ecx)); - TEST_INSTRUCTION("C4E37962CA01" , vpcmpistrm(xmm1, xmm2, 1, xmm0)); - TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, ptr(rdx, rbx, 0, 128), 1, xmm0)); - TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1, xmm0)); TEST_INSTRUCTION("62F3ED081FCB01" , vpcmpq(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F3ED081F4C2B0801" , vpcmpq(k1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED081F4C2B0801" , vpcmpq(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); @@ -5568,12 +6774,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED483FCB01" , vpcmpw(k1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED483F4C2B0201" , vpcmpw(k1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED483F4C2B0201" , vpcmpw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CCCB01" , vpcomb(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CECB01" , vpcomd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F27D0863D1" , vpcompressb(xmm1, xmm2)); TEST_INSTRUCTION("62F27D08639C1180000000" , vpcompressb(ptr(rcx, rdx, 0, 128), xmm3)); TEST_INSTRUCTION("62F27D08639C1180000000" , vpcompressb(xmmword_ptr(rcx, rdx, 0, 128), xmm3)); @@ -5610,24 +6810,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD4863D1" , vpcompressw(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD48635C1140" , vpcompressw(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F2FD48635C1140" , vpcompressw(zmmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("8FE868CFCB01" , vpcomq(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868ECCB01" , vpcomub(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EECB01" , vpcomud(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EFCB01" , vpcomuq(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EDCB01" , vpcomuw(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CDCB01" , vpcomw(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F27D08C4CA" , vpconflictd(xmm1, xmm2)); TEST_INSTRUCTION("62F27D08C44C1A08" , vpconflictd(xmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D08C44C1A08" , vpconflictd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); @@ -5682,12 +6864,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D4853CB" , vpdpwssds(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48534C2B02" , vpdpwssds(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48534C2B02" , vpdpwssds(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E36D06CB01" , vperm2f128(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D46CB01" , vperm2i128(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F26D088DCB" , vpermb(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D088D4C2B08" , vpermb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D088D4C2B08" , vpermb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -5697,9 +6873,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D488DCB" , vpermb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D488D4C2B02" , vpermb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D488D4C2B02" , vpermb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D36CB" , vpermd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4836CB" , vpermd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48364C2B02" , vpermd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48364C2B02" , vpermd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -5757,65 +6930,18 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4875CB" , vpermi2w(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48754C2B02" , vpermi2w(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48754C2B02" , vpermi2w(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E36949CB41" , vpermil2pd(xmm1, xmm2, xmm3, xmm4, 1)); - TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6, 1)); - TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6, 1)); - TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D49CB41" , vpermil2pd(ymm1, ymm2, ymm3, ymm4, 1)); - TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6, 1)); - TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6, 1)); - TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128), 1)); - TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128), 1)); - TEST_INSTRUCTION("C4E36948CB41" , vpermil2ps(xmm1, xmm2, xmm3, xmm4, 1)); - TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6, 1)); - TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6, 1)); - TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D48CB41" , vpermil2ps(ymm1, ymm2, ymm3, ymm4, 1)); - TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), ymm6, 1)); - TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), ymm6, 1)); - TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ptr(rbp, rsi, 0, 128), 1)); - TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ymmword_ptr(rbp, rsi, 0, 128), 1)); - TEST_INSTRUCTION("C4E2690DCB" , vpermilpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E37905CA01" , vpermilpd(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26D0DCB" , vpermilpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E37D05CA01" , vpermilpd(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F2ED480DCB" , vpermilpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F3FD4805CA01" , vpermilpd(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F2ED480D4C2B02" , vpermilpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED480D4C2B02" , vpermilpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F3FD48054C1A0201" , vpermilpd(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F3FD48054C1A0201" , vpermilpd(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E2690CCB" , vpermilps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E37904CA01" , vpermilps(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26D0CCB" , vpermilps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E37D04CA01" , vpermilps(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F26D480CCB" , vpermilps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F37D4804CA01" , vpermilps(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F26D480C4C2B02" , vpermilps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D480C4C2B02" , vpermilps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F37D48044C1A0201" , vpermilps(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F37D48044C1A0201" , vpermilps(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3FD01CA01" , vpermpd(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F2ED2816CB" , vpermpd(ymm1, ymm2, ymm3)); TEST_INSTRUCTION("62F2ED28164C2B04" , vpermpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED28164C2B04" , vpermpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); @@ -5825,15 +6951,9 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED48164C2B02" , vpermpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F3FD48014C1A0201" , vpermpd(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F3FD48014C1A0201" , vpermpd(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26D16CB" , vpermps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4816CB" , vpermps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48164C2B02" , vpermps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48164C2B02" , vpermps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E3FD00CA01" , vpermq(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F2ED2836CB" , vpermq(ymm1, ymm2, ymm3)); TEST_INSTRUCTION("62F2ED28364C2B04" , vpermq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED28364C2B04" , vpermq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); @@ -5941,135 +7061,19 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD28624C1A40" , vpexpandw(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD4862CA" , vpexpandw(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E37914D101" , vpextrb(ecx, xmm2, 1)); - TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(byte_ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E37916D101" , vpextrd(ecx, xmm2, 1)); - TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(dword_ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E3F916D101" , vpextrq(rcx, xmm2, 1)); - TEST_INSTRUCTION("C4E3F9169C118000000001" , vpextrq(ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E3F9169C118000000001" , vpextrq(qword_ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C5F9C5CA01" , vpextrw(ecx, xmm2, 1)); - TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(word_ptr(rcx, rdx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E259908C1A80000000" , vpgatherdd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E25D908C1A80000000" , vpgatherdd(ymm1, ptr(rdx, ymm3, 0, 128), ymm4)); - TEST_INSTRUCTION("62F27D09904C1A20" , k(k1).vpgatherdd(xmm1, ptr(rdx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F27D29904C1A20" , k(k1).vpgatherdd(ymm1, ptr(rdx, ymm3, 0, 128))); - TEST_INSTRUCTION("62F27D49904C1A20" , k(k1).vpgatherdd(zmm1, ptr(rdx, zmm3, 0, 128))); - TEST_INSTRUCTION("C4E2D9908C1A80000000" , vpgatherdq(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E2DD908C1A80000000" , vpgatherdq(ymm1, ptr(rdx, xmm3, 0, 128), ymm4)); - TEST_INSTRUCTION("62F2FD09904C1A10" , k(k1).vpgatherdq(xmm1, ptr(rdx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F2FD29904C1A10" , k(k1).vpgatherdq(ymm1, ptr(rdx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F2FD49904C1A10" , k(k1).vpgatherdq(zmm1, ptr(rdx, ymm3, 0, 128))); - TEST_INSTRUCTION("C4E259918C1A80000000" , vpgatherqd(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E25D918C1A80000000" , vpgatherqd(xmm1, ptr(rdx, ymm3, 0, 128), xmm4)); - TEST_INSTRUCTION("62F27D09914C1A20" , k(k1).vpgatherqd(xmm1, ptr(rdx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F27D29914C1A20" , k(k1).vpgatherqd(xmm1, ptr(rdx, ymm3, 0, 128))); - TEST_INSTRUCTION("62F27D49914C1A20" , k(k1).vpgatherqd(ymm1, ptr(rdx, zmm3, 0, 128))); - TEST_INSTRUCTION("C4E2D9918C1A80000000" , vpgatherqq(xmm1, ptr(rdx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E2DD918C1A80000000" , vpgatherqq(ymm1, ptr(rdx, ymm3, 0, 128), ymm4)); - TEST_INSTRUCTION("62F2FD09914C1A10" , k(k1).vpgatherqq(xmm1, ptr(rdx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F2FD29914C1A10" , k(k1).vpgatherqq(ymm1, ptr(rdx, ymm3, 0, 128))); - TEST_INSTRUCTION("62F2FD49914C1A10" , k(k1).vpgatherqq(zmm1, ptr(rdx, zmm3, 0, 128))); - TEST_INSTRUCTION("8FE978C2CA" , vphaddbd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978C3CA" , vphaddbq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978C1CA" , vphaddbw(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E26902CB" , vphaddd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D02CB" , vphaddd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE978CBCA" , vphadddq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E26903CB" , vphaddsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D03CB" , vphaddsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE978D2CA" , vphaddubd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978D3CA" , vphaddubq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978D1CA" , vphaddubw(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978DBCA" , vphaddudq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978D6CA" , vphadduwd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978D7CA" , vphadduwq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E26901CB" , vphaddw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D01CB" , vphaddw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE978C6CA" , vphaddwd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978C7CA" , vphaddwq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27941CA" , vphminposuw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978E1CA" , vphsubbw(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E26906CB" , vphsubd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D06CB" , vphsubd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE978E3CA" , vphsubdq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E26907CB" , vphsubsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D07CB" , vphsubsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26905CB" , vphsubw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D05CB" , vphsubw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE978E2CA" , vphsubwd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E36920CB01" , vpinsrb(xmm1, xmm2, ebx, 1)); - TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, byte_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36922CB01" , vpinsrd(xmm1, xmm2, ebx, 1)); - TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E922CB01" , vpinsrq(xmm1, xmm2, rbx, 1)); - TEST_INSTRUCTION("C4E3E9228C2B8000000001" , vpinsrq(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9228C2B8000000001" , vpinsrq(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C4CB01" , vpinsrw(xmm1, xmm2, ebx, 1)); - TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, word_ptr(rbx, rbp, 0, 128), 1)); + TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); + TEST_INSTRUCTION("62F27D09904C1A20" , k(k1).vpgatherdd(xmm1, ptr(rdx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F27D29904C1A20" , k(k1).vpgatherdd(ymm1, ptr(rdx, ymm3, 0, 128))); + TEST_INSTRUCTION("62F27D49904C1A20" , k(k1).vpgatherdd(zmm1, ptr(rdx, zmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD09904C1A10" , k(k1).vpgatherdq(xmm1, ptr(rdx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD29904C1A10" , k(k1).vpgatherdq(ymm1, ptr(rdx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD49904C1A10" , k(k1).vpgatherdq(zmm1, ptr(rdx, ymm3, 0, 128))); + TEST_INSTRUCTION("62F27D09914C1A20" , k(k1).vpgatherqd(xmm1, ptr(rdx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F27D29914C1A20" , k(k1).vpgatherqd(xmm1, ptr(rdx, ymm3, 0, 128))); + TEST_INSTRUCTION("62F27D49914C1A20" , k(k1).vpgatherqd(ymm1, ptr(rdx, zmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD09914C1A10" , k(k1).vpgatherqq(xmm1, ptr(rdx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD29914C1A10" , k(k1).vpgatherqq(ymm1, ptr(rdx, ymm3, 0, 128))); + TEST_INSTRUCTION("62F2FD49914C1A10" , k(k1).vpgatherqq(zmm1, ptr(rdx, zmm3, 0, 128))); TEST_INSTRUCTION("62F27D0844CA" , vplzcntd(xmm1, xmm2)); TEST_INSTRUCTION("62F27D08444C1A08" , vplzcntd(xmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D08444C1A08" , vplzcntd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); @@ -6088,42 +7092,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD4844CA" , vplzcntq(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD48444C1A02" , vplzcntq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD48444C1A02" , vplzcntq(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("8FE8689ECB40" , vpmacsdd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8689FCB40" , vpmacsdqh(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86897CB40" , vpmacsdql(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8688ECB40" , vpmacssdd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8688FCB40" , vpmacssdqh(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86887CB40" , vpmacssdql(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86886CB40" , vpmacsswd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86885CB40" , vpmacssww(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86896CB40" , vpmacswd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86895CB40" , vpmacsww(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868A6CB40" , vpmadcsswd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868B6CB40" , vpmadcswd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); TEST_INSTRUCTION("62F2ED08B5CB" , vpmadd52huq(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F2ED08B54C2B08" , vpmadd52huq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED08B54C2B08" , vpmadd52huq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -6142,55 +7110,15 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED48B4CB" , vpmadd52luq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48B44C2B02" , vpmadd52luq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48B44C2B02" , vpmadd52luq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26904CB" , vpmaddubsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D04CB" , vpmaddubsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4804CB" , vpmaddubsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48044C2B02" , vpmaddubsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48044C2B02" , vpmaddubsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F5CB" , vpmaddwd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF5CB" , vpmaddwd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48F5CB" , vpmaddwd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48F54C2B02" , vpmaddwd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48F54C2B02" , vpmaddwd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(ptr(rcx, rdx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ptr(rcx, rdx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(ptr(rcx, rdx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(xmmword_ptr(rcx, rdx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ptr(rcx, rdx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ymmword_ptr(rcx, rdx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693CCB" , vpmaxsb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3CCB" , vpmaxsb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483CCB" , vpmaxsb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483C4C2B02" , vpmaxsb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483C4C2B02" , vpmaxsb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693DCB" , vpmaxsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3DCB" , vpmaxsd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483DCB" , vpmaxsd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483D4C2B02" , vpmaxsd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483D4C2B02" , vpmaxsd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -6203,30 +7131,12 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED483DCB" , vpmaxsq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED483D4C2B02" , vpmaxsq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED483D4C2B02" , vpmaxsq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9EECB" , vpmaxsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEECB" , vpmaxsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48EECB" , vpmaxsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48EE4C2B02" , vpmaxsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48EE4C2B02" , vpmaxsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DECB" , vpmaxub(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDECB" , vpmaxub(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48DECB" , vpmaxub(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DE4C2B02" , vpmaxub(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48DE4C2B02" , vpmaxub(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693FCB" , vpmaxud(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3FCB" , vpmaxud(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483FCB" , vpmaxud(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483F4C2B02" , vpmaxud(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483F4C2B02" , vpmaxud(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -6239,30 +7149,12 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED483FCB" , vpmaxuq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED483F4C2B02" , vpmaxuq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED483F4C2B02" , vpmaxuq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693ECB" , vpmaxuw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3ECB" , vpmaxuw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483ECB" , vpmaxuw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483E4C2B02" , vpmaxuw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483E4C2B02" , vpmaxuw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26938CB" , vpminsb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D38CB" , vpminsb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4838CB" , vpminsb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48384C2B02" , vpminsb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48384C2B02" , vpminsb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26939CB" , vpminsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D39CB" , vpminsd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4839CB" , vpminsd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48394C2B02" , vpminsd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48394C2B02" , vpminsd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -6275,30 +7167,12 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4839CB" , vpminsq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48394C2B02" , vpminsq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48394C2B02" , vpminsq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9EACB" , vpminsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEACB" , vpminsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48EACB" , vpminsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48EA4C2B02" , vpminsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48EA4C2B02" , vpminsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DACB" , vpminub(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDACB" , vpminub(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48DACB" , vpminub(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DA4C2B02" , vpminub(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48DA4C2B02" , vpminub(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693BCB" , vpminud(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3BCB" , vpminud(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483BCB" , vpminud(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483B4C2B02" , vpminud(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483B4C2B02" , vpminud(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -6311,12 +7185,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED483BCB" , vpminuq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED483B4C2B02" , vpminuq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED483B4C2B02" , vpminuq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693ACB" , vpminuw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3ACB" , vpminuw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483ACB" , vpminuw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483A4C2B02" , vpminuw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D483A4C2B02" , vpminuw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -6356,8 +7224,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FE0828CA" , vpmovm2w(xmm1, k2)); TEST_INSTRUCTION("62F2FE2828CA" , vpmovm2w(ymm1, k2)); TEST_INSTRUCTION("62F2FE4828CA" , vpmovm2w(zmm1, k2)); - TEST_INSTRUCTION("C5F9D7CA" , vpmovmskb(ecx, xmm2)); - TEST_INSTRUCTION("C5FDD7CA" , vpmovmskb(ecx, ymm2)); TEST_INSTRUCTION("62F2FE0839CA" , vpmovq2m(k1, xmm2)); TEST_INSTRUCTION("62F2FE2839CA" , vpmovq2m(k1, ymm2)); TEST_INSTRUCTION("62F2FE4839CA" , vpmovq2m(k1, zmm2)); @@ -6442,57 +7308,21 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27E4820D1" , vpmovswb(ymm1, zmm2)); TEST_INSTRUCTION("62F27E48205C1104" , vpmovswb(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F27E48205C1104" , vpmovswb(ymmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C4E27921CA" , vpmovsxbd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D21CA" , vpmovsxbd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4821CA" , vpmovsxbd(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48214C1A08" , vpmovsxbd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48214C1A08" , vpmovsxbd(zmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27922CA" , vpmovsxbq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, word_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D22CA" , vpmovsxbq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4822CA" , vpmovsxbq(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48224C1A10" , vpmovsxbq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48224C1A10" , vpmovsxbq(zmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27920CA" , vpmovsxbw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D20CA" , vpmovsxbw(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4820CA" , vpmovsxbw(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48204C1A04" , vpmovsxbw(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48204C1A04" , vpmovsxbw(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27925CA" , vpmovsxdq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D25CA" , vpmovsxdq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4825CA" , vpmovsxdq(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48254C1A04" , vpmovsxdq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48254C1A04" , vpmovsxdq(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27923CA" , vpmovsxwd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D23CA" , vpmovsxwd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4823CA" , vpmovsxwd(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48234C1A04" , vpmovsxwd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48234C1A04" , vpmovsxwd(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27924CA" , vpmovsxwq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D24CA" , vpmovsxwq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4824CA" , vpmovsxwq(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48244C1A08" , vpmovsxwq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48244C1A08" , vpmovsxwq(zmm1, xmmword_ptr(rdx, rbx, 0, 128))); @@ -6562,102 +7392,36 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27E4830D1" , vpmovwb(ymm1, zmm2)); TEST_INSTRUCTION("62F27E48305C1104" , vpmovwb(ptr(rcx, rdx, 0, 128), zmm3)); TEST_INSTRUCTION("62F27E48305C1104" , vpmovwb(ymmword_ptr(rcx, rdx, 0, 128), zmm3)); - TEST_INSTRUCTION("C4E27931CA" , vpmovzxbd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D31CA" , vpmovzxbd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4831CA" , vpmovzxbd(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48314C1A08" , vpmovzxbd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48314C1A08" , vpmovzxbd(zmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27932CA" , vpmovzxbq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, word_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D32CA" , vpmovzxbq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, dword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4832CA" , vpmovzxbq(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48324C1A10" , vpmovzxbq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48324C1A10" , vpmovzxbq(zmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27930CA" , vpmovzxbw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D30CA" , vpmovzxbw(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4830CA" , vpmovzxbw(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48304C1A04" , vpmovzxbw(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48304C1A04" , vpmovzxbw(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27935CA" , vpmovzxdq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D35CA" , vpmovzxdq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4835CA" , vpmovzxdq(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48354C1A04" , vpmovzxdq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48354C1A04" , vpmovzxdq(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27933CA" , vpmovzxwd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D33CA" , vpmovzxwd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, xmmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4833CA" , vpmovzxwd(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48334C1A04" , vpmovzxwd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48334C1A04" , vpmovzxwd(zmm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27934CA" , vpmovzxwq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D34CA" , vpmovzxwq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, qword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D4834CA" , vpmovzxwq(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48344C1A08" , vpmovzxwq(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F27D48344C1A08" , vpmovzxwq(zmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E26928CB" , vpmuldq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D28CB" , vpmuldq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED4828CB" , vpmuldq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48284C2B02" , vpmuldq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48284C2B02" , vpmuldq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2690BCB" , vpmulhrsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D0BCB" , vpmulhrsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D480BCB" , vpmulhrsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E4CB" , vpmulhuw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE4CB" , vpmulhuw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E4CB" , vpmulhuw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E44C2B02" , vpmulhuw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E44C2B02" , vpmulhuw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E5CB" , vpmulhw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE5CB" , vpmulhw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("62F16D48E5CB" , vpmulhw(zmm1, zmm2, zmm3)); - TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26940CB" , vpmulld(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D40CB" , vpmulld(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("62F16D48E5CB" , vpmulhw(zmm1, zmm2, zmm3)); + TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); + TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4840CB" , vpmulld(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48404C2B02" , vpmulld(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48404C2B02" , vpmulld(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -6670,12 +7434,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4840CB" , vpmullq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48404C2B02" , vpmullq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48404C2B02" , vpmullq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D5CB" , vpmullw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD5CB" , vpmullw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48D5CB" , vpmullw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48D54C2B02" , vpmullw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48D54C2B02" , vpmullw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -6688,12 +7446,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4883CB" , vpmultishiftqb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48834C2B02" , vpmultishiftqb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48834C2B02" , vpmultishiftqb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F4CB" , vpmuludq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF4CB" , vpmuludq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48F4CB" , vpmuludq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48F44C2B02" , vpmuludq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48F44C2B02" , vpmuludq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -6733,12 +7485,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD4854CA" , vpopcntw(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD48544C1A02" , vpopcntw(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD48544C1A02" , vpopcntw(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5E9EBCB" , vpor(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEBCB" , vpor(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08EBCB" , vpord(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08EB4C2B08" , vpord(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08EB4C2B08" , vpord(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -6757,11 +7503,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48EBCB" , vporq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48EB4C2B02" , vporq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48EB4C2B02" , vporq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE868A3CB40" , vpperm(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, xmmword_ptr(rbp, rsi, 0, 128))); - TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, ptr(rbx, rbp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), xmm6)); TEST_INSTRUCTION("62F1750872CA01" , vprold(xmm1, xmm2, 1)); TEST_INSTRUCTION("62F17508724C1A0801" , vprold(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17508724C1A0801" , vprold(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); @@ -6834,44 +7575,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4814CB" , vprorvq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48144C2B02" , vprorvq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48144C2B02" , vprorvq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE96090CA" , vprotb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE878C0CA01" , vprotb(xmm1, xmm2, 1)); - TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FE96092CA" , vprotd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE878C2CA01" , vprotd(xmm1, xmm2, 1)); - TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FE96093CA" , vprotq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE878C3CA01" , vprotq(xmm1, xmm2, 1)); - TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FE96091CA" , vprotw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE878C1CA01" , vprotw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9F6CB" , vpsadbw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF6CB" , vpsadbw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48F6CB" , vpsadbw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48F64C2B02" , vpsadbw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48F64C2B02" , vpsadbw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -6887,36 +7590,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD09A15C1110" , k(k1).vpscatterqq(ptr(rcx, xmm2, 0, 128), xmm3)); TEST_INSTRUCTION("62F2FD29A15C1110" , k(k1).vpscatterqq(ptr(rcx, ymm2, 0, 128), ymm3)); TEST_INSTRUCTION("62F2FD49A15C1110" , k(k1).vpscatterqq(ptr(rcx, zmm2, 0, 128), zmm3)); - TEST_INSTRUCTION("8FE96098CA" , vpshab(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE9609ACA" , vpshad(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE9609BCA" , vpshaq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE96099CA" , vpshaw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE96094CA" , vpshlb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE96096CA" , vpshld(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); TEST_INSTRUCTION("62F36D0871CB01" , vpshldd(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08714C2B0801" , vpshldd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08714C2B0801" , vpshldd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); @@ -6971,16 +7644,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4870CB01" , vpshldw(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48704C2B0201" , vpshldw(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48704C2B0201" , vpshldw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("8FE96097CA" , vpshlq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE96095CA" , vpshlw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, ptr(rdx, rbx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4)); TEST_INSTRUCTION("62F36D0873CB01" , vpshrdd(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08734C2B0801" , vpshrdd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08734C2B0801" , vpshrdd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); @@ -7035,12 +7698,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4872CB01" , vpshrdw(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48724C2B0201" , vpshrdw(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48724C2B0201" , vpshrdw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E26900CB" , vpshufb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D00CB" , vpshufb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4800CB" , vpshufb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48004C2B02" , vpshufb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48004C2B02" , vpshufb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -7053,59 +7710,15 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D488FCB" , vpshufbitqmb(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D488F4C2B02" , vpshufbitqmb(k1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D488F4C2B02" , vpshufbitqmb(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5F970CA01" , vpshufd(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FD70CA01" , vpshufd(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17D4870CA01" , vpshufd(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17D48704C1A0201" , vpshufd(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17D48704C1A0201" , vpshufd(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FA70CA01" , vpshufhw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FE70CA01" , vpshufhw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17E4870CA01" , vpshufhw(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17E48704C1A0201" , vpshufhw(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17E48704C1A0201" , vpshufhw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FB70CA01" , vpshuflw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FF70CA01" , vpshuflw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17F4870CA01" , vpshuflw(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17F48704C1A0201" , vpshuflw(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17F48704C1A0201" , vpshuflw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26908CB" , vpsignb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D08CB" , vpsignb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2690ACB" , vpsignd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D0ACB" , vpsignd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26909CB" , vpsignw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D09CB" , vpsignw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F2CB" , vpslld(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F172F201" , vpslld(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF2CB" , vpslld(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F572F201" , vpslld(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1750872741A0801" , vpslld(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1750872741A0801" , vpslld(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1752872741A0401" , vpslld(ymm1, ptr(rdx, rbx, 0, 128), 1)); @@ -7116,23 +7729,13 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48F24C2B08" , vpslld(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1754872741A0201" , vpslld(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1754872741A0201" , vpslld(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5F173FA01" , vpslldq(xmm1, xmm2, 1)); TEST_INSTRUCTION("62F17508737C1A0801" , vpslldq(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17508737C1A0801" , vpslldq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5F573FA01" , vpslldq(ymm1, ymm2, 1)); TEST_INSTRUCTION("62F17528737C1A0401" , vpslldq(ymm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17528737C1A0401" , vpslldq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1754873FA01" , vpslldq(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17548737C1A0201" , vpslldq(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17548737C1A0201" , vpslldq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9F3CB" , vpsllq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F173F201" , vpsllq(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF3CB" , vpsllq(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F573F201" , vpsllq(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1F50873741A0801" , vpsllq(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1F50873741A0801" , vpsllq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1F52873741A0401" , vpsllq(ymm1, ptr(rdx, rbx, 0, 128), 1)); @@ -7143,21 +7746,9 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48F34C2B08" , vpsllq(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1F54873741A0201" , vpsllq(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1F54873741A0201" , vpsllq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26947CB" , vpsllvd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D47CB" , vpsllvd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4847CB" , vpsllvd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48474C2B02" , vpsllvd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48474C2B02" , vpsllvd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E947CB" , vpsllvq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED47CB" , vpsllvq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED4847CB" , vpsllvq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48474C2B02" , vpsllvq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48474C2B02" , vpsllvq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -7170,14 +7761,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4812CB" , vpsllvw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48124C2B02" , vpsllvw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48124C2B02" , vpsllvw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F1CB" , vpsllw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F171F201" , vpsllw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF1CB" , vpsllw(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F571F201" , vpsllw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1750871741A0801" , vpsllw(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1750871741A0801" , vpsllw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1752871741A0401" , vpsllw(ymm1, ptr(rdx, rbx, 0, 128), 1)); @@ -7188,14 +7771,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48F14C2B08" , vpsllw(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1754871741A0201" , vpsllw(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1754871741A0201" , vpsllw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9E2CB" , vpsrad(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F172E201" , vpsrad(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE2CB" , vpsrad(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F572E201" , vpsrad(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1750872641A0801" , vpsrad(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1750872641A0801" , vpsrad(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1752872641A0401" , vpsrad(ymm1, ptr(rdx, rbx, 0, 128), 1)); @@ -7224,12 +7799,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48E24C2B08" , vpsraq(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1F54872641A0201" , vpsraq(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1F54872641A0201" , vpsraq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26946CB" , vpsravd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D46CB" , vpsravd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4846CB" , vpsravd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48464C2B02" , vpsravd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48464C2B02" , vpsravd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -7251,14 +7820,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4811CB" , vpsravw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48114C2B02" , vpsravw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48114C2B02" , vpsravw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E1CB" , vpsraw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F171E201" , vpsraw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE1CB" , vpsraw(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F571E201" , vpsraw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1750871641A0801" , vpsraw(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1750871641A0801" , vpsraw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1752871641A0401" , vpsraw(ymm1, ptr(rdx, rbx, 0, 128), 1)); @@ -7269,14 +7830,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48E14C2B08" , vpsraw(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1754871641A0201" , vpsraw(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1754871641A0201" , vpsraw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9D2CB" , vpsrld(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F172D201" , vpsrld(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD2CB" , vpsrld(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F572D201" , vpsrld(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1750872541A0801" , vpsrld(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1750872541A0801" , vpsrld(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1752872541A0401" , vpsrld(ymm1, ptr(rdx, rbx, 0, 128), 1)); @@ -7287,23 +7840,13 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48D24C2B08" , vpsrld(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1754872541A0201" , vpsrld(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1754872541A0201" , vpsrld(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5F173DA01" , vpsrldq(xmm1, xmm2, 1)); TEST_INSTRUCTION("62F17508735C1A0801" , vpsrldq(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17508735C1A0801" , vpsrldq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5F573DA01" , vpsrldq(ymm1, ymm2, 1)); TEST_INSTRUCTION("62F17528735C1A0401" , vpsrldq(ymm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17528735C1A0401" , vpsrldq(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1754873DA01" , vpsrldq(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17548735C1A0201" , vpsrldq(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F17548735C1A0201" , vpsrldq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9D3CB" , vpsrlq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F173D201" , vpsrlq(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD3CB" , vpsrlq(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F573D201" , vpsrlq(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1F50873541A0801" , vpsrlq(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1F50873541A0801" , vpsrlq(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1F52873541A0401" , vpsrlq(ymm1, ptr(rdx, rbx, 0, 128), 1)); @@ -7314,21 +7857,9 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48D34C2B08" , vpsrlq(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1F54873541A0201" , vpsrlq(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1F54873541A0201" , vpsrlq(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26945CB" , vpsrlvd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D45CB" , vpsrlvd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D4845CB" , vpsrlvd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48454C2B02" , vpsrlvd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D48454C2B02" , vpsrlvd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E945CB" , vpsrlvq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED45CB" , vpsrlvq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED4845CB" , vpsrlvq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48454C2B02" , vpsrlvq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48454C2B02" , vpsrlvq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -7341,14 +7872,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4810CB" , vpsrlvw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48104C2B02" , vpsrlvw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED48104C2B02" , vpsrlvw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D1CB" , vpsrlw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F171D201" , vpsrlw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD1CB" , vpsrlw(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F571D201" , vpsrlw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1750871541A0801" , vpsrlw(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1750871541A0801" , vpsrlw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1752871541A0401" , vpsrlw(ymm1, ptr(rdx, rbx, 0, 128), 1)); @@ -7359,75 +7882,27 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48D14C2B08" , vpsrlw(zmm1, zmm2, xmmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1754871541A0201" , vpsrlw(zmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F1754871541A0201" , vpsrlw(zmm1, zmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9F8CB" , vpsubb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF8CB" , vpsubb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48F8CB" , vpsubb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48F84C2B02" , vpsubb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48F84C2B02" , vpsubb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FACB" , vpsubd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFACB" , vpsubd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48FACB" , vpsubd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48FA4C2B02" , vpsubd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48FA4C2B02" , vpsubd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FBCB" , vpsubq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFBCB" , vpsubq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48FBCB" , vpsubq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48FB4C2B02" , vpsubq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48FB4C2B02" , vpsubq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E8CB" , vpsubsb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE8CB" , vpsubsb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E8CB" , vpsubsb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E84C2B02" , vpsubsb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E84C2B02" , vpsubsb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E9CB" , vpsubsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE9CB" , vpsubsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E9CB" , vpsubsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E94C2B02" , vpsubsw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48E94C2B02" , vpsubsw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D8CB" , vpsubusb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD8CB" , vpsubusb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48D8CB" , vpsubusb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48D84C2B02" , vpsubusb(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48D84C2B02" , vpsubusb(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D9CB" , vpsubusw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD9CB" , vpsubusw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48D9CB" , vpsubusw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48D94C2B02" , vpsubusw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48D94C2B02" , vpsubusw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F9CB" , vpsubw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF9CB" , vpsubw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48F9CB" , vpsubw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48F94C2B02" , vpsubw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48F94C2B02" , vpsubw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); @@ -7449,12 +7924,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4825CB01" , vpternlogq(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48254C2B0201" , vpternlogq(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48254C2B0201" , vpternlogq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E27917CA" , vptest(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D17CA" , vptest(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F26D0826CB" , vptestmb(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D08264C2B08" , vptestmb(k1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D08264C2B08" , vptestmb(k1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -7527,84 +7996,30 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2EE4826CB" , vptestnmw(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F2EE48264C2B02" , vptestnmw(k1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2EE48264C2B02" , vptestnmw(k1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E968CB" , vpunpckhbw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED68CB" , vpunpckhbw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4868CB" , vpunpckhbw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48684C2B02" , vpunpckhbw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48684C2B02" , vpunpckhbw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E96ACB" , vpunpckhdq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED6ACB" , vpunpckhdq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D486ACB" , vpunpckhdq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D486A4C2B02" , vpunpckhdq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D486A4C2B02" , vpunpckhdq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E96DCB" , vpunpckhqdq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED6DCB" , vpunpckhqdq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED486DCB" , vpunpckhqdq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED486D4C2B02" , vpunpckhqdq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED486D4C2B02" , vpunpckhqdq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E969CB" , vpunpckhwd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED69CB" , vpunpckhwd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4869CB" , vpunpckhwd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48694C2B02" , vpunpckhwd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48694C2B02" , vpunpckhwd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E960CB" , vpunpcklbw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED60CB" , vpunpcklbw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4860CB" , vpunpcklbw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48604C2B02" , vpunpcklbw(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48604C2B02" , vpunpcklbw(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E962CB" , vpunpckldq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED62CB" , vpunpckldq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4862CB" , vpunpckldq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48624C2B02" , vpunpckldq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48624C2B02" , vpunpckldq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E96CCB" , vpunpcklqdq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED6CCB" , vpunpcklqdq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED486CCB" , vpunpcklqdq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED486C4C2B02" , vpunpcklqdq(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED486C4C2B02" , vpunpcklqdq(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E961CB" , vpunpcklwd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED61CB" , vpunpcklwd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D4861CB" , vpunpcklwd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48614C2B02" , vpunpcklwd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D48614C2B02" , vpunpcklwd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9EFCB" , vpxor(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEFCB" , vpxor(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08EFCB" , vpxord(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08EF4C2B08" , vpxord(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16D08EF4C2B08" , vpxord(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -7683,15 +8098,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D08CBCB" , vrcp28ss(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5F853CA" , vrcpps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC53CA" , vrcpps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5EA53CB" , vrcpss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F3FD0856CA01" , vreducepd(xmm1, xmm2, 1)); TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, ptr(rdx, rbx, 0, 128), 1)); TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); @@ -7740,24 +8146,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F36D080ACB01" , vrndscaless(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D080A4C2B2001" , vrndscaless(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F36D080A4C2B2001" , vrndscaless(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E37909CA01" , vroundpd(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D09CA01" , vroundpd(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37908CA01" , vroundps(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D08CA01" , vroundps(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ymmword_ptr(rdx, rbx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690BCB01" , vroundsd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690ACB01" , vroundss(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F2FD084ECA" , vrsqrt14pd(xmm1, xmm2)); TEST_INSTRUCTION("62F2FD084E4C1A08" , vrsqrt14pd(xmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F2FD084E4C1A08" , vrsqrt14pd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); @@ -7794,15 +8182,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D08CDCB" , vrsqrt28ss(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5F852CA" , vrsqrtps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC52CA" , vrsqrtps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5EA52CB" , vrsqrtss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED082CCB" , vscalefpd(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); @@ -7871,148 +8250,42 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4843CB01" , vshufi64x2(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48434C2B0201" , vshufi64x2(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48434C2B0201" , vshufi64x2(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C6CB01" , vshufpd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5EDC6CB01" , vshufpd(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED48C6CB01" , vshufpd(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F1ED48C64C2B0201" , vshufpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED48C64C2B0201" , vshufpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E8C6CB01" , vshufps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5ECC6CB01" , vshufps(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16C48C6CB01" , vshufps(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F16C48C64C2B0201" , vshufps(zmm1, zmm2, ptr(rbx, rbp, 0, 128), 1)); TEST_INSTRUCTION("62F16C48C64C2B0201" , vshufps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128), 1)); - TEST_INSTRUCTION("C5F951CA" , vsqrtpd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD51CA" , vsqrtpd(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD4851CA" , vsqrtpd(zmm1, zmm2)); TEST_INSTRUCTION("62F1FD48514C1A02" , vsqrtpd(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F1FD48514C1A02" , vsqrtpd(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F851CA" , vsqrtps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC51CA" , vsqrtps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C4851CA" , vsqrtps(zmm1, zmm2)); TEST_INSTRUCTION("62F17C48514C1A02" , vsqrtps(zmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("62F17C48514C1A02" , vsqrtps(zmm1, zmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5EB51CB" , vsqrtsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA51CB" , vsqrtss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(dword_ptr(rcx, rdx, 0, 128))); - TEST_INSTRUCTION("C5E95CCB" , vsubpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED5CCB" , vsubpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED485CCB" , vsubpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED485C4C2B02" , vsubpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED485C4C2B02" , vsubpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E85CCB" , vsubps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC5CCB" , vsubps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C485CCB" , vsubps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C485C4C2B02" , vsubps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C485C4C2B02" , vsubps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB5CCB" , vsubsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5CCB" , vsubss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C4E2790FCA" , vtestpd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D0FCA" , vtestpd(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2790ECA" , vtestps(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, xmmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D0ECA" , vtestps(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ymmword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F92ECA" , vucomisd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, qword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F82ECA" , vucomiss(xmm1, xmm2)); - TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, dword_ptr(rdx, rbx, 0, 128))); - TEST_INSTRUCTION("C5E915CB" , vunpckhpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED15CB" , vunpckhpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED4815CB" , vunpckhpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48154C2B02" , vunpckhpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48154C2B02" , vunpckhpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E815CB" , vunpckhps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC15CB" , vunpckhps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C4815CB" , vunpckhps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48154C2B02" , vunpckhps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C48154C2B02" , vunpckhps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E914CB" , vunpcklpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED14CB" , vunpcklpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED4814CB" , vunpcklpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48144C2B02" , vunpcklpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48144C2B02" , vunpcklpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E814CB" , vunpcklps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC14CB" , vunpcklps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C4814CB" , vunpcklps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48144C2B02" , vunpcklps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C48144C2B02" , vunpcklps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E957CB" , vxorpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED57CB" , vxorpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED4857CB" , vxorpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48574C2B02" , vxorpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F1ED48574C2B02" , vxorpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E857CB" , vxorps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC57CB" , vxorps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C4857CB" , vxorps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, ptr(rbx, rbp, 0, 128))); TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128))); - TEST_INSTRUCTION("C5FC77" , vzeroall()); - TEST_INSTRUCTION("C5F877" , vzeroupper()); } static void ASMJIT_NOINLINE testX64AssemblerAVX512_FP16(AssemblerTester& tester) noexcept { @@ -8040,8 +8313,10 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_FP16(AssemblerTester& tester) noexcept { +// Tests generated from 'llvm/test/MC/X86/intel-syntax-avx512.s' file to ensure compatibility with LLVM assembler. +// +// NOTE: Split to 4 functions as compilers can be really slow when compiling it for some reason. +static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM_1(AssemblerTester& tester) noexcept { using namespace x86; TEST_INSTRUCTION("62F174485808" , vaddps(zmm1, zmm1, zmmword_ptr(rax))); @@ -9801,6 +10076,11 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM(AssemblerTester& tester) noexcept { + using namespace x86; + TEST_INSTRUCTION("6212FD4842F1" , vgetexppd(zmm14, zmm25)); TEST_INSTRUCTION("6212FD4D42F1" , k(k5).vgetexppd(zmm14, zmm25)); TEST_INSTRUCTION("6212FDCD42F1" , k(k5).z().vgetexppd(zmm14, zmm25)); @@ -12841,6 +13121,11 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM(AssemblerTester& tester) noexcept { + using namespace x86; + TEST_INSTRUCTION("62E1A54858CA" , vaddpd(zmm17, zmm11, zmm2)); TEST_INSTRUCTION("62E1A54958CA" , k(k1).vaddpd(zmm17, zmm11, zmm2)); TEST_INSTRUCTION("62E1A5C958CA" , k(k1).z().vaddpd(zmm17, zmm11, zmm2)); @@ -15133,6 +15418,11 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM(AssemblerTester& tester) noexcept { + using namespace x86; + TEST_INSTRUCTION("62C23D4064FC" , vpblendmd(zmm23, zmm24, zmm12)); TEST_INSTRUCTION("62C23D4164FC" , k(k1).vpblendmd(zmm23, zmm24, zmm12)); TEST_INSTRUCTION("62C23DC164FC" , k(k1).z().vpblendmd(zmm23, zmm24, zmm12)); @@ -17631,7 +17921,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM(AssemblerTester& tester) noexcept { @@ -17641,11 +17930,14 @@ static void ASMJIT_NOINLINE testX64AssemblerAMX(AssemblerTester& TEST_INSTRUCTION("C4E27849841180000000" , ldtilecfg(zmmword_ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("C4E27949841180000000" , sttilecfg(ptr(rcx, rdx, 0, 128))); TEST_INSTRUCTION("C4E27949841180000000" , sttilecfg(zmmword_ptr(rcx, rdx, 0, 128))); + TEST_INSTRUCTION("C4E2616CCA" , tcmmimfp16ps(tmm1, tmm2, tmm3)); + TEST_INSTRUCTION("C4E2606CCA" , tcmmrlfp16ps(tmm1, tmm2, tmm3)); TEST_INSTRUCTION("C4E2625CCA" , tdpbf16ps(tmm1, tmm2, tmm3)); TEST_INSTRUCTION("C4E2635ECA" , tdpbssd(tmm1, tmm2, tmm3)); TEST_INSTRUCTION("C4E2625ECA" , tdpbsud(tmm1, tmm2, tmm3)); TEST_INSTRUCTION("C4E2615ECA" , tdpbusd(tmm1, tmm2, tmm3)); TEST_INSTRUCTION("C4E2605ECA" , tdpbuud(tmm1, tmm2, tmm3)); + TEST_INSTRUCTION("C4E2635CCA" , tdpfp16ps(tmm1, tmm2, tmm3)); TEST_INSTRUCTION("C4E27B4B8C1A80000000" , tileloadd(tmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("C4E2794B8C1A80000000" , tileloaddt1(tmm1, ptr(rdx, rbx, 0, 128))); TEST_INSTRUCTION("C4E27849C0" , tilerelease()); @@ -17799,10 +18091,6 @@ static void ASMJIT_NOINLINE testX64AssemblerExtras(AssemblerTester tester(Arch::kX64, settings); tester.printHeader("X64"); - TEST_INSTRUCTION("62919D18C2D2AB" , sae().vcmppd(k2, zmm12, zmm26, 171)); - testX64AssemblerBase(tester); + testX64AssemblerBaseExt(tester); testX64AssemblerMMX_SSE(tester); testX64AssemblerAVX(tester); + testX64AssemblerAVX_NE_CONVERT(tester); + testX64AssemblerAVX_VNNI(tester); + testX64AssemblerAVX_VNNI_INT8(tester); + testX64AssemblerAVX_VNNI_INT16(tester); + testX64AssemblerAVX_SHA512(tester); + testX64AssemblerAVX_SM3(tester); + testX64AssemblerAVX_SM4(tester); + testX64AssemblerFMA(tester); + testX64AssemblerFMA4(tester); + testX64AssemblerXOP(tester); + testX64AssemblerAVX512(tester); testX64AssemblerAVX512_FP16(tester); - testX64AssemblerAVX512_LLVM(tester); + testX64AssemblerAVX512_LLVM_1(tester); + testX64AssemblerAVX512_LLVM_2(tester); + testX64AssemblerAVX512_LLVM_3(tester); + testX64AssemblerAVX512_LLVM_4(tester); testX64AssemblerAMX(tester); testX64AssemblerExtras(tester); diff --git a/3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp b/3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp index a5ea03ae52556..6143d8cef914c 100644 --- a/3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp +++ b/3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp @@ -17,7 +17,10 @@ using namespace asmjit; #define TEST_INSTRUCTION(OPCODE, ...) \ - tester.testInstruction(OPCODE, #__VA_ARGS__, tester.assembler.__VA_ARGS__) + tester.testValidInstruction(#__VA_ARGS__, OPCODE, tester.assembler.__VA_ARGS__) + +#define FAIL_INSTRUCTION(ExpectedError, ...) \ + tester.testInvalidInstruction(#__VA_ARGS__, ExpectedError, tester.assembler.__VA_ARGS__) static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester& tester) noexcept { using namespace x86; @@ -55,9 +58,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("66138C1A80000000" , adc(cx, word_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("138C1A80000000" , adc(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("138C1A80000000" , adc(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F38F6CA" , adcx(ecx, edx)); - TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("80C101" , add(cl, 1)); TEST_INSTRUCTION("80C501" , add(ch, 1)); TEST_INSTRUCTION("8084118000000001" , add(byte_ptr(ecx, edx, 0, 128), 1)); @@ -116,60 +116,9 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("66238C1A80000000" , and_(cx, word_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("238C1A80000000" , and_(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("238C1A80000000" , and_(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E268F2CB" , andn(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, dword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("63D1" , arpl(cx, dx)); TEST_INSTRUCTION("639C1180000000" , arpl(ptr(ecx, edx, 0, 128), bx)); TEST_INSTRUCTION("639C1180000000" , arpl(word_ptr(ecx, edx, 0, 128), bx)); - TEST_INSTRUCTION("C4E260F7CA" , bextr(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, ptr(edx, ebx, 0, 128), esp)); - TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, dword_ptr(edx, ebx, 0, 128), esp)); - TEST_INSTRUCTION("8FE97001CA" , blcfill(ecx, edx)); - TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97002F2" , blci(ecx, edx)); - TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001EA" , blcic(ecx, edx)); - TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97002CA" , blcmsk(ecx, edx)); - TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001DA" , blcs(ecx, edx)); - TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001D2" , blsfill(ecx, edx)); - TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E270F3DA" , blsi(ecx, edx)); - TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001F2" , blsic(ecx, edx)); - TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E270F3D2" , blsmsk(ecx, edx)); - TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E270F3CA" , blsr(ecx, edx)); - TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30F1ACA" , bndcl(bnd1, edx)); - TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F20F1BCA" , bndcn(bnd1, edx)); - TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F20F1ACA" , bndcu(bnd1, edx)); - TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0F1A8C1A80000000" , bndldx(bnd1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30F1B8C1A80000000" , bndmk(bnd1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F1ACA" , bndmov(bnd1, bnd2)); - TEST_INSTRUCTION("660F1A8C1A80000000" , bndmov(bnd1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F1B9C1180000000" , bndmov(ptr(ecx, edx, 0, 128), bnd3)); - TEST_INSTRUCTION("0F1B9C1180000000" , bndstx(ptr(ecx, edx, 0, 128), bnd3)); TEST_INSTRUCTION("66628C1A80000000" , bound(cx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("66628C1A80000000" , bound(cx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("628C1A80000000" , bound(ecx, ptr(edx, ebx, 0, 128))); @@ -228,25 +177,11 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0FABD1" , bts(ecx, edx)); TEST_INSTRUCTION("0FAB9C1180000000" , bts(ptr(ecx, edx, 0, 128), ebx)); TEST_INSTRUCTION("0FAB9C1180000000" , bts(dword_ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("C4E260F5CA" , bzhi(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, ptr(edx, ebx, 0, 128), esp)); - TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, dword_ptr(edx, ebx, 0, 128), esp)); TEST_INSTRUCTION("6698" , cbw(ax)); TEST_INSTRUCTION("99" , cdq(edx, eax)); - TEST_INSTRUCTION("0F01CA" , clac()); TEST_INSTRUCTION("F8" , clc()); TEST_INSTRUCTION("FC" , cld()); - TEST_INSTRUCTION("0F1C841180000000" , cldemote(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0FAEBC1180000000" , clflush(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("660FAEBC1180000000" , clflushopt(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F01DD" , clgi()); TEST_INSTRUCTION("FA" , cli()); - TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(qword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F06" , clts()); - TEST_INSTRUCTION("660FAEB41180000000" , clwb(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F01FC" , clzero(ptr(eax))); - TEST_INSTRUCTION("0F01FC" , clzero(zmmword_ptr(eax))); TEST_INSTRUCTION("F5" , cmc()); TEST_INSTRUCTION("660F47CA" , cmova(cx, dx)); TEST_INSTRUCTION("660F478C1A80000000" , cmova(cx, ptr(edx, ebx, 0, 128))); @@ -477,13 +412,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0FC78C1180000000" , cmpxchg8b(ptr(ecx, edx, 0, 128), edx, eax, ecx, ebx)); TEST_INSTRUCTION("0FC78C1180000000" , cmpxchg8b(qword_ptr(ecx, edx, 0, 128), edx, eax, ecx, ebx)); TEST_INSTRUCTION("0FA2" , cpuid(eax, ebx, ecx, edx)); - TEST_INSTRUCTION("F20F38F0CA" , crc32(ecx, dl)); - TEST_INSTRUCTION("F20F38F0CE" , crc32(ecx, dh)); - TEST_INSTRUCTION("66F20F38F1CA" , crc32(ecx, dx)); - TEST_INSTRUCTION("F20F38F1CA" , crc32(ecx, edx)); - TEST_INSTRUCTION("F20F38F08C1A80000000" , crc32(ecx, byte_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("66F20F38F18C1A80000000" , crc32(ecx, word_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F20F38F18C1A80000000" , crc32(ecx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("6699" , cwd(dx, ax)); TEST_INSTRUCTION("98" , cwde(eax)); TEST_INSTRUCTION("27" , daa(ax)); @@ -505,18 +433,8 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("F7F1" , div(edx, eax, ecx)); TEST_INSTRUCTION("F7B41180000000" , div(edx, eax, ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("F7B41180000000" , div(edx, eax, dword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F77" , emms()); - TEST_INSTRUCTION("F30F1EFB" , endbr32()); - TEST_INSTRUCTION("F30F1EFA" , endbr64()); - TEST_INSTRUCTION("F20F38F88C1A80000000" , enqcmd(zmmword_ptr(ecx), zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30F38F88C1A80000000" , enqcmds(zmmword_ptr(ecx), zmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("C8010002" , enter(1, 2)); - TEST_INSTRUCTION("0FAE8C1180000000" , fxrstor(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0FAE841180000000" , fxsave(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("D9F4" , fxtract()); - TEST_INSTRUCTION("0F37" , getsec()); TEST_INSTRUCTION("F4" , hlt()); - TEST_INSTRUCTION("F30F3AF0C001" , hreset(1, eax)); TEST_INSTRUCTION("F6F9" , idiv(ax, cl)); TEST_INSTRUCTION("F6FD" , idiv(ax, ch)); TEST_INSTRUCTION("F6BC1180000000" , idiv(ax, ptr(ecx, edx, 0, 128))); @@ -545,9 +463,11 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("6BC901" , imul(ecx, 1)); TEST_INSTRUCTION("0FAF8C1A80000000" , imul(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("0FAF8C1A80000000" , imul(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("666BC901" , imul(cx, cx, 1)); TEST_INSTRUCTION("666BCA01" , imul(cx, dx, 1)); TEST_INSTRUCTION("666B8C1A8000000001" , imul(cx, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("666B8C1A8000000001" , imul(cx, word_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("6BC901" , imul(ecx, ecx, 1)); TEST_INSTRUCTION("6BCA01" , imul(ecx, edx, 1)); TEST_INSTRUCTION("6B8C1A8000000001" , imul(ecx, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("6B8C1A8000000001" , imul(ecx, dword_ptr(edx, ebx, 0, 128), 1)); @@ -564,7 +484,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("FE841180000000" , inc(byte_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("66FF841180000000" , inc(word_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("FF841180000000" , inc(dword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("F30FAEE9" , incsspd(ecx)); TEST_INSTRUCTION("6C" , ins(byte_ptr(edi), dx)); TEST_INSTRUCTION("666D" , ins(word_ptr(edi), dx)); TEST_INSTRUCTION("6D" , ins(dword_ptr(edi), dx)); @@ -572,14 +491,9 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("CC" , int3()); TEST_INSTRUCTION("CE" , into()); TEST_INSTRUCTION("0F08" , invd()); - TEST_INSTRUCTION("660F38808C1A80000000" , invept(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F38808C1A80000000" , invept(ecx, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("0F01BC1180000000" , invlpg(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F01DF" , invlpga(eax, ecx)); TEST_INSTRUCTION("660F38828C1A80000000" , invpcid(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("660F38828C1A80000000" , invpcid(ecx, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(ecx, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("66CF" , iret()); TEST_INSTRUCTION("CF" , iretd()); TEST_INSTRUCTION("9F" , lahf(ah)); @@ -593,8 +507,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("FF9C1180000000" , lcall(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("66FF9C1180000000" , lcall(dword_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("FF9C1180000000" , lcall(fword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(dword_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("66C58C1A80000000" , lds(cx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("66C58C1A80000000" , lds(cx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("C58C1A80000000" , lds(ecx, ptr(edx, ebx, 0, 128))); @@ -606,7 +518,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("66C48C1A80000000" , les(cx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("C48C1A80000000" , les(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("C48C1A80000000" , les(ecx, fword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0FAEE8" , lfence()); TEST_INSTRUCTION("660FB48C1A80000000" , lfs(cx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("660FB48C1A80000000" , lfs(cx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("0FB48C1A80000000" , lfs(ecx, ptr(edx, ebx, 0, 128))); @@ -624,7 +535,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0F00D1" , lldt(cx)); TEST_INSTRUCTION("0F00941180000000" , lldt(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F00941180000000" , lldt(word_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("8FE97812C1" , llwpcb(ecx)); TEST_INSTRUCTION("0F01F1" , lmsw(cx)); TEST_INSTRUCTION("0F01B41180000000" , lmsw(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F01B41180000000" , lmsw(word_ptr(ecx, edx, 0, 128))); @@ -647,22 +557,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0F00D9" , ltr(cx)); TEST_INSTRUCTION("0F009C1180000000" , ltr(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F009C1180000000" , ltr(word_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("8FEA7012C201000000" , lwpins(ecx, edx, 1)); - TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, dword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FEA7012CA01000000" , lwpval(ecx, edx, 1)); - TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, dword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("66F30FBDCA" , lzcnt(cx, dx)); - TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, word_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30FBDCA" , lzcnt(ecx, edx)); - TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30F01FA" , mcommit()); - TEST_INSTRUCTION("0FAEF0" , mfence()); - TEST_INSTRUCTION("0F01C8" , monitor(ptr(eax), ecx, edx)); - TEST_INSTRUCTION("0F01FA" , monitorx(ptr(eax), ecx, edx)); TEST_INSTRUCTION("88D1" , mov(cl, dl)); TEST_INSTRUCTION("88F1" , mov(cl, dh)); TEST_INSTRUCTION("88D5" , mov(ch, dl)); @@ -704,19 +598,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0F21D1" , mov(ecx, dr2)); TEST_INSTRUCTION("0F22CA" , mov(cr1, edx)); TEST_INSTRUCTION("0F23CA" , mov(dr1, edx)); - TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, word_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F38F19C1180000000" , movbe(ptr(ecx, edx, 0, 128), bx)); - TEST_INSTRUCTION("660F38F19C1180000000" , movbe(word_ptr(ecx, edx, 0, 128), bx)); - TEST_INSTRUCTION("0F38F19C1180000000" , movbe(ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("0F38F19C1180000000" , movbe(dword_ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("660F38F88C1A80000000" , movdir64b(zmmword_ptr(ecx), zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(dword_ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("0FC39C1180000000" , movnti(ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("0FC39C1180000000" , movnti(dword_ptr(ecx, edx, 0, 128), ebx)); TEST_INSTRUCTION("A4" , movs(byte_ptr(edi), byte_ptr(esi))); TEST_INSTRUCTION("66A5" , movs(word_ptr(edi), word_ptr(esi))); TEST_INSTRUCTION("A5" , movs(dword_ptr(edi), dword_ptr(esi))); @@ -746,11 +627,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("F7E1" , mul(edx, eax, ecx)); TEST_INSTRUCTION("F7A41180000000" , mul(edx, eax, ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("F7A41180000000" , mul(edx, eax, dword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("C4E26BF6CB" , mulx(ecx, edx, ebx, edx)); - TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, ptr(ebx, ebp, 0, 128), edx)); - TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, dword_ptr(ebx, ebp, 0, 128), edx)); - TEST_INSTRUCTION("0F01C9" , mwait(eax, ecx)); - TEST_INSTRUCTION("0F01FB" , mwaitx(eax, ecx, ebx)); TEST_INSTRUCTION("F6D9" , neg(cl)); TEST_INSTRUCTION("F6DD" , neg(ch)); TEST_INSTRUCTION("66F7D9" , neg(cx)); @@ -815,13 +691,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("666F" , outs(dx, word_ptr(esi))); TEST_INSTRUCTION("6F" , outs(dx, dword_ptr(esi))); TEST_INSTRUCTION("F390" , pause()); - TEST_INSTRUCTION("0F01C5" , pconfig()); - TEST_INSTRUCTION("C4E26BF5CB" , pdep(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26AF5CB" , pext(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, dword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("6659" , pop(cx)); TEST_INSTRUCTION("668F841180000000" , pop(word_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("59" , pop(ecx)); @@ -829,24 +698,8 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0FA1" , pop(fs)); TEST_INSTRUCTION("6661" , popa()); TEST_INSTRUCTION("61" , popad()); - TEST_INSTRUCTION("66F30FB8CA" , popcnt(cx, dx)); - TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, word_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30FB8CA" , popcnt(ecx, edx)); - TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("669D" , popf()); TEST_INSTRUCTION("9D" , popfd()); - TEST_INSTRUCTION("0F0D841180000000" , prefetch(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F18841180000000" , prefetchnta(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F188C1180000000" , prefetcht0(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F18941180000000" , prefetcht1(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F189C1180000000" , prefetcht2(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F0D8C1180000000" , prefetchw(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F0D941180000000" , prefetchwt1(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("F30FAEE1" , ptwrite(ecx)); - TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(dword_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("6651" , push(cx)); TEST_INSTRUCTION("6A01" , push(1)); TEST_INSTRUCTION("66FFB41180000000" , push(word_ptr(ecx, edx, 0, 128))); @@ -857,7 +710,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("60" , pushad()); TEST_INSTRUCTION("669C" , pushf()); TEST_INSTRUCTION("9C" , pushfd()); - TEST_INSTRUCTION("F20F01FF" , pvalidate()); TEST_INSTRUCTION("D2D1" , rcl(cl, cl)); TEST_INSTRUCTION("D0D1" , rcl(cl, 1)); TEST_INSTRUCTION("D2D5" , rcl(ch, cl)); @@ -887,17 +739,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("D39C1180000000" , rcr(dword_ptr(ecx, edx, 0, 128), cl)); TEST_INSTRUCTION("D19C1180000000" , rcr(dword_ptr(ecx, edx, 0, 128), 1)); TEST_INSTRUCTION("0F32" , rdmsr(edx, eax, ecx)); - TEST_INSTRUCTION("F30FC7F9" , rdpid(ecx)); - TEST_INSTRUCTION("0F01EE" , rdpkru(edx, eax, ecx)); - TEST_INSTRUCTION("0F33" , rdpmc(edx, eax, ecx)); - TEST_INSTRUCTION("0F01FD" , rdpru(edx, eax, ecx)); - TEST_INSTRUCTION("660FC7F1" , rdrand(cx)); - TEST_INSTRUCTION("0FC7F1" , rdrand(ecx)); - TEST_INSTRUCTION("660FC7F9" , rdseed(cx)); - TEST_INSTRUCTION("0FC7F9" , rdseed(ecx)); - TEST_INSTRUCTION("F30F1EC9" , rdsspd(ecx)); - TEST_INSTRUCTION("0F31" , rdtsc(edx, eax)); - TEST_INSTRUCTION("0F01F9" , rdtscp(edx, eax, ecx)); TEST_INSTRUCTION("C3" , ret()); TEST_INSTRUCTION("C20100" , ret(1)); TEST_INSTRUCTION("CB" , retf()); @@ -930,12 +771,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("66D18C1180000000" , ror(word_ptr(ecx, edx, 0, 128), 1)); TEST_INSTRUCTION("D38C1180000000" , ror(dword_ptr(ecx, edx, 0, 128), cl)); TEST_INSTRUCTION("D18C1180000000" , ror(dword_ptr(ecx, edx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37BF0CA01" , rorx(ecx, edx, 1)); - TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, dword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("0FAA" , rsm()); - TEST_INSTRUCTION("F30F01AC1180000000" , rstorssp(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("F30F01AC1180000000" , rstorssp(qword_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("9E" , sahf(ah)); TEST_INSTRUCTION("D2E1" , sal(cl, cl)); TEST_INSTRUCTION("D0E1" , sal(cl, 1)); @@ -965,10 +800,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("66D1BC1180000000" , sar(word_ptr(ecx, edx, 0, 128), 1)); TEST_INSTRUCTION("D3BC1180000000" , sar(dword_ptr(ecx, edx, 0, 128), cl)); TEST_INSTRUCTION("D1BC1180000000" , sar(dword_ptr(ecx, edx, 0, 128), 1)); - TEST_INSTRUCTION("C4E262F7CA" , sarx(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, ptr(edx, ebx, 0, 128), esp)); - TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, dword_ptr(edx, ebx, 0, 128), esp)); - TEST_INSTRUCTION("F30F01EA" , saveprevssp()); TEST_INSTRUCTION("80D901" , sbb(cl, 1)); TEST_INSTRUCTION("80DD01" , sbb(ch, 1)); TEST_INSTRUCTION("809C118000000001" , sbb(byte_ptr(ecx, edx, 0, 128), 1)); @@ -1004,7 +835,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("66AF" , scas(ax, word_ptr(edi))); TEST_INSTRUCTION("AF" , scas(eax, ptr(edi))); TEST_INSTRUCTION("AF" , scas(eax, dword_ptr(edi))); - TEST_INSTRUCTION("0F01E8" , serialize()); TEST_INSTRUCTION("0F97C1" , seta(cl)); TEST_INSTRUCTION("0F97C5" , seta(ch)); TEST_INSTRUCTION("0F97841180000000" , seta(ptr(ecx, edx, 0, 128))); @@ -1121,12 +951,10 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0F98C5" , sets(ch)); TEST_INSTRUCTION("0F98841180000000" , sets(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F98841180000000" , sets(byte_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("F30F01E8" , setssbsy()); TEST_INSTRUCTION("0F94C1" , setz(cl)); TEST_INSTRUCTION("0F94C5" , setz(ch)); TEST_INSTRUCTION("0F94841180000000" , setz(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F94841180000000" , setz(byte_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0FAEF8" , sfence()); TEST_INSTRUCTION("0F01841180000000" , sgdt(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("D2E1" , shl(cl, cl)); TEST_INSTRUCTION("D0E1" , shl(cl, 1)); @@ -1154,9 +982,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0FA49C118000000001" , shld(ptr(ecx, edx, 0, 128), ebx, 1)); TEST_INSTRUCTION("0FA59C1180000000" , shld(dword_ptr(ecx, edx, 0, 128), ebx, cl)); TEST_INSTRUCTION("0FA49C118000000001" , shld(dword_ptr(ecx, edx, 0, 128), ebx, 1)); - TEST_INSTRUCTION("C4E261F7CA" , shlx(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, ptr(edx, ebx, 0, 128), esp)); - TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, dword_ptr(edx, ebx, 0, 128), esp)); TEST_INSTRUCTION("D2E9" , shr(cl, cl)); TEST_INSTRUCTION("D0E9" , shr(cl, 1)); TEST_INSTRUCTION("D2ED" , shr(ch, cl)); @@ -1183,27 +1008,18 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0FAC9C118000000001" , shrd(ptr(ecx, edx, 0, 128), ebx, 1)); TEST_INSTRUCTION("0FAD9C1180000000" , shrd(dword_ptr(ecx, edx, 0, 128), ebx, cl)); TEST_INSTRUCTION("0FAC9C118000000001" , shrd(dword_ptr(ecx, edx, 0, 128), ebx, 1)); - TEST_INSTRUCTION("C4E263F7CA" , shrx(ecx, edx, ebx)); - TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, ptr(edx, ebx, 0, 128), esp)); - TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, dword_ptr(edx, ebx, 0, 128), esp)); TEST_INSTRUCTION("0F018C1180000000" , sidt(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F01DE" , skinit(eax)); TEST_INSTRUCTION("660F00C1" , sldt(cx)); TEST_INSTRUCTION("0F00C1" , sldt(ecx)); TEST_INSTRUCTION("0F00841180000000" , sldt(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F00841180000000" , sldt(word_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("8FE97812C9" , slwpcb(ecx)); TEST_INSTRUCTION("660F01E1" , smsw(cx)); TEST_INSTRUCTION("0F01E1" , smsw(ecx)); TEST_INSTRUCTION("0F01A41180000000" , smsw(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F01A41180000000" , smsw(word_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F01CB" , stac()); TEST_INSTRUCTION("F9" , stc()); TEST_INSTRUCTION("FD" , std()); - TEST_INSTRUCTION("0F01DC" , stgi()); TEST_INSTRUCTION("FB" , sti()); - TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(dword_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("AA" , stos(ptr(edi), al)); TEST_INSTRUCTION("AA" , stos(byte_ptr(edi), al)); TEST_INSTRUCTION("66AB" , stos(ptr(edi), ax)); @@ -1243,11 +1059,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("662B8C1A80000000" , sub(cx, word_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("2B8C1A80000000" , sub(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("2B8C1A80000000" , sub(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0F34" , sysenter()); - TEST_INSTRUCTION("0F35" , sysexit()); - TEST_INSTRUCTION("8FE97001FA" , t1mskc(ecx, edx)); - TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("F6C101" , test(cl, 1)); TEST_INSTRUCTION("F6C501" , test(ch, 1)); TEST_INSTRUCTION("F684118000000001" , test(byte_ptr(ecx, edx, 0, 128), 1)); @@ -1269,16 +1080,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("85D1" , test(ecx, edx)); TEST_INSTRUCTION("859C1180000000" , test(ptr(ecx, edx, 0, 128), ebx)); TEST_INSTRUCTION("859C1180000000" , test(dword_ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("660FAEF1" , tpause(ecx, edx, eax)); - TEST_INSTRUCTION("66F30FBCCA" , tzcnt(cx, dx)); - TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, word_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30FBCCA" , tzcnt(ecx, edx)); - TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001E2" , tzmsk(ecx, edx)); - TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("0FFFCA" , ud0(ecx, edx)); TEST_INSTRUCTION("0FFF8C1A80000000" , ud0(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("0FFF8C1A80000000" , ud0(ecx, dword_ptr(edx, ebx, 0, 128))); @@ -1286,45 +1087,14 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("0FB98C1A80000000" , ud1(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("0FB98C1A80000000" , ud1(ecx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("0F0B" , ud2()); - TEST_INSTRUCTION("F30FAEF1" , umonitor(ptr(ecx))); - TEST_INSTRUCTION("F20FAEF1" , umwait(ecx, edx, eax)); TEST_INSTRUCTION("0F00E1" , verr(cx)); TEST_INSTRUCTION("0F00A41180000000" , verr(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F00A41180000000" , verr(word_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F00E9" , verw(cx)); TEST_INSTRUCTION("0F00AC1180000000" , verw(ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F00AC1180000000" , verw(word_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F01C1" , vmcall()); - TEST_INSTRUCTION("660FC7B41180000000" , vmclear(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("660FC7B41180000000" , vmclear(qword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F01D4" , vmfunc()); - TEST_INSTRUCTION("0F01C2" , vmlaunch()); - TEST_INSTRUCTION("0F01DA" , vmload(eax)); - TEST_INSTRUCTION("0F01D9" , vmmcall()); - TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(qword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(qword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("0F78D1" , vmread(ecx, edx)); - TEST_INSTRUCTION("0F789C1180000000" , vmread(ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("0F789C1180000000" , vmread(dword_ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("0F01C3" , vmresume()); - TEST_INSTRUCTION("0F01D8" , vmrun(eax)); - TEST_INSTRUCTION("0F01DB" , vmsave(eax)); - TEST_INSTRUCTION("0F79CA" , vmwrite(ecx, edx)); - TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(qword_ptr(ecx, edx, 0, 128))); TEST_INSTRUCTION("0F09" , wbinvd()); - TEST_INSTRUCTION("F30F09" , wbnoinvd()); TEST_INSTRUCTION("0F30" , wrmsr(edx, eax, ecx)); - TEST_INSTRUCTION("0F38F6D1" , wrssd(ecx, edx)); - TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(dword_ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("660F38F5D1" , wrussd(ecx, edx)); - TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(ptr(ecx, edx, 0, 128), ebx)); - TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(dword_ptr(ecx, edx, 0, 128), ebx)); TEST_INSTRUCTION("C6F801" , xabort(1)); TEST_INSTRUCTION("0FC0D1" , xadd(cl, dl)); TEST_INSTRUCTION("0FC0F1" , xadd(cl, dh)); @@ -1362,8 +1132,6 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("66878C1A80000000" , xchg(cx, word_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("878C1A80000000" , xchg(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("878C1A80000000" , xchg(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0F01D5" , xend()); - TEST_INSTRUCTION("0F01D0" , xgetbv(edx, eax, ecx)); TEST_INSTRUCTION("D7" , xlatb()); TEST_INSTRUCTION("80F101" , xor_(cl, 1)); TEST_INSTRUCTION("80F501" , xor_(ch, 1)); @@ -1394,28 +1162,308 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester TEST_INSTRUCTION("66338C1A80000000" , xor_(cx, word_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("338C1A80000000" , xor_(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("338C1A80000000" , xor_(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F20F01E9" , xresldtrk()); - TEST_INSTRUCTION("0FAEAC1180000000" , xrstor(ptr(ecx, edx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FC79C1180000000" , xrstors(ptr(ecx, edx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FAEA41180000000" , xsave(ptr(ecx, edx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FC7A41180000000" , xsavec(ptr(ecx, edx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FAEB41180000000" , xsaveopt(ptr(ecx, edx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0FC7AC1180000000" , xsaves(ptr(ecx, edx, 0, 128), edx, eax)); - TEST_INSTRUCTION("0F01D1" , xsetbv(edx, eax, ecx)); - TEST_INSTRUCTION("F20F01E8" , xsusldtrk()); - TEST_INSTRUCTION("0F01D6" , xtest()); } -static void ASMJIT_NOINLINE testX86AssemblerMMX_SSE(AssemblerTester& tester) noexcept { +static void ASMJIT_NOINLINE testX86AssemblerBaseExt(AssemblerTester& tester) noexcept { using namespace x86; - TEST_INSTRUCTION("660F58CA" , addpd(xmm1, xmm2)); - TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0F58CA" , addps(xmm1, xmm2)); - TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("F20F58CA" , addsd(xmm1, xmm2)); + TEST_INSTRUCTION("0F38FC9C1180000000" , aadd(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("0F38FC9C1180000000" , aadd(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("660F38FC9C1180000000" , aand(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("660F38FC9C1180000000" , aand(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("660F38F6CA" , adcx(ecx, edx)); + TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("660F38F68C1A80000000" , adcx(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E268F2CB" , andn(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E268F28C2B80000000" , andn(ecx, edx, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("F20F38FC9C1180000000" , aor(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("F20F38FC9C1180000000" , aor(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("F30F38FC9C1180000000" , axor(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("F30F38FC9C1180000000" , axor(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("C4E260F7CA" , bextr(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("C4E258F78C1A80000000" , bextr(ecx, dword_ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("8FE97001CA" , blcfill(ecx, edx)); + TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE970018C1A80000000" , blcfill(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97002F2" , blci(ecx, edx)); + TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97002B41A80000000" , blci(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001EA" , blcic(ecx, edx)); + TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001AC1A80000000" , blcic(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97002CA" , blcmsk(ecx, edx)); + TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE970028C1A80000000" , blcmsk(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001DA" , blcs(ecx, edx)); + TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE970019C1A80000000" , blcs(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001D2" , blsfill(ecx, edx)); + TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001941A80000000" , blsfill(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E270F3DA" , blsi(ecx, edx)); + TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E270F39C1A80000000" , blsi(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001F2" , blsic(ecx, edx)); + TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001B41A80000000" , blsic(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E270F3D2" , blsmsk(ecx, edx)); + TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E270F3941A80000000" , blsmsk(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E270F3CA" , blsr(ecx, edx)); + TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E270F38C1A80000000" , blsr(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30F1ACA" , bndcl(bnd1, edx)); + TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30F1A8C1A80000000" , bndcl(bnd1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F20F1BCA" , bndcn(bnd1, edx)); + TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F20F1B8C1A80000000" , bndcn(bnd1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F20F1ACA" , bndcu(bnd1, edx)); + TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F20F1A8C1A80000000" , bndcu(bnd1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F1A8C1A80000000" , bndldx(bnd1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30F1B8C1A80000000" , bndmk(bnd1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("660F1ACA" , bndmov(bnd1, bnd2)); + TEST_INSTRUCTION("660F1A8C1A80000000" , bndmov(bnd1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("660F1B9C1180000000" , bndmov(ptr(ecx, edx, 0, 128), bnd3)); + TEST_INSTRUCTION("0F1B9C1180000000" , bndstx(ptr(ecx, edx, 0, 128), bnd3)); + TEST_INSTRUCTION("C4E260F5CA" , bzhi(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("C4E258F58C1A80000000" , bzhi(ecx, dword_ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("0F01CA" , clac()); + TEST_INSTRUCTION("0F1C841180000000" , cldemote(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0FAEBC1180000000" , clflush(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("660FAEBC1180000000" , clflushopt(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F01DD" , clgi()); + TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("F30FAEB41180000000" , clrssbsy(qword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F06" , clts()); + TEST_INSTRUCTION("660FAEB41180000000" , clwb(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F01FC" , clzero(ptr(eax))); + TEST_INSTRUCTION("0F01FC" , clzero(zmmword_ptr(eax))); + TEST_INSTRUCTION("C4E259E69C1180000000" , cmpbexadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E69C1180000000" , cmpbexadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E29C1180000000" , cmpbxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E29C1180000000" , cmpbxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EE9C1180000000" , cmplexadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EE9C1180000000" , cmplexadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EC9C1180000000" , cmplxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EC9C1180000000" , cmplxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E79C1180000000" , cmpnbexadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E79C1180000000" , cmpnbexadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E39C1180000000" , cmpnbxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E39C1180000000" , cmpnbxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EF9C1180000000" , cmpnlexadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EF9C1180000000" , cmpnlexadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259ED9C1180000000" , cmpnlxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259ED9C1180000000" , cmpnlxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E19C1180000000" , cmpnoxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E19C1180000000" , cmpnoxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EB9C1180000000" , cmpnpxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EB9C1180000000" , cmpnpxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E99C1180000000" , cmpnsxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E99C1180000000" , cmpnsxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E59C1180000000" , cmpnzxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E59C1180000000" , cmpnzxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E09C1180000000" , cmpoxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E09C1180000000" , cmpoxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EA9C1180000000" , cmppxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259EA9C1180000000" , cmppxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E89C1180000000" , cmpsxadd(ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("C4E259E89C1180000000" , cmpsxadd(dword_ptr(ecx, edx, 0, 128), ebx, esp)); + TEST_INSTRUCTION("F20F38F0CA" , crc32(ecx, dl)); + TEST_INSTRUCTION("F20F38F0CE" , crc32(ecx, dh)); + TEST_INSTRUCTION("66F20F38F1CA" , crc32(ecx, dx)); + TEST_INSTRUCTION("F20F38F1CA" , crc32(ecx, edx)); + TEST_INSTRUCTION("F20F38F08C1A80000000" , crc32(ecx, byte_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("66F20F38F18C1A80000000" , crc32(ecx, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F20F38F18C1A80000000" , crc32(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F77" , emms()); + TEST_INSTRUCTION("F30F1EFB" , endbr32()); + TEST_INSTRUCTION("F30F1EFA" , endbr64()); + TEST_INSTRUCTION("F20F38F88C1A80000000" , enqcmd(zmmword_ptr(ecx), zmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30F38F88C1A80000000" , enqcmds(zmmword_ptr(ecx), zmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0FAE8C1180000000" , fxrstor(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0FAE841180000000" , fxsave(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("D9F4" , fxtract()); + TEST_INSTRUCTION("0F37" , getsec()); + TEST_INSTRUCTION("F30F3AF0C001" , hreset(1, eax)); + TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0FAE941180000000" , ldmxcsr(dword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("F30FAEE9" , incsspd(ecx)); + TEST_INSTRUCTION("660F38808C1A80000000" , invept(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("660F38808C1A80000000" , invept(ecx, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F01DF" , invlpga(eax, ecx)); + TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("660F38818C1A80000000" , invvpid(ecx, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0FAEE8" , lfence()); + TEST_INSTRUCTION("8FE97812C1" , llwpcb(ecx)); + TEST_INSTRUCTION("8FEA7012C201000000" , lwpins(ecx, edx, 1)); + TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FEA7012841A8000000001000000" , lwpins(ecx, dword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FEA7012CA01000000" , lwpval(ecx, edx, 1)); + TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FEA70128C1A8000000001000000" , lwpval(ecx, dword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("66F30FBDCA" , lzcnt(cx, dx)); + TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("66F30FBD8C1A80000000" , lzcnt(cx, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30FBDCA" , lzcnt(ecx, edx)); + TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30FBD8C1A80000000" , lzcnt(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30F01FA" , mcommit()); + TEST_INSTRUCTION("0FAEF0" , mfence()); + TEST_INSTRUCTION("0F01C8" , monitor(ptr(eax), ecx, edx)); + TEST_INSTRUCTION("0F01FA" , monitorx(ptr(eax), ecx, edx)); + TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("660F38F08C1A80000000" , movbe(cx, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F38F08C1A80000000" , movbe(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("660F38F19C1180000000" , movbe(ptr(ecx, edx, 0, 128), bx)); + TEST_INSTRUCTION("660F38F19C1180000000" , movbe(word_ptr(ecx, edx, 0, 128), bx)); + TEST_INSTRUCTION("0F38F19C1180000000" , movbe(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("0F38F19C1180000000" , movbe(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("660F38F88C1A80000000" , movdir64b(zmmword_ptr(ecx), zmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("0F38F99C1180000000" , movdiri(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("0FC39C1180000000" , movnti(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("0FC39C1180000000" , movnti(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("C4E26BF6CB" , mulx(ecx, edx, ebx, edx)); + TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, ptr(ebx, ebp, 0, 128), edx)); + TEST_INSTRUCTION("C4E26BF68C2B80000000" , mulx(ecx, edx, dword_ptr(ebx, ebp, 0, 128), edx)); + TEST_INSTRUCTION("0F01C9" , mwait(eax, ecx)); + TEST_INSTRUCTION("0F01FB" , mwaitx(eax, ecx, ebx)); + TEST_INSTRUCTION("0F01C5" , pconfig()); + TEST_INSTRUCTION("C4E26BF5CB" , pdep(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26BF58C2B80000000" , pdep(ecx, edx, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26AF5CB" , pext(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26AF58C2B80000000" , pext(ecx, edx, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("66F30FB8CA" , popcnt(cx, dx)); + TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("66F30FB88C1A80000000" , popcnt(cx, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30FB8CA" , popcnt(ecx, edx)); + TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30FB88C1A80000000" , popcnt(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F0D841180000000" , prefetch(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F18841180000000" , prefetchnta(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F188C1180000000" , prefetcht0(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F18941180000000" , prefetcht1(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F189C1180000000" , prefetcht2(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F0D8C1180000000" , prefetchw(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F0D941180000000" , prefetchwt1(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("F30FAEE1" , ptwrite(ecx)); + TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("F30FAEA41180000000" , ptwrite(dword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("F20F01FF" , pvalidate()); + TEST_INSTRUCTION("F30FC7F9" , rdpid(ecx)); + TEST_INSTRUCTION("0F01EE" , rdpkru(edx, eax, ecx)); + TEST_INSTRUCTION("0F33" , rdpmc(edx, eax, ecx)); + TEST_INSTRUCTION("0F01FD" , rdpru(edx, eax, ecx)); + TEST_INSTRUCTION("660FC7F1" , rdrand(cx)); + TEST_INSTRUCTION("0FC7F1" , rdrand(ecx)); + TEST_INSTRUCTION("660FC7F9" , rdseed(cx)); + TEST_INSTRUCTION("0FC7F9" , rdseed(ecx)); + TEST_INSTRUCTION("F30F1EC9" , rdsspd(ecx)); + TEST_INSTRUCTION("0F31" , rdtsc(edx, eax)); + TEST_INSTRUCTION("0F01F9" , rdtscp(edx, eax, ecx)); + TEST_INSTRUCTION("C4E37BF0CA01" , rorx(ecx, edx, 1)); + TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37BF08C1A8000000001" , rorx(ecx, dword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("0FAA" , rsm()); + TEST_INSTRUCTION("F30F01AC1180000000" , rstorssp(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("F30F01AC1180000000" , rstorssp(qword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("C4E262F7CA" , sarx(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("C4E25AF78C1A80000000" , sarx(ecx, dword_ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("F30F01EA" , saveprevssp()); + TEST_INSTRUCTION("0F01E8" , serialize()); + TEST_INSTRUCTION("F30F01E8" , setssbsy()); + TEST_INSTRUCTION("0FAEF8" , sfence()); + TEST_INSTRUCTION("C4E261F7CA" , shlx(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("C4E259F78C1A80000000" , shlx(ecx, dword_ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("C4E263F7CA" , shrx(ecx, edx, ebx)); + TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("C4E25BF78C1A80000000" , shrx(ecx, dword_ptr(edx, ebx, 0, 128), esp)); + TEST_INSTRUCTION("8FE97812C9" , slwpcb(ecx)); + TEST_INSTRUCTION("0F01DE" , skinit(eax)); + TEST_INSTRUCTION("0F01CB" , stac()); + TEST_INSTRUCTION("0F01DC" , stgi()); + TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0FAE9C1180000000" , stmxcsr(dword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F34" , sysenter()); + TEST_INSTRUCTION("0F35" , sysexit()); + TEST_INSTRUCTION("8FE97001FA" , t1mskc(ecx, edx)); + TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001BC1A80000000" , t1mskc(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("660FAEF1" , tpause(ecx, edx, eax)); + TEST_INSTRUCTION("66F30FBCCA" , tzcnt(cx, dx)); + TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("66F30FBC8C1A80000000" , tzcnt(cx, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30FBCCA" , tzcnt(ecx, edx)); + TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30FBC8C1A80000000" , tzcnt(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001E2" , tzmsk(ecx, edx)); + TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97001A41A80000000" , tzmsk(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30FAEF1" , umonitor(ptr(ecx))); + TEST_INSTRUCTION("F20FAEF1" , umwait(ecx, edx, eax)); + TEST_INSTRUCTION("0F01C1" , vmcall()); + TEST_INSTRUCTION("660FC7B41180000000" , vmclear(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("660FC7B41180000000" , vmclear(qword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F01D4" , vmfunc()); + TEST_INSTRUCTION("0F01C2" , vmlaunch()); + TEST_INSTRUCTION("0F01DA" , vmload(eax)); + TEST_INSTRUCTION("0F01D9" , vmmcall()); + TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0FC7B41180000000" , vmptrld(qword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0FC7BC1180000000" , vmptrst(qword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("0F78D1" , vmread(ecx, edx)); + TEST_INSTRUCTION("0F789C1180000000" , vmread(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("0F789C1180000000" , vmread(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("0F01C3" , vmresume()); + TEST_INSTRUCTION("0F01D8" , vmrun(eax)); + TEST_INSTRUCTION("0F01DB" , vmsave(eax)); + TEST_INSTRUCTION("0F79CA" , vmwrite(ecx, edx)); + TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F798C1A80000000" , vmwrite(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(qword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("F30F09" , wbnoinvd()); + TEST_INSTRUCTION("0F38F6D1" , wrssd(ecx, edx)); + TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("660F38F5D1" , wrussd(ecx, edx)); + TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(dword_ptr(ecx, edx, 0, 128), ebx)); + TEST_INSTRUCTION("0F01D5" , xend()); + TEST_INSTRUCTION("0F01D0" , xgetbv(edx, eax, ecx)); + TEST_INSTRUCTION("F20F01E9" , xresldtrk()); + TEST_INSTRUCTION("0FAEAC1180000000" , xrstor(ptr(ecx, edx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FC79C1180000000" , xrstors(ptr(ecx, edx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FAEA41180000000" , xsave(ptr(ecx, edx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FC7A41180000000" , xsavec(ptr(ecx, edx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FAEB41180000000" , xsaveopt(ptr(ecx, edx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0FC7AC1180000000" , xsaves(ptr(ecx, edx, 0, 128), edx, eax)); + TEST_INSTRUCTION("0F01D1" , xsetbv(edx, eax, ecx)); + TEST_INSTRUCTION("F20F01E8" , xsusldtrk()); + TEST_INSTRUCTION("0F01D6" , xtest()); +} + +static void ASMJIT_NOINLINE testX86AssemblerMMX_SSE(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("660F58CA" , addpd(xmm1, xmm2)); + TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("660F588C1A80000000" , addpd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F58CA" , addps(xmm1, xmm2)); + TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("0F588C1A80000000" , addps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("F20F58CA" , addsd(xmm1, xmm2)); TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("F20F588C1A80000000" , addsd(xmm1, qword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("F30F58CA" , addss(xmm1, xmm2)); @@ -2530,7 +2578,2376 @@ static void ASMJIT_NOINLINE testX86AssemblerMMX_SSE(AssemblerTester& tester) noexcept { +static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C5E958CB" , vaddpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED58CB" , vaddpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E858CB" , vaddps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC58CB" , vaddps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB58CB" , vaddsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA58CB" , vaddss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D0CB" , vaddsubpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD0CB" , vaddsubpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EBD0CB" , vaddsubps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EFD0CB" , vaddsubps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DECB" , vaesdec(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DDECB" , vaesdec(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DFCB" , vaesdeclast(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DDFCB" , vaesdeclast(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DCCB" , vaesenc(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DDCCB" , vaesenc(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DDCB" , vaesenclast(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DDDCB" , vaesenclast(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E279DBCA" , vaesimc(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E379DFCA01" , vaeskeygenassist(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5E955CB" , vandnpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED55CB" , vandnpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E855CB" , vandnps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC55CB" , vandnps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E954CB" , vandpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED54CB" , vandpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E854CB" , vandps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC54CB" , vandps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E3690DCB01" , vblendpd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0DCB01" , vblendpd(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690CCB01" , vblendps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0CCB01" , vblendps(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3694BCB40" , vblendvpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E36D4BCB40" , vblendvpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3694ACB40" , vblendvps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E36D4ACB40" , vblendvps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D19CA" , vbroadcastsd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27918CA" , vbroadcastss(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D18CA" , vbroadcastss(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5E9C2CB01" , vcmppd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5EDC2CB01" , vcmppd(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E8C2CB01" , vcmpps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5ECC2CB01" , vcmpps(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5EBC2CB01" , vcmpsd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5EAC2CB01" , vcmpss(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5F92FCA" , vcomisd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F82FCA" , vcomiss(xmm1, xmm2)); + TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FAE6CA" , vcvtdq2pd(xmm1, xmm2)); + TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FEE6CA" , vcvtdq2pd(ymm1, xmm2)); + TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F85BCA" , vcvtdq2ps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC5BCA" , vcvtdq2ps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FBE6CA" , vcvtpd2dq(xmm1, xmm2)); + TEST_INSTRUCTION("C5FFE6CA" , vcvtpd2dq(xmm1, ymm2)); + TEST_INSTRUCTION("C5FBE68C1A80000000" , vcvtpd2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FFE68C1A80000000" , vcvtpd2dq(xmm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F95ACA" , vcvtpd2ps(xmm1, xmm2)); + TEST_INSTRUCTION("C5FD5ACA" , vcvtpd2ps(xmm1, ymm2)); + TEST_INSTRUCTION("C5F95A8C1A80000000" , vcvtpd2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD5A8C1A80000000" , vcvtpd2ps(xmm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27913CA" , vcvtph2ps(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D13CA" , vcvtph2ps(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F95BCA" , vcvtps2dq(xmm1, xmm2)); + TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD5BCA" , vcvtps2dq(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F85ACA" , vcvtps2pd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC5ACA" , vcvtps2pd(ymm1, xmm2)); + TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E3791DD101" , vcvtps2ph(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(qword_ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E37D1DD101" , vcvtps2ph(xmm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(ptr(ecx, edx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C5FB2DCA" , vcvtsd2si(ecx, xmm2)); + TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5EB5ACB" , vcvtsd2ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB2ACB" , vcvtsi2sd(xmm1, xmm2, ebx)); + TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA2ACB" , vcvtsi2ss(xmm1, xmm2, ebx)); + TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5ACB" , vcvtss2sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5FA2DCA" , vcvtss2si(ecx, xmm2)); + TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F9E6CA" , vcvttpd2dq(xmm1, xmm2)); + TEST_INSTRUCTION("C5FDE6CA" , vcvttpd2dq(xmm1, ymm2)); + TEST_INSTRUCTION("C5F9E68C1A80000000" , vcvttpd2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FDE68C1A80000000" , vcvttpd2dq(xmm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA5BCA" , vcvttps2dq(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FE5BCA" , vcvttps2dq(ymm1, ymm2)); + TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FB2CCA" , vcvttsd2si(ecx, xmm2)); + TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA2CCA" , vcvttss2si(ecx, xmm2)); + TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5E95ECB" , vdivpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED5ECB" , vdivpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E85ECB" , vdivps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC5ECB" , vdivps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB5ECB" , vdivsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5ECB" , vdivss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E36941CB01" , vdppd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36940CB01" , vdpps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D40CB01" , vdpps(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D19D101" , vextractf128(xmm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(ptr(ecx, edx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37D39D101" , vextracti128(xmm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(ptr(ecx, edx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1)); + TEST_INSTRUCTION("C4E37917D101" , vextractps(ecx, xmm2, 1)); + TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(dword_ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E2D9928C1A80000000" , vgatherdpd(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2DD928C1A80000000" , vgatherdpd(ymm1, ptr(edx, xmm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E259928C1A80000000" , vgatherdps(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E25D928C1A80000000" , vgatherdps(ymm1, ptr(edx, ymm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E2D9938C1A80000000" , vgatherqpd(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2DD938C1A80000000" , vgatherqpd(ymm1, ptr(edx, ymm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E259938C1A80000000" , vgatherqps(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E25D938C1A80000000" , vgatherqps(xmm1, ptr(edx, ymm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E3E9CFCB01" , vgf2p8affineinvqb(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3EDCFCB01" , vgf2p8affineinvqb(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9CECB01" , vgf2p8affineqb(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3EDCECB01" , vgf2p8affineqb(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E269CFCB" , vgf2p8mulb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DCFCB" , vgf2p8mulb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E97CCB" , vhaddpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED7CCB" , vhaddpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB7CCB" , vhaddps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EF7CCB" , vhaddps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E97DCB" , vhsubpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED7DCB" , vhsubpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB7DCB" , vhsubps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EF7DCB" , vhsubps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E36D18CB01" , vinsertf128(ymm1, ymm2, xmm3, 1)); + TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D38CB01" , vinserti128(ymm1, ymm2, xmm3, 1)); + TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36921CB01" , vinsertps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(dword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, ptr(edi))); + TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, xmmword_ptr(edi))); + TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(ptr(ecx, edx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ptr(ecx, edx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(ptr(ecx, edx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ptr(ecx, edx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E95FCB" , vmaxpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED5FCB" , vmaxpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E85FCB" , vmaxps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC5FCB" , vmaxps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB5FCB" , vmaxsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5FCB" , vmaxss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E95DCB" , vminpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED5DCB" , vminpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E85DCB" , vminps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC5DCB" , vminps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB5DCB" , vminsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5DCB" , vminss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F928CA" , vmovapd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(xmmword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FD28CA" , vmovapd(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5F828CA" , vmovaps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(xmmword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FC28CA" , vmovaps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5F97ED1" , vmovd(ecx, xmm2)); + TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(dword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F96ECA" , vmovd(xmm1, edx)); + TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FB12CA" , vmovddup(xmm1, xmm2)); + TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FF12CA" , vmovddup(ymm1, ymm2)); + TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F96FCA" , vmovdqa(xmm1, xmm2)); + TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(xmmword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FD6FCA" , vmovdqa(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FA6FCA" , vmovdqu(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(xmmword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FE6FCA" , vmovdqu(ymm1, ymm2)); + TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5E812CB" , vmovhlps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(qword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(qword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E816CB" , vmovlhps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(qword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(qword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F950CA" , vmovmskpd(ecx, xmm2)); + TEST_INSTRUCTION("C5FD50CA" , vmovmskpd(ecx, ymm2)); + TEST_INSTRUCTION("C5F850CA" , vmovmskps(ecx, xmm2)); + TEST_INSTRUCTION("C5FC50CA" , vmovmskps(ecx, ymm2)); + TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(xmmword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(xmmword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(xmmword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FA7ECA" , vmovq(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(qword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(qword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5EB10CB" , vmovsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5FA16CA" , vmovshdup(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FE16CA" , vmovshdup(ymm1, ymm2)); + TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA12CA" , vmovsldup(xmm1, xmm2)); + TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FE12CA" , vmovsldup(ymm1, ymm2)); + TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(dword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5EA10CB" , vmovss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F910CA" , vmovupd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(xmmword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FD10CA" , vmovupd(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5F810CA" , vmovups(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(xmmword_ptr(ecx, edx, 0, 128), xmm3)); + TEST_INSTRUCTION("C5FC10CA" , vmovups(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("C4E36942CB01" , vmpsadbw(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D42CB01" , vmpsadbw(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E959CB" , vmulpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED59CB" , vmulpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E859CB" , vmulps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC59CB" , vmulps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB59CB" , vmulsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA59CB" , vmulss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E956CB" , vorpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED56CB" , vorpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E856CB" , vorps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC56CB" , vorps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2791CCA" , vpabsb(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D1CCA" , vpabsb(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E2791ECA" , vpabsd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D1ECA" , vpabsd(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E2791DCA" , vpabsw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D1DCA" , vpabsw(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5E96BCB" , vpackssdw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED6BCB" , vpackssdw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E963CB" , vpacksswb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED63CB" , vpacksswb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2692BCB" , vpackusdw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D2BCB" , vpackusdw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E967CB" , vpackuswb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED67CB" , vpackuswb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FCCB" , vpaddb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFCCB" , vpaddb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FECB" , vpaddd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFECB" , vpaddd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D4CB" , vpaddq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD4CB" , vpaddq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9ECCB" , vpaddsb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDECCB" , vpaddsb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EDCB" , vpaddsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEDCB" , vpaddsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DCCB" , vpaddusb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDCCB" , vpaddusb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DDCB" , vpaddusw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDDCB" , vpaddusw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FDCB" , vpaddw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFDCB" , vpaddw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E3690FCB01" , vpalignr(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0FCB01" , vpalignr(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9DBCB" , vpand(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDBCB" , vpand(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DFCB" , vpandn(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDFCB" , vpandn(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E0CB" , vpavgb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE0CB" , vpavgb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E3CB" , vpavgw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE3CB" , vpavgw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E36902CB01" , vpblendd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D02CB01" , vpblendd(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3694CCB40" , vpblendvb(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E36D4CCB40" , vpblendvb(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3690ECB01" , vpblendw(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0ECB01" , vpblendw(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E27978CA" , vpbroadcastb(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, byte_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D78CA" , vpbroadcastb(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, byte_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27958CA" , vpbroadcastd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D58CA" , vpbroadcastd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27959CA" , vpbroadcastq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D59CA" , vpbroadcastq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27979CA" , vpbroadcastw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D79CA" , vpbroadcastw(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E36944CB01" , vpclmulqdq(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D44CB01" , vpclmulqdq(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E974CB" , vpcmpeqb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED74CB" , vpcmpeqb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E976CB" , vpcmpeqd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED76CB" , vpcmpeqd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26929CB" , vpcmpeqq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D29CB" , vpcmpeqq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E975CB" , vpcmpeqw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED75CB" , vpcmpeqw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E37961CA01" , vpcmpestri(xmm1, xmm2, 1, ecx, eax, edx)); + TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, ptr(edx, ebx, 0, 128), 1, ecx, eax, edx)); + TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, ecx, eax, edx)); + TEST_INSTRUCTION("C4E37960CA01" , vpcmpestrm(xmm1, xmm2, 1, xmm0, eax, edx)); + TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, ptr(edx, ebx, 0, 128), 1, xmm0, eax, edx)); + TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, xmm0, eax, edx)); + TEST_INSTRUCTION("C5E964CB" , vpcmpgtb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED64CB" , vpcmpgtb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E966CB" , vpcmpgtd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED66CB" , vpcmpgtd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26937CB" , vpcmpgtq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D37CB" , vpcmpgtq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E965CB" , vpcmpgtw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED65CB" , vpcmpgtw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E37963CA01" , vpcmpistri(xmm1, xmm2, 1, ecx)); + TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, ptr(edx, ebx, 0, 128), 1, ecx)); + TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, ecx)); + TEST_INSTRUCTION("C4E37962CA01" , vpcmpistrm(xmm1, xmm2, 1, xmm0)); + TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, ptr(edx, ebx, 0, 128), 1, xmm0)); + TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, xmm0)); + TEST_INSTRUCTION("C4E36D06CB01" , vperm2f128(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D46CB01" , vperm2i128(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E26D36CB" , vpermd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E36949CB41" , vpermil2pd(xmm1, xmm2, xmm3, xmm4, 1)); + TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6, 1)); + TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6, 1)); + TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D49CB41" , vpermil2pd(ymm1, ymm2, ymm3, ymm4, 1)); + TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6, 1)); + TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6, 1)); + TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128), 1)); + TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128), 1)); + TEST_INSTRUCTION("C4E36948CB41" , vpermil2ps(xmm1, xmm2, xmm3, xmm4, 1)); + TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6, 1)); + TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6, 1)); + TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128), 1)); + TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128), 1)); + TEST_INSTRUCTION("C4E36D48CB41" , vpermil2ps(ymm1, ymm2, ymm3, ymm4, 1)); + TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6, 1)); + TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6, 1)); + TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128), 1)); + TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128), 1)); + TEST_INSTRUCTION("C4E2690DCB" , vpermilpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E37905CA01" , vpermilpd(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E26D0DCB" , vpermilpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E37D05CA01" , vpermilpd(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E2690CCB" , vpermilps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E37904CA01" , vpermilps(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E26D0CCB" , vpermilps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E37D04CA01" , vpermilps(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3FD01CA01" , vpermpd(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E26D16CB" , vpermps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E3FD00CA01" , vpermq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37914D101" , vpextrb(ecx, xmm2, 1)); + TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(byte_ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E37916D101" , vpextrd(ecx, xmm2, 1)); + TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(dword_ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C5F9C5CA01" , vpextrw(ecx, xmm2, 1)); + TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(word_ptr(ecx, edx, 0, 128), xmm3, 1)); + TEST_INSTRUCTION("C4E259908C1A80000000" , vpgatherdd(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E25D908C1A80000000" , vpgatherdd(ymm1, ptr(edx, ymm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E2D9908C1A80000000" , vpgatherdq(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2DD908C1A80000000" , vpgatherdq(ymm1, ptr(edx, xmm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E259918C1A80000000" , vpgatherqd(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E25D918C1A80000000" , vpgatherqd(xmm1, ptr(edx, ymm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2D9918C1A80000000" , vpgatherqq(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); + TEST_INSTRUCTION("C4E2DD918C1A80000000" , vpgatherqq(ymm1, ptr(edx, ymm3, 0, 128), ymm4)); + TEST_INSTRUCTION("C4E26902CB" , vphaddd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D02CB" , vphaddd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26903CB" , vphaddsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D03CB" , vphaddsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26901CB" , vphaddw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D01CB" , vphaddw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E27941CA" , vphminposuw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E26906CB" , vphsubd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D06CB" , vphsubd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26907CB" , vphsubsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D07CB" , vphsubsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26905CB" , vphsubw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D05CB" , vphsubw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E36920CB01" , vpinsrb(xmm1, xmm2, ebx, 1)); + TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, byte_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E36922CB01" , vpinsrd(xmm1, xmm2, ebx, 1)); + TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9C4CB01" , vpinsrw(xmm1, xmm2, ebx, 1)); + TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, word_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E26904CB" , vpmaddubsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D04CB" , vpmaddubsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F5CB" , vpmaddwd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF5CB" , vpmaddwd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(ptr(ecx, edx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ptr(ecx, edx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(ptr(ecx, edx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4)); + TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ptr(ecx, edx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4)); + TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693CCB" , vpmaxsb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3CCB" , vpmaxsb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693DCB" , vpmaxsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3DCB" , vpmaxsd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EECB" , vpmaxsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEECB" , vpmaxsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DECB" , vpmaxub(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDECB" , vpmaxub(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693FCB" , vpmaxud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3FCB" , vpmaxud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693ECB" , vpmaxuw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3ECB" , vpmaxuw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26938CB" , vpminsb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D38CB" , vpminsb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26939CB" , vpminsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D39CB" , vpminsd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EACB" , vpminsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEACB" , vpminsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DACB" , vpminub(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDACB" , vpminub(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693BCB" , vpminud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3BCB" , vpminud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693ACB" , vpminuw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3ACB" , vpminuw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F9D7CA" , vpmovmskb(ecx, xmm2)); + TEST_INSTRUCTION("C5FDD7CA" , vpmovmskb(ecx, ymm2)); + TEST_INSTRUCTION("C4E27921CA" , vpmovsxbd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D21CA" , vpmovsxbd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27922CA" , vpmovsxbq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D22CA" , vpmovsxbq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27920CA" , vpmovsxbw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D20CA" , vpmovsxbw(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27925CA" , vpmovsxdq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D25CA" , vpmovsxdq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27923CA" , vpmovsxwd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D23CA" , vpmovsxwd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27924CA" , vpmovsxwq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D24CA" , vpmovsxwq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27931CA" , vpmovzxbd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D31CA" , vpmovzxbd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27932CA" , vpmovzxbq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D32CA" , vpmovzxbq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27930CA" , vpmovzxbw(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D30CA" , vpmovzxbw(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27935CA" , vpmovzxdq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D35CA" , vpmovzxdq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27933CA" , vpmovzxwd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D33CA" , vpmovzxwd(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27934CA" , vpmovzxwq(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D34CA" , vpmovzxwq(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E26928CB" , vpmuldq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D28CB" , vpmuldq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2690BCB" , vpmulhrsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D0BCB" , vpmulhrsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E4CB" , vpmulhuw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE4CB" , vpmulhuw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E5CB" , vpmulhw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE5CB" , vpmulhw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26940CB" , vpmulld(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D40CB" , vpmulld(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D5CB" , vpmullw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD5CB" , vpmullw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F4CB" , vpmuludq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF4CB" , vpmuludq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EBCB" , vpor(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEBCB" , vpor(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F6CB" , vpsadbw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF6CB" , vpsadbw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26900CB" , vpshufb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D00CB" , vpshufb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F970CA01" , vpshufd(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FD70CA01" , vpshufd(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FA70CA01" , vpshufhw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FE70CA01" , vpshufhw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FB70CA01" , vpshuflw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FF70CA01" , vpshuflw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E26908CB" , vpsignb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D08CB" , vpsignb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2690ACB" , vpsignd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D0ACB" , vpsignd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26909CB" , vpsignw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D09CB" , vpsignw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F2CB" , vpslld(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F172F201" , vpslld(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF2CB" , vpslld(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F572F201" , vpslld(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F173FA01" , vpslldq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5F573FA01" , vpslldq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5E9F3CB" , vpsllq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F173F201" , vpsllq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF3CB" , vpsllq(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F573F201" , vpsllq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26947CB" , vpsllvd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D47CB" , vpsllvd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E947CB" , vpsllvq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED47CB" , vpsllvq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F1CB" , vpsllw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F171F201" , vpsllw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF1CB" , vpsllw(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F571F201" , vpsllw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E2CB" , vpsrad(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F172E201" , vpsrad(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE2CB" , vpsrad(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F572E201" , vpsrad(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26946CB" , vpsravd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D46CB" , vpsravd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E1CB" , vpsraw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F171E201" , vpsraw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE1CB" , vpsraw(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F571E201" , vpsraw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D2CB" , vpsrld(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F172D201" , vpsrld(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD2CB" , vpsrld(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F572D201" , vpsrld(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F173DA01" , vpsrldq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5F573DA01" , vpsrldq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5E9D3CB" , vpsrlq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F173D201" , vpsrlq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD3CB" , vpsrlq(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F573D201" , vpsrlq(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26945CB" , vpsrlvd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D45CB" , vpsrlvd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E945CB" , vpsrlvq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED45CB" , vpsrlvq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D1CB" , vpsrlw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5F171D201" , vpsrlw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD1CB" , vpsrlw(ymm1, ymm2, xmm3)); + TEST_INSTRUCTION("C5F571D201" , vpsrlw(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F8CB" , vpsubb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF8CB" , vpsubb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FACB" , vpsubd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFACB" , vpsubd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FBCB" , vpsubq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFBCB" , vpsubq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E8CB" , vpsubsb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE8CB" , vpsubsb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E9CB" , vpsubsw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE9CB" , vpsubsw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D8CB" , vpsubusb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD8CB" , vpsubusb(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D9CB" , vpsubusw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD9CB" , vpsubusw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F9CB" , vpsubw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF9CB" , vpsubw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E27917CA" , vptest(xmm1, xmm2)); + TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D17CA" , vptest(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5E968CB" , vpunpckhbw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED68CB" , vpunpckhbw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E96ACB" , vpunpckhdq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED6ACB" , vpunpckhdq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E96DCB" , vpunpckhqdq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED6DCB" , vpunpckhqdq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E969CB" , vpunpckhwd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED69CB" , vpunpckhwd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E960CB" , vpunpcklbw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED60CB" , vpunpcklbw(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E962CB" , vpunpckldq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED62CB" , vpunpckldq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E96CCB" , vpunpcklqdq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED6CCB" , vpunpcklqdq(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E961CB" , vpunpcklwd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED61CB" , vpunpcklwd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EFCB" , vpxor(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEFCB" , vpxor(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F853CA" , vrcpps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC53CA" , vrcpps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5EA53CB" , vrcpss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E37909CA01" , vroundpd(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D09CA01" , vroundpd(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37908CA01" , vroundps(xmm1, xmm2, 1)); + TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D08CA01" , vroundps(ymm1, ymm2, 1)); + TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690BCB01" , vroundsd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690ACB01" , vroundss(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5F852CA" , vrsqrtps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC52CA" , vrsqrtps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5EA52CB" , vrsqrtss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9C6CB01" , vshufpd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5EDC6CB01" , vshufpd(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E8C6CB01" , vshufps(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5ECC6CB01" , vshufps(ymm1, ymm2, ymm3, 1)); + TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C5F951CA" , vsqrtpd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD51CA" , vsqrtpd(ymm1, ymm2)); + TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F851CA" , vsqrtps(xmm1, xmm2)); + TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC51CA" , vsqrtps(ymm1, ymm2)); + TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5EB51CB" , vsqrtsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA51CB" , vsqrtss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(dword_ptr(ecx, edx, 0, 128))); + TEST_INSTRUCTION("C5E95CCB" , vsubpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED5CCB" , vsubpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E85CCB" , vsubps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC5CCB" , vsubps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB5CCB" , vsubsd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5CCB" , vsubss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2790FCA" , vtestpd(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D0FCA" , vtestpd(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E2790ECA" , vtestps(xmm1, xmm2)); + TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D0ECA" , vtestps(ymm1, ymm2)); + TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F92ECA" , vucomisd(xmm1, xmm2)); + TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F82ECA" , vucomiss(xmm1, xmm2)); + TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C5E915CB" , vunpckhpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED15CB" , vunpckhpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E815CB" , vunpckhps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC15CB" , vunpckhps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E914CB" , vunpcklpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED14CB" , vunpcklpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E814CB" , vunpcklps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC14CB" , vunpcklps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E957CB" , vxorpd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED57CB" , vxorpd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E857CB" , vxorps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC57CB" , vxorps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C5FC77" , vzeroall()); + TEST_INSTRUCTION("C5F877" , vzeroupper()); +} + +static void ASMJIT_NOINLINE testX86AssemblerAVX_NE_CONVERT(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E27AB18C1A80000000" , vbcstnebf162ps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27AB18C1A80000000" , vbcstnebf162ps(xmm1, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27EB18C1A80000000" , vbcstnebf162ps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27EB18C1A80000000" , vbcstnebf162ps(ymm1, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279B18C1A80000000" , vbcstnesh2ps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279B18C1A80000000" , vbcstnesh2ps(xmm1, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27DB18C1A80000000" , vbcstnesh2ps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27DB18C1A80000000" , vbcstnesh2ps(ymm1, word_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27AB08C1A80000000" , vcvtneebf162ps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27AB08C1A80000000" , vcvtneebf162ps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27EB08C1A80000000" , vcvtneebf162ps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27EB08C1A80000000" , vcvtneebf162ps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279B08C1A80000000" , vcvtneeph2ps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E279B08C1A80000000" , vcvtneeph2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27DB08C1A80000000" , vcvtneeph2ps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27DB08C1A80000000" , vcvtneeph2ps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27BB08C1A80000000" , vcvtneobf162ps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27BB08C1A80000000" , vcvtneobf162ps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27FB08C1A80000000" , vcvtneobf162ps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27FB08C1A80000000" , vcvtneobf162ps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E278B08C1A80000000" , vcvtneoph2ps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E278B08C1A80000000" , vcvtneoph2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27CB08C1A80000000" , vcvtneoph2ps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27CB08C1A80000000" , vcvtneoph2ps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27A72CA" , vex().vcvtneps2bf16(xmm1, xmm2)); + TEST_INSTRUCTION("C4E27E72CA" , vex().vcvtneps2bf16(xmm1, ymm2)); + TEST_INSTRUCTION("C4E27A728C1A80000000" , vex().vcvtneps2bf16(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("C4E27E728C1A80000000" , vex().vcvtneps2bf16(xmm1, ymmword_ptr(edx, ebx, 0, 128))); +} + +static void ASMJIT_NOINLINE testX86AssemblerAVX_VNNI(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E25150F4" , vex().vpdpbusd(xmm6, xmm5, xmm4)); + TEST_INSTRUCTION("C4E25550F4" , vex().vpdpbusd(ymm6, ymm5, ymm4)); + TEST_INSTRUCTION("C4E25151F4" , vex().vpdpbusds(xmm6, xmm5, xmm4)); + TEST_INSTRUCTION("C4E25551F4" , vex().vpdpbusds(ymm6, ymm5, ymm4)); + TEST_INSTRUCTION("C4E25152F4" , vex().vpdpwssd(xmm6, xmm5, xmm4)); + TEST_INSTRUCTION("C4E25552F4" , vex().vpdpwssd(ymm6, ymm5, ymm4)); + TEST_INSTRUCTION("C4E25153F4" , vex().vpdpwssds(xmm6, xmm5, xmm4)); + TEST_INSTRUCTION("C4E25553F4" , vex().vpdpwssds(ymm6, ymm5, ymm4)); +} + +static void ASMJIT_NOINLINE testX86AssemblerAVX_VNNI_INT8(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E26B50CB" , vpdpbssd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26B508C2B80000000" , vpdpbssd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26B508C2B80000000" , vpdpbssd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26F50CB" , vpdpbssd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26F508C2B80000000" , vpdpbssd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26F508C2B80000000" , vpdpbssd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26B51CB" , vpdpbssds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26B518C2B80000000" , vpdpbssds(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26B518C2B80000000" , vpdpbssds(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26F51CB" , vpdpbssds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26F518C2B80000000" , vpdpbssds(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26F518C2B80000000" , vpdpbssds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26A50CB" , vpdpbsud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26A508C2B80000000" , vpdpbsud(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26A508C2B80000000" , vpdpbsud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26E50CB" , vpdpbsud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26E508C2B80000000" , vpdpbsud(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26E508C2B80000000" , vpdpbsud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26A51CB" , vpdpbsuds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26A518C2B80000000" , vpdpbsuds(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26A518C2B80000000" , vpdpbsuds(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26E51CB" , vpdpbsuds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26E518C2B80000000" , vpdpbsuds(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26E518C2B80000000" , vpdpbsuds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26850CB" , vpdpbuud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268508C2B80000000" , vpdpbuud(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E268508C2B80000000" , vpdpbuud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26C50CB" , vpdpbuud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26C508C2B80000000" , vpdpbuud(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26C508C2B80000000" , vpdpbuud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26851CB" , vpdpbuuds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268518C2B80000000" , vpdpbuuds(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E268518C2B80000000" , vpdpbuuds(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26C51CB" , vpdpbuuds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26C518C2B80000000" , vpdpbuuds(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26C518C2B80000000" , vpdpbuuds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); +} + +static void ASMJIT_NOINLINE testX86AssemblerAVX_VNNI_INT16(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E26AD2CB" , vpdpwsud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26AD28C2B80000000" , vpdpwsud(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26AD28C2B80000000" , vpdpwsud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26ED2CB" , vpdpwsud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26ED28C2B80000000" , vpdpwsud(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26ED28C2B80000000" , vpdpwsud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26AD3CB" , vpdpwsuds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26AD38C2B80000000" , vpdpwsuds(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26AD38C2B80000000" , vpdpwsuds(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26ED3CB" , vpdpwsuds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26ED38C2B80000000" , vpdpwsuds(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26ED38C2B80000000" , vpdpwsuds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269D2CB" , vpdpwusd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269D28C2B80000000" , vpdpwusd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269D28C2B80000000" , vpdpwusd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DD2CB" , vpdpwusd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DD28C2B80000000" , vpdpwusd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DD28C2B80000000" , vpdpwusd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269D3CB" , vpdpwusds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269D38C2B80000000" , vpdpwusds(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269D38C2B80000000" , vpdpwusds(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DD3CB" , vpdpwusds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DD38C2B80000000" , vpdpwusds(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DD38C2B80000000" , vpdpwusds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E268D2CB" , vpdpwuud(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268D28C2B80000000" , vpdpwuud(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E268D28C2B80000000" , vpdpwuud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26CD2CB" , vpdpwuud(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26CD28C2B80000000" , vpdpwuud(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26CD28C2B80000000" , vpdpwuud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E268D3CB" , vpdpwuuds(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268D38C2B80000000" , vpdpwuuds(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E268D38C2B80000000" , vpdpwuuds(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26CD3CB" , vpdpwuuds(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26CD38C2B80000000" , vpdpwuuds(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26CD38C2B80000000" , vpdpwuuds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); +} + +static void ASMJIT_NOINLINE testX86AssemblerAVX_SHA512(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E27FCCCA" , vsha512msg1(ymm1, xmm2)); + TEST_INSTRUCTION("C4E27FCDCA" , vsha512msg2(ymm1, ymm2)); + TEST_INSTRUCTION("C4E26FCBCB" , vsha512rnds2(ymm1, ymm2, xmm3)); +} + +static void ASMJIT_NOINLINE testX86AssemblerAVX_SM3(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E268DACB" , vsm3msg1(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E268DA8C2B80000000" , vsm3msg1(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E268DA8C2B80000000" , vsm3msg1(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DACB" , vsm3msg2(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269DA8C2B80000000" , vsm3msg2(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269DA8C2B80000000" , vsm3msg2(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E369DECB01" , vsm3rnds2(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("C4E369DE8C2B8000000001" , vsm3rnds2(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("C4E369DE8C2B8000000001" , vsm3rnds2(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); +} + +static void ASMJIT_NOINLINE testX86AssemblerAVX_SM4(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E26ADACB" , vsm4key4(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26ADA8C2B80000000" , vsm4key4(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26ADA8C2B80000000" , vsm4key4(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26EDACB" , vsm4key4(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26EDA8C2B80000000" , vsm4key4(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26EDA8C2B80000000" , vsm4key4(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26BDACB" , vsm4rnds4(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E26BDA8C2B80000000" , vsm4rnds4(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26BDA8C2B80000000" , vsm4rnds4(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26FDACB" , vsm4rnds4(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26FDA8C2B80000000" , vsm4rnds4(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26FDA8C2B80000000" , vsm4rnds4(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); +} + +static void ASMJIT_NOINLINE testX86AssemblerFMA(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E2E998CB" , vfmadd132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED98CB" , vfmadd132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26998CB" , vfmadd132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D98CB" , vfmadd132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E999CB" , vfmadd132sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26999CB" , vfmadd132ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A8CB" , vfmadd213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA8CB" , vfmadd213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269A8CB" , vfmadd213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DA8CB" , vfmadd213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A9CB" , vfmadd213sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269A9CB" , vfmadd213ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B8CB" , vfmadd231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB8CB" , vfmadd231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269B8CB" , vfmadd231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DB8CB" , vfmadd231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B9CB" , vfmadd231sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269B9CB" , vfmadd231ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E996CB" , vfmaddsub132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED96CB" , vfmaddsub132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26996CB" , vfmaddsub132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D96CB" , vfmaddsub132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A6CB" , vfmaddsub213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA6CB" , vfmaddsub213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269A6CB" , vfmaddsub213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DA6CB" , vfmaddsub213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B6CB" , vfmaddsub231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB6CB" , vfmaddsub231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269B6CB" , vfmaddsub231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DB6CB" , vfmaddsub231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99ACB" , vfmsub132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9ACB" , vfmsub132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699ACB" , vfmsub132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D9ACB" , vfmsub132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99BCB" , vfmsub132sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699BCB" , vfmsub132ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AACB" , vfmsub213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAACB" , vfmsub213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269AACB" , vfmsub213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DAACB" , vfmsub213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9ABCB" , vfmsub213sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269ABCB" , vfmsub213ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BACB" , vfmsub231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBACB" , vfmsub231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BACB" , vfmsub231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DBACB" , vfmsub231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BBCB" , vfmsub231sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BBCB" , vfmsub231ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E997CB" , vfmsubadd132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED97CB" , vfmsubadd132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26997CB" , vfmsubadd132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D97CB" , vfmsubadd132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A7CB" , vfmsubadd213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA7CB" , vfmsubadd213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269A7CB" , vfmsubadd213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DA7CB" , vfmsubadd213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B7CB" , vfmsubadd231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB7CB" , vfmsubadd231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269B7CB" , vfmsubadd231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DB7CB" , vfmsubadd231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99CCB" , vfnmadd132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9CCB" , vfnmadd132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699CCB" , vfnmadd132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D9CCB" , vfnmadd132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99DCB" , vfnmadd132sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699DCB" , vfnmadd132ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9ACCB" , vfnmadd213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDACCB" , vfnmadd213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269ACCB" , vfnmadd213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DACCB" , vfnmadd213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9ADCB" , vfnmadd213sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269ADCB" , vfnmadd213ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BCCB" , vfnmadd231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBCCB" , vfnmadd231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BCCB" , vfnmadd231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DBCCB" , vfnmadd231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BDCB" , vfnmadd231sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BDCB" , vfnmadd231ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99ECB" , vfnmsub132pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9ECB" , vfnmsub132pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699ECB" , vfnmsub132ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D9ECB" , vfnmsub132ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99FCB" , vfnmsub132sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699FCB" , vfnmsub132ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AECB" , vfnmsub213pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAECB" , vfnmsub213pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269AECB" , vfnmsub213ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DAECB" , vfnmsub213ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AFCB" , vfnmsub213sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269AFCB" , vfnmsub213ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BECB" , vfnmsub231pd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBECB" , vfnmsub231pd(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BECB" , vfnmsub231ps(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DBECB" , vfnmsub231ps(ymm1, ymm2, ymm3)); + TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BFCB" , vfnmsub231sd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BFCB" , vfnmsub231ss(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); +} + +static void ASMJIT_NOINLINE testX86AssemblerFMA4(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("C4E3E969CC30" , vfmaddpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED69CC30" , vfmaddpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E968CC30" , vfmaddps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED68CC30" , vfmaddps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E96BCC30" , vfmaddsd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E96ACC30" , vfmaddss(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E95DCC30" , vfmaddsubpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED5DCC30" , vfmaddsubpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E95CCC30" , vfmaddsubps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED5CCC30" , vfmaddsubps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E95FCC30" , vfmsubaddpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED5FCC30" , vfmsubaddpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E95ECC30" , vfmsubaddps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED5ECC30" , vfmsubaddps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E96DCC30" , vfmsubpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED6DCC30" , vfmsubpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E96CCC30" , vfmsubps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED6CCC30" , vfmsubps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E96FCC30" , vfmsubsd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E96ECC30" , vfmsubss(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E979CC30" , vfnmaddpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED79CC30" , vfnmaddpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E978CC30" , vfnmaddps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED78CC30" , vfnmaddps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E97BCC30" , vfnmaddsd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E97ACC30" , vfnmaddss(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E97DCC30" , vfnmsubpd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED7DCC30" , vfnmsubpd(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E97CCC30" , vfnmsubps(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3ED7CCC30" , vfnmsubps(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("C4E3E97FCC30" , vfnmsubsd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3E97ECC30" , vfnmsubss(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6)); +} + +static void ASMJIT_NOINLINE testX86AssemblerXOP(AssemblerTester& tester) noexcept { + using namespace x86; + + TEST_INSTRUCTION("8FE97881CA" , vfrczpd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97C81CA" , vfrczpd(ymm1, ymm2)); + TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97880CA" , vfrczps(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97C80CA" , vfrczps(ymm1, ymm2)); + TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97883CA" , vfrczsd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, qword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE97882CA" , vfrczss(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, dword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE868A2CB40" , vpcmov(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86CA2CB40" , vpcmov(ymm1, ymm2, ymm3, ymm4)); + TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); + TEST_INSTRUCTION("8FE868CCCB01" , vpcomb(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CECB01" , vpcomd(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CFCB01" , vpcomq(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868ECCB01" , vpcomub(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EECB01" , vpcomud(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EFCB01" , vpcomuq(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868EDCB01" , vpcomuw(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CDCB01" , vpcomw(xmm1, xmm2, xmm3, 1)); + TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("8FE978C2CA" , vphaddbd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978C3CA" , vphaddbq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978C1CA" , vphaddbw(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978CBCA" , vphadddq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D2CA" , vphaddubd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D3CA" , vphaddubq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D1CA" , vphaddubw(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978DBCA" , vphaddudq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D6CA" , vphadduwd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D7CA" , vphadduwq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978C6CA" , vphaddwd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978C7CA" , vphaddwq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978E1CA" , vphsubbw(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978E3CA" , vphsubdq(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978E2CA" , vphsubwd(xmm1, xmm2)); + TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("8FE8689ECB40" , vpmacsdd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8689FCB40" , vpmacsdqh(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86897CB40" , vpmacsdql(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8688ECB40" , vpmacssdd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8688FCB40" , vpmacssdqh(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86887CB40" , vpmacssdql(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86886CB40" , vpmacsswd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86885CB40" , vpmacssww(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86896CB40" , vpmacswd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE86895CB40" , vpmacsww(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A6CB40" , vpmadcsswd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868B6CB40" , vpmadcswd(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A3CB40" , vpperm(xmm1, xmm2, xmm3, xmm4)); + TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); + TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); + TEST_INSTRUCTION("8FE96090CA" , vprotb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE878C0CA01" , vprotb(xmm1, xmm2, 1)); + TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FE96092CA" , vprotd(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE878C2CA01" , vprotd(xmm1, xmm2, 1)); + TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FE96093CA" , vprotq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE878C3CA01" , vprotq(xmm1, xmm2, 1)); + TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FE96091CA" , vprotw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE878C1CA01" , vprotw(xmm1, xmm2, 1)); + TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); + TEST_INSTRUCTION("8FE96098CA" , vpshab(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE9609ACA" , vpshad(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE9609BCA" , vpshaq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96099CA" , vpshaw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96094CA" , vpshlb(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96096CA" , vpshld(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96097CA" , vpshlq(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE96095CA" , vpshlw(xmm1, xmm2, xmm3)); + TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, ptr(edx, ebx, 0, 128), xmm4)); + TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); +} + +static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester& tester) noexcept { using namespace x86; TEST_INSTRUCTION("C5ED4ACB" , kaddb(k1, k2, k3)); @@ -2614,84 +5031,24 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5E958CB" , vaddpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9588C2B80000000" , vaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED58CB" , vaddpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED588C2B80000000" , vaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED4858CB" , vaddpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E858CB" , vaddps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8588C2B80000000" , vaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC58CB" , vaddps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC588C2B80000000" , vaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C4858CB" , vaddps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48584C2B02" , vaddps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C48584C2B02" , vaddps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB58CB" , vaddsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB588C2B80000000" , vaddsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA58CB" , vaddss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA588C2B80000000" , vaddss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D0CB" , vaddsubpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D08C2B80000000" , vaddsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD0CB" , vaddsubpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD08C2B80000000" , vaddsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EBD0CB" , vaddsubps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EBD08C2B80000000" , vaddsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EFD0CB" , vaddsubps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EFD08C2B80000000" , vaddsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269DECB" , vaesdec(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269DE8C2B80000000" , vaesdec(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DDECB" , vaesdec(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DDE8C2B80000000" , vaesdec(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48DECB" , vaesdec(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48DE4C2B02" , vaesdec(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48DE4C2B02" , vaesdec(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269DFCB" , vaesdeclast(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269DF8C2B80000000" , vaesdeclast(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DDFCB" , vaesdeclast(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DDF8C2B80000000" , vaesdeclast(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48DFCB" , vaesdeclast(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48DF4C2B02" , vaesdeclast(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48DF4C2B02" , vaesdeclast(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269DCCB" , vaesenc(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269DC8C2B80000000" , vaesenc(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DDCCB" , vaesenc(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DDC8C2B80000000" , vaesenc(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48DCCB" , vaesenc(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48DC4C2B02" , vaesenc(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48DC4C2B02" , vaesenc(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269DDCB" , vaesenclast(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269DD8C2B80000000" , vaesenclast(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DDDCB" , vaesenclast(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DDD8C2B80000000" , vaesenclast(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48DDCB" , vaesenclast(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48DD4C2B02" , vaesenclast(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48DD4C2B02" , vaesenclast(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E279DBCA" , vaesimc(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279DB8C1A80000000" , vaesimc(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E379DFCA01" , vaeskeygenassist(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379DF8C1A8000000001" , vaeskeygenassist(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F36D0803CB01" , valignd(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08034C2B0801" , valignd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08034C2B0801" , valignd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); @@ -2710,39 +5067,15 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4803CB01" , valignq(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48034C2B0201" , valignq(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48034C2B0201" , valignq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E955CB" , vandnpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9558C2B80000000" , vandnpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED55CB" , vandnpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED558C2B80000000" , vandnpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED4855CB" , vandnpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48554C2B02" , vandnpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48554C2B02" , vandnpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E855CB" , vandnps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8558C2B80000000" , vandnps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC55CB" , vandnps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC558C2B80000000" , vandnps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C4855CB" , vandnps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48554C2B02" , vandnps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C48554C2B02" , vandnps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E954CB" , vandpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9548C2B80000000" , vandpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED54CB" , vandpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED548C2B80000000" , vandpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED4854CB" , vandpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48544C2B02" , vandpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48544C2B02" , vandpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E854CB" , vandps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8548C2B80000000" , vandps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC54CB" , vandps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC548C2B80000000" , vandps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C4854CB" , vandps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48544C2B02" , vandps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C48544C2B02" , vandps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -2764,32 +5097,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D4865CB" , vblendmps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48654C2B02" , vblendmps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48654C2B02" , vblendmps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E3690DCB01" , vblendpd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690D8C2B8000000001" , vblendpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0DCB01" , vblendpd(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0D8C2B8000000001" , vblendpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690CCB01" , vblendps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690C8C2B8000000001" , vblendps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0CCB01" , vblendps(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0C8C2B8000000001" , vblendps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3694BCB40" , vblendvpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3694B8C2B8000000060" , vblendvpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E36D4BCB40" , vblendvpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D4B8C2B8000000060" , vblendvpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3694ACB40" , vblendvps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3694A8C2B8000000060" , vblendvps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E36D4ACB40" , vblendvps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D4A8C2B8000000060" , vblendvps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D1A8C1A80000000" , vbroadcastf128(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D2819CA" , vbroadcastf32x2(ymm1, xmm2)); TEST_INSTRUCTION("62F27D28194C1A10" , vbroadcastf32x2(ymm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D28194C1A10" , vbroadcastf32x2(ymm1, qword_ptr(edx, ebx, 0, 128))); @@ -2808,8 +5115,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD481A4C1A08" , vbroadcastf64x2(zmm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD481B4C1A04" , vbroadcastf64x4(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD481B4C1A04" , vbroadcastf64x4(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D5A8C1A80000000" , vbroadcasti128(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D0859CA" , vbroadcasti32x2(xmm1, xmm2)); TEST_INSTRUCTION("62F27D08594C1A10" , vbroadcasti32x2(xmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D08594C1A10" , vbroadcasti32x2(xmm1, qword_ptr(edx, ebx, 0, 128))); @@ -2831,69 +5136,36 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD485A4C1A08" , vbroadcasti64x2(zmm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD485B4C1A04" , vbroadcasti64x4(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD485B4C1A04" , vbroadcasti64x4(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D19CA" , vbroadcastsd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D198C1A80000000" , vbroadcastsd(ymm1, qword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD4819CA" , vbroadcastsd(zmm1, xmm2)); TEST_INSTRUCTION("62F2FD48194C1A10" , vbroadcastsd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD48194C1A10" , vbroadcastsd(zmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27918CA" , vbroadcastss(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279188C1A80000000" , vbroadcastss(xmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D18CA" , vbroadcastss(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D188C1A80000000" , vbroadcastss(ymm1, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4818CA" , vbroadcastss(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48184C1A20" , vbroadcastss(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48184C1A20" , vbroadcastss(zmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5E9C2CB01" , vcmppd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C28C2B8000000001" , vcmppd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED08C2CB01" , vcmppd(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F1ED08C24C2B0801" , vcmppd(k1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED08C24C2B0801" , vcmppd(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5EDC2CB01" , vcmppd(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5EDC28C2B8000000001" , vcmppd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED28C2CB01" , vcmppd(k1, ymm2, ymm3, 1)); TEST_INSTRUCTION("62F1ED28C24C2B0401" , vcmppd(k1, ymm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED28C24C2B0401" , vcmppd(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED48C2CB01" , vcmppd(k1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F1ED48C24C2B0201" , vcmppd(k1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F1ED48C24C2B0201" , vcmppd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E8C2CB01" , vcmpps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E8C28C2B8000000001" , vcmpps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F16C08C2CB01" , vcmpps(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F16C08C24C2B0801" , vcmpps(k1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F16C08C24C2B0801" , vcmpps(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5ECC2CB01" , vcmpps(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5ECC28C2B8000000001" , vcmpps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F16C28C2CB01" , vcmpps(k1, ymm2, ymm3, 1)); TEST_INSTRUCTION("62F16C28C24C2B0401" , vcmpps(k1, ymm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F16C28C24C2B0401" , vcmpps(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F16C48C2CB01" , vcmpps(k1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F16C48C24C2B0201" , vcmpps(k1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F16C48C24C2B0201" , vcmpps(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5EBC2CB01" , vcmpsd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5EBC28C2B8000000001" , vcmpsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F1EF08C2CB01" , vcmpsd(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F1EF08C24C2B1001" , vcmpsd(k1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F1EF08C24C2B1001" , vcmpsd(k1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5EAC2CB01" , vcmpss(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5EAC28C2B8000000001" , vcmpss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F16E08C2CB01" , vcmpss(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F16E08C24C2B2001" , vcmpss(k1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F16E08C24C2B2001" , vcmpss(k1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5F92FCA" , vcomisd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F92F8C1A80000000" , vcomisd(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F82FCA" , vcomiss(xmm1, xmm2)); - TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F82F8C1A80000000" , vcomiss(xmm1, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD088AD1" , vcompresspd(xmm1, xmm2)); TEST_INSTRUCTION("62F2FD088A5C1110" , vcompresspd(ptr(ecx, edx, 0, 128), xmm3)); TEST_INSTRUCTION("62F2FD088A5C1110" , vcompresspd(xmmword_ptr(ecx, edx, 0, 128), xmm3)); @@ -2912,21 +5184,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27D488AD1" , vcompressps(zmm1, zmm2)); TEST_INSTRUCTION("62F27D488A5C1120" , vcompressps(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F27D488A5C1120" , vcompressps(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5FAE6CA" , vcvtdq2pd(xmm1, xmm2)); - TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FAE68C1A80000000" , vcvtdq2pd(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FEE6CA" , vcvtdq2pd(ymm1, xmm2)); - TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FEE68C1A80000000" , vcvtdq2pd(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E48E6CA" , vcvtdq2pd(zmm1, ymm2)); TEST_INSTRUCTION("62F17E48E64C1A04" , vcvtdq2pd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E48E64C1A04" , vcvtdq2pd(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F85BCA" , vcvtdq2ps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F85B8C1A80000000" , vcvtdq2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC5BCA" , vcvtdq2ps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC5B8C1A80000000" , vcvtdq2ps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C485BCA" , vcvtdq2ps(zmm1, zmm2)); TEST_INSTRUCTION("62F17C485B4C1A02" , vcvtdq2ps(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C485B4C1A02" , vcvtdq2ps(zmm1, zmmword_ptr(edx, ebx, 0, 128))); @@ -2946,17 +5206,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27E4872CA" , vcvtneps2bf16(ymm1, zmm2)); TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FBE6CA" , vcvtpd2dq(xmm1, xmm2)); - TEST_INSTRUCTION("C5FFE6CA" , vcvtpd2dq(xmm1, ymm2)); - TEST_INSTRUCTION("C5FBE68C1A80000000" , vcvtpd2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FFE68C1A80000000" , vcvtpd2dq(xmm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FF48E6CA" , vcvtpd2dq(ymm1, zmm2)); TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F95ACA" , vcvtpd2ps(xmm1, xmm2)); - TEST_INSTRUCTION("C5FD5ACA" , vcvtpd2ps(xmm1, ymm2)); - TEST_INSTRUCTION("C5F95A8C1A80000000" , vcvtpd2ps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD5A8C1A80000000" , vcvtpd2ps(xmm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD485ACA" , vcvtpd2ps(ymm1, zmm2)); TEST_INSTRUCTION("62F1FD485A4C1A02" , vcvtpd2ps(ymm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD485A4C1A02" , vcvtpd2ps(ymm1, zmmword_ptr(edx, ebx, 0, 128))); @@ -2985,39 +5237,15 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1FD4879CA" , vcvtpd2uqq(zmm1, zmm2)); TEST_INSTRUCTION("62F1FD48794C1A02" , vcvtpd2uqq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD48794C1A02" , vcvtpd2uqq(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27913CA" , vcvtph2ps(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279138C1A80000000" , vcvtph2ps(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D13CA" , vcvtph2ps(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D138C1A80000000" , vcvtph2ps(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4813CA" , vcvtph2ps(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48134C1A04" , vcvtph2ps(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48134C1A04" , vcvtph2ps(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F95BCA" , vcvtps2dq(xmm1, xmm2)); - TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F95B8C1A80000000" , vcvtps2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD5BCA" , vcvtps2dq(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD5B8C1A80000000" , vcvtps2dq(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17D485BCA" , vcvtps2dq(zmm1, zmm2)); TEST_INSTRUCTION("62F17D485B4C1A02" , vcvtps2dq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17D485B4C1A02" , vcvtps2dq(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F85ACA" , vcvtps2pd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F85A8C1A80000000" , vcvtps2pd(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC5ACA" , vcvtps2pd(ymm1, xmm2)); - TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC5A8C1A80000000" , vcvtps2pd(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C485ACA" , vcvtps2pd(zmm1, ymm2)); TEST_INSTRUCTION("62F17C485A4C1A04" , vcvtps2pd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C485A4C1A04" , vcvtps2pd(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E3791DD101" , vcvtps2ph(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(ptr(ecx, edx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E3791D9C118000000001" , vcvtps2ph(qword_ptr(ecx, edx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E37D1DD101" , vcvtps2ph(xmm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(ptr(ecx, edx, 0, 128), ymm3, 1)); - TEST_INSTRUCTION("C4E37D1D9C118000000001" , vcvtps2ph(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1)); TEST_INSTRUCTION("62F37D481DD101" , vcvtps2ph(ymm1, zmm2, 1)); TEST_INSTRUCTION("62F37D481D5C110401" , vcvtps2ph(ptr(ecx, edx, 0, 128), zmm3, 1)); TEST_INSTRUCTION("62F37D481D5C110401" , vcvtps2ph(ymmword_ptr(ecx, edx, 0, 128), zmm3, 1)); @@ -3064,36 +5292,12 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1FC485BCA" , vcvtqq2ps(ymm1, zmm2)); TEST_INSTRUCTION("62F1FC485B4C1A02" , vcvtqq2ps(ymm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FC485B4C1A02" , vcvtqq2ps(ymm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FB2DCA" , vcvtsd2si(ecx, xmm2)); - TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FB2D8C1A80000000" , vcvtsd2si(ecx, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5EB5ACB" , vcvtsd2ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB5A8C2B80000000" , vcvtsd2ss(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F17F0879CA" , vcvtsd2usi(ecx, xmm2)); TEST_INSTRUCTION("62F17F08794C1A10" , vcvtsd2usi(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17F08794C1A10" , vcvtsd2usi(ecx, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5EB2ACB" , vcvtsi2sd(xmm1, xmm2, ebx)); - TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E1EB2A8C2B80000000" , vcvtsi2sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA2ACB" , vcvtsi2ss(xmm1, xmm2, ebx)); - TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E1EA2A8C2B80000000" , vcvtsi2ss(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5ACB" , vcvtss2sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5A8C2B80000000" , vcvtss2sd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5FA2DCA" , vcvtss2si(ecx, xmm2)); - TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA2D8C1A80000000" , vcvtss2si(ecx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E0879CA" , vcvtss2usi(ecx, xmm2)); TEST_INSTRUCTION("62F17E08794C1A20" , vcvtss2usi(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E08794C1A20" , vcvtss2usi(ecx, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F9E6CA" , vcvttpd2dq(xmm1, xmm2)); - TEST_INSTRUCTION("C5FDE6CA" , vcvttpd2dq(xmm1, ymm2)); - TEST_INSTRUCTION("C5F9E68C1A80000000" , vcvttpd2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FDE68C1A80000000" , vcvttpd2dq(xmm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD48E6CA" , vcvttpd2dq(ymm1, zmm2)); TEST_INSTRUCTION("62F1FD48E64C1A02" , vcvttpd2dq(ymm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD48E64C1A02" , vcvttpd2dq(ymm1, zmmword_ptr(edx, ebx, 0, 128))); @@ -3120,14 +5324,8 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1FD28784C1A04" , vcvttpd2uqq(ymm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD28784C1A04" , vcvttpd2uqq(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD4878CA" , vcvttpd2uqq(zmm1, zmm2)); - TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA5BCA" , vcvttps2dq(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA5B8C1A80000000" , vcvttps2dq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FE5BCA" , vcvttps2dq(ymm1, ymm2)); - TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FE5B8C1A80000000" , vcvttps2dq(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F1FD48784C1A02" , vcvttpd2uqq(zmm1, zmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E485BCA" , vcvttps2dq(zmm1, zmm2)); TEST_INSTRUCTION("62F17E485B4C1A02" , vcvttps2dq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E485B4C1A02" , vcvttps2dq(zmm1, zmmword_ptr(edx, ebx, 0, 128))); @@ -3158,15 +5356,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F17D4878CA" , vcvttps2uqq(zmm1, ymm2)); TEST_INSTRUCTION("62F17D48784C1A04" , vcvttps2uqq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17D48784C1A04" , vcvttps2uqq(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FB2CCA" , vcvttsd2si(ecx, xmm2)); - TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FB2C8C1A80000000" , vcvttsd2si(ecx, qword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17F0878CA" , vcvttsd2usi(ecx, xmm2)); TEST_INSTRUCTION("62F17F08784C1A10" , vcvttsd2usi(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17F08784C1A10" , vcvttsd2usi(ecx, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA2CCA" , vcvttss2si(ecx, xmm2)); - TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA2C8C1A80000000" , vcvttss2si(ecx, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E0878CA" , vcvttss2usi(ecx, xmm2)); TEST_INSTRUCTION("62F17E08784C1A20" , vcvttss2usi(ecx, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E08784C1A20" , vcvttss2usi(ecx, dword_ptr(edx, ebx, 0, 128))); @@ -3207,11 +5399,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16F087BCB" , vcvtusi2sd(xmm1, xmm2, ebx)); TEST_INSTRUCTION("62F16F087B4C2B20" , vcvtusi2sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16F087B4C2B20" , vcvtusi2sd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("62F1EF087B4C2B10" , vcvtusi2sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16E087BCB" , vcvtusi2ss(xmm1, xmm2, ebx)); TEST_INSTRUCTION("62F16E087B4C2B20" , vcvtusi2ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16E087B4C2B20" , vcvtusi2ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("62F1EE087B4C2B10" , vcvtusi2ss(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F36D0842CB01" , vdbpsadbw(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08424C2B0801" , vdbpsadbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); @@ -3221,30 +5411,12 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F36D4842CB01" , vdbpsadbw(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D48424C2B0201" , vdbpsadbw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E95ECB" , vdivpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E95E8C2B80000000" , vdivpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED5ECB" , vdivpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED5E8C2B80000000" , vdivpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED485ECB" , vdivpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E85ECB" , vdivps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E85E8C2B80000000" , vdivps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC5ECB" , vdivps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC5E8C2B80000000" , vdivps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C485ECB" , vdivps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C485E4C2B02" , vdivps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C485E4C2B02" , vdivps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB5ECB" , vdivsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB5E8C2B80000000" , vdivsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5ECB" , vdivss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5E8C2B80000000" , vdivss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26E0852CB" , vdpbf16ps(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26E08524C2B08" , vdpbf16ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26E08524C2B08" , vdpbf16ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -3254,15 +5426,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26E4852CB" , vdpbf16ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E36941CB01" , vdppd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369418C2B8000000001" , vdppd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36940CB01" , vdpps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369408C2B8000000001" , vdpps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D40CB01" , vdpps(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D408C2B8000000001" , vdpps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F2FD48C8CA" , vexp2pd(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, zmmword_ptr(edx, ebx, 0, 128))); @@ -3287,9 +5450,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27D4888CA" , vexpandps(zmm1, zmm2)); TEST_INSTRUCTION("62F27D48884C1A20" , vexpandps(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48884C1A20" , vexpandps(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E37D19D101" , vextractf128(xmm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(ptr(ecx, edx, 0, 128), ymm3, 1)); - TEST_INSTRUCTION("C4E37D199C118000000001" , vextractf128(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1)); TEST_INSTRUCTION("62F37D2819D101" , vextractf32x4(xmm1, ymm2, 1)); TEST_INSTRUCTION("62F37D4819D101" , vextractf32x4(xmm1, zmm2, 1)); TEST_INSTRUCTION("62F37D28195C110801" , vextractf32x4(ptr(ecx, edx, 0, 128), ymm3, 1)); @@ -3308,9 +5468,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3FD481BD101" , vextractf64x4(ymm1, zmm2, 1)); TEST_INSTRUCTION("62F3FD481B5C110401" , vextractf64x4(ptr(ecx, edx, 0, 128), zmm3, 1)); TEST_INSTRUCTION("62F3FD481B5C110401" , vextractf64x4(ymmword_ptr(ecx, edx, 0, 128), zmm3, 1)); - TEST_INSTRUCTION("C4E37D39D101" , vextracti128(xmm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(ptr(ecx, edx, 0, 128), ymm3, 1)); - TEST_INSTRUCTION("C4E37D399C118000000001" , vextracti128(xmmword_ptr(ecx, edx, 0, 128), ymm3, 1)); TEST_INSTRUCTION("62F37D2839D101" , vextracti32x4(xmm1, ymm2, 1)); TEST_INSTRUCTION("62F37D4839D101" , vextracti32x4(xmm1, zmm2, 1)); TEST_INSTRUCTION("62F37D28395C110801" , vextracti32x4(ptr(ecx, edx, 0, 128), ymm3, 1)); @@ -3329,9 +5486,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3FD483BD101" , vextracti64x4(ymm1, zmm2, 1)); TEST_INSTRUCTION("62F3FD483B5C110401" , vextracti64x4(ptr(ecx, edx, 0, 128), zmm3, 1)); TEST_INSTRUCTION("62F3FD483B5C110401" , vextracti64x4(ymmword_ptr(ecx, edx, 0, 128), zmm3, 1)); - TEST_INSTRUCTION("C4E37917D101" , vextractps(ecx, xmm2, 1)); - TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(ptr(ecx, edx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E379179C118000000001" , vextractps(dword_ptr(ecx, edx, 0, 128), xmm3, 1)); TEST_INSTRUCTION("62F3ED0854CB01" , vfixupimmpd(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F3ED08544C2B0801" , vfixupimmpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED08544C2B0801" , vfixupimmpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); @@ -3356,562 +5510,114 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F36D0855CB01" , vfixupimmss(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08554C2B2001" , vfixupimmss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08554C2B2001" , vfixupimmss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E2E998CB" , vfmadd132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9988C2B80000000" , vfmadd132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED98CB" , vfmadd132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED988C2B80000000" , vfmadd132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED4898CB" , vfmadd132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48984C2B02" , vfmadd132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48984C2B02" , vfmadd132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26998CB" , vfmadd132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269988C2B80000000" , vfmadd132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D98CB" , vfmadd132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D988C2B80000000" , vfmadd132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4898CB" , vfmadd132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48984C2B02" , vfmadd132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48984C2B02" , vfmadd132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E999CB" , vfmadd132sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9998C2B80000000" , vfmadd132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26999CB" , vfmadd132ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269998C2B80000000" , vfmadd132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A8CB" , vfmadd213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A88C2B80000000" , vfmadd213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA8CB" , vfmadd213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA88C2B80000000" , vfmadd213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48A8CB" , vfmadd213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48A84C2B02" , vfmadd213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48A84C2B02" , vfmadd213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269A8CB" , vfmadd213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269A88C2B80000000" , vfmadd213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DA8CB" , vfmadd213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DA88C2B80000000" , vfmadd213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48A8CB" , vfmadd213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48A84C2B02" , vfmadd213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48A84C2B02" , vfmadd213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A9CB" , vfmadd213sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A98C2B80000000" , vfmadd213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269A9CB" , vfmadd213ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269A98C2B80000000" , vfmadd213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B8CB" , vfmadd231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B88C2B80000000" , vfmadd231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB8CB" , vfmadd231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB88C2B80000000" , vfmadd231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48B8CB" , vfmadd231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48B84C2B02" , vfmadd231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48B84C2B02" , vfmadd231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269B8CB" , vfmadd231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269B88C2B80000000" , vfmadd231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DB8CB" , vfmadd231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DB88C2B80000000" , vfmadd231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48B8CB" , vfmadd231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48B84C2B02" , vfmadd231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48B84C2B02" , vfmadd231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B9CB" , vfmadd231sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B98C2B80000000" , vfmadd231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269B9CB" , vfmadd231ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269B98C2B80000000" , vfmadd231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E3E969CC30" , vfmaddpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E9698C358000000030" , vfmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E369698C2B8000000060" , vfmaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED69CC30" , vfmaddpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED698C358000000030" , vfmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D698C2B8000000060" , vfmaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E968CC30" , vfmaddps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E9688C358000000030" , vfmaddps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E369688C2B8000000060" , vfmaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED68CC30" , vfmaddps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED688C358000000030" , vfmaddps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D688C2B8000000060" , vfmaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E96BCC30" , vfmaddsd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E96B8C358000000030" , vfmaddsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696B8C2B8000000060" , vfmaddsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3E96ACC30" , vfmaddss(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E96A8C358000000030" , vfmaddss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696A8C2B8000000060" , vfmaddss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E2E996CB" , vfmaddsub132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9968C2B80000000" , vfmaddsub132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED96CB" , vfmaddsub132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED968C2B80000000" , vfmaddsub132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED4896CB" , vfmaddsub132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48964C2B02" , vfmaddsub132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48964C2B02" , vfmaddsub132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26996CB" , vfmaddsub132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269968C2B80000000" , vfmaddsub132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D96CB" , vfmaddsub132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D968C2B80000000" , vfmaddsub132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4896CB" , vfmaddsub132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48964C2B02" , vfmaddsub132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48964C2B02" , vfmaddsub132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A6CB" , vfmaddsub213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A68C2B80000000" , vfmaddsub213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA6CB" , vfmaddsub213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA68C2B80000000" , vfmaddsub213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48A6CB" , vfmaddsub213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48A64C2B02" , vfmaddsub213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48A64C2B02" , vfmaddsub213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269A6CB" , vfmaddsub213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269A68C2B80000000" , vfmaddsub213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DA6CB" , vfmaddsub213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DA68C2B80000000" , vfmaddsub213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48A6CB" , vfmaddsub213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48A64C2B02" , vfmaddsub213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48A64C2B02" , vfmaddsub213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B6CB" , vfmaddsub231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B68C2B80000000" , vfmaddsub231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB6CB" , vfmaddsub231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB68C2B80000000" , vfmaddsub231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48B6CB" , vfmaddsub231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48B64C2B02" , vfmaddsub231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48B64C2B02" , vfmaddsub231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269B6CB" , vfmaddsub231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269B68C2B80000000" , vfmaddsub231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DB6CB" , vfmaddsub231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DB68C2B80000000" , vfmaddsub231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48B6CB" , vfmaddsub231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48B64C2B02" , vfmaddsub231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48B64C2B02" , vfmaddsub231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E3E95DCC30" , vfmaddsubpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E95D8C358000000030" , vfmaddsubpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3695D8C2B8000000060" , vfmaddsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED5DCC30" , vfmaddsubpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED5D8C358000000030" , vfmaddsubpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D5D8C2B8000000060" , vfmaddsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E95CCC30" , vfmaddsubps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E95C8C358000000030" , vfmaddsubps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3695C8C2B8000000060" , vfmaddsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED5CCC30" , vfmaddsubps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED5C8C358000000030" , vfmaddsubps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D5C8C2B8000000060" , vfmaddsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E2E99ACB" , vfmsub132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E99A8C2B80000000" , vfmsub132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9ACB" , vfmsub132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9A8C2B80000000" , vfmsub132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED489ACB" , vfmsub132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED489A4C2B02" , vfmsub132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED489A4C2B02" , vfmsub132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699ACB" , vfmsub132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699A8C2B80000000" , vfmsub132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D9ACB" , vfmsub132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D9A8C2B80000000" , vfmsub132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D489ACB" , vfmsub132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D489A4C2B02" , vfmsub132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D489A4C2B02" , vfmsub132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E99BCB" , vfmsub132sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E99B8C2B80000000" , vfmsub132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699BCB" , vfmsub132ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699B8C2B80000000" , vfmsub132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AACB" , vfmsub213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AA8C2B80000000" , vfmsub213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAACB" , vfmsub213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAA8C2B80000000" , vfmsub213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48AACB" , vfmsub213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48AA4C2B02" , vfmsub213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48AA4C2B02" , vfmsub213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269AACB" , vfmsub213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269AA8C2B80000000" , vfmsub213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DAACB" , vfmsub213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DAA8C2B80000000" , vfmsub213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48AACB" , vfmsub213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48AA4C2B02" , vfmsub213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48AA4C2B02" , vfmsub213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9ABCB" , vfmsub213sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AB8C2B80000000" , vfmsub213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269ABCB" , vfmsub213ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269AB8C2B80000000" , vfmsub213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BACB" , vfmsub231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BA8C2B80000000" , vfmsub231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBACB" , vfmsub231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBA8C2B80000000" , vfmsub231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48BACB" , vfmsub231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48BA4C2B02" , vfmsub231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48BA4C2B02" , vfmsub231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BACB" , vfmsub231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BA8C2B80000000" , vfmsub231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DBACB" , vfmsub231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DBA8C2B80000000" , vfmsub231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48BACB" , vfmsub231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48BA4C2B02" , vfmsub231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48BA4C2B02" , vfmsub231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BBCB" , vfmsub231sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BB8C2B80000000" , vfmsub231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BBCB" , vfmsub231ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BB8C2B80000000" , vfmsub231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E997CB" , vfmsubadd132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9978C2B80000000" , vfmsubadd132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED97CB" , vfmsubadd132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED978C2B80000000" , vfmsubadd132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED4897CB" , vfmsubadd132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48974C2B02" , vfmsubadd132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48974C2B02" , vfmsubadd132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26997CB" , vfmsubadd132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269978C2B80000000" , vfmsubadd132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D97CB" , vfmsubadd132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D978C2B80000000" , vfmsubadd132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4897CB" , vfmsubadd132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48974C2B02" , vfmsubadd132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48974C2B02" , vfmsubadd132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A7CB" , vfmsubadd213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9A78C2B80000000" , vfmsubadd213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA7CB" , vfmsubadd213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDA78C2B80000000" , vfmsubadd213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48A7CB" , vfmsubadd213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48A74C2B02" , vfmsubadd213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269A7CB" , vfmsubadd213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269A78C2B80000000" , vfmsubadd213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DA7CB" , vfmsubadd213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DA78C2B80000000" , vfmsubadd213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48A7CB" , vfmsubadd213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48A74C2B02" , vfmsubadd213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48A74C2B02" , vfmsubadd213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B7CB" , vfmsubadd231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9B78C2B80000000" , vfmsubadd231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB7CB" , vfmsubadd231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDB78C2B80000000" , vfmsubadd231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48B7CB" , vfmsubadd231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48B74C2B02" , vfmsubadd231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48B74C2B02" , vfmsubadd231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269B7CB" , vfmsubadd231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269B78C2B80000000" , vfmsubadd231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DB7CB" , vfmsubadd231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DB78C2B80000000" , vfmsubadd231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48B7CB" , vfmsubadd231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48B74C2B02" , vfmsubadd231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48B74C2B02" , vfmsubadd231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E3E95FCC30" , vfmsubaddpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E95F8C358000000030" , vfmsubaddpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3695F8C2B8000000060" , vfmsubaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED5FCC30" , vfmsubaddpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED5F8C358000000030" , vfmsubaddpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D5F8C2B8000000060" , vfmsubaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E95ECC30" , vfmsubaddps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E95E8C358000000030" , vfmsubaddps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3695E8C2B8000000060" , vfmsubaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED5ECC30" , vfmsubaddps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED5E8C358000000030" , vfmsubaddps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D5E8C2B8000000060" , vfmsubaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E96DCC30" , vfmsubpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E96D8C358000000030" , vfmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696D8C2B8000000060" , vfmsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED6DCC30" , vfmsubpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED6D8C358000000030" , vfmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D6D8C2B8000000060" , vfmsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E96CCC30" , vfmsubps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E96C8C358000000030" , vfmsubps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696C8C2B8000000060" , vfmsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED6CCC30" , vfmsubps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED6C8C358000000030" , vfmsubps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D6C8C2B8000000060" , vfmsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E96FCC30" , vfmsubsd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E96F8C358000000030" , vfmsubsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696F8C2B8000000060" , vfmsubsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3E96ECC30" , vfmsubss(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E96E8C358000000030" , vfmsubss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3696E8C2B8000000060" , vfmsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E2E99CCB" , vfnmadd132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E99C8C2B80000000" , vfnmadd132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9CCB" , vfnmadd132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9C8C2B80000000" , vfnmadd132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED489CCB" , vfnmadd132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED489C4C2B02" , vfnmadd132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED489C4C2B02" , vfnmadd132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699CCB" , vfnmadd132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699C8C2B80000000" , vfnmadd132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D9CCB" , vfnmadd132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D9C8C2B80000000" , vfnmadd132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D489CCB" , vfnmadd132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D489C4C2B02" , vfnmadd132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D489C4C2B02" , vfnmadd132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E99DCB" , vfnmadd132sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E99D8C2B80000000" , vfnmadd132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699DCB" , vfnmadd132ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699D8C2B80000000" , vfnmadd132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9ACCB" , vfnmadd213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AC8C2B80000000" , vfnmadd213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDACCB" , vfnmadd213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAC8C2B80000000" , vfnmadd213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48ACCB" , vfnmadd213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48AC4C2B02" , vfnmadd213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48AC4C2B02" , vfnmadd213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269ACCB" , vfnmadd213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269AC8C2B80000000" , vfnmadd213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DACCB" , vfnmadd213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DAC8C2B80000000" , vfnmadd213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48ACCB" , vfnmadd213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48AC4C2B02" , vfnmadd213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48AC4C2B02" , vfnmadd213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9ADCB" , vfnmadd213sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AD8C2B80000000" , vfnmadd213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269ADCB" , vfnmadd213ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269AD8C2B80000000" , vfnmadd213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BCCB" , vfnmadd231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BC8C2B80000000" , vfnmadd231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBCCB" , vfnmadd231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBC8C2B80000000" , vfnmadd231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48BCCB" , vfnmadd231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48BC4C2B02" , vfnmadd231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48BC4C2B02" , vfnmadd231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BCCB" , vfnmadd231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BC8C2B80000000" , vfnmadd231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DBCCB" , vfnmadd231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DBC8C2B80000000" , vfnmadd231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48BCCB" , vfnmadd231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48BC4C2B02" , vfnmadd231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48BC4C2B02" , vfnmadd231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BDCB" , vfnmadd231sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BD8C2B80000000" , vfnmadd231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BDCB" , vfnmadd231ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BD8C2B80000000" , vfnmadd231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E3E979CC30" , vfnmaddpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E9798C358000000030" , vfnmaddpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E369798C2B8000000060" , vfnmaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED79CC30" , vfnmaddpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED798C358000000030" , vfnmaddpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D798C2B8000000060" , vfnmaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E978CC30" , vfnmaddps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E9788C358000000030" , vfnmaddps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E369788C2B8000000060" , vfnmaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED78CC30" , vfnmaddps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED788C358000000030" , vfnmaddps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D788C2B8000000060" , vfnmaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E97BCC30" , vfnmaddsd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E97B8C358000000030" , vfnmaddsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697B8C2B8000000060" , vfnmaddsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3E97ACC30" , vfnmaddss(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E97A8C358000000030" , vfnmaddss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697A8C2B8000000060" , vfnmaddss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E2E99ECB" , vfnmsub132pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E99E8C2B80000000" , vfnmsub132pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9ECB" , vfnmsub132pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED9E8C2B80000000" , vfnmsub132pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED489ECB" , vfnmsub132pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED489E4C2B02" , vfnmsub132pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED489E4C2B02" , vfnmsub132pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699ECB" , vfnmsub132ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699E8C2B80000000" , vfnmsub132ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D9ECB" , vfnmsub132ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D9E8C2B80000000" , vfnmsub132ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D489ECB" , vfnmsub132ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D489E4C2B02" , vfnmsub132ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D489E4C2B02" , vfnmsub132ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E99FCB" , vfnmsub132sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E99F8C2B80000000" , vfnmsub132sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699FCB" , vfnmsub132ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2699F8C2B80000000" , vfnmsub132ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AECB" , vfnmsub213pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AE8C2B80000000" , vfnmsub213pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAECB" , vfnmsub213pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDAE8C2B80000000" , vfnmsub213pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48AECB" , vfnmsub213pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48AE4C2B02" , vfnmsub213pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48AE4C2B02" , vfnmsub213pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269AECB" , vfnmsub213ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269AE8C2B80000000" , vfnmsub213ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DAECB" , vfnmsub213ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DAE8C2B80000000" , vfnmsub213ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48AECB" , vfnmsub213ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48AE4C2B02" , vfnmsub213ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48AE4C2B02" , vfnmsub213ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AFCB" , vfnmsub213sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9AF8C2B80000000" , vfnmsub213sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269AFCB" , vfnmsub213ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269AF8C2B80000000" , vfnmsub213ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BECB" , vfnmsub231pd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BE8C2B80000000" , vfnmsub231pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBECB" , vfnmsub231pd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2EDBE8C2B80000000" , vfnmsub231pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48BECB" , vfnmsub231pd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48BE4C2B02" , vfnmsub231pd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48BE4C2B02" , vfnmsub231pd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BECB" , vfnmsub231ps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BE8C2B80000000" , vfnmsub231ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DBECB" , vfnmsub231ps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DBE8C2B80000000" , vfnmsub231ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48BECB" , vfnmsub231ps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48BE4C2B02" , vfnmsub231ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48BE4C2B02" , vfnmsub231ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BFCB" , vfnmsub231sd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9BF8C2B80000000" , vfnmsub231sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BFCB" , vfnmsub231ss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E3E97DCC30" , vfnmsubpd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E97D8C358000000030" , vfnmsubpd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697D8C2B8000000060" , vfnmsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED7DCC30" , vfnmsubpd(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED7D8C358000000030" , vfnmsubpd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D7D8C2B8000000060" , vfnmsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E97CCC30" , vfnmsubps(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E97C8C358000000030" , vfnmsubps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697C8C2B8000000060" , vfnmsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3ED7CCC30" , vfnmsubps(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3ED7C8C358000000030" , vfnmsubps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D7C8C2B8000000060" , vfnmsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3E97FCC30" , vfnmsubsd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E97F8C358000000030" , vfnmsubsd(xmm1, xmm2, xmm3, qword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697F8C2B8000000060" , vfnmsubsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3E97ECC30" , vfnmsubss(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3E97E8C358000000030" , vfnmsubss(xmm1, xmm2, xmm3, dword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6)); TEST_INSTRUCTION("62F3FD0866CA01" , vfpclasspd(k1, xmm2, 1)); TEST_INSTRUCTION("62F3FD2866CA01" , vfpclasspd(k1, ymm2, 1)); TEST_INSTRUCTION("62F3FD4866CA01" , vfpclasspd(k1, zmm2, 1)); @@ -3930,31 +5636,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F37D0867CA01" , vfpclassss(k1, xmm2, 1)); TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F37D08674C1A2001" , vfpclassss(k1, dword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FE97881CA" , vfrczpd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978818C1A80000000" , vfrczpd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97C81CA" , vfrczpd(ymm1, ymm2)); - TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97C818C1A80000000" , vfrczpd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97880CA" , vfrczps(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978808C1A80000000" , vfrczps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97C80CA" , vfrczps(ymm1, ymm2)); - TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97C808C1A80000000" , vfrczps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97883CA" , vfrczsd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978838C1A80000000" , vfrczsd(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE97882CA" , vfrczss(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978828C1A80000000" , vfrczss(xmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2D9928C1A80000000" , vgatherdpd(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E2DD928C1A80000000" , vgatherdpd(ymm1, ptr(edx, xmm3, 0, 128), ymm4)); TEST_INSTRUCTION("62F2FD09924C1A10" , k(k1).vgatherdpd(xmm1, ptr(edx, xmm3, 0, 128))); TEST_INSTRUCTION("62F2FD29924C1A10" , k(k1).vgatherdpd(ymm1, ptr(edx, xmm3, 0, 128))); TEST_INSTRUCTION("62F2FD49924C1A10" , k(k1).vgatherdpd(zmm1, ptr(edx, ymm3, 0, 128))); - TEST_INSTRUCTION("C4E259928C1A80000000" , vgatherdps(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E25D928C1A80000000" , vgatherdps(ymm1, ptr(edx, ymm3, 0, 128), ymm4)); TEST_INSTRUCTION("62F27D09924C1A20" , k(k1).vgatherdps(xmm1, ptr(edx, xmm3, 0, 128))); TEST_INSTRUCTION("62F27D29924C1A20" , k(k1).vgatherdps(ymm1, ptr(edx, ymm3, 0, 128))); TEST_INSTRUCTION("62F27D49924C1A20" , k(k1).vgatherdps(zmm1, ptr(edx, zmm3, 0, 128))); @@ -3966,13 +5650,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27D49C6541120" , k(k1).vgatherpf1dps(ptr(ecx, zmm2, 0, 128))); TEST_INSTRUCTION("62F2FD49C7541110" , k(k1).vgatherpf1qpd(ptr(ecx, zmm2, 0, 128))); TEST_INSTRUCTION("62F27D49C7541120" , k(k1).vgatherpf1qps(ptr(ecx, zmm2, 0, 128))); - TEST_INSTRUCTION("C4E2D9938C1A80000000" , vgatherqpd(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E2DD938C1A80000000" , vgatherqpd(ymm1, ptr(edx, ymm3, 0, 128), ymm4)); TEST_INSTRUCTION("62F2FD09934C1A10" , k(k1).vgatherqpd(xmm1, ptr(edx, xmm3, 0, 128))); TEST_INSTRUCTION("62F2FD29934C1A10" , k(k1).vgatherqpd(ymm1, ptr(edx, ymm3, 0, 128))); TEST_INSTRUCTION("62F2FD49934C1A10" , k(k1).vgatherqpd(zmm1, ptr(edx, zmm3, 0, 128))); - TEST_INSTRUCTION("C4E259938C1A80000000" , vgatherqps(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E25D938C1A80000000" , vgatherqps(xmm1, ptr(edx, ymm3, 0, 128), xmm4)); TEST_INSTRUCTION("62F27D09934C1A20" , k(k1).vgatherqps(xmm1, ptr(edx, xmm3, 0, 128))); TEST_INSTRUCTION("62F27D29934C1A20" , k(k1).vgatherqps(xmm1, ptr(edx, ymm3, 0, 128))); TEST_INSTRUCTION("62F27D49934C1A20" , k(k1).vgatherqps(ymm1, ptr(edx, zmm3, 0, 128))); @@ -4024,60 +5704,15 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F36D0827CB01" , vgetmantss(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08274C2B2001" , vgetmantss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08274C2B2001" , vgetmantss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9CFCB01" , vgf2p8affineinvqb(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9CF8C2B8000000001" , vgf2p8affineinvqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3EDCFCB01" , vgf2p8affineinvqb(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3EDCF8C2B8000000001" , vgf2p8affineinvqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48CFCB01" , vgf2p8affineinvqb(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48CF4C2B0201" , vgf2p8affineinvqb(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48CF4C2B0201" , vgf2p8affineinvqb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9CECB01" , vgf2p8affineqb(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9CE8C2B8000000001" , vgf2p8affineqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3EDCECB01" , vgf2p8affineqb(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3EDCE8C2B8000000001" , vgf2p8affineqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48CECB01" , vgf2p8affineqb(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48CE4C2B0201" , vgf2p8affineqb(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48CE4C2B0201" , vgf2p8affineqb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E269CFCB" , vgf2p8mulb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269CF8C2B80000000" , vgf2p8mulb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DCFCB" , vgf2p8mulb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26DCF8C2B80000000" , vgf2p8mulb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48CFCB" , vgf2p8mulb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48CF4C2B02" , vgf2p8mulb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48CF4C2B02" , vgf2p8mulb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E97CCB" , vhaddpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E97C8C2B80000000" , vhaddpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED7CCB" , vhaddpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED7C8C2B80000000" , vhaddpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB7CCB" , vhaddps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB7C8C2B80000000" , vhaddps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EF7CCB" , vhaddps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EF7C8C2B80000000" , vhaddps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E97DCB" , vhsubpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E97D8C2B80000000" , vhsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED7DCB" , vhsubpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED7D8C2B80000000" , vhsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB7DCB" , vhsubps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB7D8C2B80000000" , vhsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EF7DCB" , vhsubps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EF7D8C2B80000000" , vhsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E36D18CB01" , vinsertf128(ymm1, ymm2, xmm3, 1)); - TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D188C2B8000000001" , vinsertf128(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D2818CB01" , vinsertf32x4(ymm1, ymm2, xmm3, 1)); TEST_INSTRUCTION("62F36D28184C2B0801" , vinsertf32x4(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D28184C2B0801" , vinsertf32x4(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); @@ -4096,9 +5731,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED481ACB01" , vinsertf64x4(zmm1, zmm2, ymm3, 1)); TEST_INSTRUCTION("62F3ED481A4C2B0401" , vinsertf64x4(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED481A4C2B0401" , vinsertf64x4(zmm1, zmm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D38CB01" , vinserti128(ymm1, ymm2, xmm3, 1)); - TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D388C2B8000000001" , vinserti128(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D2838CB01" , vinserti32x4(ymm1, ymm2, xmm3, 1)); TEST_INSTRUCTION("62F36D28384C2B0801" , vinserti32x4(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D28384C2B0801" , vinserti32x4(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); @@ -4117,136 +5749,31 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED483ACB01" , vinserti64x4(zmm1, zmm2, ymm3, 1)); TEST_INSTRUCTION("62F3ED483A4C2B0401" , vinserti64x4(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED483A4C2B0401" , vinserti64x4(zmm1, zmm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36921CB01" , vinsertps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369218C2B8000000001" , vinsertps(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FBF08C1A80000000" , vlddqu(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FFF08C1A80000000" , vlddqu(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("C5F8AE941180000000" , vldmxcsr(dword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, ptr(edi))); - TEST_INSTRUCTION("C5F9F7CA" , vmaskmovdqu(xmm1, xmm2, xmmword_ptr(edi))); - TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(ptr(ecx, edx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2612FA41180000000" , vmaskmovpd(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ptr(ecx, edx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2652FA41180000000" , vmaskmovpd(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2692D8C2B80000000" , vmaskmovpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D2D8C2B80000000" , vmaskmovpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(ptr(ecx, edx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2612EA41180000000" , vmaskmovps(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ptr(ecx, edx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2652EA41180000000" , vmaskmovps(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2692C8C2B80000000" , vmaskmovps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D2C8C2B80000000" , vmaskmovps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E95FCB" , vmaxpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E95F8C2B80000000" , vmaxpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED5FCB" , vmaxpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED5F8C2B80000000" , vmaxpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED485FCB" , vmaxpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED485F4C2B02" , vmaxpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED485F4C2B02" , vmaxpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E85FCB" , vmaxps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E85F8C2B80000000" , vmaxps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC5FCB" , vmaxps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC5F8C2B80000000" , vmaxps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C485FCB" , vmaxps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C485F4C2B02" , vmaxps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C485F4C2B02" , vmaxps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB5FCB" , vmaxsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB5F8C2B80000000" , vmaxsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5FCB" , vmaxss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5F8C2B80000000" , vmaxss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E95DCB" , vminpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E95D8C2B80000000" , vminpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED5DCB" , vminpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED5D8C2B80000000" , vminpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED485DCB" , vminpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED485D4C2B02" , vminpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED485D4C2B02" , vminpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E85DCB" , vminps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E85D8C2B80000000" , vminps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC5DCB" , vminps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC5D8C2B80000000" , vminps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C485DCB" , vminps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C485D4C2B02" , vminps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C485D4C2B02" , vminps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB5DCB" , vminsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB5D8C2B80000000" , vminsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5DCB" , vminss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5D8C2B80000000" , vminss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5F928CA" , vmovapd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F9288C1A80000000" , vmovapd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9299C1180000000" , vmovapd(xmmword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FD28CA" , vmovapd(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD288C1A80000000" , vmovapd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ptr(ecx, edx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FD299C1180000000" , vmovapd(ymmword_ptr(ecx, edx, 0, 128), ymm3)); TEST_INSTRUCTION("62F1FD4828CA" , vmovapd(zmm1, zmm2)); TEST_INSTRUCTION("62F1FD48284C1A02" , vmovapd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD48284C1A02" , vmovapd(zmm1, zmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD48295C1102" , vmovapd(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F1FD48295C1102" , vmovapd(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5F828CA" , vmovaps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F8288C1A80000000" , vmovaps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F8299C1180000000" , vmovaps(xmmword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FC28CA" , vmovaps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC288C1A80000000" , vmovaps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ptr(ecx, edx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FC299C1180000000" , vmovaps(ymmword_ptr(ecx, edx, 0, 128), ymm3)); TEST_INSTRUCTION("62F17C4828CA" , vmovaps(zmm1, zmm2)); TEST_INSTRUCTION("62F17C48284C1A02" , vmovaps(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C48284C1A02" , vmovaps(zmm1, zmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C48295C1102" , vmovaps(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17C48295C1102" , vmovaps(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5F97ED1" , vmovd(ecx, xmm2)); - TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F97E9C1180000000" , vmovd(dword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F96ECA" , vmovd(xmm1, edx)); - TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F96E8C1A80000000" , vmovd(xmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FB12CA" , vmovddup(xmm1, xmm2)); - TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FB128C1A80000000" , vmovddup(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FF12CA" , vmovddup(ymm1, ymm2)); - TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FF128C1A80000000" , vmovddup(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FF4812CA" , vmovddup(zmm1, zmm2)); TEST_INSTRUCTION("62F1FF48124C1A02" , vmovddup(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FF48124C1A02" , vmovddup(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F96FCA" , vmovdqa(xmm1, xmm2)); - TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F96F8C1A80000000" , vmovdqa(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F97F9C1180000000" , vmovdqa(xmmword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FD6FCA" , vmovdqa(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD6F8C1A80000000" , vmovdqa(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ptr(ecx, edx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FD7F9C1180000000" , vmovdqa(ymmword_ptr(ecx, edx, 0, 128), ymm3)); TEST_INSTRUCTION("62F17D086FCA" , vmovdqa32(xmm1, xmm2)); TEST_INSTRUCTION("62F17D086F4C1A08" , vmovdqa32(xmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17D086F4C1A08" , vmovdqa32(xmm1, xmmword_ptr(edx, ebx, 0, 128))); @@ -4277,16 +5804,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1FD486F4C1A02" , vmovdqa64(zmm1, zmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD487F5C1102" , vmovdqa64(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F1FD487F5C1102" , vmovdqa64(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5FA6FCA" , vmovdqu(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA6F8C1A80000000" , vmovdqu(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FA7F9C1180000000" , vmovdqu(xmmword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FE6FCA" , vmovdqu(ymm1, ymm2)); - TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FE6F8C1A80000000" , vmovdqu(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ptr(ecx, edx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FE7F9C1180000000" , vmovdqu(ymmword_ptr(ecx, edx, 0, 128), ymm3)); TEST_INSTRUCTION("62F1FF086FCA" , vmovdqu16(xmm1, xmm2)); TEST_INSTRUCTION("62F1FF086F4C1A08" , vmovdqu16(xmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FF086F4C1A08" , vmovdqu16(xmm1, xmmword_ptr(edx, ebx, 0, 128))); @@ -4347,160 +5864,39 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F17F486F4C1A02" , vmovdqu8(zmm1, zmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17F487F5C1102" , vmovdqu8(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17F487F5C1102" , vmovdqu8(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5E812CB" , vmovhlps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9179C1180000000" , vmovhpd(qword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9168C2B80000000" , vmovhpd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F8179C1180000000" , vmovhps(qword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8168C2B80000000" , vmovhps(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E816CB" , vmovlhps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9139C1180000000" , vmovlpd(qword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9128C2B80000000" , vmovlpd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F8139C1180000000" , vmovlps(qword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8128C2B80000000" , vmovlps(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5F950CA" , vmovmskpd(ecx, xmm2)); - TEST_INSTRUCTION("C5FD50CA" , vmovmskpd(ecx, ymm2)); - TEST_INSTRUCTION("C5F850CA" , vmovmskps(ecx, xmm2)); - TEST_INSTRUCTION("C5FC50CA" , vmovmskps(ecx, ymm2)); - TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9E79C1180000000" , vmovntdq(xmmword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ptr(ecx, edx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FDE79C1180000000" , vmovntdq(ymmword_ptr(ecx, edx, 0, 128), ymm3)); TEST_INSTRUCTION("62F17D48E75C1102" , vmovntdq(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17D48E75C1102" , vmovntdq(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2792A8C1A80000000" , vmovntdqa(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D2A8C1A80000000" , vmovntdqa(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D482A4C1A02" , vmovntdqa(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D482A4C1A02" , vmovntdqa(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F92B9C1180000000" , vmovntpd(xmmword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ptr(ecx, edx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FD2B9C1180000000" , vmovntpd(ymmword_ptr(ecx, edx, 0, 128), ymm3)); TEST_INSTRUCTION("62F1FD482B5C1102" , vmovntpd(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F1FD482B5C1102" , vmovntpd(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F82B9C1180000000" , vmovntps(xmmword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ptr(ecx, edx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FC2B9C1180000000" , vmovntps(ymmword_ptr(ecx, edx, 0, 128), ymm3)); TEST_INSTRUCTION("62F17C482B5C1102" , vmovntps(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17C482B5C1102" , vmovntps(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5FA7ECA" , vmovq(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA7E8C1A80000000" , vmovq(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9D69C1180000000" , vmovq(qword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FB119C1180000000" , vmovsd(qword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FB108C1A80000000" , vmovsd(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5EB10CB" , vmovsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5FA16CA" , vmovshdup(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA168C1A80000000" , vmovshdup(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FE16CA" , vmovshdup(ymm1, ymm2)); - TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FE168C1A80000000" , vmovshdup(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E4816CA" , vmovshdup(zmm1, zmm2)); TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E48164C1A02" , vmovshdup(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA12CA" , vmovsldup(xmm1, xmm2)); - TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA128C1A80000000" , vmovsldup(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FE12CA" , vmovsldup(ymm1, ymm2)); - TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FE128C1A80000000" , vmovsldup(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E4812CA" , vmovsldup(zmm1, zmm2)); TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17E48124C1A02" , vmovsldup(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FA119C1180000000" , vmovss(dword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FA108C1A80000000" , vmovss(xmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5EA10CB" , vmovss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F910CA" , vmovupd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F9108C1A80000000" , vmovupd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F9119C1180000000" , vmovupd(xmmword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FD10CA" , vmovupd(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD108C1A80000000" , vmovupd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ptr(ecx, edx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FD119C1180000000" , vmovupd(ymmword_ptr(ecx, edx, 0, 128), ymm3)); TEST_INSTRUCTION("62F1FD4810CA" , vmovupd(zmm1, zmm2)); TEST_INSTRUCTION("62F1FD48104C1A02" , vmovupd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD48104C1A02" , vmovupd(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C5F810CA" , vmovups(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F8108C1A80000000" , vmovups(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5F8119C1180000000" , vmovups(xmmword_ptr(ecx, edx, 0, 128), xmm3)); - TEST_INSTRUCTION("C5FC10CA" , vmovups(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC108C1A80000000" , vmovups(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ptr(ecx, edx, 0, 128), ymm3)); - TEST_INSTRUCTION("C5FC119C1180000000" , vmovups(ymmword_ptr(ecx, edx, 0, 128), ymm3)); + TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(ptr(ecx, edx, 0, 128), zmm3)); + TEST_INSTRUCTION("62F1FD48115C1102" , vmovupd(zmmword_ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17C4810CA" , vmovups(zmm1, zmm2)); TEST_INSTRUCTION("62F17C48104C1A02" , vmovups(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C48104C1A02" , vmovups(zmm1, zmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C48115C1102" , vmovups(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F17C48115C1102" , vmovups(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C4E36942CB01" , vmpsadbw(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369428C2B8000000001" , vmpsadbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D42CB01" , vmpsadbw(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D428C2B8000000001" , vmpsadbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E959CB" , vmulpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9598C2B80000000" , vmulpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED59CB" , vmulpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED598C2B80000000" , vmulpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED4859CB" , vmulpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48594C2B02" , vmulpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48594C2B02" , vmulpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E859CB" , vmulps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8598C2B80000000" , vmulps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC59CB" , vmulps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC598C2B80000000" , vmulps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C4859CB" , vmulps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48594C2B02" , vmulps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C48594C2B02" , vmulps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB59CB" , vmulsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB598C2B80000000" , vmulsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA59CB" , vmulss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA598C2B80000000" , vmulss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E956CB" , vorpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9568C2B80000000" , vorpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED56CB" , vorpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED568C2B80000000" , vorpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED4856CB" , vorpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48564C2B02" , vorpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48564C2B02" , vorpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E856CB" , vorps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8568C2B80000000" , vorps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC56CB" , vorps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC568C2B80000000" , vorps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C4856CB" , vorps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48564C2B02" , vorps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C48564C2B02" , vorps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -4526,21 +5922,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2791CCA" , vpabsb(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2791C8C1A80000000" , vpabsb(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D1CCA" , vpabsb(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D1C8C1A80000000" , vpabsb(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D481CCA" , vpabsb(zmm1, zmm2)); TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2791ECA" , vpabsd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2791E8C1A80000000" , vpabsd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D1ECA" , vpabsd(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D1E8C1A80000000" , vpabsd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D481ECA" , vpabsd(zmm1, zmm2)); TEST_INSTRUCTION("62F27D481E4C1A02" , vpabsd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D481E4C1A02" , vpabsd(zmm1, zmmword_ptr(edx, ebx, 0, 128))); @@ -4553,138 +5937,48 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD481FCA" , vpabsq(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD481F4C1A02" , vpabsq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD481F4C1A02" , vpabsq(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2791DCA" , vpabsw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2791D8C1A80000000" , vpabsw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D1DCA" , vpabsw(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D1D8C1A80000000" , vpabsw(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D481DCA" , vpabsw(zmm1, zmm2)); TEST_INSTRUCTION("62F27D481D4C1A02" , vpabsw(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D481D4C1A02" , vpabsw(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5E96BCB" , vpackssdw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E96B8C2B80000000" , vpackssdw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED6BCB" , vpackssdw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED6B8C2B80000000" , vpackssdw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D486BCB" , vpackssdw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D486B4C2B02" , vpackssdw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D486B4C2B02" , vpackssdw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E963CB" , vpacksswb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9638C2B80000000" , vpacksswb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED63CB" , vpacksswb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED638C2B80000000" , vpacksswb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4863CB" , vpacksswb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48634C2B02" , vpacksswb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48634C2B02" , vpacksswb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2692BCB" , vpackusdw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2692B8C2B80000000" , vpackusdw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D2BCB" , vpackusdw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D2B8C2B80000000" , vpackusdw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D482BCB" , vpackusdw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D482B4C2B02" , vpackusdw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D482B4C2B02" , vpackusdw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E967CB" , vpackuswb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9678C2B80000000" , vpackuswb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED67CB" , vpackuswb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED678C2B80000000" , vpackuswb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4867CB" , vpackuswb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48674C2B02" , vpackuswb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48674C2B02" , vpackuswb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FCCB" , vpaddb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FC8C2B80000000" , vpaddb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFCCB" , vpaddb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFC8C2B80000000" , vpaddb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48FCCB" , vpaddb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48FC4C2B02" , vpaddb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48FC4C2B02" , vpaddb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FECB" , vpaddd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FE8C2B80000000" , vpaddd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFECB" , vpaddd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFE8C2B80000000" , vpaddd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48FECB" , vpaddd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48FE4C2B02" , vpaddd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48FE4C2B02" , vpaddd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D4CB" , vpaddq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D48C2B80000000" , vpaddq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD4CB" , vpaddq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD48C2B80000000" , vpaddq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48D4CB" , vpaddq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48D44C2B02" , vpaddq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48D44C2B02" , vpaddq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9ECCB" , vpaddsb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9EC8C2B80000000" , vpaddsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDECCB" , vpaddsb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEC8C2B80000000" , vpaddsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48ECCB" , vpaddsb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48EC4C2B02" , vpaddsb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48EC4C2B02" , vpaddsb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9EDCB" , vpaddsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9ED8C2B80000000" , vpaddsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEDCB" , vpaddsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDED8C2B80000000" , vpaddsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48EDCB" , vpaddsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48ED4C2B02" , vpaddsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48ED4C2B02" , vpaddsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DCCB" , vpaddusb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DC8C2B80000000" , vpaddusb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDCCB" , vpaddusb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDC8C2B80000000" , vpaddusb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48DCCB" , vpaddusb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DC4C2B02" , vpaddusb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48DC4C2B02" , vpaddusb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DDCB" , vpaddusw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DD8C2B80000000" , vpaddusw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDDCB" , vpaddusw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDD8C2B80000000" , vpaddusw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48DDCB" , vpaddusw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DD4C2B02" , vpaddusw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48DD4C2B02" , vpaddusw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FDCB" , vpaddw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FD8C2B80000000" , vpaddw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFDCB" , vpaddw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFD8C2B80000000" , vpaddw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48FDCB" , vpaddw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48FD4C2B02" , vpaddw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48FD4C2B02" , vpaddw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E3690FCB01" , vpalignr(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690F8C2B8000000001" , vpalignr(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0FCB01" , vpalignr(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0F8C2B8000000001" , vpalignr(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D480FCB01" , vpalignr(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F36D480F4C2B0201" , vpalignr(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D480F4C2B0201" , vpalignr(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9DBCB" , vpand(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DB8C2B80000000" , vpand(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDBCB" , vpand(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDB8C2B80000000" , vpand(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08DBCB" , vpandd(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08DB4C2B08" , vpandd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08DB4C2B08" , vpandd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -4694,12 +5988,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48DBCB" , vpandd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DB4C2B02" , vpandd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48DB4C2B02" , vpandd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DFCB" , vpandn(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DF8C2B80000000" , vpandn(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDFCB" , vpandn(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDF8C2B80000000" , vpandn(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08DFCB" , vpandnd(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08DF4C2B08" , vpandnd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08DF4C2B08" , vpandnd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -4727,30 +6015,12 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48DBCB" , vpandq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48DB4C2B02" , vpandq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48DB4C2B02" , vpandq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E0CB" , vpavgb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E08C2B80000000" , vpavgb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE0CB" , vpavgb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE08C2B80000000" , vpavgb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E0CB" , vpavgb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E04C2B02" , vpavgb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E04C2B02" , vpavgb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E3CB" , vpavgw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E38C2B80000000" , vpavgw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE3CB" , vpavgw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE38C2B80000000" , vpavgw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E3CB" , vpavgw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E34C2B02" , vpavgw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E34C2B02" , vpavgw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E36902CB01" , vpblendd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369028C2B8000000001" , vpblendd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D02CB01" , vpblendd(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D028C2B8000000001" , vpblendd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F26D0866CB" , vpblendmb(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D08664C2B08" , vpblendmb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D08664C2B08" , vpblendmb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -4787,38 +6057,14 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4866CB" , vpblendmw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48664C2B02" , vpblendmw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48664C2B02" , vpblendmw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E3694CCB40" , vpblendvb(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E3694C8C2B8000000060" , vpblendvb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("C4E36D4CCB40" , vpblendvb(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E36D4C8C2B8000000060" , vpblendvb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("C4E3690ECB01" , vpblendw(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690E8C2B8000000001" , vpblendw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0ECB01" , vpblendw(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D0E8C2B8000000001" , vpblendw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F27D087ACA" , vpbroadcastb(xmm1, edx)); - TEST_INSTRUCTION("C4E27978CA" , vpbroadcastb(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279788C1A80000000" , vpbroadcastb(xmm1, byte_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D287ACA" , vpbroadcastb(ymm1, edx)); - TEST_INSTRUCTION("C4E27D78CA" , vpbroadcastb(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D788C1A80000000" , vpbroadcastb(ymm1, byte_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D487ACA" , vpbroadcastb(zmm1, edx)); TEST_INSTRUCTION("62F27D4878CA" , vpbroadcastb(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48788C1A80000000" , vpbroadcastb(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48788C1A80000000" , vpbroadcastb(zmm1, byte_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D087CCA" , vpbroadcastd(xmm1, edx)); - TEST_INSTRUCTION("C4E27958CA" , vpbroadcastd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279588C1A80000000" , vpbroadcastd(xmm1, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D287CCA" , vpbroadcastd(ymm1, edx)); - TEST_INSTRUCTION("C4E27D58CA" , vpbroadcastd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D588C1A80000000" , vpbroadcastd(ymm1, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D487CCA" , vpbroadcastd(zmm1, edx)); TEST_INSTRUCTION("62F27D4858CA" , vpbroadcastd(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48584C1A20" , vpbroadcastd(zmm1, ptr(edx, ebx, 0, 128))); @@ -4829,46 +6075,18 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27E083ACA" , vpbroadcastmw2d(xmm1, k2)); TEST_INSTRUCTION("62F27E283ACA" , vpbroadcastmw2d(ymm1, k2)); TEST_INSTRUCTION("62F27E483ACA" , vpbroadcastmw2d(zmm1, k2)); - TEST_INSTRUCTION("C4E27959CA" , vpbroadcastq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279598C1A80000000" , vpbroadcastq(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D59CA" , vpbroadcastq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D598C1A80000000" , vpbroadcastq(ymm1, qword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD4859CA" , vpbroadcastq(zmm1, xmm2)); TEST_INSTRUCTION("62F2FD48594C1A10" , vpbroadcastq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD48594C1A10" , vpbroadcastq(zmm1, qword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D087BCA" , vpbroadcastw(xmm1, edx)); - TEST_INSTRUCTION("C4E27979CA" , vpbroadcastw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279798C1A80000000" , vpbroadcastw(xmm1, word_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D287BCA" , vpbroadcastw(ymm1, edx)); - TEST_INSTRUCTION("C4E27D79CA" , vpbroadcastw(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D798C1A80000000" , vpbroadcastw(ymm1, word_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D487BCA" , vpbroadcastw(zmm1, edx)); TEST_INSTRUCTION("62F27D4879CA" , vpbroadcastw(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48794C1A40" , vpbroadcastw(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48794C1A40" , vpbroadcastw(zmm1, word_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E36944CB01" , vpclmulqdq(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369448C2B8000000001" , vpclmulqdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D44CB01" , vpclmulqdq(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D448C2B8000000001" , vpclmulqdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D4844CB01" , vpclmulqdq(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F36D48444C2B0201" , vpclmulqdq(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D48444C2B0201" , vpclmulqdq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868A2CB40" , vpcmov(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("8FE8E8A28C358000000030" , vpcmov(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868A28C2B8000000060" , vpcmov(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86CA2CB40" , vpcmov(ymm1, ymm2, ymm3, ymm4)); - TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("8FE8ECA28C358000000030" , vpcmov(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6)); - TEST_INSTRUCTION("8FE86CA28C2B8000000060" , vpcmov(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6)); TEST_INSTRUCTION("62F36D083FCB01" , vpcmpb(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D083F4C2B0801" , vpcmpb(k1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D083F4C2B0801" , vpcmpb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); @@ -4887,138 +6105,78 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F36D481FCB01" , vpcmpd(k1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F36D481F4C2B0201" , vpcmpd(k1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D481F4C2B0201" , vpcmpd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E974CB" , vpcmpeqb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9748C2B80000000" , vpcmpeqb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D0874CB" , vpcmpeqb(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08744C2B08" , vpcmpeqb(k1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08744C2B08" , vpcmpeqb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED74CB" , vpcmpeqb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED748C2B80000000" , vpcmpeqb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D2874CB" , vpcmpeqb(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28744C2B04" , vpcmpeqb(k1, ymm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D28744C2B04" , vpcmpeqb(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4874CB" , vpcmpeqb(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48744C2B02" , vpcmpeqb(k1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48744C2B02" , vpcmpeqb(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E976CB" , vpcmpeqd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9768C2B80000000" , vpcmpeqd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D0876CB" , vpcmpeqd(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08764C2B08" , vpcmpeqd(k1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08764C2B08" , vpcmpeqd(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED76CB" , vpcmpeqd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED768C2B80000000" , vpcmpeqd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D2876CB" , vpcmpeqd(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28764C2B04" , vpcmpeqd(k1, ymm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D28764C2B04" , vpcmpeqd(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4876CB" , vpcmpeqd(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48764C2B02" , vpcmpeqd(k1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48764C2B02" , vpcmpeqd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26929CB" , vpcmpeqq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269298C2B80000000" , vpcmpeqq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED0829CB" , vpcmpeqq(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F2ED08294C2B08" , vpcmpeqq(k1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED08294C2B08" , vpcmpeqq(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D29CB" , vpcmpeqq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D298C2B80000000" , vpcmpeqq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED2829CB" , vpcmpeqq(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F2ED28294C2B04" , vpcmpeqq(k1, ymm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED28294C2B04" , vpcmpeqq(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED4829CB" , vpcmpeqq(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48294C2B02" , vpcmpeqq(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E975CB" , vpcmpeqw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9758C2B80000000" , vpcmpeqw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D0875CB" , vpcmpeqw(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08754C2B08" , vpcmpeqw(k1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("62F16D08754C2B08" , vpcmpeqw(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED75CB" , vpcmpeqw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED758C2B80000000" , vpcmpeqw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("62F16D2875CB" , vpcmpeqw(k1, ymm2, ymm3)); - TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("62F16D4875CB" , vpcmpeqw(k1, zmm2, zmm3)); - TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E37961CA01" , vpcmpestri(xmm1, xmm2, 1, ecx, eax, edx)); - TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, ptr(edx, ebx, 0, 128), 1, ecx, eax, edx)); - TEST_INSTRUCTION("C4E379618C1A8000000001" , vpcmpestri(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, ecx, eax, edx)); - TEST_INSTRUCTION("C4E37960CA01" , vpcmpestrm(xmm1, xmm2, 1, xmm0, eax, edx)); - TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, ptr(edx, ebx, 0, 128), 1, xmm0, eax, edx)); - TEST_INSTRUCTION("C4E379608C1A8000000001" , vpcmpestrm(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, xmm0, eax, edx)); - TEST_INSTRUCTION("C5E964CB" , vpcmpgtb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9648C2B80000000" , vpcmpgtb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("62F16D08754C2B08" , vpcmpeqw(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("62F16D2875CB" , vpcmpeqw(k1, ymm2, ymm3)); + TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("62F16D28754C2B04" , vpcmpeqw(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("62F16D4875CB" , vpcmpeqw(k1, zmm2, zmm3)); + TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("62F16D48754C2B02" , vpcmpeqw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D0864CB" , vpcmpgtb(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08644C2B08" , vpcmpgtb(k1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08644C2B08" , vpcmpgtb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED64CB" , vpcmpgtb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED648C2B80000000" , vpcmpgtb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D2864CB" , vpcmpgtb(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28644C2B04" , vpcmpgtb(k1, ymm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D28644C2B04" , vpcmpgtb(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4864CB" , vpcmpgtb(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48644C2B02" , vpcmpgtb(k1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48644C2B02" , vpcmpgtb(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E966CB" , vpcmpgtd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9668C2B80000000" , vpcmpgtd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D0866CB" , vpcmpgtd(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08664C2B08" , vpcmpgtd(k1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08664C2B08" , vpcmpgtd(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED66CB" , vpcmpgtd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED668C2B80000000" , vpcmpgtd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D2866CB" , vpcmpgtd(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28664C2B04" , vpcmpgtd(k1, ymm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D28664C2B04" , vpcmpgtd(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4866CB" , vpcmpgtd(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48664C2B02" , vpcmpgtd(k1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48664C2B02" , vpcmpgtd(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26937CB" , vpcmpgtq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269378C2B80000000" , vpcmpgtq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED0837CB" , vpcmpgtq(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F2ED08374C2B08" , vpcmpgtq(k1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED08374C2B08" , vpcmpgtq(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D37CB" , vpcmpgtq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D378C2B80000000" , vpcmpgtq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED2837CB" , vpcmpgtq(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F2ED28374C2B04" , vpcmpgtq(k1, ymm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED28374C2B04" , vpcmpgtq(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED4837CB" , vpcmpgtq(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48374C2B02" , vpcmpgtq(k1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48374C2B02" , vpcmpgtq(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E965CB" , vpcmpgtw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9658C2B80000000" , vpcmpgtw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D0865CB" , vpcmpgtw(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08654C2B08" , vpcmpgtw(k1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08654C2B08" , vpcmpgtw(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED65CB" , vpcmpgtw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED658C2B80000000" , vpcmpgtw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D2865CB" , vpcmpgtw(k1, ymm2, ymm3)); TEST_INSTRUCTION("62F16D28654C2B04" , vpcmpgtw(k1, ymm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D28654C2B04" , vpcmpgtw(k1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4865CB" , vpcmpgtw(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48654C2B02" , vpcmpgtw(k1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48654C2B02" , vpcmpgtw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E37963CA01" , vpcmpistri(xmm1, xmm2, 1, ecx)); - TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, ptr(edx, ebx, 0, 128), 1, ecx)); - TEST_INSTRUCTION("C4E379638C1A8000000001" , vpcmpistri(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, ecx)); - TEST_INSTRUCTION("C4E37962CA01" , vpcmpistrm(xmm1, xmm2, 1, xmm0)); - TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, ptr(edx, ebx, 0, 128), 1, xmm0)); - TEST_INSTRUCTION("C4E379628C1A8000000001" , vpcmpistrm(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1, xmm0)); TEST_INSTRUCTION("62F3ED081FCB01" , vpcmpq(k1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F3ED081F4C2B0801" , vpcmpq(k1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED081F4C2B0801" , vpcmpq(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); @@ -5073,12 +6231,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED483FCB01" , vpcmpw(k1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED483F4C2B0201" , vpcmpw(k1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED483F4C2B0201" , vpcmpw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CCCB01" , vpcomb(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CC8C2B8000000001" , vpcomb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CECB01" , vpcomd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CE8C2B8000000001" , vpcomd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F27D0863D1" , vpcompressb(xmm1, xmm2)); TEST_INSTRUCTION("62F27D08639C1180000000" , vpcompressb(ptr(ecx, edx, 0, 128), xmm3)); TEST_INSTRUCTION("62F27D08639C1180000000" , vpcompressb(xmmword_ptr(ecx, edx, 0, 128), xmm3)); @@ -5115,24 +6267,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD4863D1" , vpcompressw(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD48635C1140" , vpcompressw(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F2FD48635C1140" , vpcompressw(zmmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("8FE868CFCB01" , vpcomq(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CF8C2B8000000001" , vpcomq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868ECCB01" , vpcomub(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EC8C2B8000000001" , vpcomub(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EECB01" , vpcomud(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EE8C2B8000000001" , vpcomud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EFCB01" , vpcomuq(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EF8C2B8000000001" , vpcomuq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868EDCB01" , vpcomuw(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868ED8C2B8000000001" , vpcomuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CDCB01" , vpcomw(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE868CD8C2B8000000001" , vpcomw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F27D08C4CA" , vpconflictd(xmm1, xmm2)); TEST_INSTRUCTION("62F27D08C44C1A08" , vpconflictd(xmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D08C44C1A08" , vpconflictd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); @@ -5187,12 +6321,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D4853CB" , vpdpwssds(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48534C2B02" , vpdpwssds(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48534C2B02" , vpdpwssds(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E36D06CB01" , vperm2f128(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D068C2B8000000001" , vperm2f128(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D46CB01" , vperm2i128(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D468C2B8000000001" , vperm2i128(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F26D088DCB" , vpermb(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D088D4C2B08" , vpermb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D088D4C2B08" , vpermb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -5202,9 +6330,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D488DCB" , vpermb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D488D4C2B02" , vpermb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D488D4C2B02" , vpermb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D36CB" , vpermd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D368C2B80000000" , vpermd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4836CB" , vpermd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48364C2B02" , vpermd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48364C2B02" , vpermd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -5262,65 +6387,18 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4875CB" , vpermi2w(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48754C2B02" , vpermi2w(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48754C2B02" , vpermi2w(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E36949CB41" , vpermil2pd(xmm1, xmm2, xmm3, xmm4, 1)); - TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6, 1)); - TEST_INSTRUCTION("C4E369498C2B8000000061" , vpermil2pd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6, 1)); - TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9498C358000000031" , vpermil2pd(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D49CB41" , vpermil2pd(ymm1, ymm2, ymm3, ymm4, 1)); - TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6, 1)); - TEST_INSTRUCTION("C4E36D498C2B8000000061" , vpermil2pd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6, 1)); - TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128), 1)); - TEST_INSTRUCTION("C4E3ED498C358000000031" , vpermil2pd(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128), 1)); - TEST_INSTRUCTION("C4E36948CB41" , vpermil2ps(xmm1, xmm2, xmm3, xmm4, 1)); - TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6, 1)); - TEST_INSTRUCTION("C4E369488C2B8000000061" , vpermil2ps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6, 1)); - TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128), 1)); - TEST_INSTRUCTION("C4E3E9488C358000000031" , vpermil2ps(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128), 1)); - TEST_INSTRUCTION("C4E36D48CB41" , vpermil2ps(ymm1, ymm2, ymm3, ymm4, 1)); - TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), ymm6, 1)); - TEST_INSTRUCTION("C4E36D488C2B8000000061" , vpermil2ps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), ymm6, 1)); - TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ptr(ebp, esi, 0, 128), 1)); - TEST_INSTRUCTION("C4E3ED488C358000000031" , vpermil2ps(ymm1, ymm2, ymm3, ymmword_ptr(ebp, esi, 0, 128), 1)); - TEST_INSTRUCTION("C4E2690DCB" , vpermilpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E37905CA01" , vpermilpd(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2690D8C2B80000000" , vpermilpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379058C1A8000000001" , vpermilpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26D0DCB" , vpermilpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E37D05CA01" , vpermilpd(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D0D8C2B80000000" , vpermilpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D058C1A8000000001" , vpermilpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F2ED480DCB" , vpermilpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F3FD4805CA01" , vpermilpd(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F2ED480D4C2B02" , vpermilpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED480D4C2B02" , vpermilpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F3FD48054C1A0201" , vpermilpd(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F3FD48054C1A0201" , vpermilpd(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E2690CCB" , vpermilps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E37904CA01" , vpermilps(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2690C8C2B80000000" , vpermilps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379048C1A8000000001" , vpermilps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26D0CCB" , vpermilps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E37D04CA01" , vpermilps(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D0C8C2B80000000" , vpermilps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D048C1A8000000001" , vpermilps(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F26D480CCB" , vpermilps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F37D4804CA01" , vpermilps(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F26D480C4C2B02" , vpermilps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D480C4C2B02" , vpermilps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F37D48044C1A0201" , vpermilps(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F37D48044C1A0201" , vpermilps(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3FD01CA01" , vpermpd(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3FD018C1A8000000001" , vpermpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F2ED2816CB" , vpermpd(ymm1, ymm2, ymm3)); TEST_INSTRUCTION("62F2ED28164C2B04" , vpermpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED28164C2B04" , vpermpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); @@ -5330,15 +6408,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED48164C2B02" , vpermpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F3FD48014C1A0201" , vpermpd(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F3FD48014C1A0201" , vpermpd(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26D16CB" , vpermps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D168C2B80000000" , vpermps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4816CB" , vpermps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48164C2B02" , vpermps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48164C2B02" , vpermps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E3FD00CA01" , vpermq(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3FD008C1A8000000001" , vpermq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F2ED2836CB" , vpermq(ymm1, ymm2, ymm3)); TEST_INSTRUCTION("62F2ED28364C2B04" , vpermq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED28364C2B04" , vpermq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); @@ -5433,142 +6505,32 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD08894C1A10" , vpexpandq(xmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD08894C1A10" , vpexpandq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD2889CA" , vpexpandq(ymm1, ymm2)); - TEST_INSTRUCTION("62F2FD28894C1A10" , vpexpandq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F2FD28894C1A10" , vpexpandq(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F2FD4889CA" , vpexpandq(zmm1, zmm2)); - TEST_INSTRUCTION("62F2FD48894C1A10" , vpexpandq(zmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F2FD48894C1A10" , vpexpandq(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F2FD0862CA" , vpexpandw(xmm1, xmm2)); - TEST_INSTRUCTION("62F2FD08624C1A40" , vpexpandw(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F2FD08624C1A40" , vpexpandw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F2FD2862CA" , vpexpandw(ymm1, ymm2)); - TEST_INSTRUCTION("62F2FD28624C1A40" , vpexpandw(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F2FD28624C1A40" , vpexpandw(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F2FD4862CA" , vpexpandw(zmm1, zmm2)); - TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E37914D101" , vpextrb(ecx, xmm2, 1)); - TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(ptr(ecx, edx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E379149C118000000001" , vpextrb(byte_ptr(ecx, edx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E37916D101" , vpextrd(ecx, xmm2, 1)); - TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(ptr(ecx, edx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E379169C118000000001" , vpextrd(dword_ptr(ecx, edx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C5F9C5CA01" , vpextrw(ecx, xmm2, 1)); - TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(ptr(ecx, edx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E379159C118000000001" , vpextrw(word_ptr(ecx, edx, 0, 128), xmm3, 1)); - TEST_INSTRUCTION("C4E259908C1A80000000" , vpgatherdd(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E25D908C1A80000000" , vpgatherdd(ymm1, ptr(edx, ymm3, 0, 128), ymm4)); - TEST_INSTRUCTION("62F27D09904C1A20" , k(k1).vpgatherdd(xmm1, ptr(edx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F27D29904C1A20" , k(k1).vpgatherdd(ymm1, ptr(edx, ymm3, 0, 128))); - TEST_INSTRUCTION("62F27D49904C1A20" , k(k1).vpgatherdd(zmm1, ptr(edx, zmm3, 0, 128))); - TEST_INSTRUCTION("C4E2D9908C1A80000000" , vpgatherdq(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E2DD908C1A80000000" , vpgatherdq(ymm1, ptr(edx, xmm3, 0, 128), ymm4)); - TEST_INSTRUCTION("62F2FD09904C1A10" , k(k1).vpgatherdq(xmm1, ptr(edx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F2FD29904C1A10" , k(k1).vpgatherdq(ymm1, ptr(edx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F2FD49904C1A10" , k(k1).vpgatherdq(zmm1, ptr(edx, ymm3, 0, 128))); - TEST_INSTRUCTION("C4E259918C1A80000000" , vpgatherqd(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E25D918C1A80000000" , vpgatherqd(xmm1, ptr(edx, ymm3, 0, 128), xmm4)); - TEST_INSTRUCTION("62F27D09914C1A20" , k(k1).vpgatherqd(xmm1, ptr(edx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F27D29914C1A20" , k(k1).vpgatherqd(xmm1, ptr(edx, ymm3, 0, 128))); - TEST_INSTRUCTION("62F27D49914C1A20" , k(k1).vpgatherqd(ymm1, ptr(edx, zmm3, 0, 128))); - TEST_INSTRUCTION("C4E2D9918C1A80000000" , vpgatherqq(xmm1, ptr(edx, xmm3, 0, 128), xmm4)); - TEST_INSTRUCTION("C4E2DD918C1A80000000" , vpgatherqq(ymm1, ptr(edx, ymm3, 0, 128), ymm4)); - TEST_INSTRUCTION("62F2FD09914C1A10" , k(k1).vpgatherqq(xmm1, ptr(edx, xmm3, 0, 128))); - TEST_INSTRUCTION("62F2FD29914C1A10" , k(k1).vpgatherqq(ymm1, ptr(edx, ymm3, 0, 128))); - TEST_INSTRUCTION("62F2FD49914C1A10" , k(k1).vpgatherqq(zmm1, ptr(edx, zmm3, 0, 128))); - TEST_INSTRUCTION("8FE978C2CA" , vphaddbd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978C28C1A80000000" , vphaddbd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978C3CA" , vphaddbq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978C38C1A80000000" , vphaddbq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978C1CA" , vphaddbw(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978C18C1A80000000" , vphaddbw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E26902CB" , vphaddd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269028C2B80000000" , vphaddd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D02CB" , vphaddd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D028C2B80000000" , vphaddd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE978CBCA" , vphadddq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978CB8C1A80000000" , vphadddq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E26903CB" , vphaddsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269038C2B80000000" , vphaddsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D03CB" , vphaddsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D038C2B80000000" , vphaddsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE978D2CA" , vphaddubd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978D28C1A80000000" , vphaddubd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978D3CA" , vphaddubq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978D38C1A80000000" , vphaddubq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978D1CA" , vphaddubw(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978D18C1A80000000" , vphaddubw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978DBCA" , vphaddudq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978DB8C1A80000000" , vphaddudq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978D6CA" , vphadduwd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978D68C1A80000000" , vphadduwd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978D7CA" , vphadduwq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978D78C1A80000000" , vphadduwq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E26901CB" , vphaddw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269018C2B80000000" , vphaddw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D01CB" , vphaddw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D018C2B80000000" , vphaddw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE978C6CA" , vphaddwd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978C68C1A80000000" , vphaddwd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978C7CA" , vphaddwq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978C78C1A80000000" , vphaddwq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27941CA" , vphminposuw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279418C1A80000000" , vphminposuw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978E1CA" , vphsubbw(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978E18C1A80000000" , vphsubbw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E26906CB" , vphsubd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269068C2B80000000" , vphsubd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D06CB" , vphsubd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D068C2B80000000" , vphsubd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE978E3CA" , vphsubdq(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978E38C1A80000000" , vphsubdq(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E26907CB" , vphsubsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269078C2B80000000" , vphsubsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D07CB" , vphsubsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D078C2B80000000" , vphsubsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26905CB" , vphsubw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269058C2B80000000" , vphsubw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D05CB" , vphsubw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D058C2B80000000" , vphsubw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE978E2CA" , vphsubwd(xmm1, xmm2)); - TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE978E28C1A80000000" , vphsubwd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E36920CB01" , vpinsrb(xmm1, xmm2, ebx, 1)); - TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369208C2B8000000001" , vpinsrb(xmm1, xmm2, byte_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E36922CB01" , vpinsrd(xmm1, xmm2, ebx, 1)); - TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E369228C2B8000000001" , vpinsrd(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C4CB01" , vpinsrw(xmm1, xmm2, ebx, 1)); - TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C48C2B8000000001" , vpinsrw(xmm1, xmm2, word_ptr(ebx, ebp, 0, 128), 1)); + TEST_INSTRUCTION("62F2FD28894C1A10" , vpexpandq(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F2FD28894C1A10" , vpexpandq(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F2FD4889CA" , vpexpandq(zmm1, zmm2)); + TEST_INSTRUCTION("62F2FD48894C1A10" , vpexpandq(zmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F2FD48894C1A10" , vpexpandq(zmm1, zmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F2FD0862CA" , vpexpandw(xmm1, xmm2)); + TEST_INSTRUCTION("62F2FD08624C1A40" , vpexpandw(xmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F2FD08624C1A40" , vpexpandw(xmm1, xmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F2FD2862CA" , vpexpandw(ymm1, ymm2)); + TEST_INSTRUCTION("62F2FD28624C1A40" , vpexpandw(ymm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F2FD28624C1A40" , vpexpandw(ymm1, ymmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F2FD4862CA" , vpexpandw(zmm1, zmm2)); + TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F2FD48624C1A40" , vpexpandw(zmm1, zmmword_ptr(edx, ebx, 0, 128))); + TEST_INSTRUCTION("62F27D09904C1A20" , k(k1).vpgatherdd(xmm1, ptr(edx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F27D29904C1A20" , k(k1).vpgatherdd(ymm1, ptr(edx, ymm3, 0, 128))); + TEST_INSTRUCTION("62F27D49904C1A20" , k(k1).vpgatherdd(zmm1, ptr(edx, zmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD09904C1A10" , k(k1).vpgatherdq(xmm1, ptr(edx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD29904C1A10" , k(k1).vpgatherdq(ymm1, ptr(edx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD49904C1A10" , k(k1).vpgatherdq(zmm1, ptr(edx, ymm3, 0, 128))); + TEST_INSTRUCTION("62F27D09914C1A20" , k(k1).vpgatherqd(xmm1, ptr(edx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F27D29914C1A20" , k(k1).vpgatherqd(xmm1, ptr(edx, ymm3, 0, 128))); + TEST_INSTRUCTION("62F27D49914C1A20" , k(k1).vpgatherqd(ymm1, ptr(edx, zmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD09914C1A10" , k(k1).vpgatherqq(xmm1, ptr(edx, xmm3, 0, 128))); + TEST_INSTRUCTION("62F2FD29914C1A10" , k(k1).vpgatherqq(ymm1, ptr(edx, ymm3, 0, 128))); + TEST_INSTRUCTION("62F2FD49914C1A10" , k(k1).vpgatherqq(zmm1, ptr(edx, zmm3, 0, 128))); TEST_INSTRUCTION("62F27D0844CA" , vplzcntd(xmm1, xmm2)); TEST_INSTRUCTION("62F27D08444C1A08" , vplzcntd(xmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D08444C1A08" , vplzcntd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); @@ -5587,42 +6549,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD4844CA" , vplzcntq(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD48444C1A02" , vplzcntq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD48444C1A02" , vplzcntq(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("8FE8689ECB40" , vpmacsdd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8689E8C2B8000000060" , vpmacsdd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8689FCB40" , vpmacsdqh(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8689F8C2B8000000060" , vpmacsdqh(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86897CB40" , vpmacsdql(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868978C2B8000000060" , vpmacsdql(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8688ECB40" , vpmacssdd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8688E8C2B8000000060" , vpmacssdd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8688FCB40" , vpmacssdqh(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE8688F8C2B8000000060" , vpmacssdqh(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86887CB40" , vpmacssdql(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868878C2B8000000060" , vpmacssdql(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86886CB40" , vpmacsswd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868868C2B8000000060" , vpmacsswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86885CB40" , vpmacssww(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868858C2B8000000060" , vpmacssww(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86896CB40" , vpmacswd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868968C2B8000000060" , vpmacswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE86895CB40" , vpmacsww(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868958C2B8000000060" , vpmacsww(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868A6CB40" , vpmadcsswd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868A68C2B8000000060" , vpmadcsswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868B6CB40" , vpmadcswd(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868B68C2B8000000060" , vpmadcswd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); TEST_INSTRUCTION("62F2ED08B5CB" , vpmadd52huq(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F2ED08B54C2B08" , vpmadd52huq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED08B54C2B08" , vpmadd52huq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -5641,55 +6567,15 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED48B4CB" , vpmadd52luq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48B44C2B02" , vpmadd52luq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48B44C2B02" , vpmadd52luq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26904CB" , vpmaddubsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269048C2B80000000" , vpmaddubsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D04CB" , vpmaddubsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D048C2B80000000" , vpmaddubsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4804CB" , vpmaddubsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48044C2B02" , vpmaddubsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48044C2B02" , vpmaddubsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F5CB" , vpmaddwd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F58C2B80000000" , vpmaddwd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF5CB" , vpmaddwd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF58C2B80000000" , vpmaddwd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48F5CB" , vpmaddwd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48F54C2B02" , vpmaddwd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48F54C2B02" , vpmaddwd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(ptr(ecx, edx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2618EA41180000000" , vpmaskmovd(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ptr(ecx, edx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2658EA41180000000" , vpmaskmovd(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2698C8C2B80000000" , vpmaskmovd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D8C8C2B80000000" , vpmaskmovd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(ptr(ecx, edx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2E18EA41180000000" , vpmaskmovq(xmmword_ptr(ecx, edx, 0, 128), xmm3, xmm4)); - TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ptr(ecx, edx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2E58EA41180000000" , vpmaskmovq(ymmword_ptr(ecx, edx, 0, 128), ymm3, ymm4)); - TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E98C8C2B80000000" , vpmaskmovq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED8C8C2B80000000" , vpmaskmovq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693CCB" , vpmaxsb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693C8C2B80000000" , vpmaxsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3CCB" , vpmaxsb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3C8C2B80000000" , vpmaxsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483CCB" , vpmaxsb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483C4C2B02" , vpmaxsb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483C4C2B02" , vpmaxsb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693DCB" , vpmaxsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693D8C2B80000000" , vpmaxsd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3DCB" , vpmaxsd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3D8C2B80000000" , vpmaxsd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483DCB" , vpmaxsd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483D4C2B02" , vpmaxsd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483D4C2B02" , vpmaxsd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -5702,30 +6588,12 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED483DCB" , vpmaxsq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED483D4C2B02" , vpmaxsq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED483D4C2B02" , vpmaxsq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9EECB" , vpmaxsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9EE8C2B80000000" , vpmaxsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEECB" , vpmaxsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEE8C2B80000000" , vpmaxsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48EECB" , vpmaxsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48EE4C2B02" , vpmaxsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48EE4C2B02" , vpmaxsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DECB" , vpmaxub(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DE8C2B80000000" , vpmaxub(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDECB" , vpmaxub(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDE8C2B80000000" , vpmaxub(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48DECB" , vpmaxub(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DE4C2B02" , vpmaxub(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48DE4C2B02" , vpmaxub(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693FCB" , vpmaxud(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693F8C2B80000000" , vpmaxud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3FCB" , vpmaxud(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3F8C2B80000000" , vpmaxud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483FCB" , vpmaxud(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483F4C2B02" , vpmaxud(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483F4C2B02" , vpmaxud(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -5738,30 +6606,12 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED483FCB" , vpmaxuq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED483F4C2B02" , vpmaxuq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED483F4C2B02" , vpmaxuq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693ECB" , vpmaxuw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693E8C2B80000000" , vpmaxuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3ECB" , vpmaxuw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3E8C2B80000000" , vpmaxuw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483ECB" , vpmaxuw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483E4C2B02" , vpmaxuw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483E4C2B02" , vpmaxuw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26938CB" , vpminsb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269388C2B80000000" , vpminsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D38CB" , vpminsb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D388C2B80000000" , vpminsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4838CB" , vpminsb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48384C2B02" , vpminsb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48384C2B02" , vpminsb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26939CB" , vpminsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269398C2B80000000" , vpminsd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D39CB" , vpminsd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D398C2B80000000" , vpminsd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4839CB" , vpminsd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48394C2B02" , vpminsd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48394C2B02" , vpminsd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -5774,30 +6624,12 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4839CB" , vpminsq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48394C2B02" , vpminsq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48394C2B02" , vpminsq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9EACB" , vpminsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9EA8C2B80000000" , vpminsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEACB" , vpminsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEA8C2B80000000" , vpminsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48EACB" , vpminsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48EA4C2B02" , vpminsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48EA4C2B02" , vpminsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DACB" , vpminub(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9DA8C2B80000000" , vpminub(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDACB" , vpminub(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDDA8C2B80000000" , vpminub(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48DACB" , vpminub(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48DA4C2B02" , vpminub(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48DA4C2B02" , vpminub(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693BCB" , vpminud(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693B8C2B80000000" , vpminud(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3BCB" , vpminud(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3B8C2B80000000" , vpminud(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483BCB" , vpminud(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483B4C2B02" , vpminud(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483B4C2B02" , vpminud(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -5810,12 +6642,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED483BCB" , vpminuq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED483B4C2B02" , vpminuq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED483B4C2B02" , vpminuq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693ACB" , vpminuw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2693A8C2B80000000" , vpminuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3ACB" , vpminuw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D3A8C2B80000000" , vpminuw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483ACB" , vpminuw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D483A4C2B02" , vpminuw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D483A4C2B02" , vpminuw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -5855,8 +6681,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FE0828CA" , vpmovm2w(xmm1, k2)); TEST_INSTRUCTION("62F2FE2828CA" , vpmovm2w(ymm1, k2)); TEST_INSTRUCTION("62F2FE4828CA" , vpmovm2w(zmm1, k2)); - TEST_INSTRUCTION("C5F9D7CA" , vpmovmskb(ecx, xmm2)); - TEST_INSTRUCTION("C5FDD7CA" , vpmovmskb(ecx, ymm2)); TEST_INSTRUCTION("62F2FE0839CA" , vpmovq2m(k1, xmm2)); TEST_INSTRUCTION("62F2FE2839CA" , vpmovq2m(k1, ymm2)); TEST_INSTRUCTION("62F2FE4839CA" , vpmovq2m(k1, zmm2)); @@ -5941,57 +6765,21 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27E4820D1" , vpmovswb(ymm1, zmm2)); TEST_INSTRUCTION("62F27E48205C1104" , vpmovswb(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F27E48205C1104" , vpmovswb(ymmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C4E27921CA" , vpmovsxbd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279218C1A80000000" , vpmovsxbd(xmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D21CA" , vpmovsxbd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D218C1A80000000" , vpmovsxbd(ymm1, qword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4821CA" , vpmovsxbd(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48214C1A08" , vpmovsxbd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48214C1A08" , vpmovsxbd(zmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27922CA" , vpmovsxbq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279228C1A80000000" , vpmovsxbq(xmm1, word_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D22CA" , vpmovsxbq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D228C1A80000000" , vpmovsxbq(ymm1, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4822CA" , vpmovsxbq(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48224C1A10" , vpmovsxbq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48224C1A10" , vpmovsxbq(zmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27920CA" , vpmovsxbw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279208C1A80000000" , vpmovsxbw(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D20CA" , vpmovsxbw(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D208C1A80000000" , vpmovsxbw(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4820CA" , vpmovsxbw(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48204C1A04" , vpmovsxbw(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48204C1A04" , vpmovsxbw(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27925CA" , vpmovsxdq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279258C1A80000000" , vpmovsxdq(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D25CA" , vpmovsxdq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D258C1A80000000" , vpmovsxdq(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4825CA" , vpmovsxdq(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48254C1A04" , vpmovsxdq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48254C1A04" , vpmovsxdq(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27923CA" , vpmovsxwd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279238C1A80000000" , vpmovsxwd(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D23CA" , vpmovsxwd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D238C1A80000000" , vpmovsxwd(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4823CA" , vpmovsxwd(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48234C1A04" , vpmovsxwd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48234C1A04" , vpmovsxwd(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27924CA" , vpmovsxwq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279248C1A80000000" , vpmovsxwq(xmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D24CA" , vpmovsxwq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D248C1A80000000" , vpmovsxwq(ymm1, qword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4824CA" , vpmovsxwq(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48244C1A08" , vpmovsxwq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48244C1A08" , vpmovsxwq(zmm1, xmmword_ptr(edx, ebx, 0, 128))); @@ -6061,102 +6849,36 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F27E4830D1" , vpmovwb(ymm1, zmm2)); TEST_INSTRUCTION("62F27E48305C1104" , vpmovwb(ptr(ecx, edx, 0, 128), zmm3)); TEST_INSTRUCTION("62F27E48305C1104" , vpmovwb(ymmword_ptr(ecx, edx, 0, 128), zmm3)); - TEST_INSTRUCTION("C4E27931CA" , vpmovzxbd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279318C1A80000000" , vpmovzxbd(xmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D31CA" , vpmovzxbd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D318C1A80000000" , vpmovzxbd(ymm1, qword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4831CA" , vpmovzxbd(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48314C1A08" , vpmovzxbd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48314C1A08" , vpmovzxbd(zmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27932CA" , vpmovzxbq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279328C1A80000000" , vpmovzxbq(xmm1, word_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D32CA" , vpmovzxbq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D328C1A80000000" , vpmovzxbq(ymm1, dword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4832CA" , vpmovzxbq(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48324C1A10" , vpmovzxbq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48324C1A10" , vpmovzxbq(zmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27930CA" , vpmovzxbw(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279308C1A80000000" , vpmovzxbw(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D30CA" , vpmovzxbw(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D308C1A80000000" , vpmovzxbw(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4830CA" , vpmovzxbw(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48304C1A04" , vpmovzxbw(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48304C1A04" , vpmovzxbw(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27935CA" , vpmovzxdq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279358C1A80000000" , vpmovzxdq(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D35CA" , vpmovzxdq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D358C1A80000000" , vpmovzxdq(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4835CA" , vpmovzxdq(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48354C1A04" , vpmovzxdq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48354C1A04" , vpmovzxdq(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27933CA" , vpmovzxwd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279338C1A80000000" , vpmovzxwd(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D33CA" , vpmovzxwd(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D338C1A80000000" , vpmovzxwd(ymm1, xmmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4833CA" , vpmovzxwd(zmm1, ymm2)); TEST_INSTRUCTION("62F27D48334C1A04" , vpmovzxwd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48334C1A04" , vpmovzxwd(zmm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27934CA" , vpmovzxwq(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279348C1A80000000" , vpmovzxwq(xmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D34CA" , vpmovzxwq(ymm1, xmm2)); - TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D348C1A80000000" , vpmovzxwq(ymm1, qword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D4834CA" , vpmovzxwq(zmm1, xmm2)); TEST_INSTRUCTION("62F27D48344C1A08" , vpmovzxwq(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F27D48344C1A08" , vpmovzxwq(zmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E26928CB" , vpmuldq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269288C2B80000000" , vpmuldq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D28CB" , vpmuldq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D288C2B80000000" , vpmuldq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED4828CB" , vpmuldq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48284C2B02" , vpmuldq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48284C2B02" , vpmuldq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2690BCB" , vpmulhrsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2690B8C2B80000000" , vpmulhrsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D0BCB" , vpmulhrsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D0B8C2B80000000" , vpmulhrsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D480BCB" , vpmulhrsw(zmm1, zmm2, zmm3)); - TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E4CB" , vpmulhuw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E48C2B80000000" , vpmulhuw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE4CB" , vpmulhuw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE48C2B80000000" , vpmulhuw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("62F26D480B4C2B02" , vpmulhrsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E4CB" , vpmulhuw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E44C2B02" , vpmulhuw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E44C2B02" , vpmulhuw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E5CB" , vpmulhw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E58C2B80000000" , vpmulhw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE5CB" , vpmulhw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE58C2B80000000" , vpmulhw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E5CB" , vpmulhw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E54C2B02" , vpmulhw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26940CB" , vpmulld(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269408C2B80000000" , vpmulld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D40CB" , vpmulld(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D408C2B80000000" , vpmulld(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4840CB" , vpmulld(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48404C2B02" , vpmulld(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48404C2B02" , vpmulld(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -6169,12 +6891,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4840CB" , vpmullq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48404C2B02" , vpmullq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48404C2B02" , vpmullq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D5CB" , vpmullw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D58C2B80000000" , vpmullw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD5CB" , vpmullw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD58C2B80000000" , vpmullw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48D5CB" , vpmullw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48D54C2B02" , vpmullw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48D54C2B02" , vpmullw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -6187,12 +6903,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4883CB" , vpmultishiftqb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48834C2B02" , vpmultishiftqb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48834C2B02" , vpmultishiftqb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F4CB" , vpmuludq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F48C2B80000000" , vpmuludq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF4CB" , vpmuludq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF48C2B80000000" , vpmuludq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48F4CB" , vpmuludq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48F44C2B02" , vpmuludq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48F44C2B02" , vpmuludq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -6232,12 +6942,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD4854CA" , vpopcntw(zmm1, zmm2)); TEST_INSTRUCTION("62F2FD48544C1A02" , vpopcntw(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD48544C1A02" , vpopcntw(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5E9EBCB" , vpor(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9EB8C2B80000000" , vpor(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEBCB" , vpor(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEB8C2B80000000" , vpor(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08EBCB" , vpord(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08EB4C2B08" , vpord(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08EB4C2B08" , vpord(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -6256,11 +6960,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48EBCB" , vporq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48EB4C2B02" , vporq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48EB4C2B02" , vporq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE868A3CB40" , vpperm(xmm1, xmm2, xmm3, xmm4)); - TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("8FE8E8A38C358000000030" , vpperm(xmm1, xmm2, xmm3, xmmword_ptr(ebp, esi, 0, 128))); - TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, ptr(ebx, ebp, 0, 128), xmm6)); - TEST_INSTRUCTION("8FE868A38C2B8000000060" , vpperm(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), xmm6)); TEST_INSTRUCTION("62F1750872CA01" , vprold(xmm1, xmm2, 1)); TEST_INSTRUCTION("62F17508724C1A0801" , vprold(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17508724C1A0801" , vprold(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); @@ -6333,44 +7032,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4814CB" , vprorvq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48144C2B02" , vprorvq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48144C2B02" , vprorvq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE96090CA" , vprotb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE878C0CA01" , vprotb(xmm1, xmm2, 1)); - TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8908C2B80000000" , vprotb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FE958908C1A80000000" , vprotb(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C08C1A8000000001" , vprotb(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FE96092CA" , vprotd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE878C2CA01" , vprotd(xmm1, xmm2, 1)); - TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8928C2B80000000" , vprotd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FE958928C1A80000000" , vprotd(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C28C1A8000000001" , vprotd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FE96093CA" , vprotq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE878C3CA01" , vprotq(xmm1, xmm2, 1)); - TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8938C2B80000000" , vprotq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FE958938C1A80000000" , vprotq(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C38C1A8000000001" , vprotq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FE96091CA" , vprotw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE878C1CA01" , vprotw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8918C2B80000000" , vprotw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("8FE958918C1A80000000" , vprotw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE878C18C1A8000000001" , vprotw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9F6CB" , vpsadbw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F68C2B80000000" , vpsadbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF6CB" , vpsadbw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF68C2B80000000" , vpsadbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48F6CB" , vpsadbw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48F64C2B02" , vpsadbw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48F64C2B02" , vpsadbw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -6386,36 +7047,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2FD09A15C1110" , k(k1).vpscatterqq(ptr(ecx, xmm2, 0, 128), xmm3)); TEST_INSTRUCTION("62F2FD29A15C1110" , k(k1).vpscatterqq(ptr(ecx, ymm2, 0, 128), ymm3)); TEST_INSTRUCTION("62F2FD49A15C1110" , k(k1).vpscatterqq(ptr(ecx, zmm2, 0, 128), zmm3)); - TEST_INSTRUCTION("8FE96098CA" , vpshab(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8988C2B80000000" , vpshab(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958988C1A80000000" , vpshab(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE9609ACA" , vpshad(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E89A8C2B80000000" , vpshad(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE9589A8C1A80000000" , vpshad(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE9609BCA" , vpshaq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E89B8C2B80000000" , vpshaq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE9589B8C1A80000000" , vpshaq(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE96099CA" , vpshaw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8998C2B80000000" , vpshaw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958998C1A80000000" , vpshaw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE96094CA" , vpshlb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8948C2B80000000" , vpshlb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958948C1A80000000" , vpshlb(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE96096CA" , vpshld(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8968C2B80000000" , vpshld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958968C1A80000000" , vpshld(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); TEST_INSTRUCTION("62F36D0871CB01" , vpshldd(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08714C2B0801" , vpshldd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08714C2B0801" , vpshldd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); @@ -6470,16 +7101,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4870CB01" , vpshldw(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48704C2B0201" , vpshldw(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48704C2B0201" , vpshldw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("8FE96097CA" , vpshlq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8978C2B80000000" , vpshlq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958978C1A80000000" , vpshlq(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE96095CA" , vpshlw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE9E8958C2B80000000" , vpshlw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, ptr(edx, ebx, 0, 128), xmm4)); - TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4)); TEST_INSTRUCTION("62F36D0873CB01" , vpshrdd(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D08734C2B0801" , vpshrdd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D08734C2B0801" , vpshrdd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); @@ -6534,12 +7155,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4872CB01" , vpshrdw(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48724C2B0201" , vpshrdw(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48724C2B0201" , vpshrdw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E26900CB" , vpshufb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269008C2B80000000" , vpshufb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D00CB" , vpshufb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D008C2B80000000" , vpshufb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4800CB" , vpshufb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48004C2B02" , vpshufb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48004C2B02" , vpshufb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -6552,59 +7167,15 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D488FCB" , vpshufbitqmb(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D488F4C2B02" , vpshufbitqmb(k1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D488F4C2B02" , vpshufbitqmb(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5F970CA01" , vpshufd(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5F9708C1A8000000001" , vpshufd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FD70CA01" , vpshufd(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FD708C1A8000000001" , vpshufd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17D4870CA01" , vpshufd(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17D48704C1A0201" , vpshufd(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17D48704C1A0201" , vpshufd(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FA70CA01" , vpshufhw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FA708C1A8000000001" , vpshufhw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FE70CA01" , vpshufhw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FE708C1A8000000001" , vpshufhw(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17E4870CA01" , vpshufhw(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17E48704C1A0201" , vpshufhw(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17E48704C1A0201" , vpshufhw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FB70CA01" , vpshuflw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FB708C1A8000000001" , vpshuflw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FF70CA01" , vpshuflw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5FF708C1A8000000001" , vpshuflw(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17F4870CA01" , vpshuflw(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17F48704C1A0201" , vpshuflw(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17F48704C1A0201" , vpshuflw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26908CB" , vpsignb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269088C2B80000000" , vpsignb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D08CB" , vpsignb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D088C2B80000000" , vpsignb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2690ACB" , vpsignd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2690A8C2B80000000" , vpsignd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D0ACB" , vpsignd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D0A8C2B80000000" , vpsignd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26909CB" , vpsignw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269098C2B80000000" , vpsignw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D09CB" , vpsignw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D098C2B80000000" , vpsignw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F2CB" , vpslld(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F172F201" , vpslld(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F28C2B80000000" , vpslld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF2CB" , vpslld(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F572F201" , vpslld(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF28C2B80000000" , vpslld(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1750872741A0801" , vpslld(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1750872741A0801" , vpslld(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1752872741A0401" , vpslld(ymm1, ptr(edx, ebx, 0, 128), 1)); @@ -6615,23 +7186,13 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48F24C2B08" , vpslld(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1754872741A0201" , vpslld(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1754872741A0201" , vpslld(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5F173FA01" , vpslldq(xmm1, xmm2, 1)); TEST_INSTRUCTION("62F17508737C1A0801" , vpslldq(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17508737C1A0801" , vpslldq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5F573FA01" , vpslldq(ymm1, ymm2, 1)); TEST_INSTRUCTION("62F17528737C1A0401" , vpslldq(ymm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17528737C1A0401" , vpslldq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1754873FA01" , vpslldq(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17548737C1A0201" , vpslldq(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17548737C1A0201" , vpslldq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9F3CB" , vpsllq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F173F201" , vpsllq(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F38C2B80000000" , vpsllq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF3CB" , vpsllq(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F573F201" , vpsllq(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF38C2B80000000" , vpsllq(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1F50873741A0801" , vpsllq(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1F50873741A0801" , vpsllq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1F52873741A0401" , vpsllq(ymm1, ptr(edx, ebx, 0, 128), 1)); @@ -6642,21 +7203,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48F34C2B08" , vpsllq(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1F54873741A0201" , vpsllq(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1F54873741A0201" , vpsllq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26947CB" , vpsllvd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269478C2B80000000" , vpsllvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D47CB" , vpsllvd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D478C2B80000000" , vpsllvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4847CB" , vpsllvd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48474C2B02" , vpsllvd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48474C2B02" , vpsllvd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E947CB" , vpsllvq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9478C2B80000000" , vpsllvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED47CB" , vpsllvq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED478C2B80000000" , vpsllvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED4847CB" , vpsllvq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48474C2B02" , vpsllvq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48474C2B02" , vpsllvq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -6669,14 +7218,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4812CB" , vpsllvw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48124C2B02" , vpsllvw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48124C2B02" , vpsllvw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F1CB" , vpsllw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F171F201" , vpsllw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F18C2B80000000" , vpsllw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF1CB" , vpsllw(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F571F201" , vpsllw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF18C2B80000000" , vpsllw(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1750871741A0801" , vpsllw(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1750871741A0801" , vpsllw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1752871741A0401" , vpsllw(ymm1, ptr(edx, ebx, 0, 128), 1)); @@ -6687,14 +7228,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48F14C2B08" , vpsllw(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1754871741A0201" , vpsllw(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1754871741A0201" , vpsllw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9E2CB" , vpsrad(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F172E201" , vpsrad(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E28C2B80000000" , vpsrad(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE2CB" , vpsrad(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F572E201" , vpsrad(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE28C2B80000000" , vpsrad(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1750872641A0801" , vpsrad(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1750872641A0801" , vpsrad(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1752872641A0401" , vpsrad(ymm1, ptr(edx, ebx, 0, 128), 1)); @@ -6723,12 +7256,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48E24C2B08" , vpsraq(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1F54872641A0201" , vpsraq(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1F54872641A0201" , vpsraq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26946CB" , vpsravd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269468C2B80000000" , vpsravd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D46CB" , vpsravd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D468C2B80000000" , vpsravd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4846CB" , vpsravd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48464C2B02" , vpsravd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48464C2B02" , vpsravd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -6750,14 +7277,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED4811CB" , vpsravw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48114C2B02" , vpsravw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48114C2B02" , vpsravw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E1CB" , vpsraw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F171E201" , vpsraw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E18C2B80000000" , vpsraw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE1CB" , vpsraw(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F571E201" , vpsraw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE18C2B80000000" , vpsraw(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1750871641A0801" , vpsraw(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1750871641A0801" , vpsraw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1752871641A0401" , vpsraw(ymm1, ptr(edx, ebx, 0, 128), 1)); @@ -6768,14 +7287,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48E14C2B08" , vpsraw(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1754871641A0201" , vpsraw(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1754871641A0201" , vpsraw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9D2CB" , vpsrld(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F172D201" , vpsrld(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D28C2B80000000" , vpsrld(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD2CB" , vpsrld(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F572D201" , vpsrld(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD28C2B80000000" , vpsrld(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1750872541A0801" , vpsrld(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1750872541A0801" , vpsrld(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1752872541A0401" , vpsrld(ymm1, ptr(edx, ebx, 0, 128), 1)); @@ -6786,23 +7297,13 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48D24C2B08" , vpsrld(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1754872541A0201" , vpsrld(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1754872541A0201" , vpsrld(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5F173DA01" , vpsrldq(xmm1, xmm2, 1)); TEST_INSTRUCTION("62F17508735C1A0801" , vpsrldq(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17508735C1A0801" , vpsrldq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5F573DA01" , vpsrldq(ymm1, ymm2, 1)); TEST_INSTRUCTION("62F17528735C1A0401" , vpsrldq(ymm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17528735C1A0401" , vpsrldq(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1754873DA01" , vpsrldq(zmm1, zmm2, 1)); TEST_INSTRUCTION("62F17548735C1A0201" , vpsrldq(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F17548735C1A0201" , vpsrldq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9D3CB" , vpsrlq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F173D201" , vpsrlq(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D38C2B80000000" , vpsrlq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD3CB" , vpsrlq(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F573D201" , vpsrlq(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD38C2B80000000" , vpsrlq(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1F50873541A0801" , vpsrlq(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1F50873541A0801" , vpsrlq(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1F52873541A0401" , vpsrlq(ymm1, ptr(edx, ebx, 0, 128), 1)); @@ -6813,21 +7314,9 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F1ED48D34C2B08" , vpsrlq(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1F54873541A0201" , vpsrlq(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1F54873541A0201" , vpsrlq(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E26945CB" , vpsrlvd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E269458C2B80000000" , vpsrlvd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D45CB" , vpsrlvd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E26D458C2B80000000" , vpsrlvd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D4845CB" , vpsrlvd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F26D48454C2B02" , vpsrlvd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D48454C2B02" , vpsrlvd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E945CB" , vpsrlvq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2E9458C2B80000000" , vpsrlvq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED45CB" , vpsrlvq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2ED458C2B80000000" , vpsrlvq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED4845CB" , vpsrlvq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48454C2B02" , vpsrlvq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED48454C2B02" , vpsrlvq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -6839,15 +7328,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2ED28104C2B04" , vpsrlvw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED4810CB" , vpsrlvw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F2ED48104C2B02" , vpsrlvw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("62F2ED48104C2B02" , vpsrlvw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D1CB" , vpsrlw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5F171D201" , vpsrlw(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D18C2B80000000" , vpsrlw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD1CB" , vpsrlw(ymm1, ymm2, xmm3)); - TEST_INSTRUCTION("C5F571D201" , vpsrlw(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD18C2B80000000" , vpsrlw(ymm1, ymm2, xmmword_ptr(ebx, ebp, 0, 128))); + TEST_INSTRUCTION("62F2ED48104C2B02" , vpsrlvw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1750871541A0801" , vpsrlw(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1750871541A0801" , vpsrlw(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1752871541A0401" , vpsrlw(ymm1, ptr(edx, ebx, 0, 128), 1)); @@ -6858,75 +7339,27 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F16D48D14C2B08" , vpsrlw(zmm1, zmm2, xmmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1754871541A0201" , vpsrlw(zmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F1754871541A0201" , vpsrlw(zmm1, zmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C5E9F8CB" , vpsubb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F88C2B80000000" , vpsubb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF8CB" , vpsubb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF88C2B80000000" , vpsubb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48F8CB" , vpsubb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48F84C2B02" , vpsubb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48F84C2B02" , vpsubb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FACB" , vpsubd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FA8C2B80000000" , vpsubd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFACB" , vpsubd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFA8C2B80000000" , vpsubd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48FACB" , vpsubd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48FA4C2B02" , vpsubd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48FA4C2B02" , vpsubd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FBCB" , vpsubq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9FB8C2B80000000" , vpsubq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFBCB" , vpsubq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDFB8C2B80000000" , vpsubq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48FBCB" , vpsubq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48FB4C2B02" , vpsubq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48FB4C2B02" , vpsubq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E8CB" , vpsubsb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E88C2B80000000" , vpsubsb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE8CB" , vpsubsb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE88C2B80000000" , vpsubsb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E8CB" , vpsubsb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E84C2B02" , vpsubsb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E84C2B02" , vpsubsb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E9CB" , vpsubsw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9E98C2B80000000" , vpsubsw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE9CB" , vpsubsw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDE98C2B80000000" , vpsubsw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E9CB" , vpsubsw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48E94C2B02" , vpsubsw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48E94C2B02" , vpsubsw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D8CB" , vpsubusb(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D88C2B80000000" , vpsubusb(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD8CB" , vpsubusb(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD88C2B80000000" , vpsubusb(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48D8CB" , vpsubusb(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48D84C2B02" , vpsubusb(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48D84C2B02" , vpsubusb(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D9CB" , vpsubusw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9D98C2B80000000" , vpsubusw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD9CB" , vpsubusw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDD98C2B80000000" , vpsubusw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48D9CB" , vpsubusw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48D94C2B02" , vpsubusw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48D94C2B02" , vpsubusw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F9CB" , vpsubw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9F98C2B80000000" , vpsubw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF9CB" , vpsubw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDF98C2B80000000" , vpsubw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48F9CB" , vpsubw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48F94C2B02" , vpsubw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48F94C2B02" , vpsubw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); @@ -6948,12 +7381,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4825CB01" , vpternlogq(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48254C2B0201" , vpternlogq(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48254C2B0201" , vpternlogq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E27917CA" , vptest(xmm1, xmm2)); - TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E279178C1A80000000" , vptest(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D17CA" , vptest(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D178C1A80000000" , vptest(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F26D0826CB" , vptestmb(k1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D08264C2B08" , vptestmb(k1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D08264C2B08" , vptestmb(k1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -7026,84 +7453,30 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F2EE4826CB" , vptestnmw(k1, zmm2, zmm3)); TEST_INSTRUCTION("62F2EE48264C2B02" , vptestnmw(k1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2EE48264C2B02" , vptestnmw(k1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E968CB" , vpunpckhbw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9688C2B80000000" , vpunpckhbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED68CB" , vpunpckhbw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED688C2B80000000" , vpunpckhbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4868CB" , vpunpckhbw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48684C2B02" , vpunpckhbw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48684C2B02" , vpunpckhbw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E96ACB" , vpunpckhdq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E96A8C2B80000000" , vpunpckhdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED6ACB" , vpunpckhdq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED6A8C2B80000000" , vpunpckhdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D486ACB" , vpunpckhdq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D486A4C2B02" , vpunpckhdq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D486A4C2B02" , vpunpckhdq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E96DCB" , vpunpckhqdq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E96D8C2B80000000" , vpunpckhqdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED6DCB" , vpunpckhqdq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED6D8C2B80000000" , vpunpckhqdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED486DCB" , vpunpckhqdq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED486D4C2B02" , vpunpckhqdq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED486D4C2B02" , vpunpckhqdq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E969CB" , vpunpckhwd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9698C2B80000000" , vpunpckhwd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED69CB" , vpunpckhwd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED698C2B80000000" , vpunpckhwd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4869CB" , vpunpckhwd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48694C2B02" , vpunpckhwd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48694C2B02" , vpunpckhwd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E960CB" , vpunpcklbw(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9608C2B80000000" , vpunpcklbw(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED60CB" , vpunpcklbw(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED608C2B80000000" , vpunpcklbw(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4860CB" , vpunpcklbw(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48604C2B02" , vpunpcklbw(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48604C2B02" , vpunpcklbw(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E962CB" , vpunpckldq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9628C2B80000000" , vpunpckldq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED62CB" , vpunpckldq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED628C2B80000000" , vpunpckldq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4862CB" , vpunpckldq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48624C2B02" , vpunpckldq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48624C2B02" , vpunpckldq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E96CCB" , vpunpcklqdq(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E96C8C2B80000000" , vpunpcklqdq(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED6CCB" , vpunpcklqdq(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED6C8C2B80000000" , vpunpcklqdq(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED486CCB" , vpunpcklqdq(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED486C4C2B02" , vpunpcklqdq(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED486C4C2B02" , vpunpcklqdq(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E961CB" , vpunpcklwd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9618C2B80000000" , vpunpcklwd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED61CB" , vpunpcklwd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED618C2B80000000" , vpunpcklwd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D4861CB" , vpunpcklwd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16D48614C2B02" , vpunpcklwd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D48614C2B02" , vpunpcklwd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9EFCB" , vpxor(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9EF8C2B80000000" , vpxor(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEFCB" , vpxor(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EDEF8C2B80000000" , vpxor(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08EFCB" , vpxord(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F16D08EF4C2B08" , vpxord(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16D08EF4C2B08" , vpxord(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -7182,15 +7555,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D08CBCB" , vrcp28ss(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5F853CA" , vrcpps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F8538C1A80000000" , vrcpps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC53CA" , vrcpps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC538C1A80000000" , vrcpps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5EA53CB" , vrcpss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA538C2B80000000" , vrcpss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F3FD0856CA01" , vreducepd(xmm1, xmm2, 1)); TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, ptr(edx, ebx, 0, 128), 1)); TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); @@ -7239,24 +7603,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F36D080ACB01" , vrndscaless(xmm1, xmm2, xmm3, 1)); TEST_INSTRUCTION("62F36D080A4C2B2001" , vrndscaless(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F36D080A4C2B2001" , vrndscaless(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E37909CA01" , vroundpd(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379098C1A8000000001" , vroundpd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D09CA01" , vroundpd(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D098C1A8000000001" , vroundpd(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37908CA01" , vroundps(xmm1, xmm2, 1)); - TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E379088C1A8000000001" , vroundps(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D08CA01" , vroundps(ymm1, ymm2, 1)); - TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E37D088C1A8000000001" , vroundps(ymm1, ymmword_ptr(edx, ebx, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690BCB01" , vroundsd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690B8C2B8000000001" , vroundsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690ACB01" , vroundss(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C4E3690A8C2B8000000001" , vroundss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F2FD084ECA" , vrsqrt14pd(xmm1, xmm2)); TEST_INSTRUCTION("62F2FD084E4C1A08" , vrsqrt14pd(xmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F2FD084E4C1A08" , vrsqrt14pd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); @@ -7293,15 +7639,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F26D08CDCB" , vrsqrt28ss(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5F852CA" , vrsqrtps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F8528C1A80000000" , vrsqrtps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC52CA" , vrsqrtps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC528C1A80000000" , vrsqrtps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5EA52CB" , vrsqrtss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA528C2B80000000" , vrsqrtss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED082CCB" , vscalefpd(xmm1, xmm2, xmm3)); TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); @@ -7370,148 +7707,36 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester& TEST_INSTRUCTION("62F3ED4843CB01" , vshufi64x2(zmm1, zmm2, zmm3, 1)); TEST_INSTRUCTION("62F3ED48434C2B0201" , vshufi64x2(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); TEST_INSTRUCTION("62F3ED48434C2B0201" , vshufi64x2(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C6CB01" , vshufpd(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E9C68C2B8000000001" , vshufpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5EDC6CB01" , vshufpd(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5EDC68C2B8000000001" , vshufpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("62F1ED48C6CB01" , vshufpd(zmm1, zmm2, zmm3, 1)); - TEST_INSTRUCTION("62F1ED48C64C2B0201" , vshufpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("62F1ED48C64C2B0201" , vshufpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E8C6CB01" , vshufps(xmm1, xmm2, xmm3, 1)); - TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5E8C68C2B8000000001" , vshufps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5ECC6CB01" , vshufps(ymm1, ymm2, ymm3, 1)); - TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5ECC68C2B8000000001" , vshufps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("62F16C48C6CB01" , vshufps(zmm1, zmm2, zmm3, 1)); - TEST_INSTRUCTION("62F16C48C64C2B0201" , vshufps(zmm1, zmm2, ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("62F16C48C64C2B0201" , vshufps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128), 1)); - TEST_INSTRUCTION("C5F951CA" , vsqrtpd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F9518C1A80000000" , vsqrtpd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD51CA" , vsqrtpd(ymm1, ymm2)); - TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FD518C1A80000000" , vsqrtpd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD4851CA" , vsqrtpd(zmm1, zmm2)); TEST_INSTRUCTION("62F1FD48514C1A02" , vsqrtpd(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F1FD48514C1A02" , vsqrtpd(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F851CA" , vsqrtps(xmm1, xmm2)); - TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F8518C1A80000000" , vsqrtps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC51CA" , vsqrtps(ymm1, ymm2)); - TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5FC518C1A80000000" , vsqrtps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C4851CA" , vsqrtps(zmm1, zmm2)); TEST_INSTRUCTION("62F17C48514C1A02" , vsqrtps(zmm1, ptr(edx, ebx, 0, 128))); TEST_INSTRUCTION("62F17C48514C1A02" , vsqrtps(zmm1, zmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5EB51CB" , vsqrtsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB518C2B80000000" , vsqrtsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA51CB" , vsqrtss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA518C2B80000000" , vsqrtss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("C5F8AE9C1180000000" , vstmxcsr(dword_ptr(ecx, edx, 0, 128))); - TEST_INSTRUCTION("C5E95CCB" , vsubpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E95C8C2B80000000" , vsubpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED5CCB" , vsubpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED5C8C2B80000000" , vsubpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED485CCB" , vsubpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED485C4C2B02" , vsubpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED485C4C2B02" , vsubpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E85CCB" , vsubps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E85C8C2B80000000" , vsubps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC5CCB" , vsubps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC5C8C2B80000000" , vsubps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C485CCB" , vsubps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C485C4C2B02" , vsubps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C485C4C2B02" , vsubps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB5CCB" , vsubsd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EB5C8C2B80000000" , vsubsd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5CCB" , vsubss(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EA5C8C2B80000000" , vsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C4E2790FCA" , vtestpd(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2790F8C1A80000000" , vtestpd(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D0FCA" , vtestpd(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D0F8C1A80000000" , vtestpd(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2790ECA" , vtestps(xmm1, xmm2)); - TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E2790E8C1A80000000" , vtestps(xmm1, xmmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D0ECA" , vtestps(ymm1, ymm2)); - TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C4E27D0E8C1A80000000" , vtestps(ymm1, ymmword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F92ECA" , vucomisd(xmm1, xmm2)); - TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F92E8C1A80000000" , vucomisd(xmm1, qword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F82ECA" , vucomiss(xmm1, xmm2)); - TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5F82E8C1A80000000" , vucomiss(xmm1, dword_ptr(edx, ebx, 0, 128))); - TEST_INSTRUCTION("C5E915CB" , vunpckhpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9158C2B80000000" , vunpckhpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED15CB" , vunpckhpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED158C2B80000000" , vunpckhpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED4815CB" , vunpckhpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48154C2B02" , vunpckhpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48154C2B02" , vunpckhpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E815CB" , vunpckhps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8158C2B80000000" , vunpckhps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC15CB" , vunpckhps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC158C2B80000000" , vunpckhps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C4815CB" , vunpckhps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48154C2B02" , vunpckhps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C48154C2B02" , vunpckhps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E914CB" , vunpcklpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9148C2B80000000" , vunpcklpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED14CB" , vunpcklpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED148C2B80000000" , vunpcklpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED4814CB" , vunpcklpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48144C2B02" , vunpcklpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48144C2B02" , vunpcklpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E814CB" , vunpcklps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8148C2B80000000" , vunpcklps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC14CB" , vunpcklps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC148C2B80000000" , vunpcklps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C4814CB" , vunpcklps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48144C2B02" , vunpcklps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C48144C2B02" , vunpcklps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E957CB" , vxorpd(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E9578C2B80000000" , vxorpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED57CB" , vxorpd(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5ED578C2B80000000" , vxorpd(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED4857CB" , vxorpd(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F1ED48574C2B02" , vxorpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F1ED48574C2B02" , vxorpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E857CB" , vxorps(xmm1, xmm2, xmm3)); - TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5E8578C2B80000000" , vxorps(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC57CB" , vxorps(ymm1, ymm2, ymm3)); - TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5EC578C2B80000000" , vxorps(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C4857CB" , vxorps(zmm1, zmm2, zmm3)); TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, ptr(ebx, ebp, 0, 128))); TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128))); - TEST_INSTRUCTION("C5FC77" , vzeroall()); - TEST_INSTRUCTION("C5F877" , vzeroupper()); } static void ASMJIT_NOINLINE testX86AssemblerAVX512_FP16(AssemblerTester& tester) noexcept { @@ -8279,6 +8504,17 @@ static void ASMJIT_NOINLINE testX86AssemblerExtras(AssemblerTester& tester) noexcept { + using namespace x86; + + FAIL_INSTRUCTION(kErrorInvalidInstruction , movs(byte_ptr(eax), byte_ptr(esi))); + FAIL_INSTRUCTION(kErrorInvalidInstruction , movs(word_ptr(eax), word_ptr(esi))); + FAIL_INSTRUCTION(kErrorInvalidInstruction , movs(dword_ptr(eax), dword_ptr(esi))); +} +*/ + bool testX86Assembler(const TestSettings& settings) noexcept { using namespace x86; @@ -8286,15 +8522,30 @@ bool testX86Assembler(const TestSettings& settings) noexcept { tester.printHeader("X86"); testX86AssemblerBase(tester); + testX86AssemblerBaseExt(tester); testX86AssemblerMMX_SSE(tester); testX86AssemblerAVX(tester); + testX86AssemblerAVX_NE_CONVERT(tester); + testX86AssemblerAVX_VNNI(tester); + testX86AssemblerAVX_VNNI_INT8(tester); + testX86AssemblerAVX_VNNI_INT16(tester); + testX86AssemblerAVX_SHA512(tester); + testX86AssemblerAVX_SM3(tester); + testX86AssemblerAVX_SM4(tester); + testX86AssemblerFMA(tester); + testX86AssemblerFMA4(tester); + testX86AssemblerXOP(tester); + testX86AssemblerAVX512(tester); testX86AssemblerAVX512_FP16(tester); testX86AssemblerExtras(tester); + // testX86AssemblerFailures(tester); + tester.printSummary(); return tester.didPass(); } +#undef FAIL_INSTRUCTION #undef TEST_INSTRUCTION #endif // !ASMJIT_NO_X86 diff --git a/3rdparty/asmjit/test/asmjit_test_compiler.cpp b/3rdparty/asmjit/test/asmjit_test_compiler.cpp index f2bc306c6df33..cfbb7ede6d99f 100644 --- a/3rdparty/asmjit/test/asmjit_test_compiler.cpp +++ b/3rdparty/asmjit/test/asmjit_test_compiler.cpp @@ -13,37 +13,37 @@ #include #include +#if !defined(ASMJIT_NO_COMPILER) + #include "cmdline.h" #include "asmjitutils.h" #include "performancetimer.h" - #include "asmjit_test_compiler.h" -#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 -#include -void compiler_add_x86_tests(TestApp& app); -#endif - -#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64 -#include -void compiler_add_a64_tests(TestApp& app); -#endif +#if !defined(ASMJIT_NO_X86) + #include + void compiler_add_x86_tests(TestApp& app); +#endif // !ASMJIT_NO_X86 -#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 - #define ASMJIT_HAVE_WORKING_JIT -#endif - -#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64 - #define ASMJIT_HAVE_WORKING_JIT -#endif +#if !defined(ASMJIT_NO_AARCH64) + #include + void compiler_add_a64_tests(TestApp& app); +#endif // !ASMJIT_NO_AARCH64 using namespace asmjit; int TestApp::handleArgs(int argc, const char* const* argv) { CmdLine cmd(argc, argv); + _arch = cmd.valueOf("--arch", "all"); + _filter = cmd.valueOf("--filter", nullptr); + if (cmd.hasArg("--help")) _helpOnly = true; if (cmd.hasArg("--verbose")) _verbose = true; + +#ifndef ASMJIT_NO_LOGGING if (cmd.hasArg("--dump-asm")) _dumpAsm = true; +#endif // !ASMJIT_NO_LOGGING + if (cmd.hasArg("--dump-hex")) _dumpHex = true; return 0; @@ -55,31 +55,73 @@ void TestApp::showInfo() { unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF), unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF), asmjitArchAsString(Arch::kHost)); - printf(" [%s] Verbose (use --verbose to turn verbose output ON)\n", _verbose ? "x" : " "); - printf(" [%s] DumpAsm (use --dump-asm to turn assembler dumps ON)\n", _dumpAsm ? "x" : " "); - printf(" [%s] DumpHex (use --dump-hex to dump binary in hexadecimal)\n", _dumpHex ? "x" : " "); + + printf("Usage:\n"); + printf(" --help Show usage only\n"); + printf(" --arch= Select architecture to run ('all' by default)\n"); + printf(" --filter= Use a filter to restrict which test is called\n"); + printf(" --verbose Verbose output\n"); + printf(" --dump-asm Assembler output\n"); + printf(" --dump-hex Hexadecimal output (relocated, only for host arch)\n"); printf("\n"); } +#ifndef ASMJIT_NO_LOGGING +class IndentedStdoutLogger : public Logger { +public: + ASMJIT_NONCOPYABLE(IndentedStdoutLogger) + + size_t _indentation = 0; + + explicit IndentedStdoutLogger(size_t indentation) noexcept + : _indentation(indentation) {} + + Error _log(const char* data, size_t size = SIZE_MAX) noexcept override { + asmjit::DebugUtils::unused(size); + printIndented(data, _indentation); + return kErrorOk; + } +}; +#endif // !ASMJIT_NO_LOGGING + +bool TestApp::shouldRun(const TestCase* tc) { + if (!_filter) + return true; + + return strstr(tc->name(), _filter) != nullptr; +} + int TestApp::run() { -#ifndef ASMJIT_HAVE_WORKING_JIT - return 0; -#else #ifndef ASMJIT_NO_LOGGING FormatOptions formatOptions; formatOptions.addFlags( FormatFlags::kMachineCode | FormatFlags::kExplainImms | FormatFlags::kRegCasts ); + formatOptions.setIndentation(FormatIndentationGroup::kCode, 2); - FileLogger fileLogger(stdout); - fileLogger.setOptions(formatOptions); + IndentedStdoutLogger printLogger(4); + printLogger.setOptions(formatOptions); StringLogger stringLogger; stringLogger.setOptions(formatOptions); -#endif + auto printStringLoggerContent = [&]() { + if (!_verbose) { + printf("%s", stringLogger.data()); + fflush(stdout); + } + }; +#else + auto printStringLoggerContent = [&]() {}; +#endif // !ASMJIT_NO_LOGGING + + // maybe unused... + DebugUtils::unused(printStringLoggerContent); + +#ifndef ASMJIT_NO_JIT JitRuntime runtime; +#endif // !ASMJIT_NO_JIT PerformanceTimer compileTimer; PerformanceTimer finalizeTimer; @@ -87,62 +129,149 @@ int TestApp::run() { double finalizeTime = 0; for (std::unique_ptr& test : _tests) { + if (!shouldRun(test.get())) + continue; + + _numTests++; + for (uint32_t pass = 0; pass < 2; pass++) { + bool runnable = false; CodeHolder code; SimpleErrorHandler errorHandler; - code.init(runtime.environment()); + const char* statusSeparator = " "; + + // Filter architecture to run. + if (strcmp(_arch, "all") != 0) { + switch (test->arch()) { + case Arch::kX86: + if (strcmp(_arch, "x86") == 0) + break; + continue; + case Arch::kX64: + if (strcmp(_arch, "x64") == 0) + break; + continue; + case Arch::kAArch64: + if (strcmp(_arch, "aarch64") == 0) + break; + continue; + default: + continue; + } + } + + // Use platform environment and CPU features when the test can run on the arch. +#ifndef ASMJIT_NO_JIT + if (runtime.arch() == test->arch()) { + code.init(runtime.environment(), runtime.cpuFeatures()); + runnable = true; + } +#endif // !ASMJIT_NO_JIT + + if (!code.isInitialized()) { + Environment customEnv; + CpuFeatures features; + + switch (test->arch()) { + case Arch::kX86: + case Arch::kX64: + features.add(CpuFeatures::X86::kADX, + CpuFeatures::X86::kAVX, + CpuFeatures::X86::kAVX2, + CpuFeatures::X86::kBMI, + CpuFeatures::X86::kBMI2, + CpuFeatures::X86::kCMOV, + CpuFeatures::X86::kF16C, + CpuFeatures::X86::kFMA, + CpuFeatures::X86::kFPU, + CpuFeatures::X86::kI486, + CpuFeatures::X86::kLZCNT, + CpuFeatures::X86::kMMX, + CpuFeatures::X86::kMMX2, + CpuFeatures::X86::kPOPCNT, + CpuFeatures::X86::kSSE, + CpuFeatures::X86::kSSE2, + CpuFeatures::X86::kSSE3, + CpuFeatures::X86::kSSSE3, + CpuFeatures::X86::kSSE4_1, + CpuFeatures::X86::kSSE4_2); + break; + + case Arch::kAArch64: + features.add(CpuFeatures::ARM::kAES, + CpuFeatures::ARM::kASIMD, + CpuFeatures::ARM::kIDIVA, + CpuFeatures::ARM::kIDIVT, + CpuFeatures::ARM::kPMULL); + break; + + default: + break; + } + + customEnv.init(test->arch()); + code.init(customEnv, features); + } + code.setErrorHandler(&errorHandler); if (pass != 0) { + printf("[Test:%s] %s", asmjitArchAsString(test->arch()), test->name()); + fflush(stdout); + #ifndef ASMJIT_NO_LOGGING + if (_verbose || _dumpAsm || _dumpHex) { + printf("\n"); + statusSeparator = " "; + } + if (_verbose) { - code.setLogger(&fileLogger); + printf(" [Log]\n"); + code.setLogger(&printLogger); } else { stringLogger.clear(); code.setLogger(&stringLogger); } -#endif - - printf("[Test] %s", test->name()); - -#ifndef ASMJIT_NO_LOGGING - if (_verbose) - printf("\n"); -#endif +#endif // !ASMJIT_NO_LOGGING } + std::unique_ptr cc; + +#ifndef ASMJIT_NO_X86 + if (code.arch() == Arch::kX86 || code.arch() == Arch::kX64) + cc = std::unique_ptr(new x86::Compiler(&code)); +#endif // !ASMJIT_NO_X86 -#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 - x86::Compiler cc(&code); -#endif +#ifndef ASMJIT_NO_AARCH64 + if (code.arch() == Arch::kAArch64) + cc = std::unique_ptr(new a64::Compiler(&code)); +#endif // !ASMJIT_NO_AARCH64 -#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64 - a64::Compiler cc(&code); -#endif + if (!cc) + continue; #ifndef ASMJIT_NO_LOGGING - cc.addDiagnosticOptions(DiagnosticOptions::kRAAnnotate | DiagnosticOptions::kRADebugAll); -#endif + cc->addDiagnosticOptions(DiagnosticOptions::kRAAnnotate | DiagnosticOptions::kRADebugAll); +#endif // !ASMJIT_NO_LOGGING compileTimer.start(); - test->compile(cc); + test->compile(*cc); compileTimer.stop(); - void* func = nullptr; Error err = errorHandler._err; - - if (!err) { + if (err == kErrorOk) { finalizeTimer.start(); - err = cc.finalize(); + err = cc->finalize(); finalizeTimer.stop(); } - // The first pass is only for timing serialization and compilation, because otherwise it would be biased by - // logging, which takes much more time than finalize() does. We want to benchmark Compiler the way it would - // be used in production. + // The first pass is only used for timing of serialization and compilation, because otherwise it would be + // biased by logging, which takes much more time than finalize() does. We want to benchmark Compiler the + // way it would be used in the production. if (pass == 0) { + _outputSize += code.codeSize(); compileTime += compileTimer.duration(); finalizeTime += finalizeTimer.duration(); continue; @@ -150,72 +279,83 @@ int TestApp::run() { #ifndef ASMJIT_NO_LOGGING if (_dumpAsm) { - if (!_verbose) - printf("\n"); - String sb; - Formatter::formatNodeList(sb, formatOptions, &cc); - printf("%s", sb.data()); + Formatter::formatNodeList(sb, formatOptions, cc.get()); + printf(" [Assembly]\n"); + printIndented(sb.data(), 4); } -#endif - - if (err == kErrorOk) - err = runtime.add(&func, &code); - - if (err == kErrorOk && _dumpHex) { - String sb; - sb.appendHex((void*)func, code.codeSize()); - printf("\n (HEX: %s)\n", sb.data()); - } - - if (_verbose) - fflush(stdout); - - if (err == kErrorOk) { - _outputSize += code.codeSize(); - - StringTmp<128> result; - StringTmp<128> expect; +#endif // !ASMJIT_NO_LOGGING + +#ifndef ASMJIT_NO_JIT + if (runnable) { + void* func = nullptr; + if (err == kErrorOk) + err = runtime.add(&func, &code); + + if (err == kErrorOk && _dumpHex) { + String sb; + sb.appendHex((void*)func, code.codeSize()); + printf(" [Hex Dump]:\n"); + for (size_t i = 0; i < sb.size(); i += 76) { + printf(" %.60s\n", sb.data() + i); + } + } - if (test->run(func, result, expect)) { - if (!_verbose) - printf(" [OK]\n"); + if (_verbose) + fflush(stdout); + + if (err == kErrorOk) { + StringTmp<128> result; + StringTmp<128> expect; + + if (test->run(func, result, expect)) { + if (!_verbose) + printf("%s[RUN OK]\n", statusSeparator); + } + else { + if (!_verbose) + printf("%s[RUN FAILED]\n", statusSeparator); + + printStringLoggerContent(); + printf(" [Output]\n"); + printf(" Returned: %s\n", result.data()); + printf(" Expected: %s\n", expect.data()); + _numFailed++; + } + + if (_dumpAsm) + printf("\n"); + + runtime.release(func); } else { if (!_verbose) - printf(" [FAILED]\n"); + printf("%s[COMPILE FAILED]\n", statusSeparator); -#ifndef ASMJIT_NO_LOGGING - if (!_verbose) - printf("%s", stringLogger.data()); -#endif - - printf("[Status]\n"); - printf(" Returned: %s\n", result.data()); - printf(" Expected: %s\n", expect.data()); - - _nFailed++; + printStringLoggerContent(); + printf(" [Status]\n"); + printf(" ERROR 0x%08X: %s\n", unsigned(err), errorHandler._message.data()); + _numFailed++; } + } +#endif // !ASMJIT_NO_JIT - if (_dumpAsm) - printf("\n"); - - runtime.release(func); + if (!runnable) { + if (err) { + printf(" [Status]\n"); + printf(" ERROR 0x%08X: %s\n", unsigned(err), errorHandler._message.data()); + _numFailed++; + } + else { + printf("%s[COMPILE OK]\n", statusSeparator); + } } - else { - if (!_verbose) - printf(" [FAILED]\n"); #ifndef ASMJIT_NO_LOGGING - if (!_verbose) - printf("%s", stringLogger.data()); -#endif - - printf("[Status]\n"); - printf(" ERROR 0x%08X: %s\n", unsigned(err), errorHandler._message.data()); - - _nFailed++; + if (_verbose || _dumpAsm || _dumpHex) { + printf("\n"); } +#endif // !ASMJIT_NO_LOGGING } } @@ -226,13 +366,12 @@ int TestApp::run() { printf(" FinalizeTime: %.2f ms\n", finalizeTime); printf("\n"); - if (_nFailed == 0) - printf("** SUCCESS: All %u tests passed **\n", unsigned(_tests.size())); + if (_numFailed == 0) + printf("** SUCCESS: All %u tests passed **\n", _numTests); else - printf("** FAILURE: %u of %u tests failed **\n", _nFailed, unsigned(_tests.size())); + printf("** FAILURE: %u of %u tests failed **\n", _numFailed, _numTests); - return _nFailed == 0 ? 0 : 1; -#endif + return _numFailed == 0 ? 0 : 1; } int main(int argc, char* argv[]) { @@ -241,13 +380,24 @@ int main(int argc, char* argv[]) { app.handleArgs(argc, argv); app.showInfo(); -#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 +#if !defined(ASMJIT_NO_X86) compiler_add_x86_tests(app); -#endif +#endif // !ASMJIT_NO_X86 -#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64 +#if !defined(ASMJIT_NO_AARCH64) compiler_add_a64_tests(app); -#endif +#endif // !ASMJIT_NO_AARCH64 return app.run(); } + +#else + +int main(int argc, char* argv[]) { + DebugUtils::unused(argc, argv); + + printf("AsmJit Compiler Test suite is disabled when compiling with ASMJIT_NO_COMPILER\n\n"); + return 0; +} + +#endif // !ASMJIT_NO_COMPILER diff --git a/3rdparty/asmjit/test/asmjit_test_compiler.h b/3rdparty/asmjit/test/asmjit_test_compiler.h index e694b379e1151..433d47953dd55 100644 --- a/3rdparty/asmjit/test/asmjit_test_compiler.h +++ b/3rdparty/asmjit/test/asmjit_test_compiler.h @@ -29,33 +29,41 @@ class SimpleErrorHandler : public asmjit::ErrorHandler { //! A test case interface for testing AsmJit's Compiler. class TestCase { public: - TestCase(const char* name = nullptr) { + TestCase(const char* name, asmjit::Arch arch) { if (name) _name.assign(name); + _arch = arch; } virtual ~TestCase() {} inline const char* name() const { return _name.data(); } + inline asmjit::Arch arch() const { return _arch; } virtual void compile(asmjit::BaseCompiler& cc) = 0; virtual bool run(void* func, asmjit::String& result, asmjit::String& expect) = 0; asmjit::String _name; + asmjit::Arch _arch; }; class TestApp { public: std::vector> _tests; - unsigned _nFailed = 0; - size_t _outputSize = 0; - + const char* _arch = nullptr; + const char* _filter = nullptr; + bool _helpOnly = false; bool _verbose = false; bool _dumpAsm = false; bool _dumpHex = false; - TestApp() noexcept {} + unsigned _numTests = 0; + unsigned _numFailed = 0; + size_t _outputSize = 0; + + TestApp() noexcept + : _arch("all") {} ~TestApp() noexcept {} void add(TestCase* test) noexcept { @@ -67,6 +75,8 @@ class TestApp { int handleArgs(int argc, const char* const* argv); void showInfo(); + + bool shouldRun(const TestCase* tc); int run(); }; diff --git a/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp b/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp index 4fc362e723097..4d8cd5e8b2d6b 100644 --- a/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp +++ b/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp @@ -4,7 +4,7 @@ // SPDX-License-Identifier: Zlib #include -#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64 +#if !defined(ASMJIT_NO_COMPILER) && !defined(ASMJIT_NO_AARCH64) #include #include @@ -21,7 +21,7 @@ using namespace asmjit; class A64TestCase : public TestCase { public: A64TestCase(const char* name = nullptr) - : TestCase(name) {} + : TestCase(name, Arch::kAArch64) {} virtual void compile(BaseCompiler& cc) override { compile(static_cast(cc)); @@ -55,7 +55,7 @@ class A64Test_GpArgs : public A64TestCase { uint32_t i; uint32_t argCount = _argCount; - FuncSignatureBuilder signature; + FuncSignature signature; signature.setRetT(); for (i = 0; i < argCount; i++) signature.addArgT(); @@ -64,11 +64,11 @@ class A64Test_GpArgs : public A64TestCase { if (_preserveFP) funcNode->frame().setPreservedFP(); - arm::Gp sum; + a64::Gp sum; if (argCount) { for (i = 0; i < argCount; i++) { - arm::Gp iReg = cc.newInt32("i%u", i); + a64::Gp iReg = cc.newInt32("i%u", i); funcNode->setArg(i, iReg); if (i == 0) @@ -184,7 +184,7 @@ class A64Test_GpArgs : public A64TestCase { result.assignFormat("ret={%u, %u}", resultRet >> 28, resultRet & 0x0FFFFFFFu); expect.assignFormat("ret={%u, %u}", expectRet >> 28, expectRet & 0x0FFFFFFFu); - return resultRet == expectRet; + return result == expect; } }; @@ -201,24 +201,24 @@ class A64Test_Simd1 : public A64TestCase { } virtual void compile(a64::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT()); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); - arm::Gp dst = cc.newUIntPtr("dst"); - arm::Gp src1 = cc.newUIntPtr("src1"); - arm::Gp src2 = cc.newUIntPtr("src2"); + a64::Gp dst = cc.newUIntPtr("dst"); + a64::Gp src1 = cc.newUIntPtr("src1"); + a64::Gp src2 = cc.newUIntPtr("src2"); funcNode->setArg(0, dst); funcNode->setArg(1, src1); funcNode->setArg(2, src2); - arm::Vec v1 = cc.newVecQ("vec1"); - arm::Vec v2 = cc.newVecQ("vec2"); - arm::Vec v3 = cc.newVecQ("vec3"); + a64::Vec v1 = cc.newVecQ("vec1"); + a64::Vec v2 = cc.newVecQ("vec2"); + a64::Vec v3 = cc.newVecQ("vec3"); - cc.ldr(v2, arm::ptr(src1)); - cc.ldr(v3, arm::ptr(src2)); + cc.ldr(v2, a64::ptr(src1)); + cc.ldr(v3, a64::ptr(src2)); cc.add(v1.b16(), v2.b16(), v3.b16()); - cc.str(v1, arm::ptr(dst)); + cc.str(v1, a64::ptr(dst)); cc.endFunc(); } @@ -235,13 +235,10 @@ class A64Test_Simd1 : public A64TestCase { ptr_as_func(_func)(dst, aSrc, bSrc); - unsigned int resultRet = 0; - unsigned int expectRet = 0; - result.assignFormat("ret={%u, %u, %u, %u}", dst[0], dst[1], dst[2], dst[3]); expect.assignFormat("ret={%u, %u, %u, %u}", ref[0], ref[1], ref[2], ref[3]); - return resultRet == expectRet; + return result == expect; } }; @@ -264,16 +261,16 @@ class A64Test_ManyRegs : public A64TestCase { } virtual void compile(a64::Compiler& cc) { - cc.addFunc(FuncSignatureT()); + cc.addFunc(FuncSignature::build()); - arm::Gp* regs = static_cast(malloc(_regCount * sizeof(arm::Gp))); + a64::Gp* regs = static_cast(malloc(_regCount * sizeof(a64::Gp))); for (uint32_t i = 0; i < _regCount; i++) { regs[i] = cc.newUInt32("reg%u", i); cc.mov(regs[i], i + 1); } - arm::Gp sum = cc.newUInt32("sum"); + a64::Gp sum = cc.newUInt32("sum"); cc.mov(sum, 0); for (uint32_t i = 0; i < _regCount; i++) { @@ -314,15 +311,15 @@ class A64Test_Adr : public A64TestCase { } virtual void compile(a64::Compiler& cc) { - cc.addFunc(FuncSignatureT()); + cc.addFunc(FuncSignature::build()); - arm::Gp addr = cc.newIntPtr("addr"); - arm::Gp val = cc.newIntPtr("val"); + a64::Gp addr = cc.newIntPtr("addr"); + a64::Gp val = cc.newIntPtr("val"); Label L_Table = cc.newLabel(); cc.adr(addr, L_Table); - cc.ldrsw(val, arm::ptr(addr, 8)); + cc.ldrsw(val, a64::ptr(addr, 8)); cc.ret(val); cc.endFunc(); @@ -358,11 +355,11 @@ class A64Test_Branch1 : public A64TestCase { } virtual void compile(a64::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT()); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); - arm::Gp p = cc.newIntPtr("p"); - arm::Gp count = cc.newIntPtr("count"); - arm::Gp i = cc.newIntPtr("i"); + a64::Gp p = cc.newIntPtr("p"); + a64::Gp count = cc.newIntPtr("count"); + a64::Gp i = cc.newIntPtr("i"); Label L = cc.newLabel(); funcNode->setArg(0, p); @@ -413,12 +410,12 @@ class A64Test_Invoke1 : public A64TestCase { } virtual void compile(a64::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT()); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); - arm::Gp x = cc.newUInt32("x"); - arm::Gp y = cc.newUInt32("y"); - arm::Gp r = cc.newUInt32("r"); - arm::Gp fn = cc.newUIntPtr("fn"); + a64::Gp x = cc.newUInt32("x"); + a64::Gp y = cc.newUInt32("y"); + a64::Gp r = cc.newUInt32("r"); + a64::Gp fn = cc.newUIntPtr("fn"); funcNode->setArg(0, x); funcNode->setArg(1, y); @@ -426,7 +423,7 @@ class A64Test_Invoke1 : public A64TestCase { cc.mov(fn, (uint64_t)calledFunc); InvokeNode* invokeNode; - cc.invoke(&invokeNode, fn, FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, fn, FuncSignature::build()); invokeNode->setArg(0, x); invokeNode->setArg(1, y); invokeNode->setRet(0, r); @@ -466,19 +463,19 @@ class A64Test_Invoke2 : public A64TestCase { } virtual void compile(a64::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT()); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); - arm::Vec x = cc.newVecD("x"); - arm::Vec y = cc.newVecD("y"); - arm::Vec r = cc.newVecD("r"); - arm::Gp fn = cc.newUIntPtr("fn"); + a64::Vec x = cc.newVecD("x"); + a64::Vec y = cc.newVecD("y"); + a64::Vec r = cc.newVecD("r"); + a64::Gp fn = cc.newUIntPtr("fn"); funcNode->setArg(0, x); funcNode->setArg(1, y); cc.mov(fn, (uint64_t)calledFunc); InvokeNode* invokeNode; - cc.invoke(&invokeNode, fn, FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, fn, FuncSignature::build()); invokeNode->setArg(0, x); invokeNode->setArg(1, y); invokeNode->setRet(0, r); @@ -518,19 +515,19 @@ class A64Test_Invoke3 : public A64TestCase { } virtual void compile(a64::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT()); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); - arm::Vec x = cc.newVecD("x"); - arm::Vec y = cc.newVecD("y"); - arm::Vec r = cc.newVecD("r"); - arm::Gp fn = cc.newUIntPtr("fn"); + a64::Vec x = cc.newVecD("x"); + a64::Vec y = cc.newVecD("y"); + a64::Vec r = cc.newVecD("r"); + a64::Gp fn = cc.newUIntPtr("fn"); funcNode->setArg(0, x); funcNode->setArg(1, y); cc.mov(fn, (uint64_t)calledFunc); InvokeNode* invokeNode; - cc.invoke(&invokeNode, fn, FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, fn, FuncSignature::build()); invokeNode->setArg(0, y); invokeNode->setArg(1, x); invokeNode->setRet(0, r); @@ -583,14 +580,14 @@ class A64Test_JumpTable : public A64TestCase { } virtual void compile(a64::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT()); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); - arm::Vec a = cc.newVecS("a"); - arm::Vec b = cc.newVecS("b"); - arm::Gp op = cc.newUInt32("op"); + a64::Vec a = cc.newVecS("a"); + a64::Vec b = cc.newVecS("b"); + a64::Gp op = cc.newUInt32("op"); - arm::Gp target = cc.newIntPtr("target"); - arm::Gp offset = cc.newIntPtr("offset"); + a64::Gp target = cc.newIntPtr("target"); + a64::Gp offset = cc.newIntPtr("offset"); Label L_End = cc.newLabel(); @@ -605,7 +602,7 @@ class A64Test_JumpTable : public A64TestCase { funcNode->setArg(2, op); cc.adr(target, L_Table); - cc.ldrsw(offset, arm::ptr(target, op, arm::sxtw(2))); + cc.ldrsw(offset, a64::ptr(target, op, a64::sxtw(2))); cc.add(target, target, offset); // JumpAnnotation allows to annotate all possible jump targets of @@ -687,4 +684,4 @@ void compiler_add_a64_tests(TestApp& app) { app.addT(); } -#endif // !ASMJIT_NO_AARCH64 && ASMJIT_ARCH_ARM == 64 +#endif // !ASMJIT_NO_COMPILER && !ASMJIT_NO_AARCH64 diff --git a/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp b/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp index a3a067d2ea80d..54442efb91528 100644 --- a/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp +++ b/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp @@ -4,7 +4,7 @@ // SPDX-License-Identifier: Zlib #include -#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 +#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER) #include #include @@ -12,8 +12,10 @@ #include #include -// Required for function tests that pass / return XMM registers. -#include +#if ASMJIT_ARCH_X86 + // Required for function tests that pass / return XMM registers. + #include +#endif #include "asmjit_test_misc.h" #include "asmjit_test_compiler.h" @@ -31,7 +33,7 @@ using namespace asmjit; class X86TestCase : public TestCase { public: X86TestCase(const char* name = nullptr) - : TestCase(name) {} + : TestCase(name, Arch::kHost == Arch::kX86 ? Arch::kX86 : Arch::kX64) {} virtual void compile(BaseCompiler& cc) override { compile(static_cast(cc)); @@ -65,7 +67,7 @@ class X86Test_AlignBase : public X86TestCase { uint32_t i; uint32_t argCount = _argCount; - FuncSignatureBuilder signature(CallConvId::kHost); + FuncSignature signature(CallConvId::kCDecl); signature.setRetT(); for (i = 0; i < argCount; i++) signature.addArgT(); @@ -201,7 +203,7 @@ class X86Test_AlignBase : public X86TestCase { result.assignFormat("ret={%u, %u}", resultRet >> 28, resultRet & 0x0FFFFFFFu); expect.assignFormat("ret={%u, %u}", expectRet >> 28, expectRet & 0x0FFFFFFFu); - return resultRet == expectRet; + return result == expect; } uint32_t _argCount; @@ -221,7 +223,7 @@ class X86Test_NoCode : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); cc.endFunc(); } @@ -236,8 +238,8 @@ class X86Test_NoCode : public X86TestCase { } }; -// x86::Compiler - X86Test_AlignNone -// ================================= +// x86::Compiler - X86Test_NoAlign +// =============================== class X86Test_NoAlign : public X86TestCase { public: @@ -248,7 +250,7 @@ class X86Test_NoAlign : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); cc.align(AlignMode::kCode, 0); cc.align(AlignMode::kCode, 1); cc.endFunc(); @@ -265,6 +267,35 @@ class X86Test_NoAlign : public X86TestCase { } }; +// x86::Compiler - X86Test_IndirectBranchProtection +// ================================================ + +class X86Test_IndirectBranchProtection : public X86TestCase { +public: + X86Test_IndirectBranchProtection() : X86TestCase("IndirectBranchProtection") {} + + static void add(TestApp& app) { + app.add(new X86Test_IndirectBranchProtection()); + } + + virtual void compile(x86::Compiler& cc) { + FuncNode* func = cc.addFunc(FuncSignature::build()); + func->addAttributes(FuncAttributes::kIndirectBranchProtection); + cc.endFunc(); + } + + virtual bool run(void* _func, String& result, String& expect) { + DebugUtils::unused(result, expect); + + typedef void (*Func)(void); + Func func = ptr_as_func(_func); + + func(); + return true; + } +}; + + // x86::Compiler - X86Test_JumpMerge // ================================= @@ -277,7 +308,7 @@ class X86Test_JumpMerge : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - Label L0 = cc.newLabel(); + Label L0 = cc.newLabel(); Label L1 = cc.newLabel(); Label L2 = cc.newLabel(); Label LEnd = cc.newLabel(); @@ -285,7 +316,7 @@ class X86Test_JumpMerge : public X86TestCase { x86::Gp dst = cc.newIntPtr("dst"); x86::Gp val = cc.newInt32("val"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, dst); funcNode->setArg(1, val); @@ -341,7 +372,7 @@ class X86Test_JumpCross : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); Label L1 = cc.newLabel(); Label L2 = cc.newLabel(); @@ -382,7 +413,7 @@ class X86Test_JumpMany : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); for (uint32_t i = 0; i < 1000; i++) { Label L = cc.newLabel(); cc.jmp(L); @@ -406,7 +437,7 @@ class X86Test_JumpMany : public X86TestCase { result.assignFormat("ret={%d}", resultRet); expect.assignFormat("ret={%d}", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -422,7 +453,7 @@ class X86Test_JumpUnreachable1 : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); Label L_1 = cc.newLabel(); Label L_2 = cc.newLabel(); @@ -484,7 +515,7 @@ class X86Test_JumpUnreachable2 : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); Label L_1 = cc.newLabel(); Label L_2 = cc.newLabel(); @@ -557,7 +588,7 @@ class X86Test_JumpTable1 : public X86TestCase { Label L_Div = cc.newLabel(); Label L_End = cc.newLabel(); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, a); funcNode->setArg(1, b); funcNode->setArg(2, op); @@ -658,7 +689,7 @@ class X86Test_JumpTable2 : public X86TestCase { Label L_Case1 = cc.newLabel(); Label L_End = cc.newLabel(); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, value); cc.bind(L_Begin); @@ -715,6 +746,126 @@ class X86Test_JumpTable2 : public X86TestCase { } }; +// x86::Compiler - X86Test_JumpTable3 +// ================================== + +class X86Test_JumpTable3 : public X86TestCase { +public: + X86Test_JumpTable3() + : X86TestCase("JumpTable {Jumping to a single label}") {} + + static void add(TestApp& app) { + app.add(new X86Test_JumpTable3()); + } + + virtual void compile(x86::Compiler& cc) { + cc.addFunc(FuncSignature::build()); + + Label L_Target = cc.newLabel(); + x86::Gp target = cc.newUIntPtr("target"); + x86::Gp result = cc.newUInt32("result"); + + JumpAnnotation* annotation = cc.newJumpAnnotation(); + annotation->addLabel(L_Target); + + cc.lea(target, x86::ptr(L_Target)); + cc.jmp(target, annotation); + + cc.bind(L_Target); + cc.mov(result, 1234); + cc.ret(result); + cc.endFunc(); + } + + virtual bool run(void* _func, String& result, String& expect) { + typedef int (*Func)(void); + Func func = ptr_as_func(_func); + + int out = func(); + int expected = 1234; + + result.assignFormat("ret=%d", out); + expect.assignFormat("ret=%d", expected); + + return result == expect; + } +}; + +// x86::Compiler - X86Test_JumpTable4 +// ================================== + +class X86Test_JumpTable4 : public X86TestCase { +public: + X86Test_JumpTable4() + : X86TestCase("JumpTable {Jumping to a single label and multiple labels}") {} + + static void add(TestApp& app) { + app.add(new X86Test_JumpTable4()); + } + + virtual void compile(x86::Compiler& cc) { + x86::Gp result = cc.newUInt32("result"); + x86::Gp condition = cc.newUInt32("condition"); + + FuncNode* func = cc.addFunc(FuncSignature::build()); + func->setArg(0, condition); + + Label L_NonZero = cc.newLabel(); + cc.test(condition, condition); + cc.jnz(L_NonZero); + + { + JumpAnnotation* annotation = cc.newJumpAnnotation(); + Label L_Target = cc.newLabel(); + annotation->addLabel(L_Target); + + x86::Gp target = cc.newUIntPtr("target"); + cc.lea(target, x86::ptr(L_Target)); + cc.jmp(target, annotation); + cc.bind(L_Target); + cc.mov(result, 1234); + cc.ret(result); + } + + { + JumpAnnotation* annotation = cc.newJumpAnnotation(); + Label L_Target1 = cc.newLabel(); + Label L_Target2 = cc.newLabel(); + annotation->addLabel(L_Target1); + annotation->addLabel(L_Target2); + + cc.bind(L_NonZero); + x86::Gp target = cc.newUIntPtr("target"); + cc.lea(target, x86::ptr(L_Target1)); + cc.jmp(target, annotation); + + cc.bind(L_Target1); + cc.mov(result, 4321); + cc.ret(result); + + // Never executed. + cc.bind(L_Target2); + cc.mov(result, 0); + cc.ret(result); + } + + cc.endFunc(); + } + + virtual bool run(void* _func, String& result, String& expect) { + typedef int (*Func)(int); + Func func = ptr_as_func(_func); + + int results[2] = { func(0), func(1) }; + int expected[2] = { 1234, 4321 }; + + result.assignFormat("ret={%d, %d}", results[0], results[1]); + expect.assignFormat("ret={%d, %d}", expected[0], expected[1]); + + return result == expect; + } +}; + // x86::Compiler - X86Test_AllocBase // ================================= @@ -727,7 +878,7 @@ class X86Test_AllocBase : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); x86::Gp v0 = cc.newInt32("v0"); x86::Gp v1 = cc.newInt32("v1"); @@ -761,7 +912,7 @@ class X86Test_AllocBase : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -782,7 +933,7 @@ class X86Test_AllocMany1 : public X86TestCase { x86::Gp a0 = cc.newIntPtr("a0"); x86::Gp a1 = cc.newIntPtr("a1"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, a0); funcNode->setArg(1, a1); @@ -820,8 +971,8 @@ class X86Test_AllocMany1 : public X86TestCase { typedef void (*Func)(int*, int*); Func func = ptr_as_func(_func); - int resultX; - int resultY; + int resultX = 0; + int resultY = 0; int expectX = 36; int expectY = -36; @@ -850,7 +1001,7 @@ class X86Test_AllocMany2 : public X86TestCase { x86::Gp a = cc.newIntPtr("a"); x86::Gp v[32]; - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, a); for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) v[i] = cc.newInt32("v%d", i); @@ -875,8 +1026,8 @@ class X86Test_AllocMany2 : public X86TestCase { Func func = ptr_as_func(_func); uint32_t i; - uint32_t resultBuf[32]; - uint32_t expectBuf[32]; + uint32_t resultBuf[32] {}; + uint32_t expectBuf[32] {}; for (i = 0; i < ASMJIT_ARRAY_SIZE(resultBuf); i++) expectBuf[i] = i * 32; @@ -915,7 +1066,7 @@ class X86Test_AllocImul1 : public X86TestCase { x86::Gp vLo = cc.newInt32("vLo"); x86::Gp src = cc.newInt32("src"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, dstHi); funcNode->setArg(1, dstLo); funcNode->setArg(2, vLo); @@ -934,8 +1085,8 @@ class X86Test_AllocImul1 : public X86TestCase { int v0 = 4; int v1 = 4; - int resultHi; - int resultLo; + int resultHi = 0; + int resultLo = 0; int expectHi = 0; int expectLo = v0 * v1; @@ -964,7 +1115,7 @@ class X86Test_AllocImul2 : public X86TestCase { x86::Gp dst = cc.newIntPtr("dst"); x86::Gp src = cc.newIntPtr("src"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, dst); funcNode->setArg(1, src); @@ -1017,7 +1168,7 @@ class X86Test_AllocIdiv1 : public X86TestCase { x86::Gp b = cc.newInt32("b"); x86::Gp dummy = cc.newInt32("dummy"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, a); funcNode->setArg(1, b); @@ -1041,7 +1192,7 @@ class X86Test_AllocIdiv1 : public X86TestCase { result.assignFormat("result=%d", resultRet); expect.assignFormat("result=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -1061,7 +1212,7 @@ class X86Test_AllocSetz : public X86TestCase { x86::Gp src1 = cc.newInt32("src1"); x86::Gp dst0 = cc.newIntPtr("dst0"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, src0); funcNode->setArg(1, src1); funcNode->setArg(2, dst0); @@ -1076,7 +1227,7 @@ class X86Test_AllocSetz : public X86TestCase { typedef void (*Func)(int, int, char*); Func func = ptr_as_func(_func); - char resultBuf[4]; + char resultBuf[4] {}; char expectBuf[4] = { 1, 0, 0, 1 }; func(0, 0, &resultBuf[0]); // We are expecting 1 (0 == 0). @@ -1111,7 +1262,7 @@ class X86Test_AllocShlRor : public X86TestCase { x86::Gp vShlParam = cc.newInt32("vShlParam"); x86::Gp vRorParam = cc.newInt32("vRorParam"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, dst); funcNode->setArg(1, var); funcNode->setArg(2, vShlParam); @@ -1129,7 +1280,7 @@ class X86Test_AllocShlRor : public X86TestCase { int v0 = 0x000000FF; - int resultRet; + int resultRet = 0; int expectRet = 0x0000FF00; func(&resultRet, v0, 16, 8); @@ -1137,7 +1288,7 @@ class X86Test_AllocShlRor : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -1159,7 +1310,7 @@ class X86Test_AllocGpbLo1 : public X86TestCase { x86::Gp rSum = cc.newUInt32("rSum"); x86::Gp x[kCount]; - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, rPtr); for (uint32_t i = 0; i < kCount; i++) { @@ -1196,10 +1347,9 @@ class X86Test_AllocGpbLo1 : public X86TestCase { uint32_t i; uint32_t buf[kCount]; - uint32_t resultRet; - uint32_t expectRet; + uint32_t resultRet = 0; + uint32_t expectRet = 0; - expectRet = 0; for (i = 0; i < kCount; i++) { buf[i] = 1; } @@ -1223,7 +1373,7 @@ class X86Test_AllocGpbLo1 : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -1241,7 +1391,7 @@ class X86Test_AllocGpbLo2 : public X86TestCase { virtual void compile(x86::Compiler& cc) { x86::Gp v = cc.newUInt32("v"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, v); cc.mov(v.r8(), 0xFF); @@ -1259,7 +1409,7 @@ class X86Test_AllocGpbLo2 : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -1279,7 +1429,7 @@ class X86Test_AllocRepMovsb : public X86TestCase { x86::Gp src = cc.newIntPtr("src"); x86::Gp cnt = cc.newIntPtr("cnt"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, dst); funcNode->setArg(1, src); funcNode->setArg(2, cnt); @@ -1321,7 +1471,7 @@ class X86Test_AllocIfElse1 : public X86TestCase { Label L_1 = cc.newLabel(); Label L_2 = cc.newLabel(); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, v1); funcNode->setArg(1, v2); @@ -1373,7 +1523,7 @@ class X86Test_AllocIfElse2 : public X86TestCase { Label L_3 = cc.newLabel(); Label L_4 = cc.newLabel(); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, v1); funcNode->setArg(1, v2); @@ -1432,7 +1582,7 @@ class X86Test_AllocIfElse3 : public X86TestCase { Label L_Loop = cc.newLabel(); Label L_Exit = cc.newLabel(); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, v1); funcNode->setArg(1, v2); @@ -1492,7 +1642,7 @@ class X86Test_AllocIfElse4 : public X86TestCase { Label L_Loop2 = cc.newLabel(); Label L_Exit = cc.newLabel(); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, v1); funcNode->setArg(1, v2); @@ -1549,7 +1699,7 @@ class X86Test_AllocInt8 : public X86TestCase { x86::Gp x = cc.newInt8("x"); x86::Gp y = cc.newInt32("y"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, x); cc.movsx(y, x); @@ -1559,10 +1709,10 @@ class X86Test_AllocInt8 : public X86TestCase { } virtual bool run(void* _func, String& result, String& expect) { - typedef int (*Func)(char); + typedef int (*Func)(int8_t); Func func = ptr_as_func(_func); - int resultRet = func(-13); + int resultRet = func(int8_t(-13)); int expectRet = -13; result.assignFormat("ret=%d", resultRet); @@ -1586,7 +1736,7 @@ class X86Test_AllocUnhandledArg : public X86TestCase { virtual void compile(x86::Compiler& cc) { x86::Gp x = cc.newInt32("x"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(2, x); cc.ret(x); @@ -1619,7 +1769,7 @@ class X86Test_AllocArgsIntPtr : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Gp var[8]; for (uint32_t i = 0; i < 8; i++) { @@ -1675,7 +1825,7 @@ class X86Test_AllocArgsFloat : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Gp p = cc.newIntPtr("p"); x86::Xmm xv[7]; @@ -1702,7 +1852,7 @@ class X86Test_AllocArgsFloat : public X86TestCase { typedef void (*Func)(float, float, float, float, float, float, float, float*); Func func = ptr_as_func(_func); - float resultRet; + float resultRet = 0; float expectRet = 1.0f + 2.0f + 3.0f + 4.0f + 5.0f + 6.0f + 7.0f; func(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, &resultRet); @@ -1710,7 +1860,7 @@ class X86Test_AllocArgsFloat : public X86TestCase { result.assignFormat("ret={%g}", resultRet); expect.assignFormat("ret={%g}", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -1726,7 +1876,7 @@ class X86Test_AllocArgsDouble : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Gp p = cc.newIntPtr("p"); x86::Xmm xv[7]; @@ -1753,7 +1903,7 @@ class X86Test_AllocArgsDouble : public X86TestCase { typedef void (*Func)(double, double, double, double, double, double, double, double*); Func func = ptr_as_func(_func); - double resultRet; + double resultRet = 0; double expectRet = 1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0; func(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, &resultRet); @@ -1761,13 +1911,14 @@ class X86Test_AllocArgsDouble : public X86TestCase { result.assignFormat("ret={%g}", resultRet); expect.assignFormat("ret={%g}", expectRet); - return resultRet == expectRet; + return result == expect; } }; // x86::Compiler - X86Test_AllocArgsVec // ==================================== +#if ASMJIT_ARCH_X86 class X86Test_AllocArgsVec : public X86TestCase { public: X86Test_AllocArgsVec() : X86TestCase("AllocArgsVec") {} @@ -1785,7 +1936,7 @@ class X86Test_AllocArgsVec : public X86TestCase { x86::Xmm a = cc.newXmm("aXmm"); x86::Xmm b = cc.newXmm("bXmm"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, a); funcNode->setArg(1, b); @@ -1802,7 +1953,7 @@ class X86Test_AllocArgsVec : public X86TestCase { uint8_t aData[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; uint8_t bData[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; - uint8_t rData[16]; + uint8_t rData[16] {}; uint8_t eData[16] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }; __m128i aVec = _mm_loadu_si128(reinterpret_cast(aData)); @@ -1817,6 +1968,7 @@ class X86Test_AllocArgsVec : public X86TestCase { return result == expect; } }; +#endif // ASMJIT_ARCH_X86 // x86::Compiler - X86Test_AllocRetFloat1 // ====================================== @@ -1832,7 +1984,7 @@ class X86Test_AllocRetFloat1 : public X86TestCase { virtual void compile(x86::Compiler& cc) { x86::Xmm x = cc.newXmmSs("x"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, x); cc.ret(x); @@ -1849,7 +2001,7 @@ class X86Test_AllocRetFloat1 : public X86TestCase { result.assignFormat("ret={%g}", resultRet); expect.assignFormat("ret={%g}", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -1868,7 +2020,7 @@ class X86Test_AllocRetFloat2 : public X86TestCase { x86::Xmm x = cc.newXmmSs("x"); x86::Xmm y = cc.newXmmSs("y"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, x); funcNode->setArg(1, y); @@ -1888,7 +2040,7 @@ class X86Test_AllocRetFloat2 : public X86TestCase { result.assignFormat("ret={%g}", resultRet); expect.assignFormat("ret={%g}", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -1906,7 +2058,7 @@ class X86Test_AllocRetDouble1 : public X86TestCase { virtual void compile(x86::Compiler& cc) { x86::Xmm x = cc.newXmmSd("x"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, x); cc.ret(x); @@ -1923,7 +2075,7 @@ class X86Test_AllocRetDouble1 : public X86TestCase { result.assignFormat("ret={%g}", resultRet); expect.assignFormat("ret={%g}", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -1942,7 +2094,7 @@ class X86Test_AllocRetDouble2 : public X86TestCase { x86::Xmm x = cc.newXmmSd("x"); x86::Xmm y = cc.newXmmSd("y"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, x); funcNode->setArg(1, y); @@ -1962,7 +2114,7 @@ class X86Test_AllocRetDouble2 : public X86TestCase { result.assignFormat("ret={%g}", resultRet); expect.assignFormat("ret={%g}", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -1980,7 +2132,7 @@ class X86Test_AllocStack : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); x86::Mem stack = cc.newStack(kSize, 1); stack.setSize(1); @@ -2029,7 +2181,7 @@ class X86Test_AllocStack : public X86TestCase { result.assignInt(resultRet); expect.assignInt(expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -2054,7 +2206,7 @@ class X86Test_AllocMemcpy : public X86TestCase { Label L_Loop = cc.newLabel(); // Create base labels we use Label L_Exit = cc.newLabel(); // in our function. - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, dst); funcNode->setArg(1, src); funcNode->setArg(2, cnt); @@ -2131,7 +2283,7 @@ class X86Test_AllocExtraBlock : public X86TestCase { x86::Gp a = cc.newInt32("a"); x86::Gp b = cc.newInt32("b"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, cond); funcNode->setArg(1, a); funcNode->setArg(2, b); @@ -2254,6 +2406,47 @@ class X86Test_AllocAlphaBlend : public X86TestCase { } }; +// x86::Compiler - X86Test_FuncArgInt8 +// =================================== + +class X86Test_FuncArgInt8 : public X86TestCase { +public: + X86Test_FuncArgInt8() : X86TestCase("FuncArgInt8") {} + + static void add(TestApp& app) { + app.add(new X86Test_FuncArgInt8()); + } + + virtual void compile(x86::Compiler& cc) { + x86::Gp v0 = cc.newUInt32("v0"); + x86::Gp v1 = cc.newUInt32("v1"); + + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); + funcNode->setArg(0, v0); + funcNode->setArg(1, v1); + + cc.add(v0, v1); + + cc.ret(v0); + cc.endFunc(); + } + + virtual bool run(void* _func, String& result, String& expect) { + typedef uint32_t (*Func)(uint8_t, uint8_t, uint32_t); + Func func = ptr_as_func(_func); + + uint32_t arg = uint32_t(uintptr_t(_func) & 0xFFFFFFFF); + + unsigned resultRet = func(uint8_t(arg & 0xFF), uint8_t(arg & 0xFF), arg); + unsigned expectRet = (arg & 0xFF) * 2; + + result.assignFormat("ret=%u", resultRet); + expect.assignFormat("ret=%u", expectRet); + + return result == expect; + } +}; + // x86::Compiler - X86Test_FuncCallBase1 // ===================================== @@ -2270,7 +2463,7 @@ class X86Test_FuncCallBase1 : public X86TestCase { x86::Gp v1 = cc.newInt32("v1"); x86::Gp v2 = cc.newInt32("v2"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, v0); funcNode->setArg(1, v1); funcNode->setArg(2, v2); @@ -2282,7 +2475,7 @@ class X86Test_FuncCallBase1 : public X86TestCase { // Call a function. InvokeNode* invokeNode; - cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build()); invokeNode->setArg(0, v2); invokeNode->setArg(1, v1); invokeNode->setArg(2, v0); @@ -2302,7 +2495,7 @@ class X86Test_FuncCallBase1 : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } static int calledFunc(int a, int b, int c) { return (a + b) * c; } @@ -2322,7 +2515,7 @@ class X86Test_FuncCallBase2 : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); const int kTokenSize = 32; @@ -2342,19 +2535,19 @@ class X86Test_FuncCallBase2 : public X86TestCase { cc.lea(p2, s2); // Try to corrupt the stack if wrongly allocated. - cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignatureT(CallConvId::kCDecl)); + cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignature::build()); invokeNode->setArg(0, p1); invokeNode->setArg(1, imm(token)); invokeNode->setArg(2, imm(kTokenSize)); invokeNode->setRet(0, p1); - cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignatureT(CallConvId::kCDecl)); + cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignature::build()); invokeNode->setArg(0, p2); invokeNode->setArg(1, imm(token)); invokeNode->setArg(2, imm(kTokenSize)); invokeNode->setRet(0, p2); - cc.invoke(&invokeNode, imm((void*)memcmp), FuncSignatureT(CallConvId::kCDecl)); + cc.invoke(&invokeNode, imm((void*)memcmp), FuncSignature::build()); invokeNode->setArg(0, p1); invokeNode->setArg(1, p2); invokeNode->setArg(2, imm(kTokenSize)); @@ -2385,7 +2578,7 @@ class X86Test_FuncCallBase2 : public X86TestCase { result.assignInt(resultRet); expect.assignInt(expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -2405,7 +2598,7 @@ class X86Test_FuncCallStd : public X86TestCase { x86::Gp y = cc.newInt32("y"); x86::Gp z = cc.newInt32("z"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, x); funcNode->setArg(1, y); funcNode->setArg(2, z); @@ -2413,7 +2606,7 @@ class X86Test_FuncCallStd : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)calledFunc), - FuncSignatureT(CallConvId::kStdCall)); + FuncSignature::build(CallConvId::kStdCall)); invokeNode->setArg(0, x); invokeNode->setArg(1, y); invokeNode->setArg(2, z); @@ -2433,7 +2626,7 @@ class X86Test_FuncCallStd : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } // STDCALL function that is called inside the generated one. @@ -2456,16 +2649,16 @@ class X86Test_FuncCallFast : public X86TestCase { virtual void compile(x86::Compiler& cc) { x86::Gp var = cc.newInt32("var"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, var); InvokeNode* invokeNode; - cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT(CallConvId::kFastCall)); + cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build(CallConvId::kFastCall)); invokeNode->setArg(0, var); invokeNode->setRet(0, var); - cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT(CallConvId::kFastCall)); + cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build(CallConvId::kFastCall)); invokeNode->setArg(0, var); invokeNode->setRet(0, var); @@ -2483,7 +2676,7 @@ class X86Test_FuncCallFast : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } // FASTCALL function that is called inside the generated one. @@ -2495,6 +2688,7 @@ class X86Test_FuncCallFast : public X86TestCase { // x86::Compiler - X86Test_FuncCallSIMD // ==================================== +#if ASMJIT_ARCH_X86 class X86Test_FuncCallSIMD : public X86TestCase { public: bool _useVectorCall; @@ -2513,7 +2707,7 @@ class X86Test_FuncCallSIMD : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Gp resultPtr = cc.newIntPtr("resultPtr"); x86::Gp aPtr = cc.newIntPtr("aPtr"); @@ -2542,7 +2736,7 @@ class X86Test_FuncCallSIMD : public X86TestCase { cc.movdqu(bXmm, x86::ptr(bPtr)); InvokeNode* invokeNode; - cc.invoke(&invokeNode, pFn, FuncSignatureT(ccId)); + cc.invoke(&invokeNode, pFn, FuncSignature::build(ccId)); invokeNode->setArg(0, aXmm); invokeNode->setArg(1, bXmm); @@ -2560,7 +2754,7 @@ class X86Test_FuncCallSIMD : public X86TestCase { uint8_t aData[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; uint8_t bData[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; - uint8_t rData[16]; + uint8_t rData[16] {}; uint8_t eData[16] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }; func(rData, aData, bData); @@ -2581,6 +2775,7 @@ class X86Test_FuncCallSIMD : public X86TestCase { } #endif }; +#endif // ASMJIT_ARCH_X86 // x86::Compiler - X86Test_FuncCallLight // ===================================== @@ -2594,8 +2789,8 @@ class X86Test_FuncCallLight : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncSignatureT f1Sig(CallConvId::kCDecl); - FuncSignatureT f2Sig(CallConvId::kLightCall2); + FuncSignature f1Sig = FuncSignature::build(); + FuncSignature f2Sig = FuncSignature::build(CallConvId::kLightCall2); FuncNode* f1Node = cc.newFunc(f1Sig); FuncNode* f2Node = cc.newFunc(f2Sig); @@ -2668,7 +2863,7 @@ class X86Test_FuncCallLight : public X86TestCase { int16_t c[8] = { 1, 3, 9, 7, 5, 4, 2, 1 }; int16_t d[8] = { 2, 0,-6,-4,-2,-1, 1, 2 }; - int16_t o[8]; + int16_t o[8] {}; int oExp = 7 * 3; func(a, b, c, d, o); @@ -2696,7 +2891,7 @@ class X86Test_FuncCallManyArgs : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); // Prepare. x86::Gp va = cc.newInt32("va"); @@ -2725,7 +2920,7 @@ class X86Test_FuncCallManyArgs : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)calledFunc), - FuncSignatureT(CallConvId::kHost)); + FuncSignature::build()); invokeNode->setArg(0, va); invokeNode->setArg(1, vb); invokeNode->setArg(2, vc); @@ -2752,7 +2947,7 @@ class X86Test_FuncCallManyArgs : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -2772,7 +2967,7 @@ class X86Test_FuncCallDuplicateArgs : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); // Prepare. x86::Gp a = cc.newInt32("a"); @@ -2782,7 +2977,7 @@ class X86Test_FuncCallDuplicateArgs : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)calledFunc), - FuncSignatureT(CallConvId::kHost)); + FuncSignature::build()); invokeNode->setArg(0, a); invokeNode->setArg(1, a); invokeNode->setArg(2, a); @@ -2809,7 +3004,7 @@ class X86Test_FuncCallDuplicateArgs : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -2825,7 +3020,7 @@ class X86Test_FuncCallImmArgs : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); // Prepare. x86::Gp rv = cc.newInt32("rv"); @@ -2834,7 +3029,7 @@ class X86Test_FuncCallImmArgs : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)X86Test_FuncCallManyArgs::calledFunc), - FuncSignatureT(CallConvId::kHost)); + FuncSignature::build()); invokeNode->setArg(0, imm(0x03)); invokeNode->setArg(1, imm(0x12)); @@ -2862,7 +3057,7 @@ class X86Test_FuncCallImmArgs : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -2891,7 +3086,7 @@ class X86Test_FuncCallPtrArgs : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); // Prepare. x86::Gp rv = cc.newInt32("rv"); @@ -2900,7 +3095,7 @@ class X86Test_FuncCallPtrArgs : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)calledFunc), - FuncSignatureT(CallConvId::kHost)); + FuncSignature::build()); invokeNode->setArg(0, imm(0x01)); invokeNode->setArg(1, imm(0x02)); @@ -2928,7 +3123,7 @@ class X86Test_FuncCallPtrArgs : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -2952,7 +3147,7 @@ class X86Test_FuncCallRefArgs : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); // Prepare. x86::Gp arg1 = cc.newInt32(); @@ -2970,7 +3165,7 @@ class X86Test_FuncCallRefArgs : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)calledFunc), - FuncSignatureT(CallConvId::kHost)); + FuncSignature::build()); invokeNode->setArg(0, arg1); invokeNode->setArg(1, arg2); @@ -2994,7 +3189,7 @@ class X86Test_FuncCallRefArgs : public X86TestCase { result.assignFormat("ret={%08X %08X %08X %08X %08X}", resultRet, inputs[0], inputs[1], inputs[2], inputs[3]); expect.assignFormat("ret={%08X %08X %08X %08X %08X}", expectRet, outputs[0], outputs[1], outputs[2], outputs[3]); - return resultRet == expectRet; + return result == expect; } }; @@ -3014,7 +3209,7 @@ class X86Test_FuncCallFloatAsXmmRet : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Xmm a = cc.newXmmSs("a"); x86::Xmm b = cc.newXmmSs("b"); @@ -3025,7 +3220,7 @@ class X86Test_FuncCallFloatAsXmmRet : public X86TestCase { // Call function. InvokeNode* invokeNode; - cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build()); invokeNode->setArg(0, a); invokeNode->setArg(1, b); invokeNode->setRet(0, ret); @@ -3044,7 +3239,7 @@ class X86Test_FuncCallFloatAsXmmRet : public X86TestCase { result.assignFormat("ret=%g", resultRet); expect.assignFormat("ret=%g", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -3064,7 +3259,7 @@ class X86Test_FuncCallDoubleAsXmmRet : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Xmm a = cc.newXmmSd("a"); x86::Xmm b = cc.newXmmSd("b"); @@ -3074,7 +3269,7 @@ class X86Test_FuncCallDoubleAsXmmRet : public X86TestCase { funcNode->setArg(1, b); InvokeNode* invokeNode; - cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build()); invokeNode->setArg(0, a); invokeNode->setArg(1, b); invokeNode->setRet(0, ret); @@ -3093,7 +3288,7 @@ class X86Test_FuncCallDoubleAsXmmRet : public X86TestCase { result.assignFormat("ret=%g", resultRet); expect.assignFormat("ret=%g", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -3116,7 +3311,7 @@ class X86Test_FuncCallConditional : public X86TestCase { InvokeNode* invokeNode; x86::Gp result; - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, x); funcNode->setArg(1, y); funcNode->setArg(2, op); @@ -3136,7 +3331,7 @@ class X86Test_FuncCallConditional : public X86TestCase { cc.bind(opAdd); result = cc.newInt32("result_1"); - cc.invoke(&invokeNode, (uint64_t)calledFuncAdd, FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, (uint64_t)calledFuncAdd, FuncSignature::build()); invokeNode->setArg(0, x); invokeNode->setArg(1, y); invokeNode->setRet(0, result); @@ -3145,7 +3340,7 @@ class X86Test_FuncCallConditional : public X86TestCase { cc.bind(opMul); result = cc.newInt32("result_2"); - cc.invoke(&invokeNode, (uint64_t)calledFuncMul, FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, (uint64_t)calledFuncMul, FuncSignature::build()); invokeNode->setArg(0, x); invokeNode->setArg(1, y); invokeNode->setRet(0, result); @@ -3199,7 +3394,7 @@ class X86Test_FuncCallMultiple : public X86TestCase { x86::Gp acc0 = cc.newInt32("acc0"); x86::Gp acc1 = cc.newInt32("acc1"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, buf); cc.mov(acc0, 0); @@ -3214,7 +3409,7 @@ class X86Test_FuncCallMultiple : public X86TestCase { cc.mov(ptr, buf); cc.mov(idx, int(i)); - cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignatureT(CallConvId::kFastCall)); + cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignature::build(CallConvId::kFastCall)); invokeNode->setArg(0, ptr); invokeNode->setArg(1, idx); invokeNode->setRet(0, ret); @@ -3224,7 +3419,7 @@ class X86Test_FuncCallMultiple : public X86TestCase { cc.mov(ptr, buf); cc.mov(idx, int(i)); - cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignatureT(CallConvId::kFastCall)); + cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignature::build(CallConvId::kFastCall)); invokeNode->setArg(0, ptr); invokeNode->setArg(1, idx); invokeNode->setRet(0, ret); @@ -3249,7 +3444,7 @@ class X86Test_FuncCallMultiple : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -3268,7 +3463,7 @@ class X86Test_FuncCallRecursive : public X86TestCase { x86::Gp val = cc.newInt32("val"); Label skip = cc.newLabel(); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, val); cc.cmp(val, 1); @@ -3280,7 +3475,7 @@ class X86Test_FuncCallRecursive : public X86TestCase { InvokeNode* invokeNode; - cc.invoke(&invokeNode, funcNode->label(), FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, funcNode->label(), FuncSignature::build()); invokeNode->setArg(0, tmp); invokeNode->setRet(0, tmp); cc.mul(cc.newInt32(), val, tmp); @@ -3300,7 +3495,7 @@ class X86Test_FuncCallRecursive : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -3316,7 +3511,7 @@ class X86Test_FuncCallVarArg1 : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Gp a0 = cc.newInt32("a0"); x86::Gp a1 = cc.newInt32("a1"); @@ -3334,7 +3529,7 @@ class X86Test_FuncCallVarArg1 : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)calledFunc), - FuncSignatureT(CallConvId::kHost, 1)); + FuncSignature::build(CallConvId::kCDecl, 1)); invokeNode->setArg(0, imm(4)); invokeNode->setArg(1, a0); invokeNode->setArg(2, a1); @@ -3356,7 +3551,7 @@ class X86Test_FuncCallVarArg1 : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } static int calledFunc(size_t n, ...) { @@ -3384,7 +3579,7 @@ class X86Test_FuncCallVarArg2 : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Xmm a0 = cc.newXmmSd("a0"); x86::Xmm a1 = cc.newXmmSd("a1"); @@ -3402,7 +3597,7 @@ class X86Test_FuncCallVarArg2 : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)calledFunc), - FuncSignatureT(CallConvId::kHost, 1)); + FuncSignature::build(CallConvId::kCDecl, 1)); invokeNode->setArg(0, imm(4)); invokeNode->setArg(1, a0); invokeNode->setArg(2, a1); @@ -3424,7 +3619,7 @@ class X86Test_FuncCallVarArg2 : public X86TestCase { result.assignFormat("ret=%f", resultRet); expect.assignFormat("ret=%f", expectRet); - return resultRet == expectRet; + return result == expect; } static double calledFunc(size_t n, ...) { @@ -3452,7 +3647,7 @@ class X86Test_FuncCallInt64Arg : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); if (cc.is64Bit()) { x86::Gp reg = cc.newUInt64(); @@ -3485,7 +3680,7 @@ class X86Test_FuncCallInt64Arg : public X86TestCase { result.assignFormat("ret=%llu", (unsigned long long)resultRet); expect.assignFormat("ret=%llu", (unsigned long long)expectRet); - return resultRet == expectRet; + return result == expect; } static double calledFunc(size_t n, ...) { @@ -3515,7 +3710,7 @@ class X86Test_FuncCallMisc1 : public X86TestCase { static void dummy(int, int) {} virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Gp a = cc.newInt32("a"); x86::Gp b = cc.newInt32("b"); @@ -3527,7 +3722,7 @@ class X86Test_FuncCallMisc1 : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)dummy), - FuncSignatureT(CallConvId::kHost)); + FuncSignature::build()); invokeNode->setArg(0, a); invokeNode->setArg(1, b); @@ -3547,7 +3742,7 @@ class X86Test_FuncCallMisc1 : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -3563,7 +3758,7 @@ class X86Test_FuncCallMisc2 : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Gp p = cc.newIntPtr("p"); x86::Xmm arg = cc.newXmmSd("arg"); @@ -3575,7 +3770,7 @@ class X86Test_FuncCallMisc2 : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)op), - FuncSignatureT(CallConvId::kHost)); + FuncSignature::build()); invokeNode->setArg(0, arg); invokeNode->setRet(0, ret); @@ -3595,7 +3790,7 @@ class X86Test_FuncCallMisc2 : public X86TestCase { result.assignFormat("ret=%g", resultRet); expect.assignFormat("ret=%g", expectRet); - return resultRet == expectRet; + return result == expect; } static double op(double a) { return a * a; } @@ -3613,7 +3808,7 @@ class X86Test_FuncCallMisc3 : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Gp p = cc.newIntPtr("p"); x86::Xmm arg = cc.newXmmSd("arg"); @@ -3625,7 +3820,7 @@ class X86Test_FuncCallMisc3 : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, imm((void*)op), - FuncSignatureT(CallConvId::kHost)); + FuncSignature::build()); invokeNode->setArg(0, arg); invokeNode->setRet(0, ret); @@ -3648,7 +3843,7 @@ class X86Test_FuncCallMisc3 : public X86TestCase { result.assignFormat("ret=%g", resultRet); expect.assignFormat("ret=%g", expectRet); - return resultRet == expectRet; + return result == expect; } static double op(double a) { return a * a; } @@ -3668,13 +3863,13 @@ class X86Test_FuncCallMisc4 : public X86TestCase { virtual void compile(x86::Compiler& cc) { InvokeNode* invokeNode; - FuncSignatureBuilder funcSignature; - funcSignature.setCallConvId(CallConvId::kHost); + FuncSignature funcSignature; + funcSignature.setCallConvId(CallConvId::kCDecl); funcSignature.setRet(TypeId::kFloat64); cc.addFunc(funcSignature); - FuncSignatureBuilder invokeSignature; - invokeSignature.setCallConvId(CallConvId::kHost); + FuncSignature invokeSignature; + invokeSignature.setCallConvId(CallConvId::kCDecl); invokeSignature.setRet(TypeId::kFloat64); cc.invoke(&invokeNode, imm((void*)calledFunc), invokeSignature); @@ -3695,7 +3890,7 @@ class X86Test_FuncCallMisc4 : public X86TestCase { result.assignFormat("ret=%g", resultRet); expect.assignFormat("ret=%g", expectRet); - return resultRet == expectRet; + return result == expect; } static double calledFunc() { return 3.14; } @@ -3714,7 +3909,7 @@ class X86Test_FuncCallMisc5 : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); x86::Gp pFn = cc.newIntPtr("pFn"); x86::Gp vars[16]; @@ -3733,7 +3928,7 @@ class X86Test_FuncCallMisc5 : public X86TestCase { } InvokeNode* invokeNode; - cc.invoke(&invokeNode, pFn, FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, pFn, FuncSignature::build()); for (i = 1; i < regCount; i++) if (vars[i].isValid()) @@ -3753,7 +3948,7 @@ class X86Test_FuncCallMisc5 : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } static void calledFunc() {} @@ -3771,7 +3966,7 @@ class X86Test_FuncCallMisc6 : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); constexpr uint32_t kCount = 16; @@ -3787,7 +3982,7 @@ class X86Test_FuncCallMisc6 : public X86TestCase { v[i] = cc.newUInt32("v%u", i); InvokeNode* invokeNode; - cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build()); invokeNode->setArg(0, argVal); invokeNode->setRet(0, retVal); @@ -3813,7 +4008,7 @@ class X86Test_FuncCallMisc6 : public X86TestCase { result.assignFormat("ret=%u", resultRet); expect.assignFormat("ret=%u", expectRet); - return resultRet == expectRet; + return result == expect; } static uint32_t calledFunc(uint32_t x) { return x + 1; } @@ -3834,12 +4029,12 @@ class X86Test_FuncCallAVXClobber : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* mainFunc = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* mainFunc = cc.addFunc(FuncSignature::build()); mainFunc->frame().setAvxEnabled(); mainFunc->frame().setAvxCleanup(); // We need a Windows calling convention to test this properly also on a non-Windows machine. - FuncNode* helperFunc = cc.newFunc(FuncSignatureT(CallConvId::kX64Windows)); + FuncNode* helperFunc = cc.newFunc(FuncSignature::build(CallConvId::kX64Windows)); helperFunc->frame().setAvxEnabled(); helperFunc->frame().setAvxCleanup(); @@ -3866,7 +4061,7 @@ class X86Test_FuncCallAVXClobber : public X86TestCase { InvokeNode* invokeNode; cc.invoke(&invokeNode, helperFunc->label(), - FuncSignatureT(CallConvId::kX64Windows)); + FuncSignature::build(CallConvId::kX64Windows)); invokeNode->setArg(0, tPtr); invokeNode->setArg(1, bPtr); @@ -3911,8 +4106,8 @@ class X86Test_FuncCallAVXClobber : public X86TestCase { static const uint32_t aData[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; static const uint32_t bData[8] = { 6, 3, 5, 9, 1, 8, 7, 2 }; - uint32_t resultData[8]; - uint32_t expectData[8]; + uint32_t resultData[8] {}; + uint32_t expectData[8] {}; for (i = 0; i < 8; i++) expectData[i] = aData[i] * 8 + bData[i] + 1; @@ -3949,7 +4144,7 @@ class X86Test_MiscLocalConstPool : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); x86::Gp v0 = cc.newInt32("v0"); x86::Gp v1 = cc.newInt32("v1"); @@ -3975,7 +4170,7 @@ class X86Test_MiscLocalConstPool : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -3991,7 +4186,7 @@ class X86Test_MiscGlobalConstPool : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); x86::Gp v0 = cc.newInt32("v0"); x86::Gp v1 = cc.newInt32("v1"); @@ -4017,7 +4212,7 @@ class X86Test_MiscGlobalConstPool : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return resultRet == expectRet; + return result == expect; } }; @@ -4032,7 +4227,7 @@ struct X86Test_MiscMultiRet : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); x86::Gp op = cc.newInt32("op"); x86::Gp a = cc.newInt32("a"); @@ -4108,7 +4303,7 @@ struct X86Test_MiscMultiRet : public X86TestCase { result.assignFormat("ret={%d %d %d %d}", r0, r1, r2, r3); expect.assignFormat("ret={%d %d %d %d}", e0, e1, e2, e3); - return result.eq(expect); + return result == expect; } }; @@ -4124,8 +4319,8 @@ class X86Test_MiscMultiFunc : public X86TestCase { } virtual void compile(x86::Compiler& cc) { - FuncNode* f1Node = cc.newFunc(FuncSignatureT(CallConvId::kHost)); - FuncNode* f2Node = cc.newFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* f1Node = cc.newFunc(FuncSignature::build()); + FuncNode* f2Node = cc.newFunc(FuncSignature::build()); { x86::Gp a = cc.newInt32("a"); @@ -4136,7 +4331,7 @@ class X86Test_MiscMultiFunc : public X86TestCase { f1Node->setArg(1, b); InvokeNode* invokeNode; - cc.invoke(&invokeNode, f2Node->label(), FuncSignatureT(CallConvId::kHost)); + cc.invoke(&invokeNode, f2Node->label(), FuncSignature::build()); invokeNode->setArg(0, a); invokeNode->setArg(1, b); invokeNode->setRet(0, a); @@ -4170,7 +4365,7 @@ class X86Test_MiscMultiFunc : public X86TestCase { result.assignFormat("ret=%d", resultRet); expect.assignFormat("ret=%d", expectRet); - return result.eq(expect); + return result == expect; } }; @@ -4195,7 +4390,7 @@ class X86Test_MiscUnfollow : public X86TestCase { x86::Gp b = cc.newIntPtr("b"); Label tramp = cc.newLabel(); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kFastCall)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build(CallConvId::kFastCall)); funcNode->setArg(0, a); funcNode->setArg(1, b); @@ -4223,7 +4418,7 @@ class X86Test_MiscUnfollow : public X86TestCase { result.assignFormat("ret={%d}", resultRet); expect.assignFormat("ret={%d}", expectRet); - return resultRet == expectRet; + return result == expect; } static void ASMJIT_FASTCALL handler() { longjmp(globalJmpBuf, 1); } @@ -4236,6 +4431,7 @@ void compiler_add_x86_tests(TestApp& app) { // Base tests. app.addT(); app.addT(); + app.addT(); app.addT(); // Jump tests. @@ -4246,6 +4442,8 @@ void compiler_add_x86_tests(TestApp& app) { app.addT(); app.addT(); app.addT(); + app.addT(); + app.addT(); // Alloc tests. app.addT(); @@ -4268,7 +4466,9 @@ void compiler_add_x86_tests(TestApp& app) { app.addT(); app.addT(); app.addT(); +#if ASMJIT_ARCH_X86 app.addT(); +#endif app.addT(); app.addT(); app.addT(); @@ -4278,12 +4478,17 @@ void compiler_add_x86_tests(TestApp& app) { app.addT(); app.addT(); + // Function arguments handling tests. + app.addT(); + // Function call tests. app.addT(); app.addT(); app.addT(); app.addT(); +#if ASMJIT_ARCH_X86 app.addT(); +#endif app.addT(); app.addT(); app.addT(); @@ -4314,4 +4519,4 @@ void compiler_add_x86_tests(TestApp& app) { app.addT(); } -#endif // !ASMJIT_NO_X86 && ASMJIT_ARCH_X86 +#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER diff --git a/3rdparty/asmjit/test/asmjit_test_emitters.cpp b/3rdparty/asmjit/test/asmjit_test_emitters.cpp index 63c14a6c2e2ee..47fcaff39d56a 100644 --- a/3rdparty/asmjit/test/asmjit_test_emitters.cpp +++ b/3rdparty/asmjit/test/asmjit_test_emitters.cpp @@ -5,8 +5,24 @@ #include -#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 +static void printInfo() noexcept { + printf("AsmJit Emitters Test-Suite v%u.%u.%u\n", + unsigned((ASMJIT_LIBRARY_VERSION >> 16) ), + unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF), + unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF)); +} + +#if !defined(ASMJIT_NO_JIT) && ( \ + (ASMJIT_ARCH_X86 != 0 && !defined(ASMJIT_NO_X86 )) || \ + (ASMJIT_ARCH_ARM == 64 && !defined(ASMJIT_NO_AARCH64)) ) + +#if ASMJIT_ARCH_X86 != 0 #include +#endif + +#if ASMJIT_ARCH_ARM == 64 +#include +#endif #include #include @@ -17,9 +33,13 @@ using namespace asmjit; // Signature of the generated function. typedef void (*SumIntsFunc)(int* dst, const int* a, const int* b); +// X86 Backend +// ----------- + +#if ASMJIT_ARCH_X86 != 0 // This function works with both x86::Assembler and x86::Builder. It shows how // `x86::Emitter` can be used to make your code more generic. -static void makeRawFunc(x86::Emitter* emitter) noexcept { +static void generateFuncWithEmitter(x86::Emitter* emitter) noexcept { // Decide which registers will be mapped to function arguments. Try changing // registers of `dst`, `src_a`, and `src_b` and see what happens in function's // prolog and epilog. @@ -34,13 +54,13 @@ static void makeRawFunc(x86::Emitter* emitter) noexcept { // Create and initialize `FuncDetail` and `FuncFrame`. FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), emitter->environment()); + func.init(FuncSignature::build(), emitter->environment()); FuncFrame frame; frame.init(func); - // Make XMM0 and XMM1 dirty. VEC group includes XMM|YMM|ZMM registers. - frame.addDirtyRegs(x86::xmm0, x86::xmm1); + // Make or registers dirty. + frame.addDirtyRegs(vec0, vec1); FuncArgsAssignment args(&func); // Create arguments assignment context. args.assignAll(dst, src_a, src_b); // Assign our registers to arguments. @@ -63,14 +83,14 @@ static void makeRawFunc(x86::Emitter* emitter) noexcept { #ifndef ASMJIT_NO_COMPILER // This function works with x86::Compiler, provided for comparison. -static void makeCompiledFunc(x86::Compiler* cc) noexcept { +static void generateFuncWithCompiler(x86::Compiler* cc) noexcept { x86::Gp dst = cc->newIntPtr("dst"); x86::Gp src_a = cc->newIntPtr("src_a"); x86::Gp src_b = cc->newIntPtr("src_b"); x86::Xmm vec0 = cc->newXmm("vec0"); x86::Xmm vec1 = cc->newXmm("vec1"); - FuncNode* funcNode = cc->addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc->addFunc(FuncSignature::build()); funcNode->setArg(0, dst); funcNode->setArg(1, src_a); funcNode->setArg(2, src_b); @@ -83,44 +103,22 @@ static void makeCompiledFunc(x86::Compiler* cc) noexcept { } #endif -static uint32_t testFunc(JitRuntime& rt, EmitterType emitterType) noexcept { -#ifndef ASMJIT_NO_LOGGING - FileLogger logger(stdout); - logger.setIndentation(FormatIndentationGroup::kCode, 2); -#endif - - CodeHolder code; - code.init(rt.environment()); - -#ifndef ASMJIT_NO_LOGGING - code.setLogger(&logger); -#endif - - Error err = kErrorOk; +static Error generateFunc(CodeHolder& code, EmitterType emitterType) noexcept { switch (emitterType) { - case EmitterType::kNone: { - break; - } - case EmitterType::kAssembler: { printf("Using x86::Assembler:\n"); x86::Assembler a(&code); - makeRawFunc(a.as()); - break; + generateFuncWithEmitter(a.as()); + return kErrorOk; } #ifndef ASMJIT_NO_BUILDER case EmitterType::kBuilder: { printf("Using x86::Builder:\n"); x86::Builder cb(&code); - makeRawFunc(cb.as()); - - err = cb.finalize(); - if (err) { - printf("** FAILURE: x86::Builder::finalize() failed (%s) **\n", DebugUtils::errorAsString(err)); - return 1; - } - break; + generateFuncWithEmitter(cb.as()); + + return cb.finalize(); } #endif @@ -128,16 +126,148 @@ static uint32_t testFunc(JitRuntime& rt, EmitterType emitterType) noexcept { case EmitterType::kCompiler: { printf("Using x86::Compiler:\n"); x86::Compiler cc(&code); - makeCompiledFunc(&cc); - - err = cc.finalize(); - if (err) { - printf("** FAILURE: x86::Compiler::finalize() failed (%s) **\n", DebugUtils::errorAsString(err)); - return 1; - } - break; + generateFuncWithCompiler(&cc); + + return cc.finalize(); } #endif + + default: { + printf("** FAILURE: No emitter to use **\n"); + exit(1); + } + } +} +#endif + +// AArch64 Backend +// --------------- + +#if ASMJIT_ARCH_ARM == 64 +// This function works with both a64::Assembler and a64::Builder. It shows how +// `a64::Emitter` can be used to make your code more generic. +static void generateFuncWithEmitter(a64::Emitter* emitter) noexcept { + // Decide which registers will be mapped to function arguments. Try changing + // registers of `dst`, `src_a`, and `src_b` and see what happens in function's + // prolog and epilog. + a64::Gp dst = a64::x0; + a64::Gp src_a = a64::x1; + a64::Gp src_b = a64::x2; + + // Decide which vector registers to use. We use these to keep the code generic, + // you can switch to any other registers when needed. + a64::Vec vec0 = a64::v0; + a64::Vec vec1 = a64::v1; + a64::Vec vec2 = a64::v2; + + // Create and initialize `FuncDetail` and `FuncFrame`. + FuncDetail func; + func.init(FuncSignature::build(), emitter->environment()); + + FuncFrame frame; + frame.init(func); + + // Make XMM0 and XMM1 dirty. VEC group includes XMM|YMM|ZMM registers. + frame.addDirtyRegs(vec0, vec1, vec2); + + FuncArgsAssignment args(&func); // Create arguments assignment context. + args.assignAll(dst, src_a, src_b); // Assign our registers to arguments. + args.updateFuncFrame(frame); // Reflect our args in FuncFrame. + frame.finalize(); + + // Emit prolog and allocate arguments to registers. + emitter->emitProlog(frame); + emitter->emitArgsAssignment(frame, args); + + emitter->ld1(vec0.b16(), a64::ptr(src_a)); // Load 4 ints from [src_a] to vec0. + emitter->ld1(vec1.b16(), a64::ptr(src_b)); // Load 4 ints from [src_b] to vec1. + emitter->add(vec2.s4(), vec0.s4(), vec1.s4()); // Add 4 ints of vec0 and vec1 and store to vec2. + emitter->st1(vec2.b16(), a64::ptr(dst)); // Store the result (vec2) to [dst]. + + // Emit epilog and return. + emitter->emitEpilog(frame); +} + +#ifndef ASMJIT_NO_COMPILER +// This function works with x86::Compiler, provided for comparison. +static void generateFuncWithCompiler(a64::Compiler* cc) noexcept { + a64::Gp dst = cc->newIntPtr("dst"); + a64::Gp src_a = cc->newIntPtr("src_a"); + a64::Gp src_b = cc->newIntPtr("src_b"); + a64::Vec vec0 = cc->newVecQ("vec0"); + a64::Vec vec1 = cc->newVecQ("vec1"); + a64::Vec vec2 = cc->newVecQ("vec2"); + + FuncNode* funcNode = cc->addFunc(FuncSignature::build()); + funcNode->setArg(0, dst); + funcNode->setArg(1, src_a); + funcNode->setArg(2, src_b); + + cc->ld1(vec0.b16(), a64::ptr(src_a)); // Load 4 ints from [src_a] to vec0. + cc->ld1(vec1.b16(), a64::ptr(src_b)); // Load 4 ints from [src_b] to vec1. + cc->add(vec2.s4(), vec0.s4(), vec1.s4()); // Add 4 ints of vec0 and vec1 and store to vec2. + cc->st1(vec2.b16(), a64::ptr(dst)); // Store the result (vec2) to [dst]. + cc->endFunc(); +} +#endif + +static Error generateFunc(CodeHolder& code, EmitterType emitterType) noexcept { + switch (emitterType) { + case EmitterType::kAssembler: { + printf("Using a64::Assembler:\n"); + a64::Assembler a(&code); + generateFuncWithEmitter(a.as()); + return kErrorOk; + } + +#ifndef ASMJIT_NO_BUILDER + case EmitterType::kBuilder: { + printf("Using a64::Builder:\n"); + a64::Builder cb(&code); + generateFuncWithEmitter(cb.as()); + + return cb.finalize(); + } +#endif + +#ifndef ASMJIT_NO_COMPILER + case EmitterType::kCompiler: { + printf("Using a64::Compiler:\n"); + a64::Compiler cc(&code); + generateFuncWithCompiler(&cc); + + return cc.finalize(); + } +#endif + + default: { + printf("** FAILURE: No emitter to use **\n"); + exit(1); + } + } +} +#endif + +// Testing +// ------- + +static uint32_t testFunc(JitRuntime& rt, EmitterType emitterType) noexcept { +#ifndef ASMJIT_NO_LOGGING + FileLogger logger(stdout); + logger.setIndentation(FormatIndentationGroup::kCode, 2); +#endif + + CodeHolder code; + code.init(rt.environment(), rt.cpuFeatures()); + +#ifndef ASMJIT_NO_LOGGING + code.setLogger(&logger); +#endif + + Error err = generateFunc(code, emitterType); + if (err) { + printf("** FAILURE: Failed to generate a function: %s **\n", DebugUtils::errorAsString(err)); + return 1; } // Add the code generated to the runtime. @@ -145,41 +275,38 @@ static uint32_t testFunc(JitRuntime& rt, EmitterType emitterType) noexcept { err = rt.add(&fn, &code); if (err) { - printf("** FAILURE: JitRuntime::add() failed (%s) **\n", DebugUtils::errorAsString(err)); + printf("** FAILURE: JitRuntime::add() failed: %s **\n", DebugUtils::errorAsString(err)); return 1; } // Execute the generated function. - int inA[4] = { 4, 3, 2, 1 }; - int inB[4] = { 1, 5, 2, 8 }; - int out[4]; + static const int inA[4] = { 4, 3, 2, 1 }; + static const int inB[4] = { 1, 5, 2, 8 }; + int out[4] {}; fn(out, inA, inB); // Should print {5 8 4 9}. printf("Result = { %d %d %d %d }\n\n", out[0], out[1], out[2], out[3]); rt.release(fn); - return !(out[0] == 5 && out[1] == 8 && out[2] == 4 && out[3] == 9); + return out[0] == 5 && out[1] == 8 && out[2] == 4 && out[3] == 9; } int main() { - printf("AsmJit Emitters Test-Suite v%u.%u.%u\n", - unsigned((ASMJIT_LIBRARY_VERSION >> 16) ), - unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF), - unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF)); + printInfo(); printf("\n"); JitRuntime rt; unsigned nFailed = 0; - nFailed += testFunc(rt, EmitterType::kAssembler); + nFailed += !testFunc(rt, EmitterType::kAssembler); #ifndef ASMJIT_NO_BUILDER - nFailed += testFunc(rt, EmitterType::kBuilder); + nFailed += !testFunc(rt, EmitterType::kBuilder); #endif #ifndef ASMJIT_NO_COMPILER - nFailed += testFunc(rt, EmitterType::kCompiler); + nFailed += !testFunc(rt, EmitterType::kCompiler); #endif if (!nFailed) @@ -191,7 +318,8 @@ int main() { } #else int main() { - printf("AsmJit X86 Emitter Test is disabled on non-x86 host\n\n"); + printInfo(); + printf("\nThis test is currently disabled - no JIT or no support for the target architecture\n"); return 0; } -#endif // !ASMJIT_NO_X86 && ASMJIT_ARCH_X86 +#endif // ASMJIT_ARCH_X86 && !ASMJIT_NO_X86 && !ASMJIT_NO_JIT diff --git a/3rdparty/asmjit/test/asmjit_test_execute.cpp b/3rdparty/asmjit/test/asmjit_test_execute.cpp new file mode 100644 index 0000000000000..ce002dc5a6b87 --- /dev/null +++ b/3rdparty/asmjit/test/asmjit_test_execute.cpp @@ -0,0 +1,103 @@ +// This file is part of AsmJit project +// +// See asmjit.h or LICENSE.md for license and copyright information +// SPDX-License-Identifier: Zlib + +#include + +static void printInfo() noexcept { + printf("AsmJit Execute Test-Suite v%u.%u.%u\n", + unsigned((ASMJIT_LIBRARY_VERSION >> 16) ), + unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF), + unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF)); +} + +#if !defined(ASMJIT_NO_JIT) && ( \ + (ASMJIT_ARCH_X86 != 0 && !defined(ASMJIT_NO_X86 )) || \ + (ASMJIT_ARCH_ARM == 64 && !defined(ASMJIT_NO_AARCH64)) ) + +#if ASMJIT_ARCH_X86 != 0 +#include +#endif + +#if ASMJIT_ARCH_ARM == 64 +#include +#endif + +#include +#include +#include + +using namespace asmjit; + +// Signature of the generated function. +typedef void (*EmptyFunc)(void); + +// Generate Empty Function +// ----------------------- + +#if ASMJIT_ARCH_X86 != 0 +static void generateEmptyFunc(CodeHolder& code) noexcept { + x86::Assembler a(&code); + a.ret(); +} +#endif + +#if ASMJIT_ARCH_ARM == 64 +static void generateEmptyFunc(CodeHolder& code) noexcept { + a64::Assembler a(&code); + a.ret(a64::x30); +} +#endif + +// Testing +// ------- + +static void executeEmptyFunc(JitRuntime& rt) noexcept { + CodeHolder code; + code.init(rt.environment(), rt.cpuFeatures()); + + EmptyFunc fn; + + generateEmptyFunc(code); + Error err = rt.add(&fn, &code); + + if (err) { + printf("** FAILURE: JitRuntime::add() failed: %s **\n", DebugUtils::errorAsString(err)); + exit(1); + } + + fn(); + + rt.release(&fn); +} + +int main() { + printInfo(); + printf("\n"); + + { + printf("Trying to execute empty function with JitRuntime (default settings)\n"); + JitRuntime rt; + executeEmptyFunc(rt); + } + + if (VirtMem::hardenedRuntimeInfo().hasFlag(VirtMem::HardenedRuntimeFlags::kDualMapping)) { + printf("Trying to execute empty function with JitRuntime (dual-mapped)\n"); + JitAllocator::CreateParams params {}; + params.options |= JitAllocatorOptions::kUseDualMapping; + JitRuntime rt; + executeEmptyFunc(rt); + } + + // If we are here we were successful, otherwise the process would crash. + printf("** SUCCESS **\n"); + return 0; +} +#else +int main() { + printInfo(); + printf("\nThis test is currently disabled - no JIT or no support for the target architecture\n"); + return 0; +} +#endif // ASMJIT_ARCH_X86 && !ASMJIT_NO_X86 && !ASMJIT_NO_JIT diff --git a/3rdparty/asmjit/test/asmjit_test_instinfo.cpp b/3rdparty/asmjit/test/asmjit_test_instinfo.cpp index 3d51edcab1418..466d8a55951db 100644 --- a/3rdparty/asmjit/test/asmjit_test_instinfo.cpp +++ b/3rdparty/asmjit/test/asmjit_test_instinfo.cpp @@ -13,6 +13,9 @@ using namespace asmjit; +namespace { + +#if !defined(ASMJIT_NO_X86) static char accessLetter(bool r, bool w) noexcept { return r && w ? 'X' : r ? 'R' : w ? 'W' : '_'; } @@ -140,6 +143,7 @@ static void printInfoExtra(Arch arch, InstId instId, InstOptions options, const Operand_ opArray[] = { std::forward(args)... }; printInfo(arch, inst, opArray, sizeof...(args)); } +#endif // !ASMJIT_NO_X86 static void testX86Arch() { #if !defined(ASMJIT_NO_X86) @@ -165,9 +169,11 @@ static void testX86Arch() { printInfoExtra(arch, Inst::kIdVaddpd, InstOptions::kNone, k1, zmm0, zmm1, zmm2); printInfoExtra(arch, Inst::kIdVaddpd, InstOptions::kX86_ZMask, k1, zmm0, zmm1, zmm2); -#endif +#endif // !ASMJIT_NO_X86 } +} // {anonymous} + int main() { printf("AsmJit Instruction Info Test-Suite v%u.%u.%u\n", unsigned((ASMJIT_LIBRARY_VERSION >> 16) ), diff --git a/3rdparty/asmjit/test/asmjit_test_misc.h b/3rdparty/asmjit/test/asmjit_test_misc.h index 0839d30ac00ec..6231971f01f4a 100644 --- a/3rdparty/asmjit/test/asmjit_test_misc.h +++ b/3rdparty/asmjit/test/asmjit_test_misc.h @@ -170,7 +170,7 @@ static void generateSseAlphaBlend(asmjit::BaseEmitter& emitter, bool emitPrologE if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -202,7 +202,7 @@ static void generateSseAlphaBlend(asmjit::BaseEmitter& emitter, bool emitPrologE if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -242,7 +242,7 @@ static void generateSseAlphaBlend(asmjit::BaseEmitter& emitter, bool emitPrologE Xmm v6 = cc.newXmm("v6"); Xmm v7 = cc.newXmm("v7"); - FuncNode* funcNode = cc.addFunc(FuncSignatureT(CallConvId::kHost)); + FuncNode* funcNode = cc.addFunc(FuncSignature::build()); funcNode->setArg(0, dst); funcNode->setArg(1, src); funcNode->setArg(2, i); diff --git a/3rdparty/asmjit/test/asmjit_test_perf.cpp b/3rdparty/asmjit/test/asmjit_test_perf.cpp index ab965948f402e..98353fd147d34 100644 --- a/3rdparty/asmjit/test/asmjit_test_perf.cpp +++ b/3rdparty/asmjit/test/asmjit_test_perf.cpp @@ -30,9 +30,19 @@ int main(int argc, char* argv[]) { unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF)); printf("Usage:\n"); - printf(" --help Show usage only\n"); - printf(" --quick Decrease the number of iterations to make tests quicker\n"); - printf(" --arch= Select architecture to run ('all' by default)\n"); + printf(" --help Show usage only\n"); + printf(" --quick Decrease the number of iterations to make tests quicker\n"); + printf(" --arch= Select architecture(s) to run ('all' by default)\n"); + printf("\n"); + + printf("Architectures:\n"); +#if !defined(ASMJIT_NO_X86) + printf(" --arch=x86 32-bit X86 architecture (X86)\n"); + printf(" --arch=x64 64-bit X86 architecture (X86_64)\n"); +#endif +#if !defined(ASMJIT_NO_AARCH64) + printf(" --arch=aarch64 64-bit ARM architecture (AArch64)\n"); +#endif printf("\n"); if (cmdLine.hasArg("--help")) diff --git a/3rdparty/asmjit/test/asmjit_test_perf.h b/3rdparty/asmjit/test/asmjit_test_perf.h index 2ab0038ed312b..f637013985bf1 100644 --- a/3rdparty/asmjit/test/asmjit_test_perf.h +++ b/3rdparty/asmjit/test/asmjit_test_perf.h @@ -10,7 +10,9 @@ #include "asmjitutils.h" #include "performancetimer.h" -class MyErrorHandler : public asmjit::ErrorHandler { +namespace asmjit_perf_utils { + +class TestErrorHandler : public asmjit::ErrorHandler { void handleError(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) { (void)err; (void)origin; @@ -19,10 +21,50 @@ class MyErrorHandler : public asmjit::ErrorHandler { } }; +#ifndef ASMJIT_NO_BUILDER +template +static uint32_t calculateInstructionCount(asmjit::CodeHolder& code, asmjit::Arch arch, const FuncT& func) noexcept { + BuilderT builder; + TestErrorHandler eh; + + asmjit::Environment env(arch); + code.init(env); + code.setErrorHandler(&eh); + code.attach(&builder); + func(builder); + + uint32_t count = 0; + asmjit::BaseNode* node = builder.firstNode(); + + while (node) { + count += uint32_t(node->isInst()); + node = node->next(); + } + + code.reset(); + return count; +} +#endif + +static inline double calculateMBPS(double duration, uint64_t outputSize) noexcept { + if (duration == 0) + return 0.0; + + double bytesTotal = double(outputSize); + return (bytesTotal * 1000) / (duration * 1024 * 1024); +} + +static inline double calculateMIPS(double duration, uint64_t instCount) noexcept { + if (duration == 0) + return 0.0; + + return double(instCount) * 1000.0 / (duration * 1e6); +} + template -static void bench(asmjit::CodeHolder& code, asmjit::Arch arch, uint32_t numIterations, const char* testName, const FuncT& func) noexcept { +static void bench(asmjit::CodeHolder& code, asmjit::Arch arch, uint32_t numIterations, const char* testName, uint32_t instCount, const FuncT& func) noexcept { EmitterT emitter; - MyErrorHandler eh; + TestErrorHandler eh; const char* archName = asmjitArchAsString(arch); const char* emitterName = @@ -53,9 +95,20 @@ static void bench(asmjit::CodeHolder& code, asmjit::Arch arch, uint32_t numItera } printf(" [%s] %-9s %-16s | CodeSize:%5llu [B] | Time:%8.4f [ms]", archName, emitterName, testName, (unsigned long long)codeSize, duration); - if (codeSize) - printf(" | Speed:%8.3f [MB/s]", mbps(duration, codeSize)); + if (codeSize) { + printf(" | Speed:%7.1f [MiB/s]", calculateMBPS(duration, codeSize)); + } + else { + printf(" | Speed: N/A "); + } + + if (instCount) { + printf(", %8.1f [MInst/s]", calculateMIPS(duration, instCount)); + } + printf("\n"); } +} // {asmjit_perf_utils} + #endif // ASMJIT_TEST_PERF_H_INCLUDED diff --git a/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp b/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp index 4f4aebb6e72b4..36d23a42d9b43 100644 --- a/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp +++ b/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp @@ -582,7 +582,7 @@ static void generateGpSequence(BaseEmitter& emitter, bool emitPrologEpilog) { if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -608,7 +608,7 @@ static void generateGpSequence(BaseEmitter& emitter, bool emitPrologEpilog) { if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -633,7 +633,7 @@ static void generateGpSequence(BaseEmitter& emitter, bool emitPrologEpilog) { a64::Gp c = cc.newIntPtr("c"); a64::Gp d = cc.newIntPtr("d"); - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); generateGpSequenceInternal(cc, a, b, c, d); cc.endFunc(); } @@ -645,42 +645,50 @@ static void benchmarkA64Function(Arch arch, uint32_t numIterations, const char* CodeHolder code; printf("%s:\n", description); - bench(code, arch, numIterations, "[raw]", [&](a64::Assembler& cc) { + uint32_t instCount = 0; + +#ifndef ASMJIT_NO_BUILDER + instCount = asmjit_perf_utils::calculateInstructionCount(code, arch, [&](a64::Builder& cc) { + emitterFn(cc, false); + }); +#endif + + asmjit_perf_utils::bench(code, arch, numIterations, "[raw]", instCount, [&](a64::Assembler& cc) { emitterFn(cc, false); }); - bench(code, arch, numIterations, "[validated]", [&](a64::Assembler& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[validated]", instCount, [&](a64::Assembler& cc) { cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler); emitterFn(cc, false); }); - bench(code, arch, numIterations, "[prolog/epilog]", [&](a64::Assembler& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[prolog/epilog]", instCount, [&](a64::Assembler& cc) { cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler); emitterFn(cc, true); }); #ifndef ASMJIT_NO_BUILDER - bench(code, arch, numIterations, "[no-asm]", [&](a64::Builder& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[no-asm]", instCount, [&](a64::Builder& cc) { emitterFn(cc, false); }); - bench(code, arch, numIterations, "[finalized]", [&](a64::Builder& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[finalized]", instCount, [&](a64::Builder& cc) { emitterFn(cc, false); cc.finalize(); }); - bench(code, arch, numIterations, "[prolog/epilog]", [&](a64::Builder& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[prolog/epilog]", instCount, [&](a64::Builder& cc) { emitterFn(cc, true); cc.finalize(); }); #endif #ifndef ASMJIT_NO_COMPILER - bench(code, arch, numIterations, "[no-asm]", [&](a64::Compiler& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[no-asm]", instCount, [&](a64::Compiler& cc) { emitterFn(cc, true); }); - bench(code, arch, numIterations, "[finalized]", [&](a64::Compiler& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[finalized]", instCount, [&](a64::Compiler& cc) { emitterFn(cc, true); cc.finalize(); }); diff --git a/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp b/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp index e2720b7c50af8..4ff7481893913 100644 --- a/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp +++ b/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp @@ -335,7 +335,7 @@ static void generateGpSequence(BaseEmitter& emitter, InstForm form, bool emitPro if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -361,7 +361,7 @@ static void generateGpSequence(BaseEmitter& emitter, InstForm form, bool emitPro if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -386,7 +386,7 @@ static void generateGpSequence(BaseEmitter& emitter, InstForm form, bool emitPro Gp c = cc.newIntPtr("c"); Gp d = cc.newIntPtr("d"); - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); generateGpSequenceInternal(cc, form, a, b, c, d); cc.endFunc(); } @@ -670,9 +670,9 @@ static void generateSseSequenceInternal( cc.cvtpi2ps(xmmA, m); cc.cvtsi2ss(xmmA, m); cc.cvtss2si(gpd, m); - if (cc.is64Bit()) cc.cvtss2si(gpq, m); + cc.cvtss2si(gpz, m); cc.cvttss2si(gpd, m); - if (cc.is64Bit()) cc.cvttss2si(gpq, m); + cc.cvttss2si(gpz, m); cc.divps(xmmA, m); cc.divss(xmmA, m); cc.maxps(xmmA, m); @@ -729,16 +729,16 @@ static void generateSseSequenceInternal( cc.cvtps2dq(xmmA, m); cc.cvtps2pd(xmmA, m); cc.cvtsd2si(gpd, m); - if (cc.is64Bit()) cc.cvtsd2si(gpq, m); + cc.cvtsd2si(gpz, m); cc.cvtsd2ss(xmmA, m); cc.cvtsi2sd(xmmA, m); cc.cvtss2sd(xmmA, m); cc.cvtss2si(gpd, m); - if (cc.is64Bit()) cc.cvtss2si(gpq, m); + cc.cvtss2si(gpz, m); cc.cvttpd2dq(xmmA, m); cc.cvttps2dq(xmmA, m); cc.cvttsd2si(gpd, m); - if (cc.is64Bit()) cc.cvttsd2si(gpq, m); + cc.cvttsd2si(gpz, m); cc.divpd(xmmA, m); cc.divsd(xmmA, m); cc.maxpd(xmmA, m); @@ -927,7 +927,7 @@ static void generateSseSequence(BaseEmitter& emitter, InstForm form, bool emitPr if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -948,7 +948,7 @@ static void generateSseSequence(BaseEmitter& emitter, InstForm form, bool emitPr if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -974,7 +974,7 @@ static void generateSseSequence(BaseEmitter& emitter, InstForm form, bool emitPr Xmm c = cc.newXmm("c"); Xmm d = cc.newXmm("d"); - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); generateSseSequenceInternal(cc, form, gp, a, b, c, d); cc.endFunc(); } @@ -983,9 +983,602 @@ static void generateSseSequence(BaseEmitter& emitter, InstForm form, bool emitPr // Generates a long sequence of AVX instructions. template -static void generateAvxSequenceInternal( +static void generateAvxSequenceInternalRegOnly( + Emitter& cc, + const x86::Gp& gp, + const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) { + + x86::Gp gpd = gp.r32(); + x86::Gp gpq = gp.r64(); + x86::Gp gpz = cc.is32Bit() ? gpd : gpq; + + x86::Xmm xmmA = vecA.xmm(); + x86::Xmm xmmB = vecB.xmm(); + x86::Xmm xmmC = vecC.xmm(); + x86::Xmm xmmD = vecD.xmm(); + + x86::Ymm ymmA = vecA.ymm(); + x86::Ymm ymmB = vecB.ymm(); + x86::Ymm ymmC = vecC.ymm(); + + cc.xor_(gpd, gpd); + cc.vxorps(xmmA, xmmA, xmmA); + cc.vxorps(xmmB, xmmB, xmmB); + cc.vxorps(xmmC, xmmC, xmmC); + cc.vxorps(xmmD, xmmD, xmmD); + + cc.vaddpd(xmmA, xmmB, xmmC); + cc.vaddpd(ymmA, ymmB, ymmC); + cc.vaddps(xmmA, xmmB, xmmC); + cc.vaddps(ymmA, ymmB, ymmC); + cc.vaddsd(xmmA, xmmB, xmmC); + cc.vaddss(xmmA, xmmB, xmmC); + cc.vaddsubpd(xmmA, xmmB, xmmC); + cc.vaddsubpd(ymmA, ymmB, ymmC); + cc.vaddsubps(xmmA, xmmB, xmmC); + cc.vaddsubps(ymmA, ymmB, ymmC); + cc.vandpd(xmmA, xmmB, xmmC); + cc.vandpd(ymmA, ymmB, ymmC); + cc.vandps(xmmA, xmmB, xmmC); + cc.vandps(ymmA, ymmB, ymmC); + cc.vandnpd(xmmA, xmmB, xmmC); + cc.vandnpd(ymmA, ymmB, ymmC); + cc.vandnps(xmmA, xmmB, xmmC); + cc.vandnps(ymmA, ymmB, ymmC); + cc.vblendpd(xmmA, xmmB, xmmC, 0); + cc.vblendpd(ymmA, ymmB, ymmC, 0); + cc.vblendps(xmmA, xmmB, xmmC, 0); + cc.vblendps(ymmA, ymmB, ymmC, 0); + cc.vblendvpd(xmmA, xmmB, xmmC, xmmA); + cc.vblendvpd(ymmA, ymmB, ymmC, ymmA); + cc.vcmppd(xmmA, xmmB, xmmC, 0); + cc.vcmppd(ymmA, ymmB, ymmC, 0); + cc.vcmpps(xmmA, xmmB, xmmC, 0); + cc.vcmpps(ymmA, ymmB, ymmC, 0); + cc.vcmpsd(xmmA, xmmB, xmmC, 0); + cc.vcmpss(xmmA, xmmB, xmmC, 0); + cc.vcomisd(xmmA, xmmB); + cc.vcomiss(xmmA, xmmB); + cc.vcvtdq2pd(xmmA, xmmB); + cc.vcvtdq2pd(ymmA, xmmB); + cc.vcvtdq2ps(xmmA, xmmB); + cc.vcvtdq2ps(ymmA, ymmB); + cc.vcvtpd2dq(xmmA, xmmB); + cc.vcvtpd2dq(xmmA, ymmB); + cc.vcvtpd2ps(xmmA, xmmB); + cc.vcvtpd2ps(xmmA, ymmB); + cc.vcvtps2dq(xmmA, xmmB); + cc.vcvtps2dq(ymmA, ymmB); + cc.vcvtps2pd(xmmA, xmmB); + cc.vcvtps2pd(ymmA, xmmB); + cc.vcvtsd2si(gpd, xmmB); + cc.vcvtsd2si(gpz, xmmB); + cc.vcvtsd2ss(xmmA, xmmB, xmmC); + cc.vcvtsi2sd(xmmA, xmmB, gpd); + cc.vcvtsi2sd(xmmA, xmmB, gpz); + cc.vcvtsi2ss(xmmA, xmmB, gpd); + cc.vcvtsi2ss(xmmA, xmmB, gpz); + cc.vcvtss2sd(xmmA, xmmB, xmmC); + cc.vcvtss2si(gpd, xmmB); + cc.vcvttpd2dq(xmmA, xmmB); + cc.vcvttpd2dq(xmmA, ymmB); + cc.vcvttps2dq(xmmA, xmmB); + cc.vcvttps2dq(ymmA, ymmB); + cc.vcvttsd2si(gpd, xmmB); + cc.vcvttss2si(gpz, xmmB); + cc.vdivpd(xmmA, xmmB, xmmC); + cc.vdivpd(ymmA, ymmB, ymmC); + cc.vdivps(xmmA, xmmB, xmmC); + cc.vdivps(ymmA, ymmB, ymmC); + cc.vdivsd(xmmA, xmmB, xmmC); + cc.vdivss(xmmA, xmmB, xmmC); + cc.vdppd(xmmA, xmmB, xmmC, 0); + cc.vdpps(xmmA, xmmB, xmmC, 0); + cc.vdpps(ymmA, ymmB, ymmC, 0); + cc.vextractf128(xmmA, ymmB, 0); + cc.vextractps(gpd, xmmB, 0); + cc.vhaddpd(xmmA, xmmB, xmmC); + cc.vhaddpd(ymmA, ymmB, ymmC); + cc.vhaddps(xmmA, xmmB, xmmC); + cc.vhaddps(ymmA, ymmB, ymmC); + cc.vhsubpd(xmmA, xmmB, xmmC); + cc.vhsubpd(ymmA, ymmB, ymmC); + cc.vhsubps(xmmA, xmmB, xmmC); + cc.vhsubps(ymmA, ymmB, ymmC); + cc.vinsertf128(ymmA, ymmB, xmmC, 0); + cc.vinsertps(xmmA, xmmB, xmmC, 0); + cc.vmaxpd(xmmA, xmmB, xmmC); + cc.vmaxpd(ymmA, ymmB, ymmC); + cc.vmaxps(xmmA, xmmB, xmmC); + cc.vmaxps(ymmA, ymmB, ymmC); + cc.vmaxsd(xmmA, xmmB, xmmC); + cc.vmaxss(xmmA, xmmB, xmmC); + cc.vminpd(xmmA, xmmB, xmmC); + cc.vminpd(ymmA, ymmB, ymmC); + cc.vminps(xmmA, xmmB, xmmC); + cc.vminps(ymmA, ymmB, ymmC); + cc.vminsd(xmmA, xmmB, xmmC); + cc.vminss(xmmA, xmmB, xmmC); + cc.vmovapd(xmmA, xmmB); + cc.vmovapd(ymmA, ymmB); + cc.vmovaps(xmmA, xmmB); + cc.vmovaps(ymmA, ymmB); + cc.vmovd(xmmA, gpd); + cc.vmovd(gpd, xmmB); + cc.vmovddup(xmmA, xmmB); + cc.vmovddup(ymmA, ymmB); + cc.vmovdqa(xmmA, xmmB); + cc.vmovdqa(ymmA, ymmB); + cc.vmovdqu(xmmA, xmmB); + cc.vmovdqu(ymmA, ymmB); + cc.vmovhlps(xmmA, xmmB, xmmC); + cc.vmovlhps(xmmA, xmmB, xmmC); + cc.vmovmskpd(gpd, xmmB); + cc.vmovmskpd(gpd, ymmB); + cc.vmovmskps(gpd, xmmB); + cc.vmovmskps(gpd, ymmB); + cc.vmovsd(xmmA, xmmB, xmmC); + cc.vmovshdup(xmmA, xmmB); + cc.vmovshdup(ymmA, ymmB); + cc.vmovsldup(xmmA, xmmB); + cc.vmovsldup(ymmA, ymmB); + cc.vmovss(xmmA, xmmB, xmmC); + cc.vmovupd(xmmA, xmmB); + cc.vmovupd(ymmA, ymmB); + cc.vmovups(xmmA, xmmB); + cc.vmovups(ymmA, ymmB); + cc.vmpsadbw(xmmA, xmmB, xmmC, 0); + cc.vmulpd(xmmA, xmmB, xmmC); + cc.vmulpd(ymmA, ymmB, ymmC); + cc.vmulps(xmmA, xmmB, xmmC); + cc.vmulps(ymmA, ymmB, ymmC); + cc.vmulsd(xmmA, xmmB, xmmC); + cc.vmulss(xmmA, xmmB, xmmC); + cc.vorpd(xmmA, xmmB, xmmC); + cc.vorpd(ymmA, ymmB, ymmC); + cc.vorps(xmmA, xmmB, xmmC); + cc.vorps(ymmA, ymmB, ymmC); + cc.vpabsb(xmmA, xmmB); + cc.vpabsd(xmmA, xmmB); + cc.vpabsw(xmmA, xmmB); + cc.vpackssdw(xmmA, xmmB, xmmC); + cc.vpacksswb(xmmA, xmmB, xmmC); + cc.vpackusdw(xmmA, xmmB, xmmC); + cc.vpackuswb(xmmA, xmmB, xmmC); + cc.vpaddb(xmmA, xmmB, xmmC); + cc.vpaddd(xmmA, xmmB, xmmC); + cc.vpaddq(xmmA, xmmB, xmmC); + cc.vpaddw(xmmA, xmmB, xmmC); + cc.vpaddsb(xmmA, xmmB, xmmC); + cc.vpaddsw(xmmA, xmmB, xmmC); + cc.vpaddusb(xmmA, xmmB, xmmC); + cc.vpaddusw(xmmA, xmmB, xmmC); + cc.vpalignr(xmmA, xmmB, xmmC, 0); + cc.vpand(xmmA, xmmB, xmmC); + cc.vpandn(xmmA, xmmB, xmmC); + cc.vpavgb(xmmA, xmmB, xmmC); + cc.vpavgw(xmmA, xmmB, xmmC); + cc.vpblendvb(xmmA, xmmB, xmmC, xmmA); + cc.vpblendw(xmmA, xmmB, xmmC, 0); + cc.vpcmpeqb(xmmA, xmmB, xmmC); + cc.vpcmpeqd(xmmA, xmmB, xmmC); + cc.vpcmpeqq(xmmA, xmmB, xmmC); + cc.vpcmpeqw(xmmA, xmmB, xmmC); + cc.vpcmpgtb(xmmA, xmmB, xmmC); + cc.vpcmpgtd(xmmA, xmmB, xmmC); + cc.vpcmpgtq(xmmA, xmmB, xmmC); + cc.vpcmpgtw(xmmA, xmmB, xmmC); + cc.vpermilpd(xmmA, xmmB, xmmC); + cc.vpermilpd(ymmA, ymmB, ymmC); + cc.vpermilpd(xmmA, xmmB, 0); + cc.vpermilpd(ymmA, ymmB, 0); + cc.vpermilps(xmmA, xmmB, xmmC); + cc.vpermilps(ymmA, ymmB, ymmC); + cc.vpermilps(xmmA, xmmB, 0); + cc.vpermilps(ymmA, ymmB, 0); + cc.vperm2f128(ymmA, ymmB, ymmC, 0); + cc.vpextrb(gpd, xmmB, 0); + cc.vpextrd(gpd, xmmB, 0); + if (cc.is64Bit()) cc.vpextrq(gpq, xmmB, 0); + cc.vpextrw(gpd, xmmB, 0); + cc.vphaddd(xmmA, xmmB, xmmC); + cc.vphaddsw(xmmA, xmmB, xmmC); + cc.vphaddw(xmmA, xmmB, xmmC); + cc.vphminposuw(xmmA, xmmB); + cc.vphsubd(xmmA, xmmB, xmmC); + cc.vphsubsw(xmmA, xmmB, xmmC); + cc.vphsubw(xmmA, xmmB, xmmC); + cc.vpinsrb(xmmA, xmmB, gpd, 0); + cc.vpinsrd(xmmA, xmmB, gpd, 0); + cc.vpinsrw(xmmA, xmmB, gpd, 0); + cc.vpmaddubsw(xmmA, xmmB, xmmC); + cc.vpmaddwd(xmmA, xmmB, xmmC); + cc.vpmaxsb(xmmA, xmmB, xmmC); + cc.vpmaxsd(xmmA, xmmB, xmmC); + cc.vpmaxsw(xmmA, xmmB, xmmC); + cc.vpmaxub(xmmA, xmmB, xmmC); + cc.vpmaxud(xmmA, xmmB, xmmC); + cc.vpmaxuw(xmmA, xmmB, xmmC); + cc.vpminsb(xmmA, xmmB, xmmC); + cc.vpminsd(xmmA, xmmB, xmmC); + cc.vpminsw(xmmA, xmmB, xmmC); + cc.vpminub(xmmA, xmmB, xmmC); + cc.vpminud(xmmA, xmmB, xmmC); + cc.vpminuw(xmmA, xmmB, xmmC); + cc.vpmovmskb(gpd, xmmB); + cc.vpmovsxbd(xmmA, xmmB); + cc.vpmovsxbq(xmmA, xmmB); + cc.vpmovsxbw(xmmA, xmmB); + cc.vpmovsxdq(xmmA, xmmB); + cc.vpmovsxwd(xmmA, xmmB); + cc.vpmovsxwq(xmmA, xmmB); + cc.vpmovzxbd(xmmA, xmmB); + cc.vpmovzxbq(xmmA, xmmB); + cc.vpmovzxbw(xmmA, xmmB); + cc.vpmovzxdq(xmmA, xmmB); + cc.vpmovzxwd(xmmA, xmmB); + cc.vpmovzxwq(xmmA, xmmB); + cc.vpmuldq(xmmA, xmmB, xmmC); + cc.vpmulhrsw(xmmA, xmmB, xmmC); + cc.vpmulhuw(xmmA, xmmB, xmmC); + cc.vpmulhw(xmmA, xmmB, xmmC); + cc.vpmulld(xmmA, xmmB, xmmC); + cc.vpmullw(xmmA, xmmB, xmmC); + cc.vpmuludq(xmmA, xmmB, xmmC); + cc.vpor(xmmA, xmmB, xmmC); + cc.vpsadbw(xmmA, xmmB, xmmC); + cc.vpshufb(xmmA, xmmB, xmmC); + cc.vpshufd(xmmA, xmmB, 0); + cc.vpshufhw(xmmA, xmmB, 0); + cc.vpshuflw(xmmA, xmmB, 0); + cc.vpsignb(xmmA, xmmB, xmmC); + cc.vpsignd(xmmA, xmmB, xmmC); + cc.vpsignw(xmmA, xmmB, xmmC); + cc.vpslld(xmmA, xmmB, xmmC); + cc.vpslld(xmmA, xmmB, 0); + cc.vpslldq(xmmA, xmmB, 0); + cc.vpsllq(xmmA, xmmB, xmmC); + cc.vpsllq(xmmA, xmmB, 0); + cc.vpsllw(xmmA, xmmB, xmmC); + cc.vpsllw(xmmA, xmmB, 0); + cc.vpsrad(xmmA, xmmB, xmmC); + cc.vpsrad(xmmA, xmmB, 0); + cc.vpsraw(xmmA, xmmB, xmmC); + cc.vpsraw(xmmA, xmmB, 0); + cc.vpsrld(xmmA, xmmB, xmmC); + cc.vpsrld(xmmA, xmmB, 0); + cc.vpsrldq(xmmA, xmmB, 0); + cc.vpsrlq(xmmA, xmmB, xmmC); + cc.vpsrlq(xmmA, xmmB, 0); + cc.vpsrlw(xmmA, xmmB, xmmC); + cc.vpsrlw(xmmA, xmmB, 0); + cc.vpsubb(xmmA, xmmB, xmmC); + cc.vpsubd(xmmA, xmmB, xmmC); + cc.vpsubq(xmmA, xmmB, xmmC); + cc.vpsubw(xmmA, xmmB, xmmC); + cc.vpsubsb(xmmA, xmmB, xmmC); + cc.vpsubsw(xmmA, xmmB, xmmC); + cc.vpsubusb(xmmA, xmmB, xmmC); + cc.vpsubusw(xmmA, xmmB, xmmC); + cc.vptest(xmmA, xmmB); + cc.vptest(ymmA, ymmB); + cc.vpunpckhbw(xmmA, xmmB, xmmC); + cc.vpunpckhdq(xmmA, xmmB, xmmC); + cc.vpunpckhqdq(xmmA, xmmB, xmmC); + cc.vpunpckhwd(xmmA, xmmB, xmmC); + cc.vpunpcklbw(xmmA, xmmB, xmmC); + cc.vpunpckldq(xmmA, xmmB, xmmC); + cc.vpunpcklqdq(xmmA, xmmB, xmmC); + cc.vpunpcklwd(xmmA, xmmB, xmmC); + cc.vpxor(xmmA, xmmB, xmmC); + cc.vrcpps(xmmA, xmmB); + cc.vrcpps(ymmA, ymmB); + cc.vrcpss(xmmA, xmmB, xmmC); + cc.vrsqrtps(xmmA, xmmB); + cc.vrsqrtps(ymmA, ymmB); + cc.vrsqrtss(xmmA, xmmB, xmmC); + cc.vroundpd(xmmA, xmmB, 0); + cc.vroundpd(ymmA, ymmB, 0); + cc.vroundps(xmmA, xmmB, 0); + cc.vroundps(ymmA, ymmB, 0); + cc.vroundsd(xmmA, xmmB, xmmC, 0); + cc.vroundss(xmmA, xmmB, xmmC, 0); + cc.vshufpd(xmmA, xmmB, xmmC, 0); + cc.vshufpd(ymmA, ymmB, ymmC, 0); + cc.vshufps(xmmA, xmmB, xmmC, 0); + cc.vshufps(ymmA, ymmB, ymmC, 0); + cc.vsqrtpd(xmmA, xmmB); + cc.vsqrtpd(ymmA, ymmB); + cc.vsqrtps(xmmA, xmmB); + cc.vsqrtps(ymmA, ymmB); + cc.vsqrtsd(xmmA, xmmB, xmmC); + cc.vsqrtss(xmmA, xmmB, xmmC); + cc.vsubpd(xmmA, xmmB, xmmC); + cc.vsubpd(ymmA, ymmB, ymmC); + cc.vsubps(xmmA, xmmB, xmmC); + cc.vsubps(ymmA, ymmB, ymmC); + cc.vsubsd(xmmA, xmmB, xmmC); + cc.vsubss(xmmA, xmmB, xmmC); + cc.vtestps(xmmA, xmmB); + cc.vtestps(ymmA, ymmB); + cc.vtestpd(xmmA, xmmB); + cc.vtestpd(ymmA, ymmB); + cc.vucomisd(xmmA, xmmB); + cc.vucomiss(xmmA, xmmB); + cc.vunpckhpd(xmmA, xmmB, xmmC); + cc.vunpckhpd(ymmA, ymmB, ymmC); + cc.vunpckhps(xmmA, xmmB, xmmC); + cc.vunpckhps(ymmA, ymmB, ymmC); + cc.vunpcklpd(xmmA, xmmB, xmmC); + cc.vunpcklpd(ymmA, ymmB, ymmC); + cc.vunpcklps(xmmA, xmmB, xmmC); + cc.vunpcklps(ymmA, ymmB, ymmC); + cc.vxorpd(xmmA, xmmB, xmmC); + cc.vxorpd(ymmA, ymmB, ymmC); + cc.vxorps(xmmA, xmmB, xmmC); + cc.vxorps(ymmA, ymmB, ymmC); + + // AVX+AESNI. + cc.vaesdec(xmmA, xmmB, xmmC); + cc.vaesdeclast(xmmA, xmmB, xmmC); + cc.vaesenc(xmmA, xmmB, xmmC); + cc.vaesenclast(xmmA, xmmB, xmmC); + cc.vaesimc(xmmA, xmmB); + cc.vaeskeygenassist(xmmA, xmmB, 0); + + // AVX+PCLMULQDQ. + cc.vpclmulqdq(xmmA, xmmB, xmmC, 0); + + // AVX2. + cc.vbroadcastsd(ymmA, xmmB); + cc.vbroadcastss(xmmA, xmmB); + cc.vbroadcastss(ymmA, xmmB); + cc.vextracti128(xmmA, ymmB, 0); + cc.vinserti128(ymmA, ymmB, xmmC, 0); + cc.vmpsadbw(ymmA, ymmB, ymmC, 0); + cc.vpabsb(ymmA, ymmB); + cc.vpabsd(ymmA, ymmB); + cc.vpabsw(ymmA, ymmB); + cc.vpackssdw(ymmA, ymmB, ymmC); + cc.vpacksswb(ymmA, ymmB, ymmC); + cc.vpackusdw(ymmA, ymmB, ymmC); + cc.vpackuswb(ymmA, ymmB, ymmC); + cc.vpaddb(ymmA, ymmB, ymmC); + cc.vpaddd(ymmA, ymmB, ymmC); + cc.vpaddq(ymmA, ymmB, ymmC); + cc.vpaddw(ymmA, ymmB, ymmC); + cc.vpaddsb(ymmA, ymmB, ymmC); + cc.vpaddsw(ymmA, ymmB, ymmC); + cc.vpaddusb(ymmA, ymmB, ymmC); + cc.vpaddusw(ymmA, ymmB, ymmC); + cc.vpalignr(ymmA, ymmB, ymmC, 0); + cc.vpand(ymmA, ymmB, ymmC); + cc.vpandn(ymmA, ymmB, ymmC); + cc.vpavgb(ymmA, ymmB, ymmC); + cc.vpavgw(ymmA, ymmB, ymmC); + cc.vpblendd(xmmA, xmmB, xmmC, 0); + cc.vpblendd(ymmA, ymmB, ymmC, 0); + cc.vpblendvb(ymmA, ymmB, ymmC, ymmA); + cc.vpblendw(ymmA, ymmB, ymmC, 0); + cc.vpbroadcastb(xmmA, xmmB); + cc.vpbroadcastb(ymmA, xmmB); + cc.vpbroadcastd(xmmA, xmmB); + cc.vpbroadcastd(ymmA, xmmB); + cc.vpbroadcastq(xmmA, xmmB); + cc.vpbroadcastq(ymmA, xmmB); + cc.vpbroadcastw(xmmA, xmmB); + cc.vpbroadcastw(ymmA, xmmB); + cc.vpcmpeqb(ymmA, ymmB, ymmC); + cc.vpcmpeqd(ymmA, ymmB, ymmC); + cc.vpcmpeqq(ymmA, ymmB, ymmC); + cc.vpcmpeqw(ymmA, ymmB, ymmC); + cc.vpcmpgtb(ymmA, ymmB, ymmC); + cc.vpcmpgtd(ymmA, ymmB, ymmC); + cc.vpcmpgtq(ymmA, ymmB, ymmC); + cc.vpcmpgtw(ymmA, ymmB, ymmC); + cc.vperm2i128(ymmA, ymmB, ymmC, 0); + cc.vpermd(ymmA, ymmB, ymmC); + cc.vpermps(ymmA, ymmB, ymmC); + cc.vpermpd(ymmA, ymmB, 0); + cc.vpermq(ymmA, ymmB, 0); + cc.vpmovmskb(gpd, ymmB); + cc.vpmovsxbd(ymmA, xmmB); + cc.vpmovsxbq(ymmA, xmmB); + cc.vpmovsxbw(ymmA, xmmB); + cc.vpmovsxdq(ymmA, xmmB); + cc.vpmovsxwd(ymmA, xmmB); + cc.vpmovsxwq(ymmA, xmmB); + cc.vpmovzxbd(ymmA, xmmB); + cc.vpmovzxbq(ymmA, xmmB); + cc.vpmovzxbw(ymmA, xmmB); + cc.vpmovzxdq(ymmA, xmmB); + cc.vpmovzxwd(ymmA, xmmB); + cc.vpmovzxwq(ymmA, xmmB); + cc.vpshufd(ymmA, ymmB, 0); + cc.vpshufhw(ymmA, ymmB, 0); + cc.vpshuflw(ymmA, ymmB, 0); + cc.vpslld(ymmA, ymmB, 0); + cc.vpslldq(ymmA, ymmB, 0); + cc.vpsllq(ymmA, ymmB, 0); + cc.vpsllw(ymmA, ymmB, 0); + cc.vpsrad(ymmA, ymmB, 0); + cc.vpsraw(ymmA, ymmB, 0); + cc.vpsrld(ymmA, ymmB, 0); + cc.vpsrldq(ymmA, ymmB, 0); + cc.vpsrlq(ymmA, ymmB, 0); + cc.vpsrlw(ymmA, ymmB, 0); + cc.vphaddd(ymmA, ymmB, ymmC); + cc.vphaddsw(ymmA, ymmB, ymmC); + cc.vphaddw(ymmA, ymmB, ymmC); + cc.vphsubd(ymmA, ymmB, ymmC); + cc.vphsubsw(ymmA, ymmB, ymmC); + cc.vphsubw(ymmA, ymmB, ymmC); + cc.vpmaddubsw(ymmA, ymmB, ymmC); + cc.vpmaddwd(ymmA, ymmB, ymmC); + cc.vpmaxsb(ymmA, ymmB, ymmC); + cc.vpmaxsd(ymmA, ymmB, ymmC); + cc.vpmaxsw(ymmA, ymmB, ymmC); + cc.vpmaxub(ymmA, ymmB, ymmC); + cc.vpmaxud(ymmA, ymmB, ymmC); + cc.vpmaxuw(ymmA, ymmB, ymmC); + cc.vpminsb(ymmA, ymmB, ymmC); + cc.vpminsd(ymmA, ymmB, ymmC); + cc.vpminsw(ymmA, ymmB, ymmC); + cc.vpminub(ymmA, ymmB, ymmC); + cc.vpminud(ymmA, ymmB, ymmC); + cc.vpminuw(ymmA, ymmB, ymmC); + cc.vpmuldq(ymmA, ymmB, ymmC); + cc.vpmulhrsw(ymmA, ymmB, ymmC); + cc.vpmulhuw(ymmA, ymmB, ymmC); + cc.vpmulhw(ymmA, ymmB, ymmC); + cc.vpmulld(ymmA, ymmB, ymmC); + cc.vpmullw(ymmA, ymmB, ymmC); + cc.vpmuludq(ymmA, ymmB, ymmC); + cc.vpor(ymmA, ymmB, ymmC); + cc.vpsadbw(ymmA, ymmB, ymmC); + cc.vpshufb(ymmA, ymmB, ymmC); + cc.vpsignb(ymmA, ymmB, ymmC); + cc.vpsignd(ymmA, ymmB, ymmC); + cc.vpsignw(ymmA, ymmB, ymmC); + cc.vpslld(ymmA, ymmB, xmmC); + cc.vpsllq(ymmA, ymmB, xmmC); + cc.vpsllvd(xmmA, xmmB, xmmC); + cc.vpsllvd(ymmA, ymmB, ymmC); + cc.vpsllvq(xmmA, xmmB, xmmC); + cc.vpsllvq(ymmA, ymmB, ymmC); + cc.vpsllw(ymmA, ymmB, xmmC); + cc.vpsrad(ymmA, ymmB, xmmC); + cc.vpsravd(xmmA, xmmB, xmmC); + cc.vpsravd(ymmA, ymmB, ymmC); + cc.vpsraw(ymmA, ymmB, xmmC); + cc.vpsrld(ymmA, ymmB, xmmC); + cc.vpsrlq(ymmA, ymmB, xmmC); + cc.vpsrlvd(xmmA, xmmB, xmmC); + cc.vpsrlvd(ymmA, ymmB, ymmC); + cc.vpsrlvq(xmmA, xmmB, xmmC); + cc.vpsrlvq(ymmA, ymmB, ymmC); + cc.vpsrlw(ymmA, ymmB, xmmC); + cc.vpsubb(ymmA, ymmB, ymmC); + cc.vpsubd(ymmA, ymmB, ymmC); + cc.vpsubq(ymmA, ymmB, ymmC); + cc.vpsubsb(ymmA, ymmB, ymmC); + cc.vpsubsw(ymmA, ymmB, ymmC); + cc.vpsubusb(ymmA, ymmB, ymmC); + cc.vpsubusw(ymmA, ymmB, ymmC); + cc.vpsubw(ymmA, ymmB, ymmC); + cc.vpunpckhbw(ymmA, ymmB, ymmC); + cc.vpunpckhdq(ymmA, ymmB, ymmC); + cc.vpunpckhqdq(ymmA, ymmB, ymmC); + cc.vpunpckhwd(ymmA, ymmB, ymmC); + cc.vpunpcklbw(ymmA, ymmB, ymmC); + cc.vpunpckldq(ymmA, ymmB, ymmC); + cc.vpunpcklqdq(ymmA, ymmB, ymmC); + cc.vpunpcklwd(ymmA, ymmB, ymmC); + cc.vpxor(ymmA, ymmB, ymmC); + + // FMA. + cc.vfmadd132pd(xmmA, xmmB, xmmC); + cc.vfmadd132pd(ymmA, ymmB, ymmC); + cc.vfmadd132ps(xmmA, xmmB, xmmC); + cc.vfmadd132ps(ymmA, ymmB, ymmC); + cc.vfmadd132sd(xmmA, xmmB, xmmC); + cc.vfmadd132ss(xmmA, xmmB, xmmC); + cc.vfmadd213pd(xmmA, xmmB, xmmC); + cc.vfmadd213pd(ymmA, ymmB, ymmC); + cc.vfmadd213ps(xmmA, xmmB, xmmC); + cc.vfmadd213ps(ymmA, ymmB, ymmC); + cc.vfmadd213sd(xmmA, xmmB, xmmC); + cc.vfmadd213ss(xmmA, xmmB, xmmC); + cc.vfmadd231pd(xmmA, xmmB, xmmC); + cc.vfmadd231pd(ymmA, ymmB, ymmC); + cc.vfmadd231ps(xmmA, xmmB, xmmC); + cc.vfmadd231ps(ymmA, ymmB, ymmC); + cc.vfmadd231sd(xmmA, xmmB, xmmC); + cc.vfmadd231ss(xmmA, xmmB, xmmC); + cc.vfmaddsub132pd(xmmA, xmmB, xmmC); + cc.vfmaddsub132pd(ymmA, ymmB, ymmC); + cc.vfmaddsub132ps(xmmA, xmmB, xmmC); + cc.vfmaddsub132ps(ymmA, ymmB, ymmC); + cc.vfmaddsub213pd(xmmA, xmmB, xmmC); + cc.vfmaddsub213pd(ymmA, ymmB, ymmC); + cc.vfmaddsub213ps(xmmA, xmmB, xmmC); + cc.vfmaddsub213ps(ymmA, ymmB, ymmC); + cc.vfmaddsub231pd(xmmA, xmmB, xmmC); + cc.vfmaddsub231pd(ymmA, ymmB, ymmC); + cc.vfmaddsub231ps(xmmA, xmmB, xmmC); + cc.vfmaddsub231ps(ymmA, ymmB, ymmC); + cc.vfmsub132pd(xmmA, xmmB, xmmC); + cc.vfmsub132pd(ymmA, ymmB, ymmC); + cc.vfmsub132ps(xmmA, xmmB, xmmC); + cc.vfmsub132ps(ymmA, ymmB, ymmC); + cc.vfmsub132sd(xmmA, xmmB, xmmC); + cc.vfmsub132ss(xmmA, xmmB, xmmC); + cc.vfmsub213pd(xmmA, xmmB, xmmC); + cc.vfmsub213pd(ymmA, ymmB, ymmC); + cc.vfmsub213ps(xmmA, xmmB, xmmC); + cc.vfmsub213ps(ymmA, ymmB, ymmC); + cc.vfmsub213sd(xmmA, xmmB, xmmC); + cc.vfmsub213ss(xmmA, xmmB, xmmC); + cc.vfmsub231pd(xmmA, xmmB, xmmC); + cc.vfmsub231pd(ymmA, ymmB, ymmC); + cc.vfmsub231ps(xmmA, xmmB, xmmC); + cc.vfmsub231ps(ymmA, ymmB, ymmC); + cc.vfmsub231sd(xmmA, xmmB, xmmC); + cc.vfmsub231ss(xmmA, xmmB, xmmC); + cc.vfmsubadd132pd(xmmA, xmmB, xmmC); + cc.vfmsubadd132pd(ymmA, ymmB, ymmC); + cc.vfmsubadd132ps(xmmA, xmmB, xmmC); + cc.vfmsubadd132ps(ymmA, ymmB, ymmC); + cc.vfmsubadd213pd(xmmA, xmmB, xmmC); + cc.vfmsubadd213pd(ymmA, ymmB, ymmC); + cc.vfmsubadd213ps(xmmA, xmmB, xmmC); + cc.vfmsubadd213ps(ymmA, ymmB, ymmC); + cc.vfmsubadd231pd(xmmA, xmmB, xmmC); + cc.vfmsubadd231pd(ymmA, ymmB, ymmC); + cc.vfmsubadd231ps(xmmA, xmmB, xmmC); + cc.vfmsubadd231ps(ymmA, ymmB, ymmC); + cc.vfnmadd132pd(xmmA, xmmB, xmmC); + cc.vfnmadd132pd(ymmA, ymmB, ymmC); + cc.vfnmadd132ps(xmmA, xmmB, xmmC); + cc.vfnmadd132ps(ymmA, ymmB, ymmC); + cc.vfnmadd132sd(xmmA, xmmB, xmmC); + cc.vfnmadd132ss(xmmA, xmmB, xmmC); + cc.vfnmadd213pd(xmmA, xmmB, xmmC); + cc.vfnmadd213pd(ymmA, ymmB, ymmC); + cc.vfnmadd213ps(xmmA, xmmB, xmmC); + cc.vfnmadd213ps(ymmA, ymmB, ymmC); + cc.vfnmadd213sd(xmmA, xmmB, xmmC); + cc.vfnmadd213ss(xmmA, xmmB, xmmC); + cc.vfnmadd231pd(xmmA, xmmB, xmmC); + cc.vfnmadd231pd(ymmA, ymmB, ymmC); + cc.vfnmadd231ps(xmmA, xmmB, xmmC); + cc.vfnmadd231ps(ymmA, ymmB, ymmC); + cc.vfnmadd231sd(xmmA, xmmB, xmmC); + cc.vfnmadd231ss(xmmA, xmmB, xmmC); + cc.vfnmsub132pd(xmmA, xmmB, xmmC); + cc.vfnmsub132pd(ymmA, ymmB, ymmC); + cc.vfnmsub132ps(xmmA, xmmB, xmmC); + cc.vfnmsub132ps(ymmA, ymmB, ymmC); + cc.vfnmsub132sd(xmmA, xmmB, xmmC); + cc.vfnmsub132ss(xmmA, xmmB, xmmC); + cc.vfnmsub213pd(xmmA, xmmB, xmmC); + cc.vfnmsub213pd(ymmA, ymmB, ymmC); + cc.vfnmsub213ps(xmmA, xmmB, xmmC); + cc.vfnmsub213ps(ymmA, ymmB, ymmC); + cc.vfnmsub213sd(xmmA, xmmB, xmmC); + cc.vfnmsub213ss(xmmA, xmmB, xmmC); + cc.vfnmsub231pd(xmmA, xmmB, xmmC); + cc.vfnmsub231pd(ymmA, ymmB, ymmC); + cc.vfnmsub231ps(xmmA, xmmB, xmmC); + cc.vfnmsub231ps(ymmA, ymmB, ymmC); + cc.vfnmsub231sd(xmmA, xmmB, xmmC); + cc.vfnmsub231ss(xmmA, xmmB, xmmC); +} + +// Generates a long sequence of AVX instructions. +template +static void generateAvxSequenceInternalRegMem( Emitter& cc, - InstForm form, const x86::Gp& gp, const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) { @@ -1003,1090 +1596,534 @@ static void generateAvxSequenceInternal( x86::Ymm ymmC = vecC.ymm(); x86::Ymm ymmD = vecD.ymm(); + x86::Mem m = x86::ptr(gpz); + x86::Mem m128 = x86::xmmword_ptr(gpz); + x86::Mem m256 = x86::xmmword_ptr(gpz); + x86::Mem vx_ptr = x86::ptr(gpz, xmmD); + x86::Mem vy_ptr = x86::ptr(gpz, ymmD); + cc.xor_(gpd, gpd); cc.vxorps(xmmA, xmmA, xmmA); cc.vxorps(xmmB, xmmB, xmmB); cc.vxorps(xmmC, xmmC, xmmC); cc.vxorps(xmmD, xmmD, xmmD); - if (form == InstForm::kReg) { - cc.vaddpd(xmmA, xmmB, xmmC); - cc.vaddpd(ymmA, ymmB, ymmC); - cc.vaddps(xmmA, xmmB, xmmC); - cc.vaddps(ymmA, ymmB, ymmC); - cc.vaddsd(xmmA, xmmB, xmmC); - cc.vaddss(xmmA, xmmB, xmmC); - cc.vaddsubpd(xmmA, xmmB, xmmC); - cc.vaddsubpd(ymmA, ymmB, ymmC); - cc.vaddsubps(xmmA, xmmB, xmmC); - cc.vaddsubps(ymmA, ymmB, ymmC); - cc.vandpd(xmmA, xmmB, xmmC); - cc.vandpd(ymmA, ymmB, ymmC); - cc.vandps(xmmA, xmmB, xmmC); - cc.vandps(ymmA, ymmB, ymmC); - cc.vandnpd(xmmA, xmmB, xmmC); - cc.vandnpd(ymmA, ymmB, ymmC); - cc.vandnps(xmmA, xmmB, xmmC); - cc.vandnps(ymmA, ymmB, ymmC); - cc.vblendpd(xmmA, xmmB, xmmC, 0); - cc.vblendpd(ymmA, ymmB, ymmC, 0); - cc.vblendps(xmmA, xmmB, xmmC, 0); - cc.vblendps(ymmA, ymmB, ymmC, 0); - cc.vblendvpd(xmmA, xmmB, xmmC, xmmA); - cc.vblendvpd(ymmA, ymmB, ymmC, ymmA); - cc.vcmppd(xmmA, xmmB, xmmC, 0); - cc.vcmppd(ymmA, ymmB, ymmC, 0); - cc.vcmpps(xmmA, xmmB, xmmC, 0); - cc.vcmpps(ymmA, ymmB, ymmC, 0); - cc.vcmpsd(xmmA, xmmB, xmmC, 0); - cc.vcmpss(xmmA, xmmB, xmmC, 0); - cc.vcomisd(xmmA, xmmB); - cc.vcomiss(xmmA, xmmB); - cc.vcvtdq2pd(xmmA, xmmB); - cc.vcvtdq2pd(ymmA, xmmB); - cc.vcvtdq2ps(xmmA, xmmB); - cc.vcvtdq2ps(ymmA, ymmB); - cc.vcvtpd2dq(xmmA, xmmB); - cc.vcvtpd2dq(xmmA, ymmB); - cc.vcvtpd2ps(xmmA, xmmB); - cc.vcvtpd2ps(xmmA, ymmB); - cc.vcvtps2dq(xmmA, xmmB); - cc.vcvtps2dq(ymmA, ymmB); - cc.vcvtps2pd(xmmA, xmmB); - cc.vcvtps2pd(ymmA, xmmB); - cc.vcvtsd2si(gpd, xmmB); - cc.vcvtsd2si(gpz, xmmB); - cc.vcvtsd2ss(xmmA, xmmB, xmmC); - cc.vcvtsi2sd(xmmA, xmmB, gpd); - cc.vcvtsi2sd(xmmA, xmmB, gpz); - cc.vcvtsi2ss(xmmA, xmmB, gpd); - cc.vcvtsi2ss(xmmA, xmmB, gpz); - cc.vcvtss2sd(xmmA, xmmB, xmmC); - cc.vcvtss2si(gpd, xmmB); - cc.vcvttpd2dq(xmmA, xmmB); - cc.vcvttpd2dq(xmmA, ymmB); - cc.vcvttps2dq(xmmA, xmmB); - cc.vcvttps2dq(ymmA, ymmB); - cc.vcvttsd2si(gpd, xmmB); - cc.vcvttss2si(gpz, xmmB); - cc.vdivpd(xmmA, xmmB, xmmC); - cc.vdivpd(ymmA, ymmB, ymmC); - cc.vdivps(xmmA, xmmB, xmmC); - cc.vdivps(ymmA, ymmB, ymmC); - cc.vdivsd(xmmA, xmmB, xmmC); - cc.vdivss(xmmA, xmmB, xmmC); - cc.vdppd(xmmA, xmmB, xmmC, 0); - cc.vdpps(xmmA, xmmB, xmmC, 0); - cc.vdpps(ymmA, ymmB, ymmC, 0); - cc.vextractf128(xmmA, ymmB, 0); - cc.vextractps(gpd, xmmB, 0); - cc.vhaddpd(xmmA, xmmB, xmmC); - cc.vhaddpd(ymmA, ymmB, ymmC); - cc.vhaddps(xmmA, xmmB, xmmC); - cc.vhaddps(ymmA, ymmB, ymmC); - cc.vhsubpd(xmmA, xmmB, xmmC); - cc.vhsubpd(ymmA, ymmB, ymmC); - cc.vhsubps(xmmA, xmmB, xmmC); - cc.vhsubps(ymmA, ymmB, ymmC); - cc.vinsertf128(ymmA, ymmB, xmmC, 0); - cc.vinsertps(xmmA, xmmB, xmmC, 0); - cc.vmaxpd(xmmA, xmmB, xmmC); - cc.vmaxpd(ymmA, ymmB, ymmC); - cc.vmaxps(xmmA, xmmB, xmmC); - cc.vmaxps(ymmA, ymmB, ymmC); - cc.vmaxsd(xmmA, xmmB, xmmC); - cc.vmaxss(xmmA, xmmB, xmmC); - cc.vminpd(xmmA, xmmB, xmmC); - cc.vminpd(ymmA, ymmB, ymmC); - cc.vminps(xmmA, xmmB, xmmC); - cc.vminps(ymmA, ymmB, ymmC); - cc.vminsd(xmmA, xmmB, xmmC); - cc.vminss(xmmA, xmmB, xmmC); - cc.vmovapd(xmmA, xmmB); - cc.vmovapd(ymmA, ymmB); - cc.vmovaps(xmmA, xmmB); - cc.vmovaps(ymmA, ymmB); - cc.vmovd(xmmA, gpd); - cc.vmovd(gpd, xmmB); - cc.vmovddup(xmmA, xmmB); - cc.vmovddup(ymmA, ymmB); - cc.vmovdqa(xmmA, xmmB); - cc.vmovdqa(ymmA, ymmB); - cc.vmovdqu(xmmA, xmmB); - cc.vmovdqu(ymmA, ymmB); - cc.vmovhlps(xmmA, xmmB, xmmC); - cc.vmovlhps(xmmA, xmmB, xmmC); - cc.vmovmskpd(gpd, xmmB); - cc.vmovmskpd(gpd, ymmB); - cc.vmovmskps(gpd, xmmB); - cc.vmovmskps(gpd, ymmB); - cc.vmovsd(xmmA, xmmB, xmmC); - cc.vmovshdup(xmmA, xmmB); - cc.vmovshdup(ymmA, ymmB); - cc.vmovsldup(xmmA, xmmB); - cc.vmovsldup(ymmA, ymmB); - cc.vmovss(xmmA, xmmB, xmmC); - cc.vmovupd(xmmA, xmmB); - cc.vmovupd(ymmA, ymmB); - cc.vmovups(xmmA, xmmB); - cc.vmovups(ymmA, ymmB); - cc.vmpsadbw(xmmA, xmmB, xmmC, 0); - cc.vmulpd(xmmA, xmmB, xmmC); - cc.vmulpd(ymmA, ymmB, ymmC); - cc.vmulps(xmmA, xmmB, xmmC); - cc.vmulps(ymmA, ymmB, ymmC); - cc.vmulsd(xmmA, xmmB, xmmC); - cc.vmulss(xmmA, xmmB, xmmC); - cc.vorpd(xmmA, xmmB, xmmC); - cc.vorpd(ymmA, ymmB, ymmC); - cc.vorps(xmmA, xmmB, xmmC); - cc.vorps(ymmA, ymmB, ymmC); - cc.vpabsb(xmmA, xmmB); - cc.vpabsd(xmmA, xmmB); - cc.vpabsw(xmmA, xmmB); - cc.vpackssdw(xmmA, xmmB, xmmC); - cc.vpacksswb(xmmA, xmmB, xmmC); - cc.vpackusdw(xmmA, xmmB, xmmC); - cc.vpackuswb(xmmA, xmmB, xmmC); - cc.vpaddb(xmmA, xmmB, xmmC); - cc.vpaddd(xmmA, xmmB, xmmC); - cc.vpaddq(xmmA, xmmB, xmmC); - cc.vpaddw(xmmA, xmmB, xmmC); - cc.vpaddsb(xmmA, xmmB, xmmC); - cc.vpaddsw(xmmA, xmmB, xmmC); - cc.vpaddusb(xmmA, xmmB, xmmC); - cc.vpaddusw(xmmA, xmmB, xmmC); - cc.vpalignr(xmmA, xmmB, xmmC, 0); - cc.vpand(xmmA, xmmB, xmmC); - cc.vpandn(xmmA, xmmB, xmmC); - cc.vpavgb(xmmA, xmmB, xmmC); - cc.vpavgw(xmmA, xmmB, xmmC); - cc.vpblendvb(xmmA, xmmB, xmmC, xmmA); - cc.vpblendw(xmmA, xmmB, xmmC, 0); - cc.vpcmpeqb(xmmA, xmmB, xmmC); - cc.vpcmpeqd(xmmA, xmmB, xmmC); - cc.vpcmpeqq(xmmA, xmmB, xmmC); - cc.vpcmpeqw(xmmA, xmmB, xmmC); - cc.vpcmpgtb(xmmA, xmmB, xmmC); - cc.vpcmpgtd(xmmA, xmmB, xmmC); - cc.vpcmpgtq(xmmA, xmmB, xmmC); - cc.vpcmpgtw(xmmA, xmmB, xmmC); - cc.vpermilpd(xmmA, xmmB, xmmC); - cc.vpermilpd(ymmA, ymmB, ymmC); - cc.vpermilpd(xmmA, xmmB, 0); - cc.vpermilpd(ymmA, ymmB, 0); - cc.vpermilps(xmmA, xmmB, xmmC); - cc.vpermilps(ymmA, ymmB, ymmC); - cc.vpermilps(xmmA, xmmB, 0); - cc.vpermilps(ymmA, ymmB, 0); - cc.vperm2f128(ymmA, ymmB, ymmC, 0); - cc.vpextrb(gpd, xmmB, 0); - cc.vpextrd(gpd, xmmB, 0); - if (cc.is64Bit()) cc.vpextrq(gpq, xmmB, 0); - cc.vpextrw(gpd, xmmB, 0); - cc.vphaddd(xmmA, xmmB, xmmC); - cc.vphaddsw(xmmA, xmmB, xmmC); - cc.vphaddw(xmmA, xmmB, xmmC); - cc.vphminposuw(xmmA, xmmB); - cc.vphsubd(xmmA, xmmB, xmmC); - cc.vphsubsw(xmmA, xmmB, xmmC); - cc.vphsubw(xmmA, xmmB, xmmC); - cc.vpinsrb(xmmA, xmmB, gpd, 0); - cc.vpinsrd(xmmA, xmmB, gpd, 0); - cc.vpinsrw(xmmA, xmmB, gpd, 0); - cc.vpmaddubsw(xmmA, xmmB, xmmC); - cc.vpmaddwd(xmmA, xmmB, xmmC); - cc.vpmaxsb(xmmA, xmmB, xmmC); - cc.vpmaxsd(xmmA, xmmB, xmmC); - cc.vpmaxsw(xmmA, xmmB, xmmC); - cc.vpmaxub(xmmA, xmmB, xmmC); - cc.vpmaxud(xmmA, xmmB, xmmC); - cc.vpmaxuw(xmmA, xmmB, xmmC); - cc.vpminsb(xmmA, xmmB, xmmC); - cc.vpminsd(xmmA, xmmB, xmmC); - cc.vpminsw(xmmA, xmmB, xmmC); - cc.vpminub(xmmA, xmmB, xmmC); - cc.vpminud(xmmA, xmmB, xmmC); - cc.vpminuw(xmmA, xmmB, xmmC); - cc.vpmovmskb(gpd, xmmB); - cc.vpmovsxbd(xmmA, xmmB); - cc.vpmovsxbq(xmmA, xmmB); - cc.vpmovsxbw(xmmA, xmmB); - cc.vpmovsxdq(xmmA, xmmB); - cc.vpmovsxwd(xmmA, xmmB); - cc.vpmovsxwq(xmmA, xmmB); - cc.vpmovzxbd(xmmA, xmmB); - cc.vpmovzxbq(xmmA, xmmB); - cc.vpmovzxbw(xmmA, xmmB); - cc.vpmovzxdq(xmmA, xmmB); - cc.vpmovzxwd(xmmA, xmmB); - cc.vpmovzxwq(xmmA, xmmB); - cc.vpmuldq(xmmA, xmmB, xmmC); - cc.vpmulhrsw(xmmA, xmmB, xmmC); - cc.vpmulhuw(xmmA, xmmB, xmmC); - cc.vpmulhw(xmmA, xmmB, xmmC); - cc.vpmulld(xmmA, xmmB, xmmC); - cc.vpmullw(xmmA, xmmB, xmmC); - cc.vpmuludq(xmmA, xmmB, xmmC); - cc.vpor(xmmA, xmmB, xmmC); - cc.vpsadbw(xmmA, xmmB, xmmC); - cc.vpshufb(xmmA, xmmB, xmmC); - cc.vpshufd(xmmA, xmmB, 0); - cc.vpshufhw(xmmA, xmmB, 0); - cc.vpshuflw(xmmA, xmmB, 0); - cc.vpsignb(xmmA, xmmB, xmmC); - cc.vpsignd(xmmA, xmmB, xmmC); - cc.vpsignw(xmmA, xmmB, xmmC); - cc.vpslld(xmmA, xmmB, xmmC); - cc.vpslld(xmmA, xmmB, 0); - cc.vpslldq(xmmA, xmmB, 0); - cc.vpsllq(xmmA, xmmB, xmmC); - cc.vpsllq(xmmA, xmmB, 0); - cc.vpsllw(xmmA, xmmB, xmmC); - cc.vpsllw(xmmA, xmmB, 0); - cc.vpsrad(xmmA, xmmB, xmmC); - cc.vpsrad(xmmA, xmmB, 0); - cc.vpsraw(xmmA, xmmB, xmmC); - cc.vpsraw(xmmA, xmmB, 0); - cc.vpsrld(xmmA, xmmB, xmmC); - cc.vpsrld(xmmA, xmmB, 0); - cc.vpsrldq(xmmA, xmmB, 0); - cc.vpsrlq(xmmA, xmmB, xmmC); - cc.vpsrlq(xmmA, xmmB, 0); - cc.vpsrlw(xmmA, xmmB, xmmC); - cc.vpsrlw(xmmA, xmmB, 0); - cc.vpsubb(xmmA, xmmB, xmmC); - cc.vpsubd(xmmA, xmmB, xmmC); - cc.vpsubq(xmmA, xmmB, xmmC); - cc.vpsubw(xmmA, xmmB, xmmC); - cc.vpsubsb(xmmA, xmmB, xmmC); - cc.vpsubsw(xmmA, xmmB, xmmC); - cc.vpsubusb(xmmA, xmmB, xmmC); - cc.vpsubusw(xmmA, xmmB, xmmC); - cc.vptest(xmmA, xmmB); - cc.vptest(ymmA, ymmB); - cc.vpunpckhbw(xmmA, xmmB, xmmC); - cc.vpunpckhdq(xmmA, xmmB, xmmC); - cc.vpunpckhqdq(xmmA, xmmB, xmmC); - cc.vpunpckhwd(xmmA, xmmB, xmmC); - cc.vpunpcklbw(xmmA, xmmB, xmmC); - cc.vpunpckldq(xmmA, xmmB, xmmC); - cc.vpunpcklqdq(xmmA, xmmB, xmmC); - cc.vpunpcklwd(xmmA, xmmB, xmmC); - cc.vpxor(xmmA, xmmB, xmmC); - cc.vrcpps(xmmA, xmmB); - cc.vrcpps(ymmA, ymmB); - cc.vrcpss(xmmA, xmmB, xmmC); - cc.vrsqrtps(xmmA, xmmB); - cc.vrsqrtps(ymmA, ymmB); - cc.vrsqrtss(xmmA, xmmB, xmmC); - cc.vroundpd(xmmA, xmmB, 0); - cc.vroundpd(ymmA, ymmB, 0); - cc.vroundps(xmmA, xmmB, 0); - cc.vroundps(ymmA, ymmB, 0); - cc.vroundsd(xmmA, xmmB, xmmC, 0); - cc.vroundss(xmmA, xmmB, xmmC, 0); - cc.vshufpd(xmmA, xmmB, xmmC, 0); - cc.vshufpd(ymmA, ymmB, ymmC, 0); - cc.vshufps(xmmA, xmmB, xmmC, 0); - cc.vshufps(ymmA, ymmB, ymmC, 0); - cc.vsqrtpd(xmmA, xmmB); - cc.vsqrtpd(ymmA, ymmB); - cc.vsqrtps(xmmA, xmmB); - cc.vsqrtps(ymmA, ymmB); - cc.vsqrtsd(xmmA, xmmB, xmmC); - cc.vsqrtss(xmmA, xmmB, xmmC); - cc.vsubpd(xmmA, xmmB, xmmC); - cc.vsubpd(ymmA, ymmB, ymmC); - cc.vsubps(xmmA, xmmB, xmmC); - cc.vsubps(ymmA, ymmB, ymmC); - cc.vsubsd(xmmA, xmmB, xmmC); - cc.vsubss(xmmA, xmmB, xmmC); - cc.vtestps(xmmA, xmmB); - cc.vtestps(ymmA, ymmB); - cc.vtestpd(xmmA, xmmB); - cc.vtestpd(ymmA, ymmB); - cc.vucomisd(xmmA, xmmB); - cc.vucomiss(xmmA, xmmB); - cc.vunpckhpd(xmmA, xmmB, xmmC); - cc.vunpckhpd(ymmA, ymmB, ymmC); - cc.vunpckhps(xmmA, xmmB, xmmC); - cc.vunpckhps(ymmA, ymmB, ymmC); - cc.vunpcklpd(xmmA, xmmB, xmmC); - cc.vunpcklpd(ymmA, ymmB, ymmC); - cc.vunpcklps(xmmA, xmmB, xmmC); - cc.vunpcklps(ymmA, ymmB, ymmC); - cc.vxorpd(xmmA, xmmB, xmmC); - cc.vxorpd(ymmA, ymmB, ymmC); - cc.vxorps(xmmA, xmmB, xmmC); - cc.vxorps(ymmA, ymmB, ymmC); - - // AVX+AESNI. - cc.vaesdec(xmmA, xmmB, xmmC); - cc.vaesdeclast(xmmA, xmmB, xmmC); - cc.vaesenc(xmmA, xmmB, xmmC); - cc.vaesenclast(xmmA, xmmB, xmmC); - cc.vaesimc(xmmA, xmmB); - cc.vaeskeygenassist(xmmA, xmmB, 0); - - // AVX+PCLMULQDQ. - cc.vpclmulqdq(xmmA, xmmB, xmmC, 0); - - // AVX2. - cc.vbroadcastsd(ymmA, xmmB); - cc.vbroadcastss(xmmA, xmmB); - cc.vbroadcastss(ymmA, xmmB); - cc.vextracti128(xmmA, ymmB, 0); - cc.vinserti128(ymmA, ymmB, xmmC, 0); - cc.vmpsadbw(ymmA, ymmB, ymmC, 0); - cc.vpabsb(ymmA, ymmB); - cc.vpabsd(ymmA, ymmB); - cc.vpabsw(ymmA, ymmB); - cc.vpackssdw(ymmA, ymmB, ymmC); - cc.vpacksswb(ymmA, ymmB, ymmC); - cc.vpackusdw(ymmA, ymmB, ymmC); - cc.vpackuswb(ymmA, ymmB, ymmC); - cc.vpaddb(ymmA, ymmB, ymmC); - cc.vpaddd(ymmA, ymmB, ymmC); - cc.vpaddq(ymmA, ymmB, ymmC); - cc.vpaddw(ymmA, ymmB, ymmC); - cc.vpaddsb(ymmA, ymmB, ymmC); - cc.vpaddsw(ymmA, ymmB, ymmC); - cc.vpaddusb(ymmA, ymmB, ymmC); - cc.vpaddusw(ymmA, ymmB, ymmC); - cc.vpalignr(ymmA, ymmB, ymmC, 0); - cc.vpand(ymmA, ymmB, ymmC); - cc.vpandn(ymmA, ymmB, ymmC); - cc.vpavgb(ymmA, ymmB, ymmC); - cc.vpavgw(ymmA, ymmB, ymmC); - cc.vpblendd(xmmA, xmmB, xmmC, 0); - cc.vpblendd(ymmA, ymmB, ymmC, 0); - cc.vpblendvb(ymmA, ymmB, ymmC, ymmA); - cc.vpblendw(ymmA, ymmB, ymmC, 0); - cc.vpbroadcastb(xmmA, xmmB); - cc.vpbroadcastb(ymmA, xmmB); - cc.vpbroadcastd(xmmA, xmmB); - cc.vpbroadcastd(ymmA, xmmB); - cc.vpbroadcastq(xmmA, xmmB); - cc.vpbroadcastq(ymmA, xmmB); - cc.vpbroadcastw(xmmA, xmmB); - cc.vpbroadcastw(ymmA, xmmB); - cc.vpcmpeqb(ymmA, ymmB, ymmC); - cc.vpcmpeqd(ymmA, ymmB, ymmC); - cc.vpcmpeqq(ymmA, ymmB, ymmC); - cc.vpcmpeqw(ymmA, ymmB, ymmC); - cc.vpcmpgtb(ymmA, ymmB, ymmC); - cc.vpcmpgtd(ymmA, ymmB, ymmC); - cc.vpcmpgtq(ymmA, ymmB, ymmC); - cc.vpcmpgtw(ymmA, ymmB, ymmC); - cc.vperm2i128(ymmA, ymmB, ymmC, 0); - cc.vpermd(ymmA, ymmB, ymmC); - cc.vpermps(ymmA, ymmB, ymmC); - cc.vpermpd(ymmA, ymmB, 0); - cc.vpermq(ymmA, ymmB, 0); - cc.vpmovmskb(gpd, ymmB); - cc.vpmovsxbd(ymmA, xmmB); - cc.vpmovsxbq(ymmA, xmmB); - cc.vpmovsxbw(ymmA, xmmB); - cc.vpmovsxdq(ymmA, xmmB); - cc.vpmovsxwd(ymmA, xmmB); - cc.vpmovsxwq(ymmA, xmmB); - cc.vpmovzxbd(ymmA, xmmB); - cc.vpmovzxbq(ymmA, xmmB); - cc.vpmovzxbw(ymmA, xmmB); - cc.vpmovzxdq(ymmA, xmmB); - cc.vpmovzxwd(ymmA, xmmB); - cc.vpmovzxwq(ymmA, xmmB); - cc.vpshufd(ymmA, ymmB, 0); - cc.vpshufhw(ymmA, ymmB, 0); - cc.vpshuflw(ymmA, ymmB, 0); - cc.vpslld(ymmA, ymmB, 0); - cc.vpslldq(ymmA, ymmB, 0); - cc.vpsllq(ymmA, ymmB, 0); - cc.vpsllw(ymmA, ymmB, 0); - cc.vpsrad(ymmA, ymmB, 0); - cc.vpsraw(ymmA, ymmB, 0); - cc.vpsrld(ymmA, ymmB, 0); - cc.vpsrldq(ymmA, ymmB, 0); - cc.vpsrlq(ymmA, ymmB, 0); - cc.vpsrlw(ymmA, ymmB, 0); - cc.vphaddd(ymmA, ymmB, ymmC); - cc.vphaddsw(ymmA, ymmB, ymmC); - cc.vphaddw(ymmA, ymmB, ymmC); - cc.vphsubd(ymmA, ymmB, ymmC); - cc.vphsubsw(ymmA, ymmB, ymmC); - cc.vphsubw(ymmA, ymmB, ymmC); - cc.vpmaddubsw(ymmA, ymmB, ymmC); - cc.vpmaddwd(ymmA, ymmB, ymmC); - cc.vpmaxsb(ymmA, ymmB, ymmC); - cc.vpmaxsd(ymmA, ymmB, ymmC); - cc.vpmaxsw(ymmA, ymmB, ymmC); - cc.vpmaxub(ymmA, ymmB, ymmC); - cc.vpmaxud(ymmA, ymmB, ymmC); - cc.vpmaxuw(ymmA, ymmB, ymmC); - cc.vpminsb(ymmA, ymmB, ymmC); - cc.vpminsd(ymmA, ymmB, ymmC); - cc.vpminsw(ymmA, ymmB, ymmC); - cc.vpminub(ymmA, ymmB, ymmC); - cc.vpminud(ymmA, ymmB, ymmC); - cc.vpminuw(ymmA, ymmB, ymmC); - cc.vpmuldq(ymmA, ymmB, ymmC); - cc.vpmulhrsw(ymmA, ymmB, ymmC); - cc.vpmulhuw(ymmA, ymmB, ymmC); - cc.vpmulhw(ymmA, ymmB, ymmC); - cc.vpmulld(ymmA, ymmB, ymmC); - cc.vpmullw(ymmA, ymmB, ymmC); - cc.vpmuludq(ymmA, ymmB, ymmC); - cc.vpor(ymmA, ymmB, ymmC); - cc.vpsadbw(ymmA, ymmB, ymmC); - cc.vpshufb(ymmA, ymmB, ymmC); - cc.vpsignb(ymmA, ymmB, ymmC); - cc.vpsignd(ymmA, ymmB, ymmC); - cc.vpsignw(ymmA, ymmB, ymmC); - cc.vpslld(ymmA, ymmB, xmmC); - cc.vpsllq(ymmA, ymmB, xmmC); - cc.vpsllvd(xmmA, xmmB, xmmC); - cc.vpsllvd(ymmA, ymmB, ymmC); - cc.vpsllvq(xmmA, xmmB, xmmC); - cc.vpsllvq(ymmA, ymmB, ymmC); - cc.vpsllw(ymmA, ymmB, xmmC); - cc.vpsrad(ymmA, ymmB, xmmC); - cc.vpsravd(xmmA, xmmB, xmmC); - cc.vpsravd(ymmA, ymmB, ymmC); - cc.vpsraw(ymmA, ymmB, xmmC); - cc.vpsrld(ymmA, ymmB, xmmC); - cc.vpsrlq(ymmA, ymmB, xmmC); - cc.vpsrlvd(xmmA, xmmB, xmmC); - cc.vpsrlvd(ymmA, ymmB, ymmC); - cc.vpsrlvq(xmmA, xmmB, xmmC); - cc.vpsrlvq(ymmA, ymmB, ymmC); - cc.vpsrlw(ymmA, ymmB, xmmC); - cc.vpsubb(ymmA, ymmB, ymmC); - cc.vpsubd(ymmA, ymmB, ymmC); - cc.vpsubq(ymmA, ymmB, ymmC); - cc.vpsubsb(ymmA, ymmB, ymmC); - cc.vpsubsw(ymmA, ymmB, ymmC); - cc.vpsubusb(ymmA, ymmB, ymmC); - cc.vpsubusw(ymmA, ymmB, ymmC); - cc.vpsubw(ymmA, ymmB, ymmC); - cc.vpunpckhbw(ymmA, ymmB, ymmC); - cc.vpunpckhdq(ymmA, ymmB, ymmC); - cc.vpunpckhqdq(ymmA, ymmB, ymmC); - cc.vpunpckhwd(ymmA, ymmB, ymmC); - cc.vpunpcklbw(ymmA, ymmB, ymmC); - cc.vpunpckldq(ymmA, ymmB, ymmC); - cc.vpunpcklqdq(ymmA, ymmB, ymmC); - cc.vpunpcklwd(ymmA, ymmB, ymmC); - cc.vpxor(ymmA, ymmB, ymmC); - - // FMA. - cc.vfmadd132pd(xmmA, xmmB, xmmC); - cc.vfmadd132pd(ymmA, ymmB, ymmC); - cc.vfmadd132ps(xmmA, xmmB, xmmC); - cc.vfmadd132ps(ymmA, ymmB, ymmC); - cc.vfmadd132sd(xmmA, xmmB, xmmC); - cc.vfmadd132ss(xmmA, xmmB, xmmC); - cc.vfmadd213pd(xmmA, xmmB, xmmC); - cc.vfmadd213pd(ymmA, ymmB, ymmC); - cc.vfmadd213ps(xmmA, xmmB, xmmC); - cc.vfmadd213ps(ymmA, ymmB, ymmC); - cc.vfmadd213sd(xmmA, xmmB, xmmC); - cc.vfmadd213ss(xmmA, xmmB, xmmC); - cc.vfmadd231pd(xmmA, xmmB, xmmC); - cc.vfmadd231pd(ymmA, ymmB, ymmC); - cc.vfmadd231ps(xmmA, xmmB, xmmC); - cc.vfmadd231ps(ymmA, ymmB, ymmC); - cc.vfmadd231sd(xmmA, xmmB, xmmC); - cc.vfmadd231ss(xmmA, xmmB, xmmC); - cc.vfmaddsub132pd(xmmA, xmmB, xmmC); - cc.vfmaddsub132pd(ymmA, ymmB, ymmC); - cc.vfmaddsub132ps(xmmA, xmmB, xmmC); - cc.vfmaddsub132ps(ymmA, ymmB, ymmC); - cc.vfmaddsub213pd(xmmA, xmmB, xmmC); - cc.vfmaddsub213pd(ymmA, ymmB, ymmC); - cc.vfmaddsub213ps(xmmA, xmmB, xmmC); - cc.vfmaddsub213ps(ymmA, ymmB, ymmC); - cc.vfmaddsub231pd(xmmA, xmmB, xmmC); - cc.vfmaddsub231pd(ymmA, ymmB, ymmC); - cc.vfmaddsub231ps(xmmA, xmmB, xmmC); - cc.vfmaddsub231ps(ymmA, ymmB, ymmC); - cc.vfmsub132pd(xmmA, xmmB, xmmC); - cc.vfmsub132pd(ymmA, ymmB, ymmC); - cc.vfmsub132ps(xmmA, xmmB, xmmC); - cc.vfmsub132ps(ymmA, ymmB, ymmC); - cc.vfmsub132sd(xmmA, xmmB, xmmC); - cc.vfmsub132ss(xmmA, xmmB, xmmC); - cc.vfmsub213pd(xmmA, xmmB, xmmC); - cc.vfmsub213pd(ymmA, ymmB, ymmC); - cc.vfmsub213ps(xmmA, xmmB, xmmC); - cc.vfmsub213ps(ymmA, ymmB, ymmC); - cc.vfmsub213sd(xmmA, xmmB, xmmC); - cc.vfmsub213ss(xmmA, xmmB, xmmC); - cc.vfmsub231pd(xmmA, xmmB, xmmC); - cc.vfmsub231pd(ymmA, ymmB, ymmC); - cc.vfmsub231ps(xmmA, xmmB, xmmC); - cc.vfmsub231ps(ymmA, ymmB, ymmC); - cc.vfmsub231sd(xmmA, xmmB, xmmC); - cc.vfmsub231ss(xmmA, xmmB, xmmC); - cc.vfmsubadd132pd(xmmA, xmmB, xmmC); - cc.vfmsubadd132pd(ymmA, ymmB, ymmC); - cc.vfmsubadd132ps(xmmA, xmmB, xmmC); - cc.vfmsubadd132ps(ymmA, ymmB, ymmC); - cc.vfmsubadd213pd(xmmA, xmmB, xmmC); - cc.vfmsubadd213pd(ymmA, ymmB, ymmC); - cc.vfmsubadd213ps(xmmA, xmmB, xmmC); - cc.vfmsubadd213ps(ymmA, ymmB, ymmC); - cc.vfmsubadd231pd(xmmA, xmmB, xmmC); - cc.vfmsubadd231pd(ymmA, ymmB, ymmC); - cc.vfmsubadd231ps(xmmA, xmmB, xmmC); - cc.vfmsubadd231ps(ymmA, ymmB, ymmC); - cc.vfnmadd132pd(xmmA, xmmB, xmmC); - cc.vfnmadd132pd(ymmA, ymmB, ymmC); - cc.vfnmadd132ps(xmmA, xmmB, xmmC); - cc.vfnmadd132ps(ymmA, ymmB, ymmC); - cc.vfnmadd132sd(xmmA, xmmB, xmmC); - cc.vfnmadd132ss(xmmA, xmmB, xmmC); - cc.vfnmadd213pd(xmmA, xmmB, xmmC); - cc.vfnmadd213pd(ymmA, ymmB, ymmC); - cc.vfnmadd213ps(xmmA, xmmB, xmmC); - cc.vfnmadd213ps(ymmA, ymmB, ymmC); - cc.vfnmadd213sd(xmmA, xmmB, xmmC); - cc.vfnmadd213ss(xmmA, xmmB, xmmC); - cc.vfnmadd231pd(xmmA, xmmB, xmmC); - cc.vfnmadd231pd(ymmA, ymmB, ymmC); - cc.vfnmadd231ps(xmmA, xmmB, xmmC); - cc.vfnmadd231ps(ymmA, ymmB, ymmC); - cc.vfnmadd231sd(xmmA, xmmB, xmmC); - cc.vfnmadd231ss(xmmA, xmmB, xmmC); - cc.vfnmsub132pd(xmmA, xmmB, xmmC); - cc.vfnmsub132pd(ymmA, ymmB, ymmC); - cc.vfnmsub132ps(xmmA, xmmB, xmmC); - cc.vfnmsub132ps(ymmA, ymmB, ymmC); - cc.vfnmsub132sd(xmmA, xmmB, xmmC); - cc.vfnmsub132ss(xmmA, xmmB, xmmC); - cc.vfnmsub213pd(xmmA, xmmB, xmmC); - cc.vfnmsub213pd(ymmA, ymmB, ymmC); - cc.vfnmsub213ps(xmmA, xmmB, xmmC); - cc.vfnmsub213ps(ymmA, ymmB, ymmC); - cc.vfnmsub213sd(xmmA, xmmB, xmmC); - cc.vfnmsub213ss(xmmA, xmmB, xmmC); - cc.vfnmsub231pd(xmmA, xmmB, xmmC); - cc.vfnmsub231pd(ymmA, ymmB, ymmC); - cc.vfnmsub231ps(xmmA, xmmB, xmmC); - cc.vfnmsub231ps(ymmA, ymmB, ymmC); - cc.vfnmsub231sd(xmmA, xmmB, xmmC); - cc.vfnmsub231ss(xmmA, xmmB, xmmC); - } - else { - x86::Mem m = x86::ptr(gpz); - x86::Mem m128 = x86::xmmword_ptr(gpz); - x86::Mem m256 = x86::xmmword_ptr(gpz); - x86::Mem vx_ptr = x86::ptr(gpz, xmmD); - x86::Mem vy_ptr = x86::ptr(gpz, ymmD); - - cc.vaddpd(xmmA, xmmB, m); - cc.vaddpd(ymmA, ymmB, m); - cc.vaddps(xmmA, xmmB, m); - cc.vaddps(ymmA, ymmB, m); - cc.vaddsd(xmmA, xmmB, m); - cc.vaddss(xmmA, xmmB, m); - cc.vaddsubpd(xmmA, xmmB, m); - cc.vaddsubpd(ymmA, ymmB, m); - cc.vaddsubps(xmmA, xmmB, m); - cc.vaddsubps(ymmA, ymmB, m); - cc.vandpd(xmmA, xmmB, m); - cc.vandpd(ymmA, ymmB, m); - cc.vandps(xmmA, xmmB, m); - cc.vandps(ymmA, ymmB, m); - cc.vandnpd(xmmA, xmmB, m); - cc.vandnpd(ymmA, ymmB, m); - cc.vandnps(xmmA, xmmB, m); - cc.vandnps(ymmA, ymmB, m); - cc.vblendpd(xmmA, xmmB, m, 0); - cc.vblendpd(ymmA, ymmB, m, 0); - cc.vblendps(xmmA, xmmB, m, 0); - cc.vblendps(ymmA, ymmB, m, 0); - cc.vblendvpd(xmmA, xmmB, m, xmmA); - cc.vblendvpd(ymmA, ymmB, m, ymmA); - cc.vbroadcastf128(ymmA, m); - cc.vbroadcastsd(ymmA, m); - cc.vbroadcastss(xmmA, m); - cc.vbroadcastss(ymmA, m); - cc.vcmppd(xmmA, xmmB, m, 0); - cc.vcmppd(ymmA, ymmB, m, 0); - cc.vcmpps(xmmA, xmmB, m, 0); - cc.vcmpps(ymmA, ymmB, m, 0); - cc.vcmpsd(xmmA, xmmB, m, 0); - cc.vcmpss(xmmA, xmmB, m, 0); - cc.vcomisd(xmmA, m); - cc.vcomiss(xmmA, m); - cc.vcvtdq2pd(xmmA, m); - cc.vcvtdq2pd(ymmA, m); - cc.vcvtdq2ps(xmmA, m); - cc.vcvtdq2ps(ymmA, m); - cc.vcvtpd2dq(xmmA, m128); - cc.vcvtpd2dq(xmmA, m256); - cc.vcvtpd2ps(xmmA, m128); - cc.vcvtpd2ps(xmmA, m256); - cc.vcvtps2dq(xmmA, m); - cc.vcvtps2dq(ymmA, m); - cc.vcvtps2pd(xmmA, m); - cc.vcvtps2pd(ymmA, m); - cc.vcvtsd2si(gpd, m); - cc.vcvtsd2ss(xmmA, xmmB, m); - cc.vcvtsi2sd(xmmA, xmmB, m); - cc.vcvtsi2ss(xmmA, xmmB, m); - cc.vcvtss2sd(xmmA, xmmB, m); - cc.vcvtss2si(gpd, m); - cc.vcvttpd2dq(xmmA, m128); - cc.vcvttpd2dq(xmmA, m256); - cc.vcvttps2dq(xmmA, m); - cc.vcvttps2dq(ymmA, m); - cc.vcvttsd2si(gpd, m); - cc.vcvttss2si(gpd, m); - cc.vdivpd(xmmA, xmmB, m); - cc.vdivpd(ymmA, ymmB, m); - cc.vdivps(xmmA, xmmB, m); - cc.vdivps(ymmA, ymmB, m); - cc.vdivsd(xmmA, xmmB, m); - cc.vdivss(xmmA, xmmB, m); - cc.vdppd(xmmA, xmmB, m, 0); - cc.vdpps(xmmA, xmmB, m, 0); - cc.vdpps(ymmA, ymmB, m, 0); - cc.vextractf128(m, ymmB, 0); - cc.vextractps(m, xmmB, 0); - cc.vhaddpd(xmmA, xmmB, m); - cc.vhaddpd(ymmA, ymmB, m); - cc.vhaddps(xmmA, xmmB, m); - cc.vhaddps(ymmA, ymmB, m); - cc.vhsubpd(xmmA, xmmB, m); - cc.vhsubpd(ymmA, ymmB, m); - cc.vhsubps(xmmA, xmmB, m); - cc.vhsubps(ymmA, ymmB, m); - cc.vinsertf128(ymmA, ymmB, m, 0); - cc.vinsertps(xmmA, xmmB, m, 0); - cc.vlddqu(xmmA, m); - cc.vlddqu(ymmA, m); - cc.vmaskmovps(xmmA, xmmB, m); - cc.vmaskmovps(ymmA, ymmB, m); - cc.vmaskmovps(m, xmmB, xmmC); - cc.vmaskmovps(m, ymmB, ymmC); - cc.vmaskmovpd(xmmA, xmmB, m); - cc.vmaskmovpd(ymmA, ymmB, m); - cc.vmaskmovpd(m, xmmB, xmmC); - cc.vmaskmovpd(m, ymmB, ymmC); - cc.vmaxpd(xmmA, xmmB, m); - cc.vmaxpd(ymmA, ymmB, m); - cc.vmaxps(xmmA, xmmB, m); - cc.vmaxps(ymmA, ymmB, m); - cc.vmaxsd(xmmA, xmmB, m); - cc.vmaxss(xmmA, xmmB, m); - cc.vminpd(xmmA, xmmB, m); - cc.vminpd(ymmA, ymmB, m); - cc.vminps(xmmA, xmmB, m); - cc.vminps(ymmA, ymmB, m); - cc.vminsd(xmmA, xmmB, m); - cc.vminss(xmmA, xmmB, m); - cc.vmovapd(xmmA, m); - cc.vmovapd(m, xmmB); - cc.vmovapd(ymmA, m); - cc.vmovapd(m, ymmB); - cc.vmovaps(xmmA, m); - cc.vmovaps(m, xmmB); - cc.vmovaps(ymmA, m); - cc.vmovaps(m, ymmB); - cc.vmovd(xmmA, m); - cc.vmovd(m, xmmB); - cc.vmovddup(xmmA, m); - cc.vmovddup(ymmA, m); - cc.vmovdqa(xmmA, m); - cc.vmovdqa(m, xmmB); - cc.vmovdqa(ymmA, m); - cc.vmovdqa(m, ymmB); - cc.vmovdqu(xmmA, m); - cc.vmovdqu(m, xmmB); - cc.vmovdqu(ymmA, m); - cc.vmovdqu(m, ymmB); - cc.vmovhpd(xmmA, xmmB, m); - cc.vmovhps(xmmA, xmmB, m); - cc.vmovhps(m, xmmB); - cc.vmovlpd(xmmA, xmmB, m); - cc.vmovlpd(m, xmmB); - cc.vmovlps(xmmA, xmmB, m); - cc.vmovlps(m, xmmB); - cc.vmovntdq(m, xmmB); - cc.vmovntdq(m, ymmB); - cc.vmovntdqa(xmmA, m); - cc.vmovntpd(m, xmmB); - cc.vmovntpd(m, ymmB); - cc.vmovntps(m, xmmB); - cc.vmovntps(m, ymmB); - cc.vmovsd(xmmA, m); - cc.vmovsd(m, xmmB); - cc.vmovshdup(xmmA, m); - cc.vmovshdup(ymmA, m); - cc.vmovsldup(xmmA, m); - cc.vmovsldup(ymmA, m); - cc.vmovss(xmmA, m); - cc.vmovss(m, xmmB); - cc.vmovupd(xmmA, m); - cc.vmovupd(m, xmmB); - cc.vmovupd(ymmA, m); - cc.vmovupd(m, ymmB); - cc.vmovups(xmmA, m); - cc.vmovups(m, xmmB); - cc.vmovups(ymmA, m); - cc.vmovups(m, ymmB); - cc.vmpsadbw(xmmA, xmmB, m, 0); - cc.vmulpd(xmmA, xmmB, m); - cc.vmulpd(ymmA, ymmB, m); - cc.vmulps(xmmA, xmmB, m); - cc.vmulps(ymmA, ymmB, m); - cc.vmulsd(xmmA, xmmB, m); - cc.vmulss(xmmA, xmmB, m); - cc.vorpd(xmmA, xmmB, m); - cc.vorpd(ymmA, ymmB, m); - cc.vorps(xmmA, xmmB, m); - cc.vorps(ymmA, ymmB, m); - cc.vpabsb(xmmA, m); - cc.vpabsd(xmmA, m); - cc.vpabsw(xmmA, m); - cc.vpackssdw(xmmA, xmmB, m); - cc.vpacksswb(xmmA, xmmB, m); - cc.vpackusdw(xmmA, xmmB, m); - cc.vpackuswb(xmmA, xmmB, m); - cc.vpaddb(xmmA, xmmB, m); - cc.vpaddd(xmmA, xmmB, m); - cc.vpaddq(xmmA, xmmB, m); - cc.vpaddw(xmmA, xmmB, m); - cc.vpaddsb(xmmA, xmmB, m); - cc.vpaddsw(xmmA, xmmB, m); - cc.vpaddusb(xmmA, xmmB, m); - cc.vpaddusw(xmmA, xmmB, m); - cc.vpalignr(xmmA, xmmB, m, 0); - cc.vpand(xmmA, xmmB, m); - cc.vpandn(xmmA, xmmB, m); - cc.vpavgb(xmmA, xmmB, m); - cc.vpavgw(xmmA, xmmB, m); - cc.vpblendvb(xmmA, xmmB, m, xmmA); - cc.vpblendw(xmmA, xmmB, m, 0); - cc.vpcmpeqb(xmmA, xmmB, m); - cc.vpcmpeqd(xmmA, xmmB, m); - cc.vpcmpeqq(xmmA, xmmB, m); - cc.vpcmpeqw(xmmA, xmmB, m); - cc.vpcmpgtb(xmmA, xmmB, m); - cc.vpcmpgtd(xmmA, xmmB, m); - cc.vpcmpgtq(xmmA, xmmB, m); - cc.vpcmpgtw(xmmA, xmmB, m); - cc.vpermilpd(xmmA, xmmB, m); - cc.vpermilpd(ymmA, ymmB, m); - cc.vpermilpd(xmmA, m, 0); - cc.vpermilpd(ymmA, m, 0); - cc.vpermilps(xmmA, xmmB, m); - cc.vpermilps(ymmA, ymmB, m); - cc.vpermilps(xmmA, m, 0); - cc.vpermilps(ymmA, m, 0); - cc.vperm2f128(ymmA, ymmB, m, 0); - cc.vpextrb(m, xmmB, 0); - cc.vpextrd(m, xmmB, 0); - if (cc.is64Bit()) cc.vpextrq(m, xmmB, 0); - cc.vpextrw(m, xmmB, 0); - cc.vphaddd(xmmA, xmmB, m); - cc.vphaddsw(xmmA, xmmB, m); - cc.vphaddw(xmmA, xmmB, m); - cc.vphminposuw(xmmA, m); - cc.vphsubd(xmmA, xmmB, m); - cc.vphsubsw(xmmA, xmmB, m); - cc.vphsubw(xmmA, xmmB, m); - cc.vpinsrb(xmmA, xmmB, m, 0); - cc.vpinsrd(xmmA, xmmB, m, 0); - cc.vpinsrw(xmmA, xmmB, m, 0); - cc.vpmaddubsw(xmmA, xmmB, m); - cc.vpmaddwd(xmmA, xmmB, m); - cc.vpmaxsb(xmmA, xmmB, m); - cc.vpmaxsd(xmmA, xmmB, m); - cc.vpmaxsw(xmmA, xmmB, m); - cc.vpmaxub(xmmA, xmmB, m); - cc.vpmaxud(xmmA, xmmB, m); - cc.vpmaxuw(xmmA, xmmB, m); - cc.vpminsb(xmmA, xmmB, m); - cc.vpminsd(xmmA, xmmB, m); - cc.vpminsw(xmmA, xmmB, m); - cc.vpminub(xmmA, xmmB, m); - cc.vpminud(xmmA, xmmB, m); - cc.vpminuw(xmmA, xmmB, m); - cc.vpmovsxbd(xmmA, m); - cc.vpmovsxbq(xmmA, m); - cc.vpmovsxbw(xmmA, m); - cc.vpmovsxdq(xmmA, m); - cc.vpmovsxwd(xmmA, m); - cc.vpmovsxwq(xmmA, m); - cc.vpmovzxbd(xmmA, m); - cc.vpmovzxbq(xmmA, m); - cc.vpmovzxbw(xmmA, m); - cc.vpmovzxdq(xmmA, m); - cc.vpmovzxwd(xmmA, m); - cc.vpmovzxwq(xmmA, m); - cc.vpmuldq(xmmA, xmmB, m); - cc.vpmulhrsw(xmmA, xmmB, m); - cc.vpmulhuw(xmmA, xmmB, m); - cc.vpmulhw(xmmA, xmmB, m); - cc.vpmulld(xmmA, xmmB, m); - cc.vpmullw(xmmA, xmmB, m); - cc.vpmuludq(xmmA, xmmB, m); - cc.vpor(xmmA, xmmB, m); - cc.vpsadbw(xmmA, xmmB, m); - cc.vpshufb(xmmA, xmmB, m); - cc.vpshufd(xmmA, m, 0); - cc.vpshufhw(xmmA, m, 0); - cc.vpshuflw(xmmA, m, 0); - cc.vpsignb(xmmA, xmmB, m); - cc.vpsignd(xmmA, xmmB, m); - cc.vpsignw(xmmA, xmmB, m); - cc.vpslld(xmmA, xmmB, m); - cc.vpsllq(xmmA, xmmB, m); - cc.vpsllw(xmmA, xmmB, m); - cc.vpsrad(xmmA, xmmB, m); - cc.vpsraw(xmmA, xmmB, m); - cc.vpsrld(xmmA, xmmB, m); - cc.vpsrlq(xmmA, xmmB, m); - cc.vpsrlw(xmmA, xmmB, m); - cc.vpsubb(xmmA, xmmB, m); - cc.vpsubd(xmmA, xmmB, m); - cc.vpsubq(xmmA, xmmB, m); - cc.vpsubw(xmmA, xmmB, m); - cc.vpsubsb(xmmA, xmmB, m); - cc.vpsubsw(xmmA, xmmB, m); - cc.vpsubusb(xmmA, xmmB, m); - cc.vpsubusw(xmmA, xmmB, m); - cc.vptest(xmmA, m); - cc.vptest(ymmA, m); - cc.vpunpckhbw(xmmA, xmmB, m); - cc.vpunpckhdq(xmmA, xmmB, m); - cc.vpunpckhqdq(xmmA, xmmB, m); - cc.vpunpckhwd(xmmA, xmmB, m); - cc.vpunpcklbw(xmmA, xmmB, m); - cc.vpunpckldq(xmmA, xmmB, m); - cc.vpunpcklqdq(xmmA, xmmB, m); - cc.vpunpcklwd(xmmA, xmmB, m); - cc.vpxor(xmmA, xmmB, m); - cc.vrcpps(xmmA, m); - cc.vrcpps(ymmA, m); - cc.vrcpss(xmmA, xmmB, m); - cc.vrsqrtps(xmmA, m); - cc.vrsqrtps(ymmA, m); - cc.vrsqrtss(xmmA, xmmB, m); - cc.vroundpd(xmmA, m, 0); - cc.vroundpd(ymmA, m, 0); - cc.vroundps(xmmA, m, 0); - cc.vroundps(ymmA, m, 0); - cc.vroundsd(xmmA, xmmB, m, 0); - cc.vroundss(xmmA, xmmB, m, 0); - cc.vshufpd(xmmA, xmmB, m, 0); - cc.vshufpd(ymmA, ymmB, m, 0); - cc.vshufps(xmmA, xmmB, m, 0); - cc.vshufps(ymmA, ymmB, m, 0); - cc.vsqrtpd(xmmA, m); - cc.vsqrtpd(ymmA, m); - cc.vsqrtps(xmmA, m); - cc.vsqrtps(ymmA, m); - cc.vsqrtsd(xmmA, xmmB, m); - cc.vsqrtss(xmmA, xmmB, m); - cc.vsubpd(xmmA, xmmB, m); - cc.vsubpd(ymmA, ymmB, m); - cc.vsubps(xmmA, xmmB, m); - cc.vsubps(ymmA, ymmB, m); - cc.vsubsd(xmmA, xmmB, m); - cc.vsubss(xmmA, xmmB, m); - cc.vtestps(xmmA, m); - cc.vtestps(ymmA, m); - cc.vtestpd(xmmA, m); - cc.vtestpd(ymmA, m); - cc.vucomisd(xmmA, m); - cc.vucomiss(xmmA, m); - cc.vunpckhpd(xmmA, xmmB, m); - cc.vunpckhpd(ymmA, ymmB, m); - cc.vunpckhps(xmmA, xmmB, m); - cc.vunpckhps(ymmA, ymmB, m); - cc.vunpcklpd(xmmA, xmmB, m); - cc.vunpcklpd(ymmA, ymmB, m); - cc.vunpcklps(xmmA, xmmB, m); - cc.vunpcklps(ymmA, ymmB, m); - cc.vxorpd(xmmA, xmmB, m); - cc.vxorpd(ymmA, ymmB, m); - cc.vxorps(xmmA, xmmB, m); - cc.vxorps(ymmA, ymmB, m); - - // AVX+AESNI. - cc.vaesdec(xmmA, xmmB, m); - cc.vaesdeclast(xmmA, xmmB, m); - cc.vaesenc(xmmA, xmmB, m); - cc.vaesenclast(xmmA, xmmB, m); - cc.vaesimc(xmmA, m); - cc.vaeskeygenassist(xmmA, m, 0); - - // AVX+PCLMULQDQ. - cc.vpclmulqdq(xmmA, xmmB, m, 0); - - // AVX2. - cc.vbroadcasti128(ymmA, m); - cc.vextracti128(m, ymmB, 0); - cc.vgatherdpd(xmmA, vx_ptr, xmmC); - cc.vgatherdpd(ymmA, vx_ptr, ymmC); - cc.vgatherdps(xmmA, vx_ptr, xmmC); - cc.vgatherdps(ymmA, vy_ptr, ymmC); - cc.vgatherqpd(xmmA, vx_ptr, xmmC); - cc.vgatherqpd(ymmA, vy_ptr, ymmC); - cc.vgatherqps(xmmA, vx_ptr, xmmC); - cc.vgatherqps(xmmA, vy_ptr, xmmC); - cc.vinserti128(ymmA, ymmB, m, 0); - cc.vmovntdqa(ymmA, m); - cc.vmpsadbw(ymmA, ymmB, m, 0); - cc.vpabsb(ymmA, m); - cc.vpabsd(ymmA, m); - cc.vpabsw(ymmA, m); - cc.vpackssdw(ymmA, ymmB, m); - cc.vpacksswb(ymmA, ymmB, m); - cc.vpackusdw(ymmA, ymmB, m); - cc.vpackuswb(ymmA, ymmB, m); - cc.vpaddb(ymmA, ymmB, m); - cc.vpaddd(ymmA, ymmB, m); - cc.vpaddq(ymmA, ymmB, m); - cc.vpaddw(ymmA, ymmB, m); - cc.vpaddsb(ymmA, ymmB, m); - cc.vpaddsw(ymmA, ymmB, m); - cc.vpaddusb(ymmA, ymmB, m); - cc.vpaddusw(ymmA, ymmB, m); - cc.vpalignr(ymmA, ymmB, m, 0); - cc.vpand(ymmA, ymmB, m); - cc.vpandn(ymmA, ymmB, m); - cc.vpavgb(ymmA, ymmB, m); - cc.vpavgw(ymmA, ymmB, m); - cc.vpblendd(xmmA, xmmB, m, 0); - cc.vpblendd(ymmA, ymmB, m, 0); - cc.vpblendvb(ymmA, ymmB, m, ymmA); - cc.vpblendw(ymmA, ymmB, m, 0); - cc.vpbroadcastb(xmmA, m); - cc.vpbroadcastb(ymmA, m); - cc.vpbroadcastd(xmmA, m); - cc.vpbroadcastd(ymmA, m); - cc.vpbroadcastq(xmmA, m); - cc.vpbroadcastq(ymmA, m); - cc.vpbroadcastw(xmmA, m); - cc.vpbroadcastw(ymmA, m); - cc.vpcmpeqb(ymmA, ymmB, m); - cc.vpcmpeqd(ymmA, ymmB, m); - cc.vpcmpeqq(ymmA, ymmB, m); - cc.vpcmpeqw(ymmA, ymmB, m); - cc.vpcmpgtb(ymmA, ymmB, m); - cc.vpcmpgtd(ymmA, ymmB, m); - cc.vpcmpgtq(ymmA, ymmB, m); - cc.vpcmpgtw(ymmA, ymmB, m); - cc.vperm2i128(ymmA, ymmB, m, 0); - cc.vpermd(ymmA, ymmB, m); - cc.vpermps(ymmA, ymmB, m); - cc.vpermpd(ymmA, m, 0); - cc.vpermq(ymmA, m, 0); - cc.vpgatherdd(xmmA, vx_ptr, xmmC); - cc.vpgatherdd(ymmA, vy_ptr, ymmC); - cc.vpgatherdq(xmmA, vx_ptr, xmmC); - cc.vpgatherdq(ymmA, vx_ptr, ymmC); - cc.vpgatherqd(xmmA, vx_ptr, xmmC); - cc.vpgatherqd(xmmA, vy_ptr, xmmC); - cc.vpgatherqq(xmmA, vx_ptr, xmmC); - cc.vpgatherqq(ymmA, vy_ptr, ymmC); - cc.vpmovsxbd(ymmA, m); - cc.vpmovsxbq(ymmA, m); - cc.vpmovsxbw(ymmA, m); - cc.vpmovsxdq(ymmA, m); - cc.vpmovsxwd(ymmA, m); - cc.vpmovsxwq(ymmA, m); - cc.vpmovzxbd(ymmA, m); - cc.vpmovzxbq(ymmA, m); - cc.vpmovzxbw(ymmA, m); - cc.vpmovzxdq(ymmA, m); - cc.vpmovzxwd(ymmA, m); - cc.vpmovzxwq(ymmA, m); - cc.vpshufd(ymmA, m, 0); - cc.vpshufhw(ymmA, m, 0); - cc.vpshuflw(ymmA, m, 0); - cc.vphaddd(ymmA, ymmB, m); - cc.vphaddsw(ymmA, ymmB, m); - cc.vphaddw(ymmA, ymmB, m); - cc.vphsubd(ymmA, ymmB, m); - cc.vphsubsw(ymmA, ymmB, m); - cc.vphsubw(ymmA, ymmB, m); - cc.vpmaddubsw(ymmA, ymmB, m); - cc.vpmaddwd(ymmA, ymmB, m); - cc.vpmaskmovd(m, xmmB, xmmC); - cc.vpmaskmovd(m, ymmB, ymmC); - cc.vpmaskmovd(xmmA, xmmB, m); - cc.vpmaskmovd(ymmA, ymmB, m); - cc.vpmaskmovq(m, xmmB, xmmC); - cc.vpmaskmovq(m, ymmB, ymmC); - cc.vpmaskmovq(xmmA, xmmB, m); - cc.vpmaskmovq(ymmA, ymmB, m); - cc.vpmaxsb(ymmA, ymmB, m); - cc.vpmaxsd(ymmA, ymmB, m); - cc.vpmaxsw(ymmA, ymmB, m); - cc.vpmaxub(ymmA, ymmB, m); - cc.vpmaxud(ymmA, ymmB, m); - cc.vpmaxuw(ymmA, ymmB, m); - cc.vpminsb(ymmA, ymmB, m); - cc.vpminsd(ymmA, ymmB, m); - cc.vpminsw(ymmA, ymmB, m); - cc.vpminub(ymmA, ymmB, m); - cc.vpminud(ymmA, ymmB, m); - cc.vpminuw(ymmA, ymmB, m); - cc.vpmuldq(ymmA, ymmB, m); - cc.vpmulhrsw(ymmA, ymmB, m); - cc.vpmulhuw(ymmA, ymmB, m); - cc.vpmulhw(ymmA, ymmB, m); - cc.vpmulld(ymmA, ymmB, m); - cc.vpmullw(ymmA, ymmB, m); - cc.vpmuludq(ymmA, ymmB, m); - cc.vpor(ymmA, ymmB, m); - cc.vpsadbw(ymmA, ymmB, m); - cc.vpshufb(ymmA, ymmB, m); - cc.vpsignb(ymmA, ymmB, m); - cc.vpsignd(ymmA, ymmB, m); - cc.vpsignw(ymmA, ymmB, m); - cc.vpslld(ymmA, ymmB, m); - cc.vpsllq(ymmA, ymmB, m); - cc.vpsllvd(xmmA, xmmB, m); - cc.vpsllvd(ymmA, ymmB, m); - cc.vpsllvq(xmmA, xmmB, m); - cc.vpsllvq(ymmA, ymmB, m); - cc.vpsllw(ymmA, ymmB, m); - cc.vpsrad(ymmA, ymmB, m); - cc.vpsravd(xmmA, xmmB, m); - cc.vpsravd(ymmA, ymmB, m); - cc.vpsraw(ymmA, ymmB, m); - cc.vpsrld(ymmA, ymmB, m); - cc.vpsrlq(ymmA, ymmB, m); - cc.vpsrlvd(xmmA, xmmB, m); - cc.vpsrlvd(ymmA, ymmB, m); - cc.vpsrlvq(xmmA, xmmB, m); - cc.vpsrlvq(ymmA, ymmB, m); - cc.vpsrlw(ymmA, ymmB, m); - cc.vpsubb(ymmA, ymmB, m); - cc.vpsubd(ymmA, ymmB, m); - cc.vpsubq(ymmA, ymmB, m); - cc.vpsubsb(ymmA, ymmB, m); - cc.vpsubsw(ymmA, ymmB, m); - cc.vpsubusb(ymmA, ymmB, m); - cc.vpsubusw(ymmA, ymmB, m); - cc.vpsubw(ymmA, ymmB, m); - cc.vpunpckhbw(ymmA, ymmB, m); - cc.vpunpckhdq(ymmA, ymmB, m); - cc.vpunpckhqdq(ymmA, ymmB, m); - cc.vpunpckhwd(ymmA, ymmB, m); - cc.vpunpcklbw(ymmA, ymmB, m); - cc.vpunpckldq(ymmA, ymmB, m); - cc.vpunpcklqdq(ymmA, ymmB, m); - cc.vpunpcklwd(ymmA, ymmB, m); - cc.vpxor(ymmA, ymmB, m); - } + cc.vaddpd(xmmA, xmmB, m); + cc.vaddpd(ymmA, ymmB, m); + cc.vaddps(xmmA, xmmB, m); + cc.vaddps(ymmA, ymmB, m); + cc.vaddsd(xmmA, xmmB, m); + cc.vaddss(xmmA, xmmB, m); + cc.vaddsubpd(xmmA, xmmB, m); + cc.vaddsubpd(ymmA, ymmB, m); + cc.vaddsubps(xmmA, xmmB, m); + cc.vaddsubps(ymmA, ymmB, m); + cc.vandpd(xmmA, xmmB, m); + cc.vandpd(ymmA, ymmB, m); + cc.vandps(xmmA, xmmB, m); + cc.vandps(ymmA, ymmB, m); + cc.vandnpd(xmmA, xmmB, m); + cc.vandnpd(ymmA, ymmB, m); + cc.vandnps(xmmA, xmmB, m); + cc.vandnps(ymmA, ymmB, m); + cc.vblendpd(xmmA, xmmB, m, 0); + cc.vblendpd(ymmA, ymmB, m, 0); + cc.vblendps(xmmA, xmmB, m, 0); + cc.vblendps(ymmA, ymmB, m, 0); + cc.vblendvpd(xmmA, xmmB, m, xmmA); + cc.vblendvpd(ymmA, ymmB, m, ymmA); + cc.vbroadcastf128(ymmA, m); + cc.vbroadcastsd(ymmA, m); + cc.vbroadcastss(xmmA, m); + cc.vbroadcastss(ymmA, m); + cc.vcmppd(xmmA, xmmB, m, 0); + cc.vcmppd(ymmA, ymmB, m, 0); + cc.vcmpps(xmmA, xmmB, m, 0); + cc.vcmpps(ymmA, ymmB, m, 0); + cc.vcmpsd(xmmA, xmmB, m, 0); + cc.vcmpss(xmmA, xmmB, m, 0); + cc.vcomisd(xmmA, m); + cc.vcomiss(xmmA, m); + cc.vcvtdq2pd(xmmA, m); + cc.vcvtdq2pd(ymmA, m); + cc.vcvtdq2ps(xmmA, m); + cc.vcvtdq2ps(ymmA, m); + cc.vcvtpd2dq(xmmA, m128); + cc.vcvtpd2dq(xmmA, m256); + cc.vcvtpd2ps(xmmA, m128); + cc.vcvtpd2ps(xmmA, m256); + cc.vcvtps2dq(xmmA, m); + cc.vcvtps2dq(ymmA, m); + cc.vcvtps2pd(xmmA, m); + cc.vcvtps2pd(ymmA, m); + cc.vcvtsd2si(gpd, m); + cc.vcvtsd2ss(xmmA, xmmB, m); + cc.vcvtsi2sd(xmmA, xmmB, m); + cc.vcvtsi2ss(xmmA, xmmB, m); + cc.vcvtss2sd(xmmA, xmmB, m); + cc.vcvtss2si(gpd, m); + cc.vcvttpd2dq(xmmA, m128); + cc.vcvttpd2dq(xmmA, m256); + cc.vcvttps2dq(xmmA, m); + cc.vcvttps2dq(ymmA, m); + cc.vcvttsd2si(gpd, m); + cc.vcvttss2si(gpd, m); + cc.vdivpd(xmmA, xmmB, m); + cc.vdivpd(ymmA, ymmB, m); + cc.vdivps(xmmA, xmmB, m); + cc.vdivps(ymmA, ymmB, m); + cc.vdivsd(xmmA, xmmB, m); + cc.vdivss(xmmA, xmmB, m); + cc.vdppd(xmmA, xmmB, m, 0); + cc.vdpps(xmmA, xmmB, m, 0); + cc.vdpps(ymmA, ymmB, m, 0); + cc.vextractf128(m, ymmB, 0); + cc.vextractps(m, xmmB, 0); + cc.vhaddpd(xmmA, xmmB, m); + cc.vhaddpd(ymmA, ymmB, m); + cc.vhaddps(xmmA, xmmB, m); + cc.vhaddps(ymmA, ymmB, m); + cc.vhsubpd(xmmA, xmmB, m); + cc.vhsubpd(ymmA, ymmB, m); + cc.vhsubps(xmmA, xmmB, m); + cc.vhsubps(ymmA, ymmB, m); + cc.vinsertf128(ymmA, ymmB, m, 0); + cc.vinsertps(xmmA, xmmB, m, 0); + cc.vlddqu(xmmA, m); + cc.vlddqu(ymmA, m); + cc.vmaskmovps(xmmA, xmmB, m); + cc.vmaskmovps(ymmA, ymmB, m); + cc.vmaskmovps(m, xmmB, xmmC); + cc.vmaskmovps(m, ymmB, ymmC); + cc.vmaskmovpd(xmmA, xmmB, m); + cc.vmaskmovpd(ymmA, ymmB, m); + cc.vmaskmovpd(m, xmmB, xmmC); + cc.vmaskmovpd(m, ymmB, ymmC); + cc.vmaxpd(xmmA, xmmB, m); + cc.vmaxpd(ymmA, ymmB, m); + cc.vmaxps(xmmA, xmmB, m); + cc.vmaxps(ymmA, ymmB, m); + cc.vmaxsd(xmmA, xmmB, m); + cc.vmaxss(xmmA, xmmB, m); + cc.vminpd(xmmA, xmmB, m); + cc.vminpd(ymmA, ymmB, m); + cc.vminps(xmmA, xmmB, m); + cc.vminps(ymmA, ymmB, m); + cc.vminsd(xmmA, xmmB, m); + cc.vminss(xmmA, xmmB, m); + cc.vmovapd(xmmA, m); + cc.vmovapd(m, xmmB); + cc.vmovapd(ymmA, m); + cc.vmovapd(m, ymmB); + cc.vmovaps(xmmA, m); + cc.vmovaps(m, xmmB); + cc.vmovaps(ymmA, m); + cc.vmovaps(m, ymmB); + cc.vmovd(xmmA, m); + cc.vmovd(m, xmmB); + cc.vmovddup(xmmA, m); + cc.vmovddup(ymmA, m); + cc.vmovdqa(xmmA, m); + cc.vmovdqa(m, xmmB); + cc.vmovdqa(ymmA, m); + cc.vmovdqa(m, ymmB); + cc.vmovdqu(xmmA, m); + cc.vmovdqu(m, xmmB); + cc.vmovdqu(ymmA, m); + cc.vmovdqu(m, ymmB); + cc.vmovhpd(xmmA, xmmB, m); + cc.vmovhps(xmmA, xmmB, m); + cc.vmovhps(m, xmmB); + cc.vmovlpd(xmmA, xmmB, m); + cc.vmovlpd(m, xmmB); + cc.vmovlps(xmmA, xmmB, m); + cc.vmovlps(m, xmmB); + cc.vmovntdq(m, xmmB); + cc.vmovntdq(m, ymmB); + cc.vmovntdqa(xmmA, m); + cc.vmovntpd(m, xmmB); + cc.vmovntpd(m, ymmB); + cc.vmovntps(m, xmmB); + cc.vmovntps(m, ymmB); + cc.vmovsd(xmmA, m); + cc.vmovsd(m, xmmB); + cc.vmovshdup(xmmA, m); + cc.vmovshdup(ymmA, m); + cc.vmovsldup(xmmA, m); + cc.vmovsldup(ymmA, m); + cc.vmovss(xmmA, m); + cc.vmovss(m, xmmB); + cc.vmovupd(xmmA, m); + cc.vmovupd(m, xmmB); + cc.vmovupd(ymmA, m); + cc.vmovupd(m, ymmB); + cc.vmovups(xmmA, m); + cc.vmovups(m, xmmB); + cc.vmovups(ymmA, m); + cc.vmovups(m, ymmB); + cc.vmpsadbw(xmmA, xmmB, m, 0); + cc.vmulpd(xmmA, xmmB, m); + cc.vmulpd(ymmA, ymmB, m); + cc.vmulps(xmmA, xmmB, m); + cc.vmulps(ymmA, ymmB, m); + cc.vmulsd(xmmA, xmmB, m); + cc.vmulss(xmmA, xmmB, m); + cc.vorpd(xmmA, xmmB, m); + cc.vorpd(ymmA, ymmB, m); + cc.vorps(xmmA, xmmB, m); + cc.vorps(ymmA, ymmB, m); + cc.vpabsb(xmmA, m); + cc.vpabsd(xmmA, m); + cc.vpabsw(xmmA, m); + cc.vpackssdw(xmmA, xmmB, m); + cc.vpacksswb(xmmA, xmmB, m); + cc.vpackusdw(xmmA, xmmB, m); + cc.vpackuswb(xmmA, xmmB, m); + cc.vpaddb(xmmA, xmmB, m); + cc.vpaddd(xmmA, xmmB, m); + cc.vpaddq(xmmA, xmmB, m); + cc.vpaddw(xmmA, xmmB, m); + cc.vpaddsb(xmmA, xmmB, m); + cc.vpaddsw(xmmA, xmmB, m); + cc.vpaddusb(xmmA, xmmB, m); + cc.vpaddusw(xmmA, xmmB, m); + cc.vpalignr(xmmA, xmmB, m, 0); + cc.vpand(xmmA, xmmB, m); + cc.vpandn(xmmA, xmmB, m); + cc.vpavgb(xmmA, xmmB, m); + cc.vpavgw(xmmA, xmmB, m); + cc.vpblendvb(xmmA, xmmB, m, xmmA); + cc.vpblendw(xmmA, xmmB, m, 0); + cc.vpcmpeqb(xmmA, xmmB, m); + cc.vpcmpeqd(xmmA, xmmB, m); + cc.vpcmpeqq(xmmA, xmmB, m); + cc.vpcmpeqw(xmmA, xmmB, m); + cc.vpcmpgtb(xmmA, xmmB, m); + cc.vpcmpgtd(xmmA, xmmB, m); + cc.vpcmpgtq(xmmA, xmmB, m); + cc.vpcmpgtw(xmmA, xmmB, m); + cc.vpermilpd(xmmA, xmmB, m); + cc.vpermilpd(ymmA, ymmB, m); + cc.vpermilpd(xmmA, m, 0); + cc.vpermilpd(ymmA, m, 0); + cc.vpermilps(xmmA, xmmB, m); + cc.vpermilps(ymmA, ymmB, m); + cc.vpermilps(xmmA, m, 0); + cc.vpermilps(ymmA, m, 0); + cc.vperm2f128(ymmA, ymmB, m, 0); + cc.vpextrb(m, xmmB, 0); + cc.vpextrd(m, xmmB, 0); + if (cc.is64Bit()) cc.vpextrq(m, xmmB, 0); + cc.vpextrw(m, xmmB, 0); + cc.vphaddd(xmmA, xmmB, m); + cc.vphaddsw(xmmA, xmmB, m); + cc.vphaddw(xmmA, xmmB, m); + cc.vphminposuw(xmmA, m); + cc.vphsubd(xmmA, xmmB, m); + cc.vphsubsw(xmmA, xmmB, m); + cc.vphsubw(xmmA, xmmB, m); + cc.vpinsrb(xmmA, xmmB, m, 0); + cc.vpinsrd(xmmA, xmmB, m, 0); + cc.vpinsrw(xmmA, xmmB, m, 0); + cc.vpmaddubsw(xmmA, xmmB, m); + cc.vpmaddwd(xmmA, xmmB, m); + cc.vpmaxsb(xmmA, xmmB, m); + cc.vpmaxsd(xmmA, xmmB, m); + cc.vpmaxsw(xmmA, xmmB, m); + cc.vpmaxub(xmmA, xmmB, m); + cc.vpmaxud(xmmA, xmmB, m); + cc.vpmaxuw(xmmA, xmmB, m); + cc.vpminsb(xmmA, xmmB, m); + cc.vpminsd(xmmA, xmmB, m); + cc.vpminsw(xmmA, xmmB, m); + cc.vpminub(xmmA, xmmB, m); + cc.vpminud(xmmA, xmmB, m); + cc.vpminuw(xmmA, xmmB, m); + cc.vpmovsxbd(xmmA, m); + cc.vpmovsxbq(xmmA, m); + cc.vpmovsxbw(xmmA, m); + cc.vpmovsxdq(xmmA, m); + cc.vpmovsxwd(xmmA, m); + cc.vpmovsxwq(xmmA, m); + cc.vpmovzxbd(xmmA, m); + cc.vpmovzxbq(xmmA, m); + cc.vpmovzxbw(xmmA, m); + cc.vpmovzxdq(xmmA, m); + cc.vpmovzxwd(xmmA, m); + cc.vpmovzxwq(xmmA, m); + cc.vpmuldq(xmmA, xmmB, m); + cc.vpmulhrsw(xmmA, xmmB, m); + cc.vpmulhuw(xmmA, xmmB, m); + cc.vpmulhw(xmmA, xmmB, m); + cc.vpmulld(xmmA, xmmB, m); + cc.vpmullw(xmmA, xmmB, m); + cc.vpmuludq(xmmA, xmmB, m); + cc.vpor(xmmA, xmmB, m); + cc.vpsadbw(xmmA, xmmB, m); + cc.vpshufb(xmmA, xmmB, m); + cc.vpshufd(xmmA, m, 0); + cc.vpshufhw(xmmA, m, 0); + cc.vpshuflw(xmmA, m, 0); + cc.vpsignb(xmmA, xmmB, m); + cc.vpsignd(xmmA, xmmB, m); + cc.vpsignw(xmmA, xmmB, m); + cc.vpslld(xmmA, xmmB, m); + cc.vpsllq(xmmA, xmmB, m); + cc.vpsllw(xmmA, xmmB, m); + cc.vpsrad(xmmA, xmmB, m); + cc.vpsraw(xmmA, xmmB, m); + cc.vpsrld(xmmA, xmmB, m); + cc.vpsrlq(xmmA, xmmB, m); + cc.vpsrlw(xmmA, xmmB, m); + cc.vpsubb(xmmA, xmmB, m); + cc.vpsubd(xmmA, xmmB, m); + cc.vpsubq(xmmA, xmmB, m); + cc.vpsubw(xmmA, xmmB, m); + cc.vpsubsb(xmmA, xmmB, m); + cc.vpsubsw(xmmA, xmmB, m); + cc.vpsubusb(xmmA, xmmB, m); + cc.vpsubusw(xmmA, xmmB, m); + cc.vptest(xmmA, m); + cc.vptest(ymmA, m); + cc.vpunpckhbw(xmmA, xmmB, m); + cc.vpunpckhdq(xmmA, xmmB, m); + cc.vpunpckhqdq(xmmA, xmmB, m); + cc.vpunpckhwd(xmmA, xmmB, m); + cc.vpunpcklbw(xmmA, xmmB, m); + cc.vpunpckldq(xmmA, xmmB, m); + cc.vpunpcklqdq(xmmA, xmmB, m); + cc.vpunpcklwd(xmmA, xmmB, m); + cc.vpxor(xmmA, xmmB, m); + cc.vrcpps(xmmA, m); + cc.vrcpps(ymmA, m); + cc.vrcpss(xmmA, xmmB, m); + cc.vrsqrtps(xmmA, m); + cc.vrsqrtps(ymmA, m); + cc.vrsqrtss(xmmA, xmmB, m); + cc.vroundpd(xmmA, m, 0); + cc.vroundpd(ymmA, m, 0); + cc.vroundps(xmmA, m, 0); + cc.vroundps(ymmA, m, 0); + cc.vroundsd(xmmA, xmmB, m, 0); + cc.vroundss(xmmA, xmmB, m, 0); + cc.vshufpd(xmmA, xmmB, m, 0); + cc.vshufpd(ymmA, ymmB, m, 0); + cc.vshufps(xmmA, xmmB, m, 0); + cc.vshufps(ymmA, ymmB, m, 0); + cc.vsqrtpd(xmmA, m); + cc.vsqrtpd(ymmA, m); + cc.vsqrtps(xmmA, m); + cc.vsqrtps(ymmA, m); + cc.vsqrtsd(xmmA, xmmB, m); + cc.vsqrtss(xmmA, xmmB, m); + cc.vsubpd(xmmA, xmmB, m); + cc.vsubpd(ymmA, ymmB, m); + cc.vsubps(xmmA, xmmB, m); + cc.vsubps(ymmA, ymmB, m); + cc.vsubsd(xmmA, xmmB, m); + cc.vsubss(xmmA, xmmB, m); + cc.vtestps(xmmA, m); + cc.vtestps(ymmA, m); + cc.vtestpd(xmmA, m); + cc.vtestpd(ymmA, m); + cc.vucomisd(xmmA, m); + cc.vucomiss(xmmA, m); + cc.vunpckhpd(xmmA, xmmB, m); + cc.vunpckhpd(ymmA, ymmB, m); + cc.vunpckhps(xmmA, xmmB, m); + cc.vunpckhps(ymmA, ymmB, m); + cc.vunpcklpd(xmmA, xmmB, m); + cc.vunpcklpd(ymmA, ymmB, m); + cc.vunpcklps(xmmA, xmmB, m); + cc.vunpcklps(ymmA, ymmB, m); + cc.vxorpd(xmmA, xmmB, m); + cc.vxorpd(ymmA, ymmB, m); + cc.vxorps(xmmA, xmmB, m); + cc.vxorps(ymmA, ymmB, m); + + // AVX+AESNI. + cc.vaesdec(xmmA, xmmB, m); + cc.vaesdeclast(xmmA, xmmB, m); + cc.vaesenc(xmmA, xmmB, m); + cc.vaesenclast(xmmA, xmmB, m); + cc.vaesimc(xmmA, m); + cc.vaeskeygenassist(xmmA, m, 0); + + // AVX+PCLMULQDQ. + cc.vpclmulqdq(xmmA, xmmB, m, 0); + + // AVX2. + cc.vbroadcasti128(ymmA, m); + cc.vextracti128(m, ymmB, 0); + cc.vgatherdpd(xmmA, vx_ptr, xmmC); + cc.vgatherdpd(ymmA, vx_ptr, ymmC); + cc.vgatherdps(xmmA, vx_ptr, xmmC); + cc.vgatherdps(ymmA, vy_ptr, ymmC); + cc.vgatherqpd(xmmA, vx_ptr, xmmC); + cc.vgatherqpd(ymmA, vy_ptr, ymmC); + cc.vgatherqps(xmmA, vx_ptr, xmmC); + cc.vgatherqps(xmmA, vy_ptr, xmmC); + cc.vinserti128(ymmA, ymmB, m, 0); + cc.vmovntdqa(ymmA, m); + cc.vmpsadbw(ymmA, ymmB, m, 0); + cc.vpabsb(ymmA, m); + cc.vpabsd(ymmA, m); + cc.vpabsw(ymmA, m); + cc.vpackssdw(ymmA, ymmB, m); + cc.vpacksswb(ymmA, ymmB, m); + cc.vpackusdw(ymmA, ymmB, m); + cc.vpackuswb(ymmA, ymmB, m); + cc.vpaddb(ymmA, ymmB, m); + cc.vpaddd(ymmA, ymmB, m); + cc.vpaddq(ymmA, ymmB, m); + cc.vpaddw(ymmA, ymmB, m); + cc.vpaddsb(ymmA, ymmB, m); + cc.vpaddsw(ymmA, ymmB, m); + cc.vpaddusb(ymmA, ymmB, m); + cc.vpaddusw(ymmA, ymmB, m); + cc.vpalignr(ymmA, ymmB, m, 0); + cc.vpand(ymmA, ymmB, m); + cc.vpandn(ymmA, ymmB, m); + cc.vpavgb(ymmA, ymmB, m); + cc.vpavgw(ymmA, ymmB, m); + cc.vpblendd(xmmA, xmmB, m, 0); + cc.vpblendd(ymmA, ymmB, m, 0); + cc.vpblendvb(ymmA, ymmB, m, ymmA); + cc.vpblendw(ymmA, ymmB, m, 0); + cc.vpbroadcastb(xmmA, m); + cc.vpbroadcastb(ymmA, m); + cc.vpbroadcastd(xmmA, m); + cc.vpbroadcastd(ymmA, m); + cc.vpbroadcastq(xmmA, m); + cc.vpbroadcastq(ymmA, m); + cc.vpbroadcastw(xmmA, m); + cc.vpbroadcastw(ymmA, m); + cc.vpcmpeqb(ymmA, ymmB, m); + cc.vpcmpeqd(ymmA, ymmB, m); + cc.vpcmpeqq(ymmA, ymmB, m); + cc.vpcmpeqw(ymmA, ymmB, m); + cc.vpcmpgtb(ymmA, ymmB, m); + cc.vpcmpgtd(ymmA, ymmB, m); + cc.vpcmpgtq(ymmA, ymmB, m); + cc.vpcmpgtw(ymmA, ymmB, m); + cc.vperm2i128(ymmA, ymmB, m, 0); + cc.vpermd(ymmA, ymmB, m); + cc.vpermps(ymmA, ymmB, m); + cc.vpermpd(ymmA, m, 0); + cc.vpermq(ymmA, m, 0); + cc.vpgatherdd(xmmA, vx_ptr, xmmC); + cc.vpgatherdd(ymmA, vy_ptr, ymmC); + cc.vpgatherdq(xmmA, vx_ptr, xmmC); + cc.vpgatherdq(ymmA, vx_ptr, ymmC); + cc.vpgatherqd(xmmA, vx_ptr, xmmC); + cc.vpgatherqd(xmmA, vy_ptr, xmmC); + cc.vpgatherqq(xmmA, vx_ptr, xmmC); + cc.vpgatherqq(ymmA, vy_ptr, ymmC); + cc.vpmovsxbd(ymmA, m); + cc.vpmovsxbq(ymmA, m); + cc.vpmovsxbw(ymmA, m); + cc.vpmovsxdq(ymmA, m); + cc.vpmovsxwd(ymmA, m); + cc.vpmovsxwq(ymmA, m); + cc.vpmovzxbd(ymmA, m); + cc.vpmovzxbq(ymmA, m); + cc.vpmovzxbw(ymmA, m); + cc.vpmovzxdq(ymmA, m); + cc.vpmovzxwd(ymmA, m); + cc.vpmovzxwq(ymmA, m); + cc.vpshufd(ymmA, m, 0); + cc.vpshufhw(ymmA, m, 0); + cc.vpshuflw(ymmA, m, 0); + cc.vphaddd(ymmA, ymmB, m); + cc.vphaddsw(ymmA, ymmB, m); + cc.vphaddw(ymmA, ymmB, m); + cc.vphsubd(ymmA, ymmB, m); + cc.vphsubsw(ymmA, ymmB, m); + cc.vphsubw(ymmA, ymmB, m); + cc.vpmaddubsw(ymmA, ymmB, m); + cc.vpmaddwd(ymmA, ymmB, m); + cc.vpmaskmovd(m, xmmB, xmmC); + cc.vpmaskmovd(m, ymmB, ymmC); + cc.vpmaskmovd(xmmA, xmmB, m); + cc.vpmaskmovd(ymmA, ymmB, m); + cc.vpmaskmovq(m, xmmB, xmmC); + cc.vpmaskmovq(m, ymmB, ymmC); + cc.vpmaskmovq(xmmA, xmmB, m); + cc.vpmaskmovq(ymmA, ymmB, m); + cc.vpmaxsb(ymmA, ymmB, m); + cc.vpmaxsd(ymmA, ymmB, m); + cc.vpmaxsw(ymmA, ymmB, m); + cc.vpmaxub(ymmA, ymmB, m); + cc.vpmaxud(ymmA, ymmB, m); + cc.vpmaxuw(ymmA, ymmB, m); + cc.vpminsb(ymmA, ymmB, m); + cc.vpminsd(ymmA, ymmB, m); + cc.vpminsw(ymmA, ymmB, m); + cc.vpminub(ymmA, ymmB, m); + cc.vpminud(ymmA, ymmB, m); + cc.vpminuw(ymmA, ymmB, m); + cc.vpmuldq(ymmA, ymmB, m); + cc.vpmulhrsw(ymmA, ymmB, m); + cc.vpmulhuw(ymmA, ymmB, m); + cc.vpmulhw(ymmA, ymmB, m); + cc.vpmulld(ymmA, ymmB, m); + cc.vpmullw(ymmA, ymmB, m); + cc.vpmuludq(ymmA, ymmB, m); + cc.vpor(ymmA, ymmB, m); + cc.vpsadbw(ymmA, ymmB, m); + cc.vpshufb(ymmA, ymmB, m); + cc.vpsignb(ymmA, ymmB, m); + cc.vpsignd(ymmA, ymmB, m); + cc.vpsignw(ymmA, ymmB, m); + cc.vpslld(ymmA, ymmB, m); + cc.vpsllq(ymmA, ymmB, m); + cc.vpsllvd(xmmA, xmmB, m); + cc.vpsllvd(ymmA, ymmB, m); + cc.vpsllvq(xmmA, xmmB, m); + cc.vpsllvq(ymmA, ymmB, m); + cc.vpsllw(ymmA, ymmB, m); + cc.vpsrad(ymmA, ymmB, m); + cc.vpsravd(xmmA, xmmB, m); + cc.vpsravd(ymmA, ymmB, m); + cc.vpsraw(ymmA, ymmB, m); + cc.vpsrld(ymmA, ymmB, m); + cc.vpsrlq(ymmA, ymmB, m); + cc.vpsrlvd(xmmA, xmmB, m); + cc.vpsrlvd(ymmA, ymmB, m); + cc.vpsrlvq(xmmA, xmmB, m); + cc.vpsrlvq(ymmA, ymmB, m); + cc.vpsrlw(ymmA, ymmB, m); + cc.vpsubb(ymmA, ymmB, m); + cc.vpsubd(ymmA, ymmB, m); + cc.vpsubq(ymmA, ymmB, m); + cc.vpsubsb(ymmA, ymmB, m); + cc.vpsubsw(ymmA, ymmB, m); + cc.vpsubusb(ymmA, ymmB, m); + cc.vpsubusw(ymmA, ymmB, m); + cc.vpsubw(ymmA, ymmB, m); + cc.vpunpckhbw(ymmA, ymmB, m); + cc.vpunpckhdq(ymmA, ymmB, m); + cc.vpunpckhqdq(ymmA, ymmB, m); + cc.vpunpckhwd(ymmA, ymmB, m); + cc.vpunpcklbw(ymmA, ymmB, m); + cc.vpunpckldq(ymmA, ymmB, m); + cc.vpunpcklqdq(ymmA, ymmB, m); + cc.vpunpcklwd(ymmA, ymmB, m); + cc.vpxor(ymmA, ymmB, m); +} + +// Generates a long sequence of AVX instructions. +template +static void generateAvxSequenceInternal( + Emitter& cc, + InstForm form, + const x86::Gp& gp, + const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) { + + if (form == InstForm::kReg) + generateAvxSequenceInternalRegOnly(cc, gp, vecA, vecB, vecC, vecD); + else + generateAvxSequenceInternalRegMem(cc, gp, vecA, vecB, vecC, vecD); } static void generateAvxSequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) { @@ -2097,7 +2134,7 @@ static void generateAvxSequence(BaseEmitter& emitter, InstForm form, bool emitPr if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -2118,7 +2155,7 @@ static void generateAvxSequence(BaseEmitter& emitter, InstForm form, bool emitPr if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -2144,7 +2181,7 @@ static void generateAvxSequence(BaseEmitter& emitter, InstForm form, bool emitPr Ymm c = cc.newYmm("c"); Ymm d = cc.newYmm("d"); - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); generateAvxSequenceInternal(cc, form, gp, a, b, c, d); cc.endFunc(); } @@ -2153,9 +2190,8 @@ static void generateAvxSequence(BaseEmitter& emitter, InstForm form, bool emitPr // Generates a long sequence of AVX512 instructions. template -static void generateAvx512SequenceInternal( +static void generateAvx512SequenceInternalRegOnly( Emitter& cc, - InstForm form, const x86::Gp& gp, const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC, const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) { @@ -2172,2673 +2208,2716 @@ static void generateAvx512SequenceInternal( x86::Ymm ymmA = vecA.ymm(); x86::Ymm ymmB = vecB.ymm(); x86::Ymm ymmC = vecC.ymm(); - x86::Ymm ymmD = vecD.ymm(); x86::Zmm zmmA = vecA.zmm(); x86::Zmm zmmB = vecB.zmm(); x86::Zmm zmmC = vecC.zmm(); + + cc.xor_(gpd, gpd); + cc.vxorps(xmmA, xmmA, xmmA); + cc.vxorps(xmmB, xmmB, xmmB); + cc.vxorps(xmmC, xmmC, xmmC); + cc.vxorps(xmmD, xmmD, xmmD); + + cc.kaddb(kA, kB, kC); + cc.kaddd(kA, kB, kC); + cc.kaddq(kA, kB, kC); + cc.kaddw(kA, kB, kC); + cc.kandb(kA, kB, kC); + cc.kandd(kA, kB, kC); + cc.kandnb(kA, kB, kC); + cc.kandnd(kA, kB, kC); + cc.kandnq(kA, kB, kC); + cc.kandnw(kA, kB, kC); + cc.kandq(kA, kB, kC); + cc.kandw(kA, kB, kC); + cc.kmovb(kA, kB); + cc.kmovb(kA, gpd); + cc.kmovb(gpd, kB); + cc.kmovd(kA, kB); + cc.kmovd(kA, gpd); + cc.kmovd(gpd, kB); + cc.kmovq(kA, kB); + if (cc.is64Bit()) cc.kmovq(kA, gpq); + if (cc.is64Bit()) cc.kmovq(gpq, kB); + cc.kmovw(kA, kB); + cc.kmovw(kA, gpd); + cc.kmovw(gpd, kB); + cc.knotb(kA, kB); + cc.knotd(kA, kB); + cc.knotq(kA, kB); + cc.knotw(kA, kB); + cc.korb(kA, kB, kC); + cc.kord(kA, kB, kC); + cc.korq(kA, kB, kC); + cc.kortestb(kA, kB); + cc.kortestd(kA, kB); + cc.kortestq(kA, kB); + cc.kortestw(kA, kB); + cc.korw(kA, kB, kC); + cc.kshiftlb(kA, kB, 0); + cc.kshiftld(kA, kB, 0); + cc.kshiftlq(kA, kB, 0); + cc.kshiftlw(kA, kB, 0); + cc.kshiftrb(kA, kB, 0); + cc.kshiftrd(kA, kB, 0); + cc.kshiftrq(kA, kB, 0); + cc.kshiftrw(kA, kB, 0); + cc.ktestb(kA, kB); + cc.ktestd(kA, kB); + cc.ktestq(kA, kB); + cc.ktestw(kA, kB); + cc.kunpckbw(kA, kB, kC); + cc.kunpckdq(kA, kB, kC); + cc.kunpckwd(kA, kB, kC); + cc.kxnorb(kA, kB, kC); + cc.kxnord(kA, kB, kC); + cc.kxnorq(kA, kB, kC); + cc.kxnorw(kA, kB, kC); + cc.kxorb(kA, kB, kC); + cc.kxord(kA, kB, kC); + cc.kxorq(kA, kB, kC); + cc.kxorw(kA, kB, kC); + cc.nop(); + + cc.evex().vaddpd(xmmA, xmmB, xmmC); + cc.evex().vaddpd(ymmA, ymmB, ymmC); + cc.evex().vaddpd(zmmA, zmmB, zmmC); + cc.evex().vaddps(xmmA, xmmB, xmmC); + cc.evex().vaddps(ymmA, ymmB, ymmC); + cc.evex().vaddps(zmmA, zmmB, zmmC); + cc.evex().vaddsd(xmmA, xmmB, xmmC); + cc.evex().vaddss(xmmA, xmmB, xmmC); + cc.evex().valignd(xmmA, xmmB, xmmC, 0); + cc.evex().valignd(ymmA, ymmB, ymmC, 0); + cc.evex().valignd(zmmA, zmmB, zmmC, 0); + cc.evex().valignq(xmmA, xmmB, xmmC, 0); + cc.evex().valignq(ymmA, ymmB, ymmC, 0); + cc.evex().valignq(zmmA, zmmB, zmmC, 0); + cc.evex().vandnpd(xmmA, xmmB, xmmC); + cc.evex().vandnpd(ymmA, ymmB, ymmC); + cc.evex().vandnpd(zmmA, zmmB, zmmC); + cc.evex().vandnps(xmmA, xmmB, xmmC); + cc.evex().vandnps(ymmA, ymmB, ymmC); + cc.evex().vandnps(zmmA, zmmB, zmmC); + cc.evex().vandpd(xmmA, xmmB, xmmC); + cc.evex().vandpd(ymmA, ymmB, ymmC); + cc.evex().vandpd(zmmA, zmmB, zmmC); + cc.evex().vandps(xmmA, xmmB, xmmC); + cc.evex().vandps(ymmA, ymmB, ymmC); + cc.evex().vandps(zmmA, zmmB, zmmC); + cc.evex().vblendmpd(xmmA, xmmB, xmmC); + cc.evex().vblendmpd(ymmA, ymmB, ymmC); + cc.evex().vblendmpd(zmmA, zmmB, zmmC); + cc.evex().vblendmps(xmmA, xmmB, xmmC); + cc.evex().vblendmps(ymmA, ymmB, ymmC); + cc.evex().vblendmps(zmmA, zmmB, zmmC); + cc.evex().vbroadcastf32x2(ymmA, xmmB); + cc.evex().vbroadcastf32x2(zmmA, xmmB); + cc.evex().vbroadcasti32x2(xmmA, xmmB); + cc.evex().vbroadcasti32x2(ymmA, xmmB); + cc.evex().vbroadcasti32x2(zmmA, xmmB); + cc.evex().vbroadcastsd(ymmA, xmmB); + cc.evex().vbroadcastsd(zmmA, xmmB); + cc.evex().vbroadcastss(xmmA, xmmB); + cc.evex().vbroadcastss(ymmA, xmmB); + cc.evex().vbroadcastss(zmmA, xmmB); + cc.evex().vcmppd(kA, xmmB, xmmC, 0); + cc.evex().vcmppd(kA, ymmB, ymmC, 0); + cc.evex().vcmppd(kA, zmmB, zmmC, 0); + cc.evex().vcmpps(kA, xmmB, xmmC, 0); + cc.evex().vcmpps(kA, ymmB, ymmC, 0); + cc.evex().vcmpps(kA, zmmB, zmmC, 0); + cc.evex().vcmpsd(kA, xmmB, xmmC, 0); + cc.evex().vcmpss(kA, xmmB, xmmC, 0); + cc.evex().vcomisd(xmmA, xmmB); + cc.evex().vcomiss(xmmA, xmmB); + cc.evex().vcompresspd(xmmA, xmmB); + cc.evex().vcompresspd(ymmA, ymmB); + cc.evex().vcompresspd(zmmA, zmmB); + cc.evex().vcompressps(xmmA, xmmB); + cc.evex().vcompressps(ymmA, ymmB); + cc.evex().vcompressps(zmmA, zmmB); + cc.evex().vcvtdq2pd(xmmA, xmmB); + cc.evex().vcvtdq2pd(ymmA, xmmB); + cc.evex().vcvtdq2pd(zmmA, ymmB); + cc.evex().vcvtdq2ps(xmmA, xmmB); + cc.evex().vcvtdq2ps(ymmA, ymmB); + cc.evex().vcvtdq2ps(zmmA, zmmB); + cc.evex().vcvtpd2dq(xmmA, xmmB); + cc.evex().vcvtpd2dq(xmmA, ymmB); + cc.evex().vcvtpd2dq(ymmA, zmmB); + cc.evex().vcvtpd2qq(xmmA, xmmB); + cc.evex().vcvtpd2qq(ymmA, ymmB); + cc.evex().vcvtpd2qq(zmmA, zmmB); + cc.evex().vcvtpd2udq(xmmA, xmmB); + cc.evex().vcvtpd2udq(xmmA, ymmB); + cc.evex().vcvtpd2udq(ymmA, zmmB); + cc.evex().vcvtpd2uqq(xmmA, xmmB); + cc.evex().vcvtpd2uqq(ymmA, ymmB); + cc.evex().vcvtpd2uqq(zmmA, zmmB); + cc.evex().vcvtph2ps(xmmA, xmmB); + cc.evex().vcvtph2ps(ymmA, xmmB); + cc.evex().vcvtph2ps(zmmA, ymmB); + cc.evex().vcvtps2dq(xmmA, xmmB); + cc.evex().vcvtps2dq(ymmA, ymmB); + cc.evex().vcvtps2dq(zmmA, zmmB); + cc.evex().vcvtps2pd(xmmA, xmmB); + cc.evex().vcvtps2pd(ymmA, xmmB); + cc.evex().vcvtps2pd(zmmA, ymmB); + cc.evex().vcvtps2ph(xmmA, xmmB, 0); + cc.evex().vcvtps2ph(xmmA, ymmB, 0); + cc.evex().vcvtps2ph(ymmA, zmmB, 0); + cc.evex().vcvtps2qq(xmmA, xmmB); + cc.evex().vcvtps2qq(ymmA, xmmB); + cc.evex().vcvtps2qq(zmmA, ymmB); + cc.evex().vcvtps2udq(xmmA, xmmB); + cc.evex().vcvtps2udq(ymmA, ymmB); + cc.evex().vcvtps2udq(zmmA, zmmB); + cc.evex().vcvtps2uqq(xmmA, xmmB); + cc.evex().vcvtps2uqq(ymmA, xmmB); + cc.evex().vcvtps2uqq(zmmA, ymmB); + cc.evex().vcvtqq2pd(xmmA, xmmB); + cc.evex().vcvtqq2pd(ymmA, ymmB); + cc.evex().vcvtqq2pd(zmmA, zmmB); + cc.evex().vcvtqq2ps(xmmA, xmmB); + cc.evex().vcvtqq2ps(xmmA, ymmB); + cc.evex().vcvtqq2ps(ymmA, zmmB); + cc.evex().vcvtsd2si(gpd, xmmB); + cc.evex().vcvtsd2si(gpz, xmmB); + cc.evex().vcvtsd2ss(xmmA, xmmB, xmmC); + cc.evex().vcvtsd2usi(gpd, xmmB); + cc.evex().vcvtsd2usi(gpz, xmmB); + cc.evex().vcvtsi2sd(xmmA, xmmB, gpd); + cc.evex().vcvtsi2sd(xmmA, xmmB, gpz); + cc.evex().vcvtsi2ss(xmmA, xmmB, gpd); + cc.evex().vcvtsi2ss(xmmA, xmmB, gpz); + cc.evex().vcvtss2sd(xmmA, xmmB, xmmC); + cc.evex().vcvtss2si(gpd, xmmB); + cc.evex().vcvtss2si(gpz, xmmB); + cc.evex().vcvtss2usi(gpd, xmmB); + cc.evex().vcvtss2usi(gpz, xmmB); + cc.evex().vcvttpd2dq(xmmA, xmmB); + cc.evex().vcvttpd2dq(xmmA, ymmB); + cc.evex().vcvttpd2dq(ymmA, zmmB); + cc.evex().vcvttpd2qq(xmmA, xmmB); + cc.evex().vcvttpd2qq(ymmA, ymmB); + cc.evex().vcvttpd2qq(zmmA, zmmB); + cc.evex().vcvttpd2udq(xmmA, xmmB); + cc.evex().vcvttpd2udq(xmmA, ymmB); + cc.evex().vcvttpd2udq(ymmA, zmmB); + cc.evex().vcvttpd2uqq(xmmA, xmmB); + cc.evex().vcvttpd2uqq(ymmA, ymmB); + cc.evex().vcvttpd2uqq(zmmA, zmmB); + cc.evex().vcvttps2dq(xmmA, xmmB); + cc.evex().vcvttps2dq(ymmA, ymmB); + cc.evex().vcvttps2dq(zmmA, zmmB); + cc.evex().vcvttps2qq(xmmA, xmmB); + cc.evex().vcvttps2qq(ymmA, xmmB); + cc.evex().vcvttps2qq(zmmA, ymmB); + cc.evex().vcvttps2udq(xmmA, xmmB); + cc.evex().vcvttps2udq(ymmA, ymmB); + cc.evex().vcvttps2udq(zmmA, zmmB); + cc.evex().vcvttps2uqq(xmmA, xmmB); + cc.evex().vcvttps2uqq(ymmA, xmmB); + cc.evex().vcvttps2uqq(zmmA, ymmB); + cc.evex().vcvttsd2si(gpd, xmmB); + cc.evex().vcvttsd2si(gpz, xmmB); + cc.evex().vcvttsd2usi(gpd, xmmB); + cc.evex().vcvttsd2usi(gpz, xmmB); + cc.evex().vcvttss2si(gpd, xmmB); + cc.evex().vcvttss2si(gpz, xmmB); + cc.evex().vcvttss2usi(gpd, xmmB); + cc.evex().vcvttss2usi(gpz, xmmB); + cc.evex().vcvtudq2pd(xmmA, xmmB); + cc.evex().vcvtudq2pd(ymmA, xmmB); + cc.evex().vcvtudq2pd(zmmA, ymmB); + cc.evex().vcvtudq2ps(xmmA, xmmB); + cc.evex().vcvtudq2ps(ymmA, ymmB); + cc.evex().vcvtudq2ps(zmmA, zmmB); + cc.evex().vcvtuqq2pd(xmmA, xmmB); + cc.evex().vcvtuqq2pd(ymmA, ymmB); + cc.evex().vcvtuqq2pd(zmmA, zmmB); + cc.evex().vcvtuqq2ps(xmmA, xmmB); + cc.evex().vcvtuqq2ps(xmmA, ymmB); + cc.evex().vcvtuqq2ps(ymmA, zmmB); + cc.evex().vcvtusi2sd(xmmA, xmmB, gpd); + cc.evex().vcvtusi2sd(xmmA, xmmB, gpz); + cc.evex().vcvtusi2ss(xmmA, xmmB, gpd); + cc.evex().vcvtusi2ss(xmmA, xmmB, gpz); + cc.evex().vdbpsadbw(xmmA, xmmB, xmmC, 0); + cc.evex().vdbpsadbw(ymmA, ymmB, ymmC, 0); + cc.evex().vdbpsadbw(zmmA, zmmB, zmmC, 0); + cc.evex().vdivpd(xmmA, xmmB, xmmC); + cc.evex().vdivpd(ymmA, ymmB, ymmC); + cc.evex().vdivpd(zmmA, zmmB, zmmC); + cc.evex().vdivps(xmmA, xmmB, xmmC); + cc.evex().vdivps(ymmA, ymmB, ymmC); + cc.evex().vdivps(zmmA, zmmB, zmmC); + cc.evex().vdivsd(xmmA, xmmB, xmmC); + cc.evex().vdivss(xmmA, xmmB, xmmC); + cc.evex().vexp2pd(zmmA, zmmB); + cc.evex().vexp2ps(zmmA, zmmB); + cc.evex().vexpandpd(xmmA, xmmB); + cc.evex().vexpandpd(ymmA, ymmB); + cc.evex().vexpandpd(zmmA, zmmB); + cc.evex().vexpandps(xmmA, xmmB); + cc.evex().vexpandps(ymmA, ymmB); + cc.evex().vexpandps(zmmA, zmmB); + cc.evex().vextractf32x4(xmmA, ymmB, 0); + cc.evex().vextractf32x4(xmmA, zmmB, 0); + cc.evex().vextractf32x8(ymmA, zmmB, 0); + cc.evex().vextractf64x2(xmmA, ymmB, 0); + cc.evex().vextractf64x2(xmmA, zmmB, 0); + cc.evex().vextractf64x4(ymmA, zmmB, 0); + cc.evex().vextracti32x4(xmmA, ymmB, 0); + cc.evex().vextracti32x4(xmmA, zmmB, 0); + cc.evex().vextracti32x8(ymmA, zmmB, 0); + cc.evex().vextracti64x2(xmmA, ymmB, 0); + cc.evex().vextracti64x2(xmmA, zmmB, 0); + cc.evex().vextracti64x4(ymmA, zmmB, 0); + cc.evex().vextractps(gpd, xmmB, 0); + cc.evex().vfixupimmpd(xmmA, xmmB, xmmC, 0); + cc.evex().vfixupimmpd(ymmA, ymmB, ymmC, 0); + cc.evex().vfixupimmpd(zmmA, zmmB, zmmC, 0); + cc.evex().vfixupimmps(xmmA, xmmB, xmmC, 0); + cc.evex().vfixupimmps(ymmA, ymmB, ymmC, 0); + cc.evex().vfixupimmps(zmmA, zmmB, zmmC, 0); + cc.evex().vfixupimmsd(xmmA, xmmB, xmmC, 0); + cc.evex().vfixupimmss(xmmA, xmmB, xmmC, 0); + cc.evex().vfmadd132pd(xmmA, xmmB, xmmC); + cc.evex().vfmadd132pd(ymmA, ymmB, ymmC); + cc.evex().vfmadd132pd(zmmA, zmmB, zmmC); + cc.evex().vfmadd132ps(xmmA, xmmB, xmmC); + cc.evex().vfmadd132ps(ymmA, ymmB, ymmC); + cc.evex().vfmadd132ps(zmmA, zmmB, zmmC); + cc.evex().vfmadd132sd(xmmA, xmmB, xmmC); + cc.evex().vfmadd132ss(xmmA, xmmB, xmmC); + cc.evex().vfmadd213pd(xmmA, xmmB, xmmC); + cc.evex().vfmadd213pd(ymmA, ymmB, ymmC); + cc.evex().vfmadd213pd(zmmA, zmmB, zmmC); + cc.evex().vfmadd213ps(xmmA, xmmB, xmmC); + cc.evex().vfmadd213ps(ymmA, ymmB, ymmC); + cc.evex().vfmadd213ps(zmmA, zmmB, zmmC); + cc.evex().vfmadd213sd(xmmA, xmmB, xmmC); + cc.evex().vfmadd213ss(xmmA, xmmB, xmmC); + cc.evex().vfmadd231pd(xmmA, xmmB, xmmC); + cc.evex().vfmadd231pd(ymmA, ymmB, ymmC); + cc.evex().vfmadd231pd(zmmA, zmmB, zmmC); + cc.evex().vfmadd231ps(xmmA, xmmB, xmmC); + cc.evex().vfmadd231ps(ymmA, ymmB, ymmC); + cc.evex().vfmadd231ps(zmmA, zmmB, zmmC); + cc.evex().vfmadd231sd(xmmA, xmmB, xmmC); + cc.evex().vfmadd231ss(xmmA, xmmB, xmmC); + cc.evex().vfmaddsub132pd(xmmA, xmmB, xmmC); + cc.evex().vfmaddsub132pd(ymmA, ymmB, ymmC); + cc.evex().vfmaddsub132pd(zmmA, zmmB, zmmC); + cc.evex().vfmaddsub132ps(xmmA, xmmB, xmmC); + cc.evex().vfmaddsub132ps(ymmA, ymmB, ymmC); + cc.evex().vfmaddsub132ps(zmmA, zmmB, zmmC); + cc.evex().vfmaddsub213pd(xmmA, xmmB, xmmC); + cc.evex().vfmaddsub213pd(ymmA, ymmB, ymmC); + cc.evex().vfmaddsub213pd(zmmA, zmmB, zmmC); + cc.evex().vfmaddsub213ps(xmmA, xmmB, xmmC); + cc.evex().vfmaddsub213ps(ymmA, ymmB, ymmC); + cc.evex().vfmaddsub213ps(zmmA, zmmB, zmmC); + cc.evex().vfmaddsub231pd(xmmA, xmmB, xmmC); + cc.evex().vfmaddsub231pd(ymmA, ymmB, ymmC); + cc.evex().vfmaddsub231pd(zmmA, zmmB, zmmC); + cc.evex().vfmaddsub231ps(xmmA, xmmB, xmmC); + cc.evex().vfmaddsub231ps(ymmA, ymmB, ymmC); + cc.evex().vfmaddsub231ps(zmmA, zmmB, zmmC); + cc.evex().vfmsub132pd(xmmA, xmmB, xmmC); + cc.evex().vfmsub132pd(ymmA, ymmB, ymmC); + cc.evex().vfmsub132pd(zmmA, zmmB, zmmC); + cc.evex().vfmsub132ps(xmmA, xmmB, xmmC); + cc.evex().vfmsub132ps(ymmA, ymmB, ymmC); + cc.evex().vfmsub132ps(zmmA, zmmB, zmmC); + cc.evex().vfmsub132sd(xmmA, xmmB, xmmC); + cc.evex().vfmsub132ss(xmmA, xmmB, xmmC); + cc.evex().vfmsub213pd(xmmA, xmmB, xmmC); + cc.evex().vfmsub213pd(ymmA, ymmB, ymmC); + cc.evex().vfmsub213pd(zmmA, zmmB, zmmC); + cc.evex().vfmsub213ps(xmmA, xmmB, xmmC); + cc.evex().vfmsub213ps(ymmA, ymmB, ymmC); + cc.evex().vfmsub213ps(zmmA, zmmB, zmmC); + cc.evex().vfmsub213sd(xmmA, xmmB, xmmC); + cc.evex().vfmsub213ss(xmmA, xmmB, xmmC); + cc.evex().vfmsub231pd(xmmA, xmmB, xmmC); + cc.evex().vfmsub231pd(ymmA, ymmB, ymmC); + cc.evex().vfmsub231pd(zmmA, zmmB, zmmC); + cc.evex().vfmsub231ps(xmmA, xmmB, xmmC); + cc.evex().vfmsub231ps(ymmA, ymmB, ymmC); + cc.evex().vfmsub231ps(zmmA, zmmB, zmmC); + cc.evex().vfmsub231sd(xmmA, xmmB, xmmC); + cc.evex().vfmsub231ss(xmmA, xmmB, xmmC); + cc.evex().vfmsubadd132pd(xmmA, xmmB, xmmC); + cc.evex().vfmsubadd132pd(ymmA, ymmB, ymmC); + cc.evex().vfmsubadd132pd(zmmA, zmmB, zmmC); + cc.evex().vfmsubadd132ps(xmmA, xmmB, xmmC); + cc.evex().vfmsubadd132ps(ymmA, ymmB, ymmC); + cc.evex().vfmsubadd132ps(zmmA, zmmB, zmmC); + cc.evex().vfmsubadd213pd(xmmA, xmmB, xmmC); + cc.evex().vfmsubadd213pd(ymmA, ymmB, ymmC); + cc.evex().vfmsubadd213pd(zmmA, zmmB, zmmC); + cc.evex().vfmsubadd213ps(xmmA, xmmB, xmmC); + cc.evex().vfmsubadd213ps(ymmA, ymmB, ymmC); + cc.evex().vfmsubadd213ps(zmmA, zmmB, zmmC); + cc.evex().vfmsubadd231pd(xmmA, xmmB, xmmC); + cc.evex().vfmsubadd231pd(ymmA, ymmB, ymmC); + cc.evex().vfmsubadd231pd(zmmA, zmmB, zmmC); + cc.evex().vfmsubadd231ps(xmmA, xmmB, xmmC); + cc.evex().vfmsubadd231ps(ymmA, ymmB, ymmC); + cc.evex().vfmsubadd231ps(zmmA, zmmB, zmmC); + cc.evex().vfnmadd132pd(xmmA, xmmB, xmmC); + cc.evex().vfnmadd132pd(ymmA, ymmB, ymmC); + cc.evex().vfnmadd132pd(zmmA, zmmB, zmmC); + cc.evex().vfnmadd132ps(xmmA, xmmB, xmmC); + cc.evex().vfnmadd132ps(ymmA, ymmB, ymmC); + cc.evex().vfnmadd132ps(zmmA, zmmB, zmmC); + cc.evex().vfnmadd132sd(xmmA, xmmB, xmmC); + cc.evex().vfnmadd132ss(xmmA, xmmB, xmmC); + cc.evex().vfnmadd213pd(xmmA, xmmB, xmmC); + cc.evex().vfnmadd213pd(ymmA, ymmB, ymmC); + cc.evex().vfnmadd213pd(zmmA, zmmB, zmmC); + cc.evex().vfnmadd213ps(xmmA, xmmB, xmmC); + cc.evex().vfnmadd213ps(ymmA, ymmB, ymmC); + cc.evex().vfnmadd213ps(zmmA, zmmB, zmmC); + cc.evex().vfnmadd213sd(xmmA, xmmB, xmmC); + cc.evex().vfnmadd213ss(xmmA, xmmB, xmmC); + cc.evex().vfnmadd231pd(xmmA, xmmB, xmmC); + cc.evex().vfnmadd231pd(ymmA, ymmB, ymmC); + cc.evex().vfnmadd231pd(zmmA, zmmB, zmmC); + cc.evex().vfnmadd231ps(xmmA, xmmB, xmmC); + cc.evex().vfnmadd231ps(ymmA, ymmB, ymmC); + cc.evex().vfnmadd231ps(zmmA, zmmB, zmmC); + cc.evex().vfnmadd231sd(xmmA, xmmB, xmmC); + cc.evex().vfnmadd231ss(xmmA, xmmB, xmmC); + cc.evex().vfnmsub132pd(xmmA, xmmB, xmmC); + cc.evex().vfnmsub132pd(ymmA, ymmB, ymmC); + cc.evex().vfnmsub132pd(zmmA, zmmB, zmmC); + cc.evex().vfnmsub132ps(xmmA, xmmB, xmmC); + cc.evex().vfnmsub132ps(ymmA, ymmB, ymmC); + cc.evex().vfnmsub132ps(zmmA, zmmB, zmmC); + cc.evex().vfnmsub132sd(xmmA, xmmB, xmmC); + cc.evex().vfnmsub132ss(xmmA, xmmB, xmmC); + cc.evex().vfnmsub213pd(xmmA, xmmB, xmmC); + cc.evex().vfnmsub213pd(ymmA, ymmB, ymmC); + cc.evex().vfnmsub213pd(zmmA, zmmB, zmmC); + cc.evex().vfnmsub213ps(xmmA, xmmB, xmmC); + cc.evex().vfnmsub213ps(ymmA, ymmB, ymmC); + cc.evex().vfnmsub213ps(zmmA, zmmB, zmmC); + cc.evex().vfnmsub213sd(xmmA, xmmB, xmmC); + cc.evex().vfnmsub213ss(xmmA, xmmB, xmmC); + cc.evex().vfnmsub231pd(xmmA, xmmB, xmmC); + cc.evex().vfnmsub231pd(ymmA, ymmB, ymmC); + cc.evex().vfnmsub231pd(zmmA, zmmB, zmmC); + cc.evex().vfnmsub231ps(xmmA, xmmB, xmmC); + cc.evex().vfnmsub231ps(ymmA, ymmB, ymmC); + cc.evex().vfnmsub231ps(zmmA, zmmB, zmmC); + cc.evex().vfnmsub231sd(xmmA, xmmB, xmmC); + cc.evex().vfnmsub231ss(xmmA, xmmB, xmmC); + cc.evex().vfpclasspd(kA, xmmB, 0); + cc.evex().vfpclasspd(kA, ymmB, 0); + cc.evex().vfpclasspd(kA, zmmB, 0); + cc.evex().vfpclassps(kA, xmmB, 0); + cc.evex().vfpclassps(kA, ymmB, 0); + cc.evex().vfpclassps(kA, zmmB, 0); + cc.evex().vfpclasssd(kA, xmmB, 0); + cc.evex().vfpclassss(kA, xmmB, 0); + cc.evex().vgetexppd(xmmA, xmmB); + cc.evex().vgetexppd(ymmA, ymmB); + cc.evex().vgetexppd(zmmA, zmmB); + cc.evex().vgetexpps(xmmA, xmmB); + cc.evex().vgetexpps(ymmA, ymmB); + cc.evex().vgetexpps(zmmA, zmmB); + cc.evex().vgetexpsd(xmmA, xmmB, xmmC); + cc.evex().vgetexpss(xmmA, xmmB, xmmC); + cc.evex().vgetmantpd(xmmA, xmmB, 0); + cc.evex().vgetmantpd(ymmA, ymmB, 0); + cc.evex().vgetmantpd(zmmA, zmmB, 0); + cc.evex().vgetmantps(xmmA, xmmB, 0); + cc.evex().vgetmantps(ymmA, ymmB, 0); + cc.evex().vgetmantps(zmmA, zmmB, 0); + cc.evex().vgetmantsd(xmmA, xmmB, xmmC, 0); + cc.evex().vgetmantss(xmmA, xmmB, xmmC, 0); + cc.evex().vinsertf32x4(ymmA, ymmB, xmmC, 0); + cc.evex().vinsertf32x4(zmmA, zmmB, xmmC, 0); + cc.evex().vinsertf32x8(zmmA, zmmB, ymmC, 0); + cc.evex().vinsertf64x2(ymmA, ymmB, xmmC, 0); + cc.evex().vinsertf64x2(zmmA, zmmB, xmmC, 0); + cc.evex().vinsertf64x4(zmmA, zmmB, ymmC, 0); + cc.evex().vinserti32x4(ymmA, ymmB, xmmC, 0); + cc.evex().vinserti32x4(zmmA, zmmB, xmmC, 0); + cc.evex().vinserti32x8(zmmA, zmmB, ymmC, 0); + cc.evex().vinserti64x2(ymmA, ymmB, xmmC, 0); + cc.evex().vinserti64x2(zmmA, zmmB, xmmC, 0); + cc.evex().vinserti64x4(zmmA, zmmB, ymmC, 0); + cc.evex().vinsertps(xmmA, xmmB, xmmC, 0); + cc.evex().vmaxpd(xmmA, xmmB, xmmC); + cc.evex().vmaxpd(ymmA, ymmB, ymmC); + cc.evex().vmaxpd(zmmA, zmmB, zmmC); + cc.evex().vmaxps(xmmA, xmmB, xmmC); + cc.evex().vmaxps(ymmA, ymmB, ymmC); + cc.evex().vmaxps(zmmA, zmmB, zmmC); + cc.evex().vmaxsd(xmmA, xmmB, xmmC); + cc.evex().vmaxss(xmmA, xmmB, xmmC); + cc.evex().vminpd(xmmA, xmmB, xmmC); + cc.evex().vminpd(ymmA, ymmB, ymmC); + cc.evex().vminpd(zmmA, zmmB, zmmC); + cc.evex().vminps(xmmA, xmmB, xmmC); + cc.evex().vminps(ymmA, ymmB, ymmC); + cc.evex().vminps(zmmA, zmmB, zmmC); + cc.evex().vminsd(xmmA, xmmB, xmmC); + cc.evex().vminss(xmmA, xmmB, xmmC); + cc.evex().vmovapd(xmmA, xmmB); + cc.evex().vmovapd(xmmA, xmmB); + cc.evex().vmovapd(ymmA, ymmB); + cc.evex().vmovapd(ymmA, ymmB); + cc.evex().vmovapd(zmmA, zmmB); + cc.evex().vmovapd(zmmA, zmmB); + cc.evex().vmovaps(xmmA, xmmB); + cc.evex().vmovaps(xmmA, xmmB); + cc.evex().vmovaps(ymmA, ymmB); + cc.evex().vmovaps(ymmA, ymmB); + cc.evex().vmovaps(zmmA, zmmB); + cc.evex().vmovaps(zmmA, zmmB); + cc.evex().vmovd(gpd, xmmB); + cc.evex().vmovd(xmmA, gpd); + cc.evex().vmovddup(xmmA, xmmB); + cc.evex().vmovddup(ymmA, ymmB); + cc.evex().vmovddup(zmmA, zmmB); + cc.evex().vmovdqa32(xmmA, xmmB); + cc.evex().vmovdqa32(xmmA, xmmB); + cc.evex().vmovdqa32(ymmA, ymmB); + cc.evex().vmovdqa32(ymmA, ymmB); + cc.evex().vmovdqa32(zmmA, zmmB); + cc.evex().vmovdqa32(zmmA, zmmB); + cc.evex().vmovdqa64(xmmA, xmmB); + cc.evex().vmovdqa64(xmmA, xmmB); + cc.evex().vmovdqa64(ymmA, ymmB); + cc.evex().vmovdqa64(ymmA, ymmB); + cc.evex().vmovdqa64(zmmA, zmmB); + cc.evex().vmovdqa64(zmmA, zmmB); + cc.evex().vmovdqu16(xmmA, xmmB); + cc.evex().vmovdqu16(xmmA, xmmB); + cc.evex().vmovdqu16(ymmA, ymmB); + cc.evex().vmovdqu16(ymmA, ymmB); + cc.evex().vmovdqu16(zmmA, zmmB); + cc.evex().vmovdqu16(zmmA, zmmB); + cc.evex().vmovdqu32(xmmA, xmmB); + cc.evex().vmovdqu32(xmmA, xmmB); + cc.evex().vmovdqu32(ymmA, ymmB); + cc.evex().vmovdqu32(ymmA, ymmB); + cc.evex().vmovdqu32(zmmA, zmmB); + cc.evex().vmovdqu32(zmmA, zmmB); + cc.evex().vmovdqu64(xmmA, xmmB); + cc.evex().vmovdqu64(xmmA, xmmB); + cc.evex().vmovdqu64(ymmA, ymmB); + cc.evex().vmovdqu64(ymmA, ymmB); + cc.evex().vmovdqu64(zmmA, zmmB); + cc.evex().vmovdqu64(zmmA, zmmB); + cc.evex().vmovdqu8(xmmA, xmmB); + cc.evex().vmovdqu8(xmmA, xmmB); + cc.evex().vmovdqu8(ymmA, ymmB); + cc.evex().vmovdqu8(ymmA, ymmB); + cc.evex().vmovdqu8(zmmA, zmmB); + cc.evex().vmovdqu8(zmmA, zmmB); + cc.evex().vmovhlps(xmmA, xmmB, xmmC); + if (cc.is64Bit()) cc.evex().vmovq(gpq, xmmB); + if (cc.is64Bit()) cc.evex().vmovq(xmmA, gpq); + cc.evex().vmovq(xmmA, xmmB); + cc.evex().vmovsd(xmmA, xmmB, xmmC); + cc.evex().vmovshdup(xmmA, xmmB); + cc.evex().vmovshdup(ymmA, ymmB); + cc.evex().vmovshdup(zmmA, zmmB); + cc.evex().vmovsldup(xmmA, xmmB); + cc.evex().vmovsldup(ymmA, ymmB); + cc.evex().vmovsldup(zmmA, zmmB); + cc.evex().vmovss(xmmA, xmmB, xmmC); + cc.evex().vmovupd(xmmA, xmmB); + cc.evex().vmovupd(xmmA, xmmB); + cc.evex().vmovupd(ymmA, ymmB); + cc.evex().vmovupd(ymmA, ymmB); + cc.evex().vmovupd(zmmA, zmmB); + cc.evex().vmovupd(zmmA, zmmB); + cc.evex().vmovups(xmmA, xmmB); + cc.evex().vmovups(xmmA, xmmB); + cc.evex().vmovups(ymmA, ymmB); + cc.evex().vmovups(ymmA, ymmB); + cc.evex().vmovups(zmmA, zmmB); + cc.evex().vmovups(zmmA, zmmB); + cc.evex().vmulpd(xmmA, xmmB, xmmC); + cc.evex().vmulpd(ymmA, ymmB, ymmC); + cc.evex().vmulpd(zmmA, zmmB, zmmC); + cc.evex().vmulps(xmmA, xmmB, xmmC); + cc.evex().vmulps(ymmA, ymmB, ymmC); + cc.evex().vmulps(zmmA, zmmB, zmmC); + cc.evex().vmulsd(xmmA, xmmB, xmmC); + cc.evex().vmulss(xmmA, xmmB, xmmC); + cc.evex().vorpd(xmmA, xmmB, xmmC); + cc.evex().vorpd(ymmA, ymmB, ymmC); + cc.evex().vorpd(zmmA, zmmB, zmmC); + cc.evex().vorps(xmmA, xmmB, xmmC); + cc.evex().vorps(ymmA, ymmB, ymmC); + cc.evex().vorps(zmmA, zmmB, zmmC); + cc.evex().vpabsb(xmmA, xmmB); + cc.evex().vpabsb(ymmA, ymmB); + cc.evex().vpabsb(zmmA, zmmB); + cc.evex().vpabsd(xmmA, xmmB); + cc.evex().vpabsd(ymmA, ymmB); + cc.evex().vpabsd(zmmA, zmmB); + cc.evex().vpabsq(xmmA, xmmB); + cc.evex().vpabsq(ymmA, ymmB); + cc.evex().vpabsq(zmmA, zmmB); + cc.evex().vpabsw(xmmA, xmmB); + cc.evex().vpabsw(ymmA, ymmB); + cc.evex().vpabsw(zmmA, zmmB); + cc.evex().vpackssdw(xmmA, xmmB, xmmC); + cc.evex().vpackssdw(ymmA, ymmB, ymmC); + cc.evex().vpackssdw(zmmA, zmmB, zmmC); + cc.evex().vpacksswb(xmmA, xmmB, xmmC); + cc.evex().vpacksswb(ymmA, ymmB, ymmC); + cc.evex().vpacksswb(zmmA, zmmB, zmmC); + cc.evex().vpackusdw(xmmA, xmmB, xmmC); + cc.evex().vpackusdw(ymmA, ymmB, ymmC); + cc.evex().vpackusdw(zmmA, zmmB, zmmC); + cc.evex().vpackuswb(xmmA, xmmB, xmmC); + cc.evex().vpackuswb(ymmA, ymmB, ymmC); + cc.evex().vpackuswb(zmmA, zmmB, zmmC); + cc.evex().vpaddb(xmmA, xmmB, xmmC); + cc.evex().vpaddb(ymmA, ymmB, ymmC); + cc.evex().vpaddb(zmmA, zmmB, zmmC); + cc.evex().vpaddd(xmmA, xmmB, xmmC); + cc.evex().vpaddd(ymmA, ymmB, ymmC); + cc.evex().vpaddd(zmmA, zmmB, zmmC); + cc.evex().vpaddq(xmmA, xmmB, xmmC); + cc.evex().vpaddq(ymmA, ymmB, ymmC); + cc.evex().vpaddq(zmmA, zmmB, zmmC); + cc.evex().vpaddsb(xmmA, xmmB, xmmC); + cc.evex().vpaddsb(ymmA, ymmB, ymmC); + cc.evex().vpaddsb(zmmA, zmmB, zmmC); + cc.evex().vpaddsw(xmmA, xmmB, xmmC); + cc.evex().vpaddsw(ymmA, ymmB, ymmC); + cc.evex().vpaddsw(zmmA, zmmB, zmmC); + cc.evex().vpaddusb(xmmA, xmmB, xmmC); + cc.evex().vpaddusb(ymmA, ymmB, ymmC); + cc.evex().vpaddusb(zmmA, zmmB, zmmC); + cc.evex().vpaddusw(xmmA, xmmB, xmmC); + cc.evex().vpaddusw(ymmA, ymmB, ymmC); + cc.evex().vpaddusw(zmmA, zmmB, zmmC); + cc.evex().vpaddw(xmmA, xmmB, xmmC); + cc.evex().vpaddw(ymmA, ymmB, ymmC); + cc.evex().vpaddw(zmmA, zmmB, zmmC); + cc.evex().vpalignr(xmmA, xmmB, xmmC, 0); + cc.evex().vpalignr(ymmA, ymmB, ymmC, 0); + cc.evex().vpalignr(zmmA, zmmB, zmmC, 0); + cc.evex().vpandd(xmmA, xmmB, xmmC); + cc.evex().vpandd(ymmA, ymmB, ymmC); + cc.evex().vpandd(zmmA, zmmB, zmmC); + cc.evex().vpandnd(xmmA, xmmB, xmmC); + cc.evex().vpandnd(ymmA, ymmB, ymmC); + cc.evex().vpandnd(zmmA, zmmB, zmmC); + cc.evex().vpandnq(xmmA, xmmB, xmmC); + cc.evex().vpandnq(ymmA, ymmB, ymmC); + cc.evex().vpandnq(zmmA, zmmB, zmmC); + cc.evex().vpandq(xmmA, xmmB, xmmC); + cc.evex().vpandq(ymmA, ymmB, ymmC); + cc.evex().vpandq(zmmA, zmmB, zmmC); + cc.evex().vpavgb(xmmA, xmmB, xmmC); + cc.evex().vpavgb(ymmA, ymmB, ymmC); + cc.evex().vpavgb(zmmA, zmmB, zmmC); + cc.evex().vpavgw(xmmA, xmmB, xmmC); + cc.evex().vpavgw(ymmA, ymmB, ymmC); + cc.evex().vpavgw(zmmA, zmmB, zmmC); + cc.evex().vpblendmb(xmmA, xmmB, xmmC); + cc.evex().vpblendmb(ymmA, ymmB, ymmC); + cc.evex().vpblendmb(zmmA, zmmB, zmmC); + cc.evex().vpblendmd(xmmA, xmmB, xmmC); + cc.evex().vpblendmd(ymmA, ymmB, ymmC); + cc.evex().vpblendmd(zmmA, zmmB, zmmC); + cc.evex().vpblendmq(xmmA, xmmB, xmmC); + cc.evex().vpblendmq(ymmA, ymmB, ymmC); + cc.evex().vpblendmq(zmmA, zmmB, zmmC); + cc.evex().vpblendmw(xmmA, xmmB, xmmC); + cc.evex().vpblendmw(ymmA, ymmB, ymmC); + cc.evex().vpblendmw(zmmA, zmmB, zmmC); + cc.evex().vpbroadcastb(xmmA, gpd); + cc.evex().vpbroadcastb(xmmA, xmmB); + cc.evex().vpbroadcastb(ymmA, gpd); + cc.evex().vpbroadcastb(ymmA, xmmB); + cc.evex().vpbroadcastb(zmmA, gpd); + cc.evex().vpbroadcastb(zmmA, xmmB); + cc.evex().vpbroadcastd(xmmA, gpd); + cc.evex().vpbroadcastd(xmmA, xmmB); + cc.evex().vpbroadcastd(ymmA, gpd); + cc.evex().vpbroadcastd(ymmA, xmmB); + cc.evex().vpbroadcastd(zmmA, gpd); + cc.evex().vpbroadcastd(zmmA, xmmB); + cc.evex().vpbroadcastmb2q(xmmA, kB); + cc.evex().vpbroadcastmb2q(ymmA, kB); + cc.evex().vpbroadcastmb2q(zmmA, kB); + cc.evex().vpbroadcastmw2d(xmmA, kB); + cc.evex().vpbroadcastmw2d(ymmA, kB); + cc.evex().vpbroadcastmw2d(zmmA, kB); + if (cc.is64Bit()) cc.evex().vpbroadcastq(xmmA, gpq); + cc.evex().vpbroadcastq(xmmA, xmmB); + if (cc.is64Bit()) cc.evex().vpbroadcastq(ymmA, gpq); + cc.evex().vpbroadcastq(ymmA, xmmB); + if (cc.is64Bit()) cc.evex().vpbroadcastq(zmmA, gpq); + cc.evex().vpbroadcastq(zmmA, xmmB); + cc.evex().vpbroadcastw(xmmA, gpd); + cc.evex().vpbroadcastw(xmmA, xmmB); + cc.evex().vpbroadcastw(ymmA, gpd); + cc.evex().vpbroadcastw(ymmA, xmmB); + cc.evex().vpbroadcastw(zmmA, gpd); + cc.evex().vpbroadcastw(zmmA, xmmB); + cc.evex().vpcmpb(kA, xmmB, xmmC, 0); + cc.evex().vpcmpb(kA, ymmB, ymmC, 0); + cc.evex().vpcmpb(kA, zmmB, zmmC, 0); + cc.evex().vpcmpd(kA, xmmB, xmmC, 0); + cc.evex().vpcmpd(kA, ymmB, ymmC, 0); + cc.evex().vpcmpd(kA, zmmB, zmmC, 0); + cc.evex().vpcmpeqb(kA, xmmB, xmmC); + cc.evex().vpcmpeqb(kA, ymmB, ymmC); + cc.evex().vpcmpeqb(kA, zmmB, zmmC); + cc.evex().vpcmpeqd(kA, xmmB, xmmC); + cc.evex().vpcmpeqd(kA, ymmB, ymmC); + cc.evex().vpcmpeqd(kA, zmmB, zmmC); + cc.evex().vpcmpeqq(kA, xmmB, xmmC); + cc.evex().vpcmpeqq(kA, ymmB, ymmC); + cc.evex().vpcmpeqq(kA, zmmB, zmmC); + cc.evex().vpcmpeqw(kA, xmmB, xmmC); + cc.evex().vpcmpeqw(kA, ymmB, ymmC); + cc.evex().vpcmpeqw(kA, zmmB, zmmC); + cc.evex().vpcmpgtb(kA, xmmB, xmmC); + cc.evex().vpcmpgtb(kA, ymmB, ymmC); + cc.evex().vpcmpgtb(kA, zmmB, zmmC); + cc.evex().vpcmpgtd(kA, xmmB, xmmC); + cc.evex().vpcmpgtd(kA, ymmB, ymmC); + cc.evex().vpcmpgtd(kA, zmmB, zmmC); + cc.evex().vpcmpgtq(kA, xmmB, xmmC); + cc.evex().vpcmpgtq(kA, ymmB, ymmC); + cc.evex().vpcmpgtq(kA, zmmB, zmmC); + cc.evex().vpcmpgtw(kA, xmmB, xmmC); + cc.evex().vpcmpgtw(kA, ymmB, ymmC); + cc.evex().vpcmpgtw(kA, zmmB, zmmC); + cc.evex().vpcmpq(kA, xmmB, xmmC, 0); + cc.evex().vpcmpq(kA, ymmB, ymmC, 0); + cc.evex().vpcmpq(kA, zmmB, zmmC, 0); + cc.evex().vpcmpub(kA, xmmB, xmmC, 0); + cc.evex().vpcmpub(kA, ymmB, ymmC, 0); + cc.evex().vpcmpub(kA, zmmB, zmmC, 0); + cc.evex().vpcmpud(kA, xmmB, xmmC, 0); + cc.evex().vpcmpud(kA, ymmB, ymmC, 0); + cc.evex().vpcmpud(kA, zmmB, zmmC, 0); + cc.evex().vpcmpuq(kA, xmmB, xmmC, 0); + cc.evex().vpcmpuq(kA, ymmB, ymmC, 0); + cc.evex().vpcmpuq(kA, zmmB, zmmC, 0); + cc.evex().vpcmpuw(kA, xmmB, xmmC, 0); + cc.evex().vpcmpuw(kA, ymmB, ymmC, 0); + cc.evex().vpcmpuw(kA, zmmB, zmmC, 0); + cc.evex().vpcmpw(kA, xmmB, xmmC, 0); + cc.evex().vpcmpw(kA, ymmB, ymmC, 0); + cc.evex().vpcmpw(kA, zmmB, zmmC, 0); + cc.evex().vpcompressd(xmmA, xmmB); + cc.evex().vpcompressd(ymmA, ymmB); + cc.evex().vpcompressd(zmmA, zmmB); + cc.evex().vpcompressq(xmmA, xmmB); + cc.evex().vpcompressq(ymmA, ymmB); + cc.evex().vpcompressq(zmmA, zmmB); + cc.evex().vpconflictd(xmmA, xmmB); + cc.evex().vpconflictd(ymmA, ymmB); + cc.evex().vpconflictd(zmmA, zmmB); + cc.evex().vpconflictq(xmmA, xmmB); + cc.evex().vpconflictq(ymmA, ymmB); + cc.evex().vpconflictq(zmmA, zmmB); + cc.evex().vpermb(xmmA, xmmB, xmmC); + cc.evex().vpermb(ymmA, ymmB, ymmC); + cc.evex().vpermb(zmmA, zmmB, zmmC); + cc.evex().vpermd(ymmA, ymmB, ymmC); + cc.evex().vpermd(zmmA, zmmB, zmmC); + cc.evex().vpermi2b(xmmA, xmmB, xmmC); + cc.evex().vpermi2b(ymmA, ymmB, ymmC); + cc.evex().vpermi2b(zmmA, zmmB, zmmC); + cc.evex().vpermi2d(xmmA, xmmB, xmmC); + cc.evex().vpermi2d(ymmA, ymmB, ymmC); + cc.evex().vpermi2d(zmmA, zmmB, zmmC); + cc.evex().vpermi2pd(xmmA, xmmB, xmmC); + cc.evex().vpermi2pd(ymmA, ymmB, ymmC); + cc.evex().vpermi2pd(zmmA, zmmB, zmmC); + cc.evex().vpermi2ps(xmmA, xmmB, xmmC); + cc.evex().vpermi2ps(ymmA, ymmB, ymmC); + cc.evex().vpermi2ps(zmmA, zmmB, zmmC); + cc.evex().vpermi2q(xmmA, xmmB, xmmC); + cc.evex().vpermi2q(ymmA, ymmB, ymmC); + cc.evex().vpermi2q(zmmA, zmmB, zmmC); + cc.evex().vpermi2w(xmmA, xmmB, xmmC); + cc.evex().vpermi2w(ymmA, ymmB, ymmC); + cc.evex().vpermi2w(zmmA, zmmB, zmmC); + cc.evex().vpermilpd(xmmA, xmmB, xmmC); + cc.evex().vpermilpd(ymmA, ymmB, ymmC); + cc.evex().vpermilpd(zmmA, zmmB, zmmC); + cc.evex().vpermilpd(xmmA, xmmB, 0); + cc.evex().vpermilpd(ymmA, ymmB, 0); + cc.evex().vpermilpd(zmmA, zmmB, 0); + cc.evex().vpermilps(xmmA, xmmB, xmmC); + cc.evex().vpermilps(ymmA, ymmB, ymmC); + cc.evex().vpermilps(zmmA, zmmB, zmmC); + cc.evex().vpermilps(xmmA, xmmB, 0); + cc.evex().vpermilps(ymmA, ymmB, 0); + cc.evex().vpermilps(zmmA, zmmB, 0); + cc.evex().vpermq(ymmA, ymmB, ymmC); + cc.evex().vpermq(zmmA, zmmB, zmmC); + cc.evex().vpermq(ymmA, ymmB, 0); + cc.evex().vpermq(zmmA, zmmB, 0); + cc.evex().vpermt2b(xmmA, xmmB, xmmC); + cc.evex().vpermt2b(ymmA, ymmB, ymmC); + cc.evex().vpermt2b(zmmA, zmmB, zmmC); + cc.evex().vpermt2d(xmmA, xmmB, xmmC); + cc.evex().vpermt2d(ymmA, ymmB, ymmC); + cc.evex().vpermt2d(zmmA, zmmB, zmmC); + cc.evex().vpermt2pd(xmmA, xmmB, xmmC); + cc.evex().vpermt2pd(ymmA, ymmB, ymmC); + cc.evex().vpermt2pd(zmmA, zmmB, zmmC); + cc.evex().vpermt2ps(xmmA, xmmB, xmmC); + cc.evex().vpermt2ps(ymmA, ymmB, ymmC); + cc.evex().vpermt2ps(zmmA, zmmB, zmmC); + cc.evex().vpermt2q(xmmA, xmmB, xmmC); + cc.evex().vpermt2q(ymmA, ymmB, ymmC); + cc.evex().vpermt2q(zmmA, zmmB, zmmC); + cc.evex().vpermt2w(xmmA, xmmB, xmmC); + cc.evex().vpermt2w(ymmA, ymmB, ymmC); + cc.evex().vpermt2w(zmmA, zmmB, zmmC); + cc.evex().vpermw(xmmA, xmmB, xmmC); + cc.evex().vpermw(ymmA, ymmB, ymmC); + cc.evex().vpermw(zmmA, zmmB, zmmC); + cc.evex().vpexpandd(xmmA, xmmB); + cc.evex().vpexpandd(ymmA, ymmB); + cc.evex().vpexpandd(zmmA, zmmB); + cc.evex().vpexpandq(xmmA, xmmB); + cc.evex().vpexpandq(ymmA, ymmB); + cc.evex().vpexpandq(zmmA, zmmB); + cc.evex().vpextrb(gpd, xmmB, 0); + cc.evex().vpextrd(gpd, xmmB, 0); + if (cc.is64Bit()) cc.evex().vpextrq(gpq, xmmB, 0); + cc.evex().vpextrw(gpd, xmmB, 0); + cc.evex().vpinsrb(xmmA, xmmB, gpd, 0); + cc.evex().vpinsrd(xmmA, xmmB, gpd, 0); + if (cc.is64Bit()) cc.evex().vpinsrq(xmmA, xmmB, gpq, 0); + cc.evex().vpinsrw(xmmA, xmmB, gpd, 0); + cc.evex().vplzcntd(xmmA, xmmB); + cc.evex().vplzcntd(ymmA, ymmB); + cc.evex().vplzcntd(zmmA, zmmB); + cc.evex().vplzcntq(xmmA, xmmB); + cc.evex().vplzcntq(ymmA, ymmB); + cc.evex().vplzcntq(zmmA, zmmB); + cc.evex().vpmadd52huq(xmmA, xmmB, xmmC); + cc.evex().vpmadd52huq(ymmA, ymmB, ymmC); + cc.evex().vpmadd52huq(zmmA, zmmB, zmmC); + cc.evex().vpmadd52luq(xmmA, xmmB, xmmC); + cc.evex().vpmadd52luq(ymmA, ymmB, ymmC); + cc.evex().vpmadd52luq(zmmA, zmmB, zmmC); + cc.evex().vpmaddubsw(xmmA, xmmB, xmmC); + cc.evex().vpmaddubsw(ymmA, ymmB, ymmC); + cc.evex().vpmaddubsw(zmmA, zmmB, zmmC); + cc.evex().vpmaddwd(xmmA, xmmB, xmmC); + cc.evex().vpmaddwd(ymmA, ymmB, ymmC); + cc.evex().vpmaddwd(zmmA, zmmB, zmmC); + cc.evex().vpmaxsb(xmmA, xmmB, xmmC); + cc.evex().vpmaxsb(ymmA, ymmB, ymmC); + cc.evex().vpmaxsb(zmmA, zmmB, zmmC); + cc.evex().vpmaxsd(xmmA, xmmB, xmmC); + cc.evex().vpmaxsd(ymmA, ymmB, ymmC); + cc.evex().vpmaxsd(zmmA, zmmB, zmmC); + cc.evex().vpmaxsq(xmmA, xmmB, xmmC); + cc.evex().vpmaxsq(ymmA, ymmB, ymmC); + cc.evex().vpmaxsq(zmmA, zmmB, zmmC); + cc.evex().vpmaxsw(xmmA, xmmB, xmmC); + cc.evex().vpmaxsw(ymmA, ymmB, ymmC); + cc.evex().vpmaxsw(zmmA, zmmB, zmmC); + cc.evex().vpmaxub(xmmA, xmmB, xmmC); + cc.evex().vpmaxub(ymmA, ymmB, ymmC); + cc.evex().vpmaxub(zmmA, zmmB, zmmC); + cc.evex().vpmaxud(xmmA, xmmB, xmmC); + cc.evex().vpmaxud(ymmA, ymmB, ymmC); + cc.evex().vpmaxud(zmmA, zmmB, zmmC); + cc.evex().vpmaxuq(xmmA, xmmB, xmmC); + cc.evex().vpmaxuq(ymmA, ymmB, ymmC); + cc.evex().vpmaxuq(zmmA, zmmB, zmmC); + cc.evex().vpmaxuw(xmmA, xmmB, xmmC); + cc.evex().vpmaxuw(ymmA, ymmB, ymmC); + cc.evex().vpmaxuw(zmmA, zmmB, zmmC); + cc.evex().vpminsb(xmmA, xmmB, xmmC); + cc.evex().vpminsb(ymmA, ymmB, ymmC); + cc.evex().vpminsb(zmmA, zmmB, zmmC); + cc.evex().vpminsd(xmmA, xmmB, xmmC); + cc.evex().vpminsd(ymmA, ymmB, ymmC); + cc.evex().vpminsd(zmmA, zmmB, zmmC); + cc.evex().vpminsq(xmmA, xmmB, xmmC); + cc.evex().vpminsq(ymmA, ymmB, ymmC); + cc.evex().vpminsq(zmmA, zmmB, zmmC); + cc.evex().vpminsw(xmmA, xmmB, xmmC); + cc.evex().vpminsw(ymmA, ymmB, ymmC); + cc.evex().vpminsw(zmmA, zmmB, zmmC); + cc.evex().vpminub(xmmA, xmmB, xmmC); + cc.evex().vpminub(ymmA, ymmB, ymmC); + cc.evex().vpminub(zmmA, zmmB, zmmC); + cc.evex().vpminud(xmmA, xmmB, xmmC); + cc.evex().vpminud(ymmA, ymmB, ymmC); + cc.evex().vpminud(zmmA, zmmB, zmmC); + cc.evex().vpminuq(xmmA, xmmB, xmmC); + cc.evex().vpminuq(ymmA, ymmB, ymmC); + cc.evex().vpminuq(zmmA, zmmB, zmmC); + cc.evex().vpminuw(xmmA, xmmB, xmmC); + cc.evex().vpminuw(ymmA, ymmB, ymmC); + cc.evex().vpminuw(zmmA, zmmB, zmmC); + cc.evex().vpmovb2m(kA, xmmB); + cc.evex().vpmovb2m(kA, ymmB); + cc.evex().vpmovb2m(kA, zmmB); + cc.evex().vpmovd2m(kA, xmmB); + cc.evex().vpmovd2m(kA, ymmB); + cc.evex().vpmovd2m(kA, zmmB); + cc.evex().vpmovdb(xmmA, xmmB); + cc.evex().vpmovdb(xmmA, ymmB); + cc.evex().vpmovdb(xmmA, zmmB); + cc.evex().vpmovdw(xmmA, xmmB); + cc.evex().vpmovdw(xmmA, ymmB); + cc.evex().vpmovdw(ymmA, zmmB); + cc.evex().vpmovm2b(xmmA, kB); + cc.evex().vpmovm2b(ymmA, kB); + cc.evex().vpmovm2b(zmmA, kB); + cc.evex().vpmovm2d(xmmA, kB); + cc.evex().vpmovm2d(ymmA, kB); + cc.evex().vpmovm2d(zmmA, kB); + cc.evex().vpmovm2q(xmmA, kB); + cc.evex().vpmovm2q(ymmA, kB); + cc.evex().vpmovm2q(zmmA, kB); + cc.evex().vpmovm2w(xmmA, kB); + cc.evex().vpmovm2w(ymmA, kB); + cc.evex().vpmovm2w(zmmA, kB); + cc.evex().vpmovq2m(kA, xmmB); + cc.evex().vpmovq2m(kA, ymmB); + cc.evex().vpmovq2m(kA, zmmB); + cc.evex().vpmovqb(xmmA, xmmB); + cc.evex().vpmovqb(xmmA, ymmB); + cc.evex().vpmovqb(xmmA, zmmB); + cc.evex().vpmovqd(xmmA, xmmB); + cc.evex().vpmovqd(xmmA, ymmB); + cc.evex().vpmovqd(ymmA, zmmB); + cc.evex().vpmovqw(xmmA, xmmB); + cc.evex().vpmovqw(xmmA, ymmB); + cc.evex().vpmovqw(xmmA, zmmB); + cc.evex().vpmovsdb(xmmA, xmmB); + cc.evex().vpmovsdb(xmmA, ymmB); + cc.evex().vpmovsdb(xmmA, zmmB); + cc.evex().vpmovsdw(xmmA, xmmB); + cc.evex().vpmovsdw(xmmA, ymmB); + cc.evex().vpmovsdw(ymmA, zmmB); + cc.evex().vpmovsqb(xmmA, xmmB); + cc.evex().vpmovsqb(xmmA, ymmB); + cc.evex().vpmovsqb(xmmA, zmmB); + cc.evex().vpmovsqd(xmmA, xmmB); + cc.evex().vpmovsqd(xmmA, ymmB); + cc.evex().vpmovsqd(ymmA, zmmB); + cc.evex().vpmovsqw(xmmA, xmmB); + cc.evex().vpmovsqw(xmmA, ymmB); + cc.evex().vpmovsqw(xmmA, zmmB); + cc.evex().vpmovswb(xmmA, xmmB); + cc.evex().vpmovswb(xmmA, ymmB); + cc.evex().vpmovswb(ymmA, zmmB); + cc.evex().vpmovsxbd(xmmA, xmmB); + cc.evex().vpmovsxbd(ymmA, xmmB); + cc.evex().vpmovsxbd(zmmA, xmmB); + cc.evex().vpmovsxbq(xmmA, xmmB); + cc.evex().vpmovsxbq(ymmA, xmmB); + cc.evex().vpmovsxbq(zmmA, xmmB); + cc.evex().vpmovsxbw(xmmA, xmmB); + cc.evex().vpmovsxbw(ymmA, xmmB); + cc.evex().vpmovsxbw(zmmA, ymmB); + cc.evex().vpmovsxdq(xmmA, xmmB); + cc.evex().vpmovsxdq(ymmA, xmmB); + cc.evex().vpmovsxdq(zmmA, ymmB); + cc.evex().vpmovsxwd(xmmA, xmmB); + cc.evex().vpmovsxwd(ymmA, xmmB); + cc.evex().vpmovsxwd(zmmA, ymmB); + cc.evex().vpmovsxwq(xmmA, xmmB); + cc.evex().vpmovsxwq(ymmA, xmmB); + cc.evex().vpmovsxwq(zmmA, xmmB); + cc.evex().vpmovusdb(xmmA, xmmB); + cc.evex().vpmovusdb(xmmA, ymmB); + cc.evex().vpmovusdb(xmmA, zmmB); + cc.evex().vpmovusdw(xmmA, xmmB); + cc.evex().vpmovusdw(xmmA, ymmB); + cc.evex().vpmovusdw(ymmA, zmmB); + cc.evex().vpmovusqb(xmmA, xmmB); + cc.evex().vpmovusqb(xmmA, ymmB); + cc.evex().vpmovusqb(xmmA, zmmB); + cc.evex().vpmovusqd(xmmA, xmmB); + cc.evex().vpmovusqd(xmmA, ymmB); + cc.evex().vpmovusqd(ymmA, zmmB); + cc.evex().vpmovusqw(xmmA, xmmB); + cc.evex().vpmovusqw(xmmA, ymmB); + cc.evex().vpmovusqw(xmmA, zmmB); + cc.evex().vpmovuswb(xmmA, xmmB); + cc.evex().vpmovuswb(xmmA, ymmB); + cc.evex().vpmovuswb(ymmA, zmmB); + cc.evex().vpmovw2m(kA, xmmB); + cc.evex().vpmovw2m(kA, ymmB); + cc.evex().vpmovw2m(kA, zmmB); + cc.evex().vpmovwb(xmmA, xmmB); + cc.evex().vpmovwb(xmmA, ymmB); + cc.evex().vpmovwb(ymmA, zmmB); + cc.evex().vpmovzxbd(xmmA, xmmB); + cc.evex().vpmovzxbd(ymmA, xmmB); + cc.evex().vpmovzxbd(zmmA, xmmB); + cc.evex().vpmovzxbq(xmmA, xmmB); + cc.evex().vpmovzxbq(ymmA, xmmB); + cc.evex().vpmovzxbq(zmmA, xmmB); + cc.evex().vpmovzxbw(xmmA, xmmB); + cc.evex().vpmovzxbw(ymmA, xmmB); + cc.evex().vpmovzxbw(zmmA, ymmB); + cc.evex().vpmovzxdq(xmmA, xmmB); + cc.evex().vpmovzxdq(ymmA, xmmB); + cc.evex().vpmovzxdq(zmmA, ymmB); + cc.evex().vpmovzxwd(xmmA, xmmB); + cc.evex().vpmovzxwd(ymmA, xmmB); + cc.evex().vpmovzxwd(zmmA, ymmB); + cc.evex().vpmovzxwq(xmmA, xmmB); + cc.evex().vpmovzxwq(ymmA, xmmB); + cc.evex().vpmovzxwq(zmmA, xmmB); + cc.evex().vpmuldq(xmmA, xmmB, xmmC); + cc.evex().vpmuldq(ymmA, ymmB, ymmC); + cc.evex().vpmuldq(zmmA, zmmB, zmmC); + cc.evex().vpmulhrsw(xmmA, xmmB, xmmC); + cc.evex().vpmulhrsw(ymmA, ymmB, ymmC); + cc.evex().vpmulhrsw(zmmA, zmmB, zmmC); + cc.evex().vpmulhuw(xmmA, xmmB, xmmC); + cc.evex().vpmulhuw(ymmA, ymmB, ymmC); + cc.evex().vpmulhuw(zmmA, zmmB, zmmC); + cc.evex().vpmulhw(xmmA, xmmB, xmmC); + cc.evex().vpmulhw(ymmA, ymmB, ymmC); + cc.evex().vpmulhw(zmmA, zmmB, zmmC); + cc.evex().vpmulld(xmmA, xmmB, xmmC); + cc.evex().vpmulld(ymmA, ymmB, ymmC); + cc.evex().vpmulld(zmmA, zmmB, zmmC); + cc.evex().vpmullq(xmmA, xmmB, xmmC); + cc.evex().vpmullq(ymmA, ymmB, ymmC); + cc.evex().vpmullq(zmmA, zmmB, zmmC); + cc.evex().vpmullw(xmmA, xmmB, xmmC); + cc.evex().vpmullw(ymmA, ymmB, ymmC); + cc.evex().vpmullw(zmmA, zmmB, zmmC); + cc.evex().vpmultishiftqb(xmmA, xmmB, xmmC); + cc.evex().vpmultishiftqb(ymmA, ymmB, ymmC); + cc.evex().vpmultishiftqb(zmmA, zmmB, zmmC); + cc.evex().vpmuludq(xmmA, xmmB, xmmC); + cc.evex().vpmuludq(ymmA, ymmB, ymmC); + cc.evex().vpmuludq(zmmA, zmmB, zmmC); + cc.evex().vpopcntd(zmmA, zmmB); + cc.evex().vpopcntq(zmmA, zmmB); + cc.evex().vpord(xmmA, xmmB, xmmC); + cc.evex().vpord(ymmA, ymmB, ymmC); + cc.evex().vpord(zmmA, zmmB, zmmC); + cc.evex().vporq(xmmA, xmmB, xmmC); + cc.evex().vporq(ymmA, ymmB, ymmC); + cc.evex().vporq(zmmA, zmmB, zmmC); + cc.evex().vprold(xmmA, xmmB, 0); + cc.evex().vprold(ymmA, ymmB, 0); + cc.evex().vprold(zmmA, zmmB, 0); + cc.evex().vprolq(xmmA, xmmB, 0); + cc.evex().vprolq(ymmA, ymmB, 0); + cc.evex().vprolq(zmmA, zmmB, 0); + cc.evex().vprolvd(xmmA, xmmB, xmmC); + cc.evex().vprolvd(ymmA, ymmB, ymmC); + cc.evex().vprolvd(zmmA, zmmB, zmmC); + cc.evex().vprolvq(xmmA, xmmB, xmmC); + cc.evex().vprolvq(ymmA, ymmB, ymmC); + cc.evex().vprolvq(zmmA, zmmB, zmmC); + cc.evex().vprord(xmmA, xmmB, 0); + cc.evex().vprord(ymmA, ymmB, 0); + cc.evex().vprord(zmmA, zmmB, 0); + cc.evex().vprorq(xmmA, xmmB, 0); + cc.evex().vprorq(ymmA, ymmB, 0); + cc.evex().vprorq(zmmA, zmmB, 0); + cc.evex().vprorvd(xmmA, xmmB, xmmC); + cc.evex().vprorvd(ymmA, ymmB, ymmC); + cc.evex().vprorvd(zmmA, zmmB, zmmC); + cc.evex().vprorvq(xmmA, xmmB, xmmC); + cc.evex().vprorvq(ymmA, ymmB, ymmC); + cc.evex().vprorvq(zmmA, zmmB, zmmC); + cc.evex().vpsadbw(xmmA, xmmB, xmmC); + cc.evex().vpsadbw(ymmA, ymmB, ymmC); + cc.evex().vpsadbw(zmmA, zmmB, zmmC); + cc.evex().vpshufb(xmmA, xmmB, xmmC); + cc.evex().vpshufb(ymmA, ymmB, ymmC); + cc.evex().vpshufb(zmmA, zmmB, zmmC); + cc.evex().vpshufd(xmmA, xmmB, 0); + cc.evex().vpshufd(ymmA, ymmB, 0); + cc.evex().vpshufd(zmmA, zmmB, 0); + cc.evex().vpshufhw(xmmA, xmmB, 0); + cc.evex().vpshufhw(ymmA, ymmB, 0); + cc.evex().vpshufhw(zmmA, zmmB, 0); + cc.evex().vpshuflw(xmmA, xmmB, 0); + cc.evex().vpshuflw(ymmA, ymmB, 0); + cc.evex().vpshuflw(zmmA, zmmB, 0); + cc.evex().vpslld(xmmA, xmmB, xmmC); + cc.evex().vpslld(xmmA, xmmB, 0); + cc.evex().vpslld(ymmA, ymmB, xmmC); + cc.evex().vpslld(ymmA, ymmB, 0); + cc.evex().vpslld(zmmA, zmmB, xmmC); + cc.evex().vpslld(zmmA, zmmB, 0); + cc.evex().vpslldq(xmmA, xmmB, 0); + cc.evex().vpslldq(ymmA, ymmB, 0); + cc.evex().vpslldq(zmmA, zmmB, 0); + cc.evex().vpsllq(xmmA, xmmB, xmmC); + cc.evex().vpsllq(xmmA, xmmB, 0); + cc.evex().vpsllq(ymmA, ymmB, xmmC); + cc.evex().vpsllq(ymmA, ymmB, 0); + cc.evex().vpsllq(zmmA, zmmB, xmmC); + cc.evex().vpsllq(zmmA, zmmB, 0); + cc.evex().vpsllvd(xmmA, xmmB, xmmC); + cc.evex().vpsllvd(ymmA, ymmB, ymmC); + cc.evex().vpsllvd(zmmA, zmmB, zmmC); + cc.evex().vpsllvq(xmmA, xmmB, xmmC); + cc.evex().vpsllvq(ymmA, ymmB, ymmC); + cc.evex().vpsllvq(zmmA, zmmB, zmmC); + cc.evex().vpsllvw(xmmA, xmmB, xmmC); + cc.evex().vpsllvw(ymmA, ymmB, ymmC); + cc.evex().vpsllvw(zmmA, zmmB, zmmC); + cc.evex().vpsllw(xmmA, xmmB, xmmC); + cc.evex().vpsllw(xmmA, xmmB, 0); + cc.evex().vpsllw(ymmA, ymmB, xmmC); + cc.evex().vpsllw(ymmA, ymmB, 0); + cc.evex().vpsllw(zmmA, zmmB, xmmC); + cc.evex().vpsllw(zmmA, zmmB, 0); + cc.evex().vpsrad(xmmA, xmmB, xmmC); + cc.evex().vpsrad(xmmA, xmmB, 0); + cc.evex().vpsrad(ymmA, ymmB, xmmC); + cc.evex().vpsrad(ymmA, ymmB, 0); + cc.evex().vpsrad(zmmA, zmmB, xmmC); + cc.evex().vpsrad(zmmA, zmmB, 0); + cc.evex().vpsraq(xmmA, xmmB, xmmC); + cc.evex().vpsraq(xmmA, xmmB, 0); + cc.evex().vpsraq(ymmA, ymmB, xmmC); + cc.evex().vpsraq(ymmA, ymmB, 0); + cc.evex().vpsraq(zmmA, zmmB, xmmC); + cc.evex().vpsraq(zmmA, zmmB, 0); + cc.evex().vpsravd(xmmA, xmmB, xmmC); + cc.evex().vpsravd(ymmA, ymmB, ymmC); + cc.evex().vpsravd(zmmA, zmmB, zmmC); + cc.evex().vpsravq(xmmA, xmmB, xmmC); + cc.evex().vpsravq(ymmA, ymmB, ymmC); + cc.evex().vpsravq(zmmA, zmmB, zmmC); + cc.evex().vpsravw(xmmA, xmmB, xmmC); + cc.evex().vpsravw(ymmA, ymmB, ymmC); + cc.evex().vpsravw(zmmA, zmmB, zmmC); + cc.evex().vpsraw(xmmA, xmmB, xmmC); + cc.evex().vpsraw(xmmA, xmmB, 0); + cc.evex().vpsraw(ymmA, ymmB, xmmC); + cc.evex().vpsraw(ymmA, ymmB, 0); + cc.evex().vpsraw(zmmA, zmmB, xmmC); + cc.evex().vpsraw(zmmA, zmmB, 0); + cc.evex().vpsrld(xmmA, xmmB, xmmC); + cc.evex().vpsrld(xmmA, xmmB, 0); + cc.evex().vpsrld(ymmA, ymmB, xmmC); + cc.evex().vpsrld(ymmA, ymmB, 0); + cc.evex().vpsrld(zmmA, zmmB, xmmC); + cc.evex().vpsrld(zmmA, zmmB, 0); + cc.evex().vpsrldq(xmmA, xmmB, 0); + cc.evex().vpsrldq(ymmA, ymmB, 0); + cc.evex().vpsrldq(zmmA, zmmB, 0); + cc.evex().vpsrlq(xmmA, xmmB, xmmC); + cc.evex().vpsrlq(xmmA, xmmB, 0); + cc.evex().vpsrlq(ymmA, ymmB, xmmC); + cc.evex().vpsrlq(ymmA, ymmB, 0); + cc.evex().vpsrlq(zmmA, zmmB, xmmC); + cc.evex().vpsrlq(zmmA, zmmB, 0); + cc.evex().vpsrlvd(xmmA, xmmB, xmmC); + cc.evex().vpsrlvd(ymmA, ymmB, ymmC); + cc.evex().vpsrlvd(zmmA, zmmB, zmmC); + cc.evex().vpsrlvq(xmmA, xmmB, xmmC); + cc.evex().vpsrlvq(ymmA, ymmB, ymmC); + cc.evex().vpsrlvq(zmmA, zmmB, zmmC); + cc.evex().vpsrlvw(xmmA, xmmB, xmmC); + cc.evex().vpsrlvw(ymmA, ymmB, ymmC); + cc.evex().vpsrlvw(zmmA, zmmB, zmmC); + cc.evex().vpsrlw(xmmA, xmmB, xmmC); + cc.evex().vpsrlw(xmmA, xmmB, 0); + cc.evex().vpsrlw(ymmA, ymmB, xmmC); + cc.evex().vpsrlw(ymmA, ymmB, 0); + cc.evex().vpsrlw(zmmA, zmmB, xmmC); + cc.evex().vpsrlw(zmmA, zmmB, 0); + cc.evex().vpsubb(xmmA, xmmB, xmmC); + cc.evex().vpsubb(ymmA, ymmB, ymmC); + cc.evex().vpsubb(zmmA, zmmB, zmmC); + cc.evex().vpsubd(xmmA, xmmB, xmmC); + cc.evex().vpsubd(ymmA, ymmB, ymmC); + cc.evex().vpsubd(zmmA, zmmB, zmmC); + cc.evex().vpsubq(xmmA, xmmB, xmmC); + cc.evex().vpsubq(ymmA, ymmB, ymmC); + cc.evex().vpsubq(zmmA, zmmB, zmmC); + cc.evex().vpsubsb(xmmA, xmmB, xmmC); + cc.evex().vpsubsb(ymmA, ymmB, ymmC); + cc.evex().vpsubsb(zmmA, zmmB, zmmC); + cc.evex().vpsubsw(xmmA, xmmB, xmmC); + cc.evex().vpsubsw(ymmA, ymmB, ymmC); + cc.evex().vpsubsw(zmmA, zmmB, zmmC); + cc.evex().vpsubusb(xmmA, xmmB, xmmC); + cc.evex().vpsubusb(ymmA, ymmB, ymmC); + cc.evex().vpsubusb(zmmA, zmmB, zmmC); + cc.evex().vpsubusw(xmmA, xmmB, xmmC); + cc.evex().vpsubusw(ymmA, ymmB, ymmC); + cc.evex().vpsubusw(zmmA, zmmB, zmmC); + cc.evex().vpsubw(xmmA, xmmB, xmmC); + cc.evex().vpsubw(ymmA, ymmB, ymmC); + cc.evex().vpsubw(zmmA, zmmB, zmmC); + cc.evex().vpternlogd(xmmA, xmmB, xmmC, 0); + cc.evex().vpternlogd(ymmA, ymmB, ymmC, 0); + cc.evex().vpternlogd(zmmA, zmmB, zmmC, 0); + cc.evex().vpternlogq(xmmA, xmmB, xmmC, 0); + cc.evex().vpternlogq(ymmA, ymmB, ymmC, 0); + cc.evex().vpternlogq(zmmA, zmmB, zmmC, 0); + cc.evex().vptestmb(kA, xmmB, xmmC); + cc.evex().vptestmb(kA, ymmB, ymmC); + cc.evex().vptestmb(kA, zmmB, zmmC); + cc.evex().vptestmd(kA, xmmB, xmmC); + cc.evex().vptestmd(kA, ymmB, ymmC); + cc.evex().vptestmd(kA, zmmB, zmmC); + cc.evex().vptestmq(kA, xmmB, xmmC); + cc.evex().vptestmq(kA, ymmB, ymmC); + cc.evex().vptestmq(kA, zmmB, zmmC); + cc.evex().vptestmw(kA, xmmB, xmmC); + cc.evex().vptestmw(kA, ymmB, ymmC); + cc.evex().vptestmw(kA, zmmB, zmmC); + cc.evex().vptestnmb(kA, xmmB, xmmC); + cc.evex().vptestnmb(kA, ymmB, ymmC); + cc.evex().vptestnmb(kA, zmmB, zmmC); + cc.evex().vptestnmd(kA, xmmB, xmmC); + cc.evex().vptestnmd(kA, ymmB, ymmC); + cc.evex().vptestnmd(kA, zmmB, zmmC); + cc.evex().vptestnmq(kA, xmmB, xmmC); + cc.evex().vptestnmq(kA, ymmB, ymmC); + cc.evex().vptestnmq(kA, zmmB, zmmC); + cc.evex().vptestnmw(kA, xmmB, xmmC); + cc.evex().vptestnmw(kA, ymmB, ymmC); + cc.evex().vptestnmw(kA, zmmB, zmmC); + cc.evex().vpunpckhbw(xmmA, xmmB, xmmC); + cc.evex().vpunpckhbw(ymmA, ymmB, ymmC); + cc.evex().vpunpckhbw(zmmA, zmmB, zmmC); + cc.evex().vpunpckhdq(xmmA, xmmB, xmmC); + cc.evex().vpunpckhdq(ymmA, ymmB, ymmC); + cc.evex().vpunpckhdq(zmmA, zmmB, zmmC); + cc.evex().vpunpckhqdq(xmmA, xmmB, xmmC); + cc.evex().vpunpckhqdq(ymmA, ymmB, ymmC); + cc.evex().vpunpckhqdq(zmmA, zmmB, zmmC); + cc.evex().vpunpckhwd(xmmA, xmmB, xmmC); + cc.evex().vpunpckhwd(ymmA, ymmB, ymmC); + cc.evex().vpunpckhwd(zmmA, zmmB, zmmC); + cc.evex().vpunpcklbw(xmmA, xmmB, xmmC); + cc.evex().vpunpcklbw(ymmA, ymmB, ymmC); + cc.evex().vpunpcklbw(zmmA, zmmB, zmmC); + cc.evex().vpunpckldq(xmmA, xmmB, xmmC); + cc.evex().vpunpckldq(ymmA, ymmB, ymmC); + cc.evex().vpunpckldq(zmmA, zmmB, zmmC); + cc.evex().vpunpcklqdq(xmmA, xmmB, xmmC); + cc.evex().vpunpcklqdq(ymmA, ymmB, ymmC); + cc.evex().vpunpcklqdq(zmmA, zmmB, zmmC); + cc.evex().vpunpcklwd(xmmA, xmmB, xmmC); + cc.evex().vpunpcklwd(ymmA, ymmB, ymmC); + cc.evex().vpunpcklwd(zmmA, zmmB, zmmC); + cc.evex().vpxord(xmmA, xmmB, xmmC); + cc.evex().vpxord(ymmA, ymmB, ymmC); + cc.evex().vpxord(zmmA, zmmB, zmmC); + cc.evex().vpxorq(xmmA, xmmB, xmmC); + cc.evex().vpxorq(ymmA, ymmB, ymmC); + cc.evex().vpxorq(zmmA, zmmB, zmmC); + cc.evex().vrangepd(xmmA, xmmB, xmmC, 0); + cc.evex().vrangepd(ymmA, ymmB, ymmC, 0); + cc.evex().vrangepd(zmmA, zmmB, zmmC, 0); + cc.evex().vrangeps(xmmA, xmmB, xmmC, 0); + cc.evex().vrangeps(ymmA, ymmB, ymmC, 0); + cc.evex().vrangeps(zmmA, zmmB, zmmC, 0); + cc.evex().vrangesd(xmmA, xmmB, xmmC, 0); + cc.evex().vrangess(xmmA, xmmB, xmmC, 0); + cc.evex().vrcp14pd(xmmA, xmmB); + cc.evex().vrcp14pd(ymmA, ymmB); + cc.evex().vrcp14pd(zmmA, zmmB); + cc.evex().vrcp14ps(xmmA, xmmB); + cc.evex().vrcp14ps(ymmA, ymmB); + cc.evex().vrcp14ps(zmmA, zmmB); + cc.evex().vrcp14sd(xmmA, xmmB, xmmC); + cc.evex().vrcp14ss(xmmA, xmmB, xmmC); + cc.evex().vrcp28pd(zmmA, zmmB); + cc.evex().vrcp28ps(zmmA, zmmB); + cc.evex().vrcp28sd(xmmA, xmmB, xmmC); + cc.evex().vrcp28ss(xmmA, xmmB, xmmC); + cc.evex().vreducepd(xmmA, xmmB, 0); + cc.evex().vreducepd(ymmA, ymmB, 0); + cc.evex().vreducepd(zmmA, zmmB, 0); + cc.evex().vreduceps(xmmA, xmmB, 0); + cc.evex().vreduceps(ymmA, ymmB, 0); + cc.evex().vreduceps(zmmA, zmmB, 0); + cc.evex().vreducesd(xmmA, xmmB, xmmC, 0); + cc.evex().vreducess(xmmA, xmmB, xmmC, 0); + cc.evex().vrndscalepd(xmmA, xmmB, 0); + cc.evex().vrndscalepd(ymmA, ymmB, 0); + cc.evex().vrndscalepd(zmmA, zmmB, 0); + cc.evex().vrndscaleps(xmmA, xmmB, 0); + cc.evex().vrndscaleps(ymmA, ymmB, 0); + cc.evex().vrndscaleps(zmmA, zmmB, 0); + cc.evex().vrndscalesd(xmmA, xmmB, xmmC, 0); + cc.evex().vrndscaless(xmmA, xmmB, xmmC, 0); + cc.evex().vrsqrt14pd(xmmA, xmmB); + cc.evex().vrsqrt14pd(ymmA, ymmB); + cc.evex().vrsqrt14pd(zmmA, zmmB); + cc.evex().vrsqrt14ps(xmmA, xmmB); + cc.evex().vrsqrt14ps(ymmA, ymmB); + cc.evex().vrsqrt14ps(zmmA, zmmB); + cc.evex().vrsqrt14sd(xmmA, xmmB, xmmC); + cc.evex().vrsqrt14ss(xmmA, xmmB, xmmC); + cc.evex().vrsqrt28pd(zmmA, zmmB); + cc.evex().vrsqrt28ps(zmmA, zmmB); + cc.evex().vrsqrt28sd(xmmA, xmmB, xmmC); + cc.evex().vrsqrt28ss(xmmA, xmmB, xmmC); + cc.evex().vscalefpd(xmmA, xmmB, xmmC); + cc.evex().vscalefpd(ymmA, ymmB, ymmC); + cc.evex().vscalefpd(zmmA, zmmB, zmmC); + cc.evex().vscalefps(xmmA, xmmB, xmmC); + cc.evex().vscalefps(ymmA, ymmB, ymmC); + cc.evex().vscalefps(zmmA, zmmB, zmmC); + cc.evex().vscalefsd(xmmA, xmmB, xmmC); + cc.evex().vscalefss(xmmA, xmmB, xmmC); + cc.evex().vshuff32x4(ymmA, ymmB, ymmC, 0); + cc.evex().vshuff32x4(zmmA, zmmB, zmmC, 0); + cc.evex().vshuff64x2(ymmA, ymmB, ymmC, 0); + cc.evex().vshuff64x2(zmmA, zmmB, zmmC, 0); + cc.evex().vshufi32x4(ymmA, ymmB, ymmC, 0); + cc.evex().vshufi32x4(zmmA, zmmB, zmmC, 0); + cc.evex().vshufi64x2(ymmA, ymmB, ymmC, 0); + cc.evex().vshufi64x2(zmmA, zmmB, zmmC, 0); + cc.evex().vshufpd(xmmA, xmmB, xmmC, 0); + cc.evex().vshufpd(ymmA, ymmB, ymmC, 0); + cc.evex().vshufpd(zmmA, zmmB, zmmC, 0); + cc.evex().vshufps(xmmA, xmmB, xmmC, 0); + cc.evex().vshufps(ymmA, ymmB, ymmC, 0); + cc.evex().vshufps(zmmA, zmmB, zmmC, 0); + cc.evex().vsqrtpd(xmmA, xmmB); + cc.evex().vsqrtpd(ymmA, ymmB); + cc.evex().vsqrtpd(zmmA, zmmB); + cc.evex().vsqrtps(xmmA, xmmB); + cc.evex().vsqrtps(ymmA, ymmB); + cc.evex().vsqrtps(zmmA, zmmB); + cc.evex().vsqrtsd(xmmA, xmmB, xmmC); + cc.evex().vsqrtss(xmmA, xmmB, xmmC); + cc.evex().vsubpd(xmmA, xmmB, xmmC); + cc.evex().vsubpd(ymmA, ymmB, ymmC); + cc.evex().vsubpd(zmmA, zmmB, zmmC); + cc.evex().vsubps(xmmA, xmmB, xmmC); + cc.evex().vsubps(ymmA, ymmB, ymmC); + cc.evex().vsubps(zmmA, zmmB, zmmC); + cc.evex().vsubsd(xmmA, xmmB, xmmC); + cc.evex().vsubss(xmmA, xmmB, xmmC); + cc.evex().vucomisd(xmmA, xmmB); + cc.evex().vucomiss(xmmA, xmmB); + cc.evex().vunpckhpd(xmmA, xmmB, xmmC); + cc.evex().vunpckhpd(ymmA, ymmB, ymmC); + cc.evex().vunpckhpd(zmmA, zmmB, zmmC); + cc.evex().vunpckhps(xmmA, xmmB, xmmC); + cc.evex().vunpckhps(ymmA, ymmB, ymmC); + cc.evex().vunpckhps(zmmA, zmmB, zmmC); + cc.evex().vunpcklpd(xmmA, xmmB, xmmC); + cc.evex().vunpcklpd(ymmA, ymmB, ymmC); + cc.evex().vunpcklpd(zmmA, zmmB, zmmC); + cc.evex().vunpcklps(xmmA, xmmB, xmmC); + cc.evex().vunpcklps(ymmA, ymmB, ymmC); + cc.evex().vunpcklps(zmmA, zmmB, zmmC); + cc.evex().vxorpd(xmmA, xmmB, xmmC); + cc.evex().vxorpd(ymmA, ymmB, ymmC); + cc.evex().vxorpd(zmmA, zmmB, zmmC); + cc.evex().vxorps(xmmA, xmmB, xmmC); + cc.evex().vxorps(ymmA, ymmB, ymmC); + cc.evex().vxorps(zmmA, zmmB, zmmC); +} + +template +static void generateAvx512SequenceInternalRegMem( + Emitter& cc, + const x86::Gp& gp, + const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC, + const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) { + + DebugUtils::unused(kC); + + x86::Gp gpd = gp.r32(); + x86::Gp gpq = gp.r64(); + x86::Gp gpz = cc.is32Bit() ? gpd : gpq; + + x86::Xmm xmmA = vecA.xmm(); + x86::Xmm xmmB = vecB.xmm(); + x86::Xmm xmmC = vecC.xmm(); + x86::Xmm xmmD = vecD.xmm(); + + x86::Ymm ymmA = vecA.ymm(); + x86::Ymm ymmB = vecB.ymm(); + x86::Ymm ymmD = vecD.ymm(); + + x86::Zmm zmmA = vecA.zmm(); + x86::Zmm zmmB = vecB.zmm(); x86::Zmm zmmD = vecD.zmm(); + x86::Mem m = x86::ptr(gpz); + x86::Mem m32 = x86::dword_ptr(gpz); + x86::Mem m64 = x86::qword_ptr(gpz); + x86::Mem m128 = x86::xmmword_ptr(gpz); + x86::Mem m256 = x86::ymmword_ptr(gpz); + x86::Mem m512 = x86::zmmword_ptr(gpz); + x86::Mem vx_ptr = x86::ptr(gpz, xmmD); + x86::Mem vy_ptr = x86::ptr(gpz, ymmD); + x86::Mem vz_ptr = x86::ptr(gpz, zmmD); + cc.xor_(gpd, gpd); cc.vxorps(xmmA, xmmA, xmmA); cc.vxorps(xmmB, xmmB, xmmB); cc.vxorps(xmmC, xmmC, xmmC); cc.vxorps(xmmD, xmmD, xmmD); - if (form == InstForm::kReg) { - cc.kaddb(kA, kB, kC); - cc.kaddd(kA, kB, kC); - cc.kaddq(kA, kB, kC); - cc.kaddw(kA, kB, kC); - cc.kandb(kA, kB, kC); - cc.kandd(kA, kB, kC); - cc.kandnb(kA, kB, kC); - cc.kandnd(kA, kB, kC); - cc.kandnq(kA, kB, kC); - cc.kandnw(kA, kB, kC); - cc.kandq(kA, kB, kC); - cc.kandw(kA, kB, kC); - cc.kmovb(kA, kB); - cc.kmovb(kA, gpd); - cc.kmovb(gpd, kB); - cc.kmovd(kA, kB); - cc.kmovd(kA, gpd); - cc.kmovd(gpd, kB); - cc.kmovq(kA, kB); - if (cc.is64Bit()) cc.kmovq(kA, gpq); - if (cc.is64Bit()) cc.kmovq(gpq, kB); - cc.kmovw(kA, kB); - cc.kmovw(kA, gpd); - cc.kmovw(gpd, kB); - cc.knotb(kA, kB); - cc.knotd(kA, kB); - cc.knotq(kA, kB); - cc.knotw(kA, kB); - cc.korb(kA, kB, kC); - cc.kord(kA, kB, kC); - cc.korq(kA, kB, kC); - cc.kortestb(kA, kB); - cc.kortestd(kA, kB); - cc.kortestq(kA, kB); - cc.kortestw(kA, kB); - cc.korw(kA, kB, kC); - cc.kshiftlb(kA, kB, 0); - cc.kshiftld(kA, kB, 0); - cc.kshiftlq(kA, kB, 0); - cc.kshiftlw(kA, kB, 0); - cc.kshiftrb(kA, kB, 0); - cc.kshiftrd(kA, kB, 0); - cc.kshiftrq(kA, kB, 0); - cc.kshiftrw(kA, kB, 0); - cc.ktestb(kA, kB); - cc.ktestd(kA, kB); - cc.ktestq(kA, kB); - cc.ktestw(kA, kB); - cc.kunpckbw(kA, kB, kC); - cc.kunpckdq(kA, kB, kC); - cc.kunpckwd(kA, kB, kC); - cc.kxnorb(kA, kB, kC); - cc.kxnord(kA, kB, kC); - cc.kxnorq(kA, kB, kC); - cc.kxnorw(kA, kB, kC); - cc.kxorb(kA, kB, kC); - cc.kxord(kA, kB, kC); - cc.kxorq(kA, kB, kC); - cc.kxorw(kA, kB, kC); - cc.nop(); - - cc.evex().vaddpd(xmmA, xmmB, xmmC); - cc.evex().vaddpd(ymmA, ymmB, ymmC); - cc.evex().vaddpd(zmmA, zmmB, zmmC); - cc.evex().vaddps(xmmA, xmmB, xmmC); - cc.evex().vaddps(ymmA, ymmB, ymmC); - cc.evex().vaddps(zmmA, zmmB, zmmC); - cc.evex().vaddsd(xmmA, xmmB, xmmC); - cc.evex().vaddss(xmmA, xmmB, xmmC); - cc.evex().valignd(xmmA, xmmB, xmmC, 0); - cc.evex().valignd(ymmA, ymmB, ymmC, 0); - cc.evex().valignd(zmmA, zmmB, zmmC, 0); - cc.evex().valignq(xmmA, xmmB, xmmC, 0); - cc.evex().valignq(ymmA, ymmB, ymmC, 0); - cc.evex().valignq(zmmA, zmmB, zmmC, 0); - cc.evex().vandnpd(xmmA, xmmB, xmmC); - cc.evex().vandnpd(ymmA, ymmB, ymmC); - cc.evex().vandnpd(zmmA, zmmB, zmmC); - cc.evex().vandnps(xmmA, xmmB, xmmC); - cc.evex().vandnps(ymmA, ymmB, ymmC); - cc.evex().vandnps(zmmA, zmmB, zmmC); - cc.evex().vandpd(xmmA, xmmB, xmmC); - cc.evex().vandpd(ymmA, ymmB, ymmC); - cc.evex().vandpd(zmmA, zmmB, zmmC); - cc.evex().vandps(xmmA, xmmB, xmmC); - cc.evex().vandps(ymmA, ymmB, ymmC); - cc.evex().vandps(zmmA, zmmB, zmmC); - cc.evex().vblendmpd(xmmA, xmmB, xmmC); - cc.evex().vblendmpd(ymmA, ymmB, ymmC); - cc.evex().vblendmpd(zmmA, zmmB, zmmC); - cc.evex().vblendmps(xmmA, xmmB, xmmC); - cc.evex().vblendmps(ymmA, ymmB, ymmC); - cc.evex().vblendmps(zmmA, zmmB, zmmC); - cc.evex().vbroadcastf32x2(ymmA, xmmB); - cc.evex().vbroadcastf32x2(zmmA, xmmB); - cc.evex().vbroadcasti32x2(xmmA, xmmB); - cc.evex().vbroadcasti32x2(ymmA, xmmB); - cc.evex().vbroadcasti32x2(zmmA, xmmB); - cc.evex().vbroadcastsd(ymmA, xmmB); - cc.evex().vbroadcastsd(zmmA, xmmB); - cc.evex().vbroadcastss(xmmA, xmmB); - cc.evex().vbroadcastss(ymmA, xmmB); - cc.evex().vbroadcastss(zmmA, xmmB); - cc.evex().vcmppd(kA, xmmB, xmmC, 0); - cc.evex().vcmppd(kA, ymmB, ymmC, 0); - cc.evex().vcmppd(kA, zmmB, zmmC, 0); - cc.evex().vcmpps(kA, xmmB, xmmC, 0); - cc.evex().vcmpps(kA, ymmB, ymmC, 0); - cc.evex().vcmpps(kA, zmmB, zmmC, 0); - cc.evex().vcmpsd(kA, xmmB, xmmC, 0); - cc.evex().vcmpss(kA, xmmB, xmmC, 0); - cc.evex().vcomisd(xmmA, xmmB); - cc.evex().vcomiss(xmmA, xmmB); - cc.evex().vcompresspd(xmmA, xmmB); - cc.evex().vcompresspd(ymmA, ymmB); - cc.evex().vcompresspd(zmmA, zmmB); - cc.evex().vcompressps(xmmA, xmmB); - cc.evex().vcompressps(ymmA, ymmB); - cc.evex().vcompressps(zmmA, zmmB); - cc.evex().vcvtdq2pd(xmmA, xmmB); - cc.evex().vcvtdq2pd(ymmA, xmmB); - cc.evex().vcvtdq2pd(zmmA, ymmB); - cc.evex().vcvtdq2ps(xmmA, xmmB); - cc.evex().vcvtdq2ps(ymmA, ymmB); - cc.evex().vcvtdq2ps(zmmA, zmmB); - cc.evex().vcvtpd2dq(xmmA, xmmB); - cc.evex().vcvtpd2dq(xmmA, ymmB); - cc.evex().vcvtpd2dq(ymmA, zmmB); - cc.evex().vcvtpd2qq(xmmA, xmmB); - cc.evex().vcvtpd2qq(ymmA, ymmB); - cc.evex().vcvtpd2qq(zmmA, zmmB); - cc.evex().vcvtpd2udq(xmmA, xmmB); - cc.evex().vcvtpd2udq(xmmA, ymmB); - cc.evex().vcvtpd2udq(ymmA, zmmB); - cc.evex().vcvtpd2uqq(xmmA, xmmB); - cc.evex().vcvtpd2uqq(ymmA, ymmB); - cc.evex().vcvtpd2uqq(zmmA, zmmB); - cc.evex().vcvtph2ps(xmmA, xmmB); - cc.evex().vcvtph2ps(ymmA, xmmB); - cc.evex().vcvtph2ps(zmmA, ymmB); - cc.evex().vcvtps2dq(xmmA, xmmB); - cc.evex().vcvtps2dq(ymmA, ymmB); - cc.evex().vcvtps2dq(zmmA, zmmB); - cc.evex().vcvtps2pd(xmmA, xmmB); - cc.evex().vcvtps2pd(ymmA, xmmB); - cc.evex().vcvtps2pd(zmmA, ymmB); - cc.evex().vcvtps2ph(xmmA, xmmB, 0); - cc.evex().vcvtps2ph(xmmA, ymmB, 0); - cc.evex().vcvtps2ph(ymmA, zmmB, 0); - cc.evex().vcvtps2qq(xmmA, xmmB); - cc.evex().vcvtps2qq(ymmA, xmmB); - cc.evex().vcvtps2qq(zmmA, ymmB); - cc.evex().vcvtps2udq(xmmA, xmmB); - cc.evex().vcvtps2udq(ymmA, ymmB); - cc.evex().vcvtps2udq(zmmA, zmmB); - cc.evex().vcvtps2uqq(xmmA, xmmB); - cc.evex().vcvtps2uqq(ymmA, xmmB); - cc.evex().vcvtps2uqq(zmmA, ymmB); - cc.evex().vcvtqq2pd(xmmA, xmmB); - cc.evex().vcvtqq2pd(ymmA, ymmB); - cc.evex().vcvtqq2pd(zmmA, zmmB); - cc.evex().vcvtqq2ps(xmmA, xmmB); - cc.evex().vcvtqq2ps(xmmA, ymmB); - cc.evex().vcvtqq2ps(ymmA, zmmB); - cc.evex().vcvtsd2si(gpd, xmmB); - if (cc.is64Bit()) cc.evex().vcvtsd2si(gpq, xmmB); - cc.evex().vcvtsd2ss(xmmA, xmmB, xmmC); - cc.evex().vcvtsd2usi(gpd, xmmB); - if (cc.is64Bit()) cc.evex().vcvtsd2usi(gpq, xmmB); - cc.evex().vcvtsi2sd(xmmA, xmmB, gpd); - if (cc.is64Bit()) cc.evex().vcvtsi2sd(xmmA, xmmB, gpq); - cc.evex().vcvtsi2ss(xmmA, xmmB, gpd); - if (cc.is64Bit()) cc.evex().vcvtsi2ss(xmmA, xmmB, gpq); - cc.evex().vcvtss2sd(xmmA, xmmB, xmmC); - cc.evex().vcvtss2si(gpd, xmmB); - if (cc.is64Bit()) cc.evex().vcvtss2si(gpq, xmmB); - cc.evex().vcvtss2usi(gpd, xmmB); - if (cc.is64Bit()) cc.evex().vcvtss2usi(gpq, xmmB); - cc.evex().vcvttpd2dq(xmmA, xmmB); - cc.evex().vcvttpd2dq(xmmA, ymmB); - cc.evex().vcvttpd2dq(ymmA, zmmB); - cc.evex().vcvttpd2qq(xmmA, xmmB); - cc.evex().vcvttpd2qq(ymmA, ymmB); - cc.evex().vcvttpd2qq(zmmA, zmmB); - cc.evex().vcvttpd2udq(xmmA, xmmB); - cc.evex().vcvttpd2udq(xmmA, ymmB); - cc.evex().vcvttpd2udq(ymmA, zmmB); - cc.evex().vcvttpd2uqq(xmmA, xmmB); - cc.evex().vcvttpd2uqq(ymmA, ymmB); - cc.evex().vcvttpd2uqq(zmmA, zmmB); - cc.evex().vcvttps2dq(xmmA, xmmB); - cc.evex().vcvttps2dq(ymmA, ymmB); - cc.evex().vcvttps2dq(zmmA, zmmB); - cc.evex().vcvttps2qq(xmmA, xmmB); - cc.evex().vcvttps2qq(ymmA, xmmB); - cc.evex().vcvttps2qq(zmmA, ymmB); - cc.evex().vcvttps2udq(xmmA, xmmB); - cc.evex().vcvttps2udq(ymmA, ymmB); - cc.evex().vcvttps2udq(zmmA, zmmB); - cc.evex().vcvttps2uqq(xmmA, xmmB); - cc.evex().vcvttps2uqq(ymmA, xmmB); - cc.evex().vcvttps2uqq(zmmA, ymmB); - cc.evex().vcvttsd2si(gpd, xmmB); - if (cc.is64Bit()) cc.evex().vcvttsd2si(gpq, xmmB); - cc.evex().vcvttsd2usi(gpd, xmmB); - if (cc.is64Bit()) cc.evex().vcvttsd2usi(gpq, xmmB); - cc.evex().vcvttss2si(gpd, xmmB); - if (cc.is64Bit()) cc.evex().vcvttss2si(gpq, xmmB); - cc.evex().vcvttss2usi(gpd, xmmB); - if (cc.is64Bit()) cc.evex().vcvttss2usi(gpq, xmmB); - cc.evex().vcvtudq2pd(xmmA, xmmB); - cc.evex().vcvtudq2pd(ymmA, xmmB); - cc.evex().vcvtudq2pd(zmmA, ymmB); - cc.evex().vcvtudq2ps(xmmA, xmmB); - cc.evex().vcvtudq2ps(ymmA, ymmB); - cc.evex().vcvtudq2ps(zmmA, zmmB); - cc.evex().vcvtuqq2pd(xmmA, xmmB); - cc.evex().vcvtuqq2pd(ymmA, ymmB); - cc.evex().vcvtuqq2pd(zmmA, zmmB); - cc.evex().vcvtuqq2ps(xmmA, xmmB); - cc.evex().vcvtuqq2ps(xmmA, ymmB); - cc.evex().vcvtuqq2ps(ymmA, zmmB); - cc.evex().vcvtusi2sd(xmmA, xmmB, gpd); - if (cc.is64Bit()) cc.evex().vcvtusi2sd(xmmA, xmmB, gpq); - cc.evex().vcvtusi2ss(xmmA, xmmB, gpd); - if (cc.is64Bit()) cc.evex().vcvtusi2ss(xmmA, xmmB, gpq); - cc.evex().vdbpsadbw(xmmA, xmmB, xmmC, 0); - cc.evex().vdbpsadbw(ymmA, ymmB, ymmC, 0); - cc.evex().vdbpsadbw(zmmA, zmmB, zmmC, 0); - cc.evex().vdivpd(xmmA, xmmB, xmmC); - cc.evex().vdivpd(ymmA, ymmB, ymmC); - cc.evex().vdivpd(zmmA, zmmB, zmmC); - cc.evex().vdivps(xmmA, xmmB, xmmC); - cc.evex().vdivps(ymmA, ymmB, ymmC); - cc.evex().vdivps(zmmA, zmmB, zmmC); - cc.evex().vdivsd(xmmA, xmmB, xmmC); - cc.evex().vdivss(xmmA, xmmB, xmmC); - cc.evex().vexp2pd(zmmA, zmmB); - cc.evex().vexp2ps(zmmA, zmmB); - cc.evex().vexpandpd(xmmA, xmmB); - cc.evex().vexpandpd(ymmA, ymmB); - cc.evex().vexpandpd(zmmA, zmmB); - cc.evex().vexpandps(xmmA, xmmB); - cc.evex().vexpandps(ymmA, ymmB); - cc.evex().vexpandps(zmmA, zmmB); - cc.evex().vextractf32x4(xmmA, ymmB, 0); - cc.evex().vextractf32x4(xmmA, zmmB, 0); - cc.evex().vextractf32x8(ymmA, zmmB, 0); - cc.evex().vextractf64x2(xmmA, ymmB, 0); - cc.evex().vextractf64x2(xmmA, zmmB, 0); - cc.evex().vextractf64x4(ymmA, zmmB, 0); - cc.evex().vextracti32x4(xmmA, ymmB, 0); - cc.evex().vextracti32x4(xmmA, zmmB, 0); - cc.evex().vextracti32x8(ymmA, zmmB, 0); - cc.evex().vextracti64x2(xmmA, ymmB, 0); - cc.evex().vextracti64x2(xmmA, zmmB, 0); - cc.evex().vextracti64x4(ymmA, zmmB, 0); - cc.evex().vextractps(gpd, xmmB, 0); - cc.evex().vfixupimmpd(xmmA, xmmB, xmmC, 0); - cc.evex().vfixupimmpd(ymmA, ymmB, ymmC, 0); - cc.evex().vfixupimmpd(zmmA, zmmB, zmmC, 0); - cc.evex().vfixupimmps(xmmA, xmmB, xmmC, 0); - cc.evex().vfixupimmps(ymmA, ymmB, ymmC, 0); - cc.evex().vfixupimmps(zmmA, zmmB, zmmC, 0); - cc.evex().vfixupimmsd(xmmA, xmmB, xmmC, 0); - cc.evex().vfixupimmss(xmmA, xmmB, xmmC, 0); - cc.evex().vfmadd132pd(xmmA, xmmB, xmmC); - cc.evex().vfmadd132pd(ymmA, ymmB, ymmC); - cc.evex().vfmadd132pd(zmmA, zmmB, zmmC); - cc.evex().vfmadd132ps(xmmA, xmmB, xmmC); - cc.evex().vfmadd132ps(ymmA, ymmB, ymmC); - cc.evex().vfmadd132ps(zmmA, zmmB, zmmC); - cc.evex().vfmadd132sd(xmmA, xmmB, xmmC); - cc.evex().vfmadd132ss(xmmA, xmmB, xmmC); - cc.evex().vfmadd213pd(xmmA, xmmB, xmmC); - cc.evex().vfmadd213pd(ymmA, ymmB, ymmC); - cc.evex().vfmadd213pd(zmmA, zmmB, zmmC); - cc.evex().vfmadd213ps(xmmA, xmmB, xmmC); - cc.evex().vfmadd213ps(ymmA, ymmB, ymmC); - cc.evex().vfmadd213ps(zmmA, zmmB, zmmC); - cc.evex().vfmadd213sd(xmmA, xmmB, xmmC); - cc.evex().vfmadd213ss(xmmA, xmmB, xmmC); - cc.evex().vfmadd231pd(xmmA, xmmB, xmmC); - cc.evex().vfmadd231pd(ymmA, ymmB, ymmC); - cc.evex().vfmadd231pd(zmmA, zmmB, zmmC); - cc.evex().vfmadd231ps(xmmA, xmmB, xmmC); - cc.evex().vfmadd231ps(ymmA, ymmB, ymmC); - cc.evex().vfmadd231ps(zmmA, zmmB, zmmC); - cc.evex().vfmadd231sd(xmmA, xmmB, xmmC); - cc.evex().vfmadd231ss(xmmA, xmmB, xmmC); - cc.evex().vfmaddsub132pd(xmmA, xmmB, xmmC); - cc.evex().vfmaddsub132pd(ymmA, ymmB, ymmC); - cc.evex().vfmaddsub132pd(zmmA, zmmB, zmmC); - cc.evex().vfmaddsub132ps(xmmA, xmmB, xmmC); - cc.evex().vfmaddsub132ps(ymmA, ymmB, ymmC); - cc.evex().vfmaddsub132ps(zmmA, zmmB, zmmC); - cc.evex().vfmaddsub213pd(xmmA, xmmB, xmmC); - cc.evex().vfmaddsub213pd(ymmA, ymmB, ymmC); - cc.evex().vfmaddsub213pd(zmmA, zmmB, zmmC); - cc.evex().vfmaddsub213ps(xmmA, xmmB, xmmC); - cc.evex().vfmaddsub213ps(ymmA, ymmB, ymmC); - cc.evex().vfmaddsub213ps(zmmA, zmmB, zmmC); - cc.evex().vfmaddsub231pd(xmmA, xmmB, xmmC); - cc.evex().vfmaddsub231pd(ymmA, ymmB, ymmC); - cc.evex().vfmaddsub231pd(zmmA, zmmB, zmmC); - cc.evex().vfmaddsub231ps(xmmA, xmmB, xmmC); - cc.evex().vfmaddsub231ps(ymmA, ymmB, ymmC); - cc.evex().vfmaddsub231ps(zmmA, zmmB, zmmC); - cc.evex().vfmsub132pd(xmmA, xmmB, xmmC); - cc.evex().vfmsub132pd(ymmA, ymmB, ymmC); - cc.evex().vfmsub132pd(zmmA, zmmB, zmmC); - cc.evex().vfmsub132ps(xmmA, xmmB, xmmC); - cc.evex().vfmsub132ps(ymmA, ymmB, ymmC); - cc.evex().vfmsub132ps(zmmA, zmmB, zmmC); - cc.evex().vfmsub132sd(xmmA, xmmB, xmmC); - cc.evex().vfmsub132ss(xmmA, xmmB, xmmC); - cc.evex().vfmsub213pd(xmmA, xmmB, xmmC); - cc.evex().vfmsub213pd(ymmA, ymmB, ymmC); - cc.evex().vfmsub213pd(zmmA, zmmB, zmmC); - cc.evex().vfmsub213ps(xmmA, xmmB, xmmC); - cc.evex().vfmsub213ps(ymmA, ymmB, ymmC); - cc.evex().vfmsub213ps(zmmA, zmmB, zmmC); - cc.evex().vfmsub213sd(xmmA, xmmB, xmmC); - cc.evex().vfmsub213ss(xmmA, xmmB, xmmC); - cc.evex().vfmsub231pd(xmmA, xmmB, xmmC); - cc.evex().vfmsub231pd(ymmA, ymmB, ymmC); - cc.evex().vfmsub231pd(zmmA, zmmB, zmmC); - cc.evex().vfmsub231ps(xmmA, xmmB, xmmC); - cc.evex().vfmsub231ps(ymmA, ymmB, ymmC); - cc.evex().vfmsub231ps(zmmA, zmmB, zmmC); - cc.evex().vfmsub231sd(xmmA, xmmB, xmmC); - cc.evex().vfmsub231ss(xmmA, xmmB, xmmC); - cc.evex().vfmsubadd132pd(xmmA, xmmB, xmmC); - cc.evex().vfmsubadd132pd(ymmA, ymmB, ymmC); - cc.evex().vfmsubadd132pd(zmmA, zmmB, zmmC); - cc.evex().vfmsubadd132ps(xmmA, xmmB, xmmC); - cc.evex().vfmsubadd132ps(ymmA, ymmB, ymmC); - cc.evex().vfmsubadd132ps(zmmA, zmmB, zmmC); - cc.evex().vfmsubadd213pd(xmmA, xmmB, xmmC); - cc.evex().vfmsubadd213pd(ymmA, ymmB, ymmC); - cc.evex().vfmsubadd213pd(zmmA, zmmB, zmmC); - cc.evex().vfmsubadd213ps(xmmA, xmmB, xmmC); - cc.evex().vfmsubadd213ps(ymmA, ymmB, ymmC); - cc.evex().vfmsubadd213ps(zmmA, zmmB, zmmC); - cc.evex().vfmsubadd231pd(xmmA, xmmB, xmmC); - cc.evex().vfmsubadd231pd(ymmA, ymmB, ymmC); - cc.evex().vfmsubadd231pd(zmmA, zmmB, zmmC); - cc.evex().vfmsubadd231ps(xmmA, xmmB, xmmC); - cc.evex().vfmsubadd231ps(ymmA, ymmB, ymmC); - cc.evex().vfmsubadd231ps(zmmA, zmmB, zmmC); - cc.evex().vfnmadd132pd(xmmA, xmmB, xmmC); - cc.evex().vfnmadd132pd(ymmA, ymmB, ymmC); - cc.evex().vfnmadd132pd(zmmA, zmmB, zmmC); - cc.evex().vfnmadd132ps(xmmA, xmmB, xmmC); - cc.evex().vfnmadd132ps(ymmA, ymmB, ymmC); - cc.evex().vfnmadd132ps(zmmA, zmmB, zmmC); - cc.evex().vfnmadd132sd(xmmA, xmmB, xmmC); - cc.evex().vfnmadd132ss(xmmA, xmmB, xmmC); - cc.evex().vfnmadd213pd(xmmA, xmmB, xmmC); - cc.evex().vfnmadd213pd(ymmA, ymmB, ymmC); - cc.evex().vfnmadd213pd(zmmA, zmmB, zmmC); - cc.evex().vfnmadd213ps(xmmA, xmmB, xmmC); - cc.evex().vfnmadd213ps(ymmA, ymmB, ymmC); - cc.evex().vfnmadd213ps(zmmA, zmmB, zmmC); - cc.evex().vfnmadd213sd(xmmA, xmmB, xmmC); - cc.evex().vfnmadd213ss(xmmA, xmmB, xmmC); - cc.evex().vfnmadd231pd(xmmA, xmmB, xmmC); - cc.evex().vfnmadd231pd(ymmA, ymmB, ymmC); - cc.evex().vfnmadd231pd(zmmA, zmmB, zmmC); - cc.evex().vfnmadd231ps(xmmA, xmmB, xmmC); - cc.evex().vfnmadd231ps(ymmA, ymmB, ymmC); - cc.evex().vfnmadd231ps(zmmA, zmmB, zmmC); - cc.evex().vfnmadd231sd(xmmA, xmmB, xmmC); - cc.evex().vfnmadd231ss(xmmA, xmmB, xmmC); - cc.evex().vfnmsub132pd(xmmA, xmmB, xmmC); - cc.evex().vfnmsub132pd(ymmA, ymmB, ymmC); - cc.evex().vfnmsub132pd(zmmA, zmmB, zmmC); - cc.evex().vfnmsub132ps(xmmA, xmmB, xmmC); - cc.evex().vfnmsub132ps(ymmA, ymmB, ymmC); - cc.evex().vfnmsub132ps(zmmA, zmmB, zmmC); - cc.evex().vfnmsub132sd(xmmA, xmmB, xmmC); - cc.evex().vfnmsub132ss(xmmA, xmmB, xmmC); - cc.evex().vfnmsub213pd(xmmA, xmmB, xmmC); - cc.evex().vfnmsub213pd(ymmA, ymmB, ymmC); - cc.evex().vfnmsub213pd(zmmA, zmmB, zmmC); - cc.evex().vfnmsub213ps(xmmA, xmmB, xmmC); - cc.evex().vfnmsub213ps(ymmA, ymmB, ymmC); - cc.evex().vfnmsub213ps(zmmA, zmmB, zmmC); - cc.evex().vfnmsub213sd(xmmA, xmmB, xmmC); - cc.evex().vfnmsub213ss(xmmA, xmmB, xmmC); - cc.evex().vfnmsub231pd(xmmA, xmmB, xmmC); - cc.evex().vfnmsub231pd(ymmA, ymmB, ymmC); - cc.evex().vfnmsub231pd(zmmA, zmmB, zmmC); - cc.evex().vfnmsub231ps(xmmA, xmmB, xmmC); - cc.evex().vfnmsub231ps(ymmA, ymmB, ymmC); - cc.evex().vfnmsub231ps(zmmA, zmmB, zmmC); - cc.evex().vfnmsub231sd(xmmA, xmmB, xmmC); - cc.evex().vfnmsub231ss(xmmA, xmmB, xmmC); - cc.evex().vfpclasspd(kA, xmmB, 0); - cc.evex().vfpclasspd(kA, ymmB, 0); - cc.evex().vfpclasspd(kA, zmmB, 0); - cc.evex().vfpclassps(kA, xmmB, 0); - cc.evex().vfpclassps(kA, ymmB, 0); - cc.evex().vfpclassps(kA, zmmB, 0); - cc.evex().vfpclasssd(kA, xmmB, 0); - cc.evex().vfpclassss(kA, xmmB, 0); - cc.evex().vgetexppd(xmmA, xmmB); - cc.evex().vgetexppd(ymmA, ymmB); - cc.evex().vgetexppd(zmmA, zmmB); - cc.evex().vgetexpps(xmmA, xmmB); - cc.evex().vgetexpps(ymmA, ymmB); - cc.evex().vgetexpps(zmmA, zmmB); - cc.evex().vgetexpsd(xmmA, xmmB, xmmC); - cc.evex().vgetexpss(xmmA, xmmB, xmmC); - cc.evex().vgetmantpd(xmmA, xmmB, 0); - cc.evex().vgetmantpd(ymmA, ymmB, 0); - cc.evex().vgetmantpd(zmmA, zmmB, 0); - cc.evex().vgetmantps(xmmA, xmmB, 0); - cc.evex().vgetmantps(ymmA, ymmB, 0); - cc.evex().vgetmantps(zmmA, zmmB, 0); - cc.evex().vgetmantsd(xmmA, xmmB, xmmC, 0); - cc.evex().vgetmantss(xmmA, xmmB, xmmC, 0); - cc.evex().vinsertf32x4(ymmA, ymmB, xmmC, 0); - cc.evex().vinsertf32x4(zmmA, zmmB, xmmC, 0); - cc.evex().vinsertf32x8(zmmA, zmmB, ymmC, 0); - cc.evex().vinsertf64x2(ymmA, ymmB, xmmC, 0); - cc.evex().vinsertf64x2(zmmA, zmmB, xmmC, 0); - cc.evex().vinsertf64x4(zmmA, zmmB, ymmC, 0); - cc.evex().vinserti32x4(ymmA, ymmB, xmmC, 0); - cc.evex().vinserti32x4(zmmA, zmmB, xmmC, 0); - cc.evex().vinserti32x8(zmmA, zmmB, ymmC, 0); - cc.evex().vinserti64x2(ymmA, ymmB, xmmC, 0); - cc.evex().vinserti64x2(zmmA, zmmB, xmmC, 0); - cc.evex().vinserti64x4(zmmA, zmmB, ymmC, 0); - cc.evex().vinsertps(xmmA, xmmB, xmmC, 0); - cc.evex().vmaxpd(xmmA, xmmB, xmmC); - cc.evex().vmaxpd(ymmA, ymmB, ymmC); - cc.evex().vmaxpd(zmmA, zmmB, zmmC); - cc.evex().vmaxps(xmmA, xmmB, xmmC); - cc.evex().vmaxps(ymmA, ymmB, ymmC); - cc.evex().vmaxps(zmmA, zmmB, zmmC); - cc.evex().vmaxsd(xmmA, xmmB, xmmC); - cc.evex().vmaxss(xmmA, xmmB, xmmC); - cc.evex().vminpd(xmmA, xmmB, xmmC); - cc.evex().vminpd(ymmA, ymmB, ymmC); - cc.evex().vminpd(zmmA, zmmB, zmmC); - cc.evex().vminps(xmmA, xmmB, xmmC); - cc.evex().vminps(ymmA, ymmB, ymmC); - cc.evex().vminps(zmmA, zmmB, zmmC); - cc.evex().vminsd(xmmA, xmmB, xmmC); - cc.evex().vminss(xmmA, xmmB, xmmC); - cc.evex().vmovapd(xmmA, xmmB); - cc.evex().vmovapd(xmmA, xmmB); - cc.evex().vmovapd(ymmA, ymmB); - cc.evex().vmovapd(ymmA, ymmB); - cc.evex().vmovapd(zmmA, zmmB); - cc.evex().vmovapd(zmmA, zmmB); - cc.evex().vmovaps(xmmA, xmmB); - cc.evex().vmovaps(xmmA, xmmB); - cc.evex().vmovaps(ymmA, ymmB); - cc.evex().vmovaps(ymmA, ymmB); - cc.evex().vmovaps(zmmA, zmmB); - cc.evex().vmovaps(zmmA, zmmB); - cc.evex().vmovd(gpd, xmmB); - cc.evex().vmovd(xmmA, gpd); - cc.evex().vmovddup(xmmA, xmmB); - cc.evex().vmovddup(ymmA, ymmB); - cc.evex().vmovddup(zmmA, zmmB); - cc.evex().vmovdqa32(xmmA, xmmB); - cc.evex().vmovdqa32(xmmA, xmmB); - cc.evex().vmovdqa32(ymmA, ymmB); - cc.evex().vmovdqa32(ymmA, ymmB); - cc.evex().vmovdqa32(zmmA, zmmB); - cc.evex().vmovdqa32(zmmA, zmmB); - cc.evex().vmovdqa64(xmmA, xmmB); - cc.evex().vmovdqa64(xmmA, xmmB); - cc.evex().vmovdqa64(ymmA, ymmB); - cc.evex().vmovdqa64(ymmA, ymmB); - cc.evex().vmovdqa64(zmmA, zmmB); - cc.evex().vmovdqa64(zmmA, zmmB); - cc.evex().vmovdqu16(xmmA, xmmB); - cc.evex().vmovdqu16(xmmA, xmmB); - cc.evex().vmovdqu16(ymmA, ymmB); - cc.evex().vmovdqu16(ymmA, ymmB); - cc.evex().vmovdqu16(zmmA, zmmB); - cc.evex().vmovdqu16(zmmA, zmmB); - cc.evex().vmovdqu32(xmmA, xmmB); - cc.evex().vmovdqu32(xmmA, xmmB); - cc.evex().vmovdqu32(ymmA, ymmB); - cc.evex().vmovdqu32(ymmA, ymmB); - cc.evex().vmovdqu32(zmmA, zmmB); - cc.evex().vmovdqu32(zmmA, zmmB); - cc.evex().vmovdqu64(xmmA, xmmB); - cc.evex().vmovdqu64(xmmA, xmmB); - cc.evex().vmovdqu64(ymmA, ymmB); - cc.evex().vmovdqu64(ymmA, ymmB); - cc.evex().vmovdqu64(zmmA, zmmB); - cc.evex().vmovdqu64(zmmA, zmmB); - cc.evex().vmovdqu8(xmmA, xmmB); - cc.evex().vmovdqu8(xmmA, xmmB); - cc.evex().vmovdqu8(ymmA, ymmB); - cc.evex().vmovdqu8(ymmA, ymmB); - cc.evex().vmovdqu8(zmmA, zmmB); - cc.evex().vmovdqu8(zmmA, zmmB); - cc.evex().vmovhlps(xmmA, xmmB, xmmC); - if (cc.is64Bit()) cc.evex().vmovq(gpq, xmmB); - if (cc.is64Bit()) cc.evex().vmovq(xmmA, gpq); - cc.evex().vmovq(xmmA, xmmB); - cc.evex().vmovsd(xmmA, xmmB, xmmC); - cc.evex().vmovshdup(xmmA, xmmB); - cc.evex().vmovshdup(ymmA, ymmB); - cc.evex().vmovshdup(zmmA, zmmB); - cc.evex().vmovsldup(xmmA, xmmB); - cc.evex().vmovsldup(ymmA, ymmB); - cc.evex().vmovsldup(zmmA, zmmB); - cc.evex().vmovss(xmmA, xmmB, xmmC); - cc.evex().vmovupd(xmmA, xmmB); - cc.evex().vmovupd(xmmA, xmmB); - cc.evex().vmovupd(ymmA, ymmB); - cc.evex().vmovupd(ymmA, ymmB); - cc.evex().vmovupd(zmmA, zmmB); - cc.evex().vmovupd(zmmA, zmmB); - cc.evex().vmovups(xmmA, xmmB); - cc.evex().vmovups(xmmA, xmmB); - cc.evex().vmovups(ymmA, ymmB); - cc.evex().vmovups(ymmA, ymmB); - cc.evex().vmovups(zmmA, zmmB); - cc.evex().vmovups(zmmA, zmmB); - cc.evex().vmulpd(xmmA, xmmB, xmmC); - cc.evex().vmulpd(ymmA, ymmB, ymmC); - cc.evex().vmulpd(zmmA, zmmB, zmmC); - cc.evex().vmulps(xmmA, xmmB, xmmC); - cc.evex().vmulps(ymmA, ymmB, ymmC); - cc.evex().vmulps(zmmA, zmmB, zmmC); - cc.evex().vmulsd(xmmA, xmmB, xmmC); - cc.evex().vmulss(xmmA, xmmB, xmmC); - cc.evex().vorpd(xmmA, xmmB, xmmC); - cc.evex().vorpd(ymmA, ymmB, ymmC); - cc.evex().vorpd(zmmA, zmmB, zmmC); - cc.evex().vorps(xmmA, xmmB, xmmC); - cc.evex().vorps(ymmA, ymmB, ymmC); - cc.evex().vorps(zmmA, zmmB, zmmC); - cc.evex().vpabsb(xmmA, xmmB); - cc.evex().vpabsb(ymmA, ymmB); - cc.evex().vpabsb(zmmA, zmmB); - cc.evex().vpabsd(xmmA, xmmB); - cc.evex().vpabsd(ymmA, ymmB); - cc.evex().vpabsd(zmmA, zmmB); - cc.evex().vpabsq(xmmA, xmmB); - cc.evex().vpabsq(ymmA, ymmB); - cc.evex().vpabsq(zmmA, zmmB); - cc.evex().vpabsw(xmmA, xmmB); - cc.evex().vpabsw(ymmA, ymmB); - cc.evex().vpabsw(zmmA, zmmB); - cc.evex().vpackssdw(xmmA, xmmB, xmmC); - cc.evex().vpackssdw(ymmA, ymmB, ymmC); - cc.evex().vpackssdw(zmmA, zmmB, zmmC); - cc.evex().vpacksswb(xmmA, xmmB, xmmC); - cc.evex().vpacksswb(ymmA, ymmB, ymmC); - cc.evex().vpacksswb(zmmA, zmmB, zmmC); - cc.evex().vpackusdw(xmmA, xmmB, xmmC); - cc.evex().vpackusdw(ymmA, ymmB, ymmC); - cc.evex().vpackusdw(zmmA, zmmB, zmmC); - cc.evex().vpackuswb(xmmA, xmmB, xmmC); - cc.evex().vpackuswb(ymmA, ymmB, ymmC); - cc.evex().vpackuswb(zmmA, zmmB, zmmC); - cc.evex().vpaddb(xmmA, xmmB, xmmC); - cc.evex().vpaddb(ymmA, ymmB, ymmC); - cc.evex().vpaddb(zmmA, zmmB, zmmC); - cc.evex().vpaddd(xmmA, xmmB, xmmC); - cc.evex().vpaddd(ymmA, ymmB, ymmC); - cc.evex().vpaddd(zmmA, zmmB, zmmC); - cc.evex().vpaddq(xmmA, xmmB, xmmC); - cc.evex().vpaddq(ymmA, ymmB, ymmC); - cc.evex().vpaddq(zmmA, zmmB, zmmC); - cc.evex().vpaddsb(xmmA, xmmB, xmmC); - cc.evex().vpaddsb(ymmA, ymmB, ymmC); - cc.evex().vpaddsb(zmmA, zmmB, zmmC); - cc.evex().vpaddsw(xmmA, xmmB, xmmC); - cc.evex().vpaddsw(ymmA, ymmB, ymmC); - cc.evex().vpaddsw(zmmA, zmmB, zmmC); - cc.evex().vpaddusb(xmmA, xmmB, xmmC); - cc.evex().vpaddusb(ymmA, ymmB, ymmC); - cc.evex().vpaddusb(zmmA, zmmB, zmmC); - cc.evex().vpaddusw(xmmA, xmmB, xmmC); - cc.evex().vpaddusw(ymmA, ymmB, ymmC); - cc.evex().vpaddusw(zmmA, zmmB, zmmC); - cc.evex().vpaddw(xmmA, xmmB, xmmC); - cc.evex().vpaddw(ymmA, ymmB, ymmC); - cc.evex().vpaddw(zmmA, zmmB, zmmC); - cc.evex().vpalignr(xmmA, xmmB, xmmC, 0); - cc.evex().vpalignr(ymmA, ymmB, ymmC, 0); - cc.evex().vpalignr(zmmA, zmmB, zmmC, 0); - cc.evex().vpandd(xmmA, xmmB, xmmC); - cc.evex().vpandd(ymmA, ymmB, ymmC); - cc.evex().vpandd(zmmA, zmmB, zmmC); - cc.evex().vpandnd(xmmA, xmmB, xmmC); - cc.evex().vpandnd(ymmA, ymmB, ymmC); - cc.evex().vpandnd(zmmA, zmmB, zmmC); - cc.evex().vpandnq(xmmA, xmmB, xmmC); - cc.evex().vpandnq(ymmA, ymmB, ymmC); - cc.evex().vpandnq(zmmA, zmmB, zmmC); - cc.evex().vpandq(xmmA, xmmB, xmmC); - cc.evex().vpandq(ymmA, ymmB, ymmC); - cc.evex().vpandq(zmmA, zmmB, zmmC); - cc.evex().vpavgb(xmmA, xmmB, xmmC); - cc.evex().vpavgb(ymmA, ymmB, ymmC); - cc.evex().vpavgb(zmmA, zmmB, zmmC); - cc.evex().vpavgw(xmmA, xmmB, xmmC); - cc.evex().vpavgw(ymmA, ymmB, ymmC); - cc.evex().vpavgw(zmmA, zmmB, zmmC); - cc.evex().vpblendmb(xmmA, xmmB, xmmC); - cc.evex().vpblendmb(ymmA, ymmB, ymmC); - cc.evex().vpblendmb(zmmA, zmmB, zmmC); - cc.evex().vpblendmd(xmmA, xmmB, xmmC); - cc.evex().vpblendmd(ymmA, ymmB, ymmC); - cc.evex().vpblendmd(zmmA, zmmB, zmmC); - cc.evex().vpblendmq(xmmA, xmmB, xmmC); - cc.evex().vpblendmq(ymmA, ymmB, ymmC); - cc.evex().vpblendmq(zmmA, zmmB, zmmC); - cc.evex().vpblendmw(xmmA, xmmB, xmmC); - cc.evex().vpblendmw(ymmA, ymmB, ymmC); - cc.evex().vpblendmw(zmmA, zmmB, zmmC); - cc.evex().vpbroadcastb(xmmA, gpd); - cc.evex().vpbroadcastb(xmmA, xmmB); - cc.evex().vpbroadcastb(ymmA, gpd); - cc.evex().vpbroadcastb(ymmA, xmmB); - cc.evex().vpbroadcastb(zmmA, gpd); - cc.evex().vpbroadcastb(zmmA, xmmB); - cc.evex().vpbroadcastd(xmmA, gpd); - cc.evex().vpbroadcastd(xmmA, xmmB); - cc.evex().vpbroadcastd(ymmA, gpd); - cc.evex().vpbroadcastd(ymmA, xmmB); - cc.evex().vpbroadcastd(zmmA, gpd); - cc.evex().vpbroadcastd(zmmA, xmmB); - cc.evex().vpbroadcastmb2q(xmmA, kB); - cc.evex().vpbroadcastmb2q(ymmA, kB); - cc.evex().vpbroadcastmb2q(zmmA, kB); - cc.evex().vpbroadcastmw2d(xmmA, kB); - cc.evex().vpbroadcastmw2d(ymmA, kB); - cc.evex().vpbroadcastmw2d(zmmA, kB); - if (cc.is64Bit()) cc.evex().vpbroadcastq(xmmA, gpq); - cc.evex().vpbroadcastq(xmmA, xmmB); - if (cc.is64Bit()) cc.evex().vpbroadcastq(ymmA, gpq); - cc.evex().vpbroadcastq(ymmA, xmmB); - if (cc.is64Bit()) cc.evex().vpbroadcastq(zmmA, gpq); - cc.evex().vpbroadcastq(zmmA, xmmB); - cc.evex().vpbroadcastw(xmmA, gpd); - cc.evex().vpbroadcastw(xmmA, xmmB); - cc.evex().vpbroadcastw(ymmA, gpd); - cc.evex().vpbroadcastw(ymmA, xmmB); - cc.evex().vpbroadcastw(zmmA, gpd); - cc.evex().vpbroadcastw(zmmA, xmmB); - cc.evex().vpcmpb(kA, xmmB, xmmC, 0); - cc.evex().vpcmpb(kA, ymmB, ymmC, 0); - cc.evex().vpcmpb(kA, zmmB, zmmC, 0); - cc.evex().vpcmpd(kA, xmmB, xmmC, 0); - cc.evex().vpcmpd(kA, ymmB, ymmC, 0); - cc.evex().vpcmpd(kA, zmmB, zmmC, 0); - cc.evex().vpcmpeqb(kA, xmmB, xmmC); - cc.evex().vpcmpeqb(kA, ymmB, ymmC); - cc.evex().vpcmpeqb(kA, zmmB, zmmC); - cc.evex().vpcmpeqd(kA, xmmB, xmmC); - cc.evex().vpcmpeqd(kA, ymmB, ymmC); - cc.evex().vpcmpeqd(kA, zmmB, zmmC); - cc.evex().vpcmpeqq(kA, xmmB, xmmC); - cc.evex().vpcmpeqq(kA, ymmB, ymmC); - cc.evex().vpcmpeqq(kA, zmmB, zmmC); - cc.evex().vpcmpeqw(kA, xmmB, xmmC); - cc.evex().vpcmpeqw(kA, ymmB, ymmC); - cc.evex().vpcmpeqw(kA, zmmB, zmmC); - cc.evex().vpcmpgtb(kA, xmmB, xmmC); - cc.evex().vpcmpgtb(kA, ymmB, ymmC); - cc.evex().vpcmpgtb(kA, zmmB, zmmC); - cc.evex().vpcmpgtd(kA, xmmB, xmmC); - cc.evex().vpcmpgtd(kA, ymmB, ymmC); - cc.evex().vpcmpgtd(kA, zmmB, zmmC); - cc.evex().vpcmpgtq(kA, xmmB, xmmC); - cc.evex().vpcmpgtq(kA, ymmB, ymmC); - cc.evex().vpcmpgtq(kA, zmmB, zmmC); - cc.evex().vpcmpgtw(kA, xmmB, xmmC); - cc.evex().vpcmpgtw(kA, ymmB, ymmC); - cc.evex().vpcmpgtw(kA, zmmB, zmmC); - cc.evex().vpcmpq(kA, xmmB, xmmC, 0); - cc.evex().vpcmpq(kA, ymmB, ymmC, 0); - cc.evex().vpcmpq(kA, zmmB, zmmC, 0); - cc.evex().vpcmpub(kA, xmmB, xmmC, 0); - cc.evex().vpcmpub(kA, ymmB, ymmC, 0); - cc.evex().vpcmpub(kA, zmmB, zmmC, 0); - cc.evex().vpcmpud(kA, xmmB, xmmC, 0); - cc.evex().vpcmpud(kA, ymmB, ymmC, 0); - cc.evex().vpcmpud(kA, zmmB, zmmC, 0); - cc.evex().vpcmpuq(kA, xmmB, xmmC, 0); - cc.evex().vpcmpuq(kA, ymmB, ymmC, 0); - cc.evex().vpcmpuq(kA, zmmB, zmmC, 0); - cc.evex().vpcmpuw(kA, xmmB, xmmC, 0); - cc.evex().vpcmpuw(kA, ymmB, ymmC, 0); - cc.evex().vpcmpuw(kA, zmmB, zmmC, 0); - cc.evex().vpcmpw(kA, xmmB, xmmC, 0); - cc.evex().vpcmpw(kA, ymmB, ymmC, 0); - cc.evex().vpcmpw(kA, zmmB, zmmC, 0); - cc.evex().vpcompressd(xmmA, xmmB); - cc.evex().vpcompressd(ymmA, ymmB); - cc.evex().vpcompressd(zmmA, zmmB); - cc.evex().vpcompressq(xmmA, xmmB); - cc.evex().vpcompressq(ymmA, ymmB); - cc.evex().vpcompressq(zmmA, zmmB); - cc.evex().vpconflictd(xmmA, xmmB); - cc.evex().vpconflictd(ymmA, ymmB); - cc.evex().vpconflictd(zmmA, zmmB); - cc.evex().vpconflictq(xmmA, xmmB); - cc.evex().vpconflictq(ymmA, ymmB); - cc.evex().vpconflictq(zmmA, zmmB); - cc.evex().vpermb(xmmA, xmmB, xmmC); - cc.evex().vpermb(ymmA, ymmB, ymmC); - cc.evex().vpermb(zmmA, zmmB, zmmC); - cc.evex().vpermd(ymmA, ymmB, ymmC); - cc.evex().vpermd(zmmA, zmmB, zmmC); - cc.evex().vpermi2b(xmmA, xmmB, xmmC); - cc.evex().vpermi2b(ymmA, ymmB, ymmC); - cc.evex().vpermi2b(zmmA, zmmB, zmmC); - cc.evex().vpermi2d(xmmA, xmmB, xmmC); - cc.evex().vpermi2d(ymmA, ymmB, ymmC); - cc.evex().vpermi2d(zmmA, zmmB, zmmC); - cc.evex().vpermi2pd(xmmA, xmmB, xmmC); - cc.evex().vpermi2pd(ymmA, ymmB, ymmC); - cc.evex().vpermi2pd(zmmA, zmmB, zmmC); - cc.evex().vpermi2ps(xmmA, xmmB, xmmC); - cc.evex().vpermi2ps(ymmA, ymmB, ymmC); - cc.evex().vpermi2ps(zmmA, zmmB, zmmC); - cc.evex().vpermi2q(xmmA, xmmB, xmmC); - cc.evex().vpermi2q(ymmA, ymmB, ymmC); - cc.evex().vpermi2q(zmmA, zmmB, zmmC); - cc.evex().vpermi2w(xmmA, xmmB, xmmC); - cc.evex().vpermi2w(ymmA, ymmB, ymmC); - cc.evex().vpermi2w(zmmA, zmmB, zmmC); - cc.evex().vpermilpd(xmmA, xmmB, xmmC); - cc.evex().vpermilpd(ymmA, ymmB, ymmC); - cc.evex().vpermilpd(zmmA, zmmB, zmmC); - cc.evex().vpermilpd(xmmA, xmmB, 0); - cc.evex().vpermilpd(ymmA, ymmB, 0); - cc.evex().vpermilpd(zmmA, zmmB, 0); - cc.evex().vpermilps(xmmA, xmmB, xmmC); - cc.evex().vpermilps(ymmA, ymmB, ymmC); - cc.evex().vpermilps(zmmA, zmmB, zmmC); - cc.evex().vpermilps(xmmA, xmmB, 0); - cc.evex().vpermilps(ymmA, ymmB, 0); - cc.evex().vpermilps(zmmA, zmmB, 0); - cc.evex().vpermq(ymmA, ymmB, ymmC); - cc.evex().vpermq(zmmA, zmmB, zmmC); - cc.evex().vpermq(ymmA, ymmB, 0); - cc.evex().vpermq(zmmA, zmmB, 0); - cc.evex().vpermt2b(xmmA, xmmB, xmmC); - cc.evex().vpermt2b(ymmA, ymmB, ymmC); - cc.evex().vpermt2b(zmmA, zmmB, zmmC); - cc.evex().vpermt2d(xmmA, xmmB, xmmC); - cc.evex().vpermt2d(ymmA, ymmB, ymmC); - cc.evex().vpermt2d(zmmA, zmmB, zmmC); - cc.evex().vpermt2pd(xmmA, xmmB, xmmC); - cc.evex().vpermt2pd(ymmA, ymmB, ymmC); - cc.evex().vpermt2pd(zmmA, zmmB, zmmC); - cc.evex().vpermt2ps(xmmA, xmmB, xmmC); - cc.evex().vpermt2ps(ymmA, ymmB, ymmC); - cc.evex().vpermt2ps(zmmA, zmmB, zmmC); - cc.evex().vpermt2q(xmmA, xmmB, xmmC); - cc.evex().vpermt2q(ymmA, ymmB, ymmC); - cc.evex().vpermt2q(zmmA, zmmB, zmmC); - cc.evex().vpermt2w(xmmA, xmmB, xmmC); - cc.evex().vpermt2w(ymmA, ymmB, ymmC); - cc.evex().vpermt2w(zmmA, zmmB, zmmC); - cc.evex().vpermw(xmmA, xmmB, xmmC); - cc.evex().vpermw(ymmA, ymmB, ymmC); - cc.evex().vpermw(zmmA, zmmB, zmmC); - cc.evex().vpexpandd(xmmA, xmmB); - cc.evex().vpexpandd(ymmA, ymmB); - cc.evex().vpexpandd(zmmA, zmmB); - cc.evex().vpexpandq(xmmA, xmmB); - cc.evex().vpexpandq(ymmA, ymmB); - cc.evex().vpexpandq(zmmA, zmmB); - cc.evex().vpextrb(gpd, xmmB, 0); - cc.evex().vpextrd(gpd, xmmB, 0); - if (cc.is64Bit()) cc.evex().vpextrq(gpq, xmmB, 0); - cc.evex().vpextrw(gpd, xmmB, 0); - cc.evex().vpinsrb(xmmA, xmmB, gpd, 0); - cc.evex().vpinsrd(xmmA, xmmB, gpd, 0); - if (cc.is64Bit()) cc.evex().vpinsrq(xmmA, xmmB, gpq, 0); - cc.evex().vpinsrw(xmmA, xmmB, gpd, 0); - cc.evex().vplzcntd(xmmA, xmmB); - cc.evex().vplzcntd(ymmA, ymmB); - cc.evex().vplzcntd(zmmA, zmmB); - cc.evex().vplzcntq(xmmA, xmmB); - cc.evex().vplzcntq(ymmA, ymmB); - cc.evex().vplzcntq(zmmA, zmmB); - cc.evex().vpmadd52huq(xmmA, xmmB, xmmC); - cc.evex().vpmadd52huq(ymmA, ymmB, ymmC); - cc.evex().vpmadd52huq(zmmA, zmmB, zmmC); - cc.evex().vpmadd52luq(xmmA, xmmB, xmmC); - cc.evex().vpmadd52luq(ymmA, ymmB, ymmC); - cc.evex().vpmadd52luq(zmmA, zmmB, zmmC); - cc.evex().vpmaddubsw(xmmA, xmmB, xmmC); - cc.evex().vpmaddubsw(ymmA, ymmB, ymmC); - cc.evex().vpmaddubsw(zmmA, zmmB, zmmC); - cc.evex().vpmaddwd(xmmA, xmmB, xmmC); - cc.evex().vpmaddwd(ymmA, ymmB, ymmC); - cc.evex().vpmaddwd(zmmA, zmmB, zmmC); - cc.evex().vpmaxsb(xmmA, xmmB, xmmC); - cc.evex().vpmaxsb(ymmA, ymmB, ymmC); - cc.evex().vpmaxsb(zmmA, zmmB, zmmC); - cc.evex().vpmaxsd(xmmA, xmmB, xmmC); - cc.evex().vpmaxsd(ymmA, ymmB, ymmC); - cc.evex().vpmaxsd(zmmA, zmmB, zmmC); - cc.evex().vpmaxsq(xmmA, xmmB, xmmC); - cc.evex().vpmaxsq(ymmA, ymmB, ymmC); - cc.evex().vpmaxsq(zmmA, zmmB, zmmC); - cc.evex().vpmaxsw(xmmA, xmmB, xmmC); - cc.evex().vpmaxsw(ymmA, ymmB, ymmC); - cc.evex().vpmaxsw(zmmA, zmmB, zmmC); - cc.evex().vpmaxub(xmmA, xmmB, xmmC); - cc.evex().vpmaxub(ymmA, ymmB, ymmC); - cc.evex().vpmaxub(zmmA, zmmB, zmmC); - cc.evex().vpmaxud(xmmA, xmmB, xmmC); - cc.evex().vpmaxud(ymmA, ymmB, ymmC); - cc.evex().vpmaxud(zmmA, zmmB, zmmC); - cc.evex().vpmaxuq(xmmA, xmmB, xmmC); - cc.evex().vpmaxuq(ymmA, ymmB, ymmC); - cc.evex().vpmaxuq(zmmA, zmmB, zmmC); - cc.evex().vpmaxuw(xmmA, xmmB, xmmC); - cc.evex().vpmaxuw(ymmA, ymmB, ymmC); - cc.evex().vpmaxuw(zmmA, zmmB, zmmC); - cc.evex().vpminsb(xmmA, xmmB, xmmC); - cc.evex().vpminsb(ymmA, ymmB, ymmC); - cc.evex().vpminsb(zmmA, zmmB, zmmC); - cc.evex().vpminsd(xmmA, xmmB, xmmC); - cc.evex().vpminsd(ymmA, ymmB, ymmC); - cc.evex().vpminsd(zmmA, zmmB, zmmC); - cc.evex().vpminsq(xmmA, xmmB, xmmC); - cc.evex().vpminsq(ymmA, ymmB, ymmC); - cc.evex().vpminsq(zmmA, zmmB, zmmC); - cc.evex().vpminsw(xmmA, xmmB, xmmC); - cc.evex().vpminsw(ymmA, ymmB, ymmC); - cc.evex().vpminsw(zmmA, zmmB, zmmC); - cc.evex().vpminub(xmmA, xmmB, xmmC); - cc.evex().vpminub(ymmA, ymmB, ymmC); - cc.evex().vpminub(zmmA, zmmB, zmmC); - cc.evex().vpminud(xmmA, xmmB, xmmC); - cc.evex().vpminud(ymmA, ymmB, ymmC); - cc.evex().vpminud(zmmA, zmmB, zmmC); - cc.evex().vpminuq(xmmA, xmmB, xmmC); - cc.evex().vpminuq(ymmA, ymmB, ymmC); - cc.evex().vpminuq(zmmA, zmmB, zmmC); - cc.evex().vpminuw(xmmA, xmmB, xmmC); - cc.evex().vpminuw(ymmA, ymmB, ymmC); - cc.evex().vpminuw(zmmA, zmmB, zmmC); - cc.evex().vpmovb2m(kA, xmmB); - cc.evex().vpmovb2m(kA, ymmB); - cc.evex().vpmovb2m(kA, zmmB); - cc.evex().vpmovd2m(kA, xmmB); - cc.evex().vpmovd2m(kA, ymmB); - cc.evex().vpmovd2m(kA, zmmB); - cc.evex().vpmovdb(xmmA, xmmB); - cc.evex().vpmovdb(xmmA, ymmB); - cc.evex().vpmovdb(xmmA, zmmB); - cc.evex().vpmovdw(xmmA, xmmB); - cc.evex().vpmovdw(xmmA, ymmB); - cc.evex().vpmovdw(ymmA, zmmB); - cc.evex().vpmovm2b(xmmA, kB); - cc.evex().vpmovm2b(ymmA, kB); - cc.evex().vpmovm2b(zmmA, kB); - cc.evex().vpmovm2d(xmmA, kB); - cc.evex().vpmovm2d(ymmA, kB); - cc.evex().vpmovm2d(zmmA, kB); - cc.evex().vpmovm2q(xmmA, kB); - cc.evex().vpmovm2q(ymmA, kB); - cc.evex().vpmovm2q(zmmA, kB); - cc.evex().vpmovm2w(xmmA, kB); - cc.evex().vpmovm2w(ymmA, kB); - cc.evex().vpmovm2w(zmmA, kB); - cc.evex().vpmovq2m(kA, xmmB); - cc.evex().vpmovq2m(kA, ymmB); - cc.evex().vpmovq2m(kA, zmmB); - cc.evex().vpmovqb(xmmA, xmmB); - cc.evex().vpmovqb(xmmA, ymmB); - cc.evex().vpmovqb(xmmA, zmmB); - cc.evex().vpmovqd(xmmA, xmmB); - cc.evex().vpmovqd(xmmA, ymmB); - cc.evex().vpmovqd(ymmA, zmmB); - cc.evex().vpmovqw(xmmA, xmmB); - cc.evex().vpmovqw(xmmA, ymmB); - cc.evex().vpmovqw(xmmA, zmmB); - cc.evex().vpmovsdb(xmmA, xmmB); - cc.evex().vpmovsdb(xmmA, ymmB); - cc.evex().vpmovsdb(xmmA, zmmB); - cc.evex().vpmovsdw(xmmA, xmmB); - cc.evex().vpmovsdw(xmmA, ymmB); - cc.evex().vpmovsdw(ymmA, zmmB); - cc.evex().vpmovsqb(xmmA, xmmB); - cc.evex().vpmovsqb(xmmA, ymmB); - cc.evex().vpmovsqb(xmmA, zmmB); - cc.evex().vpmovsqd(xmmA, xmmB); - cc.evex().vpmovsqd(xmmA, ymmB); - cc.evex().vpmovsqd(ymmA, zmmB); - cc.evex().vpmovsqw(xmmA, xmmB); - cc.evex().vpmovsqw(xmmA, ymmB); - cc.evex().vpmovsqw(xmmA, zmmB); - cc.evex().vpmovswb(xmmA, xmmB); - cc.evex().vpmovswb(xmmA, ymmB); - cc.evex().vpmovswb(ymmA, zmmB); - cc.evex().vpmovsxbd(xmmA, xmmB); - cc.evex().vpmovsxbd(ymmA, xmmB); - cc.evex().vpmovsxbd(zmmA, xmmB); - cc.evex().vpmovsxbq(xmmA, xmmB); - cc.evex().vpmovsxbq(ymmA, xmmB); - cc.evex().vpmovsxbq(zmmA, xmmB); - cc.evex().vpmovsxbw(xmmA, xmmB); - cc.evex().vpmovsxbw(ymmA, xmmB); - cc.evex().vpmovsxbw(zmmA, ymmB); - cc.evex().vpmovsxdq(xmmA, xmmB); - cc.evex().vpmovsxdq(ymmA, xmmB); - cc.evex().vpmovsxdq(zmmA, ymmB); - cc.evex().vpmovsxwd(xmmA, xmmB); - cc.evex().vpmovsxwd(ymmA, xmmB); - cc.evex().vpmovsxwd(zmmA, ymmB); - cc.evex().vpmovsxwq(xmmA, xmmB); - cc.evex().vpmovsxwq(ymmA, xmmB); - cc.evex().vpmovsxwq(zmmA, xmmB); - cc.evex().vpmovusdb(xmmA, xmmB); - cc.evex().vpmovusdb(xmmA, ymmB); - cc.evex().vpmovusdb(xmmA, zmmB); - cc.evex().vpmovusdw(xmmA, xmmB); - cc.evex().vpmovusdw(xmmA, ymmB); - cc.evex().vpmovusdw(ymmA, zmmB); - cc.evex().vpmovusqb(xmmA, xmmB); - cc.evex().vpmovusqb(xmmA, ymmB); - cc.evex().vpmovusqb(xmmA, zmmB); - cc.evex().vpmovusqd(xmmA, xmmB); - cc.evex().vpmovusqd(xmmA, ymmB); - cc.evex().vpmovusqd(ymmA, zmmB); - cc.evex().vpmovusqw(xmmA, xmmB); - cc.evex().vpmovusqw(xmmA, ymmB); - cc.evex().vpmovusqw(xmmA, zmmB); - cc.evex().vpmovuswb(xmmA, xmmB); - cc.evex().vpmovuswb(xmmA, ymmB); - cc.evex().vpmovuswb(ymmA, zmmB); - cc.evex().vpmovw2m(kA, xmmB); - cc.evex().vpmovw2m(kA, ymmB); - cc.evex().vpmovw2m(kA, zmmB); - cc.evex().vpmovwb(xmmA, xmmB); - cc.evex().vpmovwb(xmmA, ymmB); - cc.evex().vpmovwb(ymmA, zmmB); - cc.evex().vpmovzxbd(xmmA, xmmB); - cc.evex().vpmovzxbd(ymmA, xmmB); - cc.evex().vpmovzxbd(zmmA, xmmB); - cc.evex().vpmovzxbq(xmmA, xmmB); - cc.evex().vpmovzxbq(ymmA, xmmB); - cc.evex().vpmovzxbq(zmmA, xmmB); - cc.evex().vpmovzxbw(xmmA, xmmB); - cc.evex().vpmovzxbw(ymmA, xmmB); - cc.evex().vpmovzxbw(zmmA, ymmB); - cc.evex().vpmovzxdq(xmmA, xmmB); - cc.evex().vpmovzxdq(ymmA, xmmB); - cc.evex().vpmovzxdq(zmmA, ymmB); - cc.evex().vpmovzxwd(xmmA, xmmB); - cc.evex().vpmovzxwd(ymmA, xmmB); - cc.evex().vpmovzxwd(zmmA, ymmB); - cc.evex().vpmovzxwq(xmmA, xmmB); - cc.evex().vpmovzxwq(ymmA, xmmB); - cc.evex().vpmovzxwq(zmmA, xmmB); - cc.evex().vpmuldq(xmmA, xmmB, xmmC); - cc.evex().vpmuldq(ymmA, ymmB, ymmC); - cc.evex().vpmuldq(zmmA, zmmB, zmmC); - cc.evex().vpmulhrsw(xmmA, xmmB, xmmC); - cc.evex().vpmulhrsw(ymmA, ymmB, ymmC); - cc.evex().vpmulhrsw(zmmA, zmmB, zmmC); - cc.evex().vpmulhuw(xmmA, xmmB, xmmC); - cc.evex().vpmulhuw(ymmA, ymmB, ymmC); - cc.evex().vpmulhuw(zmmA, zmmB, zmmC); - cc.evex().vpmulhw(xmmA, xmmB, xmmC); - cc.evex().vpmulhw(ymmA, ymmB, ymmC); - cc.evex().vpmulhw(zmmA, zmmB, zmmC); - cc.evex().vpmulld(xmmA, xmmB, xmmC); - cc.evex().vpmulld(ymmA, ymmB, ymmC); - cc.evex().vpmulld(zmmA, zmmB, zmmC); - cc.evex().vpmullq(xmmA, xmmB, xmmC); - cc.evex().vpmullq(ymmA, ymmB, ymmC); - cc.evex().vpmullq(zmmA, zmmB, zmmC); - cc.evex().vpmullw(xmmA, xmmB, xmmC); - cc.evex().vpmullw(ymmA, ymmB, ymmC); - cc.evex().vpmullw(zmmA, zmmB, zmmC); - cc.evex().vpmultishiftqb(xmmA, xmmB, xmmC); - cc.evex().vpmultishiftqb(ymmA, ymmB, ymmC); - cc.evex().vpmultishiftqb(zmmA, zmmB, zmmC); - cc.evex().vpmuludq(xmmA, xmmB, xmmC); - cc.evex().vpmuludq(ymmA, ymmB, ymmC); - cc.evex().vpmuludq(zmmA, zmmB, zmmC); - cc.evex().vpopcntd(zmmA, zmmB); - cc.evex().vpopcntq(zmmA, zmmB); - cc.evex().vpord(xmmA, xmmB, xmmC); - cc.evex().vpord(ymmA, ymmB, ymmC); - cc.evex().vpord(zmmA, zmmB, zmmC); - cc.evex().vporq(xmmA, xmmB, xmmC); - cc.evex().vporq(ymmA, ymmB, ymmC); - cc.evex().vporq(zmmA, zmmB, zmmC); - cc.evex().vprold(xmmA, xmmB, 0); - cc.evex().vprold(ymmA, ymmB, 0); - cc.evex().vprold(zmmA, zmmB, 0); - cc.evex().vprolq(xmmA, xmmB, 0); - cc.evex().vprolq(ymmA, ymmB, 0); - cc.evex().vprolq(zmmA, zmmB, 0); - cc.evex().vprolvd(xmmA, xmmB, xmmC); - cc.evex().vprolvd(ymmA, ymmB, ymmC); - cc.evex().vprolvd(zmmA, zmmB, zmmC); - cc.evex().vprolvq(xmmA, xmmB, xmmC); - cc.evex().vprolvq(ymmA, ymmB, ymmC); - cc.evex().vprolvq(zmmA, zmmB, zmmC); - cc.evex().vprord(xmmA, xmmB, 0); - cc.evex().vprord(ymmA, ymmB, 0); - cc.evex().vprord(zmmA, zmmB, 0); - cc.evex().vprorq(xmmA, xmmB, 0); - cc.evex().vprorq(ymmA, ymmB, 0); - cc.evex().vprorq(zmmA, zmmB, 0); - cc.evex().vprorvd(xmmA, xmmB, xmmC); - cc.evex().vprorvd(ymmA, ymmB, ymmC); - cc.evex().vprorvd(zmmA, zmmB, zmmC); - cc.evex().vprorvq(xmmA, xmmB, xmmC); - cc.evex().vprorvq(ymmA, ymmB, ymmC); - cc.evex().vprorvq(zmmA, zmmB, zmmC); - cc.evex().vpsadbw(xmmA, xmmB, xmmC); - cc.evex().vpsadbw(ymmA, ymmB, ymmC); - cc.evex().vpsadbw(zmmA, zmmB, zmmC); - cc.evex().vpshufb(xmmA, xmmB, xmmC); - cc.evex().vpshufb(ymmA, ymmB, ymmC); - cc.evex().vpshufb(zmmA, zmmB, zmmC); - cc.evex().vpshufd(xmmA, xmmB, 0); - cc.evex().vpshufd(ymmA, ymmB, 0); - cc.evex().vpshufd(zmmA, zmmB, 0); - cc.evex().vpshufhw(xmmA, xmmB, 0); - cc.evex().vpshufhw(ymmA, ymmB, 0); - cc.evex().vpshufhw(zmmA, zmmB, 0); - cc.evex().vpshuflw(xmmA, xmmB, 0); - cc.evex().vpshuflw(ymmA, ymmB, 0); - cc.evex().vpshuflw(zmmA, zmmB, 0); - cc.evex().vpslld(xmmA, xmmB, xmmC); - cc.evex().vpslld(xmmA, xmmB, 0); - cc.evex().vpslld(ymmA, ymmB, xmmC); - cc.evex().vpslld(ymmA, ymmB, 0); - cc.evex().vpslld(zmmA, zmmB, xmmC); - cc.evex().vpslld(zmmA, zmmB, 0); - cc.evex().vpslldq(xmmA, xmmB, 0); - cc.evex().vpslldq(ymmA, ymmB, 0); - cc.evex().vpslldq(zmmA, zmmB, 0); - cc.evex().vpsllq(xmmA, xmmB, xmmC); - cc.evex().vpsllq(xmmA, xmmB, 0); - cc.evex().vpsllq(ymmA, ymmB, xmmC); - cc.evex().vpsllq(ymmA, ymmB, 0); - cc.evex().vpsllq(zmmA, zmmB, xmmC); - cc.evex().vpsllq(zmmA, zmmB, 0); - cc.evex().vpsllvd(xmmA, xmmB, xmmC); - cc.evex().vpsllvd(ymmA, ymmB, ymmC); - cc.evex().vpsllvd(zmmA, zmmB, zmmC); - cc.evex().vpsllvq(xmmA, xmmB, xmmC); - cc.evex().vpsllvq(ymmA, ymmB, ymmC); - cc.evex().vpsllvq(zmmA, zmmB, zmmC); - cc.evex().vpsllvw(xmmA, xmmB, xmmC); - cc.evex().vpsllvw(ymmA, ymmB, ymmC); - cc.evex().vpsllvw(zmmA, zmmB, zmmC); - cc.evex().vpsllw(xmmA, xmmB, xmmC); - cc.evex().vpsllw(xmmA, xmmB, 0); - cc.evex().vpsllw(ymmA, ymmB, xmmC); - cc.evex().vpsllw(ymmA, ymmB, 0); - cc.evex().vpsllw(zmmA, zmmB, xmmC); - cc.evex().vpsllw(zmmA, zmmB, 0); - cc.evex().vpsrad(xmmA, xmmB, xmmC); - cc.evex().vpsrad(xmmA, xmmB, 0); - cc.evex().vpsrad(ymmA, ymmB, xmmC); - cc.evex().vpsrad(ymmA, ymmB, 0); - cc.evex().vpsrad(zmmA, zmmB, xmmC); - cc.evex().vpsrad(zmmA, zmmB, 0); - cc.evex().vpsraq(xmmA, xmmB, xmmC); - cc.evex().vpsraq(xmmA, xmmB, 0); - cc.evex().vpsraq(ymmA, ymmB, xmmC); - cc.evex().vpsraq(ymmA, ymmB, 0); - cc.evex().vpsraq(zmmA, zmmB, xmmC); - cc.evex().vpsraq(zmmA, zmmB, 0); - cc.evex().vpsravd(xmmA, xmmB, xmmC); - cc.evex().vpsravd(ymmA, ymmB, ymmC); - cc.evex().vpsravd(zmmA, zmmB, zmmC); - cc.evex().vpsravq(xmmA, xmmB, xmmC); - cc.evex().vpsravq(ymmA, ymmB, ymmC); - cc.evex().vpsravq(zmmA, zmmB, zmmC); - cc.evex().vpsravw(xmmA, xmmB, xmmC); - cc.evex().vpsravw(ymmA, ymmB, ymmC); - cc.evex().vpsravw(zmmA, zmmB, zmmC); - cc.evex().vpsraw(xmmA, xmmB, xmmC); - cc.evex().vpsraw(xmmA, xmmB, 0); - cc.evex().vpsraw(ymmA, ymmB, xmmC); - cc.evex().vpsraw(ymmA, ymmB, 0); - cc.evex().vpsraw(zmmA, zmmB, xmmC); - cc.evex().vpsraw(zmmA, zmmB, 0); - cc.evex().vpsrld(xmmA, xmmB, xmmC); - cc.evex().vpsrld(xmmA, xmmB, 0); - cc.evex().vpsrld(ymmA, ymmB, xmmC); - cc.evex().vpsrld(ymmA, ymmB, 0); - cc.evex().vpsrld(zmmA, zmmB, xmmC); - cc.evex().vpsrld(zmmA, zmmB, 0); - cc.evex().vpsrldq(xmmA, xmmB, 0); - cc.evex().vpsrldq(ymmA, ymmB, 0); - cc.evex().vpsrldq(zmmA, zmmB, 0); - cc.evex().vpsrlq(xmmA, xmmB, xmmC); - cc.evex().vpsrlq(xmmA, xmmB, 0); - cc.evex().vpsrlq(ymmA, ymmB, xmmC); - cc.evex().vpsrlq(ymmA, ymmB, 0); - cc.evex().vpsrlq(zmmA, zmmB, xmmC); - cc.evex().vpsrlq(zmmA, zmmB, 0); - cc.evex().vpsrlvd(xmmA, xmmB, xmmC); - cc.evex().vpsrlvd(ymmA, ymmB, ymmC); - cc.evex().vpsrlvd(zmmA, zmmB, zmmC); - cc.evex().vpsrlvq(xmmA, xmmB, xmmC); - cc.evex().vpsrlvq(ymmA, ymmB, ymmC); - cc.evex().vpsrlvq(zmmA, zmmB, zmmC); - cc.evex().vpsrlvw(xmmA, xmmB, xmmC); - cc.evex().vpsrlvw(ymmA, ymmB, ymmC); - cc.evex().vpsrlvw(zmmA, zmmB, zmmC); - cc.evex().vpsrlw(xmmA, xmmB, xmmC); - cc.evex().vpsrlw(xmmA, xmmB, 0); - cc.evex().vpsrlw(ymmA, ymmB, xmmC); - cc.evex().vpsrlw(ymmA, ymmB, 0); - cc.evex().vpsrlw(zmmA, zmmB, xmmC); - cc.evex().vpsrlw(zmmA, zmmB, 0); - cc.evex().vpsubb(xmmA, xmmB, xmmC); - cc.evex().vpsubb(ymmA, ymmB, ymmC); - cc.evex().vpsubb(zmmA, zmmB, zmmC); - cc.evex().vpsubd(xmmA, xmmB, xmmC); - cc.evex().vpsubd(ymmA, ymmB, ymmC); - cc.evex().vpsubd(zmmA, zmmB, zmmC); - cc.evex().vpsubq(xmmA, xmmB, xmmC); - cc.evex().vpsubq(ymmA, ymmB, ymmC); - cc.evex().vpsubq(zmmA, zmmB, zmmC); - cc.evex().vpsubsb(xmmA, xmmB, xmmC); - cc.evex().vpsubsb(ymmA, ymmB, ymmC); - cc.evex().vpsubsb(zmmA, zmmB, zmmC); - cc.evex().vpsubsw(xmmA, xmmB, xmmC); - cc.evex().vpsubsw(ymmA, ymmB, ymmC); - cc.evex().vpsubsw(zmmA, zmmB, zmmC); - cc.evex().vpsubusb(xmmA, xmmB, xmmC); - cc.evex().vpsubusb(ymmA, ymmB, ymmC); - cc.evex().vpsubusb(zmmA, zmmB, zmmC); - cc.evex().vpsubusw(xmmA, xmmB, xmmC); - cc.evex().vpsubusw(ymmA, ymmB, ymmC); - cc.evex().vpsubusw(zmmA, zmmB, zmmC); - cc.evex().vpsubw(xmmA, xmmB, xmmC); - cc.evex().vpsubw(ymmA, ymmB, ymmC); - cc.evex().vpsubw(zmmA, zmmB, zmmC); - cc.evex().vpternlogd(xmmA, xmmB, xmmC, 0); - cc.evex().vpternlogd(ymmA, ymmB, ymmC, 0); - cc.evex().vpternlogd(zmmA, zmmB, zmmC, 0); - cc.evex().vpternlogq(xmmA, xmmB, xmmC, 0); - cc.evex().vpternlogq(ymmA, ymmB, ymmC, 0); - cc.evex().vpternlogq(zmmA, zmmB, zmmC, 0); - cc.evex().vptestmb(kA, xmmB, xmmC); - cc.evex().vptestmb(kA, ymmB, ymmC); - cc.evex().vptestmb(kA, zmmB, zmmC); - cc.evex().vptestmd(kA, xmmB, xmmC); - cc.evex().vptestmd(kA, ymmB, ymmC); - cc.evex().vptestmd(kA, zmmB, zmmC); - cc.evex().vptestmq(kA, xmmB, xmmC); - cc.evex().vptestmq(kA, ymmB, ymmC); - cc.evex().vptestmq(kA, zmmB, zmmC); - cc.evex().vptestmw(kA, xmmB, xmmC); - cc.evex().vptestmw(kA, ymmB, ymmC); - cc.evex().vptestmw(kA, zmmB, zmmC); - cc.evex().vptestnmb(kA, xmmB, xmmC); - cc.evex().vptestnmb(kA, ymmB, ymmC); - cc.evex().vptestnmb(kA, zmmB, zmmC); - cc.evex().vptestnmd(kA, xmmB, xmmC); - cc.evex().vptestnmd(kA, ymmB, ymmC); - cc.evex().vptestnmd(kA, zmmB, zmmC); - cc.evex().vptestnmq(kA, xmmB, xmmC); - cc.evex().vptestnmq(kA, ymmB, ymmC); - cc.evex().vptestnmq(kA, zmmB, zmmC); - cc.evex().vptestnmw(kA, xmmB, xmmC); - cc.evex().vptestnmw(kA, ymmB, ymmC); - cc.evex().vptestnmw(kA, zmmB, zmmC); - cc.evex().vpunpckhbw(xmmA, xmmB, xmmC); - cc.evex().vpunpckhbw(ymmA, ymmB, ymmC); - cc.evex().vpunpckhbw(zmmA, zmmB, zmmC); - cc.evex().vpunpckhdq(xmmA, xmmB, xmmC); - cc.evex().vpunpckhdq(ymmA, ymmB, ymmC); - cc.evex().vpunpckhdq(zmmA, zmmB, zmmC); - cc.evex().vpunpckhqdq(xmmA, xmmB, xmmC); - cc.evex().vpunpckhqdq(ymmA, ymmB, ymmC); - cc.evex().vpunpckhqdq(zmmA, zmmB, zmmC); - cc.evex().vpunpckhwd(xmmA, xmmB, xmmC); - cc.evex().vpunpckhwd(ymmA, ymmB, ymmC); - cc.evex().vpunpckhwd(zmmA, zmmB, zmmC); - cc.evex().vpunpcklbw(xmmA, xmmB, xmmC); - cc.evex().vpunpcklbw(ymmA, ymmB, ymmC); - cc.evex().vpunpcklbw(zmmA, zmmB, zmmC); - cc.evex().vpunpckldq(xmmA, xmmB, xmmC); - cc.evex().vpunpckldq(ymmA, ymmB, ymmC); - cc.evex().vpunpckldq(zmmA, zmmB, zmmC); - cc.evex().vpunpcklqdq(xmmA, xmmB, xmmC); - cc.evex().vpunpcklqdq(ymmA, ymmB, ymmC); - cc.evex().vpunpcklqdq(zmmA, zmmB, zmmC); - cc.evex().vpunpcklwd(xmmA, xmmB, xmmC); - cc.evex().vpunpcklwd(ymmA, ymmB, ymmC); - cc.evex().vpunpcklwd(zmmA, zmmB, zmmC); - cc.evex().vpxord(xmmA, xmmB, xmmC); - cc.evex().vpxord(ymmA, ymmB, ymmC); - cc.evex().vpxord(zmmA, zmmB, zmmC); - cc.evex().vpxorq(xmmA, xmmB, xmmC); - cc.evex().vpxorq(ymmA, ymmB, ymmC); - cc.evex().vpxorq(zmmA, zmmB, zmmC); - cc.evex().vrangepd(xmmA, xmmB, xmmC, 0); - cc.evex().vrangepd(ymmA, ymmB, ymmC, 0); - cc.evex().vrangepd(zmmA, zmmB, zmmC, 0); - cc.evex().vrangeps(xmmA, xmmB, xmmC, 0); - cc.evex().vrangeps(ymmA, ymmB, ymmC, 0); - cc.evex().vrangeps(zmmA, zmmB, zmmC, 0); - cc.evex().vrangesd(xmmA, xmmB, xmmC, 0); - cc.evex().vrangess(xmmA, xmmB, xmmC, 0); - cc.evex().vrcp14pd(xmmA, xmmB); - cc.evex().vrcp14pd(ymmA, ymmB); - cc.evex().vrcp14pd(zmmA, zmmB); - cc.evex().vrcp14ps(xmmA, xmmB); - cc.evex().vrcp14ps(ymmA, ymmB); - cc.evex().vrcp14ps(zmmA, zmmB); - cc.evex().vrcp14sd(xmmA, xmmB, xmmC); - cc.evex().vrcp14ss(xmmA, xmmB, xmmC); - cc.evex().vrcp28pd(zmmA, zmmB); - cc.evex().vrcp28ps(zmmA, zmmB); - cc.evex().vrcp28sd(xmmA, xmmB, xmmC); - cc.evex().vrcp28ss(xmmA, xmmB, xmmC); - cc.evex().vreducepd(xmmA, xmmB, 0); - cc.evex().vreducepd(ymmA, ymmB, 0); - cc.evex().vreducepd(zmmA, zmmB, 0); - cc.evex().vreduceps(xmmA, xmmB, 0); - cc.evex().vreduceps(ymmA, ymmB, 0); - cc.evex().vreduceps(zmmA, zmmB, 0); - cc.evex().vreducesd(xmmA, xmmB, xmmC, 0); - cc.evex().vreducess(xmmA, xmmB, xmmC, 0); - cc.evex().vrndscalepd(xmmA, xmmB, 0); - cc.evex().vrndscalepd(ymmA, ymmB, 0); - cc.evex().vrndscalepd(zmmA, zmmB, 0); - cc.evex().vrndscaleps(xmmA, xmmB, 0); - cc.evex().vrndscaleps(ymmA, ymmB, 0); - cc.evex().vrndscaleps(zmmA, zmmB, 0); - cc.evex().vrndscalesd(xmmA, xmmB, xmmC, 0); - cc.evex().vrndscaless(xmmA, xmmB, xmmC, 0); - cc.evex().vrsqrt14pd(xmmA, xmmB); - cc.evex().vrsqrt14pd(ymmA, ymmB); - cc.evex().vrsqrt14pd(zmmA, zmmB); - cc.evex().vrsqrt14ps(xmmA, xmmB); - cc.evex().vrsqrt14ps(ymmA, ymmB); - cc.evex().vrsqrt14ps(zmmA, zmmB); - cc.evex().vrsqrt14sd(xmmA, xmmB, xmmC); - cc.evex().vrsqrt14ss(xmmA, xmmB, xmmC); - cc.evex().vrsqrt28pd(zmmA, zmmB); - cc.evex().vrsqrt28ps(zmmA, zmmB); - cc.evex().vrsqrt28sd(xmmA, xmmB, xmmC); - cc.evex().vrsqrt28ss(xmmA, xmmB, xmmC); - cc.evex().vscalefpd(xmmA, xmmB, xmmC); - cc.evex().vscalefpd(ymmA, ymmB, ymmC); - cc.evex().vscalefpd(zmmA, zmmB, zmmC); - cc.evex().vscalefps(xmmA, xmmB, xmmC); - cc.evex().vscalefps(ymmA, ymmB, ymmC); - cc.evex().vscalefps(zmmA, zmmB, zmmC); - cc.evex().vscalefsd(xmmA, xmmB, xmmC); - cc.evex().vscalefss(xmmA, xmmB, xmmC); - cc.evex().vshuff32x4(ymmA, ymmB, ymmC, 0); - cc.evex().vshuff32x4(zmmA, zmmB, zmmC, 0); - cc.evex().vshuff64x2(ymmA, ymmB, ymmC, 0); - cc.evex().vshuff64x2(zmmA, zmmB, zmmC, 0); - cc.evex().vshufi32x4(ymmA, ymmB, ymmC, 0); - cc.evex().vshufi32x4(zmmA, zmmB, zmmC, 0); - cc.evex().vshufi64x2(ymmA, ymmB, ymmC, 0); - cc.evex().vshufi64x2(zmmA, zmmB, zmmC, 0); - cc.evex().vshufpd(xmmA, xmmB, xmmC, 0); - cc.evex().vshufpd(ymmA, ymmB, ymmC, 0); - cc.evex().vshufpd(zmmA, zmmB, zmmC, 0); - cc.evex().vshufps(xmmA, xmmB, xmmC, 0); - cc.evex().vshufps(ymmA, ymmB, ymmC, 0); - cc.evex().vshufps(zmmA, zmmB, zmmC, 0); - cc.evex().vsqrtpd(xmmA, xmmB); - cc.evex().vsqrtpd(ymmA, ymmB); - cc.evex().vsqrtpd(zmmA, zmmB); - cc.evex().vsqrtps(xmmA, xmmB); - cc.evex().vsqrtps(ymmA, ymmB); - cc.evex().vsqrtps(zmmA, zmmB); - cc.evex().vsqrtsd(xmmA, xmmB, xmmC); - cc.evex().vsqrtss(xmmA, xmmB, xmmC); - cc.evex().vsubpd(xmmA, xmmB, xmmC); - cc.evex().vsubpd(ymmA, ymmB, ymmC); - cc.evex().vsubpd(zmmA, zmmB, zmmC); - cc.evex().vsubps(xmmA, xmmB, xmmC); - cc.evex().vsubps(ymmA, ymmB, ymmC); - cc.evex().vsubps(zmmA, zmmB, zmmC); - cc.evex().vsubsd(xmmA, xmmB, xmmC); - cc.evex().vsubss(xmmA, xmmB, xmmC); - cc.evex().vucomisd(xmmA, xmmB); - cc.evex().vucomiss(xmmA, xmmB); - cc.evex().vunpckhpd(xmmA, xmmB, xmmC); - cc.evex().vunpckhpd(ymmA, ymmB, ymmC); - cc.evex().vunpckhpd(zmmA, zmmB, zmmC); - cc.evex().vunpckhps(xmmA, xmmB, xmmC); - cc.evex().vunpckhps(ymmA, ymmB, ymmC); - cc.evex().vunpckhps(zmmA, zmmB, zmmC); - cc.evex().vunpcklpd(xmmA, xmmB, xmmC); - cc.evex().vunpcklpd(ymmA, ymmB, ymmC); - cc.evex().vunpcklpd(zmmA, zmmB, zmmC); - cc.evex().vunpcklps(xmmA, xmmB, xmmC); - cc.evex().vunpcklps(ymmA, ymmB, ymmC); - cc.evex().vunpcklps(zmmA, zmmB, zmmC); - cc.evex().vxorpd(xmmA, xmmB, xmmC); - cc.evex().vxorpd(ymmA, ymmB, ymmC); - cc.evex().vxorpd(zmmA, zmmB, zmmC); - cc.evex().vxorps(xmmA, xmmB, xmmC); - cc.evex().vxorps(ymmA, ymmB, ymmC); - cc.evex().vxorps(zmmA, zmmB, zmmC); - } - else { - x86::Mem m = x86::ptr(gpz); - x86::Mem m32 = x86::dword_ptr(gpz); - x86::Mem m64 = x86::qword_ptr(gpz); - x86::Mem m128 = x86::xmmword_ptr(gpz); - x86::Mem m256 = x86::ymmword_ptr(gpz); - x86::Mem m512 = x86::zmmword_ptr(gpz); - x86::Mem vx_ptr = x86::ptr(gpz, xmmD); - x86::Mem vy_ptr = x86::ptr(gpz, ymmD); - x86::Mem vz_ptr = x86::ptr(gpz, zmmD); - - cc.kmovb(kA, m); - cc.kmovb(m, kB); - cc.kmovd(kA, m); - cc.kmovd(m, kB); - cc.kmovq(kA, m); - cc.kmovq(m, kB); - cc.kmovw(kA, m); - cc.kmovw(m, kB); - - cc.evex().vaddpd(xmmA, xmmB, m); - cc.evex().vaddpd(ymmA, ymmB, m); - cc.evex().vaddpd(zmmA, zmmB, m); - cc.evex().vaddps(xmmA, xmmB, m); - cc.evex().vaddps(ymmA, ymmB, m); - cc.evex().vaddps(zmmA, zmmB, m); - cc.evex().vaddsd(xmmA, xmmB, m); - cc.evex().vaddss(xmmA, xmmB, m); - cc.evex().valignd(xmmA, xmmB, m, 0); - cc.evex().valignd(ymmA, ymmB, m, 0); - cc.evex().valignd(zmmA, zmmB, m, 0); - cc.evex().valignq(xmmA, xmmB, m, 0); - cc.evex().valignq(ymmA, ymmB, m, 0); - cc.evex().valignq(zmmA, zmmB, m, 0); - cc.evex().vandnpd(xmmA, xmmB, m); - cc.evex().vandnpd(ymmA, ymmB, m); - cc.evex().vandnpd(zmmA, zmmB, m); - cc.evex().vandnps(xmmA, xmmB, m); - cc.evex().vandnps(ymmA, ymmB, m); - cc.evex().vandnps(zmmA, zmmB, m); - cc.evex().vandpd(xmmA, xmmB, m); - cc.evex().vandpd(ymmA, ymmB, m); - cc.evex().vandpd(zmmA, zmmB, m); - cc.evex().vandps(xmmA, xmmB, m); - cc.evex().vandps(ymmA, ymmB, m); - cc.evex().vandps(zmmA, zmmB, m); - cc.evex().vblendmpd(xmmA, xmmB, m); - cc.evex().vblendmpd(ymmA, ymmB, m); - cc.evex().vblendmpd(zmmA, zmmB, m); - cc.evex().vblendmps(xmmA, xmmB, m); - cc.evex().vblendmps(ymmA, ymmB, m); - cc.evex().vblendmps(zmmA, zmmB, m); - cc.evex().vbroadcastf32x2(ymmA, m); - cc.evex().vbroadcastf32x2(zmmA, m); - cc.evex().vbroadcastf32x4(ymmA, m); - cc.evex().vbroadcastf32x4(zmmA, m); - cc.evex().vbroadcastf32x8(zmmA, m); - cc.evex().vbroadcastf64x2(ymmA, m); - cc.evex().vbroadcastf64x2(zmmA, m); - cc.evex().vbroadcastf64x4(zmmA, m); - cc.evex().vbroadcasti32x2(xmmA, m); - cc.evex().vbroadcasti32x2(ymmA, m); - cc.evex().vbroadcasti32x2(zmmA, m); - cc.evex().vbroadcasti32x4(ymmA, m); - cc.evex().vbroadcasti32x4(zmmA, m); - cc.evex().vbroadcasti32x8(zmmA, m); - cc.evex().vbroadcasti64x2(ymmA, m); - cc.evex().vbroadcasti64x2(zmmA, m); - cc.evex().vbroadcasti64x4(zmmA, m); - cc.evex().vbroadcastsd(ymmA, m); - cc.evex().vbroadcastsd(zmmA, m); - cc.evex().vbroadcastss(xmmA, m); - cc.evex().vbroadcastss(ymmA, m); - cc.evex().vbroadcastss(zmmA, m); - cc.evex().vcmppd(kA, xmmB, m, 0); - cc.evex().vcmppd(kA, ymmB, m, 0); - cc.evex().vcmppd(kA, zmmB, m, 0); - cc.evex().vcmpps(kA, xmmB, m, 0); - cc.evex().vcmpps(kA, ymmB, m, 0); - cc.evex().vcmpps(kA, zmmB, m, 0); - cc.evex().vcmpsd(kA, xmmB, m, 0); - cc.evex().vcmpss(kA, xmmB, m, 0); - cc.evex().vcomisd(xmmA, m); - cc.evex().vcomiss(xmmA, m); - cc.evex().vcompresspd(m, xmmB); - cc.evex().vcompresspd(m, ymmB); - cc.evex().vcompresspd(m, zmmB); - cc.evex().vcompressps(m, xmmB); - cc.evex().vcompressps(m, ymmB); - cc.evex().vcompressps(m, zmmB); - cc.evex().vcvtdq2pd(xmmA, m); - cc.evex().vcvtdq2pd(ymmA, m); - cc.evex().vcvtdq2pd(zmmA, m); - cc.evex().vcvtdq2ps(xmmA, m); - cc.evex().vcvtdq2ps(ymmA, m); - cc.evex().vcvtdq2ps(zmmA, m); - cc.evex().vcvtpd2dq(xmmA, m128); - cc.evex().vcvtpd2dq(xmmA, m256); - cc.evex().vcvtpd2dq(ymmA, m512); - cc.evex().vcvtpd2qq(xmmA, m); - cc.evex().vcvtpd2qq(ymmA, m); - cc.evex().vcvtpd2qq(zmmA, m); - cc.evex().vcvtpd2udq(xmmA, m128); - cc.evex().vcvtpd2udq(xmmA, m256); - cc.evex().vcvtpd2udq(ymmA, m512); - cc.evex().vcvtpd2uqq(xmmA, m); - cc.evex().vcvtpd2uqq(ymmA, m); - cc.evex().vcvtpd2uqq(zmmA, m); - cc.evex().vcvtph2ps(xmmA, m); - cc.evex().vcvtph2ps(ymmA, m); - cc.evex().vcvtph2ps(zmmA, m); - cc.evex().vcvtps2dq(xmmA, m); - cc.evex().vcvtps2dq(ymmA, m); - cc.evex().vcvtps2dq(zmmA, m); - cc.evex().vcvtps2pd(xmmA, m); - cc.evex().vcvtps2pd(ymmA, m); - cc.evex().vcvtps2pd(zmmA, m); - cc.evex().vcvtps2ph(m, xmmB, 0); - cc.evex().vcvtps2ph(m, ymmB, 0); - cc.evex().vcvtps2ph(m, zmmB, 0); - cc.evex().vcvtps2qq(xmmA, m); - cc.evex().vcvtps2qq(ymmA, m); - cc.evex().vcvtps2qq(zmmA, m); - cc.evex().vcvtps2udq(xmmA, m); - cc.evex().vcvtps2udq(ymmA, m); - cc.evex().vcvtps2udq(zmmA, m); - cc.evex().vcvtps2uqq(xmmA, m); - cc.evex().vcvtps2uqq(ymmA, m); - cc.evex().vcvtps2uqq(zmmA, m); - cc.evex().vcvtqq2pd(xmmA, m); - cc.evex().vcvtqq2pd(ymmA, m); - cc.evex().vcvtqq2pd(zmmA, m); - cc.evex().vcvtqq2ps(xmmA, m128); - cc.evex().vcvtqq2ps(xmmA, m256); - cc.evex().vcvtqq2ps(ymmA, m512); - cc.evex().vcvtsd2si(gpd, m); - if (cc.is64Bit()) cc.evex().vcvtsd2si(gpq, m); - cc.evex().vcvtsd2ss(xmmA, xmmB, m); - cc.evex().vcvtsd2usi(gpd, m); - if (cc.is64Bit()) cc.evex().vcvtsd2usi(gpq, m); - cc.evex().vcvtsi2sd(xmmA, xmmB, m32); - if (cc.is64Bit()) cc.evex().vcvtsi2sd(xmmA, xmmB, m64); - cc.evex().vcvtsi2ss(xmmA, xmmB, m32); - if (cc.is64Bit()) cc.evex().vcvtsi2ss(xmmA, xmmB, m64); - cc.evex().vcvtss2sd(xmmA, xmmB, m); - cc.evex().vcvtss2si(gpd, m); - if (cc.is64Bit()) cc.evex().vcvtss2si(gpq, m); - cc.evex().vcvtss2usi(gpd, m); - if (cc.is64Bit()) cc.evex().vcvtss2usi(gpq, m); - cc.evex().vcvttpd2dq(xmmA, m128); - cc.evex().vcvttpd2dq(xmmA, m256); - cc.evex().vcvttpd2dq(ymmA, m512); - cc.evex().vcvttpd2qq(xmmA, m); - cc.evex().vcvttpd2qq(ymmA, m); - cc.evex().vcvttpd2qq(zmmA, m); - cc.evex().vcvttpd2udq(xmmA, m128); - cc.evex().vcvttpd2udq(xmmA, m256); - cc.evex().vcvttpd2udq(ymmA, m512); - cc.evex().vcvttpd2uqq(xmmA, m); - cc.evex().vcvttpd2uqq(ymmA, m); - cc.evex().vcvttpd2uqq(zmmA, m); - cc.evex().vcvttps2dq(xmmA, m); - cc.evex().vcvttps2dq(ymmA, m); - cc.evex().vcvttps2dq(zmmA, m); - cc.evex().vcvttps2qq(xmmA, m); - cc.evex().vcvttps2qq(ymmA, m); - cc.evex().vcvttps2qq(zmmA, m); - cc.evex().vcvttps2udq(xmmA, m); - cc.evex().vcvttps2udq(ymmA, m); - cc.evex().vcvttps2udq(zmmA, m); - cc.evex().vcvttps2uqq(xmmA, m); - cc.evex().vcvttps2uqq(ymmA, m); - cc.evex().vcvttps2uqq(zmmA, m); - cc.evex().vcvttsd2si(gpd, m); - if (cc.is64Bit()) cc.evex().vcvttsd2si(gpq, m); - cc.evex().vcvttsd2usi(gpd, m); - if (cc.is64Bit()) cc.evex().vcvttsd2usi(gpq, m); - cc.evex().vcvttss2si(gpd, m); - if (cc.is64Bit()) cc.evex().vcvttss2si(gpq, m); - cc.evex().vcvttss2usi(gpd, m); - if (cc.is64Bit()) cc.evex().vcvttss2usi(gpq, m); - cc.evex().vcvtudq2pd(xmmA, m); - cc.evex().vcvtudq2pd(ymmA, m); - cc.evex().vcvtudq2pd(zmmA, m); - cc.evex().vcvtudq2ps(xmmA, m); - cc.evex().vcvtudq2ps(ymmA, m); - cc.evex().vcvtudq2ps(zmmA, m); - cc.evex().vcvtuqq2pd(xmmA, m); - cc.evex().vcvtuqq2pd(ymmA, m); - cc.evex().vcvtuqq2pd(zmmA, m); - cc.evex().vcvtuqq2ps(xmmA, m128); - cc.evex().vcvtuqq2ps(xmmA, m256); - cc.evex().vcvtuqq2ps(ymmA, m512); - cc.evex().vcvtusi2sd(xmmA, xmmB, m32); - if (cc.is64Bit()) cc.evex().vcvtusi2sd(xmmA, xmmB, m64); - cc.evex().vcvtusi2ss(xmmA, xmmB, m32); - if (cc.is64Bit()) cc.evex().vcvtusi2ss(xmmA, xmmB, m64); - cc.evex().vdbpsadbw(xmmA, xmmB, m, 0); - cc.evex().vdbpsadbw(ymmA, ymmB, m, 0); - cc.evex().vdbpsadbw(zmmA, zmmB, m, 0); - cc.evex().vdivpd(xmmA, xmmB, m); - cc.evex().vdivpd(ymmA, ymmB, m); - cc.evex().vdivpd(zmmA, zmmB, m); - cc.evex().vdivps(xmmA, xmmB, m); - cc.evex().vdivps(ymmA, ymmB, m); - cc.evex().vdivps(zmmA, zmmB, m); - cc.evex().vdivsd(xmmA, xmmB, m); - cc.evex().vdivss(xmmA, xmmB, m); - cc.evex().vexp2pd(zmmA, m); - cc.evex().vexp2ps(zmmA, m); - cc.evex().vexpandpd(xmmA, m); - cc.evex().vexpandpd(ymmA, m); - cc.evex().vexpandpd(zmmA, m); - cc.evex().vexpandps(xmmA, m); - cc.evex().vexpandps(ymmA, m); - cc.evex().vexpandps(zmmA, m); - cc.evex().vextractf32x4(m, ymmB, 0); - cc.evex().vextractf32x4(m, zmmB, 0); - cc.evex().vextractf32x8(m, zmmB, 0); - cc.evex().vextractf64x2(m, ymmB, 0); - cc.evex().vextractf64x2(m, zmmB, 0); - cc.evex().vextractf64x4(m, zmmB, 0); - cc.evex().vextracti32x4(m, ymmB, 0); - cc.evex().vextracti32x4(m, zmmB, 0); - cc.evex().vextracti32x8(m, zmmB, 0); - cc.evex().vextracti64x2(m, ymmB, 0); - cc.evex().vextracti64x2(m, zmmB, 0); - cc.evex().vextracti64x4(m, zmmB, 0); - cc.evex().vextractps(m, xmmB, 0); - cc.evex().vfixupimmpd(xmmA, xmmB, m, 0); - cc.evex().vfixupimmpd(ymmA, ymmB, m, 0); - cc.evex().vfixupimmpd(zmmA, zmmB, m, 0); - cc.evex().vfixupimmps(xmmA, xmmB, m, 0); - cc.evex().vfixupimmps(ymmA, ymmB, m, 0); - cc.evex().vfixupimmps(zmmA, zmmB, m, 0); - cc.evex().vfixupimmsd(xmmA, xmmB, m, 0); - cc.evex().vfixupimmss(xmmA, xmmB, m, 0); - cc.evex().vfmadd132pd(xmmA, xmmB, m); - cc.evex().vfmadd132pd(ymmA, ymmB, m); - cc.evex().vfmadd132pd(zmmA, zmmB, m); - cc.evex().vfmadd132ps(xmmA, xmmB, m); - cc.evex().vfmadd132ps(ymmA, ymmB, m); - cc.evex().vfmadd132ps(zmmA, zmmB, m); - cc.evex().vfmadd132sd(xmmA, xmmB, m); - cc.evex().vfmadd132ss(xmmA, xmmB, m); - cc.evex().vfmadd213pd(xmmA, xmmB, m); - cc.evex().vfmadd213pd(ymmA, ymmB, m); - cc.evex().vfmadd213pd(zmmA, zmmB, m); - cc.evex().vfmadd213ps(xmmA, xmmB, m); - cc.evex().vfmadd213ps(ymmA, ymmB, m); - cc.evex().vfmadd213ps(zmmA, zmmB, m); - cc.evex().vfmadd213sd(xmmA, xmmB, m); - cc.evex().vfmadd213ss(xmmA, xmmB, m); - cc.evex().vfmadd231pd(xmmA, xmmB, m); - cc.evex().vfmadd231pd(ymmA, ymmB, m); - cc.evex().vfmadd231pd(zmmA, zmmB, m); - cc.evex().vfmadd231ps(xmmA, xmmB, m); - cc.evex().vfmadd231ps(ymmA, ymmB, m); - cc.evex().vfmadd231ps(zmmA, zmmB, m); - cc.evex().vfmadd231sd(xmmA, xmmB, m); - cc.evex().vfmadd231ss(xmmA, xmmB, m); - cc.evex().vfmaddsub132pd(xmmA, xmmB, m); - cc.evex().vfmaddsub132pd(ymmA, ymmB, m); - cc.evex().vfmaddsub132pd(zmmA, zmmB, m); - cc.evex().vfmaddsub132ps(xmmA, xmmB, m); - cc.evex().vfmaddsub132ps(ymmA, ymmB, m); - cc.evex().vfmaddsub132ps(zmmA, zmmB, m); - cc.evex().vfmaddsub213pd(xmmA, xmmB, m); - cc.evex().vfmaddsub213pd(ymmA, ymmB, m); - cc.evex().vfmaddsub213pd(zmmA, zmmB, m); - cc.evex().vfmaddsub213ps(xmmA, xmmB, m); - cc.evex().vfmaddsub213ps(ymmA, ymmB, m); - cc.evex().vfmaddsub213ps(zmmA, zmmB, m); - cc.evex().vfmaddsub231pd(xmmA, xmmB, m); - cc.evex().vfmaddsub231pd(ymmA, ymmB, m); - cc.evex().vfmaddsub231pd(zmmA, zmmB, m); - cc.evex().vfmaddsub231ps(xmmA, xmmB, m); - cc.evex().vfmaddsub231ps(ymmA, ymmB, m); - cc.evex().vfmaddsub231ps(zmmA, zmmB, m); - cc.evex().vfmsub132pd(xmmA, xmmB, m); - cc.evex().vfmsub132pd(ymmA, ymmB, m); - cc.evex().vfmsub132pd(zmmA, zmmB, m); - cc.evex().vfmsub132ps(xmmA, xmmB, m); - cc.evex().vfmsub132ps(ymmA, ymmB, m); - cc.evex().vfmsub132ps(zmmA, zmmB, m); - cc.evex().vfmsub132sd(xmmA, xmmB, m); - cc.evex().vfmsub132ss(xmmA, xmmB, m); - cc.evex().vfmsub213pd(xmmA, xmmB, m); - cc.evex().vfmsub213pd(ymmA, ymmB, m); - cc.evex().vfmsub213pd(zmmA, zmmB, m); - cc.evex().vfmsub213ps(xmmA, xmmB, m); - cc.evex().vfmsub213ps(ymmA, ymmB, m); - cc.evex().vfmsub213ps(zmmA, zmmB, m); - cc.evex().vfmsub213sd(xmmA, xmmB, m); - cc.evex().vfmsub213ss(xmmA, xmmB, m); - cc.evex().vfmsub231pd(xmmA, xmmB, m); - cc.evex().vfmsub231pd(ymmA, ymmB, m); - cc.evex().vfmsub231pd(zmmA, zmmB, m); - cc.evex().vfmsub231ps(xmmA, xmmB, m); - cc.evex().vfmsub231ps(ymmA, ymmB, m); - cc.evex().vfmsub231ps(zmmA, zmmB, m); - cc.evex().vfmsub231sd(xmmA, xmmB, m); - cc.evex().vfmsub231ss(xmmA, xmmB, m); - cc.evex().vfmsubadd132pd(xmmA, xmmB, m); - cc.evex().vfmsubadd132pd(ymmA, ymmB, m); - cc.evex().vfmsubadd132pd(zmmA, zmmB, m); - cc.evex().vfmsubadd132ps(xmmA, xmmB, m); - cc.evex().vfmsubadd132ps(ymmA, ymmB, m); - cc.evex().vfmsubadd132ps(zmmA, zmmB, m); - cc.evex().vfmsubadd213pd(xmmA, xmmB, m); - cc.evex().vfmsubadd213pd(ymmA, ymmB, m); - cc.evex().vfmsubadd213pd(zmmA, zmmB, m); - cc.evex().vfmsubadd213ps(xmmA, xmmB, m); - cc.evex().vfmsubadd213ps(ymmA, ymmB, m); - cc.evex().vfmsubadd213ps(zmmA, zmmB, m); - cc.evex().vfmsubadd231pd(xmmA, xmmB, m); - cc.evex().vfmsubadd231pd(ymmA, ymmB, m); - cc.evex().vfmsubadd231pd(zmmA, zmmB, m); - cc.evex().vfmsubadd231ps(xmmA, xmmB, m); - cc.evex().vfmsubadd231ps(ymmA, ymmB, m); - cc.evex().vfmsubadd231ps(zmmA, zmmB, m); - cc.evex().vfnmadd132pd(xmmA, xmmB, m); - cc.evex().vfnmadd132pd(ymmA, ymmB, m); - cc.evex().vfnmadd132pd(zmmA, zmmB, m); - cc.evex().vfnmadd132ps(xmmA, xmmB, m); - cc.evex().vfnmadd132ps(ymmA, ymmB, m); - cc.evex().vfnmadd132ps(zmmA, zmmB, m); - cc.evex().vfnmadd132sd(xmmA, xmmB, m); - cc.evex().vfnmadd132ss(xmmA, xmmB, m); - cc.evex().vfnmadd213pd(xmmA, xmmB, m); - cc.evex().vfnmadd213pd(ymmA, ymmB, m); - cc.evex().vfnmadd213pd(zmmA, zmmB, m); - cc.evex().vfnmadd213ps(xmmA, xmmB, m); - cc.evex().vfnmadd213ps(ymmA, ymmB, m); - cc.evex().vfnmadd213ps(zmmA, zmmB, m); - cc.evex().vfnmadd213sd(xmmA, xmmB, m); - cc.evex().vfnmadd213ss(xmmA, xmmB, m); - cc.evex().vfnmadd231pd(xmmA, xmmB, m); - cc.evex().vfnmadd231pd(ymmA, ymmB, m); - cc.evex().vfnmadd231pd(zmmA, zmmB, m); - cc.evex().vfnmadd231ps(xmmA, xmmB, m); - cc.evex().vfnmadd231ps(ymmA, ymmB, m); - cc.evex().vfnmadd231ps(zmmA, zmmB, m); - cc.evex().vfnmadd231sd(xmmA, xmmB, m); - cc.evex().vfnmadd231ss(xmmA, xmmB, m); - cc.evex().vfnmsub132pd(xmmA, xmmB, m); - cc.evex().vfnmsub132pd(ymmA, ymmB, m); - cc.evex().vfnmsub132pd(zmmA, zmmB, m); - cc.evex().vfnmsub132ps(xmmA, xmmB, m); - cc.evex().vfnmsub132ps(ymmA, ymmB, m); - cc.evex().vfnmsub132ps(zmmA, zmmB, m); - cc.evex().vfnmsub132sd(xmmA, xmmB, m); - cc.evex().vfnmsub132ss(xmmA, xmmB, m); - cc.evex().vfnmsub213pd(xmmA, xmmB, m); - cc.evex().vfnmsub213pd(ymmA, ymmB, m); - cc.evex().vfnmsub213pd(zmmA, zmmB, m); - cc.evex().vfnmsub213ps(xmmA, xmmB, m); - cc.evex().vfnmsub213ps(ymmA, ymmB, m); - cc.evex().vfnmsub213ps(zmmA, zmmB, m); - cc.evex().vfnmsub213sd(xmmA, xmmB, m); - cc.evex().vfnmsub213ss(xmmA, xmmB, m); - cc.evex().vfnmsub231pd(xmmA, xmmB, m); - cc.evex().vfnmsub231pd(ymmA, ymmB, m); - cc.evex().vfnmsub231pd(zmmA, zmmB, m); - cc.evex().vfnmsub231ps(xmmA, xmmB, m); - cc.evex().vfnmsub231ps(ymmA, ymmB, m); - cc.evex().vfnmsub231ps(zmmA, zmmB, m); - cc.evex().vfnmsub231sd(xmmA, xmmB, m); - cc.evex().vfnmsub231ss(xmmA, xmmB, m); - cc.evex().vfpclasspd(kA, m128, 0); - cc.evex().vfpclasspd(kA, m256, 0); - cc.evex().vfpclasspd(kA, m512, 0); - cc.evex().vfpclassps(kA, m128, 0); - cc.evex().vfpclassps(kA, m256, 0); - cc.evex().vfpclassps(kA, m512, 0); - cc.evex().vfpclasssd(kA, m, 0); - cc.evex().vfpclassss(kA, m, 0); - cc.evex().k(kA).vgatherdpd(xmmA, vx_ptr); - cc.evex().k(kA).vgatherdpd(ymmA, vx_ptr); - cc.evex().k(kA).vgatherdpd(zmmA, vy_ptr); - cc.evex().k(kA).vgatherdps(xmmA, vx_ptr); - cc.evex().k(kA).vgatherdps(ymmA, vy_ptr); - cc.evex().k(kA).vgatherdps(zmmA, vz_ptr); - cc.evex().k(kA).vgatherpf0dpd(vy_ptr); - cc.evex().k(kA).vgatherpf0dps(vz_ptr); - cc.evex().k(kA).vgatherpf0qpd(vz_ptr); - cc.evex().k(kA).vgatherpf0qps(vz_ptr); - cc.evex().k(kA).vgatherpf1dpd(vy_ptr); - cc.evex().k(kA).vgatherpf1dps(vz_ptr); - cc.evex().k(kA).vgatherpf1qpd(vz_ptr); - cc.evex().k(kA).vgatherpf1qps(vz_ptr); - cc.evex().k(kA).vgatherqpd(xmmA, vx_ptr); - cc.evex().k(kA).vgatherqpd(ymmA, vy_ptr); - cc.evex().k(kA).vgatherqpd(zmmA, vz_ptr); - cc.evex().k(kA).vgatherqps(xmmA, vx_ptr); - cc.evex().k(kA).vgatherqps(xmmA, vy_ptr); - cc.evex().k(kA).vgatherqps(ymmA, vz_ptr); - cc.evex().vgetexppd(xmmA, m); - cc.evex().vgetexppd(ymmA, m); - cc.evex().vgetexppd(zmmA, m); - cc.evex().vgetexpps(xmmA, m); - cc.evex().vgetexpps(ymmA, m); - cc.evex().vgetexpps(zmmA, m); - cc.evex().vgetexpsd(xmmA, xmmB, m); - cc.evex().vgetexpss(xmmA, xmmB, m); - cc.evex().vgetmantpd(xmmA, m, 0); - cc.evex().vgetmantpd(ymmA, m, 0); - cc.evex().vgetmantpd(zmmA, m, 0); - cc.evex().vgetmantps(xmmA, m, 0); - cc.evex().vgetmantps(ymmA, m, 0); - cc.evex().vgetmantps(zmmA, m, 0); - cc.evex().vgetmantsd(xmmA, xmmB, m, 0); - cc.evex().vgetmantss(xmmA, xmmB, m, 0); - cc.evex().vinsertf32x4(ymmA, ymmB, m, 0); - cc.evex().vinsertf32x4(zmmA, zmmB, m, 0); - cc.evex().vinsertf32x8(zmmA, zmmB, m, 0); - cc.evex().vinsertf64x2(ymmA, ymmB, m, 0); - cc.evex().vinsertf64x2(zmmA, zmmB, m, 0); - cc.evex().vinsertf64x4(zmmA, zmmB, m, 0); - cc.evex().vinserti32x4(ymmA, ymmB, m, 0); - cc.evex().vinserti32x4(zmmA, zmmB, m, 0); - cc.evex().vinserti32x8(zmmA, zmmB, m, 0); - cc.evex().vinserti64x2(ymmA, ymmB, m, 0); - cc.evex().vinserti64x2(zmmA, zmmB, m, 0); - cc.evex().vinserti64x4(zmmA, zmmB, m, 0); - cc.evex().vinsertps(xmmA, xmmB, m, 0); - cc.evex().vmaxpd(xmmA, xmmB, m); - cc.evex().vmaxpd(ymmA, ymmB, m); - cc.evex().vmaxpd(zmmA, zmmB, m); - cc.evex().vmaxps(xmmA, xmmB, m); - cc.evex().vmaxps(ymmA, ymmB, m); - cc.evex().vmaxps(zmmA, zmmB, m); - cc.evex().vmaxsd(xmmA, xmmB, m); - cc.evex().vmaxss(xmmA, xmmB, m); - cc.evex().vminpd(xmmA, xmmB, m); - cc.evex().vminpd(ymmA, ymmB, m); - cc.evex().vminpd(zmmA, zmmB, m); - cc.evex().vminps(xmmA, xmmB, m); - cc.evex().vminps(ymmA, ymmB, m); - cc.evex().vminps(zmmA, zmmB, m); - cc.evex().vminsd(xmmA, xmmB, m); - cc.evex().vminss(xmmA, xmmB, m); - cc.evex().vmovapd(xmmA, m); - cc.evex().vmovapd(m, xmmB); - cc.evex().vmovapd(ymmA, m); - cc.evex().vmovapd(m, ymmB); - cc.evex().vmovapd(zmmA, m); - cc.evex().vmovapd(m, zmmB); - cc.evex().vmovaps(xmmA, m); - cc.evex().vmovaps(m, xmmB); - cc.evex().vmovaps(ymmA, m); - cc.evex().vmovaps(m, ymmB); - cc.evex().vmovaps(zmmA, m); - cc.evex().vmovaps(m, zmmB); - cc.evex().vmovd(m, xmmB); - cc.evex().vmovd(xmmA, m); - cc.evex().vmovddup(xmmA, m); - cc.evex().vmovddup(ymmA, m); - cc.evex().vmovddup(zmmA, m); - cc.evex().vmovdqa32(xmmA, m); - cc.evex().vmovdqa32(m, xmmB); - cc.evex().vmovdqa32(ymmA, m); - cc.evex().vmovdqa32(m, ymmB); - cc.evex().vmovdqa32(zmmA, m); - cc.evex().vmovdqa32(m, zmmB); - cc.evex().vmovdqa64(xmmA, m); - cc.evex().vmovdqa64(m, xmmB); - cc.evex().vmovdqa64(ymmA, m); - cc.evex().vmovdqa64(m, ymmB); - cc.evex().vmovdqa64(zmmA, m); - cc.evex().vmovdqa64(m, zmmB); - cc.evex().vmovdqu16(xmmA, m); - cc.evex().vmovdqu16(m, xmmB); - cc.evex().vmovdqu16(ymmA, m); - cc.evex().vmovdqu16(m, ymmB); - cc.evex().vmovdqu16(zmmA, m); - cc.evex().vmovdqu16(m, zmmB); - cc.evex().vmovdqu32(xmmA, m); - cc.evex().vmovdqu32(m, xmmB); - cc.evex().vmovdqu32(ymmA, m); - cc.evex().vmovdqu32(m, ymmB); - cc.evex().vmovdqu32(zmmA, m); - cc.evex().vmovdqu32(m, zmmB); - cc.evex().vmovdqu64(xmmA, m); - cc.evex().vmovdqu64(m, xmmB); - cc.evex().vmovdqu64(ymmA, m); - cc.evex().vmovdqu64(m, ymmB); - cc.evex().vmovdqu64(zmmA, m); - cc.evex().vmovdqu64(m, zmmB); - cc.evex().vmovdqu8(xmmA, m); - cc.evex().vmovdqu8(m, xmmB); - cc.evex().vmovdqu8(ymmA, m); - cc.evex().vmovdqu8(m, ymmB); - cc.evex().vmovdqu8(zmmA, m); - cc.evex().vmovdqu8(m, zmmB); - cc.evex().vmovhpd(m, xmmB); - cc.evex().vmovhpd(xmmA, xmmB, m); - cc.evex().vmovhps(m, xmmB); - cc.evex().vmovhps(xmmA, xmmB, m); - cc.evex().vmovlpd(m, xmmB); - cc.evex().vmovlpd(xmmA, xmmB, m); - cc.evex().vmovlps(m, xmmB); - cc.evex().vmovlps(xmmA, xmmB, m); - cc.evex().vmovntdq(m, xmmB); - cc.evex().vmovntdq(m, ymmB); - cc.evex().vmovntdq(m, zmmB); - cc.evex().vmovntdqa(xmmA, m); - cc.evex().vmovntdqa(ymmA, m); - cc.evex().vmovntdqa(zmmA, m); - cc.evex().vmovntpd(m, xmmB); - cc.evex().vmovntpd(m, ymmB); - cc.evex().vmovntpd(m, zmmB); - cc.evex().vmovntps(m, xmmB); - cc.evex().vmovntps(m, ymmB); - cc.evex().vmovntps(m, zmmB); - cc.evex().vmovq(m, xmmB); - cc.evex().vmovq(xmmA, m); - cc.evex().vmovq(xmmA, m); - cc.evex().vmovq(m, xmmB); - cc.evex().vmovsd(m, xmmB); - cc.evex().vmovsd(xmmA, m); - cc.evex().vmovshdup(xmmA, m); - cc.evex().vmovshdup(ymmA, m); - cc.evex().vmovshdup(zmmA, m); - cc.evex().vmovsldup(xmmA, m); - cc.evex().vmovsldup(ymmA, m); - cc.evex().vmovsldup(zmmA, m); - cc.evex().vmovss(m, xmmB); - cc.evex().vmovss(xmmA, m); - cc.evex().vmovupd(xmmA, m); - cc.evex().vmovupd(m, xmmB); - cc.evex().vmovupd(ymmA, m); - cc.evex().vmovupd(m, ymmB); - cc.evex().vmovupd(zmmA, m); - cc.evex().vmovupd(m, zmmB); - cc.evex().vmovups(xmmA, m); - cc.evex().vmovups(m, xmmB); - cc.evex().vmovups(ymmA, m); - cc.evex().vmovups(m, ymmB); - cc.evex().vmovups(zmmA, m); - cc.evex().vmovups(m, zmmB); - cc.evex().vmulpd(xmmA, xmmB, m); - cc.evex().vmulpd(ymmA, ymmB, m); - cc.evex().vmulpd(zmmA, zmmB, m); - cc.evex().vmulps(xmmA, xmmB, m); - cc.evex().vmulps(ymmA, ymmB, m); - cc.evex().vmulps(zmmA, zmmB, m); - cc.evex().vmulsd(xmmA, xmmB, m); - cc.evex().vmulss(xmmA, xmmB, m); - cc.evex().vorpd(xmmA, xmmB, m); - cc.evex().vorpd(ymmA, ymmB, m); - cc.evex().vorpd(zmmA, zmmB, m); - cc.evex().vorps(xmmA, xmmB, m); - cc.evex().vorps(ymmA, ymmB, m); - cc.evex().vorps(zmmA, zmmB, m); - cc.evex().vpabsb(xmmA, m); - cc.evex().vpabsb(ymmA, m); - cc.evex().vpabsb(zmmA, m); - cc.evex().vpabsd(xmmA, m); - cc.evex().vpabsd(ymmA, m); - cc.evex().vpabsd(zmmA, m); - cc.evex().vpabsq(xmmA, m); - cc.evex().vpabsq(ymmA, m); - cc.evex().vpabsq(zmmA, m); - cc.evex().vpabsw(xmmA, m); - cc.evex().vpabsw(ymmA, m); - cc.evex().vpabsw(zmmA, m); - cc.evex().vpackssdw(xmmA, xmmB, m); - cc.evex().vpackssdw(ymmA, ymmB, m); - cc.evex().vpackssdw(zmmA, zmmB, m); - cc.evex().vpacksswb(xmmA, xmmB, m); - cc.evex().vpacksswb(ymmA, ymmB, m); - cc.evex().vpacksswb(zmmA, zmmB, m); - cc.evex().vpackusdw(xmmA, xmmB, m); - cc.evex().vpackusdw(ymmA, ymmB, m); - cc.evex().vpackusdw(zmmA, zmmB, m); - cc.evex().vpackuswb(xmmA, xmmB, m); - cc.evex().vpackuswb(ymmA, ymmB, m); - cc.evex().vpackuswb(zmmA, zmmB, m); - cc.evex().vpaddb(xmmA, xmmB, m); - cc.evex().vpaddb(ymmA, ymmB, m); - cc.evex().vpaddb(zmmA, zmmB, m); - cc.evex().vpaddd(xmmA, xmmB, m); - cc.evex().vpaddd(ymmA, ymmB, m); - cc.evex().vpaddd(zmmA, zmmB, m); - cc.evex().vpaddq(xmmA, xmmB, m); - cc.evex().vpaddq(ymmA, ymmB, m); - cc.evex().vpaddq(zmmA, zmmB, m); - cc.evex().vpaddsb(xmmA, xmmB, m); - cc.evex().vpaddsb(ymmA, ymmB, m); - cc.evex().vpaddsb(zmmA, zmmB, m); - cc.evex().vpaddsw(xmmA, xmmB, m); - cc.evex().vpaddsw(ymmA, ymmB, m); - cc.evex().vpaddsw(zmmA, zmmB, m); - cc.evex().vpaddusb(xmmA, xmmB, m); - cc.evex().vpaddusb(ymmA, ymmB, m); - cc.evex().vpaddusb(zmmA, zmmB, m); - cc.evex().vpaddusw(xmmA, xmmB, m); - cc.evex().vpaddusw(ymmA, ymmB, m); - cc.evex().vpaddusw(zmmA, zmmB, m); - cc.evex().vpaddw(xmmA, xmmB, m); - cc.evex().vpaddw(ymmA, ymmB, m); - cc.evex().vpaddw(zmmA, zmmB, m); - cc.evex().vpalignr(xmmA, xmmB, m, 0); - cc.evex().vpalignr(ymmA, ymmB, m, 0); - cc.evex().vpalignr(zmmA, zmmB, m, 0); - cc.evex().vpandd(xmmA, xmmB, m); - cc.evex().vpandd(ymmA, ymmB, m); - cc.evex().vpandd(zmmA, zmmB, m); - cc.evex().vpandnd(xmmA, xmmB, m); - cc.evex().vpandnd(ymmA, ymmB, m); - cc.evex().vpandnd(zmmA, zmmB, m); - cc.evex().vpandnq(xmmA, xmmB, m); - cc.evex().vpandnq(ymmA, ymmB, m); - cc.evex().vpandnq(zmmA, zmmB, m); - cc.evex().vpandq(xmmA, xmmB, m); - cc.evex().vpandq(ymmA, ymmB, m); - cc.evex().vpandq(zmmA, zmmB, m); - cc.evex().vpavgb(xmmA, xmmB, m); - cc.evex().vpavgb(ymmA, ymmB, m); - cc.evex().vpavgb(zmmA, zmmB, m); - cc.evex().vpavgw(xmmA, xmmB, m); - cc.evex().vpavgw(ymmA, ymmB, m); - cc.evex().vpavgw(zmmA, zmmB, m); - cc.evex().vpblendmb(xmmA, xmmB, m); - cc.evex().vpblendmb(ymmA, ymmB, m); - cc.evex().vpblendmb(zmmA, zmmB, m); - cc.evex().vpblendmd(xmmA, xmmB, m); - cc.evex().vpblendmd(ymmA, ymmB, m); - cc.evex().vpblendmd(zmmA, zmmB, m); - cc.evex().vpblendmq(xmmA, xmmB, m); - cc.evex().vpblendmq(ymmA, ymmB, m); - cc.evex().vpblendmq(zmmA, zmmB, m); - cc.evex().vpblendmw(xmmA, xmmB, m); - cc.evex().vpblendmw(ymmA, ymmB, m); - cc.evex().vpblendmw(zmmA, zmmB, m); - cc.evex().vpbroadcastb(xmmA, m); - cc.evex().vpbroadcastb(ymmA, m); - cc.evex().vpbroadcastb(zmmA, m); - cc.evex().vpbroadcastd(xmmA, m); - cc.evex().vpbroadcastd(ymmA, m); - cc.evex().vpbroadcastd(zmmA, m); - cc.evex().vpbroadcastq(xmmA, m); - cc.evex().vpbroadcastq(ymmA, m); - cc.evex().vpbroadcastq(zmmA, m); - cc.evex().vpbroadcastw(xmmA, m); - cc.evex().vpbroadcastw(ymmA, m); - cc.evex().vpbroadcastw(zmmA, m); - cc.evex().vpcmpb(kA, xmmB, m, 0); - cc.evex().vpcmpb(kA, ymmB, m, 0); - cc.evex().vpcmpb(kA, zmmB, m, 0); - cc.evex().vpcmpd(kA, xmmB, m, 0); - cc.evex().vpcmpd(kA, ymmB, m, 0); - cc.evex().vpcmpd(kA, zmmB, m, 0); - cc.evex().vpcmpeqb(kA, xmmB, m); - cc.evex().vpcmpeqb(kA, ymmB, m); - cc.evex().vpcmpeqb(kA, zmmB, m); - cc.evex().vpcmpeqd(kA, xmmB, m); - cc.evex().vpcmpeqd(kA, ymmB, m); - cc.evex().vpcmpeqd(kA, zmmB, m); - cc.evex().vpcmpeqq(kA, xmmB, m); - cc.evex().vpcmpeqq(kA, ymmB, m); - cc.evex().vpcmpeqq(kA, zmmB, m); - cc.evex().vpcmpeqw(kA, xmmB, m); - cc.evex().vpcmpeqw(kA, ymmB, m); - cc.evex().vpcmpeqw(kA, zmmB, m); - cc.evex().vpcmpgtb(kA, xmmB, m); - cc.evex().vpcmpgtb(kA, ymmB, m); - cc.evex().vpcmpgtb(kA, zmmB, m); - cc.evex().vpcmpgtd(kA, xmmB, m); - cc.evex().vpcmpgtd(kA, ymmB, m); - cc.evex().vpcmpgtd(kA, zmmB, m); - cc.evex().vpcmpgtq(kA, xmmB, m); - cc.evex().vpcmpgtq(kA, ymmB, m); - cc.evex().vpcmpgtq(kA, zmmB, m); - cc.evex().vpcmpgtw(kA, xmmB, m); - cc.evex().vpcmpgtw(kA, ymmB, m); - cc.evex().vpcmpgtw(kA, zmmB, m); - cc.evex().vpcmpq(kA, xmmB, m, 0); - cc.evex().vpcmpq(kA, ymmB, m, 0); - cc.evex().vpcmpq(kA, zmmB, m, 0); - cc.evex().vpcmpub(kA, xmmB, m, 0); - cc.evex().vpcmpub(kA, ymmB, m, 0); - cc.evex().vpcmpub(kA, zmmB, m, 0); - cc.evex().vpcmpud(kA, xmmB, m, 0); - cc.evex().vpcmpud(kA, ymmB, m, 0); - cc.evex().vpcmpud(kA, zmmB, m, 0); - cc.evex().vpcmpuq(kA, xmmB, m, 0); - cc.evex().vpcmpuq(kA, ymmB, m, 0); - cc.evex().vpcmpuq(kA, zmmB, m, 0); - cc.evex().vpcmpuw(kA, xmmB, m, 0); - cc.evex().vpcmpuw(kA, ymmB, m, 0); - cc.evex().vpcmpuw(kA, zmmB, m, 0); - cc.evex().vpcmpw(kA, xmmB, m, 0); - cc.evex().vpcmpw(kA, ymmB, m, 0); - cc.evex().vpcmpw(kA, zmmB, m, 0); - cc.evex().vpcompressd(m, xmmB); - cc.evex().vpcompressd(m, ymmB); - cc.evex().vpcompressd(m, zmmB); - cc.evex().vpcompressq(m, xmmB); - cc.evex().vpcompressq(m, ymmB); - cc.evex().vpcompressq(m, zmmB); - cc.evex().vpconflictd(xmmA, m); - cc.evex().vpconflictd(ymmA, m); - cc.evex().vpconflictd(zmmA, m); - cc.evex().vpconflictq(xmmA, m); - cc.evex().vpconflictq(ymmA, m); - cc.evex().vpconflictq(zmmA, m); - cc.evex().vpermb(xmmA, xmmB, m); - cc.evex().vpermb(ymmA, ymmB, m); - cc.evex().vpermb(zmmA, zmmB, m); - cc.evex().vpermd(ymmA, ymmB, m); - cc.evex().vpermd(zmmA, zmmB, m); - cc.evex().vpermi2b(xmmA, xmmB, m); - cc.evex().vpermi2b(ymmA, ymmB, m); - cc.evex().vpermi2b(zmmA, zmmB, m); - cc.evex().vpermi2d(xmmA, xmmB, m); - cc.evex().vpermi2d(ymmA, ymmB, m); - cc.evex().vpermi2d(zmmA, zmmB, m); - cc.evex().vpermi2pd(xmmA, xmmB, m); - cc.evex().vpermi2pd(ymmA, ymmB, m); - cc.evex().vpermi2pd(zmmA, zmmB, m); - cc.evex().vpermi2ps(xmmA, xmmB, m); - cc.evex().vpermi2ps(ymmA, ymmB, m); - cc.evex().vpermi2ps(zmmA, zmmB, m); - cc.evex().vpermi2q(xmmA, xmmB, m); - cc.evex().vpermi2q(ymmA, ymmB, m); - cc.evex().vpermi2q(zmmA, zmmB, m); - cc.evex().vpermi2w(xmmA, xmmB, m); - cc.evex().vpermi2w(ymmA, ymmB, m); - cc.evex().vpermi2w(zmmA, zmmB, m); - cc.evex().vpermilpd(xmmA, xmmB, m); - cc.evex().vpermilpd(ymmA, ymmB, m); - cc.evex().vpermilpd(zmmA, zmmB, m); - cc.evex().vpermilpd(xmmA, m, 0); - cc.evex().vpermilpd(ymmA, m, 0); - cc.evex().vpermilpd(zmmA, m, 0); - cc.evex().vpermilps(xmmA, xmmB, m); - cc.evex().vpermilps(ymmA, ymmB, m); - cc.evex().vpermilps(zmmA, zmmB, m); - cc.evex().vpermilps(xmmA, m, 0); - cc.evex().vpermilps(ymmA, m, 0); - cc.evex().vpermilps(zmmA, m, 0); - cc.evex().vpermq(ymmA, ymmB, m); - cc.evex().vpermq(zmmA, zmmB, m); - cc.evex().vpermq(ymmA, m, 0); - cc.evex().vpermq(zmmA, m, 0); - cc.evex().vpermt2b(xmmA, xmmB, m); - cc.evex().vpermt2b(ymmA, ymmB, m); - cc.evex().vpermt2b(zmmA, zmmB, m); - cc.evex().vpermt2d(xmmA, xmmB, m); - cc.evex().vpermt2d(ymmA, ymmB, m); - cc.evex().vpermt2d(zmmA, zmmB, m); - cc.evex().vpermt2pd(xmmA, xmmB, m); - cc.evex().vpermt2pd(ymmA, ymmB, m); - cc.evex().vpermt2pd(zmmA, zmmB, m); - cc.evex().vpermt2ps(xmmA, xmmB, m); - cc.evex().vpermt2ps(ymmA, ymmB, m); - cc.evex().vpermt2ps(zmmA, zmmB, m); - cc.evex().vpermt2q(xmmA, xmmB, m); - cc.evex().vpermt2q(ymmA, ymmB, m); - cc.evex().vpermt2q(zmmA, zmmB, m); - cc.evex().vpermt2w(xmmA, xmmB, m); - cc.evex().vpermt2w(ymmA, ymmB, m); - cc.evex().vpermt2w(zmmA, zmmB, m); - cc.evex().vpermw(xmmA, xmmB, m); - cc.evex().vpermw(ymmA, ymmB, m); - cc.evex().vpermw(zmmA, zmmB, m); - cc.evex().vpexpandd(xmmA, m); - cc.evex().vpexpandd(ymmA, m); - cc.evex().vpexpandd(zmmA, m); - cc.evex().vpexpandq(xmmA, m); - cc.evex().vpexpandq(ymmA, m); - cc.evex().vpexpandq(zmmA, m); - cc.evex().vpextrb(m, xmmB, 0); - cc.evex().vpextrd(m, xmmB, 0); - if (cc.is64Bit()) cc.evex().vpextrq(m, xmmB, 0); - cc.evex().vpextrw(m, xmmB, 0); - cc.evex().k(kA).vpgatherdd(xmmA, vx_ptr); - cc.evex().k(kA).vpgatherdd(ymmA, vy_ptr); - cc.evex().k(kA).vpgatherdd(zmmA, vz_ptr); - cc.evex().k(kA).vpgatherdq(xmmA, vx_ptr); - cc.evex().k(kA).vpgatherdq(ymmA, vx_ptr); - cc.evex().k(kA).vpgatherdq(zmmA, vy_ptr); - cc.evex().k(kA).vpgatherqd(xmmA, vx_ptr); - cc.evex().k(kA).vpgatherqd(xmmA, vy_ptr); - cc.evex().k(kA).vpgatherqd(ymmA, vz_ptr); - cc.evex().k(kA).vpgatherqq(xmmA, vx_ptr); - cc.evex().k(kA).vpgatherqq(ymmA, vy_ptr); - cc.evex().k(kA).vpgatherqq(zmmA, vz_ptr); - cc.evex().vpinsrb(xmmA, xmmB, m, 0); - cc.evex().vpinsrd(xmmA, xmmB, m, 0); - if (cc.is64Bit()) cc.evex().vpinsrq(xmmA, xmmB, m, 0); - cc.evex().vpinsrw(xmmA, xmmB, m, 0); - cc.evex().vplzcntd(xmmA, m); - cc.evex().vplzcntd(ymmA, m); - cc.evex().vplzcntd(zmmA, m); - cc.evex().vplzcntq(xmmA, m); - cc.evex().vplzcntq(ymmA, m); - cc.evex().vplzcntq(zmmA, m); - cc.evex().vpmadd52huq(xmmA, xmmB, m); - cc.evex().vpmadd52huq(ymmA, ymmB, m); - cc.evex().vpmadd52huq(zmmA, zmmB, m); - cc.evex().vpmadd52luq(xmmA, xmmB, m); - cc.evex().vpmadd52luq(ymmA, ymmB, m); - cc.evex().vpmadd52luq(zmmA, zmmB, m); - cc.evex().vpmaddubsw(xmmA, xmmB, m); - cc.evex().vpmaddubsw(ymmA, ymmB, m); - cc.evex().vpmaddubsw(zmmA, zmmB, m); - cc.evex().vpmaddwd(xmmA, xmmB, m); - cc.evex().vpmaddwd(ymmA, ymmB, m); - cc.evex().vpmaddwd(zmmA, zmmB, m); - cc.evex().vpmaxsb(xmmA, xmmB, m); - cc.evex().vpmaxsb(ymmA, ymmB, m); - cc.evex().vpmaxsb(zmmA, zmmB, m); - cc.evex().vpmaxsd(xmmA, xmmB, m); - cc.evex().vpmaxsd(ymmA, ymmB, m); - cc.evex().vpmaxsd(zmmA, zmmB, m); - cc.evex().vpmaxsq(xmmA, xmmB, m); - cc.evex().vpmaxsq(ymmA, ymmB, m); - cc.evex().vpmaxsq(zmmA, zmmB, m); - cc.evex().vpmaxsw(xmmA, xmmB, m); - cc.evex().vpmaxsw(ymmA, ymmB, m); - cc.evex().vpmaxsw(zmmA, zmmB, m); - cc.evex().vpmaxub(xmmA, xmmB, m); - cc.evex().vpmaxub(ymmA, ymmB, m); - cc.evex().vpmaxub(zmmA, zmmB, m); - cc.evex().vpmaxud(xmmA, xmmB, m); - cc.evex().vpmaxud(ymmA, ymmB, m); - cc.evex().vpmaxud(zmmA, zmmB, m); - cc.evex().vpmaxuq(xmmA, xmmB, m); - cc.evex().vpmaxuq(ymmA, ymmB, m); - cc.evex().vpmaxuq(zmmA, zmmB, m); - cc.evex().vpmaxuw(xmmA, xmmB, m); - cc.evex().vpmaxuw(ymmA, ymmB, m); - cc.evex().vpmaxuw(zmmA, zmmB, m); - cc.evex().vpminsb(xmmA, xmmB, m); - cc.evex().vpminsb(ymmA, ymmB, m); - cc.evex().vpminsb(zmmA, zmmB, m); - cc.evex().vpminsd(xmmA, xmmB, m); - cc.evex().vpminsd(ymmA, ymmB, m); - cc.evex().vpminsd(zmmA, zmmB, m); - cc.evex().vpminsq(xmmA, xmmB, m); - cc.evex().vpminsq(ymmA, ymmB, m); - cc.evex().vpminsq(zmmA, zmmB, m); - cc.evex().vpminsw(xmmA, xmmB, m); - cc.evex().vpminsw(ymmA, ymmB, m); - cc.evex().vpminsw(zmmA, zmmB, m); - cc.evex().vpminub(xmmA, xmmB, m); - cc.evex().vpminub(ymmA, ymmB, m); - cc.evex().vpminub(zmmA, zmmB, m); - cc.evex().vpminud(xmmA, xmmB, m); - cc.evex().vpminud(ymmA, ymmB, m); - cc.evex().vpminud(zmmA, zmmB, m); - cc.evex().vpminuq(xmmA, xmmB, m); - cc.evex().vpminuq(ymmA, ymmB, m); - cc.evex().vpminuq(zmmA, zmmB, m); - cc.evex().vpminuw(xmmA, xmmB, m); - cc.evex().vpminuw(ymmA, ymmB, m); - cc.evex().vpminuw(zmmA, zmmB, m); - cc.evex().vpmovdb(m, xmmB); - cc.evex().vpmovdb(m, ymmB); - cc.evex().vpmovdb(m, zmmB); - cc.evex().vpmovdw(m, xmmB); - cc.evex().vpmovdw(m, ymmB); - cc.evex().vpmovdw(m, zmmB); - cc.evex().vpmovqb(m, xmmB); - cc.evex().vpmovqb(m, ymmB); - cc.evex().vpmovqb(m, zmmB); - cc.evex().vpmovqd(m, xmmB); - cc.evex().vpmovqd(m, ymmB); - cc.evex().vpmovqd(m, zmmB); - cc.evex().vpmovqw(m, xmmB); - cc.evex().vpmovqw(m, ymmB); - cc.evex().vpmovqw(m, zmmB); - cc.evex().vpmovsdb(m, xmmB); - cc.evex().vpmovsdb(m, ymmB); - cc.evex().vpmovsdb(m, zmmB); - cc.evex().vpmovsdw(m, xmmB); - cc.evex().vpmovsdw(m, ymmB); - cc.evex().vpmovsdw(m, zmmB); - cc.evex().vpmovsqb(m, xmmB); - cc.evex().vpmovsqb(m, ymmB); - cc.evex().vpmovsqb(m, zmmB); - cc.evex().vpmovsqd(m, xmmB); - cc.evex().vpmovsqd(m, ymmB); - cc.evex().vpmovsqd(m, zmmB); - cc.evex().vpmovsqw(m, xmmB); - cc.evex().vpmovsqw(m, ymmB); - cc.evex().vpmovsqw(m, zmmB); - cc.evex().vpmovswb(m, xmmB); - cc.evex().vpmovswb(m, ymmB); - cc.evex().vpmovswb(m, zmmB); - cc.evex().vpmovsxbd(xmmA, m); - cc.evex().vpmovsxbd(ymmA, m); - cc.evex().vpmovsxbd(zmmA, m); - cc.evex().vpmovsxbq(xmmA, m); - cc.evex().vpmovsxbq(ymmA, m); - cc.evex().vpmovsxbq(zmmA, m); - cc.evex().vpmovsxbw(xmmA, m); - cc.evex().vpmovsxbw(ymmA, m); - cc.evex().vpmovsxbw(zmmA, m); - cc.evex().vpmovsxdq(xmmA, m); - cc.evex().vpmovsxdq(ymmA, m); - cc.evex().vpmovsxdq(zmmA, m); - cc.evex().vpmovsxwd(xmmA, m); - cc.evex().vpmovsxwd(ymmA, m); - cc.evex().vpmovsxwd(zmmA, m); - cc.evex().vpmovsxwq(xmmA, m); - cc.evex().vpmovsxwq(ymmA, m); - cc.evex().vpmovsxwq(zmmA, m); - cc.evex().vpmovusdb(m, xmmB); - cc.evex().vpmovusdb(m, ymmB); - cc.evex().vpmovusdb(m, zmmB); - cc.evex().vpmovusdw(m, xmmB); - cc.evex().vpmovusdw(m, ymmB); - cc.evex().vpmovusdw(m, zmmB); - cc.evex().vpmovusqb(m, xmmB); - cc.evex().vpmovusqb(m, ymmB); - cc.evex().vpmovusqb(m, zmmB); - cc.evex().vpmovusqd(m, xmmB); - cc.evex().vpmovusqd(m, ymmB); - cc.evex().vpmovusqd(m, zmmB); - cc.evex().vpmovusqw(m, xmmB); - cc.evex().vpmovusqw(m, ymmB); - cc.evex().vpmovusqw(m, zmmB); - cc.evex().vpmovuswb(m, xmmB); - cc.evex().vpmovuswb(m, ymmB); - cc.evex().vpmovuswb(m, zmmB); - cc.evex().vpmovwb(m, xmmB); - cc.evex().vpmovwb(m, ymmB); - cc.evex().vpmovwb(m, zmmB); - cc.evex().vpmovzxbd(xmmA, m); - cc.evex().vpmovzxbd(ymmA, m); - cc.evex().vpmovzxbd(zmmA, m); - cc.evex().vpmovzxbq(xmmA, m); - cc.evex().vpmovzxbq(ymmA, m); - cc.evex().vpmovzxbq(zmmA, m); - cc.evex().vpmovzxbw(xmmA, m); - cc.evex().vpmovzxbw(ymmA, m); - cc.evex().vpmovzxbw(zmmA, m); - cc.evex().vpmovzxdq(xmmA, m); - cc.evex().vpmovzxdq(ymmA, m); - cc.evex().vpmovzxdq(zmmA, m); - cc.evex().vpmovzxwd(xmmA, m); - cc.evex().vpmovzxwd(ymmA, m); - cc.evex().vpmovzxwd(zmmA, m); - cc.evex().vpmovzxwq(xmmA, m); - cc.evex().vpmovzxwq(ymmA, m); - cc.evex().vpmovzxwq(zmmA, m); - cc.evex().vpmuldq(xmmA, xmmB, m); - cc.evex().vpmuldq(ymmA, ymmB, m); - cc.evex().vpmuldq(zmmA, zmmB, m); - cc.evex().vpmulhrsw(xmmA, xmmB, m); - cc.evex().vpmulhrsw(ymmA, ymmB, m); - cc.evex().vpmulhrsw(zmmA, zmmB, m); - cc.evex().vpmulhuw(xmmA, xmmB, m); - cc.evex().vpmulhuw(ymmA, ymmB, m); - cc.evex().vpmulhuw(zmmA, zmmB, m); - cc.evex().vpmulhw(xmmA, xmmB, m); - cc.evex().vpmulhw(ymmA, ymmB, m); - cc.evex().vpmulhw(zmmA, zmmB, m); - cc.evex().vpmulld(xmmA, xmmB, m); - cc.evex().vpmulld(ymmA, ymmB, m); - cc.evex().vpmulld(zmmA, zmmB, m); - cc.evex().vpmullq(xmmA, xmmB, m); - cc.evex().vpmullq(ymmA, ymmB, m); - cc.evex().vpmullq(zmmA, zmmB, m); - cc.evex().vpmullw(xmmA, xmmB, m); - cc.evex().vpmullw(ymmA, ymmB, m); - cc.evex().vpmullw(zmmA, zmmB, m); - cc.evex().vpmultishiftqb(xmmA, xmmB, m); - cc.evex().vpmultishiftqb(ymmA, ymmB, m); - cc.evex().vpmultishiftqb(zmmA, zmmB, m); - cc.evex().vpmuludq(xmmA, xmmB, m); - cc.evex().vpmuludq(ymmA, ymmB, m); - cc.evex().vpmuludq(zmmA, zmmB, m); - cc.evex().vpopcntd(zmmA, m); - cc.evex().vpopcntq(zmmA, m); - cc.evex().vpord(xmmA, xmmB, m); - cc.evex().vpord(ymmA, ymmB, m); - cc.evex().vpord(zmmA, zmmB, m); - cc.evex().vporq(xmmA, xmmB, m); - cc.evex().vporq(ymmA, ymmB, m); - cc.evex().vporq(zmmA, zmmB, m); - cc.evex().vprold(xmmA, m, 0); - cc.evex().vprold(ymmA, m, 0); - cc.evex().vprold(zmmA, m, 0); - cc.evex().vprolq(xmmA, m, 0); - cc.evex().vprolq(ymmA, m, 0); - cc.evex().vprolq(zmmA, m, 0); - cc.evex().vprolvd(xmmA, xmmB, m); - cc.evex().vprolvd(ymmA, ymmB, m); - cc.evex().vprolvd(zmmA, zmmB, m); - cc.evex().vprolvq(xmmA, xmmB, m); - cc.evex().vprolvq(ymmA, ymmB, m); - cc.evex().vprolvq(zmmA, zmmB, m); - cc.evex().vprord(xmmA, m, 0); - cc.evex().vprord(ymmA, m, 0); - cc.evex().vprord(zmmA, m, 0); - cc.evex().vprorq(xmmA, m, 0); - cc.evex().vprorq(ymmA, m, 0); - cc.evex().vprorq(zmmA, m, 0); - cc.evex().vprorvd(xmmA, xmmB, m); - cc.evex().vprorvd(ymmA, ymmB, m); - cc.evex().vprorvd(zmmA, zmmB, m); - cc.evex().vprorvq(xmmA, xmmB, m); - cc.evex().vprorvq(ymmA, ymmB, m); - cc.evex().vprorvq(zmmA, zmmB, m); - cc.evex().vpsadbw(xmmA, xmmB, m); - cc.evex().vpsadbw(ymmA, ymmB, m); - cc.evex().vpsadbw(zmmA, zmmB, m); - cc.evex().k(kA).vpscatterdd(vx_ptr, xmmB); - cc.evex().k(kA).vpscatterdd(vy_ptr, ymmB); - cc.evex().k(kA).vpscatterdd(vz_ptr, zmmB); - cc.evex().k(kA).vpscatterdq(vx_ptr, xmmB); - cc.evex().k(kA).vpscatterdq(vx_ptr, ymmB); - cc.evex().k(kA).vpscatterdq(vy_ptr, zmmB); - cc.evex().k(kA).vpscatterqd(vx_ptr, xmmB); - cc.evex().k(kA).vpscatterqd(vy_ptr, xmmB); - cc.evex().k(kA).vpscatterqd(vz_ptr, ymmB); - cc.evex().k(kA).vpscatterqq(vx_ptr, xmmB); - cc.evex().k(kA).vpscatterqq(vy_ptr, ymmB); - cc.evex().k(kA).vpscatterqq(vz_ptr, zmmB); - cc.evex().vpshufb(xmmA, xmmB, m); - cc.evex().vpshufb(ymmA, ymmB, m); - cc.evex().vpshufb(zmmA, zmmB, m); - cc.evex().vpshufd(xmmA, m, 0); - cc.evex().vpshufd(ymmA, m, 0); - cc.evex().vpshufd(zmmA, m, 0); - cc.evex().vpshufhw(xmmA, m, 0); - cc.evex().vpshufhw(ymmA, m, 0); - cc.evex().vpshufhw(zmmA, m, 0); - cc.evex().vpshuflw(xmmA, m, 0); - cc.evex().vpshuflw(ymmA, m, 0); - cc.evex().vpshuflw(zmmA, m, 0); - cc.evex().vpslld(xmmA, xmmB, m); - cc.evex().vpslld(xmmA, m, 0); - cc.evex().vpslld(ymmA, ymmB, m); - cc.evex().vpslld(ymmA, m, 0); - cc.evex().vpslld(zmmA, zmmB, m); - cc.evex().vpslld(zmmA, m, 0); - cc.evex().vpslldq(xmmA, m, 0); - cc.evex().vpslldq(ymmA, m, 0); - cc.evex().vpslldq(zmmA, m, 0); - cc.evex().vpsllq(xmmA, xmmB, m); - cc.evex().vpsllq(xmmA, m, 0); - cc.evex().vpsllq(ymmA, ymmB, m); - cc.evex().vpsllq(ymmA, m, 0); - cc.evex().vpsllq(zmmA, zmmB, m); - cc.evex().vpsllq(zmmA, m, 0); - cc.evex().vpsllvd(xmmA, xmmB, m); - cc.evex().vpsllvd(ymmA, ymmB, m); - cc.evex().vpsllvd(zmmA, zmmB, m); - cc.evex().vpsllvq(xmmA, xmmB, m); - cc.evex().vpsllvq(ymmA, ymmB, m); - cc.evex().vpsllvq(zmmA, zmmB, m); - cc.evex().vpsllvw(xmmA, xmmB, m); - cc.evex().vpsllvw(ymmA, ymmB, m); - cc.evex().vpsllvw(zmmA, zmmB, m); - cc.evex().vpsllw(xmmA, xmmB, m); - cc.evex().vpsllw(xmmA, m, 0); - cc.evex().vpsllw(ymmA, ymmB, m); - cc.evex().vpsllw(ymmA, m, 0); - cc.evex().vpsllw(zmmA, zmmB, m); - cc.evex().vpsllw(zmmA, m, 0); - cc.evex().vpsrad(xmmA, xmmB, m); - cc.evex().vpsrad(xmmA, m, 0); - cc.evex().vpsrad(ymmA, ymmB, m); - cc.evex().vpsrad(ymmA, m, 0); - cc.evex().vpsrad(zmmA, zmmB, m); - cc.evex().vpsrad(zmmA, m, 0); - cc.evex().vpsraq(xmmA, xmmB, m); - cc.evex().vpsraq(xmmA, m, 0); - cc.evex().vpsraq(ymmA, ymmB, m); - cc.evex().vpsraq(ymmA, m, 0); - cc.evex().vpsraq(zmmA, zmmB, m); - cc.evex().vpsraq(zmmA, m, 0); - cc.evex().vpsravd(xmmA, xmmB, m); - cc.evex().vpsravd(ymmA, ymmB, m); - cc.evex().vpsravd(zmmA, zmmB, m); - cc.evex().vpsravq(xmmA, xmmB, m); - cc.evex().vpsravq(ymmA, ymmB, m); - cc.evex().vpsravq(zmmA, zmmB, m); - cc.evex().vpsravw(xmmA, xmmB, m); - cc.evex().vpsravw(ymmA, ymmB, m); - cc.evex().vpsravw(zmmA, zmmB, m); - cc.evex().vpsraw(xmmA, xmmB, m); - cc.evex().vpsraw(xmmA, m, 0); - cc.evex().vpsraw(ymmA, ymmB, m); - cc.evex().vpsraw(ymmA, m, 0); - cc.evex().vpsraw(zmmA, zmmB, m); - cc.evex().vpsraw(zmmA, m, 0); - cc.evex().vpsrld(xmmA, xmmB, m); - cc.evex().vpsrld(xmmA, m, 0); - cc.evex().vpsrld(ymmA, ymmB, m); - cc.evex().vpsrld(ymmA, m, 0); - cc.evex().vpsrld(zmmA, zmmB, m); - cc.evex().vpsrld(zmmA, m, 0); - cc.evex().vpsrldq(xmmA, m, 0); - cc.evex().vpsrldq(ymmA, m, 0); - cc.evex().vpsrldq(zmmA, m, 0); - cc.evex().vpsrlq(xmmA, xmmB, m); - cc.evex().vpsrlq(xmmA, m, 0); - cc.evex().vpsrlq(ymmA, ymmB, m); - cc.evex().vpsrlq(ymmA, m, 0); - cc.evex().vpsrlq(zmmA, zmmB, m); - cc.evex().vpsrlq(zmmA, m, 0); - cc.evex().vpsrlvd(xmmA, xmmB, m); - cc.evex().vpsrlvd(ymmA, ymmB, m); - cc.evex().vpsrlvd(zmmA, zmmB, m); - cc.evex().vpsrlvq(xmmA, xmmB, m); - cc.evex().vpsrlvq(ymmA, ymmB, m); - cc.evex().vpsrlvq(zmmA, zmmB, m); - cc.evex().vpsrlvw(xmmA, xmmB, m); - cc.evex().vpsrlvw(ymmA, ymmB, m); - cc.evex().vpsrlvw(zmmA, zmmB, m); - cc.evex().vpsrlw(xmmA, xmmB, m); - cc.evex().vpsrlw(xmmA, m, 0); - cc.evex().vpsrlw(ymmA, ymmB, m); - cc.evex().vpsrlw(ymmA, m, 0); - cc.evex().vpsrlw(zmmA, zmmB, m); - cc.evex().vpsrlw(zmmA, m, 0); - cc.evex().vpsubb(xmmA, xmmB, m); - cc.evex().vpsubb(ymmA, ymmB, m); - cc.evex().vpsubb(zmmA, zmmB, m); - cc.evex().vpsubd(xmmA, xmmB, m); - cc.evex().vpsubd(ymmA, ymmB, m); - cc.evex().vpsubd(zmmA, zmmB, m); - cc.evex().vpsubq(xmmA, xmmB, m); - cc.evex().vpsubq(ymmA, ymmB, m); - cc.evex().vpsubq(zmmA, zmmB, m); - cc.evex().vpsubsb(xmmA, xmmB, m); - cc.evex().vpsubsb(ymmA, ymmB, m); - cc.evex().vpsubsb(zmmA, zmmB, m); - cc.evex().vpsubsw(xmmA, xmmB, m); - cc.evex().vpsubsw(ymmA, ymmB, m); - cc.evex().vpsubsw(zmmA, zmmB, m); - cc.evex().vpsubusb(xmmA, xmmB, m); - cc.evex().vpsubusb(ymmA, ymmB, m); - cc.evex().vpsubusb(zmmA, zmmB, m); - cc.evex().vpsubusw(xmmA, xmmB, m); - cc.evex().vpsubusw(ymmA, ymmB, m); - cc.evex().vpsubusw(zmmA, zmmB, m); - cc.evex().vpsubw(xmmA, xmmB, m); - cc.evex().vpsubw(ymmA, ymmB, m); - cc.evex().vpsubw(zmmA, zmmB, m); - cc.evex().vpternlogd(xmmA, xmmB, m, 0); - cc.evex().vpternlogd(ymmA, ymmB, m, 0); - cc.evex().vpternlogd(zmmA, zmmB, m, 0); - cc.evex().vpternlogq(xmmA, xmmB, m, 0); - cc.evex().vpternlogq(ymmA, ymmB, m, 0); - cc.evex().vpternlogq(zmmA, zmmB, m, 0); - cc.evex().vptestmb(kA, xmmB, m); - cc.evex().vptestmb(kA, ymmB, m); - cc.evex().vptestmb(kA, zmmB, m); - cc.evex().vptestmd(kA, xmmB, m); - cc.evex().vptestmd(kA, ymmB, m); - cc.evex().vptestmd(kA, zmmB, m); - cc.evex().vptestmq(kA, xmmB, m); - cc.evex().vptestmq(kA, ymmB, m); - cc.evex().vptestmq(kA, zmmB, m); - cc.evex().vptestmw(kA, xmmB, m); - cc.evex().vptestmw(kA, ymmB, m); - cc.evex().vptestmw(kA, zmmB, m); - cc.evex().vptestnmb(kA, xmmB, m); - cc.evex().vptestnmb(kA, ymmB, m); - cc.evex().vptestnmb(kA, zmmB, m); - cc.evex().vptestnmd(kA, xmmB, m); - cc.evex().vptestnmd(kA, ymmB, m); - cc.evex().vptestnmd(kA, zmmB, m); - cc.evex().vptestnmq(kA, xmmB, m); - cc.evex().vptestnmq(kA, ymmB, m); - cc.evex().vptestnmq(kA, zmmB, m); - cc.evex().vptestnmw(kA, xmmB, m); - cc.evex().vptestnmw(kA, ymmB, m); - cc.evex().vptestnmw(kA, zmmB, m); - cc.evex().vpunpckhbw(xmmA, xmmB, m); - cc.evex().vpunpckhbw(ymmA, ymmB, m); - cc.evex().vpunpckhbw(zmmA, zmmB, m); - cc.evex().vpunpckhdq(xmmA, xmmB, m); - cc.evex().vpunpckhdq(ymmA, ymmB, m); - cc.evex().vpunpckhdq(zmmA, zmmB, m); - cc.evex().vpunpckhqdq(xmmA, xmmB, m); - cc.evex().vpunpckhqdq(ymmA, ymmB, m); - cc.evex().vpunpckhqdq(zmmA, zmmB, m); - cc.evex().vpunpckhwd(xmmA, xmmB, m); - cc.evex().vpunpckhwd(ymmA, ymmB, m); - cc.evex().vpunpckhwd(zmmA, zmmB, m); - cc.evex().vpunpcklbw(xmmA, xmmB, m); - cc.evex().vpunpcklbw(ymmA, ymmB, m); - cc.evex().vpunpcklbw(zmmA, zmmB, m); - cc.evex().vpunpckldq(xmmA, xmmB, m); - cc.evex().vpunpckldq(ymmA, ymmB, m); - cc.evex().vpunpckldq(zmmA, zmmB, m); - cc.evex().vpunpcklqdq(xmmA, xmmB, m); - cc.evex().vpunpcklqdq(ymmA, ymmB, m); - cc.evex().vpunpcklqdq(zmmA, zmmB, m); - cc.evex().vpunpcklwd(xmmA, xmmB, m); - cc.evex().vpunpcklwd(ymmA, ymmB, m); - cc.evex().vpunpcklwd(zmmA, zmmB, m); - cc.evex().vpxord(xmmA, xmmB, m); - cc.evex().vpxord(ymmA, ymmB, m); - cc.evex().vpxord(zmmA, zmmB, m); - cc.evex().vpxorq(xmmA, xmmB, m); - cc.evex().vpxorq(ymmA, ymmB, m); - cc.evex().vpxorq(zmmA, zmmB, m); - cc.evex().vrangepd(xmmA, xmmB, m, 0); - cc.evex().vrangepd(ymmA, ymmB, m, 0); - cc.evex().vrangepd(zmmA, zmmB, m, 0); - cc.evex().vrangeps(xmmA, xmmB, m, 0); - cc.evex().vrangeps(ymmA, ymmB, m, 0); - cc.evex().vrangeps(zmmA, zmmB, m, 0); - cc.evex().vrangesd(xmmA, xmmB, m, 0); - cc.evex().vrangess(xmmA, xmmB, m, 0); - cc.evex().vrcp14pd(xmmA, m); - cc.evex().vrcp14pd(ymmA, m); - cc.evex().vrcp14pd(zmmA, m); - cc.evex().vrcp14ps(xmmA, m); - cc.evex().vrcp14ps(ymmA, m); - cc.evex().vrcp14ps(zmmA, m); - cc.evex().vrcp14sd(xmmA, xmmB, m); - cc.evex().vrcp14ss(xmmA, xmmB, m); - cc.evex().vrcp28pd(zmmA, m); - cc.evex().vrcp28ps(zmmA, m); - cc.evex().vrcp28sd(xmmA, xmmB, m); - cc.evex().vrcp28ss(xmmA, xmmB, m); - cc.evex().vreducepd(xmmA, m, 0); - cc.evex().vreducepd(ymmA, m, 0); - cc.evex().vreducepd(zmmA, m, 0); - cc.evex().vreduceps(xmmA, m, 0); - cc.evex().vreduceps(ymmA, m, 0); - cc.evex().vreduceps(zmmA, m, 0); - cc.evex().vreducesd(xmmA, xmmB, m, 0); - cc.evex().vreducess(xmmA, xmmB, m, 0); - cc.evex().vrndscalepd(xmmA, m, 0); - cc.evex().vrndscalepd(ymmA, m, 0); - cc.evex().vrndscalepd(zmmA, m, 0); - cc.evex().vrndscaleps(xmmA, m, 0); - cc.evex().vrndscaleps(ymmA, m, 0); - cc.evex().vrndscaleps(zmmA, m, 0); - cc.evex().vrndscalesd(xmmA, xmmB, m, 0); - cc.evex().vrndscaless(xmmA, xmmB, m, 0); - cc.evex().vrsqrt14pd(xmmA, m); - cc.evex().vrsqrt14pd(ymmA, m); - cc.evex().vrsqrt14pd(zmmA, m); - cc.evex().vrsqrt14ps(xmmA, m); - cc.evex().vrsqrt14ps(ymmA, m); - cc.evex().vrsqrt14ps(zmmA, m); - cc.evex().vrsqrt14sd(xmmA, xmmB, m); - cc.evex().vrsqrt14ss(xmmA, xmmB, m); - cc.evex().vrsqrt28pd(zmmA, m); - cc.evex().vrsqrt28ps(zmmA, m); - cc.evex().vrsqrt28sd(xmmA, xmmB, m); - cc.evex().vrsqrt28ss(xmmA, xmmB, m); - cc.evex().vscalefpd(xmmA, xmmB, m); - cc.evex().vscalefpd(ymmA, ymmB, m); - cc.evex().vscalefpd(zmmA, zmmB, m); - cc.evex().vscalefps(xmmA, xmmB, m); - cc.evex().vscalefps(ymmA, ymmB, m); - cc.evex().vscalefps(zmmA, zmmB, m); - cc.evex().vscalefsd(xmmA, xmmB, m); - cc.evex().vscalefss(xmmA, xmmB, m); - cc.evex().k(kA).vscatterdpd(vx_ptr, xmmB); - cc.evex().k(kA).vscatterdpd(vx_ptr, ymmB); - cc.evex().k(kA).vscatterdpd(vy_ptr, zmmB); - cc.evex().k(kA).vscatterdps(vx_ptr, xmmB); - cc.evex().k(kA).vscatterdps(vy_ptr, ymmB); - cc.evex().k(kA).vscatterdps(vz_ptr, zmmB); - cc.evex().k(kA).vscatterpf0dpd(vy_ptr); - cc.evex().k(kA).vscatterpf0dps(vz_ptr); - cc.evex().k(kA).vscatterpf0qpd(vz_ptr); - cc.evex().k(kA).vscatterpf0qps(vz_ptr); - cc.evex().k(kA).vscatterpf1dpd(vy_ptr); - cc.evex().k(kA).vscatterpf1dps(vz_ptr); - cc.evex().k(kA).vscatterpf1qpd(vz_ptr); - cc.evex().k(kA).vscatterpf1qps(vz_ptr); - cc.evex().k(kA).vscatterqpd(vx_ptr, xmmB); - cc.evex().k(kA).vscatterqpd(vy_ptr, ymmB); - cc.evex().k(kA).vscatterqpd(vz_ptr, zmmB); - cc.evex().k(kA).vscatterqps(vx_ptr, xmmB); - cc.evex().k(kA).vscatterqps(vy_ptr, xmmB); - cc.evex().k(kA).vscatterqps(vz_ptr, ymmB); - cc.evex().vshuff32x4(ymmA, ymmB, m, 0); - cc.evex().vshuff32x4(zmmA, zmmB, m, 0); - cc.evex().vshuff64x2(ymmA, ymmB, m, 0); - cc.evex().vshuff64x2(zmmA, zmmB, m, 0); - cc.evex().vshufi32x4(ymmA, ymmB, m, 0); - cc.evex().vshufi32x4(zmmA, zmmB, m, 0); - cc.evex().vshufi64x2(ymmA, ymmB, m, 0); - cc.evex().vshufi64x2(zmmA, zmmB, m, 0); - cc.evex().vshufpd(xmmA, xmmB, m, 0); - cc.evex().vshufpd(ymmA, ymmB, m, 0); - cc.evex().vshufpd(zmmA, zmmB, m, 0); - cc.evex().vshufps(xmmA, xmmB, m, 0); - cc.evex().vshufps(ymmA, ymmB, m, 0); - cc.evex().vshufps(zmmA, zmmB, m, 0); - cc.evex().vsqrtpd(xmmA, m); - cc.evex().vsqrtpd(ymmA, m); - cc.evex().vsqrtpd(zmmA, m); - cc.evex().vsqrtps(xmmA, m); - cc.evex().vsqrtps(ymmA, m); - cc.evex().vsqrtps(zmmA, m); - cc.evex().vsqrtsd(xmmA, xmmB, m); - cc.evex().vsqrtss(xmmA, xmmB, m); - cc.evex().vsubpd(xmmA, xmmB, m); - cc.evex().vsubpd(ymmA, ymmB, m); - cc.evex().vsubpd(zmmA, zmmB, m); - cc.evex().vsubps(xmmA, xmmB, m); - cc.evex().vsubps(ymmA, ymmB, m); - cc.evex().vsubps(zmmA, zmmB, m); - cc.evex().vsubsd(xmmA, xmmB, m); - cc.evex().vsubss(xmmA, xmmB, m); - cc.evex().vucomisd(xmmA, m); - cc.evex().vucomiss(xmmA, m); - cc.evex().vunpckhpd(xmmA, xmmB, m); - cc.evex().vunpckhpd(ymmA, ymmB, m); - cc.evex().vunpckhpd(zmmA, zmmB, m); - cc.evex().vunpckhps(xmmA, xmmB, m); - cc.evex().vunpckhps(ymmA, ymmB, m); - cc.evex().vunpckhps(zmmA, zmmB, m); - cc.evex().vunpcklpd(xmmA, xmmB, m); - cc.evex().vunpcklpd(ymmA, ymmB, m); - cc.evex().vunpcklpd(zmmA, zmmB, m); - cc.evex().vunpcklps(xmmA, xmmB, m); - cc.evex().vunpcklps(ymmA, ymmB, m); - cc.evex().vunpcklps(zmmA, zmmB, m); - cc.evex().vxorpd(xmmA, xmmB, m); - cc.evex().vxorpd(ymmA, ymmB, m); - cc.evex().vxorpd(zmmA, zmmB, m); - cc.evex().vxorps(xmmA, xmmB, m); - cc.evex().vxorps(ymmA, ymmB, m); - cc.evex().vxorps(zmmA, zmmB, m); - } + cc.kmovb(kA, m); + cc.kmovb(m, kB); + cc.kmovd(kA, m); + cc.kmovd(m, kB); + cc.kmovq(kA, m); + cc.kmovq(m, kB); + cc.kmovw(kA, m); + cc.kmovw(m, kB); + + cc.evex().vaddpd(xmmA, xmmB, m); + cc.evex().vaddpd(ymmA, ymmB, m); + cc.evex().vaddpd(zmmA, zmmB, m); + cc.evex().vaddps(xmmA, xmmB, m); + cc.evex().vaddps(ymmA, ymmB, m); + cc.evex().vaddps(zmmA, zmmB, m); + cc.evex().vaddsd(xmmA, xmmB, m); + cc.evex().vaddss(xmmA, xmmB, m); + cc.evex().valignd(xmmA, xmmB, m, 0); + cc.evex().valignd(ymmA, ymmB, m, 0); + cc.evex().valignd(zmmA, zmmB, m, 0); + cc.evex().valignq(xmmA, xmmB, m, 0); + cc.evex().valignq(ymmA, ymmB, m, 0); + cc.evex().valignq(zmmA, zmmB, m, 0); + cc.evex().vandnpd(xmmA, xmmB, m); + cc.evex().vandnpd(ymmA, ymmB, m); + cc.evex().vandnpd(zmmA, zmmB, m); + cc.evex().vandnps(xmmA, xmmB, m); + cc.evex().vandnps(ymmA, ymmB, m); + cc.evex().vandnps(zmmA, zmmB, m); + cc.evex().vandpd(xmmA, xmmB, m); + cc.evex().vandpd(ymmA, ymmB, m); + cc.evex().vandpd(zmmA, zmmB, m); + cc.evex().vandps(xmmA, xmmB, m); + cc.evex().vandps(ymmA, ymmB, m); + cc.evex().vandps(zmmA, zmmB, m); + cc.evex().vblendmpd(xmmA, xmmB, m); + cc.evex().vblendmpd(ymmA, ymmB, m); + cc.evex().vblendmpd(zmmA, zmmB, m); + cc.evex().vblendmps(xmmA, xmmB, m); + cc.evex().vblendmps(ymmA, ymmB, m); + cc.evex().vblendmps(zmmA, zmmB, m); + cc.evex().vbroadcastf32x2(ymmA, m); + cc.evex().vbroadcastf32x2(zmmA, m); + cc.evex().vbroadcastf32x4(ymmA, m); + cc.evex().vbroadcastf32x4(zmmA, m); + cc.evex().vbroadcastf32x8(zmmA, m); + cc.evex().vbroadcastf64x2(ymmA, m); + cc.evex().vbroadcastf64x2(zmmA, m); + cc.evex().vbroadcastf64x4(zmmA, m); + cc.evex().vbroadcasti32x2(xmmA, m); + cc.evex().vbroadcasti32x2(ymmA, m); + cc.evex().vbroadcasti32x2(zmmA, m); + cc.evex().vbroadcasti32x4(ymmA, m); + cc.evex().vbroadcasti32x4(zmmA, m); + cc.evex().vbroadcasti32x8(zmmA, m); + cc.evex().vbroadcasti64x2(ymmA, m); + cc.evex().vbroadcasti64x2(zmmA, m); + cc.evex().vbroadcasti64x4(zmmA, m); + cc.evex().vbroadcastsd(ymmA, m); + cc.evex().vbroadcastsd(zmmA, m); + cc.evex().vbroadcastss(xmmA, m); + cc.evex().vbroadcastss(ymmA, m); + cc.evex().vbroadcastss(zmmA, m); + cc.evex().vcmppd(kA, xmmB, m, 0); + cc.evex().vcmppd(kA, ymmB, m, 0); + cc.evex().vcmppd(kA, zmmB, m, 0); + cc.evex().vcmpps(kA, xmmB, m, 0); + cc.evex().vcmpps(kA, ymmB, m, 0); + cc.evex().vcmpps(kA, zmmB, m, 0); + cc.evex().vcmpsd(kA, xmmB, m, 0); + cc.evex().vcmpss(kA, xmmB, m, 0); + cc.evex().vcomisd(xmmA, m); + cc.evex().vcomiss(xmmA, m); + cc.evex().vcompresspd(m, xmmB); + cc.evex().vcompresspd(m, ymmB); + cc.evex().vcompresspd(m, zmmB); + cc.evex().vcompressps(m, xmmB); + cc.evex().vcompressps(m, ymmB); + cc.evex().vcompressps(m, zmmB); + cc.evex().vcvtdq2pd(xmmA, m); + cc.evex().vcvtdq2pd(ymmA, m); + cc.evex().vcvtdq2pd(zmmA, m); + cc.evex().vcvtdq2ps(xmmA, m); + cc.evex().vcvtdq2ps(ymmA, m); + cc.evex().vcvtdq2ps(zmmA, m); + cc.evex().vcvtpd2dq(xmmA, m128); + cc.evex().vcvtpd2dq(xmmA, m256); + cc.evex().vcvtpd2dq(ymmA, m512); + cc.evex().vcvtpd2qq(xmmA, m); + cc.evex().vcvtpd2qq(ymmA, m); + cc.evex().vcvtpd2qq(zmmA, m); + cc.evex().vcvtpd2udq(xmmA, m128); + cc.evex().vcvtpd2udq(xmmA, m256); + cc.evex().vcvtpd2udq(ymmA, m512); + cc.evex().vcvtpd2uqq(xmmA, m); + cc.evex().vcvtpd2uqq(ymmA, m); + cc.evex().vcvtpd2uqq(zmmA, m); + cc.evex().vcvtph2ps(xmmA, m); + cc.evex().vcvtph2ps(ymmA, m); + cc.evex().vcvtph2ps(zmmA, m); + cc.evex().vcvtps2dq(xmmA, m); + cc.evex().vcvtps2dq(ymmA, m); + cc.evex().vcvtps2dq(zmmA, m); + cc.evex().vcvtps2pd(xmmA, m); + cc.evex().vcvtps2pd(ymmA, m); + cc.evex().vcvtps2pd(zmmA, m); + cc.evex().vcvtps2ph(m, xmmB, 0); + cc.evex().vcvtps2ph(m, ymmB, 0); + cc.evex().vcvtps2ph(m, zmmB, 0); + cc.evex().vcvtps2qq(xmmA, m); + cc.evex().vcvtps2qq(ymmA, m); + cc.evex().vcvtps2qq(zmmA, m); + cc.evex().vcvtps2udq(xmmA, m); + cc.evex().vcvtps2udq(ymmA, m); + cc.evex().vcvtps2udq(zmmA, m); + cc.evex().vcvtps2uqq(xmmA, m); + cc.evex().vcvtps2uqq(ymmA, m); + cc.evex().vcvtps2uqq(zmmA, m); + cc.evex().vcvtqq2pd(xmmA, m); + cc.evex().vcvtqq2pd(ymmA, m); + cc.evex().vcvtqq2pd(zmmA, m); + cc.evex().vcvtqq2ps(xmmA, m128); + cc.evex().vcvtqq2ps(xmmA, m256); + cc.evex().vcvtqq2ps(ymmA, m512); + cc.evex().vcvtsd2si(gpd, m); + cc.evex().vcvtsd2si(gpz, m); + cc.evex().vcvtsd2ss(xmmA, xmmB, m); + cc.evex().vcvtsd2usi(gpd, m); + cc.evex().vcvtsd2usi(gpz, m); + cc.evex().vcvtsi2sd(xmmA, xmmB, m32); + if (cc.is64Bit()) cc.evex().vcvtsi2sd(xmmA, xmmB, m64); + cc.evex().vcvtsi2ss(xmmA, xmmB, m32); + if (cc.is64Bit()) cc.evex().vcvtsi2ss(xmmA, xmmB, m64); + cc.evex().vcvtss2sd(xmmA, xmmB, m); + cc.evex().vcvtss2si(gpd, m); + cc.evex().vcvtss2si(gpz, m); + cc.evex().vcvtss2usi(gpd, m); + cc.evex().vcvtss2usi(gpz, m); + cc.evex().vcvttpd2dq(xmmA, m128); + cc.evex().vcvttpd2dq(xmmA, m256); + cc.evex().vcvttpd2dq(ymmA, m512); + cc.evex().vcvttpd2qq(xmmA, m); + cc.evex().vcvttpd2qq(ymmA, m); + cc.evex().vcvttpd2qq(zmmA, m); + cc.evex().vcvttpd2udq(xmmA, m128); + cc.evex().vcvttpd2udq(xmmA, m256); + cc.evex().vcvttpd2udq(ymmA, m512); + cc.evex().vcvttpd2uqq(xmmA, m); + cc.evex().vcvttpd2uqq(ymmA, m); + cc.evex().vcvttpd2uqq(zmmA, m); + cc.evex().vcvttps2dq(xmmA, m); + cc.evex().vcvttps2dq(ymmA, m); + cc.evex().vcvttps2dq(zmmA, m); + cc.evex().vcvttps2qq(xmmA, m); + cc.evex().vcvttps2qq(ymmA, m); + cc.evex().vcvttps2qq(zmmA, m); + cc.evex().vcvttps2udq(xmmA, m); + cc.evex().vcvttps2udq(ymmA, m); + cc.evex().vcvttps2udq(zmmA, m); + cc.evex().vcvttps2uqq(xmmA, m); + cc.evex().vcvttps2uqq(ymmA, m); + cc.evex().vcvttps2uqq(zmmA, m); + cc.evex().vcvttsd2si(gpd, m); + cc.evex().vcvttsd2si(gpz, m); + cc.evex().vcvttsd2usi(gpd, m); + cc.evex().vcvttsd2usi(gpz, m); + cc.evex().vcvttss2si(gpd, m); + cc.evex().vcvttss2si(gpz, m); + cc.evex().vcvttss2usi(gpd, m); + cc.evex().vcvttss2usi(gpz, m); + cc.evex().vcvtudq2pd(xmmA, m); + cc.evex().vcvtudq2pd(ymmA, m); + cc.evex().vcvtudq2pd(zmmA, m); + cc.evex().vcvtudq2ps(xmmA, m); + cc.evex().vcvtudq2ps(ymmA, m); + cc.evex().vcvtudq2ps(zmmA, m); + cc.evex().vcvtuqq2pd(xmmA, m); + cc.evex().vcvtuqq2pd(ymmA, m); + cc.evex().vcvtuqq2pd(zmmA, m); + cc.evex().vcvtuqq2ps(xmmA, m128); + cc.evex().vcvtuqq2ps(xmmA, m256); + cc.evex().vcvtuqq2ps(ymmA, m512); + cc.evex().vcvtusi2sd(xmmA, xmmB, m32); + if (cc.is64Bit()) cc.evex().vcvtusi2sd(xmmA, xmmB, m64); + cc.evex().vcvtusi2ss(xmmA, xmmB, m32); + if (cc.is64Bit()) cc.evex().vcvtusi2ss(xmmA, xmmB, m64); + cc.evex().vdbpsadbw(xmmA, xmmB, m, 0); + cc.evex().vdbpsadbw(ymmA, ymmB, m, 0); + cc.evex().vdbpsadbw(zmmA, zmmB, m, 0); + cc.evex().vdivpd(xmmA, xmmB, m); + cc.evex().vdivpd(ymmA, ymmB, m); + cc.evex().vdivpd(zmmA, zmmB, m); + cc.evex().vdivps(xmmA, xmmB, m); + cc.evex().vdivps(ymmA, ymmB, m); + cc.evex().vdivps(zmmA, zmmB, m); + cc.evex().vdivsd(xmmA, xmmB, m); + cc.evex().vdivss(xmmA, xmmB, m); + cc.evex().vexp2pd(zmmA, m); + cc.evex().vexp2ps(zmmA, m); + cc.evex().vexpandpd(xmmA, m); + cc.evex().vexpandpd(ymmA, m); + cc.evex().vexpandpd(zmmA, m); + cc.evex().vexpandps(xmmA, m); + cc.evex().vexpandps(ymmA, m); + cc.evex().vexpandps(zmmA, m); + cc.evex().vextractf32x4(m, ymmB, 0); + cc.evex().vextractf32x4(m, zmmB, 0); + cc.evex().vextractf32x8(m, zmmB, 0); + cc.evex().vextractf64x2(m, ymmB, 0); + cc.evex().vextractf64x2(m, zmmB, 0); + cc.evex().vextractf64x4(m, zmmB, 0); + cc.evex().vextracti32x4(m, ymmB, 0); + cc.evex().vextracti32x4(m, zmmB, 0); + cc.evex().vextracti32x8(m, zmmB, 0); + cc.evex().vextracti64x2(m, ymmB, 0); + cc.evex().vextracti64x2(m, zmmB, 0); + cc.evex().vextracti64x4(m, zmmB, 0); + cc.evex().vextractps(m, xmmB, 0); + cc.evex().vfixupimmpd(xmmA, xmmB, m, 0); + cc.evex().vfixupimmpd(ymmA, ymmB, m, 0); + cc.evex().vfixupimmpd(zmmA, zmmB, m, 0); + cc.evex().vfixupimmps(xmmA, xmmB, m, 0); + cc.evex().vfixupimmps(ymmA, ymmB, m, 0); + cc.evex().vfixupimmps(zmmA, zmmB, m, 0); + cc.evex().vfixupimmsd(xmmA, xmmB, m, 0); + cc.evex().vfixupimmss(xmmA, xmmB, m, 0); + cc.evex().vfmadd132pd(xmmA, xmmB, m); + cc.evex().vfmadd132pd(ymmA, ymmB, m); + cc.evex().vfmadd132pd(zmmA, zmmB, m); + cc.evex().vfmadd132ps(xmmA, xmmB, m); + cc.evex().vfmadd132ps(ymmA, ymmB, m); + cc.evex().vfmadd132ps(zmmA, zmmB, m); + cc.evex().vfmadd132sd(xmmA, xmmB, m); + cc.evex().vfmadd132ss(xmmA, xmmB, m); + cc.evex().vfmadd213pd(xmmA, xmmB, m); + cc.evex().vfmadd213pd(ymmA, ymmB, m); + cc.evex().vfmadd213pd(zmmA, zmmB, m); + cc.evex().vfmadd213ps(xmmA, xmmB, m); + cc.evex().vfmadd213ps(ymmA, ymmB, m); + cc.evex().vfmadd213ps(zmmA, zmmB, m); + cc.evex().vfmadd213sd(xmmA, xmmB, m); + cc.evex().vfmadd213ss(xmmA, xmmB, m); + cc.evex().vfmadd231pd(xmmA, xmmB, m); + cc.evex().vfmadd231pd(ymmA, ymmB, m); + cc.evex().vfmadd231pd(zmmA, zmmB, m); + cc.evex().vfmadd231ps(xmmA, xmmB, m); + cc.evex().vfmadd231ps(ymmA, ymmB, m); + cc.evex().vfmadd231ps(zmmA, zmmB, m); + cc.evex().vfmadd231sd(xmmA, xmmB, m); + cc.evex().vfmadd231ss(xmmA, xmmB, m); + cc.evex().vfmaddsub132pd(xmmA, xmmB, m); + cc.evex().vfmaddsub132pd(ymmA, ymmB, m); + cc.evex().vfmaddsub132pd(zmmA, zmmB, m); + cc.evex().vfmaddsub132ps(xmmA, xmmB, m); + cc.evex().vfmaddsub132ps(ymmA, ymmB, m); + cc.evex().vfmaddsub132ps(zmmA, zmmB, m); + cc.evex().vfmaddsub213pd(xmmA, xmmB, m); + cc.evex().vfmaddsub213pd(ymmA, ymmB, m); + cc.evex().vfmaddsub213pd(zmmA, zmmB, m); + cc.evex().vfmaddsub213ps(xmmA, xmmB, m); + cc.evex().vfmaddsub213ps(ymmA, ymmB, m); + cc.evex().vfmaddsub213ps(zmmA, zmmB, m); + cc.evex().vfmaddsub231pd(xmmA, xmmB, m); + cc.evex().vfmaddsub231pd(ymmA, ymmB, m); + cc.evex().vfmaddsub231pd(zmmA, zmmB, m); + cc.evex().vfmaddsub231ps(xmmA, xmmB, m); + cc.evex().vfmaddsub231ps(ymmA, ymmB, m); + cc.evex().vfmaddsub231ps(zmmA, zmmB, m); + cc.evex().vfmsub132pd(xmmA, xmmB, m); + cc.evex().vfmsub132pd(ymmA, ymmB, m); + cc.evex().vfmsub132pd(zmmA, zmmB, m); + cc.evex().vfmsub132ps(xmmA, xmmB, m); + cc.evex().vfmsub132ps(ymmA, ymmB, m); + cc.evex().vfmsub132ps(zmmA, zmmB, m); + cc.evex().vfmsub132sd(xmmA, xmmB, m); + cc.evex().vfmsub132ss(xmmA, xmmB, m); + cc.evex().vfmsub213pd(xmmA, xmmB, m); + cc.evex().vfmsub213pd(ymmA, ymmB, m); + cc.evex().vfmsub213pd(zmmA, zmmB, m); + cc.evex().vfmsub213ps(xmmA, xmmB, m); + cc.evex().vfmsub213ps(ymmA, ymmB, m); + cc.evex().vfmsub213ps(zmmA, zmmB, m); + cc.evex().vfmsub213sd(xmmA, xmmB, m); + cc.evex().vfmsub213ss(xmmA, xmmB, m); + cc.evex().vfmsub231pd(xmmA, xmmB, m); + cc.evex().vfmsub231pd(ymmA, ymmB, m); + cc.evex().vfmsub231pd(zmmA, zmmB, m); + cc.evex().vfmsub231ps(xmmA, xmmB, m); + cc.evex().vfmsub231ps(ymmA, ymmB, m); + cc.evex().vfmsub231ps(zmmA, zmmB, m); + cc.evex().vfmsub231sd(xmmA, xmmB, m); + cc.evex().vfmsub231ss(xmmA, xmmB, m); + cc.evex().vfmsubadd132pd(xmmA, xmmB, m); + cc.evex().vfmsubadd132pd(ymmA, ymmB, m); + cc.evex().vfmsubadd132pd(zmmA, zmmB, m); + cc.evex().vfmsubadd132ps(xmmA, xmmB, m); + cc.evex().vfmsubadd132ps(ymmA, ymmB, m); + cc.evex().vfmsubadd132ps(zmmA, zmmB, m); + cc.evex().vfmsubadd213pd(xmmA, xmmB, m); + cc.evex().vfmsubadd213pd(ymmA, ymmB, m); + cc.evex().vfmsubadd213pd(zmmA, zmmB, m); + cc.evex().vfmsubadd213ps(xmmA, xmmB, m); + cc.evex().vfmsubadd213ps(ymmA, ymmB, m); + cc.evex().vfmsubadd213ps(zmmA, zmmB, m); + cc.evex().vfmsubadd231pd(xmmA, xmmB, m); + cc.evex().vfmsubadd231pd(ymmA, ymmB, m); + cc.evex().vfmsubadd231pd(zmmA, zmmB, m); + cc.evex().vfmsubadd231ps(xmmA, xmmB, m); + cc.evex().vfmsubadd231ps(ymmA, ymmB, m); + cc.evex().vfmsubadd231ps(zmmA, zmmB, m); + cc.evex().vfnmadd132pd(xmmA, xmmB, m); + cc.evex().vfnmadd132pd(ymmA, ymmB, m); + cc.evex().vfnmadd132pd(zmmA, zmmB, m); + cc.evex().vfnmadd132ps(xmmA, xmmB, m); + cc.evex().vfnmadd132ps(ymmA, ymmB, m); + cc.evex().vfnmadd132ps(zmmA, zmmB, m); + cc.evex().vfnmadd132sd(xmmA, xmmB, m); + cc.evex().vfnmadd132ss(xmmA, xmmB, m); + cc.evex().vfnmadd213pd(xmmA, xmmB, m); + cc.evex().vfnmadd213pd(ymmA, ymmB, m); + cc.evex().vfnmadd213pd(zmmA, zmmB, m); + cc.evex().vfnmadd213ps(xmmA, xmmB, m); + cc.evex().vfnmadd213ps(ymmA, ymmB, m); + cc.evex().vfnmadd213ps(zmmA, zmmB, m); + cc.evex().vfnmadd213sd(xmmA, xmmB, m); + cc.evex().vfnmadd213ss(xmmA, xmmB, m); + cc.evex().vfnmadd231pd(xmmA, xmmB, m); + cc.evex().vfnmadd231pd(ymmA, ymmB, m); + cc.evex().vfnmadd231pd(zmmA, zmmB, m); + cc.evex().vfnmadd231ps(xmmA, xmmB, m); + cc.evex().vfnmadd231ps(ymmA, ymmB, m); + cc.evex().vfnmadd231ps(zmmA, zmmB, m); + cc.evex().vfnmadd231sd(xmmA, xmmB, m); + cc.evex().vfnmadd231ss(xmmA, xmmB, m); + cc.evex().vfnmsub132pd(xmmA, xmmB, m); + cc.evex().vfnmsub132pd(ymmA, ymmB, m); + cc.evex().vfnmsub132pd(zmmA, zmmB, m); + cc.evex().vfnmsub132ps(xmmA, xmmB, m); + cc.evex().vfnmsub132ps(ymmA, ymmB, m); + cc.evex().vfnmsub132ps(zmmA, zmmB, m); + cc.evex().vfnmsub132sd(xmmA, xmmB, m); + cc.evex().vfnmsub132ss(xmmA, xmmB, m); + cc.evex().vfnmsub213pd(xmmA, xmmB, m); + cc.evex().vfnmsub213pd(ymmA, ymmB, m); + cc.evex().vfnmsub213pd(zmmA, zmmB, m); + cc.evex().vfnmsub213ps(xmmA, xmmB, m); + cc.evex().vfnmsub213ps(ymmA, ymmB, m); + cc.evex().vfnmsub213ps(zmmA, zmmB, m); + cc.evex().vfnmsub213sd(xmmA, xmmB, m); + cc.evex().vfnmsub213ss(xmmA, xmmB, m); + cc.evex().vfnmsub231pd(xmmA, xmmB, m); + cc.evex().vfnmsub231pd(ymmA, ymmB, m); + cc.evex().vfnmsub231pd(zmmA, zmmB, m); + cc.evex().vfnmsub231ps(xmmA, xmmB, m); + cc.evex().vfnmsub231ps(ymmA, ymmB, m); + cc.evex().vfnmsub231ps(zmmA, zmmB, m); + cc.evex().vfnmsub231sd(xmmA, xmmB, m); + cc.evex().vfnmsub231ss(xmmA, xmmB, m); + cc.evex().vfpclasspd(kA, m128, 0); + cc.evex().vfpclasspd(kA, m256, 0); + cc.evex().vfpclasspd(kA, m512, 0); + cc.evex().vfpclassps(kA, m128, 0); + cc.evex().vfpclassps(kA, m256, 0); + cc.evex().vfpclassps(kA, m512, 0); + cc.evex().vfpclasssd(kA, m, 0); + cc.evex().vfpclassss(kA, m, 0); + cc.evex().k(kA).vgatherdpd(xmmA, vx_ptr); + cc.evex().k(kA).vgatherdpd(ymmA, vx_ptr); + cc.evex().k(kA).vgatherdpd(zmmA, vy_ptr); + cc.evex().k(kA).vgatherdps(xmmA, vx_ptr); + cc.evex().k(kA).vgatherdps(ymmA, vy_ptr); + cc.evex().k(kA).vgatherdps(zmmA, vz_ptr); + cc.evex().k(kA).vgatherpf0dpd(vy_ptr); + cc.evex().k(kA).vgatherpf0dps(vz_ptr); + cc.evex().k(kA).vgatherpf0qpd(vz_ptr); + cc.evex().k(kA).vgatherpf0qps(vz_ptr); + cc.evex().k(kA).vgatherpf1dpd(vy_ptr); + cc.evex().k(kA).vgatherpf1dps(vz_ptr); + cc.evex().k(kA).vgatherpf1qpd(vz_ptr); + cc.evex().k(kA).vgatherpf1qps(vz_ptr); + cc.evex().k(kA).vgatherqpd(xmmA, vx_ptr); + cc.evex().k(kA).vgatherqpd(ymmA, vy_ptr); + cc.evex().k(kA).vgatherqpd(zmmA, vz_ptr); + cc.evex().k(kA).vgatherqps(xmmA, vx_ptr); + cc.evex().k(kA).vgatherqps(xmmA, vy_ptr); + cc.evex().k(kA).vgatherqps(ymmA, vz_ptr); + cc.evex().vgetexppd(xmmA, m); + cc.evex().vgetexppd(ymmA, m); + cc.evex().vgetexppd(zmmA, m); + cc.evex().vgetexpps(xmmA, m); + cc.evex().vgetexpps(ymmA, m); + cc.evex().vgetexpps(zmmA, m); + cc.evex().vgetexpsd(xmmA, xmmB, m); + cc.evex().vgetexpss(xmmA, xmmB, m); + cc.evex().vgetmantpd(xmmA, m, 0); + cc.evex().vgetmantpd(ymmA, m, 0); + cc.evex().vgetmantpd(zmmA, m, 0); + cc.evex().vgetmantps(xmmA, m, 0); + cc.evex().vgetmantps(ymmA, m, 0); + cc.evex().vgetmantps(zmmA, m, 0); + cc.evex().vgetmantsd(xmmA, xmmB, m, 0); + cc.evex().vgetmantss(xmmA, xmmB, m, 0); + cc.evex().vinsertf32x4(ymmA, ymmB, m, 0); + cc.evex().vinsertf32x4(zmmA, zmmB, m, 0); + cc.evex().vinsertf32x8(zmmA, zmmB, m, 0); + cc.evex().vinsertf64x2(ymmA, ymmB, m, 0); + cc.evex().vinsertf64x2(zmmA, zmmB, m, 0); + cc.evex().vinsertf64x4(zmmA, zmmB, m, 0); + cc.evex().vinserti32x4(ymmA, ymmB, m, 0); + cc.evex().vinserti32x4(zmmA, zmmB, m, 0); + cc.evex().vinserti32x8(zmmA, zmmB, m, 0); + cc.evex().vinserti64x2(ymmA, ymmB, m, 0); + cc.evex().vinserti64x2(zmmA, zmmB, m, 0); + cc.evex().vinserti64x4(zmmA, zmmB, m, 0); + cc.evex().vinsertps(xmmA, xmmB, m, 0); + cc.evex().vmaxpd(xmmA, xmmB, m); + cc.evex().vmaxpd(ymmA, ymmB, m); + cc.evex().vmaxpd(zmmA, zmmB, m); + cc.evex().vmaxps(xmmA, xmmB, m); + cc.evex().vmaxps(ymmA, ymmB, m); + cc.evex().vmaxps(zmmA, zmmB, m); + cc.evex().vmaxsd(xmmA, xmmB, m); + cc.evex().vmaxss(xmmA, xmmB, m); + cc.evex().vminpd(xmmA, xmmB, m); + cc.evex().vminpd(ymmA, ymmB, m); + cc.evex().vminpd(zmmA, zmmB, m); + cc.evex().vminps(xmmA, xmmB, m); + cc.evex().vminps(ymmA, ymmB, m); + cc.evex().vminps(zmmA, zmmB, m); + cc.evex().vminsd(xmmA, xmmB, m); + cc.evex().vminss(xmmA, xmmB, m); + cc.evex().vmovapd(xmmA, m); + cc.evex().vmovapd(m, xmmB); + cc.evex().vmovapd(ymmA, m); + cc.evex().vmovapd(m, ymmB); + cc.evex().vmovapd(zmmA, m); + cc.evex().vmovapd(m, zmmB); + cc.evex().vmovaps(xmmA, m); + cc.evex().vmovaps(m, xmmB); + cc.evex().vmovaps(ymmA, m); + cc.evex().vmovaps(m, ymmB); + cc.evex().vmovaps(zmmA, m); + cc.evex().vmovaps(m, zmmB); + cc.evex().vmovd(m, xmmB); + cc.evex().vmovd(xmmA, m); + cc.evex().vmovddup(xmmA, m); + cc.evex().vmovddup(ymmA, m); + cc.evex().vmovddup(zmmA, m); + cc.evex().vmovdqa32(xmmA, m); + cc.evex().vmovdqa32(m, xmmB); + cc.evex().vmovdqa32(ymmA, m); + cc.evex().vmovdqa32(m, ymmB); + cc.evex().vmovdqa32(zmmA, m); + cc.evex().vmovdqa32(m, zmmB); + cc.evex().vmovdqa64(xmmA, m); + cc.evex().vmovdqa64(m, xmmB); + cc.evex().vmovdqa64(ymmA, m); + cc.evex().vmovdqa64(m, ymmB); + cc.evex().vmovdqa64(zmmA, m); + cc.evex().vmovdqa64(m, zmmB); + cc.evex().vmovdqu16(xmmA, m); + cc.evex().vmovdqu16(m, xmmB); + cc.evex().vmovdqu16(ymmA, m); + cc.evex().vmovdqu16(m, ymmB); + cc.evex().vmovdqu16(zmmA, m); + cc.evex().vmovdqu16(m, zmmB); + cc.evex().vmovdqu32(xmmA, m); + cc.evex().vmovdqu32(m, xmmB); + cc.evex().vmovdqu32(ymmA, m); + cc.evex().vmovdqu32(m, ymmB); + cc.evex().vmovdqu32(zmmA, m); + cc.evex().vmovdqu32(m, zmmB); + cc.evex().vmovdqu64(xmmA, m); + cc.evex().vmovdqu64(m, xmmB); + cc.evex().vmovdqu64(ymmA, m); + cc.evex().vmovdqu64(m, ymmB); + cc.evex().vmovdqu64(zmmA, m); + cc.evex().vmovdqu64(m, zmmB); + cc.evex().vmovdqu8(xmmA, m); + cc.evex().vmovdqu8(m, xmmB); + cc.evex().vmovdqu8(ymmA, m); + cc.evex().vmovdqu8(m, ymmB); + cc.evex().vmovdqu8(zmmA, m); + cc.evex().vmovdqu8(m, zmmB); + cc.evex().vmovhpd(m, xmmB); + cc.evex().vmovhpd(xmmA, xmmB, m); + cc.evex().vmovhps(m, xmmB); + cc.evex().vmovhps(xmmA, xmmB, m); + cc.evex().vmovlpd(m, xmmB); + cc.evex().vmovlpd(xmmA, xmmB, m); + cc.evex().vmovlps(m, xmmB); + cc.evex().vmovlps(xmmA, xmmB, m); + cc.evex().vmovntdq(m, xmmB); + cc.evex().vmovntdq(m, ymmB); + cc.evex().vmovntdq(m, zmmB); + cc.evex().vmovntdqa(xmmA, m); + cc.evex().vmovntdqa(ymmA, m); + cc.evex().vmovntdqa(zmmA, m); + cc.evex().vmovntpd(m, xmmB); + cc.evex().vmovntpd(m, ymmB); + cc.evex().vmovntpd(m, zmmB); + cc.evex().vmovntps(m, xmmB); + cc.evex().vmovntps(m, ymmB); + cc.evex().vmovntps(m, zmmB); + cc.evex().vmovq(m, xmmB); + cc.evex().vmovq(xmmA, m); + cc.evex().vmovq(xmmA, m); + cc.evex().vmovq(m, xmmB); + cc.evex().vmovsd(m, xmmB); + cc.evex().vmovsd(xmmA, m); + cc.evex().vmovshdup(xmmA, m); + cc.evex().vmovshdup(ymmA, m); + cc.evex().vmovshdup(zmmA, m); + cc.evex().vmovsldup(xmmA, m); + cc.evex().vmovsldup(ymmA, m); + cc.evex().vmovsldup(zmmA, m); + cc.evex().vmovss(m, xmmB); + cc.evex().vmovss(xmmA, m); + cc.evex().vmovupd(xmmA, m); + cc.evex().vmovupd(m, xmmB); + cc.evex().vmovupd(ymmA, m); + cc.evex().vmovupd(m, ymmB); + cc.evex().vmovupd(zmmA, m); + cc.evex().vmovupd(m, zmmB); + cc.evex().vmovups(xmmA, m); + cc.evex().vmovups(m, xmmB); + cc.evex().vmovups(ymmA, m); + cc.evex().vmovups(m, ymmB); + cc.evex().vmovups(zmmA, m); + cc.evex().vmovups(m, zmmB); + cc.evex().vmulpd(xmmA, xmmB, m); + cc.evex().vmulpd(ymmA, ymmB, m); + cc.evex().vmulpd(zmmA, zmmB, m); + cc.evex().vmulps(xmmA, xmmB, m); + cc.evex().vmulps(ymmA, ymmB, m); + cc.evex().vmulps(zmmA, zmmB, m); + cc.evex().vmulsd(xmmA, xmmB, m); + cc.evex().vmulss(xmmA, xmmB, m); + cc.evex().vorpd(xmmA, xmmB, m); + cc.evex().vorpd(ymmA, ymmB, m); + cc.evex().vorpd(zmmA, zmmB, m); + cc.evex().vorps(xmmA, xmmB, m); + cc.evex().vorps(ymmA, ymmB, m); + cc.evex().vorps(zmmA, zmmB, m); + cc.evex().vpabsb(xmmA, m); + cc.evex().vpabsb(ymmA, m); + cc.evex().vpabsb(zmmA, m); + cc.evex().vpabsd(xmmA, m); + cc.evex().vpabsd(ymmA, m); + cc.evex().vpabsd(zmmA, m); + cc.evex().vpabsq(xmmA, m); + cc.evex().vpabsq(ymmA, m); + cc.evex().vpabsq(zmmA, m); + cc.evex().vpabsw(xmmA, m); + cc.evex().vpabsw(ymmA, m); + cc.evex().vpabsw(zmmA, m); + cc.evex().vpackssdw(xmmA, xmmB, m); + cc.evex().vpackssdw(ymmA, ymmB, m); + cc.evex().vpackssdw(zmmA, zmmB, m); + cc.evex().vpacksswb(xmmA, xmmB, m); + cc.evex().vpacksswb(ymmA, ymmB, m); + cc.evex().vpacksswb(zmmA, zmmB, m); + cc.evex().vpackusdw(xmmA, xmmB, m); + cc.evex().vpackusdw(ymmA, ymmB, m); + cc.evex().vpackusdw(zmmA, zmmB, m); + cc.evex().vpackuswb(xmmA, xmmB, m); + cc.evex().vpackuswb(ymmA, ymmB, m); + cc.evex().vpackuswb(zmmA, zmmB, m); + cc.evex().vpaddb(xmmA, xmmB, m); + cc.evex().vpaddb(ymmA, ymmB, m); + cc.evex().vpaddb(zmmA, zmmB, m); + cc.evex().vpaddd(xmmA, xmmB, m); + cc.evex().vpaddd(ymmA, ymmB, m); + cc.evex().vpaddd(zmmA, zmmB, m); + cc.evex().vpaddq(xmmA, xmmB, m); + cc.evex().vpaddq(ymmA, ymmB, m); + cc.evex().vpaddq(zmmA, zmmB, m); + cc.evex().vpaddsb(xmmA, xmmB, m); + cc.evex().vpaddsb(ymmA, ymmB, m); + cc.evex().vpaddsb(zmmA, zmmB, m); + cc.evex().vpaddsw(xmmA, xmmB, m); + cc.evex().vpaddsw(ymmA, ymmB, m); + cc.evex().vpaddsw(zmmA, zmmB, m); + cc.evex().vpaddusb(xmmA, xmmB, m); + cc.evex().vpaddusb(ymmA, ymmB, m); + cc.evex().vpaddusb(zmmA, zmmB, m); + cc.evex().vpaddusw(xmmA, xmmB, m); + cc.evex().vpaddusw(ymmA, ymmB, m); + cc.evex().vpaddusw(zmmA, zmmB, m); + cc.evex().vpaddw(xmmA, xmmB, m); + cc.evex().vpaddw(ymmA, ymmB, m); + cc.evex().vpaddw(zmmA, zmmB, m); + cc.evex().vpalignr(xmmA, xmmB, m, 0); + cc.evex().vpalignr(ymmA, ymmB, m, 0); + cc.evex().vpalignr(zmmA, zmmB, m, 0); + cc.evex().vpandd(xmmA, xmmB, m); + cc.evex().vpandd(ymmA, ymmB, m); + cc.evex().vpandd(zmmA, zmmB, m); + cc.evex().vpandnd(xmmA, xmmB, m); + cc.evex().vpandnd(ymmA, ymmB, m); + cc.evex().vpandnd(zmmA, zmmB, m); + cc.evex().vpandnq(xmmA, xmmB, m); + cc.evex().vpandnq(ymmA, ymmB, m); + cc.evex().vpandnq(zmmA, zmmB, m); + cc.evex().vpandq(xmmA, xmmB, m); + cc.evex().vpandq(ymmA, ymmB, m); + cc.evex().vpandq(zmmA, zmmB, m); + cc.evex().vpavgb(xmmA, xmmB, m); + cc.evex().vpavgb(ymmA, ymmB, m); + cc.evex().vpavgb(zmmA, zmmB, m); + cc.evex().vpavgw(xmmA, xmmB, m); + cc.evex().vpavgw(ymmA, ymmB, m); + cc.evex().vpavgw(zmmA, zmmB, m); + cc.evex().vpblendmb(xmmA, xmmB, m); + cc.evex().vpblendmb(ymmA, ymmB, m); + cc.evex().vpblendmb(zmmA, zmmB, m); + cc.evex().vpblendmd(xmmA, xmmB, m); + cc.evex().vpblendmd(ymmA, ymmB, m); + cc.evex().vpblendmd(zmmA, zmmB, m); + cc.evex().vpblendmq(xmmA, xmmB, m); + cc.evex().vpblendmq(ymmA, ymmB, m); + cc.evex().vpblendmq(zmmA, zmmB, m); + cc.evex().vpblendmw(xmmA, xmmB, m); + cc.evex().vpblendmw(ymmA, ymmB, m); + cc.evex().vpblendmw(zmmA, zmmB, m); + cc.evex().vpbroadcastb(xmmA, m); + cc.evex().vpbroadcastb(ymmA, m); + cc.evex().vpbroadcastb(zmmA, m); + cc.evex().vpbroadcastd(xmmA, m); + cc.evex().vpbroadcastd(ymmA, m); + cc.evex().vpbroadcastd(zmmA, m); + cc.evex().vpbroadcastq(xmmA, m); + cc.evex().vpbroadcastq(ymmA, m); + cc.evex().vpbroadcastq(zmmA, m); + cc.evex().vpbroadcastw(xmmA, m); + cc.evex().vpbroadcastw(ymmA, m); + cc.evex().vpbroadcastw(zmmA, m); + cc.evex().vpcmpb(kA, xmmB, m, 0); + cc.evex().vpcmpb(kA, ymmB, m, 0); + cc.evex().vpcmpb(kA, zmmB, m, 0); + cc.evex().vpcmpd(kA, xmmB, m, 0); + cc.evex().vpcmpd(kA, ymmB, m, 0); + cc.evex().vpcmpd(kA, zmmB, m, 0); + cc.evex().vpcmpeqb(kA, xmmB, m); + cc.evex().vpcmpeqb(kA, ymmB, m); + cc.evex().vpcmpeqb(kA, zmmB, m); + cc.evex().vpcmpeqd(kA, xmmB, m); + cc.evex().vpcmpeqd(kA, ymmB, m); + cc.evex().vpcmpeqd(kA, zmmB, m); + cc.evex().vpcmpeqq(kA, xmmB, m); + cc.evex().vpcmpeqq(kA, ymmB, m); + cc.evex().vpcmpeqq(kA, zmmB, m); + cc.evex().vpcmpeqw(kA, xmmB, m); + cc.evex().vpcmpeqw(kA, ymmB, m); + cc.evex().vpcmpeqw(kA, zmmB, m); + cc.evex().vpcmpgtb(kA, xmmB, m); + cc.evex().vpcmpgtb(kA, ymmB, m); + cc.evex().vpcmpgtb(kA, zmmB, m); + cc.evex().vpcmpgtd(kA, xmmB, m); + cc.evex().vpcmpgtd(kA, ymmB, m); + cc.evex().vpcmpgtd(kA, zmmB, m); + cc.evex().vpcmpgtq(kA, xmmB, m); + cc.evex().vpcmpgtq(kA, ymmB, m); + cc.evex().vpcmpgtq(kA, zmmB, m); + cc.evex().vpcmpgtw(kA, xmmB, m); + cc.evex().vpcmpgtw(kA, ymmB, m); + cc.evex().vpcmpgtw(kA, zmmB, m); + cc.evex().vpcmpq(kA, xmmB, m, 0); + cc.evex().vpcmpq(kA, ymmB, m, 0); + cc.evex().vpcmpq(kA, zmmB, m, 0); + cc.evex().vpcmpub(kA, xmmB, m, 0); + cc.evex().vpcmpub(kA, ymmB, m, 0); + cc.evex().vpcmpub(kA, zmmB, m, 0); + cc.evex().vpcmpud(kA, xmmB, m, 0); + cc.evex().vpcmpud(kA, ymmB, m, 0); + cc.evex().vpcmpud(kA, zmmB, m, 0); + cc.evex().vpcmpuq(kA, xmmB, m, 0); + cc.evex().vpcmpuq(kA, ymmB, m, 0); + cc.evex().vpcmpuq(kA, zmmB, m, 0); + cc.evex().vpcmpuw(kA, xmmB, m, 0); + cc.evex().vpcmpuw(kA, ymmB, m, 0); + cc.evex().vpcmpuw(kA, zmmB, m, 0); + cc.evex().vpcmpw(kA, xmmB, m, 0); + cc.evex().vpcmpw(kA, ymmB, m, 0); + cc.evex().vpcmpw(kA, zmmB, m, 0); + cc.evex().vpcompressd(m, xmmB); + cc.evex().vpcompressd(m, ymmB); + cc.evex().vpcompressd(m, zmmB); + cc.evex().vpcompressq(m, xmmB); + cc.evex().vpcompressq(m, ymmB); + cc.evex().vpcompressq(m, zmmB); + cc.evex().vpconflictd(xmmA, m); + cc.evex().vpconflictd(ymmA, m); + cc.evex().vpconflictd(zmmA, m); + cc.evex().vpconflictq(xmmA, m); + cc.evex().vpconflictq(ymmA, m); + cc.evex().vpconflictq(zmmA, m); + cc.evex().vpermb(xmmA, xmmB, m); + cc.evex().vpermb(ymmA, ymmB, m); + cc.evex().vpermb(zmmA, zmmB, m); + cc.evex().vpermd(ymmA, ymmB, m); + cc.evex().vpermd(zmmA, zmmB, m); + cc.evex().vpermi2b(xmmA, xmmB, m); + cc.evex().vpermi2b(ymmA, ymmB, m); + cc.evex().vpermi2b(zmmA, zmmB, m); + cc.evex().vpermi2d(xmmA, xmmB, m); + cc.evex().vpermi2d(ymmA, ymmB, m); + cc.evex().vpermi2d(zmmA, zmmB, m); + cc.evex().vpermi2pd(xmmA, xmmB, m); + cc.evex().vpermi2pd(ymmA, ymmB, m); + cc.evex().vpermi2pd(zmmA, zmmB, m); + cc.evex().vpermi2ps(xmmA, xmmB, m); + cc.evex().vpermi2ps(ymmA, ymmB, m); + cc.evex().vpermi2ps(zmmA, zmmB, m); + cc.evex().vpermi2q(xmmA, xmmB, m); + cc.evex().vpermi2q(ymmA, ymmB, m); + cc.evex().vpermi2q(zmmA, zmmB, m); + cc.evex().vpermi2w(xmmA, xmmB, m); + cc.evex().vpermi2w(ymmA, ymmB, m); + cc.evex().vpermi2w(zmmA, zmmB, m); + cc.evex().vpermilpd(xmmA, xmmB, m); + cc.evex().vpermilpd(ymmA, ymmB, m); + cc.evex().vpermilpd(zmmA, zmmB, m); + cc.evex().vpermilpd(xmmA, m, 0); + cc.evex().vpermilpd(ymmA, m, 0); + cc.evex().vpermilpd(zmmA, m, 0); + cc.evex().vpermilps(xmmA, xmmB, m); + cc.evex().vpermilps(ymmA, ymmB, m); + cc.evex().vpermilps(zmmA, zmmB, m); + cc.evex().vpermilps(xmmA, m, 0); + cc.evex().vpermilps(ymmA, m, 0); + cc.evex().vpermilps(zmmA, m, 0); + cc.evex().vpermq(ymmA, ymmB, m); + cc.evex().vpermq(zmmA, zmmB, m); + cc.evex().vpermq(ymmA, m, 0); + cc.evex().vpermq(zmmA, m, 0); + cc.evex().vpermt2b(xmmA, xmmB, m); + cc.evex().vpermt2b(ymmA, ymmB, m); + cc.evex().vpermt2b(zmmA, zmmB, m); + cc.evex().vpermt2d(xmmA, xmmB, m); + cc.evex().vpermt2d(ymmA, ymmB, m); + cc.evex().vpermt2d(zmmA, zmmB, m); + cc.evex().vpermt2pd(xmmA, xmmB, m); + cc.evex().vpermt2pd(ymmA, ymmB, m); + cc.evex().vpermt2pd(zmmA, zmmB, m); + cc.evex().vpermt2ps(xmmA, xmmB, m); + cc.evex().vpermt2ps(ymmA, ymmB, m); + cc.evex().vpermt2ps(zmmA, zmmB, m); + cc.evex().vpermt2q(xmmA, xmmB, m); + cc.evex().vpermt2q(ymmA, ymmB, m); + cc.evex().vpermt2q(zmmA, zmmB, m); + cc.evex().vpermt2w(xmmA, xmmB, m); + cc.evex().vpermt2w(ymmA, ymmB, m); + cc.evex().vpermt2w(zmmA, zmmB, m); + cc.evex().vpermw(xmmA, xmmB, m); + cc.evex().vpermw(ymmA, ymmB, m); + cc.evex().vpermw(zmmA, zmmB, m); + cc.evex().vpexpandd(xmmA, m); + cc.evex().vpexpandd(ymmA, m); + cc.evex().vpexpandd(zmmA, m); + cc.evex().vpexpandq(xmmA, m); + cc.evex().vpexpandq(ymmA, m); + cc.evex().vpexpandq(zmmA, m); + cc.evex().vpextrb(m, xmmB, 0); + cc.evex().vpextrd(m, xmmB, 0); + if (cc.is64Bit()) cc.evex().vpextrq(m, xmmB, 0); + cc.evex().vpextrw(m, xmmB, 0); + cc.evex().k(kA).vpgatherdd(xmmA, vx_ptr); + cc.evex().k(kA).vpgatherdd(ymmA, vy_ptr); + cc.evex().k(kA).vpgatherdd(zmmA, vz_ptr); + cc.evex().k(kA).vpgatherdq(xmmA, vx_ptr); + cc.evex().k(kA).vpgatherdq(ymmA, vx_ptr); + cc.evex().k(kA).vpgatherdq(zmmA, vy_ptr); + cc.evex().k(kA).vpgatherqd(xmmA, vx_ptr); + cc.evex().k(kA).vpgatherqd(xmmA, vy_ptr); + cc.evex().k(kA).vpgatherqd(ymmA, vz_ptr); + cc.evex().k(kA).vpgatherqq(xmmA, vx_ptr); + cc.evex().k(kA).vpgatherqq(ymmA, vy_ptr); + cc.evex().k(kA).vpgatherqq(zmmA, vz_ptr); + cc.evex().vpinsrb(xmmA, xmmB, m, 0); + cc.evex().vpinsrd(xmmA, xmmB, m, 0); + if (cc.is64Bit()) cc.evex().vpinsrq(xmmA, xmmB, m, 0); + cc.evex().vpinsrw(xmmA, xmmB, m, 0); + cc.evex().vplzcntd(xmmA, m); + cc.evex().vplzcntd(ymmA, m); + cc.evex().vplzcntd(zmmA, m); + cc.evex().vplzcntq(xmmA, m); + cc.evex().vplzcntq(ymmA, m); + cc.evex().vplzcntq(zmmA, m); + cc.evex().vpmadd52huq(xmmA, xmmB, m); + cc.evex().vpmadd52huq(ymmA, ymmB, m); + cc.evex().vpmadd52huq(zmmA, zmmB, m); + cc.evex().vpmadd52luq(xmmA, xmmB, m); + cc.evex().vpmadd52luq(ymmA, ymmB, m); + cc.evex().vpmadd52luq(zmmA, zmmB, m); + cc.evex().vpmaddubsw(xmmA, xmmB, m); + cc.evex().vpmaddubsw(ymmA, ymmB, m); + cc.evex().vpmaddubsw(zmmA, zmmB, m); + cc.evex().vpmaddwd(xmmA, xmmB, m); + cc.evex().vpmaddwd(ymmA, ymmB, m); + cc.evex().vpmaddwd(zmmA, zmmB, m); + cc.evex().vpmaxsb(xmmA, xmmB, m); + cc.evex().vpmaxsb(ymmA, ymmB, m); + cc.evex().vpmaxsb(zmmA, zmmB, m); + cc.evex().vpmaxsd(xmmA, xmmB, m); + cc.evex().vpmaxsd(ymmA, ymmB, m); + cc.evex().vpmaxsd(zmmA, zmmB, m); + cc.evex().vpmaxsq(xmmA, xmmB, m); + cc.evex().vpmaxsq(ymmA, ymmB, m); + cc.evex().vpmaxsq(zmmA, zmmB, m); + cc.evex().vpmaxsw(xmmA, xmmB, m); + cc.evex().vpmaxsw(ymmA, ymmB, m); + cc.evex().vpmaxsw(zmmA, zmmB, m); + cc.evex().vpmaxub(xmmA, xmmB, m); + cc.evex().vpmaxub(ymmA, ymmB, m); + cc.evex().vpmaxub(zmmA, zmmB, m); + cc.evex().vpmaxud(xmmA, xmmB, m); + cc.evex().vpmaxud(ymmA, ymmB, m); + cc.evex().vpmaxud(zmmA, zmmB, m); + cc.evex().vpmaxuq(xmmA, xmmB, m); + cc.evex().vpmaxuq(ymmA, ymmB, m); + cc.evex().vpmaxuq(zmmA, zmmB, m); + cc.evex().vpmaxuw(xmmA, xmmB, m); + cc.evex().vpmaxuw(ymmA, ymmB, m); + cc.evex().vpmaxuw(zmmA, zmmB, m); + cc.evex().vpminsb(xmmA, xmmB, m); + cc.evex().vpminsb(ymmA, ymmB, m); + cc.evex().vpminsb(zmmA, zmmB, m); + cc.evex().vpminsd(xmmA, xmmB, m); + cc.evex().vpminsd(ymmA, ymmB, m); + cc.evex().vpminsd(zmmA, zmmB, m); + cc.evex().vpminsq(xmmA, xmmB, m); + cc.evex().vpminsq(ymmA, ymmB, m); + cc.evex().vpminsq(zmmA, zmmB, m); + cc.evex().vpminsw(xmmA, xmmB, m); + cc.evex().vpminsw(ymmA, ymmB, m); + cc.evex().vpminsw(zmmA, zmmB, m); + cc.evex().vpminub(xmmA, xmmB, m); + cc.evex().vpminub(ymmA, ymmB, m); + cc.evex().vpminub(zmmA, zmmB, m); + cc.evex().vpminud(xmmA, xmmB, m); + cc.evex().vpminud(ymmA, ymmB, m); + cc.evex().vpminud(zmmA, zmmB, m); + cc.evex().vpminuq(xmmA, xmmB, m); + cc.evex().vpminuq(ymmA, ymmB, m); + cc.evex().vpminuq(zmmA, zmmB, m); + cc.evex().vpminuw(xmmA, xmmB, m); + cc.evex().vpminuw(ymmA, ymmB, m); + cc.evex().vpminuw(zmmA, zmmB, m); + cc.evex().vpmovdb(m, xmmB); + cc.evex().vpmovdb(m, ymmB); + cc.evex().vpmovdb(m, zmmB); + cc.evex().vpmovdw(m, xmmB); + cc.evex().vpmovdw(m, ymmB); + cc.evex().vpmovdw(m, zmmB); + cc.evex().vpmovqb(m, xmmB); + cc.evex().vpmovqb(m, ymmB); + cc.evex().vpmovqb(m, zmmB); + cc.evex().vpmovqd(m, xmmB); + cc.evex().vpmovqd(m, ymmB); + cc.evex().vpmovqd(m, zmmB); + cc.evex().vpmovqw(m, xmmB); + cc.evex().vpmovqw(m, ymmB); + cc.evex().vpmovqw(m, zmmB); + cc.evex().vpmovsdb(m, xmmB); + cc.evex().vpmovsdb(m, ymmB); + cc.evex().vpmovsdb(m, zmmB); + cc.evex().vpmovsdw(m, xmmB); + cc.evex().vpmovsdw(m, ymmB); + cc.evex().vpmovsdw(m, zmmB); + cc.evex().vpmovsqb(m, xmmB); + cc.evex().vpmovsqb(m, ymmB); + cc.evex().vpmovsqb(m, zmmB); + cc.evex().vpmovsqd(m, xmmB); + cc.evex().vpmovsqd(m, ymmB); + cc.evex().vpmovsqd(m, zmmB); + cc.evex().vpmovsqw(m, xmmB); + cc.evex().vpmovsqw(m, ymmB); + cc.evex().vpmovsqw(m, zmmB); + cc.evex().vpmovswb(m, xmmB); + cc.evex().vpmovswb(m, ymmB); + cc.evex().vpmovswb(m, zmmB); + cc.evex().vpmovsxbd(xmmA, m); + cc.evex().vpmovsxbd(ymmA, m); + cc.evex().vpmovsxbd(zmmA, m); + cc.evex().vpmovsxbq(xmmA, m); + cc.evex().vpmovsxbq(ymmA, m); + cc.evex().vpmovsxbq(zmmA, m); + cc.evex().vpmovsxbw(xmmA, m); + cc.evex().vpmovsxbw(ymmA, m); + cc.evex().vpmovsxbw(zmmA, m); + cc.evex().vpmovsxdq(xmmA, m); + cc.evex().vpmovsxdq(ymmA, m); + cc.evex().vpmovsxdq(zmmA, m); + cc.evex().vpmovsxwd(xmmA, m); + cc.evex().vpmovsxwd(ymmA, m); + cc.evex().vpmovsxwd(zmmA, m); + cc.evex().vpmovsxwq(xmmA, m); + cc.evex().vpmovsxwq(ymmA, m); + cc.evex().vpmovsxwq(zmmA, m); + cc.evex().vpmovusdb(m, xmmB); + cc.evex().vpmovusdb(m, ymmB); + cc.evex().vpmovusdb(m, zmmB); + cc.evex().vpmovusdw(m, xmmB); + cc.evex().vpmovusdw(m, ymmB); + cc.evex().vpmovusdw(m, zmmB); + cc.evex().vpmovusqb(m, xmmB); + cc.evex().vpmovusqb(m, ymmB); + cc.evex().vpmovusqb(m, zmmB); + cc.evex().vpmovusqd(m, xmmB); + cc.evex().vpmovusqd(m, ymmB); + cc.evex().vpmovusqd(m, zmmB); + cc.evex().vpmovusqw(m, xmmB); + cc.evex().vpmovusqw(m, ymmB); + cc.evex().vpmovusqw(m, zmmB); + cc.evex().vpmovuswb(m, xmmB); + cc.evex().vpmovuswb(m, ymmB); + cc.evex().vpmovuswb(m, zmmB); + cc.evex().vpmovwb(m, xmmB); + cc.evex().vpmovwb(m, ymmB); + cc.evex().vpmovwb(m, zmmB); + cc.evex().vpmovzxbd(xmmA, m); + cc.evex().vpmovzxbd(ymmA, m); + cc.evex().vpmovzxbd(zmmA, m); + cc.evex().vpmovzxbq(xmmA, m); + cc.evex().vpmovzxbq(ymmA, m); + cc.evex().vpmovzxbq(zmmA, m); + cc.evex().vpmovzxbw(xmmA, m); + cc.evex().vpmovzxbw(ymmA, m); + cc.evex().vpmovzxbw(zmmA, m); + cc.evex().vpmovzxdq(xmmA, m); + cc.evex().vpmovzxdq(ymmA, m); + cc.evex().vpmovzxdq(zmmA, m); + cc.evex().vpmovzxwd(xmmA, m); + cc.evex().vpmovzxwd(ymmA, m); + cc.evex().vpmovzxwd(zmmA, m); + cc.evex().vpmovzxwq(xmmA, m); + cc.evex().vpmovzxwq(ymmA, m); + cc.evex().vpmovzxwq(zmmA, m); + cc.evex().vpmuldq(xmmA, xmmB, m); + cc.evex().vpmuldq(ymmA, ymmB, m); + cc.evex().vpmuldq(zmmA, zmmB, m); + cc.evex().vpmulhrsw(xmmA, xmmB, m); + cc.evex().vpmulhrsw(ymmA, ymmB, m); + cc.evex().vpmulhrsw(zmmA, zmmB, m); + cc.evex().vpmulhuw(xmmA, xmmB, m); + cc.evex().vpmulhuw(ymmA, ymmB, m); + cc.evex().vpmulhuw(zmmA, zmmB, m); + cc.evex().vpmulhw(xmmA, xmmB, m); + cc.evex().vpmulhw(ymmA, ymmB, m); + cc.evex().vpmulhw(zmmA, zmmB, m); + cc.evex().vpmulld(xmmA, xmmB, m); + cc.evex().vpmulld(ymmA, ymmB, m); + cc.evex().vpmulld(zmmA, zmmB, m); + cc.evex().vpmullq(xmmA, xmmB, m); + cc.evex().vpmullq(ymmA, ymmB, m); + cc.evex().vpmullq(zmmA, zmmB, m); + cc.evex().vpmullw(xmmA, xmmB, m); + cc.evex().vpmullw(ymmA, ymmB, m); + cc.evex().vpmullw(zmmA, zmmB, m); + cc.evex().vpmultishiftqb(xmmA, xmmB, m); + cc.evex().vpmultishiftqb(ymmA, ymmB, m); + cc.evex().vpmultishiftqb(zmmA, zmmB, m); + cc.evex().vpmuludq(xmmA, xmmB, m); + cc.evex().vpmuludq(ymmA, ymmB, m); + cc.evex().vpmuludq(zmmA, zmmB, m); + cc.evex().vpopcntd(zmmA, m); + cc.evex().vpopcntq(zmmA, m); + cc.evex().vpord(xmmA, xmmB, m); + cc.evex().vpord(ymmA, ymmB, m); + cc.evex().vpord(zmmA, zmmB, m); + cc.evex().vporq(xmmA, xmmB, m); + cc.evex().vporq(ymmA, ymmB, m); + cc.evex().vporq(zmmA, zmmB, m); + cc.evex().vprold(xmmA, m, 0); + cc.evex().vprold(ymmA, m, 0); + cc.evex().vprold(zmmA, m, 0); + cc.evex().vprolq(xmmA, m, 0); + cc.evex().vprolq(ymmA, m, 0); + cc.evex().vprolq(zmmA, m, 0); + cc.evex().vprolvd(xmmA, xmmB, m); + cc.evex().vprolvd(ymmA, ymmB, m); + cc.evex().vprolvd(zmmA, zmmB, m); + cc.evex().vprolvq(xmmA, xmmB, m); + cc.evex().vprolvq(ymmA, ymmB, m); + cc.evex().vprolvq(zmmA, zmmB, m); + cc.evex().vprord(xmmA, m, 0); + cc.evex().vprord(ymmA, m, 0); + cc.evex().vprord(zmmA, m, 0); + cc.evex().vprorq(xmmA, m, 0); + cc.evex().vprorq(ymmA, m, 0); + cc.evex().vprorq(zmmA, m, 0); + cc.evex().vprorvd(xmmA, xmmB, m); + cc.evex().vprorvd(ymmA, ymmB, m); + cc.evex().vprorvd(zmmA, zmmB, m); + cc.evex().vprorvq(xmmA, xmmB, m); + cc.evex().vprorvq(ymmA, ymmB, m); + cc.evex().vprorvq(zmmA, zmmB, m); + cc.evex().vpsadbw(xmmA, xmmB, m); + cc.evex().vpsadbw(ymmA, ymmB, m); + cc.evex().vpsadbw(zmmA, zmmB, m); + cc.evex().k(kA).vpscatterdd(vx_ptr, xmmB); + cc.evex().k(kA).vpscatterdd(vy_ptr, ymmB); + cc.evex().k(kA).vpscatterdd(vz_ptr, zmmB); + cc.evex().k(kA).vpscatterdq(vx_ptr, xmmB); + cc.evex().k(kA).vpscatterdq(vx_ptr, ymmB); + cc.evex().k(kA).vpscatterdq(vy_ptr, zmmB); + cc.evex().k(kA).vpscatterqd(vx_ptr, xmmB); + cc.evex().k(kA).vpscatterqd(vy_ptr, xmmB); + cc.evex().k(kA).vpscatterqd(vz_ptr, ymmB); + cc.evex().k(kA).vpscatterqq(vx_ptr, xmmB); + cc.evex().k(kA).vpscatterqq(vy_ptr, ymmB); + cc.evex().k(kA).vpscatterqq(vz_ptr, zmmB); + cc.evex().vpshufb(xmmA, xmmB, m); + cc.evex().vpshufb(ymmA, ymmB, m); + cc.evex().vpshufb(zmmA, zmmB, m); + cc.evex().vpshufd(xmmA, m, 0); + cc.evex().vpshufd(ymmA, m, 0); + cc.evex().vpshufd(zmmA, m, 0); + cc.evex().vpshufhw(xmmA, m, 0); + cc.evex().vpshufhw(ymmA, m, 0); + cc.evex().vpshufhw(zmmA, m, 0); + cc.evex().vpshuflw(xmmA, m, 0); + cc.evex().vpshuflw(ymmA, m, 0); + cc.evex().vpshuflw(zmmA, m, 0); + cc.evex().vpslld(xmmA, xmmB, m); + cc.evex().vpslld(xmmA, m, 0); + cc.evex().vpslld(ymmA, ymmB, m); + cc.evex().vpslld(ymmA, m, 0); + cc.evex().vpslld(zmmA, zmmB, m); + cc.evex().vpslld(zmmA, m, 0); + cc.evex().vpslldq(xmmA, m, 0); + cc.evex().vpslldq(ymmA, m, 0); + cc.evex().vpslldq(zmmA, m, 0); + cc.evex().vpsllq(xmmA, xmmB, m); + cc.evex().vpsllq(xmmA, m, 0); + cc.evex().vpsllq(ymmA, ymmB, m); + cc.evex().vpsllq(ymmA, m, 0); + cc.evex().vpsllq(zmmA, zmmB, m); + cc.evex().vpsllq(zmmA, m, 0); + cc.evex().vpsllvd(xmmA, xmmB, m); + cc.evex().vpsllvd(ymmA, ymmB, m); + cc.evex().vpsllvd(zmmA, zmmB, m); + cc.evex().vpsllvq(xmmA, xmmB, m); + cc.evex().vpsllvq(ymmA, ymmB, m); + cc.evex().vpsllvq(zmmA, zmmB, m); + cc.evex().vpsllvw(xmmA, xmmB, m); + cc.evex().vpsllvw(ymmA, ymmB, m); + cc.evex().vpsllvw(zmmA, zmmB, m); + cc.evex().vpsllw(xmmA, xmmB, m); + cc.evex().vpsllw(xmmA, m, 0); + cc.evex().vpsllw(ymmA, ymmB, m); + cc.evex().vpsllw(ymmA, m, 0); + cc.evex().vpsllw(zmmA, zmmB, m); + cc.evex().vpsllw(zmmA, m, 0); + cc.evex().vpsrad(xmmA, xmmB, m); + cc.evex().vpsrad(xmmA, m, 0); + cc.evex().vpsrad(ymmA, ymmB, m); + cc.evex().vpsrad(ymmA, m, 0); + cc.evex().vpsrad(zmmA, zmmB, m); + cc.evex().vpsrad(zmmA, m, 0); + cc.evex().vpsraq(xmmA, xmmB, m); + cc.evex().vpsraq(xmmA, m, 0); + cc.evex().vpsraq(ymmA, ymmB, m); + cc.evex().vpsraq(ymmA, m, 0); + cc.evex().vpsraq(zmmA, zmmB, m); + cc.evex().vpsraq(zmmA, m, 0); + cc.evex().vpsravd(xmmA, xmmB, m); + cc.evex().vpsravd(ymmA, ymmB, m); + cc.evex().vpsravd(zmmA, zmmB, m); + cc.evex().vpsravq(xmmA, xmmB, m); + cc.evex().vpsravq(ymmA, ymmB, m); + cc.evex().vpsravq(zmmA, zmmB, m); + cc.evex().vpsravw(xmmA, xmmB, m); + cc.evex().vpsravw(ymmA, ymmB, m); + cc.evex().vpsravw(zmmA, zmmB, m); + cc.evex().vpsraw(xmmA, xmmB, m); + cc.evex().vpsraw(xmmA, m, 0); + cc.evex().vpsraw(ymmA, ymmB, m); + cc.evex().vpsraw(ymmA, m, 0); + cc.evex().vpsraw(zmmA, zmmB, m); + cc.evex().vpsraw(zmmA, m, 0); + cc.evex().vpsrld(xmmA, xmmB, m); + cc.evex().vpsrld(xmmA, m, 0); + cc.evex().vpsrld(ymmA, ymmB, m); + cc.evex().vpsrld(ymmA, m, 0); + cc.evex().vpsrld(zmmA, zmmB, m); + cc.evex().vpsrld(zmmA, m, 0); + cc.evex().vpsrldq(xmmA, m, 0); + cc.evex().vpsrldq(ymmA, m, 0); + cc.evex().vpsrldq(zmmA, m, 0); + cc.evex().vpsrlq(xmmA, xmmB, m); + cc.evex().vpsrlq(xmmA, m, 0); + cc.evex().vpsrlq(ymmA, ymmB, m); + cc.evex().vpsrlq(ymmA, m, 0); + cc.evex().vpsrlq(zmmA, zmmB, m); + cc.evex().vpsrlq(zmmA, m, 0); + cc.evex().vpsrlvd(xmmA, xmmB, m); + cc.evex().vpsrlvd(ymmA, ymmB, m); + cc.evex().vpsrlvd(zmmA, zmmB, m); + cc.evex().vpsrlvq(xmmA, xmmB, m); + cc.evex().vpsrlvq(ymmA, ymmB, m); + cc.evex().vpsrlvq(zmmA, zmmB, m); + cc.evex().vpsrlvw(xmmA, xmmB, m); + cc.evex().vpsrlvw(ymmA, ymmB, m); + cc.evex().vpsrlvw(zmmA, zmmB, m); + cc.evex().vpsrlw(xmmA, xmmB, m); + cc.evex().vpsrlw(xmmA, m, 0); + cc.evex().vpsrlw(ymmA, ymmB, m); + cc.evex().vpsrlw(ymmA, m, 0); + cc.evex().vpsrlw(zmmA, zmmB, m); + cc.evex().vpsrlw(zmmA, m, 0); + cc.evex().vpsubb(xmmA, xmmB, m); + cc.evex().vpsubb(ymmA, ymmB, m); + cc.evex().vpsubb(zmmA, zmmB, m); + cc.evex().vpsubd(xmmA, xmmB, m); + cc.evex().vpsubd(ymmA, ymmB, m); + cc.evex().vpsubd(zmmA, zmmB, m); + cc.evex().vpsubq(xmmA, xmmB, m); + cc.evex().vpsubq(ymmA, ymmB, m); + cc.evex().vpsubq(zmmA, zmmB, m); + cc.evex().vpsubsb(xmmA, xmmB, m); + cc.evex().vpsubsb(ymmA, ymmB, m); + cc.evex().vpsubsb(zmmA, zmmB, m); + cc.evex().vpsubsw(xmmA, xmmB, m); + cc.evex().vpsubsw(ymmA, ymmB, m); + cc.evex().vpsubsw(zmmA, zmmB, m); + cc.evex().vpsubusb(xmmA, xmmB, m); + cc.evex().vpsubusb(ymmA, ymmB, m); + cc.evex().vpsubusb(zmmA, zmmB, m); + cc.evex().vpsubusw(xmmA, xmmB, m); + cc.evex().vpsubusw(ymmA, ymmB, m); + cc.evex().vpsubusw(zmmA, zmmB, m); + cc.evex().vpsubw(xmmA, xmmB, m); + cc.evex().vpsubw(ymmA, ymmB, m); + cc.evex().vpsubw(zmmA, zmmB, m); + cc.evex().vpternlogd(xmmA, xmmB, m, 0); + cc.evex().vpternlogd(ymmA, ymmB, m, 0); + cc.evex().vpternlogd(zmmA, zmmB, m, 0); + cc.evex().vpternlogq(xmmA, xmmB, m, 0); + cc.evex().vpternlogq(ymmA, ymmB, m, 0); + cc.evex().vpternlogq(zmmA, zmmB, m, 0); + cc.evex().vptestmb(kA, xmmB, m); + cc.evex().vptestmb(kA, ymmB, m); + cc.evex().vptestmb(kA, zmmB, m); + cc.evex().vptestmd(kA, xmmB, m); + cc.evex().vptestmd(kA, ymmB, m); + cc.evex().vptestmd(kA, zmmB, m); + cc.evex().vptestmq(kA, xmmB, m); + cc.evex().vptestmq(kA, ymmB, m); + cc.evex().vptestmq(kA, zmmB, m); + cc.evex().vptestmw(kA, xmmB, m); + cc.evex().vptestmw(kA, ymmB, m); + cc.evex().vptestmw(kA, zmmB, m); + cc.evex().vptestnmb(kA, xmmB, m); + cc.evex().vptestnmb(kA, ymmB, m); + cc.evex().vptestnmb(kA, zmmB, m); + cc.evex().vptestnmd(kA, xmmB, m); + cc.evex().vptestnmd(kA, ymmB, m); + cc.evex().vptestnmd(kA, zmmB, m); + cc.evex().vptestnmq(kA, xmmB, m); + cc.evex().vptestnmq(kA, ymmB, m); + cc.evex().vptestnmq(kA, zmmB, m); + cc.evex().vptestnmw(kA, xmmB, m); + cc.evex().vptestnmw(kA, ymmB, m); + cc.evex().vptestnmw(kA, zmmB, m); + cc.evex().vpunpckhbw(xmmA, xmmB, m); + cc.evex().vpunpckhbw(ymmA, ymmB, m); + cc.evex().vpunpckhbw(zmmA, zmmB, m); + cc.evex().vpunpckhdq(xmmA, xmmB, m); + cc.evex().vpunpckhdq(ymmA, ymmB, m); + cc.evex().vpunpckhdq(zmmA, zmmB, m); + cc.evex().vpunpckhqdq(xmmA, xmmB, m); + cc.evex().vpunpckhqdq(ymmA, ymmB, m); + cc.evex().vpunpckhqdq(zmmA, zmmB, m); + cc.evex().vpunpckhwd(xmmA, xmmB, m); + cc.evex().vpunpckhwd(ymmA, ymmB, m); + cc.evex().vpunpckhwd(zmmA, zmmB, m); + cc.evex().vpunpcklbw(xmmA, xmmB, m); + cc.evex().vpunpcklbw(ymmA, ymmB, m); + cc.evex().vpunpcklbw(zmmA, zmmB, m); + cc.evex().vpunpckldq(xmmA, xmmB, m); + cc.evex().vpunpckldq(ymmA, ymmB, m); + cc.evex().vpunpckldq(zmmA, zmmB, m); + cc.evex().vpunpcklqdq(xmmA, xmmB, m); + cc.evex().vpunpcklqdq(ymmA, ymmB, m); + cc.evex().vpunpcklqdq(zmmA, zmmB, m); + cc.evex().vpunpcklwd(xmmA, xmmB, m); + cc.evex().vpunpcklwd(ymmA, ymmB, m); + cc.evex().vpunpcklwd(zmmA, zmmB, m); + cc.evex().vpxord(xmmA, xmmB, m); + cc.evex().vpxord(ymmA, ymmB, m); + cc.evex().vpxord(zmmA, zmmB, m); + cc.evex().vpxorq(xmmA, xmmB, m); + cc.evex().vpxorq(ymmA, ymmB, m); + cc.evex().vpxorq(zmmA, zmmB, m); + cc.evex().vrangepd(xmmA, xmmB, m, 0); + cc.evex().vrangepd(ymmA, ymmB, m, 0); + cc.evex().vrangepd(zmmA, zmmB, m, 0); + cc.evex().vrangeps(xmmA, xmmB, m, 0); + cc.evex().vrangeps(ymmA, ymmB, m, 0); + cc.evex().vrangeps(zmmA, zmmB, m, 0); + cc.evex().vrangesd(xmmA, xmmB, m, 0); + cc.evex().vrangess(xmmA, xmmB, m, 0); + cc.evex().vrcp14pd(xmmA, m); + cc.evex().vrcp14pd(ymmA, m); + cc.evex().vrcp14pd(zmmA, m); + cc.evex().vrcp14ps(xmmA, m); + cc.evex().vrcp14ps(ymmA, m); + cc.evex().vrcp14ps(zmmA, m); + cc.evex().vrcp14sd(xmmA, xmmB, m); + cc.evex().vrcp14ss(xmmA, xmmB, m); + cc.evex().vrcp28pd(zmmA, m); + cc.evex().vrcp28ps(zmmA, m); + cc.evex().vrcp28sd(xmmA, xmmB, m); + cc.evex().vrcp28ss(xmmA, xmmB, m); + cc.evex().vreducepd(xmmA, m, 0); + cc.evex().vreducepd(ymmA, m, 0); + cc.evex().vreducepd(zmmA, m, 0); + cc.evex().vreduceps(xmmA, m, 0); + cc.evex().vreduceps(ymmA, m, 0); + cc.evex().vreduceps(zmmA, m, 0); + cc.evex().vreducesd(xmmA, xmmB, m, 0); + cc.evex().vreducess(xmmA, xmmB, m, 0); + cc.evex().vrndscalepd(xmmA, m, 0); + cc.evex().vrndscalepd(ymmA, m, 0); + cc.evex().vrndscalepd(zmmA, m, 0); + cc.evex().vrndscaleps(xmmA, m, 0); + cc.evex().vrndscaleps(ymmA, m, 0); + cc.evex().vrndscaleps(zmmA, m, 0); + cc.evex().vrndscalesd(xmmA, xmmB, m, 0); + cc.evex().vrndscaless(xmmA, xmmB, m, 0); + cc.evex().vrsqrt14pd(xmmA, m); + cc.evex().vrsqrt14pd(ymmA, m); + cc.evex().vrsqrt14pd(zmmA, m); + cc.evex().vrsqrt14ps(xmmA, m); + cc.evex().vrsqrt14ps(ymmA, m); + cc.evex().vrsqrt14ps(zmmA, m); + cc.evex().vrsqrt14sd(xmmA, xmmB, m); + cc.evex().vrsqrt14ss(xmmA, xmmB, m); + cc.evex().vrsqrt28pd(zmmA, m); + cc.evex().vrsqrt28ps(zmmA, m); + cc.evex().vrsqrt28sd(xmmA, xmmB, m); + cc.evex().vrsqrt28ss(xmmA, xmmB, m); + cc.evex().vscalefpd(xmmA, xmmB, m); + cc.evex().vscalefpd(ymmA, ymmB, m); + cc.evex().vscalefpd(zmmA, zmmB, m); + cc.evex().vscalefps(xmmA, xmmB, m); + cc.evex().vscalefps(ymmA, ymmB, m); + cc.evex().vscalefps(zmmA, zmmB, m); + cc.evex().vscalefsd(xmmA, xmmB, m); + cc.evex().vscalefss(xmmA, xmmB, m); + cc.evex().k(kA).vscatterdpd(vx_ptr, xmmB); + cc.evex().k(kA).vscatterdpd(vx_ptr, ymmB); + cc.evex().k(kA).vscatterdpd(vy_ptr, zmmB); + cc.evex().k(kA).vscatterdps(vx_ptr, xmmB); + cc.evex().k(kA).vscatterdps(vy_ptr, ymmB); + cc.evex().k(kA).vscatterdps(vz_ptr, zmmB); + cc.evex().k(kA).vscatterpf0dpd(vy_ptr); + cc.evex().k(kA).vscatterpf0dps(vz_ptr); + cc.evex().k(kA).vscatterpf0qpd(vz_ptr); + cc.evex().k(kA).vscatterpf0qps(vz_ptr); + cc.evex().k(kA).vscatterpf1dpd(vy_ptr); + cc.evex().k(kA).vscatterpf1dps(vz_ptr); + cc.evex().k(kA).vscatterpf1qpd(vz_ptr); + cc.evex().k(kA).vscatterpf1qps(vz_ptr); + cc.evex().k(kA).vscatterqpd(vx_ptr, xmmB); + cc.evex().k(kA).vscatterqpd(vy_ptr, ymmB); + cc.evex().k(kA).vscatterqpd(vz_ptr, zmmB); + cc.evex().k(kA).vscatterqps(vx_ptr, xmmB); + cc.evex().k(kA).vscatterqps(vy_ptr, xmmB); + cc.evex().k(kA).vscatterqps(vz_ptr, ymmB); + cc.evex().vshuff32x4(ymmA, ymmB, m, 0); + cc.evex().vshuff32x4(zmmA, zmmB, m, 0); + cc.evex().vshuff64x2(ymmA, ymmB, m, 0); + cc.evex().vshuff64x2(zmmA, zmmB, m, 0); + cc.evex().vshufi32x4(ymmA, ymmB, m, 0); + cc.evex().vshufi32x4(zmmA, zmmB, m, 0); + cc.evex().vshufi64x2(ymmA, ymmB, m, 0); + cc.evex().vshufi64x2(zmmA, zmmB, m, 0); + cc.evex().vshufpd(xmmA, xmmB, m, 0); + cc.evex().vshufpd(ymmA, ymmB, m, 0); + cc.evex().vshufpd(zmmA, zmmB, m, 0); + cc.evex().vshufps(xmmA, xmmB, m, 0); + cc.evex().vshufps(ymmA, ymmB, m, 0); + cc.evex().vshufps(zmmA, zmmB, m, 0); + cc.evex().vsqrtpd(xmmA, m); + cc.evex().vsqrtpd(ymmA, m); + cc.evex().vsqrtpd(zmmA, m); + cc.evex().vsqrtps(xmmA, m); + cc.evex().vsqrtps(ymmA, m); + cc.evex().vsqrtps(zmmA, m); + cc.evex().vsqrtsd(xmmA, xmmB, m); + cc.evex().vsqrtss(xmmA, xmmB, m); + cc.evex().vsubpd(xmmA, xmmB, m); + cc.evex().vsubpd(ymmA, ymmB, m); + cc.evex().vsubpd(zmmA, zmmB, m); + cc.evex().vsubps(xmmA, xmmB, m); + cc.evex().vsubps(ymmA, ymmB, m); + cc.evex().vsubps(zmmA, zmmB, m); + cc.evex().vsubsd(xmmA, xmmB, m); + cc.evex().vsubss(xmmA, xmmB, m); + cc.evex().vucomisd(xmmA, m); + cc.evex().vucomiss(xmmA, m); + cc.evex().vunpckhpd(xmmA, xmmB, m); + cc.evex().vunpckhpd(ymmA, ymmB, m); + cc.evex().vunpckhpd(zmmA, zmmB, m); + cc.evex().vunpckhps(xmmA, xmmB, m); + cc.evex().vunpckhps(ymmA, ymmB, m); + cc.evex().vunpckhps(zmmA, zmmB, m); + cc.evex().vunpcklpd(xmmA, xmmB, m); + cc.evex().vunpcklpd(ymmA, ymmB, m); + cc.evex().vunpcklpd(zmmA, zmmB, m); + cc.evex().vunpcklps(xmmA, xmmB, m); + cc.evex().vunpcklps(ymmA, ymmB, m); + cc.evex().vunpcklps(zmmA, zmmB, m); + cc.evex().vxorpd(xmmA, xmmB, m); + cc.evex().vxorpd(ymmA, ymmB, m); + cc.evex().vxorpd(zmmA, zmmB, m); + cc.evex().vxorps(xmmA, xmmB, m); + cc.evex().vxorps(ymmA, ymmB, m); + cc.evex().vxorps(zmmA, zmmB, m); +} + +// Generates a long sequence of AVX512 instructions. +template +static void generateAvx512SequenceInternal( + Emitter& cc, + InstForm form, + const x86::Gp& gp, + const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC, + const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) { + + if (form == InstForm::kReg) + generateAvx512SequenceInternalRegOnly(cc, gp, kA, kB, kC, vecA, vecB, vecC, vecD); + else + generateAvx512SequenceInternalRegMem(cc, gp, kA, kB, kC, vecA, vecB, vecC, vecD); } static void generateAvx512Sequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) { @@ -4849,7 +4928,7 @@ static void generateAvx512Sequence(BaseEmitter& emitter, InstForm form, bool emi if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -4870,7 +4949,7 @@ static void generateAvx512Sequence(BaseEmitter& emitter, InstForm form, bool emi if (emitPrologEpilog) { FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), cc.environment()); + func.init(FuncSignature::build(), cc.environment()); FuncFrame frame; frame.init(func); @@ -4900,7 +4979,7 @@ static void generateAvx512Sequence(BaseEmitter& emitter, InstForm form, bool emi KReg kB = cc.newKq("kB"); KReg kC = cc.newKq("kC"); - cc.addFunc(FuncSignatureT(CallConvId::kHost)); + cc.addFunc(FuncSignature::build()); generateAvx512SequenceInternal(cc, form, gp, kA, kB, kC, vecA, vecB, vecC, vecD); cc.endFunc(); } @@ -4912,42 +4991,49 @@ static void benchmarkX86Function(Arch arch, uint32_t numIterations, const char* CodeHolder code; printf("%s:\n", description); - bench(code, arch, numIterations, "[raw]", [&](x86::Assembler& cc) { + uint32_t instCount = 0; + +#ifndef ASMJIT_NO_BUILDER + instCount = asmjit_perf_utils::calculateInstructionCount(code, arch, [&](x86::Builder& cc) { emitterFn(cc, false); }); +#endif - bench(code, arch, numIterations, "[validated]", [&](x86::Assembler& cc) { - cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler); + asmjit_perf_utils::bench(code, arch, numIterations, "[raw]", instCount, [&](x86::Assembler& cc) { emitterFn(cc, false); }); - bench(code, arch, numIterations, "[prolog/epilog]", [&](x86::Assembler& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[validated]", instCount, [&](x86::Assembler& cc) { cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler); + emitterFn(cc, false); + }); + + asmjit_perf_utils::bench(code, arch, numIterations, "[prolog/epilog]", instCount, [&](x86::Assembler& cc) { emitterFn(cc, true); }); #ifndef ASMJIT_NO_BUILDER - bench(code, arch, numIterations, "[no-asm]", [&](x86::Builder& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[no-asm]", instCount, [&](x86::Builder& cc) { emitterFn(cc, false); }); - bench(code, arch, numIterations, "[finalized]", [&](x86::Builder& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[finalized]", instCount, [&](x86::Builder& cc) { emitterFn(cc, false); cc.finalize(); }); - bench(code, arch, numIterations, "[prolog/epilog]", [&](x86::Builder& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[prolog/epilog]", instCount, [&](x86::Builder& cc) { emitterFn(cc, true); cc.finalize(); }); #endif #ifndef ASMJIT_NO_COMPILER - bench(code, arch, numIterations, "[no-asm]", [&](x86::Compiler& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[no-asm]", instCount, [&](x86::Compiler& cc) { emitterFn(cc, true); }); - bench(code, arch, numIterations, "[finalized]", [&](x86::Compiler& cc) { + asmjit_perf_utils::bench(code, arch, numIterations, "[finalized]", instCount, [&](x86::Compiler& cc) { emitterFn(cc, true); cc.finalize(); }); diff --git a/3rdparty/asmjit/test/asmjit_test_unit.cpp b/3rdparty/asmjit/test/asmjit_test_unit.cpp index 5658ebc1d60f5..86d1f1a91fac0 100644 --- a/3rdparty/asmjit/test/asmjit_test_unit.cpp +++ b/3rdparty/asmjit/test/asmjit_test_unit.cpp @@ -109,7 +109,8 @@ static void dumpSizeOf(void) noexcept { DUMP_TYPE(BaseBuilder); DUMP_TYPE(BaseNode); DUMP_TYPE(InstNode); - DUMP_TYPE(InstExNode); + DUMP_TYPE(InstNodeWithOperands); + DUMP_TYPE(InstNodeWithOperands); DUMP_TYPE(AlignNode); DUMP_TYPE(LabelNode); DUMP_TYPE(EmbedDataNode); diff --git a/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp b/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp index 353b5e4fa1b13..df763224d9bf2 100644 --- a/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp +++ b/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp @@ -17,7 +17,7 @@ // ---------------------------------------------------------------------------- #include -#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 +#if ASMJIT_ARCH_X86 && !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_JIT) #include #include @@ -70,7 +70,7 @@ int main() { Label data = a.newLabel(); FuncDetail func; - func.init(FuncSignatureT(CallConvId::kHost), code.environment()); + func.init(FuncSignature::build(), code.environment()); FuncFrame frame; frame.init(func); @@ -127,29 +127,26 @@ int main() { } // Allocate memory for the function and relocate it there. - void* rxPtr; - void* rwPtr; - err = allocator.alloc(&rxPtr, &rwPtr, codeSize); + JitAllocator::Span span; + err = allocator.alloc(span, codeSize); if (err) fail("Failed to allocate executable memory", err); // Relocate to the base-address of the allocated memory. - code.relocateToBase(uint64_t(uintptr_t(rxPtr))); + code.relocateToBase(uint64_t(uintptr_t(span.rx()))); - VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite); - - // Copy the flattened code into `mem.rw`. There are two ways. You can either copy - // everything manually by iterating over all sections or use `copyFlattenedData`. - // This code is similar to what `copyFlattenedData(p, codeSize, 0)` would do: - for (Section* section : code.sectionsByOrder()) - memcpy(static_cast(rwPtr) + size_t(section->offset()), section->data(), section->bufferSize()); - - VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute); - VirtMem::flushInstructionCache(rwPtr, code.codeSize()); + allocator.write(span, [&](JitAllocator::Span& span) noexcept -> Error { + // Copy the flattened code into `mem.rw`. There are two ways. You can either copy + // everything manually by iterating over all sections or use `copyFlattenedData`. + // This code is similar to what `copyFlattenedData(p, codeSize, 0)` would do: + for (Section* section : code.sectionsByOrder()) + memcpy(static_cast(span.rw()) + size_t(section->offset()), section->data(), section->bufferSize()); + return kErrorOk; + }); // Execute the function and test whether it works. typedef size_t (*Func)(size_t idx); - Func fn = (Func)rxPtr; + Func fn = (Func)span.rx(); printf("\n"); if (fn(0) != dataArray[0] || @@ -166,7 +163,7 @@ int main() { #else int main() { - printf("AsmJit X86 Sections Test is disabled on non-x86 host\n\n"); + printf("AsmJit X86 Sections Test is disabled on non-x86 host or when compiled with ASMJIT_NO_JIT\n\n"); return 0; } -#endif // !ASMJIT_NO_X86 && ASMJIT_ARCH_X86 +#endif // ASMJIT_ARCH_X86 && !ASMJIT_NO_X86 && !ASMJIT_NO_JIT diff --git a/3rdparty/asmjit/test/asmjitutils.h b/3rdparty/asmjit/test/asmjitutils.h index d84d3d4c74213..288801538af95 100644 --- a/3rdparty/asmjit/test/asmjitutils.h +++ b/3rdparty/asmjit/test/asmjitutils.h @@ -8,7 +8,10 @@ #include -static const char* asmjitArchAsString(asmjit::Arch arch) noexcept { +namespace { + +ASMJIT_MAYBE_UNUSED +static inline const char* asmjitArchAsString(asmjit::Arch arch) noexcept { switch (arch) { case asmjit::Arch::kX86 : return "X86"; case asmjit::Arch::kX64 : return "X64"; @@ -35,4 +38,23 @@ static const char* asmjitArchAsString(asmjit::Arch arch) noexcept { } } +ASMJIT_MAYBE_UNUSED +static inline void printIndented(const char* str, size_t indent) noexcept { + const char* start = str; + while (*str) { + if (*str == '\n') { + size_t size = (size_t)(str - start); + printf("%*s%.*s\n", size ? int(indent) : 0, "", int(size), start); + start = str + 1; + } + str++; + } + + size_t size = (size_t)(str - start); + if (size) + printf("%*s%.*s\n", int(indent), "", int(size), start); +} + +} // {anonymous} + #endif // ASMJITUTILS_H_INCLUDED diff --git a/3rdparty/asmjit/test/broken.cpp b/3rdparty/asmjit/test/broken.cpp index bb874fdc13bad..c28ffa7288ec1 100644 --- a/3rdparty/asmjit/test/broken.cpp +++ b/3rdparty/asmjit/test/broken.cpp @@ -25,12 +25,11 @@ // // For more information, please refer to -#include "./broken.h" +#include "broken.h" #include -// ============================================================================ -// [Broken - Global] -// ============================================================================ +// Broken - Globals +// ================ // Zero initialized globals. struct BrokenGlobal { @@ -56,9 +55,8 @@ struct BrokenGlobal { }; static BrokenGlobal _brokenGlobal; -// ============================================================================ -// [Broken - API] -// ============================================================================ +// Broken - API +// ============ // Get whether the string `a` starts with string `b`. static bool BrokenAPI_startsWith(const char* a, const char* b) noexcept { @@ -185,7 +183,7 @@ bool BrokenAPI::hasArg(const char* name) noexcept { return _brokenGlobal.hasArg(name); } -void BrokenAPI::add(Unit* unit) noexcept { +void BrokenAPI::addUnit(Unit* unit) noexcept { Unit** pPrev = &_brokenGlobal._unitList; Unit* current = *pPrev; @@ -308,5 +306,5 @@ void BrokenAPI::fail(const char* file, int line, const char* expression, const c fprintf(dst, " SOURCE: %s (Line: %d)\n", file, line); fflush(dst); - exit(1); + abort(); } diff --git a/3rdparty/asmjit/test/broken.h b/3rdparty/asmjit/test/broken.h index 701bc8b6e3c51..74b901c369924 100644 --- a/3rdparty/asmjit/test/broken.h +++ b/3rdparty/asmjit/test/broken.h @@ -38,79 +38,125 @@ //! \cond -// ============================================================================ -// [Broken - API] -// ============================================================================ - -struct BrokenAPI { - //! Entry point of a unit test defined by `UNIT` macro. - typedef void (*Entry)(void); - - enum Flags : unsigned { - kFlagFinished = 0x1 - }; - - //! Test defined by `UNIT` macro. - struct Unit { - Entry entry; - const char* name; - int priority; - unsigned flags; - Unit* next; - }; - - //! Automatic unit registration by using static initialization. - struct AutoUnit : Unit { - inline AutoUnit(Entry entry_, const char* name_, int priority_ = 0, int dummy_ = 0) noexcept { - // Not used, only to trick `UNIT()` macro. - (void)dummy_; - - this->entry = entry_; - this->name = name_; - this->priority = priority_; - this->flags = 0; - this->next = nullptr; - BrokenAPI::add(this); - } - }; - - static bool hasArg(const char* name) noexcept; - - //! Register a new unit test (called automatically by `AutoUnit` and `UNIT`). - static void add(Unit* unit) noexcept; - - //! Set output file to a `file`. - static void setOutputFile(FILE* file) noexcept; - - //! Initialize `Broken` framework. - //! - //! Returns `true` if `run()` should be called. - static int run(int argc, const char* argv[], Entry onBeforeRun = nullptr, Entry onAfterRun = nullptr); - - //! Log message, adds automatically new line if not present. - static void info(const char* fmt, ...) noexcept; - - //! Called on `EXPECT()` failure. - static void fail(const char* file, int line, const char* expression, const char* fmt, ...) noexcept; - - //! Used internally by `EXPECT` macro. - template - static inline void expect(const char* file, int line, const char* expression, const T& result) noexcept { - if (!result) - fail(file, line, expression, nullptr); +// Broken - API +// ============ + +namespace BrokenAPI { + +//! Entry point of a unit test defined by `UNIT` macro. +typedef void (*Entry)(void); + +enum Flags : unsigned { + kFlagFinished = 0x1 +}; + +struct Unit; + +bool hasArg(const char* name) noexcept; + +//! Register a new unit test (called automatically by `AutoUnit` and `UNIT`). +void addUnit(Unit* unit) noexcept; + +//! Set output file to a `file`. +void setOutputFile(FILE* file) noexcept; + +//! Initialize `Broken` framework. +//! +//! Returns `true` if `run()` should be called. +int run(int argc, const char* argv[], Entry onBeforeRun = nullptr, Entry onAfterRun = nullptr); + +//! Log message, adds automatically new line if not present. +void info(const char* fmt, ...) noexcept; + +//! Called on `EXPECT()` failure. +void fail(const char* file, int line, const char* expression, const char* fmt, ...) noexcept; + +//! Test defined by `UNIT` macro. +struct Unit { + Entry entry; + const char* name; + int priority; + unsigned flags; + Unit* next; +}; + +//! Automatic unit registration by using static initialization. +class AutoUnit : public Unit { +public: + inline AutoUnit(Entry entry_, const char* name_, int priority_ = 0, int dummy_ = 0) noexcept { + // Not used, only to trick `UNIT()` macro. + (void)dummy_; + + this->entry = entry_; + this->name = name_; + this->priority = priority_; + this->flags = 0; + this->next = nullptr; + addUnit(this); + } +}; + +class Failure { +public: + const char* _file = nullptr; + const char* _expression = nullptr; + int _line = 0; + bool _handled = false; + + inline Failure(const char* file, int line, const char* expression) noexcept + : _file(file), + _expression(expression), + _line(line) {} + + inline ~Failure() noexcept { + if (!_handled) + fail(_file, _line, _expression, nullptr); } - //! Used internally by `EXPECT` macro. - template - static inline void expect(const char* file, int line, const char* expression, const T& result, const char* fmt, Args&&... args) noexcept { - if (!result) - fail(file, line, expression, fmt, std::forward(args)...); + template + inline void message(const char* fmt, Args&&... args) noexcept { + fail(_file, _line, _expression, fmt, std::forward(args)...); + _handled = true; } }; -// ============================================================================ -// [Broken - Macros] -// ============================================================================ +template +static inline bool check(Result&& result) noexcept { return !!result; } + +template +static inline bool checkEq(LHS&& lhs, RHS&& rhs) noexcept { return lhs == rhs; } + +template +static inline bool checkNe(LHS&& lhs, RHS&& rhs) noexcept { return lhs != rhs; } + +template +static inline bool checkGt(LHS&& lhs, RHS&& rhs) noexcept { return lhs > rhs; } + +template +static inline bool checkGe(LHS&& lhs, RHS&& rhs) noexcept { return lhs >= rhs; } + +template +static inline bool checkLt(LHS&& lhs, RHS&& rhs) noexcept { return lhs < rhs; } + +template +static inline bool checkLe(LHS&& lhs, RHS&& rhs) noexcept { return lhs <= rhs; } + +template +static inline bool checkTrue(Result&& result) noexcept { return !!result; } + +template +static inline bool checkFalse(Result&& result) noexcept { return !result; } + +template +static inline bool checkNull(Result&& result) noexcept { return result == nullptr; } + +template +static inline bool checkNotNull(Result&& result) noexcept { return result != nullptr; } + +} // {BrokenAPI} + +// Broken - Macros +// =============== //! Internal macro used by `UNIT()`. #define BROKEN_UNIT_INTERNAL(NAME, PRIORITY) \ @@ -118,19 +164,14 @@ struct BrokenAPI { static ::BrokenAPI::AutoUnit unit_##NAME##_autoinit(unit_##NAME##_entry, #NAME, PRIORITY); \ static void unit_##NAME##_entry(void) -//! Stringifies the expression used by EXPECT(). -#define BROKEN_STRINFIGY_EXPRESSION_INTERNAL(EXP, ...) #EXP - //! \def UNIT(NAME [, PRIORITY]) //! //! Define a unit test with an optional priority. //! -//! `NAME` can only contain ASCII characters, numbers and underscore. It has -//! the same rules as identifiers in C and C++. +//! `NAME` can only contain ASCII characters, numbers and underscore. It has the same rules as identifiers in C and C++. //! -//! `PRIORITY` specifies the order in which unit tests are run. Lesses value -//! increases the priority. At the moment all units are first sorted by -//! priority and then by name - this makes the run always deterministic. +//! `PRIORITY` specifies the order in which unit tests are run. Lesses value increases the priority. At the moment all +//!units are first sorted by priority and then by name - this makes the run always deterministic. #define UNIT(NAME, ...) BROKEN_UNIT_INTERNAL(NAME, __VA_ARGS__ + 0) //! #define INFO(FORMAT [, ...]) @@ -138,10 +179,21 @@ struct BrokenAPI { //! Informative message printed to `stdout`. #define INFO(...) ::BrokenAPI::info(__VA_ARGS__) -//! #define INFO(EXP [, FORMAT [, ...]]) -//! -//! Expect `EXP` to be true or evaluates to true, fail otherwise. -#define EXPECT(...) ::BrokenAPI::expect(__FILE__, __LINE__, BROKEN_STRINFIGY_EXPRESSION_INTERNAL(__VA_ARGS__), __VA_ARGS__) +#define BROKEN_EXPECT_INTERNAL(file, line, expression, result) \ + for (bool _testInternalResult = (result); !_testInternalResult; _testInternalResult = true) \ + ::BrokenAPI::Failure(file, line, expression) + +#define EXPECT(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT(" #__VA_ARGS__ ")", !!(__VA_ARGS__)) +#define EXPECT_EQ(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_EQ(" #__VA_ARGS__ ")", ::BrokenAPI::checkEq(__VA_ARGS__)) +#define EXPECT_NE(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_NE(" #__VA_ARGS__ ")", ::BrokenAPI::checkNe(__VA_ARGS__)) +#define EXPECT_GT(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_GT(" #__VA_ARGS__ ")", ::BrokenAPI::checkGt(__VA_ARGS__)) +#define EXPECT_GE(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_GE(" #__VA_ARGS__ ")", ::BrokenAPI::checkGe(__VA_ARGS__)) +#define EXPECT_LT(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_LT(" #__VA_ARGS__ ")", ::BrokenAPI::checkLt(__VA_ARGS__)) +#define EXPECT_LE(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_LE(" #__VA_ARGS__ ")", ::BrokenAPI::checkLe(__VA_ARGS__)) +#define EXPECT_TRUE(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_TRUE(" #__VA_ARGS__ ")", ::BrokenAPI::checkTrue(__VA_ARGS__)) +#define EXPECT_FALSE(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_FALSE(" #__VA_ARGS__ ")", ::BrokenAPI::checkFalse(__VA_ARGS__)) +#define EXPECT_NULL(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_NULL(" #__VA_ARGS__ ")", ::BrokenAPI::checkNull(__VA_ARGS__)) +#define EXPECT_NOT_NULL(...) BROKEN_EXPECT_INTERNAL(__FILE__, __LINE__, "EXPECT_NOT_NULL(" #__VA_ARGS__ ")", ::BrokenAPI::checkNotNull(__VA_ARGS__)) //! \endcond diff --git a/3rdparty/asmjit/test/performancetimer.h b/3rdparty/asmjit/test/performancetimer.h index baa0479fc34ed..c7a8ebe5d1835 100644 --- a/3rdparty/asmjit/test/performancetimer.h +++ b/3rdparty/asmjit/test/performancetimer.h @@ -30,12 +30,4 @@ class PerformanceTimer { } }; -static inline double mbps(double duration, uint64_t outputSize) noexcept { - if (duration == 0) - return 0.0; - - double bytesTotal = double(outputSize); - return (bytesTotal * 1000) / (duration * 1024 * 1024); -} - #endif // PERFORMANCETIMER_H_INCLUDED diff --git a/3rdparty/asmjit/tools/configure-sanitizers.sh b/3rdparty/asmjit/tools/configure-sanitizers.sh index a9f64969b7062..d35b9a4cad3fc 100644 --- a/3rdparty/asmjit/tools/configure-sanitizers.sh +++ b/3rdparty/asmjit/tools/configure-sanitizers.sh @@ -11,3 +11,7 @@ echo "" echo "== [Configuring Build - Release_UBSAN] ==" eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release_UBSAN" ${BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=Release -DASMJIT_SANITIZE=undefined echo "" + +echo "== [Configuring Build - Release_MSAN] ==" +eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release_MSAN" ${BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=Release -DASMJIT_SANITIZE=memory +echo "" diff --git a/3rdparty/asmjit/tools/generator-commons.js b/3rdparty/asmjit/tools/generator-commons.js new file mode 100644 index 0000000000000..eb3a0721ccc95 --- /dev/null +++ b/3rdparty/asmjit/tools/generator-commons.js @@ -0,0 +1,592 @@ +// This file is part of AsmJit project +// +// See asmjit.h or LICENSE.md for license and copyright information +// SPDX-License-Identifier: Zlib + +const hasOwn = Object.prototype.hasOwnProperty; +function nop(x) { return x; } + +// Generator - Constants +// --------------------- + +const kIndent = " "; +exports.kIndent = kIndent; + +const kLineWidth = 120; + +// Generator - Logging +// ------------------- + +let VERBOSE = false; + +function setDebugVerbosity(value) { + VERBOSE = value; +} +exports.setDebugVerbosity = setDebugVerbosity; + +function DEBUG(msg) { + if (VERBOSE) + console.log(msg); +} +exports.DEBUG = DEBUG; + +function WARN(msg) { + console.log(msg); +} +exports.WARN = WARN; + +function FATAL(msg) { + console.log(`FATAL: ${msg}`); + throw new Error(msg); +} +exports.FATAL = FATAL; + +// Generator - Object Utilities +// ---------------------------- + +class ObjectUtils { + static clone(map) { + return Object.assign(Object.create(null), map); + } + + static merge(a, b) { + if (a === b) + return a; + + for (let k in b) { + let av = a[k]; + let bv = b[k]; + + if (typeof av === "object" && typeof bv === "object") + ObjectUtils.merge(av, bv); + else + a[k] = bv; + } + + return a; + } + + static equals(a, b) { + if (a === b) + return true; + + if (typeof a !== typeof b) + return false; + + if (typeof a !== "object") + return a === b; + + if (Array.isArray(a) || Array.isArray(b)) { + if (Array.isArray(a) !== Array.isArray(b)) + return false; + + const len = a.length; + if (b.length !== len) + return false; + + for (let i = 0; i < len; i++) + if (!ObjectUtils.equals(a[i], b[i])) + return false; + } + else { + if (a === null || b === null) + return a === b; + + for (let k in a) + if (!hasOwn.call(b, k) || !ObjectUtils.equals(a[k], b[k])) + return false; + + for (let k in b) + if (!hasOwn.call(a, k)) + return false; + } + + return true; + } + + static equalsExcept(a, b, except) { + if (a === b) + return true; + + if (typeof a !== "object" || typeof b !== "object" || Array.isArray(a) || Array.isArray(b)) + return ObjectUtils.equals(a, b); + + for (let k in a) + if (!hasOwn.call(except, k) && (!hasOwn.call(b, k) || !ObjectUtils.equals(a[k], b[k]))) + return false; + + for (let k in b) + if (!hasOwn.call(except, k) && !hasOwn.call(a, k)) + return false; + + return true; + } + + static findKey(map, keys) { + for (let key in keys) + if (hasOwn.call(map, key)) + return key; + return undefined; + } + + static hasAny(map, keys) { + for (let key in keys) + if (hasOwn.call(map, key)) + return true; + return false; + } + + static and(a, b) { + const out = Object.create(null); + for (let k in a) + if (hasOwn.call(b, k)) + out[k] = true; + return out; + } + + static xor(a, b) { + const out = Object.create(null); + for (let k in a) if (!hasOwn.call(b, k)) out[k] = true; + for (let k in b) if (!hasOwn.call(a, k)) out[k] = true; + return out; + } +} +exports.ObjectUtils = ObjectUtils; + +// Generator - Array Utilities +// --------------------------- + +class ArrayUtils { + static min(arr, fn) { + if (!arr.length) + return null; + + if (!fn) + fn = nop; + + let v = fn(arr[0]); + for (let i = 1; i < arr.length; i++) + v = Math.min(v, fn(arr[i])); + return v; + } + + static max(arr, fn) { + if (!arr.length) + return null; + + if (!fn) + fn = nop; + + let v = fn(arr[0]); + for (let i = 1; i < arr.length; i++) + v = Math.max(v, fn(arr[i])); + return v; + } + + static sorted(obj, cmp) { + const out = Array.isArray(obj) ? obj.slice() : Object.getOwnPropertyNames(obj); + out.sort(cmp); + return out; + } + + static deepIndexOf(arr, what) { + for (let i = 0; i < arr.length; i++) + if (ObjectUtils.equals(arr[i], what)) + return i; + return -1; + } + + static toDict(arr, value) { + if (value === undefined) + value = true; + + const out = Object.create(null); + for (let i = 0; i < arr.length; i++) + out[arr[i]] = value; + return out; + } +} +exports.ArrayUtils = ArrayUtils; + + +// Generator - String Utilities +// ---------------------------- + +class StringUtils { + static asString(x) { return String(x); } + + static countOf(s, pattern) { + if (!pattern) + FATAL(`Pattern cannot be empty`); + + let n = 0; + let pos = 0; + + while ((pos = s.indexOf(pattern, pos)) >= 0) { + n++; + pos += pattern.length; + } + + return n; + } + + static trimLeft(s) { return s.replace(/^\s+/, ""); } + static trimRight(s) { return s.replace(/\s+$/, ""); } + + static upFirst(s) { + if (!s) return ""; + return s[0].toUpperCase() + s.substr(1); + } + + static decToHex(n, nPad) { + let hex = Number(n < 0 ? 0x100000000 + n : n).toString(16); + while (nPad > hex.length) + hex = "0" + hex; + return "0x" + hex.toUpperCase(); + } + + static format(array, indent, showIndex, mapFn) { + if (!mapFn) + mapFn = StringUtils.asString; + + let s = ""; + let threshold = 80; + + if (showIndex === -1) + s += indent; + + for (let i = 0; i < array.length; i++) { + const item = array[i]; + const last = i === array.length - 1; + + if (showIndex !== -1) + s += indent; + + s += mapFn(item); + if (showIndex > 0) { + s += `${last ? " " : ","} // #${i}`; + if (typeof array.refCountOf === "function") + s += ` [ref=${array.refCountOf(item)}x]`; + } + else if (!last) { + s += ","; + } + + if (showIndex === -1) { + if (s.length >= threshold - 1 && !last) { + s += "\n" + indent; + threshold += 80; + } + else { + if (!last) s += " "; + } + } + else { + if (!last) s += "\n"; + } + } + + return s; + } + + static makeCxxArray(array, code, indent) { + if (typeof indent !== "string") + indent = kIndent; + + return `${code} = {\n${indent}` + array.join(`,\n${indent}`) + `\n};\n`; + } + + static makeCxxArrayWithComment(array, code, indent) { + if (typeof indent !== "string") + indent = kIndent; + + let s = ""; + for (let i = 0; i < array.length; i++) { + const last = i === array.length - 1; + s += indent + array[i].data + + (last ? " // " : ", // ") + (array[i].refs ? "#" + String(i) : "").padEnd(5) + array[i].comment + "\n"; + } + return `${code} = {\n${s}};\n`; + } + + static formatCppStruct(...args) { + return "{ " + args.join(", ") + " }"; + } + + static formatCppFlags(obj, fn, none) { + if (none == null) + none = "0"; + + if (!fn) + fn = nop; + + let out = ""; + for (let k in obj) { + if (obj[k]) + out += (out ? " | " : "") + fn(k); + } + return out ? out : none; + } + + static formatRecords(array, indent, fn) { + if (typeof indent !== "string") + indent = kIndent; + + if (!fn) + fn = nop; + + let s = ""; + let line = ""; + for (let i = 0; i < array.length; i++) { + const item = fn(array[i]); + const combined = line ? line + ", " + item : item; + + if (combined.length >= kLineWidth) { + s = s ? s + ",\n" + line : line; + line = item; + } + else { + line = combined; + } + } + + if (line) { + s = s ? s + ",\n" + line : line; + } + + return StringUtils.indent(s, indent); + } + + static disclaimer(s) { + return "// ------------------- Automatically generated, do not edit -------------------\n" + + s + + "// ----------------------------------------------------------------------------\n"; + } + + static indent(s, indentation) { + if (typeof indentation === "number") + indentation = " ".repeat(indentation); + + let lines = s.split(/\r?\n/g); + if (indentation) { + for (let i = 0; i < lines.length; i++) { + let line = lines[i]; + if (line) + lines[i] = indentation + line; + } + } + + return lines.join("\n"); + } + + static extract(s, start, end) { + const iStart = s.indexOf(start); + const iEnd = s.indexOf(end); + + if (iStart === -1) + FATAL(`StringUtils.extract(): Couldn't locate start mark '${start}'`); + + if (iEnd === -1) + FATAL(`StringUtils.extract(): Couldn't locate end mark '${end}'`); + + return s.substring(iStart + start.length, iEnd).trim(); + } + + static inject(s, start, end, code) { + let iStart = s.indexOf(start); + let iEnd = s.indexOf(end); + + if (iStart === -1) + FATAL(`StringUtils.inject(): Couldn't locate start mark '${start}'`); + + if (iEnd === -1) + FATAL(`StringUtils.inject(): Couldn't locate end mark '${end}'`); + + let nIndent = 0; + while (iStart > 0 && s[iStart-1] === " ") { + iStart--; + nIndent++; + } + + if (nIndent) { + const indentation = " ".repeat(nIndent); + code = StringUtils.indent(code, indentation) + indentation; + } + + return s.substr(0, iStart + start.length + nIndent) + code + s.substr(iEnd); + } + + static makePriorityCompare(priorityArray) { + const map = Object.create(null); + priorityArray.forEach((str, index) => { map[str] = index; }); + + return function(a, b) { + const ax = hasOwn.call(map, a) ? map[a] : Infinity; + const bx = hasOwn.call(map, b) ? map[b] : Infinity; + return ax != bx ? ax - bx : a < b ? -1 : a > b ? 1 : 0; + } + } +} +exports.StringUtils = StringUtils; + +// Generator - Indexed Array +// ========================= + +// IndexedArray is an Array replacement that allows to index each item inserted to it. Its main purpose +// is to avoid data duplication, if an item passed to `addIndexed()` is already within the Array then +// it's not inserted and the existing index is returned instead. +function IndexedArray_keyOf(item) { + return typeof item === "string" ? item : JSON.stringify(item); +} + +class IndexedArray extends Array { + constructor() { + super(); + this._index = Object.create(null); + } + + refCountOf(item) { + const key = IndexedArray_keyOf(item); + const idx = this._index[key]; + + return idx !== undefined ? idx.refCount : 0; + } + + addIndexed(item) { + const key = IndexedArray_keyOf(item); + let idx = this._index[key]; + + if (idx !== undefined) { + idx.refCount++; + return idx.data; + } + + idx = this.length; + this._index[key] = { + data: idx, + refCount: 1 + }; + this.push(item); + return idx; + } +} +exports.IndexedArray = IndexedArray; + +// Generator - Indexed String +// ========================== + +// IndexedString is mostly used to merge all instruction names into a single string with external +// index. It's designed mostly for generating C++ tables. Consider the following cases in C++: +// +// a) static const char* const* instNames = { "add", "mov", "vpunpcklbw" }; +// +// b) static const char instNames[] = { "add\0" "mov\0" "vpunpcklbw\0" }; +// static const uint16_t instNameIndex[] = { 0, 4, 8 }; +// +// The latter (b) has an advantage that it doesn't have to be relocated by the linker, which saves +// a lot of space in the resulting binary and a lot of CPU cycles (and memory) when the linker loads +// it. AsmJit supports thousands of instructions so each optimization like this makes it smaller and +// faster to load. +class IndexedString { + constructor() { + this.map = Object.create(null); + this.array = []; + this.size = -1; + } + + add(s) { + this.map[s] = -1; + } + + index() { + const map = this.map; + const array = this.array; + const partialMap = Object.create(null); + + let k, kp; + let i, len; + + // Create a map that will contain all keys and partial keys. + for (k in map) { + if (!k) { + partialMap[k] = k; + } + else { + for (i = 0, len = k.length; i < len; i++) { + kp = k.substr(i); + if (!hasOwn.call(partialMap, kp) || partialMap[kp].length < len) + partialMap[kp] = k; + } + } + } + + // Create an array that will only contain keys that are needed. + for (k in map) + if (partialMap[k] === k) + array.push(k); + array.sort(); + + // Create valid offsets to the `array`. + let offMap = Object.create(null); + let offset = 0; + + for (i = 0, len = array.length; i < len; i++) { + k = array[i]; + + offMap[k] = offset; + offset += k.length + 1; + } + this.size = offset; + + // Assign valid offsets to `map`. + for (kp in map) { + k = partialMap[kp]; + map[kp] = offMap[k] + k.length - kp.length; + } + } + + format(indent, justify) { + if (this.size === -1) + FATAL(`IndexedString.format(): not indexed yet, call index()`); + + const array = this.array; + if (!justify) justify = 0; + + let i; + let s = ""; + let line = ""; + + for (i = 0; i < array.length; i++) { + const item = "\"" + array[i] + ((i !== array.length - 1) ? "\\0\"" : "\";"); + const newl = line + (line ? " " : indent) + item; + + if (newl.length <= justify) { + line = newl; + continue; + } + else { + s += line + "\n"; + line = indent + item; + } + } + + return s + line; + } + + getSize() { + if (this.size === -1) + FATAL(`IndexedString.getSize(): Not indexed yet, call index()`); + return this.size; + } + + getIndex(k) { + if (this.size === -1) + FATAL(`IndexedString.getIndex(): Not indexed yet, call index()`); + + if (!hasOwn.call(this.map, k)) + FATAL(`IndexedString.getIndex(): Key '${k}' not found.`); + + return this.map[k]; + } +} +exports.IndexedString = IndexedString; diff --git a/3rdparty/asmjit/tools/generator-cxx.js b/3rdparty/asmjit/tools/generator-cxx.js new file mode 100644 index 0000000000000..b1b1d946caeb4 --- /dev/null +++ b/3rdparty/asmjit/tools/generator-cxx.js @@ -0,0 +1,270 @@ +// This file is part of AsmJit project +// +// See asmjit.h or LICENSE.md for license and copyright information +// SPDX-License-Identifier: Zlib + +// C++ code generation helpers. +const commons = require("./generator-commons.js"); +const FATAL = commons.FATAL; + +// Utilities to convert primitives to C++ code. +class Utils { + static toHex(val, pad) { + if (val < 0) + val = 0xFFFFFFFF + val + 1; + + let s = val.toString(16); + if (pad != null && s.length < pad) + s = "0".repeat(pad - s.length) + s; + + return "0x" + s.toUpperCase(); + } + + static capitalize(s) { + s = String(s); + return !s ? s : s[0].toUpperCase() + s.substr(1); + } + + static camelCase(s) { + if (s == null || s === "") + return s; + + s = String(s); + if (/^[A-Z]+$/.test(s)) + return s.toLowerCase(); + else + return s[0].toLowerCase() + s.substr(1); + } + + static normalizeSymbolName(s) { + switch (s) { + case "and": + case "or": + case "xor": + return s + "_"; + default: + return s; + } + } + + static indent(s, indentation) { + if (typeof indentation === "number") + indentation = " ".repeat(indentation); + + var lines = s.split(/\r?\n/g); + if (indentation) { + for (var i = 0; i < lines.length; i++) { + var line = lines[i]; + if (line) + lines[i] = indentation + line; + } + } + + return lines.join("\n"); + } +} +exports.Utils = Utils; + +// A node that represents a C++ construct. +class Node { + constructor(kind) { + this.kind = kind; + } +}; +exports.Node = Node; + +// A single line of C++ code that declares a variable with optional initialization. +class Var extends Node { + constructor(type, name, init) { + super("var"); + + this.type = type; + this.name = name; + this.init = init || ""; + } + + toString() { + let s = this.type + " " + this.name; + if (this.init) + s += " = " + this.init; + return s + ";\n"; + } +}; +exports.Var = Var; + +// A single line of C++ code, which should not contain any branch or a variable declaration. +class Line extends Node { + constructor(code) { + super("line"); + + this.code = code; + } + + toString() { + return String(this.code) + "\n"; + } +}; +exports.Line = Line; + +// A block containing an array of `Node` items (may contain nested blocks, etc...). +class Block extends Node { + constructor(nodes) { + super("block"); + + this.nodes = nodes || []; + } + + isEmpty() { + return this.nodes.length === 0; + } + + appendNode(node) { + if (!(node instanceof Node)) + FATAL("Block.appendNode(): Node must be an instance of Node"); + + this.nodes.push(node); + return this; + } + + prependNode(node) { + if (!(node instanceof Node)) + FATAL("Block.prependNode(): Node must be an instance of Node"); + + this.nodes.unshift(node); + return this; + } + + insertNode(index, node) { + if (!(node instanceof Node)) + FATAL("Block.insertNode(): Node must be an instance of Node"); + + if (index >= this.nodes.length) + this.nodes.push(node); + else + this.nodes.splice(index, 0, node); + + return this; + } + + addVarDecl(type, name, init) { + let node = type; + + if (!(node instanceof Var)) + node = new Var(type, name, init); + + let i = 0; + while (i < this.nodes.length) { + const n = this.nodes[i]; + if (n.kind === "var" && n.name === node.name && n.init === node.init) + return this; + + if (n.kind !== "var") + break; + + i++; + } + + this.insertNode(i, node); + return this; + } + + addLine(code) { + if (typeof code !== "string") + FATAL("Block.addLine(): Line must be string"); + + this.nodes.push(new Line(code)); + return this; + } + + prependEmptyLine() { + if (!this.isEmpty()) + this.nodes.splice(0, 0, new Line("")); + return this; + } + + addEmptyLine() { + if (!this.isEmpty()) + this.nodes.push(new Line("")); + return this; + } + + toString() { + let s = ""; + for (let node of this.nodes) + s += String(node); + return s; + } +} +exports.Block = Block; + +// A C++ 'condition' (if statement) and its 'body' if it's taken. +class If extends Node { + constructor(cond, body) { + super("if"); + + if (body == null) + body = new Block(); + + if (!(body instanceof Block)) + FATAL("If() - body must be a Block"); + + this.cond = cond; + this.body = body; + } + + toString() { + const cond = String(this.cond); + const body = String(this.body); + + return `if (${cond}) {\n` + Utils.indent(body, 2) + `}\n`; + } +} +exports.If = If; + +//! A C++ switch statement. +class Case extends Node { + constructor(cond, body) { + super("case"); + + this.cond = cond; + this.body = body || new Block(); + } + + toString() { + let s = ""; + for (let node of this.body.nodes) + s += String(node) + + if (this.cond !== "default") + return `case ${this.cond}: {\n` + Utils.indent(s, 2) + `}\n`; + else + return `default: {\n` + Utils.indent(s, 2) + `}\n`; + } +}; +exports.Case = Case; + +class Switch extends Node { + constructor(expression, cases) { + super("switch"); + + this.expression = expression; + this.cases = cases || []; + } + + addCase(cond, body) { + this.cases.push(new Case(cond, body)); + return this; + } + + toString() { + let s = ""; + for (let c of this.cases) { + if (s) + s += "\n"; + s += String(c); + } + + return `switch (${this.expression}) {\n` + Utils.indent(s, 2) + `}\n`; + } +} +exports.Switch = Switch; diff --git a/3rdparty/asmjit/tools/tablegen-arm.js b/3rdparty/asmjit/tools/tablegen-a64.js similarity index 89% rename from 3rdparty/asmjit/tools/tablegen-arm.js rename to 3rdparty/asmjit/tools/tablegen-a64.js index e1c829358e22a..1466fc63b015f 100644 --- a/3rdparty/asmjit/tools/tablegen-arm.js +++ b/3rdparty/asmjit/tools/tablegen-a64.js @@ -1,37 +1,29 @@ -// [AsmJit] -// Machine Code Generation for C++. +// This file is part of AsmJit project // -// [License] -// ZLIB - See LICENSE.md file in the package. - -// ============================================================================ -// tablegen-arm.js -// ============================================================================ +// See asmjit.h or LICENSE.md for license and copyright information +// SPDX-License-Identifier: Zlib "use strict"; -const { executionAsyncResource } = require("async_hooks"); const core = require("./tablegen.js"); +const commons = require("./generator-commons.js"); const hasOwn = Object.prototype.hasOwnProperty; const asmdb = core.asmdb; -const kIndent = core.kIndent; -const IndexedArray = core.IndexedArray; -const StringUtils = core.StringUtils; +const kIndent = commons.kIndent; +const IndexedArray = commons.IndexedArray; +const StringUtils = commons.StringUtils; -const FAIL = core.FAIL; +const FATAL = commons.FATAL; // ============================================================================ // [ArmDB] // ============================================================================ -// Create ARM ISA. -const isa = new asmdb.arm.ISA(); - -// ============================================================================ -// [tablegen.arm.GenUtils] -// ============================================================================ +// Create AArch64 ISA. +const isa = new asmdb.aarch64.ISA(); +/* class GenUtils { // Get a list of instructions based on `name` and optional `mode`. static query(name, mode) { @@ -76,6 +68,7 @@ class GenUtils { return arr; } } +*/ // ============================================================================ // [tablegen.arm.ArmTableGen] @@ -133,11 +126,8 @@ class ArmTableGen extends core.TableGen { // [06] OpcodeDataIndex. "([^\\)]+)" + - "\\s*,\\s*" + - - // [07] NameDataIndex. - "([^\\)]+)" + "\\s*\\)" + , "g"); var m; @@ -168,14 +158,12 @@ class ArmTableGen extends core.TableGen { opcodeData : opcodeData, // Opcode data. opcodeDataIndex : -1, // Opcode data index. rwInfo : rwInfo, // RW info. - flags : instFlags, // Instruction flags. - - nameIndex : -1 // Index to InstDB::_nameData. + flags : instFlags // Instruction flags. }); } if (this.insts.length === 0 || this.insts.length !== StringUtils.countOf(stringData, "INST(")) - FAIL("ARMTableGen.parse(): Invalid parsing regexp (no data parsed)"); + FATAL("ARMTableGen.parse(): Invalid parsing regexp (no data parsed)"); console.log("Number of Instructions: " + this.insts.length); } @@ -188,8 +176,7 @@ class ArmTableGen extends core.TableGen { String(inst.opcodeData ).padEnd(86) + ", " + String(inst.rwInfo ).padEnd(10) + ", " + String(inst.flags ).padEnd(26) + ", " + - String(inst.opcodeDataIndex ).padEnd( 3) + ", " + - String(inst.nameIndex ).padEnd( 4) + ")"; + String(inst.opcodeDataIndex ).padEnd( 3) + ")" ; }) + "\n"; return this.inject("InstInfo", s, this.insts.length * 4); } diff --git a/3rdparty/asmjit/tools/tablegen-a64.sh b/3rdparty/asmjit/tools/tablegen-a64.sh new file mode 100644 index 0000000000000..2cbd85ece163a --- /dev/null +++ b/3rdparty/asmjit/tools/tablegen-a64.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +node ./tablegen-a64.js diff --git a/3rdparty/asmjit/tools/tablegen-arm.sh b/3rdparty/asmjit/tools/tablegen-arm.sh deleted file mode 100644 index 8545c1e71ba5d..0000000000000 --- a/3rdparty/asmjit/tools/tablegen-arm.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -node ./tablegen-arm.js diff --git a/3rdparty/asmjit/tools/tablegen-x86.js b/3rdparty/asmjit/tools/tablegen-x86.js index 4750edfa20596..377a71045e70e 100644 --- a/3rdparty/asmjit/tools/tablegen-x86.js +++ b/3rdparty/asmjit/tools/tablegen-x86.js @@ -3,86 +3,43 @@ // See asmjit.h or LICENSE.md for license and copyright information // SPDX-License-Identifier: Zlib -// ============================================================================ -// tablegen-x86.js -// -// The purpose of this script is to fetch all instructions' names into a single -// string and to optimize common patterns that appear in instruction data. It -// prevents relocation of small strings (instruction names) that has to be done -// by a linker to make all pointers the binary application/library uses valid. -// This approach decreases the final size of AsmJit binary and relocation data. -// -// NOTE: This script relies on 'asmdb' package. Either install it by using -// node.js package manager (npm) or by copying/symlinking the whole asmdb -// directory as [asmjit]/tools/asmdb. -// ============================================================================ - "use strict"; +const fs = require("fs"); +const path = require("path"); + +const commons = require("./generator-commons.js"); +const cxx = require("./generator-cxx.js"); const core = require("./tablegen.js"); + const asmdb = core.asmdb; -const kIndent = core.kIndent; -const Lang = core.Lang; -const CxxUtils = core.CxxUtils; -const MapUtils = core.MapUtils; -const ArrayUtils = core.ArrayUtils; -const StringUtils = core.StringUtils; -const IndexedArray = core.IndexedArray; +const DEBUG = commons.DEBUG; +const FATAL = commons.FATAL; +const kIndent = commons.kIndent; +const ArrayUtils = commons.ArrayUtils; +const IndexedArray = commons.IndexedArray; +const ObjectUtils = commons.ObjectUtils; +const StringUtils = commons.StringUtils; const hasOwn = Object.prototype.hasOwnProperty; const disclaimer = StringUtils.disclaimer; -const FAIL = core.FAIL; -const DEBUG = core.DEBUG; - const decToHex = StringUtils.decToHex; +function readJSON(fileName) { + const content = fs.readFileSync(fileName); + return JSON.parse(content); +} + +const x86data = readJSON(path.join(__dirname, "..", "db", asmdb.x86.dbName)); + // ============================================================================ // [tablegen.x86.x86isa] // ============================================================================ // Create the X86 database and add some special cases recognized by AsmJit. -const x86isa = new asmdb.x86.ISA({ - instructions: [ - // Imul in [reg, imm] form is encoded as [reg, reg, imm]. - ["imul", "r16, ib" , "RMI" , "66 6B /r ib" , "ANY OF=W SF=W ZF=U AF=U PF=U CF=W"], - ["imul", "r32, ib" , "RMI" , "6B /r ib" , "ANY OF=W SF=W ZF=U AF=U PF=U CF=W"], - ["imul", "r64, ib" , "RMI" , "REX.W 6B /r ib", "X64 OF=W SF=W ZF=U AF=U PF=U CF=W"], - ["imul", "r16, iw" , "RMI" , "66 69 /r iw" , "ANY OF=W SF=W ZF=U AF=U PF=U CF=W"], - ["imul", "r32, id" , "RMI" , "69 /r id" , "ANY OF=W SF=W ZF=U AF=U PF=U CF=W"], - ["imul", "r64, id" , "RMI" , "REX.W 69 /r id", "X64 OF=W SF=W ZF=U AF=U PF=U CF=W"], - - // Movabs (X64 only). - ["movabs", "W:r64, iq/uq" , "I" , "REX.W B8+r iq", "X64"], - ["movabs", "w:al, moff8" , "NONE", "A0" , "X64"], - ["movabs", "w:ax, moff16" , "NONE", "66 A1" , "X64"], - ["movabs", "W:eax, moff32", "NONE", "A1" , "X64"], - ["movabs", "W:rax, moff64", "NONE", "REX.W A1" , "X64"], - ["movabs", "W:moff8, al" , "NONE", "A2" , "X64"], - ["movabs", "W:moff16, ax" , "NONE", "66 A3" , "X64"], - ["movabs", "W:moff32, eax", "NONE", "A3" , "X64"], - ["movabs", "W:moff64, rax", "NONE", "REX.W A3" , "X64"] - ] -}); - -// Remapped instructions contain mapping between instructions that AsmJit expects -// and instructions provided by asmdb. In general, AsmJit uses string instructions -// (like cmps, movs, etc...) without the suffix, so we just remap these and keep -// all others. -const RemappedInsts = { - __proto__: null, - - "cmpsd": { names: ["cmpsd"] , rep: false }, - "movsd": { names: ["movsd"] , rep: false }, - "cmps" : { names: ["cmpsb", "cmpsw", "cmpsd", "cmpsq"], rep: true }, - "movs" : { names: ["movsb", "movsw", "movsd", "movsq"], rep: true }, - "lods" : { names: ["lodsb", "lodsw", "lodsd", "lodsq"], rep: null }, - "scas" : { names: ["scasb", "scasw", "scasd", "scasq"], rep: null }, - "stos" : { names: ["stosb", "stosw", "stosd", "stosq"], rep: null }, - "ins" : { names: ["insb" , "insw" , "insd" ] , rep: null }, - "outs" : { names: ["outsb", "outsw", "outsd"] , rep: null } -}; +const x86isa = new asmdb.x86.ISA(x86data); // ============================================================================ // [tablegen.x86.Filter] @@ -95,7 +52,7 @@ class Filter { for (var i = 0; i < instArray.length; i++) { const inst = instArray[i]; - if (inst.attributes.AltForm) + if (inst.altForm) continue; const s = inst.operands.map((op) => { return op.isImm() ? "imm" : op.toString(); }).join(", "); @@ -113,7 +70,7 @@ class Filter { const result = []; for (var i = 0; i < instArray.length; i++) { const inst = instArray[i]; - if (inst.attributes.AltForm) + if (inst.altForm) continue; result.push(inst); } @@ -167,7 +124,28 @@ class GenUtils { } static cpuFeaturesOf(dbInsts) { - return ArrayUtils.sorted(dbInsts.unionCpuFeatures()); + function cmp(a, b) { + if (a.startsWith("AVX512") && !b.startsWith("AVX512")) + return 1; + if (b.startsWith("AVX512") && !a.startsWith("AVX512")) + return -1; + + if (a.startsWith("AVX") && !b.startsWith("AVX")) + return 1; + if (b.startsWith("AVX") && !a.startsWith("AVX")) + return -1; + + if (a === "FPU" && b !== "FPU") + return 1; + if (b === "FPU" && a !== "FPU") + return -1; + + return a < b ? -1 : a === b ? 0 : 1; + } + + const features = Object.getOwnPropertyNames(dbInsts.unionCpuFeatures()); + features.sort(cmp); + return features; } static assignVexEvexCompatibilityFlags(f, dbInsts) { @@ -261,16 +239,16 @@ class GenUtils { const dbInst = dbInsts[i]; const operands = dbInst.operands; - if (dbInst.attributes.Lock ) f.Lock = true; - if (dbInst.attributes.XAcquire ) f.XAcquire = true; - if (dbInst.attributes.XRelease ) f.XRelease = true; - if (dbInst.attributes.BND ) f.Rep = true; - if (dbInst.attributes.REP ) f.Rep = true; - if (dbInst.attributes.REPNE ) f.Rep = true; - if (dbInst.attributes.RepIgnored ) f.RepIgnored = true; - if (dbInst.attributes.ImplicitZeroing) f.Avx512ImplicitZ = true; + if (dbInst.prefixes.lock ) f.Lock = true; + if (dbInst.prefixes.xacquire ) f.XAcquire = true; + if (dbInst.prefixes.xrelease ) f.XRelease = true; + if (dbInst.prefixes.bnd ) f.Rep = true; + if (dbInst.prefixes.rep ) f.Rep = true; + if (dbInst.prefixes.repne ) f.Rep = true; + if (dbInst.prefixes.repIgnore ) f.RepIgnored = true; + if (dbInst.k === "zeroing" ) f.Avx512ImplicitZ = true; - if (dbInst.fpu) { + if (dbInst.category.FPU) { for (var j = 0; j < operands.length; j++) { const op = operands[j]; if (op.memSize === 16) f.FpuM16 = true; @@ -280,7 +258,7 @@ class GenUtils { } } - if (dbInst.attributes.Tsib) + if (dbInst.tsib) f.Tsib = true; if (dbInst.vsibReg) @@ -289,12 +267,11 @@ class GenUtils { if (dbInst.prefix === "VEX" || dbInst.prefix === "XOP") f.Vex = true; + if (dbInst.encodingPreference === "EVEX") + f.PreferEvex = true; + if (dbInst.prefix === "EVEX") { f.Evex = true; - - if (dbInst.extensions["AVX512_VNNI"]) - f.PreferEvex = true; - if (dbInst.kmask) f.Avx512K = true; if (dbInst.zmask) f.Avx512Z = true; @@ -418,7 +395,7 @@ class GenUtils { } } - static fixedRegOf(reg) { + static fixedRegOfRegName(reg) { switch (reg) { case "es" : return 1; case "cs" : return 2; @@ -447,11 +424,23 @@ class GenUtils { } } + static fixedRegOf(op) { + if (op.isReg()) { + return GenUtils.fixedRegOfRegName(op.reg); + } + else if (op.isMem() && op.memRegOnly) { + return GenUtils.fixedRegOfRegName(op.memRegOnly); + } + else { + return -1; + } + } + static controlFlow(dbInsts) { - if (dbInsts.checkAttribute("Control", "Jump")) return "Jump"; - if (dbInsts.checkAttribute("Control", "Call")) return "Call"; - if (dbInsts.checkAttribute("Control", "Branch")) return "Branch"; - if (dbInsts.checkAttribute("Control", "Return")) return "Return"; + if (dbInsts.checkAttribute("control", "jump")) return "Jump"; + if (dbInsts.checkAttribute("control", "call")) return "Call"; + if (dbInsts.checkAttribute("control", "branch")) return "Branch"; + if (dbInsts.checkAttribute("control", "return")) return "Return"; return "Regular"; } } @@ -473,16 +462,7 @@ class X86TableGen extends core.TableGen { // Get instructions (dbInsts) having the same name as understood by AsmJit. query(name) { - const remapped = RemappedInsts[name]; - if (!remapped) return x86isa.query(name); - - const dbInsts = x86isa.query(remapped.names); - const rep = remapped.rep; - if (rep === null) return dbInsts; - - return dbInsts.filter((inst) => { - return rep === !!(inst.attributes.REP || inst.attributes.REPNE); - }); + return x86isa.query(name); } // -------------------------------------------------------------------------- @@ -500,9 +480,8 @@ class X86TableGen extends core.TableGen { // --- autogenerated fields --- "([^\\)]+)" + "," + // [05] MainOpcodeIndex. "([^\\)]+)" + "," + // [06] AltOpcodeIndex. - "([^\\)]+)" + "," + // [07] NameIndex. - "([^\\)]+)" + "," + // [08] CommonDataIndex. - "([^\\)]+)" + "\\)", // [09] OperationDataIndex. + "([^\\)]+)" + "," + // [07] CommonDataIndex. + "([^\\)]+)" + "\\)", // [08] OperationDataIndex. "g"); var m; @@ -515,7 +494,7 @@ class X86TableGen extends core.TableGen { const dbInsts = this.query(name); if (name && !dbInsts.length) - FAIL(`Instruction '${name}' not found in asmdb`); + FATAL(`Instruction '${name}' not found in asmdb`); const flags = GenUtils.flagsOf(dbInsts); const controlFlow = GenUtils.controlFlow(dbInsts); @@ -548,7 +527,7 @@ class X86TableGen extends core.TableGen { } if (this.insts.length === 0) - FAIL("X86TableGen.parse(): Invalid parsing regexp (no data parsed)"); + FATAL("X86TableGen.parse(): Invalid parsing regexp (no data parsed)"); console.log("Number of Instructions: " + this.insts.length); } @@ -562,7 +541,6 @@ class X86TableGen extends core.TableGen { String(inst.opcode1 ).padEnd(26) + ", " + String(inst.mainOpcodeIndex ).padEnd( 3) + ", " + String(inst.altOpcodeIndex ).padEnd( 3) + ", " + - String(inst.nameIndex ).padEnd( 5) + ", " + String(inst.commonInfoIndex ).padEnd( 3) + ", " + String(inst.additionalInfoIndex).padEnd( 3) + ")"; }) + "\n"; @@ -574,7 +552,7 @@ class X86TableGen extends core.TableGen { // -------------------------------------------------------------------------- printMissing() { - const ignored = MapUtils.arrayToMap([ + const ignored = ArrayUtils.toDict([ "cmpsb", "cmpsw", "cmpsd", "cmpsq", "lodsb", "lodsw", "lodsd", "lodsq", "movsb", "movsw", "movsd", "movsq", @@ -832,7 +810,7 @@ class IdEnum extends core.IdEnum { var text = ""; var features = GenUtils.cpuFeaturesOf(dbInsts); - const priorityFeatures = ["AVX_VNNI"]; + const priorityFeatures = ["AVX_VNNI", "AVX_VNNI_INT8", "AVX_IFMA", "AVX_NE_CONVERT"]; if (features.length) { text += "{"; @@ -970,7 +948,7 @@ class AltOpcodeTable extends core.Task { components[2] = "00"; } else { - FAIL(`Failed to process opcode '${opcode}'`); + FATAL(`Failed to process opcode '${opcode}'`); } const newOpcode = joinOpcodeComponents(components); @@ -1009,8 +987,8 @@ class AltOpcodeTable extends core.Task { // [tablegen.x86.InstSignatureTable] // ============================================================================ -const RegOp = MapUtils.arrayToMap(["al", "ah", "ax", "eax", "rax", "cl", "r8lo", "r8hi", "r16", "r32", "r64", "xmm", "ymm", "zmm", "mm", "k", "sreg", "creg", "dreg", "st", "bnd"]); -const MemOp = MapUtils.arrayToMap(["m8", "m16", "m32", "m48", "m64", "m80", "m128", "m256", "m512", "m1024"]); +const RegOp = ArrayUtils.toDict(["al", "ah", "ax", "eax", "rax", "cl", "r8lo", "r8hi", "r16", "r32", "r64", "xmm", "ymm", "zmm", "mm", "k", "sreg", "creg", "dreg", "st", "bnd"]); +const MemOp = ArrayUtils.toDict(["m8", "m16", "m32", "m48", "m64", "m80", "m128", "m256", "m512", "m1024"]); const cmpOp = StringUtils.makePriorityCompare([ "RegGpbLo", "RegGpbHi", "RegGpw", "RegGpd", "RegGpq", "RegXmm", "RegYmm", "RegZmm", "RegMm", "RegKReg", "RegSReg", "RegCReg", "RegDReg", "RegSt", "RegBnd", "RegTmm", @@ -1037,7 +1015,7 @@ function StringifyOpArray(a, map) { else if (hasOwn.call(map, op)) mapped = map[op]; else - FAIL(`UNHANDLED OPERAND '${op}'`); + FATAL(`UNHANDLED OPERAND '${op}'`); s += (s ? " | " : "") + mapped; } return s ? s : "0"; @@ -1049,11 +1027,11 @@ class OSignature { } equals(other) { - return MapUtils.equals(this.flags, other.flags); + return ObjectUtils.equals(this.flags, other.flags); } xor(other) { - const result = MapUtils.xor(this.flags, other.flags); + const result = ObjectUtils.xor(this.flags, other.flags); return Object.getOwnPropertyNames(result).length === 0 ? null : result; } @@ -1254,14 +1232,14 @@ class ISignature extends Array { mergeWith(other) { // If both architectures are the same, it's fine to merge. - var ok = this.x86 === other.x86 && this.x64 === other.x64; + const sameArch = this.x86 === other.x86 && this.x64 === other.x64; // If the first arch is [X86|X64] and the second [X64] it's also fine. - if (!ok && this.x86 && this.x64 && !other.x86 && other.x64) - ok = true; + // if (!ok && this.x86 && this.x64 && !other.x86 && other.x64) + // ok = true; // It's not ok if both signatures have different number of implicit operands. - if (!ok || this.implicit !== other.implicit) + if (!sameArch || this.implicit !== other.implicit) return false; // It's not ok if both signatures have different number of operands. @@ -1269,8 +1247,8 @@ class ISignature extends Array { if (len !== other.length) return false; - var xorIndex = -1; - for (var i = 0; i < len; i++) { + let xorIndex = -1; + for (let i = 0; i < len; i++) { const xor = this[i].xor(other[i]); if (xor === null) continue; @@ -1281,12 +1259,9 @@ class ISignature extends Array { } // Bail if mergeWidth at operand-level failed. - if (xorIndex !== -1 && !this[xorIndex].mergeWith(other[xorIndex])) + if (xorIndex === -1 || !this[xorIndex].mergeWith(other[xorIndex])) return false; - this.x86 = this.x86 || other.x86; - this.x64 = this.x64 || other.x64; - return true; } @@ -1297,14 +1272,14 @@ class ISignature extends Array { class SignatureArray extends Array { // Iterate over all signatures and check which operands don't need explicit memory size. - calcImplicitMemSize() { + calcImplicitMemSize(instName) { // Calculates a hash-value (aka key) of all register operands specified by `regOps` in `inst`. function keyOf(inst, regOps) { var s = ""; for (var i = 0; i < inst.length; i++) { const op = inst[i]; if (regOps & (1 << i)) - s += "{" + ArrayUtils.sorted(MapUtils.and(op.flags, RegOp)).join("|") + "}"; + s += "{" + ArrayUtils.sorted(ObjectUtils.and(op.flags, RegOp)).join("|") + "}"; } return s || "?"; } @@ -1323,7 +1298,7 @@ class SignatureArray extends Array { // Check if this instruction signature has a memory operand of explicit size. for (i = 0; i < len; i++) { const aOp = aInst[i]; - const mem = MapUtils.firstOf(aOp.flags, MemOp); + const mem = ObjectUtils.findKey(aOp.flags, MemOp); if (mem) { // Stop if the memory operand has implicit-size or if there is more than one. @@ -1336,7 +1311,7 @@ class SignatureArray extends Array { memPos = i; } } - else if (MapUtils.anyOf(aOp.flags, RegOp)) { + else if (ObjectUtils.hasAny(aOp.flags, RegOp)) { // Doesn't consider 'r/m' as we already checked 'm'. regOps |= (1 << i); } @@ -1361,7 +1336,7 @@ class SignatureArray extends Array { for (i = 0; i < len; i++) { if (i === memPos) continue; - const reg = MapUtils.anyOf(bInst[i].flags, RegOp); + const reg = ObjectUtils.hasAny(bInst[i].flags, RegOp); if (regOps & (1 << i)) hasMatch &= reg; else if (reg) @@ -1372,7 +1347,7 @@ class SignatureArray extends Array { const bOp = bInst[memPos]; if (bOp.flags.mem) continue; - const mem = MapUtils.firstOf(bOp.flags, MemOp); + const mem = ObjectUtils.findKey(bOp.flags, MemOp); if (mem === memOp) { sameSizeSet.push(bInst); } @@ -1412,6 +1387,8 @@ class SignatureArray extends Array { // then keep this implicit as it won't do any harm. These instructions // cannot be mixed and it will make implicit the 32-bit one in cases // where X64 introduced 64-bit ones like `cvtsi2ss`. + if (!/^(bndcl|bndcn|bndcu|ptwrite|(v)?cvtsi2ss|(v)?cvtsi2sd|vcvtusi2ss|vcvtusi2sd)$/.test(instName)) + implicit = false; } else { implicit = false; @@ -1424,8 +1401,9 @@ class SignatureArray extends Array { // Patch all instructions to accept implicit-size memory operand. for (bIndex = 0; bIndex < sameSizeSet.length; bIndex++) { const bInst = sameSizeSet[bIndex]; - if (implicit) + if (implicit) { bInst[memPos].flags.mem = true; + } if (!implicit) DEBUG(`${this.name}: Explicit: ${bInst}`); @@ -1594,7 +1572,9 @@ class InstSignatureTable extends core.Task { } makeSignatures(dbInsts) { + const instName = dbInsts.length ? dbInsts[0].name : ""; const signatures = new SignatureArray(); + for (var i = 0; i < dbInsts.length; i++) { const inst = dbInsts[i]; const ops = inst.operands; @@ -1678,29 +1658,9 @@ class InstSignatureTable extends core.Task { op.flags.implicit = true; } - const seg = iop.memSeg; + const seg = iop.memSegment; if (seg) { switch (inst.name) { - case "cmpsb": op.flags.m8 = true; break; - case "cmpsw": op.flags.m16 = true; break; - case "cmpsd": op.flags.m32 = true; break; - case "cmpsq": op.flags.m64 = true; break; - case "lodsb": op.flags.m8 = true; break; - case "lodsw": op.flags.m16 = true; break; - case "lodsd": op.flags.m32 = true; break; - case "lodsq": op.flags.m64 = true; break; - case "movsb": op.flags.m8 = true; break; - case "movsw": op.flags.m16 = true; break; - case "movsd": op.flags.m32 = true; break; - case "movsq": op.flags.m64 = true; break; - case "scasb": op.flags.m8 = true; break; - case "scasw": op.flags.m16 = true; break; - case "scasd": op.flags.m32 = true; break; - case "scasq": op.flags.m64 = true; break; - case "stosb": op.flags.m8 = true; break; - case "stosw": op.flags.m16 = true; break; - case "stosd": op.flags.m32 = true; break; - case "stosq": op.flags.m64 = true; break; case "insb": op.flags.m8 = true; break; case "insw": op.flags.m16 = true; break; case "insd": op.flags.m32 = true; break; @@ -1720,6 +1680,9 @@ class InstSignatureTable extends core.Task { default: console.log(`UNKNOWN MEM IN INSTRUCTION '${inst.name}'`); break; } + if (iop.memRegOnly) + reg = iop.memRegOnly; + if (seg === "ds") op.flags.memDS = true; if (seg === "es") op.flags.memES = true; if (reg === "reg") { op.flags.memBase = true; } @@ -1732,30 +1695,37 @@ class InstSignatureTable extends core.Task { else if (reg) { if (reg == "r8") { op.flags["r8lo"] = true; - op.flags["r8hi"] = true; + + if (!inst.w || inst.w === "W0") + op.flags["r8hi"] = true; } else { op.flags[reg] = true; } } + if (mem) { op.flags[mem] = true; - // HACK: Allow LEA|CL*|PREFETCH* to use any memory size. - if (/^(cldemote|clwb|clflush\w*|lea|prefetch\w*)$/.test(inst.name)) { + // HACK: Allow LEA to use any memory size. + if (/^(lea)$/.test(inst.name)) { op.flags.mem = true; Object.assign(op.flags, MemOp); } // HACK: These instructions specify explicit memory size, but it's just informational. - if (inst.name === "enqcmd" || inst.name === "enqcmds" || inst.name === "movdir64b") + if (/^(call|enqcmd|enqcmds|lcall|ljmp|movdir64b)$/.test(inst.name)) { op.flags.mem = true; - + } } + if (imm) { if (iop.immSign === "any" || iop.immSign === "signed" ) op.flags["i" + imm] = true; if (iop.immSign === "any" || iop.immSign === "unsigned") op.flags["u" + imm] = true; } - if (rel) op.flags["rel" + rel] = true; + + if (rel) { + op.flags["rel" + rel] = true; + } row.push(op); } @@ -1766,8 +1736,8 @@ class InstSignatureTable extends core.Task { } } - if (signatures.length && GenUtils.canUseImplicitMemSize(dbInsts[0].name)) - signatures.calcImplicitMemSize(); + if (signatures.length && GenUtils.canUseImplicitMemSize(instName)) + signatures.calcImplicitMemSize(instName); signatures.compact(); return signatures; @@ -1839,7 +1809,7 @@ class AdditionalInfoTable extends core.Task { break; } - const instFlagsIndex = instFlagsTable.addIndexed("InstRWFlags(" + CxxUtils.flags(instFlags, (f) => { return `FLAG(${f})`; }, "FLAG(None)") + ")"); + const instFlagsIndex = instFlagsTable.addIndexed("InstRWFlags(" + StringUtils.formatCppFlags(instFlags, (f) => { return `FLAG(${f})`; }, "FLAG(None)") + ")"); const rwInfoIndex = rwInfoTable.addIndexed(`{ ${rData}, ${wData} }`); inst.additionalInfoIndex = additionaInfoTable.addIndexed(`{ ${instFlagsIndex}, ${rwInfoIndex}, { ${features} } }`); @@ -1870,7 +1840,7 @@ class AdditionalInfoTable extends core.Task { if (dbInst.name === "mov") continue; - const specialRegs = dbInst.specialRegs; + const regs = dbInst.io; // Mov is a special case, moving to/from control regs makes flags undefined, // which we don't want to have in `X86InstDB::operationData`. This is, thus, @@ -1878,28 +1848,28 @@ class AdditionalInfoTable extends core.Task { if (dbInst.name === "mov") continue; - for (var specialReg in specialRegs) { + for (var reg in regs) { var flag = ""; - switch (specialReg) { - case "FLAGS.CF": flag = "CF"; break; - case "FLAGS.OF": flag = "OF"; break; - case "FLAGS.SF": flag = "SF"; break; - case "FLAGS.ZF": flag = "ZF"; break; - case "FLAGS.AF": flag = "AF"; break; - case "FLAGS.PF": flag = "PF"; break; - case "FLAGS.DF": flag = "DF"; break; - case "FLAGS.IF": flag = "IF"; break; - //case "FLAGS.TF": flag = "TF"; break; - case "FLAGS.AC": flag = "AC"; break; - case "X86SW.C0": flag = "C0"; break; - case "X86SW.C1": flag = "C1"; break; - case "X86SW.C2": flag = "C2"; break; - case "X86SW.C3": flag = "C3"; break; + switch (reg) { + case "CF": flag = "CF"; break; + case "OF": flag = "OF"; break; + case "SF": flag = "SF"; break; + case "ZF": flag = "ZF"; break; + case "AF": flag = "AF"; break; + case "PF": flag = "PF"; break; + case "DF": flag = "DF"; break; + case "IF": flag = "IF"; break; + //case "TF": flag = "TF"; break; + case "AC": flag = "AC"; break; + case "C0": flag = "C0"; break; + case "C1": flag = "C1"; break; + case "C2": flag = "C2"; break; + case "C3": flag = "C3"; break; default: continue; } - switch (specialRegs[specialReg]) { + switch (regs[reg]) { case "R": r[flag] = true; break; @@ -1924,7 +1894,7 @@ class AdditionalInfoTable extends core.Task { // [tablegen.x86.InstRWInfoTable] // ============================================================================ -const NOT_MEM_AMBIGUOUS = MapUtils.arrayToMap([ +const NOT_MEM_AMBIGUOUS = ArrayUtils.toDict([ "call", "movq" ]); @@ -1997,20 +1967,20 @@ class InstRWInfoTable extends core.Task { run() { const insts = this.ctx.insts; - const noRmInfo = CxxUtils.struct( + const noRmInfo = StringUtils.formatCppStruct( "InstDB::RWInfoRm::kCategory" + "None".padEnd(10), StringUtils.decToHex(0, 2), String(0).padEnd(2), - CxxUtils.flags({}), + StringUtils.formatCppFlags({}), "0" ); - const noOpInfo = CxxUtils.struct( + const noOpInfo = StringUtils.formatCppStruct( "0x0000000000000000u", "0x0000000000000000u", "0xFF", "0", - CxxUtils.struct(0), + StringUtils.formatCppStruct(0), "OpRWFlags::kNone" ); @@ -2049,7 +2019,7 @@ class InstRWInfoTable extends core.Task { if (opAcc === "R") flags.Read = true; if (opAcc === "W") flags.Write = true; if (opAcc === "X") flags.RW = true; - Lang.merge(flags, op.flags); + ObjectUtils.merge(flags, op.flags); const rIndex = opAcc === "X" || opAcc === "R" ? op.index : -1; const rWidth = opAcc === "X" || opAcc === "R" ? op.width : -1; @@ -2058,23 +2028,23 @@ class InstRWInfoTable extends core.Task { const consecutiveLeadCount = op.clc; - const opData = CxxUtils.struct( + const opData = StringUtils.formatCppStruct( this.byteMaskFromBitRanges([{ start: rIndex, end: rIndex + rWidth - 1 }]) + "u", this.byteMaskFromBitRanges([{ start: wIndex, end: wIndex + wWidth - 1 }]) + "u", StringUtils.decToHex(op.fixed === -1 ? 0xFF : op.fixed, 2), String(consecutiveLeadCount), - CxxUtils.struct(0), - CxxUtils.flags(flags, function(flag) { return "OpRWFlags::k" + flag; }, "OpRWFlags::kNone") + StringUtils.formatCppStruct(0), + StringUtils.formatCppFlags(flags, function(flag) { return "OpRWFlags::k" + flag; }, "OpRWFlags::kNone") ); rwOpsIndex.push(this.opInfoTable.addIndexed(opData)); } - const rmData = CxxUtils.struct( + const rmData = StringUtils.formatCppStruct( "InstDB::RWInfoRm::kCategory" + rmInfo.category.padEnd(10), StringUtils.decToHex(rmInfo.rmIndexes, 2), String(Math.max(rmInfo.memFixed, 0)).padEnd(2), - CxxUtils.flags({ + StringUtils.formatCppFlags({ "InstDB::RWInfoRm::kFlagAmbiguous": Boolean(rmInfo.memAmbiguous), "InstDB::RWInfoRm::kFlagMovssMovsd": Boolean(inst.name === "movss" || inst.name === "movsd"), "InstDB::RWInfoRm::kFlagPextrw": Boolean(inst.name === "pextrw"), @@ -2083,10 +2053,10 @@ class InstRWInfoTable extends core.Task { rmInfo.memExtension === "None" ? "0" : "uint32_t(CpuFeatures::X86::k" + rmInfo.memExtension + ")" ); - const rwData = CxxUtils.struct( + const rwData = StringUtils.formatCppStruct( "InstDB::RWInfo::kCategory" + rwInfo.category.padEnd(10), String(this.rmInfoTable.addIndexed(rmData)).padEnd(2), - CxxUtils.struct(...(rwOpsIndex.map(function(item) { return String(item).padEnd(2); }))) + StringUtils.formatCppStruct(...(rwOpsIndex.map(function(item) { return String(item).padEnd(2); }))) ); if (i == 0) @@ -2134,7 +2104,7 @@ class InstRWInfoTable extends core.Task { for (var j = start; j <= end; j++) { const bytePos = j >> 3; if (bytePos < 0 || bytePos >= arr.length) - FAIL(`Range ${start}:${end} cannot be used to create a byte-mask`); + FATAL(`Range ${start}:${end} cannot be used to create a byte-mask`); arr[bytePos] = 1; } } @@ -2165,7 +2135,7 @@ class InstRWInfoTable extends core.Task { access: op.read && op.write ? "X" : op.read ? "R" : op.write ? "W" : "?", clc: 0, flags: {}, - fixed: GenUtils.fixedRegOf(op.reg), + fixed: GenUtils.fixedRegOf(op), index: op.rwxIndex, width: op.rwxWidth }; @@ -2195,10 +2165,26 @@ class InstRWInfoTable extends core.Task { if (op.consecutiveLeadCount) d.clc = op.consecutiveLeadCount; - if (op.isReg()) - d.fixed = GenUtils.fixedRegOf(op.reg); - else - d.fixed = GenUtils.fixedRegOf(op.mem); + const instName = dbInst.name; + // NOTE: Avoid push/pop here as PUSH/POP has many variations for segment registers, + // which would set 'd.fixed' field even for GP variation of the instuction. + if (instName !== "push" && instName !== "pop") { + d.fixed = GenUtils.fixedRegOf(op); + } + + switch (instName) { + case "vfcmaddcph": + case "vfmaddcph": + case "vfcmaddcsh": + case "vfmaddcsh": + case "vfcmulcsh": + case "vfmulcsh": + case "vfcmulcph": + case "vfmulcph": + if (j === 0) + d.flags.Unique = true; + break; + } if (op.zext) d.flags.ZExt = true; @@ -2215,7 +2201,7 @@ class InstRWInfoTable extends core.Task { } if (d.fixed !== -1) { - if (op.memSeg) + if (op.memSegment) d.flags.MemPhysId = true; else d.flags.RegPhysId = true; @@ -2225,16 +2211,26 @@ class InstRWInfoTable extends core.Task { rwOps[j] = d; } else { - if (!Lang.deepEqExcept(rwOps[j], d, { "fixed": true, "flags": true })) + if (!ObjectUtils.equalsExcept(rwOps[j], d, { "fixed": true, "flags": true })) return null; if (rwOps[j].fixed === -1) rwOps[j].fixed = d.fixed; - Lang.merge(rwOps[j].flags, d.flags); + ObjectUtils.merge(rwOps[j].flags, d.flags); } } } - return { category: "Generic", rwOps }; + + const name = dbInsts.length ? dbInsts[0].name : ""; + + switch (name) { + case "vpternlogd": + case "vpternlogq": + return { category: "GenericEx", rwOps }; + + default: + return { category: "Generic", rwOps }; + } } function queryRwByData(dbInsts, rwOpsArray) { @@ -2243,12 +2239,13 @@ class InstRWInfoTable extends core.Task { const operands = dbInst.operands; const rwOps = nullOps(); - for (var j = 0; j < operands.length; j++) + for (var j = 0; j < operands.length; j++) { rwOps[j] = makeRwFromOp(operands[j]) + } var match = 0; for (var j = 0; j < rwOpsArray.length; j++) - match |= Lang.deepEq(rwOps, rwOpsArray[j]); + match |= ObjectUtils.equals(rwOps, rwOpsArray[j]); if (!match) return false; @@ -2292,7 +2289,7 @@ class InstRWInfoTable extends core.Task { if (queryRwByData(dbInsts, this.rwCategoryByData[k])) return { category: k, rwOps: nullOps() }; - // FAILURE: Missing data to categorize this instruction. + // FATALURE: Missing data to categorize this instruction. if (name) { const items = dumpRwToData(dbInsts) console.log(`RW: ${dbInsts.length ? dbInsts[0].name : ""}:`); @@ -2305,7 +2302,7 @@ class InstRWInfoTable extends core.Task { } rwOpFlagsForInstruction(instName, opIndex) { - const toMap = MapUtils.arrayToMap; + const toMap = ArrayUtils.toDict; // TODO: We should be able to get this information from asmdb. switch (instName + "@" + opIndex) { @@ -2382,7 +2379,7 @@ class InstRWInfoTable extends core.Task { if (/^(punpcklbw|punpckldq|punpcklwd)$/.test(dbInst.name)) return "None"; - return StringUtils.capitalize(dbInst.name); + return cxx.Utils.capitalize(dbInst.name); } } diff --git a/3rdparty/asmjit/tools/tablegen.js b/3rdparty/asmjit/tools/tablegen.js index fdc65fd1cbdb0..a151805675be6 100644 --- a/3rdparty/asmjit/tools/tablegen.js +++ b/3rdparty/asmjit/tools/tablegen.js @@ -12,618 +12,227 @@ "use strict"; -const VERBOSE = false; - // ============================================================================ // [Imports] // ============================================================================ const fs = require("fs"); -const hasOwn = Object.prototype.hasOwnProperty; -const asmdb = (function() { - // Try to import a local 'asmdb' package, if available. - try { - return require("./asmdb"); - } - catch (ex) { - if (ex.code !== "MODULE_NOT_FOUND") { - console.log(`FATAL ERROR: ${ex.message}`); - throw ex; - } - } +const commons = require("./generator-commons.js"); +const cxx = require("./generator-cxx.js"); +const asmdb = require("../db"); - // Try to import global 'asmdb' package as local package is not available. - return require("asmdb"); -})(); exports.asmdb = asmdb; +exports.exp = asmdb.base.exp; -// ============================================================================ -// [Constants] -// ============================================================================ +const hasOwn = Object.prototype.hasOwnProperty; -const kIndent = " "; -const kJustify = 119; -const kAsmJitRoot = ".."; +const FATAL = commons.FATAL; +const StringUtils = commons.StringUtils; -exports.kIndent = kIndent; -exports.kJustify = kJustify; +const kAsmJitRoot = ".."; exports.kAsmJitRoot = kAsmJitRoot; // ============================================================================ -// [Debugging] +// [InstructionNameData] // ============================================================================ -function DEBUG(msg) { - if (VERBOSE) - console.log(msg); -} -exports.DEBUG = DEBUG; - -function WARN(msg) { - console.log(msg); -} -exports.WARN = WARN; - -function FAIL(msg) { - console.log(`FATAL ERROR: ${msg}`); - throw new Error(msg); +function charTo5Bit(c) { + if (c >= 'a' && c <= 'z') + return 1 + (c.charCodeAt(0) - 'a'.charCodeAt(0)); + else if (c >= '0' && c <= '4') + return 1 + 26 + (c.charCodeAt(0) - '0'.charCodeAt(0)); + else + FATAL(`Character '${c}' cannot be encoded into a 5-bit string`); } -exports.FAIL = FAIL; - -// ============================================================================ -// [Lang] -// ============================================================================ - -function nop(x) { return x; } -class Lang { - static merge(a, b) { - if (a === b) - return a; - - for (var k in b) { - var av = a[k]; - var bv = b[k]; - - if (typeof av === "object" && typeof bv === "object") - Lang.merge(av, bv); - else - a[k] = bv; - } - - return a; +class InstructionNameData { + constructor() { + this.names = []; + this.primaryTable = []; + this.stringTable = ""; + this.size = 0; + this.indexComment = []; + this.maxNameLength = 0; } - static deepEq(a, b) { - if (a === b) - return true; - - if (typeof a !== typeof b) - return false; - - if (typeof a !== "object") - return a === b; - - if (Array.isArray(a) || Array.isArray(b)) { - if (Array.isArray(a) !== Array.isArray(b)) - return false; - - const len = a.length; - if (b.length !== len) - return false; - - for (var i = 0; i < len; i++) - if (!Lang.deepEq(a[i], b[i])) - return false; + add(s) { + // First try to encode the string with 5-bit characters that fit into a 32-bit int. + if (/^[a-z0-4]{0,6}$/.test(s)) { + let index = 0; + for (let i = 0; i < s.length; i++) + index |= charTo5Bit(s[i]) << (i * 5); + + this.names.push(s); + this.primaryTable.push(index | (1 << 31)); + this.indexComment.push(`Small '${s}'.`); } else { - if (a === null || b === null) - return a === b; - - for (var k in a) - if (!hasOwn.call(b, k) || !Lang.deepEq(a[k], b[k])) - return false; - - for (var k in b) - if (!hasOwn.call(a, k)) - return false; + // Put the string into a string table. + this.names.push(s); + this.primaryTable.push(-1); + this.indexComment.push(``); } - return true; + if (this.maxNameLength < s.length) + this.maxNameLength = s.length; } - static deepEqExcept(a, b, except) { - if (a === b) - return true; - - if (typeof a !== "object" || typeof b !== "object" || Array.isArray(a) || Array.isArray(b)) - return Lang.deepEq(a, b); - - for (var k in a) - if (!hasOwn.call(except, k) && (!hasOwn.call(b, k) || !Lang.deepEq(a[k], b[k]))) - return false; - - for (var k in b) - if (!hasOwn.call(except, k) && !hasOwn.call(a, k)) - return false; - - return true; - } -} -exports.Lang = Lang; - -// ============================================================================ -// [StringUtils] -// ============================================================================ - -class StringUtils { - static asString(x) { return String(x); } - - static countOf(s, pattern) { - if (!pattern) - FAIL(`Pattern cannot be empty`); - - var n = 0; - var pos = 0; + index() { + const kMaxPrefixSize = 15; + const kMaxSuffixSize = 7; + const names = []; - while ((pos = s.indexOf(pattern, pos)) >= 0) { - n++; - pos += pattern.length; + for (let idx = 0; idx < this.primaryTable.length; idx++) { + if (this.primaryTable[idx] === -1) { + names.push({ name: this.names[idx], index: idx }); + } } - return n; - } + names.sort(function(a, b) { + if (a.name.length > b.name.length) + return -1; + if (a.name.length < b.name.length) + return 1; + return (a > b) ? 1 : (a < b) ? -1 : 0; + }); - static capitalize(s) { - s = String(s); - return !s ? s : s[0].toUpperCase() + s.substr(1); - } + for (let z = 0; z < names.length; z++) { + const idx = names[z].index; + const name = names[z].name; - static trimLeft(s) { return s.replace(/^\s+/, ""); } - static trimRight(s) { return s.replace(/\s+$/, ""); } + let done = false; + let longestPrefix = 0; + let longestSuffix = 0; - static upFirst(s) { - if (!s) return ""; - return s[0].toUpperCase() + s.substr(1); - } + let prefix = ""; + let suffix = ""; - static decToHex(n, nPad) { - var hex = Number(n < 0 ? 0x100000000 + n : n).toString(16); - while (nPad > hex.length) - hex = "0" + hex; - return "0x" + hex.toUpperCase(); - } + for (let i = Math.min(name.length, kMaxPrefixSize); i > 0; i--) { + prefix = name.substring(0, i); + suffix = name.substring(i); - static format(array, indent, showIndex, mapFn) { - if (!mapFn) - mapFn = StringUtils.asString; + const prefixIndex = this.stringTable.indexOf(prefix); + const suffixIndex = this.stringTable.indexOf(suffix); - var s = ""; - var threshold = 80; + // Matched both parts? + if (prefixIndex !== -1 && suffix === "") { + done = true; + break; + } - if (showIndex === -1) - s += indent; + if (prefixIndex !== -1 && suffixIndex !== -1) { + done = true; + break; + } - for (var i = 0; i < array.length; i++) { - const item = array[i]; - const last = i === array.length - 1; + if (prefixIndex !== -1 && longestPrefix === 0) + longestPrefix = prefix.length; - if (showIndex !== -1) - s += indent; + if (suffixIndex !== -1 && suffix.length > longestSuffix) + longestSuffix = suffix.length; - s += mapFn(item); - if (showIndex > 0) { - s += `${last ? " " : ","} // #${i}`; - if (typeof array.refCountOf === "function") - s += ` [ref=${array.refCountOf(item)}x]`; - } - else if (!last) { - s += ","; + if (suffix.length === kMaxSuffixSize) + break; } - if (showIndex === -1) { - if (s.length >= threshold - 1 && !last) { - s += "\n" + indent; - threshold += 80; + if (!done) { + let minPrefixSize = name.length >= 8 ? name.length / 2 + 1 : name.length - 2; + + prefix = ""; + suffix = ""; + + if (longestPrefix >= minPrefixSize) { + prefix = name.substring(0, longestPrefix); + suffix = name.substring(longestPrefix); + } + else if (longestSuffix) { + const splitAt = Math.min(name.length - longestSuffix, kMaxPrefixSize); + prefix = name.substring(0, splitAt); + suffix = name.substring(splitAt); + } + else if (name.length > kMaxPrefixSize) { + prefix = name.substring(0, kMaxPrefixSize); + suffix = name.substring(kMaxPrefixSize); } else { - if (!last) s += " "; + prefix = name; + suffix = ""; } } - else { - if (!last) s += "\n"; - } - } - return s; - } + if (suffix) { + const prefixIndex = this.addOrReferenceString(prefix); + const suffixIndex = this.addOrReferenceString(suffix); - static makeCxxArray(array, code, indent) { - if (!indent) indent = kIndent; - return `${code} = {\n${indent}` + array.join(`,\n${indent}`) + `\n};\n`; - } - - static makeCxxArrayWithComment(array, code, indent) { - if (!indent) indent = kIndent; - var s = ""; - for (var i = 0; i < array.length; i++) { - const last = i === array.length - 1; - s += indent + array[i].data + - (last ? " // " : ", // ") + (array[i].refs ? "#" + String(i) : "").padEnd(5) + array[i].comment + "\n"; - } - return `${code} = {\n${s}};\n`; - } - - static disclaimer(s) { - return "// ------------------- Automatically generated, do not edit -------------------\n" + - s + - "// ----------------------------------------------------------------------------\n"; - } - - static indent(s, indentation) { - var lines = s.split(/\r?\n/g); - if (indentation) { - for (var i = 0; i < lines.length; i++) { - var line = lines[i]; - if (line) lines[i] = indentation + line; + this.primaryTable[idx] = prefixIndex | (prefix.length << 12) | (suffixIndex << 16) | (suffix.length << 28); + this.indexComment[idx] = `Large '${prefix}|${suffix}'.`; } - } - - return lines.join("\n"); - } - - static extract(s, start, end) { - var iStart = s.indexOf(start); - var iEnd = s.indexOf(end); - - if (iStart === -1) - FAIL(`StringUtils.extract(): Couldn't locate start mark '${start}'`); - - if (iEnd === -1) - FAIL(`StringUtils.extract(): Couldn't locate end mark '${end}'`); - - return s.substring(iStart + start.length, iEnd).trim(); - } - - static inject(s, start, end, code) { - var iStart = s.indexOf(start); - var iEnd = s.indexOf(end); - - if (iStart === -1) - FAIL(`StringUtils.inject(): Couldn't locate start mark '${start}'`); - - if (iEnd === -1) - FAIL(`StringUtils.inject(): Couldn't locate end mark '${end}'`); - - var nIndent = 0; - while (iStart > 0 && s[iStart-1] === " ") { - iStart--; - nIndent++; - } + else { + const prefixIndex = this.addOrReferenceString(prefix); - if (nIndent) { - const indentation = " ".repeat(nIndent); - code = StringUtils.indent(code, indentation) + indentation; + this.primaryTable[idx] = prefixIndex | (prefix.length << 12); + this.indexComment[idx] = `Large '${prefix}'.`; + } } - - return s.substr(0, iStart + start.length + nIndent) + code + s.substr(iEnd); } - static makePriorityCompare(priorityArray) { - const map = Object.create(null); - priorityArray.forEach((str, index) => { map[str] = index; }); - - return function(a, b) { - const ax = hasOwn.call(map, a) ? map[a] : Infinity; - const bx = hasOwn.call(map, b) ? map[b] : Infinity; - return ax != bx ? ax - bx : a < b ? -1 : a > b ? 1 : 0; + addOrReferenceString(s) { + let index = this.stringTable.indexOf(s); + if (index === -1) { + index = this.stringTable.length; + this.stringTable += s; } + return index; } -} -exports.StringUtils = StringUtils; - -// ============================================================================ -// [ArrayUtils] -// ============================================================================ - -class ArrayUtils { - static min(arr, fn) { - if (!arr.length) - return null; - - if (!fn) - fn = nop; - - var v = fn(arr[0]); - for (var i = 1; i < arr.length; i++) - v = Math.min(v, fn(arr[i])); - return v; - } - - static max(arr, fn) { - if (!arr.length) - return null; - - if (!fn) - fn = nop; - - var v = fn(arr[0]); - for (var i = 1; i < arr.length; i++) - v = Math.max(v, fn(arr[i])); - return v; - } - - static sorted(obj, cmp) { - const out = Array.isArray(obj) ? obj.slice() : Object.getOwnPropertyNames(obj); - out.sort(cmp); - return out; - } - - static deepIndexOf(arr, what) { - for (var i = 0; i < arr.length; i++) - if (Lang.deepEq(arr[i], what)) - return i; - return -1; - } -} -exports.ArrayUtils = ArrayUtils; - -// ============================================================================ -// [MapUtils] -// ============================================================================ - -class MapUtils { - static clone(map) { - return Object.assign(Object.create(null), map); - } - - static arrayToMap(arr, value) { - if (value === undefined) - value = true; - - const out = Object.create(null); - for (var i = 0; i < arr.length; i++) - out[arr[i]] = value; - return out; - } - - static equals(a, b) { - for (var k in a) if (!hasOwn.call(b, k)) return false; - for (var k in b) if (!hasOwn.call(a, k)) return false; - return true; - } - - static firstOf(map, flags) { - for (var k in flags) - if (hasOwn.call(map, k)) - return k; - return undefined; - } - - static anyOf(map, flags) { - for (var k in flags) - if (hasOwn.call(map, k)) - return true; - return false; - } - - static add(a, b) { - for (var k in b) - a[k] = b[k]; - return a; - } - - static and(a, b) { - const out = Object.create(null); - for (var k in a) - if (hasOwn.call(b, k)) - out[k] = true; - return out; - } - - static xor(a, b) { - const out = Object.create(null); - for (var k in a) if (!hasOwn.call(b, k)) out[k] = true; - for (var k in b) if (!hasOwn.call(a, k)) out[k] = true; - return out; - } -}; -exports.MapUtils = MapUtils; - -// ============================================================================ -// [CxxUtils] -// ============================================================================ - -class CxxUtils { - static flags(obj, fn, none) { - if (none == null) - none = "0"; - - if (!fn) - fn = nop; - - var out = ""; - for (var k in obj) { - if (obj[k]) - out += (out ? " | " : "") + fn(k); - } - return out ? out : none; - } - - static struct(...args) { - return "{ " + args.join(", ") + " }"; - } -}; -exports.CxxUtils = CxxUtils; - -// ============================================================================ -// [IndexedString] -// ============================================================================ - -// IndexedString is mostly used to merge all instruction names into a single -// string with external index. It's designed mostly for generating C++ tables. -// -// Consider the following cases in C++: -// -// a) static const char* const* instNames = { "add", "mov", "vpunpcklbw" }; -// -// b) static const char instNames[] = { "add\0" "mov\0" "vpunpcklbw\0" }; -// static const uint16_t instNameIndex[] = { 0, 4, 8 }; -// -// The latter (b) has an advantage that it doesn't have to be relocated by the -// linker, which saves a lot of space in the resulting binary and a lot of CPU -// cycles (and memory) when the linker loads it. AsmJit supports thousands of -// instructions so each optimization like this makes it smaller and faster to -// load. -class IndexedString { - constructor() { - this.map = Object.create(null); - this.array = []; - this.size = -1; - } - - add(s) { - this.map[s] = -1; - } - - index() { - const map = this.map; - const array = this.array; - const partialMap = Object.create(null); - - var k, kp; - var i, len; - - // Create a map that will contain all keys and partial keys. - for (k in map) { - if (!k) { - partialMap[k] = k; - } - else { - for (i = 0, len = k.length; i < len; i++) { - kp = k.substr(i); - if (!hasOwn.call(partialMap, kp) || partialMap[kp].length < len) - partialMap[kp] = k; - } - } - } - - // Create an array that will only contain keys that are needed. - for (k in map) - if (partialMap[k] === k) - array.push(k); - array.sort(); - - // Create valid offsets to the `array`. - var offMap = Object.create(null); - var offset = 0; - for (i = 0, len = array.length; i < len; i++) { - k = array[i]; + formatIndexTable(tableName) { + if (this.size === -1) + FATAL(`IndexedString.formatIndexTable(): Not indexed yet, call index()`); - offMap[k] = offset; - offset += k.length + 1; + let s = ""; + for (let i = 0; i < this.primaryTable.length; i++) { + s += cxx.Utils.toHex(this.primaryTable[i], 8); + s += i !== this.primaryTable.length - 1 ? "," : " "; + s += " // " + this.indexComment[i] + "\n"; } - this.size = offset; - // Assign valid offsets to `map`. - for (kp in map) { - k = partialMap[kp]; - map[kp] = offMap[k] + k.length - kp.length; - } + return `const uint32_t ${tableName}[] = {\n${StringUtils.indent(s, " ")}};\n`; } - format(indent, justify) { + formatStringTable(tableName) { if (this.size === -1) - FAIL(`IndexedString.format(): not indexed yet, call index()`); - - const array = this.array; - if (!justify) justify = 0; - - var i; - var s = ""; - var line = ""; + FATAL(`IndexedString.formatStringTable(): Not indexed yet, call index()`); - for (i = 0; i < array.length; i++) { - const item = "\"" + array[i] + ((i !== array.length - 1) ? "\\0\"" : "\";"); - const newl = line + (line ? " " : indent) + item; - - if (newl.length <= justify) { - line = newl; - continue; - } - else { - s += line + "\n"; - line = indent + item; - } + let s = ""; + for (let i = 0; i < this.stringTable.length; i += 80) { + if (s) + s += "\n" + s += '"' + this.stringTable.substring(i, i + 80) + '"'; } + s += ";\n"; - return s + line; + return `const char ${tableName}[] =\n${StringUtils.indent(s, " ")}\n`; } getSize() { if (this.size === -1) - FAIL(`IndexedString.getSize(): Not indexed yet, call index()`); - return this.size; + FATAL(`IndexedString.getSize(): Not indexed yet, call index()`); + + return this.primaryTable.length * 4 + this.stringTable.length; } getIndex(k) { if (this.size === -1) - FAIL(`IndexedString.getIndex(): Not indexed yet, call index()`); + FATAL(`IndexedString.getIndex(): Not indexed yet, call index()`); if (!hasOwn.call(this.map, k)) - FAIL(`IndexedString.getIndex(): Key '${k}' not found.`); + FATAL(`IndexedString.getIndex(): Key '${k}' not found.`); return this.map[k]; } } -exports.IndexedString = IndexedString; - -// ============================================================================ -// [IndexedArray] -// ============================================================================ - -// IndexedArray is an Array replacement that allows to index each item inserted -// to it. Its main purpose is to avoid data duplication, if an item passed to -// `addIndexed()` is already within the Array then it's not inserted and the -// existing index is returned instead. -function IndexedArray_keyOf(item) { - return typeof item === "string" ? item : JSON.stringify(item); -} - -class IndexedArray extends Array { - constructor() { - super(); - this._index = Object.create(null); - } - - refCountOf(item) { - const key = IndexedArray_keyOf(item); - const idx = this._index[key]; - - return idx !== undefined ? idx.refCount : 0; - } - - addIndexed(item) { - const key = IndexedArray_keyOf(item); - var idx = this._index[key]; - - if (idx !== undefined) { - idx.refCount++; - return idx.data; - } - - idx = this.length; - this._index[key] = { - data: idx, - refCount: 1 - }; - this.push(item); - return idx; - } -} -exports.IndexedArray = IndexedArray; +exports.InstructionNameData = InstructionNameData; // ============================================================================ // [Task] @@ -643,7 +252,7 @@ class Task { } run() { - FAIL("Task.run(): Must be reimplemented"); + FATAL("Task.run(): Must be reimplemented"); } } exports.Task = Task; @@ -652,29 +261,12 @@ exports.Task = Task; // [TableGen] // ============================================================================ -// Main context used to load, generate, and store instruction tables. The idea -// is to be extensible, so it stores 'Task's to be executed with minimal deps -// management. -class TableGen { - constructor(arch) { - this.arch = arch; +class Injector { + constructor() { this.files = Object.create(null); this.tableSizes = Object.create(null); - - this.tasks = []; - this.taskMap = Object.create(null); - - this.insts = []; - this.instMap = Object.create(null); - - this.aliases = []; - this.aliasMem = Object.create(null); } - // -------------------------------------------------------------------------- - // [File Management] - // -------------------------------------------------------------------------- - load(fileList) { for (var i = 0; i < fileList.length; i++) { const file = fileList[i]; @@ -705,7 +297,7 @@ class TableGen { dataOfFile(file) { const obj = this.files[file]; if (!obj) - FAIL(`TableGen.dataOfFile(): File '${file}' not loaded`); + FATAL(`TableGen.dataOfFile(): File '${file}' not loaded`); return obj.data; } @@ -726,7 +318,7 @@ class TableGen { } if (!done) - FAIL(`TableGen.inject(): Cannot find '${key}'`); + FATAL(`TableGen.inject(): Cannot find '${key}'`); if (size) this.tableSizes[key] = size; @@ -734,20 +326,56 @@ class TableGen { return this; } + dumpTableSizes() { + const sizes = this.tableSizes; + + var pad = 26; + var total = 0; + + for (var name in sizes) { + const size = sizes[name]; + total += size; + console.log(("Size of " + name).padEnd(pad) + ": " + size); + } + + console.log("Size of all tables".padEnd(pad) + ": " + total); + } +} +exports.Injector = Injector; + +// Main context used to load, generate, and store instruction tables. The idea +// is to be extensible, so it stores 'Task's to be executed with minimal deps +// management. +class TableGen extends Injector{ + constructor(arch) { + super(); + + this.arch = arch; + + this.tasks = []; + this.taskMap = Object.create(null); + + this.insts = []; + this.instMap = Object.create(null); + + this.aliases = []; + this.aliasMem = Object.create(null); + } + // -------------------------------------------------------------------------- // [Task Management] // -------------------------------------------------------------------------- addTask(task) { if (!task.name) - FAIL(`TableGen.addModule(): Module must have a name`); + FATAL(`TableGen.addModule(): Module must have a name`); if (this.taskMap[task.name]) - FAIL(`TableGen.addModule(): Module '${task.name}' already added`); + FATAL(`TableGen.addModule(): Module '${task.name}' already added`); task.deps.forEach((dependency) => { if (!this.taskMap[dependency]) - FAIL(`TableGen.addModule(): Dependency '${dependency}' of module '${task.name}' doesn't exist`); + FATAL(`TableGen.addModule(): Dependency '${dependency}' of module '${task.name}' doesn't exist`); }); this.tasks.push(task); @@ -792,7 +420,7 @@ class TableGen { addInst(inst) { if (this.instMap[inst.name]) - FAIL(`TableGen.addInst(): Instruction '${inst.name}' already added`); + FATAL(`TableGen.addInst(): Instruction '${inst.name}' already added`); inst.id = this.insts.length; this.insts.push(inst); @@ -818,25 +446,6 @@ class TableGen { this.onAfterRun(); } - // -------------------------------------------------------------------------- - // [Other] - // -------------------------------------------------------------------------- - - dumpTableSizes() { - const sizes = this.tableSizes; - - var pad = 26; - var total = 0; - - for (var name in sizes) { - const size = sizes[name]; - total += size; - console.log(("Size of " + name).padEnd(pad) + ": " + size); - } - - console.log("Size of all tables".padEnd(pad) + ": " + total); - } - // -------------------------------------------------------------------------- // [Hooks] // -------------------------------------------------------------------------- @@ -856,7 +465,7 @@ class IdEnum extends Task { } comment(name) { - FAIL("IdEnum.comment(): Must be reimplemented"); + FATAL("IdEnum.comment(): Must be reimplemented"); } run() { @@ -885,63 +494,75 @@ exports.IdEnum = IdEnum; // [NameTable] // ============================================================================ -class NameTable extends Task { - constructor(name, deps) { - super(name || "NameTable", deps); +class Output { + constructor() { + this.content = Object.create(null); + this.tableSize = Object.create(null); } - run() { - const arch = this.ctx.arch; - const none = "Inst::kIdNone"; + add(id, content, tableSize) { + this.content[id] = content; + this.tableSize[id] = typeof tableSize === "number" ? tableSize : 0; + } +}; +exports.Output = Output; - const insts = this.ctx.insts; - const instNames = new IndexedString(); +function generateNameData(out, instructions) { + const none = "Inst::kIdNone"; - const instFirst = new Array(26); - const instLast = new Array(26); + const instFirst = new Array(26); + const instLast = new Array(26); + const instNameData = new InstructionNameData(); - var maxLength = 0; - for (var i = 0; i < insts.length; i++) { - const inst = insts[i]; - instNames.add(inst.displayName); - maxLength = Math.max(maxLength, inst.displayName.length); - } - instNames.index(); + for (let i = 0; i < instructions.length; i++) + instNameData.add(instructions[i].displayName); + instNameData.index(); - for (var i = 0; i < insts.length; i++) { - const inst = insts[i]; - const name = inst.displayName; - const nameIndex = instNames.getIndex(name); + for (let i = 0; i < instructions.length; i++) { + const inst = instructions[i]; + const displayName = inst.displayName; + const alphaIndex = displayName.charCodeAt(0) - 'a'.charCodeAt(0); - const index = name.charCodeAt(0) - 'a'.charCodeAt(0); - if (index < 0 || index >= 26) - FAIL(`TableGen.generateNameData(): Invalid lookup character '${name[0]}' of '${name}'`); + if (alphaIndex < 0 || alphaIndex >= 26) + FATAL(`generateNameData(): Invalid lookup character '${displayName[0]}' of '${displayName}'`); - inst.nameIndex = nameIndex; - if (instFirst[index] === undefined) - instFirst[index] = `Inst::kId${inst.enum}`; - instLast[index] = `Inst::kId${inst.enum}`; - } + if (instFirst[alphaIndex] === undefined) + instFirst[alphaIndex] = `Inst::kId${inst.enum}`; + instLast[alphaIndex] = `Inst::kId${inst.enum}`; + } - var s = ""; - s += `const char InstDB::_nameData[] =\n${instNames.format(kIndent, kJustify)}\n`; + var s = ""; + s += `const InstNameIndex InstDB::instNameIndex = {{\n`; + for (var i = 0; i < instFirst.length; i++) { + const firstId = instFirst[i] || none; + const lastId = instLast[i] || none; + + s += ` { ${String(firstId).padEnd(22)}, ${String(lastId).padEnd(22)} + 1 }`; + if (i !== 26 - 1) + s += `,`; s += `\n`; - s += `const InstDB::InstNameIndex InstDB::instNameIndex[26] = {\n`; - for (var i = 0; i < instFirst.length; i++) { - const firstId = instFirst[i] || none; - const lastId = instLast[i] || none; - - s += ` { ${String(firstId).padEnd(22)}, ${String(lastId).padEnd(22)} + 1 }`; - if (i !== 26 - 1) - s += `,`; - s += `\n`; - } - s += `};\n`; + } + s += `}, uint16_t(${instNameData.maxNameLength})};\n`; + s += `\n`; + s += instNameData.formatStringTable("InstDB::_instNameStringTable"); + s += `\n`; + s += instNameData.formatIndexTable("InstDB::_instNameIndexTable"); + + const dataSize = instNameData.getSize() + 26 * 4; + out.add("NameData", StringUtils.disclaimer(s), dataSize); + return out; +} +exports.generateNameData = generateNameData; - this.ctx.inject("NameLimits", - StringUtils.disclaimer(`enum : uint32_t { kMaxNameSize = ${maxLength} };\n`)); +class NameTable extends Task { + constructor(name, deps) { + super(name || "NameTable", deps); + } - return this.ctx.inject("NameData", StringUtils.disclaimer(s), instNames.getSize() + 26 * 4); + run() { + const output = new Output(); + generateNameData(output, this.ctx.insts); + this.ctx.inject("NameData", output.content["NameData"], output.tableSize["NameData"]); } } exports.NameTable = NameTable; diff --git a/3rdparty/asmjit/tools/tablegen.sh b/3rdparty/asmjit/tools/tablegen.sh index b2c9cac368c0a..0ef1e580634fa 100644 --- a/3rdparty/asmjit/tools/tablegen.sh +++ b/3rdparty/asmjit/tools/tablegen.sh @@ -1,4 +1,5 @@ #!/usr/bin/env sh set -e -node ./tablegen-arm.js $@ +node ./tablegen-a32.js $@ +node ./tablegen-a64.js $@ node ./tablegen-x86.js $@ diff --git a/scripts/src/3rdparty.lua b/scripts/src/3rdparty.lua index fc3ef8a6daac0..7fd1213f9de37 100755 --- a/scripts/src/3rdparty.lua +++ b/scripts/src/3rdparty.lua @@ -1970,11 +1970,11 @@ project "asmjit" MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm/a64operand.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp", MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h", - MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm/a64utils.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm/armformatter.cpp", MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm/armformatter_p.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm/armglobals.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm/armoperand.h", + MAME_DIR .. "3rdparty/asmjit/src/asmjit/arm/armutils.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/api-build_p.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/api-config.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/archcommons.h", @@ -1984,6 +1984,7 @@ project "asmjit" MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/assembler.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/builder.cpp", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/builder.h", + MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/builder_p.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/codebuffer.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/codeholder.cpp", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/codeholder.h", @@ -2017,6 +2018,8 @@ project "asmjit" MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/globals.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/inst.cpp", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/inst.h", + MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/instdb.cpp", + MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/instdb_p.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/jitallocator.cpp", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/jitallocator.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/jitruntime.cpp", @@ -2042,6 +2045,7 @@ project "asmjit" MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/string.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/support.cpp", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/support.h", + MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/support_p.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/target.cpp", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/target.h", MAME_DIR .. "3rdparty/asmjit/src/asmjit/core/type.cpp", From c37e40f039bb8825f1072b12389bc5702e0c24de Mon Sep 17 00:00:00 2001 From: 987123879113 <63495610+987123879113@users.noreply.github.com> Date: Thu, 11 Apr 2024 02:22:22 +0900 Subject: [PATCH 054/109] konami/konamigv.cpp: Implemented inputs and printer check for Tokimeki Memorial Oshiete Your Heart. (#12229) * Added GSR sensor input. * Added simulated pulse sensor simulation. * Added stub printer simulation allowing games to be played. * Added hand crafted EEPROM for tmosh to allow the game boot. * Corrected SPU audio channel routing (btchamp test mode exposes this). --- src/mame/konami/konamigv.cpp | 265 ++++++++++++++++++++++++++++++----- 1 file changed, 230 insertions(+), 35 deletions(-) diff --git a/src/mame/konami/konamigv.cpp b/src/mame/konami/konamigv.cpp index c804090ef9560..24ccf74d17e64 100644 --- a/src/mame/konami/konamigv.cpp +++ b/src/mame/konami/konamigv.cpp @@ -251,7 +251,6 @@ class konamigv_state : public driver_device { } - void tmosh(machine_config &config); void kdeadeye(machine_config &config); void btchamp(machine_config &config); void konamigv(machine_config &config); @@ -263,15 +262,13 @@ class konamigv_state : public driver_device virtual void machine_reset() override; void btc_trackball_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint16_t tokimeki_serial_r(); - void tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void scsi_dma_read(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size); void scsi_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size); void scsi_drq(int state); void btchamp_map(address_map &map); void kdeadeye_map(address_map &map); - void tmosh_map(address_map &map); TIMER_CALLBACK_MEMBER(scsi_dma_transfer); @@ -313,6 +310,53 @@ class simpbowl_state : public konamigv_state uint32_t m_flash_address = 0; }; +class tokimeki_state : public konamigv_state +{ +public: + tokimeki_state(const machine_config &mconfig, device_type type, const char *tag) + : konamigv_state(mconfig, type, tag) + , m_heartbeat(*this, "HEARTBEAT") + , m_gsr(*this, "GSR") + , m_printer_meta(*this, "PRINTER_META") + , m_device_val_start_state(0) + { + } + + void tmosh(machine_config &config); + + void tmoshs_init(); + void tmoshsp_init(); + + uint16_t tokimeki_serial_r(); + void tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + DECLARE_CUSTOM_INPUT_MEMBER(tokimeki_device_check_r); + void tokimeki_device_check_w(int state); + +private: + virtual void machine_start() override; + virtual void machine_reset() override; + + void tmosh_map(address_map &map); + + TIMER_CALLBACK_MEMBER(heartbeat_timer_tick); + + required_ioport m_heartbeat; + required_ioport m_gsr; + required_ioport m_printer_meta; + + uint16_t m_device_val_start_state; + uint16_t m_device_val; + uint8_t m_serial_val; + uint8_t m_serial_len; + uint8_t m_serial_clk; + uint8_t m_serial_sensor_id; + uint16_t m_serial_sensor_data; + uint8_t m_heartbeat_signal; + + emu_timer *m_heartbeat_timer; +}; + void konamigv_state::konamigv_map(address_map &map) { map(0x1f000000, 0x1f00001f).m(m_ncr53cf96, FUNC(ncr53cf96_device::map)).umask16(0x00ff); @@ -357,12 +401,12 @@ void konamigv_state::kdeadeye_map(address_map &map) map(0x1f6800e0, 0x1f6800e3).nopw(); } -void konamigv_state::tmosh_map(address_map &map) +void tokimeki_state::tmosh_map(address_map &map) { konamigv_map(map); - map(0x1f680080, 0x1f680081).r(FUNC(konamigv_state::tokimeki_serial_r)); - map(0x1f680090, 0x1f680091).w(FUNC(konamigv_state::tokimeki_serial_w)); + map(0x1f680080, 0x1f680081).r(FUNC(tokimeki_state::tokimeki_serial_r)); + map(0x1f680090, 0x1f680091).w(FUNC(tokimeki_state::tokimeki_serial_w)); } // SCSI @@ -430,6 +474,33 @@ void simpbowl_state::machine_start() save_item(NAME(m_flash_address)); } +void tokimeki_state::machine_start() +{ + konamigv_state::machine_start(); + save_item(NAME(m_device_val)); + save_item(NAME(m_serial_val)); + save_item(NAME(m_serial_len)); + save_item(NAME(m_serial_clk)); + save_item(NAME(m_serial_sensor_id)); + save_item(NAME(m_serial_sensor_data)); + save_item(NAME(m_heartbeat_signal)); + + m_heartbeat_timer = timer_alloc(FUNC(tokimeki_state::heartbeat_timer_tick), this); + m_heartbeat_timer->adjust(attotime::zero); +} + +void tokimeki_state::machine_reset() +{ + konamigv_state::machine_reset(); + m_device_val = m_device_val_start_state; + m_serial_val = 0; + m_serial_len = 0; + m_serial_clk = 0; + m_serial_sensor_id = 0; + m_serial_sensor_data = 0; + m_heartbeat_signal = 1; +} + void konamigv_state::konamigv(machine_config &config) { // basic machine hardware @@ -467,8 +538,8 @@ void konamigv_state::konamigv(machine_config &config) SPEAKER(config, "rspeaker").front_right(); spu_device &spu(SPU(config, "spu", XTAL(67'737'600)/2, subdevice("maincpu"))); - spu.add_route(0, "lspeaker", 0.75); - spu.add_route(1, "rspeaker", 0.75); + spu.add_route(1, "lspeaker", 0.75); // to verify the channels, btchamp's "game sound test" in the sound test menu speaks the words left, right, center + spu.add_route(0, "rspeaker", 0.75); } @@ -661,17 +732,45 @@ static INPUT_PORTS_START( btchamp ) PORT_BIT( 0xfff, 0x000, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(63) PORT_PLAYER(2) INPUT_PORTS_END -// Tokimeki Memorial games - have a mouse and printer and who knows what else +// Tokimeki Memorial games - has a heart rate sensor, GSR (galvanic skin response) sensor, and printer + +TIMER_CALLBACK_MEMBER(tokimeki_state::heartbeat_timer_tick) +{ + const auto heartrate = m_heartbeat->read(); + + if (heartrate > 0) + { + m_heartbeat_timer->adjust(attotime::from_msec(60'000 / (heartrate + 49))); + m_heartbeat_signal = 0; + } + else + { + // hand not on sensor, wait 100 ms for the heartbeat value to change again + m_heartbeat_timer->adjust(attotime::from_msec(100)); + } +} -uint16_t konamigv_state::tokimeki_serial_r() +uint16_t tokimeki_state::tokimeki_serial_r() { - // bits checked: 0x80 and 0x20 for periodic status (800b6968 and 800b69e0 in tmoshs) - // 0x08 for reading the serial device (8005e624) + uint16_t r = m_heartbeat_signal << 2; + m_heartbeat_signal = 1; + + if (m_serial_sensor_id != 0) + r |= BIT(m_serial_sensor_data, 8) << 3; + + const auto printer_meta = m_printer_meta->read(); + if (!BIT(printer_meta, 0)) + r |= 0x20; // no paper loaded + + if (!BIT(printer_meta, 1)) + r |= 0x80; // printer is malfunctioning - return 0xffff; + r |= 0x40; // required to be set to avoid error when printer tries to print something + + return r; } -void konamigv_state::tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void tokimeki_state::tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t mem_mask) { /* serial EEPROM-like device here: when mem_mask == 0x000000ff only, @@ -680,19 +779,115 @@ void konamigv_state::tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t me 0x20 = clock 0x10 = data - tmoshs sends 6 bits: 110100 then reads 8 bits. - readback is bit 3 (0x08) of serial_r - This happens starting around 8005e580. + 0x02 = sensors dest + + 0x80 = printer config? + 0x40 = printer config? + 0x01 = printer data? */ + int clk = BIT(data, 5); + + if (BIT(data, 1)) + { + m_serial_sensor_data = 0; + m_serial_sensor_id = 0; + m_serial_val = 0; + m_serial_len = 0; + } + else if (!m_serial_clk && clk) + { + if (m_serial_len < 5) + { + // Sends 5 bits of data for the sensor ID + m_serial_val |= BIT(data, 4) << (4 - m_serial_len); + + if (m_serial_len == 4) + { + m_serial_sensor_id = m_serial_val; + + switch (m_serial_sensor_id) + { + case 0x1a: // GSR sensor value + m_serial_sensor_data = m_gsr->read(); + break; + case 0x18: + case 0x19: + default: + m_serial_sensor_data = 0; + break; + } + } + } + else if (m_serial_len >= 6) + { + // Shifts data between reads of tokimeki_serial_r + m_serial_sensor_data <<= 1; + } + + m_serial_len++; + } + m_serial_clk = clk; } -void konamigv_state::tmosh(machine_config &config) +void tokimeki_state::tmosh(machine_config &config) { konamigv(config); - m_maincpu->set_addrmap(AS_PROGRAM, &konamigv_state::tmosh_map); + m_maincpu->set_addrmap(AS_PROGRAM, &tokimeki_state::tmosh_map); } +void tokimeki_state::tmoshs_init() +{ + m_device_val_start_state = 0xf073; +} + +void tokimeki_state::tmoshsp_init() +{ + m_device_val_start_state = 0xf0ba; +} + +CUSTOM_INPUT_MEMBER(tokimeki_state::tokimeki_device_check_r) +{ + return BIT(m_device_val, 15); +} + +void tokimeki_state::tokimeki_device_check_w(int state) +{ + // The check is accepted when it reads whatever is specified in m_device_val_start_state + if (state) + m_device_val = (m_device_val << 1) | BIT(m_device_val, 15); +} + +static INPUT_PORTS_START( tmosh ) + PORT_INCLUDE( konamigv ) + + PORT_MODIFY("P2") + PORT_BIT( 0x00000400, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(tokimeki_state, tokimeki_device_check_r) + + PORT_MODIFY("EEPROMOUT") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(tokimeki_state, tokimeki_device_check_w) + + // valid range for heart rate is 50-150, anything outside of that range makes the game show ? in the heart rate meter area + // Setting the value here to 0 will act as if the player's hand is off the sensor, and anything after that acts as 50-100 + // Default heartbeat is configured for 80 beats per minute + PORT_START("HEARTBEAT") + PORT_BIT( 0xff, 31, IPT_PADDLE_V ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_MINMAX(0, 101) PORT_NAME("Heartbeat Sensor") + + // value read during calibration is treated as zero + // scale in operator menu goes from 0x00-0xff but only 0x00-0x80 is actually usable in-game + PORT_START("GSR") + PORT_BIT( 0xff, 0x00, IPT_POSITIONAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(2) PORT_CENTERDELTA(0) PORT_MINMAX(0x00, 0x80) PORT_NAME("GSR Sensor") + + PORT_START("PRINTER_META") + PORT_CONFNAME( 0x01, 0x01, "Printer Paper Empty" ) + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + PORT_CONFNAME( 0x02, 0x02, "Printer Malfunction" ) + PORT_CONFSETTING( 0x02, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + +INPUT_PORTS_END + /* Dead Eye @@ -916,7 +1111,7 @@ ROM_START( tmosh ) GV_BIOS ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM - ROM_LOAD( "tmosh.25c", 0x000000, 0x000080, NO_DUMP ) + ROM_LOAD( "tmosh.25c", 0x000000, 0x000080, BAD_DUMP CRC(2f6a27fc) SHA1(4ead9313f07e9bf7aa0272dba59db6b21510e00b) ) // hand crafted DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "673jaa01", 0, SHA1(eaa76073749f9db48c1bee3dff9bea955683c8a8) ) @@ -958,17 +1153,17 @@ ROM_END // BIOS placeholder GAME( 1995, konamigv, 0, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Baby Phoenix/GV System", MACHINE_IS_BIOS_ROOT ) -GAME( 1996, powyak96, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Jikkyou Powerful Pro Yakyuu '96 (GV017 Japan 1.03)", MACHINE_IMPERFECT_SOUND ) -GAME( 1996, hyperath, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Hyper Athlete (GV021 Japan 1.00)", MACHINE_IMPERFECT_SOUND ) -GAME( 1996, lacrazyc, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Let's Attack Crazy Cross (GV027 Asia 1.10)", MACHINE_IMPERFECT_SOUND ) -GAME( 1996, susume, lacrazyc, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Susume! Taisen Puzzle-Dama (GV027 Japan 1.20)", MACHINE_IMPERFECT_SOUND ) -GAME( 1996, btchamp, konamigv, btchamp, btchamp, konamigv_state, empty_init, ROT0, "Konami", "Beat the Champ (GV053 UAA01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -GAME( 1996, kdeadeye, konamigv, kdeadeye, kdeadeye, konamigv_state, empty_init, ROT0, "Konami", "Dead Eye (GV054 UAA01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -GAME( 1997, weddingr, konamigv, konamigv, weddingr, konamigv_state, empty_init, ROT0, "Konami", "Wedding Rhapsody (GX624 JAA)", MACHINE_IMPERFECT_SOUND ) -GAME( 1997, tmosh, konamigv, tmosh, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart (GQ673 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) -GAME( 1997, tmoshs, konamigv, tmosh, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version (GE755 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) -GAME( 1997, tmoshsp, konamigv, tmosh, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAB)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) -GAME( 1997, tmoshspa, tmoshsp, tmosh, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) -GAME( 1998, nagano98, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Nagano Winter Olympics '98 (GX720 EAA)", MACHINE_IMPERFECT_SOUND) -GAME( 1998, naganoj, nagano98, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Hyper Olympic in Nagano (GX720 JAA)", MACHINE_IMPERFECT_SOUND) -GAME( 2000, simpbowl, konamigv, simpbowl, simpbowl, simpbowl_state, empty_init, ROT0, "Konami", "The Simpsons Bowling (GQ829 UAA)", MACHINE_IMPERFECT_SOUND) +GAME( 1996, powyak96, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Jikkyou Powerful Pro Yakyuu '96 (GV017 Japan 1.03)", MACHINE_IMPERFECT_SOUND ) +GAME( 1996, hyperath, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Hyper Athlete (GV021 Japan 1.00)", MACHINE_IMPERFECT_SOUND ) +GAME( 1996, lacrazyc, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Let's Attack Crazy Cross (GV027 Asia 1.10)", MACHINE_IMPERFECT_SOUND ) +GAME( 1996, susume, lacrazyc, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Susume! Taisen Puzzle-Dama (GV027 Japan 1.20)", MACHINE_IMPERFECT_SOUND ) +GAME( 1996, btchamp, konamigv, btchamp, btchamp, konamigv_state, empty_init, ROT0, "Konami", "Beat the Champ (GV053 UAA01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +GAME( 1996, kdeadeye, konamigv, kdeadeye, kdeadeye, konamigv_state, empty_init, ROT0, "Konami", "Dead Eye (GV054 UAA01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +GAME( 1997, weddingr, konamigv, konamigv, weddingr, konamigv_state, empty_init, ROT0, "Konami", "Wedding Rhapsody (GX624 JAA)", MACHINE_IMPERFECT_SOUND ) +GAME( 1997, tmosh, konamigv, tmosh, tmosh, tokimeki_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart (GQ673 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER ) +GAME( 1997, tmoshs, konamigv, tmosh, tmosh, tokimeki_state, tmoshs_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version (GE755 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER ) +GAME( 1997, tmoshsp, konamigv, tmosh, tmosh, tokimeki_state, tmoshsp_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAB)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER ) +GAME( 1997, tmoshspa, tmoshsp, tmosh, tmosh, tokimeki_state, tmoshsp_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER ) +GAME( 1998, nagano98, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Nagano Winter Olympics '98 (GX720 EAA)", MACHINE_IMPERFECT_SOUND) +GAME( 1998, naganoj, nagano98, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Hyper Olympic in Nagano (GX720 JAA)", MACHINE_IMPERFECT_SOUND) +GAME( 2000, simpbowl, konamigv, simpbowl, simpbowl, simpbowl_state, empty_init, ROT0, "Konami", "The Simpsons Bowling (GQ829 UAA)", MACHINE_IMPERFECT_SOUND) From e261a9450fb50258f05679841c51cbda74d6f615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Giulio=20Zausa=E2=80=AE?= Date: Wed, 10 Apr 2024 19:27:15 +0200 Subject: [PATCH 055/109] roland/roland_jv80.cpp: Dumped wave ROMs and main CPU ROM. (#12227) Also added older program ROM v1.0.0 as a BIOS option. --- src/mame/roland/roland_jv80.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/mame/roland/roland_jv80.cpp b/src/mame/roland/roland_jv80.cpp index d802c68b30200..3934601e340be 100644 --- a/src/mame/roland/roland_jv80.cpp +++ b/src/mame/roland/roland_jv80.cpp @@ -50,15 +50,20 @@ void roland_jv80_state::jv880(machine_config &config) } ROM_START(jv880) + ROM_DEFAULT_BIOS("v1.0.1") + ROM_SYSTEM_BIOS(0, "v1.0.0", "ROM Version 1.0.0") + ROM_SYSTEM_BIOS(1, "v1.0.1", "ROM Version 1.0.1") + ROM_REGION(0x8000, "maincpu", ROMREGION_ERASE00) - ROM_LOAD("roland_r15199810_6435328b86f.ic16", 0x0000, 0x8000, NO_DUMP) + ROM_LOAD("roland_r15199810_6435328b86f.ic16", 0x0000, 0x8000, CRC(b3d611b1) SHA1(6c1b59905b361ac3c4803d39589406bc3e1d0647)) ROM_REGION(0x40000, "progrom", 0) - ROM_LOAD("roland_jv-880_v1.01.ic17", 0x00000, 0x40000, CRC(5f19c95f) SHA1(38ec496f16dfa02d35f934cf32d8302aaf5f236e)) + ROMX_LOAD("roland_jv-880_v1.00.ic17", 0x00000, 0x40000, CRC(b266efe9) SHA1(282116e8e8471053cf159d22675931592b7f7c8f), ROM_BIOS(0)) + ROMX_LOAD("roland_jv-880_v1.01.ic17", 0x00000, 0x40000, CRC(5f19c95f) SHA1(38ec496f16dfa02d35f934cf32d8302aaf5f236e), ROM_BIOS(1)) ROM_REGION(0x400000, "waverom", 0) - ROM_LOAD("roland-a_r15209312_lh5375n2.ic27", 0x000000, 0x200000, NO_DUMP) - ROM_LOAD("roland-b_r15209313_lh5375n3.ic25", 0x200000, 0x200000, NO_DUMP) + ROM_LOAD("roland-a_r15209312_lh5375n2.ic27", 0x000000, 0x200000, CRC(1348c0dc) SHA1(37e28498351fb502f6d43398d288a026c02b446d)) + ROM_LOAD("roland-b_r15209313_lh5375n3.ic25", 0x200000, 0x200000, CRC(d55fcf90) SHA1(963ce75b6668dab377d3a2fd895630a745491be5)) ROM_END } // anonymous namespace From 6a83b3778bd7b921472e1bc2fc19a16111fad151 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 11 Apr 2024 04:45:41 +1000 Subject: [PATCH 056/109] konami/konamigv.cpp: Added configuration option for direct heartbeat pulse input to tmosh games. --- src/mame/konami/konamigv.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/mame/konami/konamigv.cpp b/src/mame/konami/konamigv.cpp index 24ccf74d17e64..dfa51bc6d0935 100644 --- a/src/mame/konami/konamigv.cpp +++ b/src/mame/konami/konamigv.cpp @@ -327,6 +327,7 @@ class tokimeki_state : public konamigv_state void tmoshs_init(); void tmoshsp_init(); + void heartbeat_pulse_w(int state); uint16_t tokimeki_serial_r(); void tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); @@ -736,7 +737,7 @@ INPUT_PORTS_END TIMER_CALLBACK_MEMBER(tokimeki_state::heartbeat_timer_tick) { - const auto heartrate = m_heartbeat->read(); + const auto heartrate = m_heartbeat->read() & 0xff; if (heartrate > 0) { @@ -750,6 +751,12 @@ TIMER_CALLBACK_MEMBER(tokimeki_state::heartbeat_timer_tick) } } +void tokimeki_state::heartbeat_pulse_w(int state) +{ + if (state) + m_heartbeat_signal = 0; +} + uint16_t tokimeki_state::tokimeki_serial_r() { uint16_t r = m_heartbeat_signal << 2; @@ -871,21 +878,27 @@ static INPUT_PORTS_START( tmosh ) // Setting the value here to 0 will act as if the player's hand is off the sensor, and anything after that acts as 50-100 // Default heartbeat is configured for 80 beats per minute PORT_START("HEARTBEAT") - PORT_BIT( 0xff, 31, IPT_PADDLE_V ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_MINMAX(0, 101) PORT_NAME("Heartbeat Sensor") + PORT_BIT( 0x0ff, 31, IPT_PADDLE_V ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_MINMAX(0, 101) PORT_NAME("Heart Rate") PORT_CONDITION("CONTROLS", 0x01, EQUALS, 0x01) + PORT_BIT( 0x0ff, 0, IPT_CUSTOM ) PORT_CONDITION("CONTROLS", 0x01, EQUALS, 0x00) + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_WRITE_LINE_MEMBER(tokimeki_state, heartbeat_pulse_w) PORT_NAME("Heartbeat Pulse") PORT_CONDITION("CONTROLS", 0x01, EQUALS, 0x00) // value read during calibration is treated as zero // scale in operator menu goes from 0x00-0xff but only 0x00-0x80 is actually usable in-game PORT_START("GSR") - PORT_BIT( 0xff, 0x00, IPT_POSITIONAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(2) PORT_CENTERDELTA(0) PORT_MINMAX(0x00, 0x80) PORT_NAME("GSR Sensor") + PORT_BIT( 0x0ff, 0x00, IPT_POSITIONAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(2) PORT_CENTERDELTA(0) PORT_MINMAX(0x00, 0x80) PORT_NAME("GSR Sensor") PORT_START("PRINTER_META") PORT_CONFNAME( 0x01, 0x01, "Printer Paper Empty" ) - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) PORT_CONFNAME( 0x02, 0x02, "Printer Malfunction" ) - PORT_CONFSETTING( 0x02, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + PORT_CONFSETTING( 0x02, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + PORT_START("CONTROLS") + PORT_CONFNAME( 0x01, 0x01, "Heartbeat Input" ) + PORT_CONFSETTING( 0x00, "Direct" ) + PORT_CONFSETTING( 0x01, "Simulated" ) INPUT_PORTS_END /* From 874111cf759d0eeb6e1a31988ba8c9c55f780903 Mon Sep 17 00:00:00 2001 From: ArcadeShadow Date: Wed, 10 Apr 2024 20:12:43 +0100 Subject: [PATCH 057/109] coleco.xml: Added 34 items (27 working) (#12202) New working software list items (coleco.xml) -------------------------------------------- Anti-Environment Encounter [ColecoVision Addict] Arno Dash [ColecoVision Addict] Bank Panic [ColecoVision Addict] Burn Rubber [ColecoVision Addict] C-So! [ColecoVision Addict] Caterpillar S.O.S. [ColecoVision Addict] Champion Pro Wrestling [ColecoVision Addict] Diamond Dash II [ColecoVision Addict] Flapee Byrd [ColecoVision Addict] Klondike Solitaire (v1.0) [ColecoVision Addict] Kobashi [ColecoVision Addict] Mahjong Solitaire (v1.0) [ColecoVision Addict] Mario Bros. [ColecoVision Addict] Minesweeper (v1.0) [ColecoVision Addict] Mr Chin [ColecoVision Addict] Pegged (v1.0) [ColecoVision Addict] Pillars [ColecoVision Addict] Pitman [ColecoVision Addict] Pooyan [ColecoVision Addict] Pyramid Warp + Battleship Clapton II [ColecoVision Addict] Snake [ColecoVision Addict] Spunky's Super Car! [ColecoVision Addict] Vexed [ColecoVision Addict] Winky Trap [ColecoVision Addict] Zippy Race [ColecoVision Addict] Zombie Calavera Prologue [ColecoVision Addict] Zombie Near [ColecoVision Addict] New NOT working software list addition (coleco.xml) -------------------------------------------- Booming Boy [ColecoVision Addict] Boxxle [ColecoVision Addict] Buck Rogers Super Game [ColecoVision Addict] Caos Begins [ColecoVision Addict] Caverns of Titan [ColecoVision Addict] Kung-Fu Master [ColecoVision Addict] The Black Onyx [ColecoVision Addict] --- hash/coleco.xml | 388 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 385 insertions(+), 3 deletions(-) diff --git a/hash/coleco.xml b/hash/coleco.xml index 0b02cf92f92e7..87dc64fb5639b 100644 --- a/hash/coleco.xml +++ b/hash/coleco.xml @@ -1241,7 +1241,7 @@ license:CC0-1.0 - + Pitstop (Euro, USA, Canada) @@ -1257,7 +1257,7 @@ license:CC0-1.0 - + @@ -1303,7 +1303,7 @@ license:CC0-1.0 - + Q*bert Qubes 1984 @@ -3420,4 +3420,386 @@ license:CC0-1.0 + + + + A.E. - Anti-Environment Encounter + 2011 + CollectorVision Games + + + + + + + + + Arno Dash + 2021 + Under4Mhz + + + + + + + + + Bank Panic + 2011 + Team Pixelboy + + + + + + + + + The Black Onyx + 2013 + Team Pixelboy + + + + + + + + + Booming Boy + 2019 + Team Pixelboy + + + + + + + + + + Boxxle + 2015 + Team Pixelboy + + + + + + + + + Buck Rogers Super Game + 2013 + Team Pixelboy + + + + + + + + + + Burn Rubber + 2012 + CollectorVision Games + + + + + + + + + C-So! + 2018 + Team Pixelboy + + + + + + + + + Caos Begins + 2016 + Team Pixelboy + + + + + + + + + + Caterpillar S.O.S. + 2011 + CollectorVision Games + + + + + + + + + + Caverns of Titan + 2017 + Team Pixelboy + + + + + + + + + + Champion Pro Wrestling + 2020 + Team Pixelboy + + + + + + + + + Diamond Dash II + 2021 + Under4Mhz + + + + + + + + + Flapee Byrd + 2014 + CollectorVision Games + + + + + + + + + Klondike Solitaire (v1.0) + 2021 + Under4Mhz + + + + + + + + + Kobashi + 2010 + CollectorVision Games + + + + + + + + + Kung-Fu Master + 2016 + CollectorVision Games + + + + + + + + + + Mahjong Solitaire (v1.0) + 2021 + Under4Mhz + + + + + + + + + Mario Bros. + 2009 + CollectorVision Games + + + + + + + + + Minesweeper (v1.0) + 2021 + Under4Mhz + + + + + + + + + Mr Chin + 2008 + CollectorVision Games + + + + + + + + + Pegged (v1.0) + 2021 + Under4Mhz + + + + + + + + + Pillars + 2021 + Under4Mhz + + + + + + + + + Pitman + 2021 + Under4Mhz + + + + + + + + + Pooyan + 2009 + CollectorVision Games + + + + + + + + + Pyramid Warp + Battle Ship Clapton II + 2009 + CollectorVision Games + + + + + + + + + Snake + 2021 + Under4Mhz + + + + + + + + + Spunky's Super Car! + 2014 + CollectorVision Games + + + + + + + + + Vexed + 2021 + Under4Mhz + + + + + + + + + Winky Trap + 2007 + CollectorVision Games + + + + + + + + + Zippy Race + 2009 + CollectorVision Games + + + + + + + + + Zombie Calavera Prologue + 2021 + CollectorVision Games + + + + + + + + + Zombie Near + 2012 + CollectorVision Games + + + + + + + From 9561d28819ab5e617af275c5c35ab0e4426fd399 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 11 Apr 2024 15:39:12 +1000 Subject: [PATCH 058/109] konami/konamigv.cpp: Updated kdeadeye CHD by combining five more reads. [Vas Crabb, Brian Troha] --- src/mame/konami/konamigv.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mame/konami/konamigv.cpp b/src/mame/konami/konamigv.cpp index dfa51bc6d0935..bf83cb9a91c47 100644 --- a/src/mame/konami/konamigv.cpp +++ b/src/mame/konami/konamigv.cpp @@ -1096,8 +1096,9 @@ ROM_START( kdeadeye ) ROM_REGION16_BE( 0x0000080, "eeprom", 0 ) // default EEPROM ROM_LOAD( "kdeadeye.25c", 0x000000, 0x000080, CRC(3935d2df) SHA1(cbb855c475269077803c380dbc3621e522efe51e) ) + // constructed from six reads of the same disc using two drives, 80 sectors have Q subcode CRC errors DISK_REGION( "scsi:4:cdrom" ) - DISK_IMAGE_READONLY( "054uaa01", 0, SHA1(84ff29b6ca0282b8d3ffac8c8a1a1c58085fd469) ) + DISK_IMAGE_READONLY( "054uaa01", 0, SHA1(a05079e4e5024ca66b7f6b81de74695d86c62dd8) ) ROM_END ROM_START( nagano98 ) From 78ef444ea6b639336b174e8e47d782a016ae6ae7 Mon Sep 17 00:00:00 2001 From: cam900 Date: Thu, 11 Apr 2024 14:49:58 +0900 Subject: [PATCH 059/109] itech/itech32.cpp: Cleaned up code. (#12231) * Reduced tag lookups, suppress side effects for debugger reads. * Improved ROM region names. * Moved some game-specific members out of the base driver state class. * Reduced preprocessor macros, reduced duplicated code, changed logging to use logmacro.h. --- src/mame/itech/itech32.cpp | 1823 +++++++++++++++++----------------- src/mame/itech/itech32.h | 58 +- src/mame/itech/itech32_v.cpp | 617 ++++++------ 3 files changed, 1238 insertions(+), 1260 deletions(-) diff --git a/src/mame/itech/itech32.cpp b/src/mame/itech/itech32.cpp index 6e9f8c4fd11dc..be0f3ecd92c10 100644 --- a/src/mame/itech/itech32.cpp +++ b/src/mame/itech/itech32.cpp @@ -404,14 +404,24 @@ P/N 1049 REV 1 P/N 1057 REV 0 P/ #include "speaker.h" -#define FULL_LOGGING 0 -#define LOG_DRIVEDGE_UNINIT_RAM 0 +#define LOG_SCREEN (1U << 1) +#define LOG_PIA (1U << 2) +#define LOG_RAM (1U << 3) +#define LOG_ALL (LOG_SCREEN | LOG_PIA | LOG_RAM) + +#define VERBOSE (0) +#include "logmacro.h" + +#define LOGSCREEN(...) LOGMASKED(LOG_SCREEN, __VA_ARGS__) +#define LOGPIA(...) LOGMASKED(LOG_PIA, __VA_ARGS__) +#define LOGRAM(...) LOGMASKED(LOG_RAM, __VA_ARGS__) #define START_TMS_SPINNING(n) do { space.device().execute().spin_until_trigger(7351 + n); m_tms_spinning[n] = 1; } while (0) #define STOP_TMS_SPINNING(machine, n) do { (machine).scheduler().trigger(7351 + n); m_tms_spinning[n] = 0; } while (0) +static constexpr XTAL CPU020_CLOCK = XTAL(25'000'000); // clock for 68EC020-based systems /************************************* @@ -422,14 +432,14 @@ P/N 1049 REV 1 P/N 1057 REV 0 P/ void shoottv_state::update_interrupts(int vint, int xint, int qint) { - /* VINT is ignored on shoottv hardware. */ + // VINT is ignored on shoottv hardware. itech32_state::update_interrupts(-1, xint, qint); } void itech32_state::update_interrupts(int vint, int xint, int qint) { - /* update the states */ + // update the states if (vint != -1) m_vint_state = vint; if (xint != -1) m_xint_state = xint; if (qint != -1) m_qint_state = qint; @@ -444,9 +454,9 @@ void itech32_state::generate_int1(int state) { if (state) { - /* signal the NMI */ + // signal the NMI update_interrupts(1, -1, -1); - if (FULL_LOGGING) logerror("------------ VBLANK (%d) --------------\n", m_screen->vpos()); + LOGSCREEN("------------ VBLANK (%d) --------------\n", m_screen->vpos()); } } @@ -475,15 +485,10 @@ void itech32_state::machine_start() save_item(NAME(m_irq_base)); save_item(NAME(m_sound_return)); save_item(NAME(m_special_result)); - save_item(NAME(m_p1_effx)); - save_item(NAME(m_p1_effy)); - save_item(NAME(m_p1_lastresult)); - save_item(NAME(m_p1_lasttime)); - save_item(NAME(m_p2_effx)); - save_item(NAME(m_p2_effy)); - save_item(NAME(m_p2_lastresult)); - save_item(NAME(m_p2_lasttime)); - save_item(NAME(m_written)); + save_item(NAME(m_effx)); + save_item(NAME(m_effy)); + save_item(NAME(m_lastresult)); + save_item(NAME(m_lasttime)); } void itech32_state::machine_reset() @@ -499,6 +504,9 @@ void drivedge_state::machine_start() m_leds.resolve(); save_item(NAME(m_tms_spinning)); +#if LOG_DRIVEDGE_UNINIT_RAM + save_item(NAME(m_written)); +#endif } void drivedge_state::machine_reset() @@ -537,24 +545,17 @@ void itech32_state::color_w(u8 data) int itech32_state::special_port_r() { - if (m_soundlatch->pending_r()) + if ((!machine().side_effects_disabled()) && m_soundlatch->pending_r()) m_special_result ^= 1; return m_special_result; } +template u8 itech32_state::trackball_r() { - int lower = ioport("TRACKX1")->read(); - int upper = ioport("TRACKY1")->read(); - - return (lower & 15) | ((upper & 15) << 4); -} - -u8 itech32_state::trackball_p2_r() -{ - int lower = ioport("TRACKX2")->read(); - int upper = ioport("TRACKY2")->read(); + const u8 lower = m_trackball_x[Which]->read(); + const u8 upper = m_trackball_y[Which]->read(); return (lower & 15) | ((upper & 15) << 4); } @@ -562,95 +563,56 @@ u8 itech32_state::trackball_p2_r() u16 itech32_state::trackball_8bit_r() { - int lower = ioport("TRACKX1")->read(); - int upper = ioport("TRACKY1")->read(); - - return (lower & 255) | ((upper & 255) << 8); -} - - -u32 itech32_state::trackball32_4bit_p1_r() -{ - attotime curtime = machine().time(); - - if ((curtime - m_p1_lasttime) > m_screen->scan_period()) - { - int upper, lower; - int dx, dy; - - int curx = ioport("TRACKX1")->read(); - int cury = ioport("TRACKY1")->read(); + const u8 lower = m_trackball_x[0]->read(); + const u8 upper = m_trackball_y[0]->read(); - dx = curx - m_p1_effx; - if (dx < -0x80) dx += 0x100; - else if (dx > 0x80) dx -= 0x100; - if (dx > 7) dx = 7; - else if (dx < -7) dx = -7; - m_p1_effx = (m_p1_effx + dx) & 0xff; - lower = m_p1_effx & 15; - - dy = cury - m_p1_effy; - if (dy < -0x80) dy += 0x100; - else if (dy > 0x80) dy -= 0x100; - if (dy > 7) dy = 7; - else if (dy < -7) dy = -7; - m_p1_effy = (m_p1_effy + dy) & 0xff; - upper = m_p1_effy & 15; - - m_p1_lastresult = lower | (upper << 4); - } - - m_p1_lasttime = curtime; - return m_p1_lastresult | (m_p1_lastresult << 16); + return (lower & 255) | (u16(upper & 255) << 8); } - -u32 itech32_state::trackball32_4bit_p2_r() +template +u32 itech32_state::trackball32_4bit_r() { attotime curtime = machine().time(); - if ((curtime - m_p2_lasttime) > m_screen->scan_period()) + if ((curtime - m_lasttime[Which]) > m_screen->scan_period()) { - int upper, lower; - int dx, dy; + const s32 curx = m_trackball_x[Which]->read(); + const s32 cury = m_trackball_y[Which]->read(); - int curx = ioport("TRACKX2")->read(); - int cury = ioport("TRACKY2")->read(); - - dx = curx - m_p2_effx; + int dx = curx - m_effx[Which]; if (dx < -0x80) dx += 0x100; else if (dx > 0x80) dx -= 0x100; if (dx > 7) dx = 7; else if (dx < -7) dx = -7; - m_p2_effx = (m_p2_effx + dx) & 0xff; - lower = m_p2_effx & 15; + m_effx[Which] = (m_effx[Which] + dx) & 0xff; + const u8 lower = m_effx[Which] & 15; - dy = cury - m_p2_effy; + int dy = cury - m_effy[Which]; if (dy < -0x80) dy += 0x100; else if (dy > 0x80) dy -= 0x100; if (dy > 7) dy = 7; else if (dy < -7) dy = -7; - m_p2_effy = (m_p2_effy + dy) & 0xff; - upper = m_p2_effy & 15; + m_effy[Which] = (m_effy[Which] + dy) & 0xff; + const u8 upper = m_effy[Which] & 15; - m_p2_lastresult = lower | (upper << 4); + m_lastresult[Which] = lower | (upper << 4); } - m_p2_lasttime = curtime; - return m_p2_lastresult | (m_p2_lastresult << 16); + m_lasttime[Which] = curtime; + return m_lastresult[Which] | (u32(m_lastresult[Which]) << 16); } u32 itech32_state::trackball32_4bit_combined_r() { - return trackball32_4bit_p1_r() | - (trackball32_4bit_p2_r() << 8); + return trackball32_4bit_r<0>() | + (trackball32_4bit_r<1>() << 8); } u16 drivedge_state::steering_r() { - int val = m_steer->read() * 2 - 0x100; + s32 val = m_steer->read() * 2 - 0x100; if (val < 0) val = 0x100 | (-val); return val; } @@ -684,13 +646,13 @@ u8 itech32_state::itech020_prot_result_r() u32 itech32_state::gt2kp_prot_result_r() { - return 0x00010000; /* 32 bit value at 680000 to 680003 will return the needed value of 0x01 */ + return 0x00010000; // 32 bit value at 680000 to 680003 will return the needed value of 0x01 } u32 itech32_state::gtclass_prot_result_r() { - return 0x00008000; /* 32 bit value at 680000 to 680003 will return the needed value of 0x80 */ + return 0x00008000; // 32 bit value at 680000 to 680003 will return the needed value of 0x80 } @@ -755,14 +717,14 @@ void itech32_state::sound_control_w(u8 data) void drivedge_state::portb_out(u8 data) { -// logerror("PIA port B write = %02x\n", data); - - /* bit 0 controls the fan light */ - /* bit 1 controls the tow light */ - /* bit 2 controls the horn light */ - /* bit 4 controls the ticket dispenser */ - /* bit 5 controls the coin counter */ - /* bit 6 controls the diagnostic sound LED */ +// LOGPIA("PIA port B write = %02x\n", data); + + // bit 0 controls the fan light + // bit 1 controls the tow light + // bit 2 controls the horn light + // bit 4 controls the ticket dispenser + // bit 5 controls the coin counter + // bit 6 controls the diagnostic sound LED m_leds[1] = BIT(data, 0); m_leds[2] = BIT(data, 1); m_leds[3] = BIT(data, 2); @@ -779,11 +741,11 @@ void drivedge_state::turbo_light(int state) void itech32_state::pia_portb_out(u8 data) { -// logerror("PIA port B write = %02x\n", data); +// LOGPIA("PIA port B write = %02x\n", data); - /* bit 4 controls the ticket dispenser */ - /* bit 5 controls the coin counter */ - /* bit 6 controls the diagnostic sound LED */ + // bit 4 controls the ticket dispenser + // bit 5 controls the coin counter + // bit 6 controls the diagnostic sound LED m_ticket->motor_w(BIT(data, 4)); machine().bookkeeping().coin_counter_w(0, BIT(data, 5)); } @@ -818,7 +780,7 @@ void drivedge_state::tms_reset_assert_w(u32 data) void drivedge_state::tms_reset_clear_w(u32 data) { - /* kludge to prevent crash on first boot */ + // kludge to prevent crash on first boot if ((m_tms1_ram[0] & 0xff000000) == 0) { m_dsp[0]->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); @@ -888,7 +850,7 @@ u32 drivedge_state::tms2_speedup_r(address_space &space) void itech32_state::nvram_init(nvram_device &nvram, void *base, size_t length) { // if nvram is the main RAM, don't overwrite exception vectors - int start = (!m_main_ram32) && (base == m_nvram32 || base == m_nvram16) ? 0x80 : 0x00; + const int start = (!m_main_ram32) && (base == m_nvram32 || base == m_nvram16) ? 0x80 : 0x00; for (int i = start; i < length; i++) ((u8 *)base)[i] = machine().rand(); } @@ -907,10 +869,10 @@ void drivedge_state::nvram_init(nvram_device &nvram, void *base, size_t length) * *************************************/ -/*------ Time Killers memory layout ------*/ +//------ Time Killers memory layout ------ void itech32_state::timekill_map(address_map &map) { - map(0x000000, 0x003fff).ram().share("nvram16"); + map(0x000000, 0x003fff).ram().share(m_nvram16); map(0x040000, 0x040001).portr("P1"); map(0x048000, 0x048001).portr("P2"); map(0x050000, 0x050001).portr("SYSTEM"); @@ -918,19 +880,19 @@ void itech32_state::timekill_map(address_map &map) map(0x058000, 0x058001).portr("DIPS").w("watchdog", FUNC(watchdog_timer_device::reset16_w)); map(0x060000, 0x060003).w(FUNC(itech32_state::timekill_colora_w)); map(0x068000, 0x068003).w(FUNC(itech32_state::timekill_colorbc_w)); - map(0x070000, 0x070001).nopw(); /* noisy */ + map(0x070000, 0x070001).nopw(); // noisy map(0x078001, 0x078001).w(FUNC(itech32_state::sound_data_w)); map(0x080000, 0x08007f).rw(FUNC(itech32_state::video_r), FUNC(itech32_state::video_w)); map(0x0a0000, 0x0a0001).w(FUNC(itech32_state::int1_ack_w)); map(0x0c0000, 0x0c7fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x100000, 0x17ffff).rom().region("user1", 0); + map(0x100000, 0x17ffff).rom().region("maindata", 0); } -/*------ BloodStorm and later games memory layout ------*/ +//------ BloodStorm and later games memory layout ------ void itech32_state::bloodstm_map(address_map &map) { - map(0x000000, 0x00ffff).ram().share("nvram16"); + map(0x000000, 0x00ffff).ram().share(m_nvram16); map(0x080000, 0x080001).portr("P1").w(FUNC(itech32_state::int1_ack_w)); map(0x100000, 0x100001).portr("P2"); map(0x180000, 0x180001).portr("P3"); @@ -944,24 +906,27 @@ void itech32_state::bloodstm_map(address_map &map) map(0x580000, 0x59ffff).ram().w(FUNC(itech32_state::bloodstm_paletteram_w)).share("palette"); map(0x700001, 0x700001).w(FUNC(itech32_state::bloodstm_plane_w)); map(0x780000, 0x780001).portr("EXTRA"); - map(0x800000, 0x87ffff).mirror(0x780000).rom().region("user1", 0); + map(0x800000, 0x87ffff).mirror(0x780000).rom().region("maindata", 0); } -/*------ Driver's Edge memory layouts ------*/ +//------ Driver's Edge memory layouts ------ #if LOG_DRIVEDGE_UNINIT_RAM -u32 itech32_state::test1_r(offs_t offset, u32 mem_mask) +u32 drivedge_state::test1_r(offs_t offset, u32 mem_mask) { - if (ACCESSING_BITS_24_31 && !m_written[0x100 + offset*4+0]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+0); - if (ACCESSING_BITS_16_23 && !m_written[0x100 + offset*4+1]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+1); - if (ACCESSING_BITS_8_15 && !m_written[0x100 + offset*4+2]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+2); - if (ACCESSING_BITS_0_7 && !m_written[0x100 + offset*4+3]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+3); + if (!machine().side_effects_disabled()) + { + if (ACCESSING_BITS_24_31 && !m_written[0x100 + offset*4+0]) LOGRAM("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+0); + if (ACCESSING_BITS_16_23 && !m_written[0x100 + offset*4+1]) LOGRAM("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+1); + if (ACCESSING_BITS_8_15 && !m_written[0x100 + offset*4+2]) LOGRAM("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+2); + if (ACCESSING_BITS_0_7 && !m_written[0x100 + offset*4+3]) LOGRAM("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0x100 + offset*4+3); + } return ((u32 *)m_nvram)[0x100/4 + offset]; } -void itech32_state::test1_w(offs_t offset, u32 data, u32 mem_mask) +void drivedge_state::test1_w(offs_t offset, u32 data, u32 mem_mask) { if (ACCESSING_BITS_24_31) m_written[0x100 + offset*4+0] = 1; if (ACCESSING_BITS_16_23) m_written[0x100 + offset*4+1] = 1; @@ -970,16 +935,19 @@ void itech32_state::test1_w(offs_t offset, u32 data, u32 mem_mask) COMBINE_DATA(&((u32 *)m_nvram)[0x100/4 + offset]); } -u32 itech32_state::test2_r(offs_t offset, u32 mem_mask) +u32 drivedge_state::test2_r(offs_t offset, u32 mem_mask) { - if (ACCESSING_BITS_24_31 && !m_written[0xc00 + offset*4+0]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+0); - if (ACCESSING_BITS_16_23 && !m_written[0xc00 + offset*4+1]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+1); - if (ACCESSING_BITS_8_15 && !m_written[0xc00 + offset*4+2]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+2); - if (ACCESSING_BITS_0_7 && !m_written[0xc00 + offset*4+3]) logerror("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+3); + if (!machine().side_effects_disabled()) + { + if (ACCESSING_BITS_24_31 && !m_written[0xc00 + offset*4+0]) LOGRAM("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+0); + if (ACCESSING_BITS_16_23 && !m_written[0xc00 + offset*4+1]) LOGRAM("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+1); + if (ACCESSING_BITS_8_15 && !m_written[0xc00 + offset*4+2]) LOGRAM("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+2); + if (ACCESSING_BITS_0_7 && !m_written[0xc00 + offset*4+3]) LOGRAM("%06X:read from uninitialized memory %04X\n", m_maincpu->pc(), 0xc00 + offset*4+3); + } return ((u32 *)m_nvram)[0xc00/4 + offset]; } -void itech32_state::test2_w(offs_t offset, u32 data, u32 mem_mask) +void drivedge_state::test2_w(offs_t offset, u32 data, u32 mem_mask) { if (ACCESSING_BITS_24_31) m_written[0xc00 + offset*4+0] = 1; if (ACCESSING_BITS_16_23) m_written[0xc00 + offset*4+1] = 1; @@ -991,10 +959,10 @@ void itech32_state::test2_w(offs_t offset, u32 data, u32 mem_mask) void drivedge_state::main_map(address_map &map) { - map(0x000000, 0x03ffff).mirror(0x40000).ram().share("nvram32"); + map(0x000000, 0x03ffff).mirror(0x40000).ram().share(m_nvram32); #if LOG_DRIVEDGE_UNINIT_RAM -map(0x000100, 0x0003ff).mirror(0x40000).rw(FUNC(itech32_state::test1_r), FUNC(itech32_state::test1_w)); -map(0x000c00, 0x007fff).mirror(0x40000).rw(FUNC(itech32_state::test2_r), FUNC(itech32_state::test2_w)); +map(0x000100, 0x0003ff).mirror(0x40000).rw(FUNC(drivedge_state::test1_r), FUNC(drivedge_state::test1_w)); +map(0x000c00, 0x007fff).mirror(0x40000).rw(FUNC(drivedge_state::test2_r), FUNC(drivedge_state::test2_w)); #endif map(0x080000, 0x080003).portr("80000"); map(0x082000, 0x082003).portr("82000"); @@ -1005,7 +973,7 @@ map(0x000c00, 0x007fff).mirror(0x40000).rw(FUNC(itech32_state::test2_r), FUNC(it map(0x08a000, 0x08a003).nopw(); map(0x08c000, 0x08c003).portr("8c000"); map(0x08e000, 0x08e003).portr("8e000").nopw(); - map(0x100000, 0x10000f).w(FUNC(drivedge_state::zbuf_control_w)).share("zctl"); + map(0x100000, 0x10000f).w(FUNC(drivedge_state::zbuf_control_w)).share(m_zbuf_control); map(0x180001, 0x180001).w(FUNC(drivedge_state::color_w<0>)); map(0x1a0000, 0x1bffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); map(0x1c0000, 0x1c0003).nopw(); @@ -1016,27 +984,27 @@ map(0x000c00, 0x007fff).mirror(0x40000).rw(FUNC(itech32_state::test2_r), FUNC(it map(0x280000, 0x280fff).ram().lr32(NAME([this](offs_t offset) { return m_tms1_ram[offset]; })).w(FUNC(drivedge_state::tms1_68k_ram_w)); map(0x300000, 0x300fff).ram().lr32(NAME([this](offs_t offset) { return m_tms2_ram[offset]; })).w(FUNC(drivedge_state::tms2_68k_ram_w)); map(0x380000, 0x380003).nopw(); // .w("watchdog", FUNC(watchdog_timer_device::reset16_w)); - map(0x600000, 0x607fff).rom().region("user1", 0); + map(0x600000, 0x607fff).rom().region("maindata", 0); } void drivedge_state::tms1_map(address_map &map) { - map(0x000000, 0x001fff).ram().share("tms1_boot"); - map(0x008000, 0x0083ff).mirror(0x400).ram().w(FUNC(drivedge_state::tms1_trigger_w)).share("tms1_ram"); + map(0x000000, 0x001fff).ram().share(m_tms1_boot); + map(0x008000, 0x0083ff).mirror(0x400).ram().w(FUNC(drivedge_state::tms1_trigger_w)).share(m_tms1_ram); map(0x080000, 0x0bffff).ram(); } void drivedge_state::tms2_map(address_map &map) { - map(0x000000, 0x0003ff).mirror(0x8400).ram().w(FUNC(drivedge_state::tms2_trigger_w)).share("tms2_ram"); + map(0x000000, 0x0003ff).mirror(0x8400).ram().w(FUNC(drivedge_state::tms2_trigger_w)).share(m_tms2_ram); map(0x080000, 0x08ffff).ram(); } -/*------ 68EC020-based memory layout ------*/ +//------ 68EC020-based memory layout ------ void itech32_state::itech020_map(address_map &map) { - map(0x000000, 0x007fff).ram().share("main_ram"); + map(0x000000, 0x007fff).ram().share(m_main_ram32); map(0x080000, 0x080003).portr("P1").w(FUNC(itech32_state::int1_ack_w)); map(0x100000, 0x100003).portr("P2"); map(0x180000, 0x180003).portr("P3"); @@ -1047,14 +1015,14 @@ void itech32_state::itech020_map(address_map &map) map(0x400000, 0x400003).w("watchdog", FUNC(watchdog_timer_device::reset32_w)); map(0x480001, 0x480001).w(FUNC(itech32_state::sound_data_w)); map(0x500000, 0x5000ff).rw(FUNC(itech32_state::bloodstm_video_r), FUNC(itech32_state::bloodstm_video_w)); - map(0x578000, 0x57ffff).nopr(); /* touched by protection */ + map(0x578000, 0x57ffff).nopr(); // touched by protection map(0x580000, 0x59ffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); - map(0x600000, 0x61ffff).ram().share("nvram32"); + map(0x600000, 0x61ffff).ram().share(m_nvram32); map(0x680002, 0x680002).r(FUNC(itech32_state::itech020_prot_result_r)); map(0x680000, 0x680003).nopw(); -/* ! */ map(0x680800, 0x68083f).readonly().nopw(); /* Serial DUART Channel A/B & Top LED sign - To Do! */ +/* ! */ map(0x680800, 0x68083f).readonly().nopw(); // Serial DUART Channel A/B & Top LED sign - To Do! map(0x700002, 0x700002).w(FUNC(itech32_state::itech020_plane_w)); - map(0x800000, 0xbfffff).rom().region("user1", 0); + map(0x800000, 0xbfffff).rom().region("maindata", 0); } void shoottv_state::shoottv_map(address_map &map) @@ -1094,22 +1062,22 @@ void itech32_state::pubball_map(address_map &map) * *************************************/ -/*------ Rev 1 sound board memory layout ------*/ +//------ Rev 1 sound board memory layout ------ void itech32_state::sound_map(address_map &map) { map(0x0000, 0x0000).w(FUNC(itech32_state::sound_return_w)); map(0x0400, 0x0400).r(m_soundlatch, FUNC(generic_latch_8_device::read)); map(0x0800, 0x083f).mirror(0x80).rw("ensoniq", FUNC(es5506_device::read), FUNC(es5506_device::write)); map(0x0c00, 0x0c00).w(FUNC(itech32_state::sound_bank_w)); - map(0x1000, 0x1000).nopw(); /* noisy */ - map(0x1400, 0x140f).m("via6522_0", FUNC(via6522_device::map)); + map(0x1000, 0x1000).nopw(); // noisy + map(0x1400, 0x140f).m(m_via, FUNC(via6522_device::map)); map(0x2000, 0x3fff).ram(); - map(0x4000, 0x7fff).bankr("soundbank"); + map(0x4000, 0x7fff).bankr(m_soundbank); map(0x8000, 0xffff).rom(); } -/*------ Rev 2 sound board memory layout ------*/ +//------ Rev 2 sound board memory layout ------ void itech32_state::sound_020_map(address_map &map) { map(0x0000, 0x0000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); @@ -1120,7 +1088,7 @@ void itech32_state::sound_020_map(address_map &map) map(0x1800, 0x1800).r(FUNC(itech32_state::sound_data_buffer_r)).nopw(); map(0x1c00, 0x1c00).w(FUNC(itech32_state::sound_control_w)); map(0x2000, 0x3fff).ram(); - map(0x4000, 0x7fff).bankr("soundbank"); + map(0x4000, 0x7fff).bankr(m_soundbank); map(0x8000, 0xffff).rom(); } @@ -1133,7 +1101,7 @@ void itech32_state::sound_020_map(address_map &map) *************************************/ static INPUT_PORTS_START( timekill ) - PORT_START("P1") /* 40000 */ + PORT_START("P1") // 40000 PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) @@ -1143,7 +1111,7 @@ static INPUT_PORTS_START( timekill ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_START("P2") /* 48000 */ + PORT_START("P2") // 48000 PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) @@ -1153,7 +1121,7 @@ static INPUT_PORTS_START( timekill ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_START("SYSTEM") /* 50000 */ + PORT_START("SYSTEM") // 50000 PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) @@ -1163,7 +1131,7 @@ static INPUT_PORTS_START( timekill ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("DIPS") /* 58000 */ + PORT_START("DIPS") // 58000 PORT_SERVICE_NO_TOGGLE( 0x0001, IP_ACTIVE_LOW ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") @@ -1182,7 +1150,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( itech32_base_16bit ) - PORT_START("P1") /* 080000 */ + PORT_START("P1") // 080000 PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) @@ -1192,7 +1160,7 @@ static INPUT_PORTS_START( itech32_base_16bit ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_START("P2") /* 100000 */ + PORT_START("P2") // 100000 PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) @@ -1202,13 +1170,13 @@ static INPUT_PORTS_START( itech32_base_16bit ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_START("P3") /* 180000 */ + PORT_START("P3") // 180000 PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("P4") /* 200000 */ + PORT_START("P4") // 200000 PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("DIPS") /* 280000 */ + PORT_START("DIPS") // 280000 PORT_SERVICE_NO_TOGGLE( 0x0001, IP_ACTIVE_LOW ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") @@ -1224,23 +1192,23 @@ static INPUT_PORTS_START( itech32_base_16bit ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_SERVICE_DIPLOC( 0x0080, IP_ACTIVE_HIGH, "SW1:1" ) - PORT_START("EXTRA") /* 78000 */ + PORT_START("EXTRA") // 78000 PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END static INPUT_PORTS_START( shoottv ) PORT_INCLUDE( itech32_base_16bit ) - PORT_MODIFY("P1") /* 080000 */ + PORT_MODIFY("P1") // 080000 PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x00fc, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_MODIFY("P2") /* 100000 */ + PORT_MODIFY("P2") // 100000 PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x00fc, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_MODIFY("P3") /* 180000 */ + PORT_MODIFY("P3") // 180000 PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x00fc, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1309,7 +1277,7 @@ static INPUT_PORTS_START( hardyard ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(4) - PORT_MODIFY("DIPS") /* 280000 */ + PORT_MODIFY("DIPS") // 280000 PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3") PORT_DIPSETTING( 0x0000, DEF_STR( Upright ) ) PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Players ) ) PORT_DIPLOCATION("SW1:2") @@ -1380,12 +1348,12 @@ static INPUT_PORTS_START( drivedge ) PORT_START("82000") PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00ff0000, 0x00000000, IPT_PEDAL2 ) PORT_MINMAX(0x00000000,0x00060000) PORT_SENSITIVITY(2) PORT_KEYDELTA(100) /* Brake */ + PORT_BIT( 0x00ff0000, 0x00000000, IPT_PEDAL2 ) PORT_MINMAX(0x00000000,0x00060000) PORT_SENSITIVITY(2) PORT_KEYDELTA(100) // Brake - PORT_START("STEER") /* 88000 */ + PORT_START("STEER") // 88000 PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x10,0xf0) PORT_SENSITIVITY(25) PORT_KEYDELTA(5) - PORT_START("GAS") /* 8A000 */ + PORT_START("GAS") // 8A000 PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0x0c) PORT_SENSITIVITY(1) PORT_KEYDELTA(20) PORT_PLAYER(1) INPUT_PORTS_END @@ -1423,12 +1391,12 @@ static INPUT_PORTS_START( wcbowlj ) PORT_MODIFY("DIPS") PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Controls ) ) PORT_DIPLOCATION("SW1:2") PORT_DIPSETTING( 0x0000, "One Trackball" ) - PORT_DIPSETTING( 0x0040, "Two Trackballs" ) /* Two Trackballs will work for Upright for "side by side" controls */ + PORT_DIPSETTING( 0x0040, "Two Trackballs" ) // Two Trackballs will work for Upright for "side by side" controls INPUT_PORTS_END static INPUT_PORTS_START( itech32_base_32bit ) - PORT_START("P1") /* 080000 */ + PORT_START("P1") // 080000 PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_START1 ) @@ -1439,7 +1407,7 @@ static INPUT_PORTS_START( itech32_base_32bit ) PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_START("P2") /* 100000 */ + PORT_START("P2") // 100000 PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_START2 ) @@ -1450,15 +1418,15 @@ static INPUT_PORTS_START( itech32_base_32bit ) PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_START("P3") /* 180000 */ + PORT_START("P3") // 180000 PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x00ff0000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("P4") /* 200000 */ + PORT_START("P4") // 200000 PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x00ff0000, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("DIPS") /* 280000 */ + PORT_START("DIPS") // 280000 PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_SERVICE_NO_TOGGLE( 0x00010000, IP_ACTIVE_LOW ) PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_SERVICE1 ) @@ -1477,7 +1445,7 @@ static INPUT_PORTS_START( itech32_base_32bit ) INPUT_PORTS_END -static INPUT_PORTS_START( wcbowln ) /* WCB version 1.66 supports cocktail mode */ +static INPUT_PORTS_START( wcbowln ) // WCB version 1.66 supports cocktail mode PORT_INCLUDE( itech32_base_32bit ) PORT_MODIFY("P1") @@ -1498,7 +1466,7 @@ static INPUT_PORTS_START( wcbowln ) /* WCB version 1.66 supports cocktail mode * PORT_DIPNAME( 0x00100000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4") PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00100000, DEF_STR( On ) ) - PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3") /* v1.66 ROM sets support Cocktail mode (verified) */ + PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3") // v1.66 ROM sets support Cocktail mode (verified) PORT_DIPSETTING( 0x00000000, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00200000, DEF_STR( Cocktail ) ) PORT_DIPNAME( 0x00400000, 0x00000000, "Freeze Screen" ) PORT_DIPLOCATION("SW1:2") @@ -1522,8 +1490,8 @@ INPUT_PORTS_END static INPUT_PORTS_START( wcbowldx ) PORT_INCLUDE( wcbowln ) - PORT_MODIFY("DIPS") /* 280000 */ - PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:3") /* Verified */ + PORT_MODIFY("DIPS") // 280000 + PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:3") // Verified PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00200000, DEF_STR( On ) ) PORT_DIPNAME( 0x00400000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") @@ -1532,11 +1500,11 @@ static INPUT_PORTS_START( wcbowldx ) INPUT_PORTS_END -static INPUT_PORTS_START( wcbowlo ) /* Earlier versions of World Class Bowling do NOT support a cocktail mode */ +static INPUT_PORTS_START( wcbowlo ) // Earlier versions of World Class Bowling do NOT support a cocktail mode PORT_INCLUDE( wcbowln ) - PORT_MODIFY("DIPS") /* 280000 */ - PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:3") /* Verified */ + PORT_MODIFY("DIPS") // 280000 + PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:3") // Verified PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00200000, DEF_STR( On ) ) PORT_DIPNAME( 0x00400000, 0x00000000, "Freeze Screen" ) PORT_DIPLOCATION("SW1:2") @@ -1565,7 +1533,7 @@ static INPUT_PORTS_START( sftm ) INPUT_PORTS_END -static INPUT_PORTS_START( shufshot ) /* ShuffleShot v1.39 & v1.40 support cocktail mode */ +static INPUT_PORTS_START( shufshot ) // ShuffleShot v1.39 & v1.40 support cocktail mode PORT_INCLUDE( itech32_base_32bit ) PORT_MODIFY("P1") @@ -1583,7 +1551,7 @@ static INPUT_PORTS_START( shufshot ) /* ShuffleShot v1.39 & v1.40 support cockta PORT_BIT( 0x00fb0000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_MODIFY("DIPS") - PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3") /* Verified */ + PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3") // Verified PORT_DIPSETTING( 0x00000000, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00200000, DEF_STR( Cocktail ) ) @@ -1601,11 +1569,11 @@ static INPUT_PORTS_START( shufshot ) /* ShuffleShot v1.39 & v1.40 support cockta INPUT_PORTS_END -static INPUT_PORTS_START( shufshto ) /* Earlier versions of Shuffleshot do NOT support a cocktail mode */ +static INPUT_PORTS_START( shufshto ) // Earlier versions of Shuffleshot do NOT support a cocktail mode PORT_INCLUDE( shufshot ) PORT_MODIFY("DIPS") - PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:3") /* Verified */ + PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:3") // Verified PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00200000, DEF_STR( On ) ) PORT_DIPNAME( 0x00400000, 0x00000000, "Freeze Screen" ) PORT_DIPLOCATION("SW1:2") @@ -1642,7 +1610,7 @@ static INPUT_PORTS_START( gt3d ) PORT_DIPSETTING( 0x00200000, "45 Degree Angle" ) PORT_DIPNAME( 0x00400000, 0x00000000, DEF_STR( Controls ) ) PORT_DIPLOCATION("SW1:2") PORT_DIPSETTING( 0x00000000, "One Trackball" ) - PORT_DIPSETTING( 0x00400000, "Two Trackballs" ) /* Two Trackballs will work for Upright for "side by side" controls */ + PORT_DIPSETTING( 0x00400000, "Two Trackballs" ) // Two Trackballs will work for Upright for "side by side" controls PORT_START("TRACKX1") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(1) @@ -1658,14 +1626,14 @@ static INPUT_PORTS_START( gt3d ) INPUT_PORTS_END -static INPUT_PORTS_START( gt97 ) /* v1.30 is the first known version of GT97 to support Cocktail mode! */ +static INPUT_PORTS_START( gt97 ) // v1.30 is the first known version of GT97 to support Cocktail mode! PORT_INCLUDE(gt3d) PORT_MODIFY("DIPS") PORT_DIPNAME( 0x00100000, 0x00000000, "Freeze Screen" ) PORT_DIPLOCATION("SW1:4") PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00100000, DEF_STR( On ) ) - PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") /* Seem to have no effect on the game */ + PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") // Seem to have no effect on the game PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00200000, DEF_STR( On ) ) PORT_DIPNAME( 0x00400000, 0x00000000, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:2") @@ -1674,7 +1642,7 @@ static INPUT_PORTS_START( gt97 ) /* v1.30 is the first known version of GT97 to INPUT_PORTS_END -static INPUT_PORTS_START( gt97o ) /* Older versions of GT97 do NOT support a cocktail mode */ +static INPUT_PORTS_START( gt97o ) // Older versions of GT97 do NOT support a cocktail mode PORT_INCLUDE(gt3d) PORT_MODIFY("DIPS") @@ -1691,7 +1659,7 @@ static INPUT_PORTS_START( gt97s ) PORT_DIPNAME( 0x00100000, 0x00000000, "Freeze Screen" ) PORT_DIPLOCATION("SW1:4") PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00100000, DEF_STR( On ) ) - PORT_DIPNAME( 0x00400000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") /* Single controller version - has no effect */ + PORT_DIPNAME( 0x00400000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") // Single controller version - has no effect PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00400000, DEF_STR( On ) ) INPUT_PORTS_END @@ -1720,10 +1688,10 @@ static INPUT_PORTS_START( gt98s ) PORT_INCLUDE(gt3d) PORT_MODIFY("DIPS") - PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") /* Seem to have no effect on the game */ + PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") // Seem to have no effect on the game PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00200000, DEF_STR( On ) ) - PORT_DIPNAME( 0x00400000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") /* Single controller version - has no effect */ + PORT_DIPNAME( 0x00400000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") // Single controller version - has no effect PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00400000, DEF_STR( On ) ) INPUT_PORTS_END @@ -1733,13 +1701,13 @@ static INPUT_PORTS_START( s_ver ) PORT_INCLUDE(gt3d) PORT_MODIFY("DIPS") - PORT_DIPNAME( 0x00100000, 0x00000000, "Trackball Orientation" ) PORT_DIPLOCATION("SW1:4") /* Determined by actual use / trial & error */ - PORT_DIPSETTING( 0x00000000, "Normal Mount" ) /* The manual says "Always on (default)" and "Off -- UNUSED --" */ + PORT_DIPNAME( 0x00100000, 0x00000000, "Trackball Orientation" ) PORT_DIPLOCATION("SW1:4") // Determined by actual use / trial & error + PORT_DIPSETTING( 0x00000000, "Normal Mount" ) // The manual says "Always on (default)" and "Off -- UNUSED --" PORT_DIPSETTING( 0x00100000, "45 Degree Angle" ) - PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") /* Single controller version - has no effect */ + PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") // Single controller version - has no effect PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00200000, DEF_STR( On ) ) - PORT_DIPNAME( 0x00400000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") /* Single controller version - has no effect */ + PORT_DIPNAME( 0x00400000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") // Single controller version - has no effect PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00400000, DEF_STR( On ) ) INPUT_PORTS_END @@ -1749,12 +1717,12 @@ static INPUT_PORTS_START( aama ) PORT_INCLUDE(gt3d) PORT_MODIFY("DIPS") - PORT_DIPNAME( 0x00100000, 0x00000000, "Trackball Orientation" ) PORT_DIPLOCATION("SW1:4") /* Determined by actual use / trial & error */ - PORT_DIPSETTING( 0x00000000, "Normal Mount" ) /* The manual says "Always on (default)" and "Off -- UNUSED --" */ + PORT_DIPNAME( 0x00100000, 0x00000000, "Trackball Orientation" ) PORT_DIPLOCATION("SW1:4") // Determined by actual use / trial & error + PORT_DIPSETTING( 0x00000000, "Normal Mount" ) // The manual says "Always on (default)" and "Off -- UNUSED --" PORT_DIPSETTING( 0x00100000, "45 Degree Angle" ) PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x00000000, DEF_STR( Upright ) ) /* Two Trackballs will work with Upright for "side by side" controls */ - PORT_DIPSETTING( 0x00200000, DEF_STR( Cocktail ) ) /* Cocktail mode REQUIRES "Controls" to be set to "Two Trackballs" */ + PORT_DIPSETTING( 0x00000000, DEF_STR( Upright ) ) // Two Trackballs will work with Upright for "side by side" controls + PORT_DIPSETTING( 0x00200000, DEF_STR( Cocktail ) ) // Cocktail mode REQUIRES "Controls" to be set to "Two Trackballs" INPUT_PORTS_END static INPUT_PORTS_START( pubball ) @@ -1797,6 +1765,9 @@ INPUT_PORTS_END * *************************************/ +static constexpr XTAL CPU_CLOCK = XTAL(12'000'000); // clock for 68000-based systems +static constexpr XTAL SOUND_CLOCK = XTAL(16'000'000); // clock for sound board + void itech32_state::base_devices(machine_config &config) { MC6809E(config, m_soundcpu, SOUND_CLOCK/8); // EF68B09EP @@ -1826,8 +1797,8 @@ void itech32_state::base_devices(machine_config &config) m_ensoniq->set_region1("ensoniq.1"); m_ensoniq->set_region2("ensoniq.2"); m_ensoniq->set_region3("ensoniq.3"); - m_ensoniq->set_channels(1); /* channels */ - m_ensoniq->add_route(0, "rspeaker", 0.1); /* swapped stereo */ + m_ensoniq->set_channels(1); // channels + m_ensoniq->add_route(0, "rspeaker", 0.1); // swapped stereo m_ensoniq->add_route(1, "lspeaker", 0.1); } @@ -1869,7 +1840,9 @@ void itech32_state::bloodstm(machine_config &config) void drivedge_state::drivedge(machine_config &config) { - /* basic machine hardware */ + constexpr XTAL TMS_CLOCK = XTAL(40'000'000); // TMS320C31 clocks on drivedge + + // basic machine hardware M68EC020(config, m_maincpu, CPU020_CLOCK); m_maincpu->set_addrmap(AS_PROGRAM, &drivedge_state::main_map); @@ -1895,11 +1868,11 @@ void drivedge_state::drivedge(machine_config &config) m_screen->screen_vblank().set_nop(); // interrupt not used? - SPEAKER(config, "left_back").front_left(); /* Sound PCB has hook-ups & AMPs for 5 channels */ - SPEAKER(config, "right_back").front_right(); /* As per Sound Tests Menu: Left Front, Right Front, Left Rear, Right Rear, Under Seat */ + SPEAKER(config, "left_back").front_left(); // Sound PCB has hook-ups & AMPs for 5 channels + SPEAKER(config, "right_back").front_right(); // As per Sound Tests Menu: Left Front, Right Front, Left Rear, Right Rear, Under Seat m_ensoniq->set_channels(2); - m_ensoniq->add_route(2, "right_back", 0.1); /* swapped stereo */ + m_ensoniq->add_route(2, "right_back", 0.1); // swapped stereo m_ensoniq->add_route(3, "left_back", 0.1); } @@ -1950,133 +1923,133 @@ void itech32_state::pubball(machine_config &config) * *************************************/ -/* Maximum sftm code size */ +// Maximum sftm code size #undef CODE_SIZE #define CODE_SIZE 0x0400000 -ROM_START( timekill ) /* Version 1.32 (3-tier board set: P/N 1050 Rev 1, P/N 1051 Rev 0 & P/N 1052 Rev 2) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "tk00_v1.32_u54.u54", 0x00000, 0x40000, CRC(68c74b81) SHA1(acdf677f82d7428acc6cf01076d43dd6330e9cb3) ) /* Labeled TK00 V1.32 (U54) */ - ROM_LOAD16_BYTE( "tk01_v1.32_u53.u53", 0x00001, 0x40000, CRC(2158d8ef) SHA1(14aa66e020a9fa890fadbaf0936dfdc4e272f543) ) /* Labeled TK01 V1.32 (U53) */ +ROM_START( timekill ) // Version 1.32 (3-tier board set: P/N 1050 Rev 1, P/N 1051 Rev 0 & P/N 1052 Rev 2) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "tk00_v1.32_u54.u54", 0x00000, 0x40000, CRC(68c74b81) SHA1(acdf677f82d7428acc6cf01076d43dd6330e9cb3) ) // Labeled TK00 V1.32 (U54) + ROM_LOAD16_BYTE( "tk01_v1.32_u53.u53", 0x00001, 0x40000, CRC(2158d8ef) SHA1(14aa66e020a9fa890fadbaf0936dfdc4e272f543) ) // Labeled TK01 V1.32 (U53) - ROM_REGION( 0x28000, "soundcpu", 0 ) /* At 0x18002 in ROM: ITSOUND Ver 4.1 OTTO Sound Board 6255 I/O 6/3/92 */ - ROM_LOAD( "tk_snd_v_4.1_u17.u17", 0x10000, 0x18000, CRC(c699af7b) SHA1(55863513a1c27dcb257dbc20e522cfafa9b92c9d) ) /* labeled TK SND V 4.1 (U17) */ + ROM_REGION( 0x28000, "soundcpu", 0 ) // At 0x18002 in ROM: ITSOUND Ver 4.1 OTTO Sound Board 6255 I/O 6/3/92 + ROM_LOAD( "tk_snd_v_4.1_u17.u17", 0x10000, 0x18000, CRC(c699af7b) SHA1(55863513a1c27dcb257dbc20e522cfafa9b92c9d) ) // labeled TK SND V 4.1 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) /* ROM board P/N 1051 REV0 */ - ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) /* 42 pin mask ROM */ + ROM_REGION( 0x880000, "grom", 0 ) // ROM board P/N 1051 REV0 + ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) // 42 pin mask ROM - /* NOTE: ROM boards are known to exist and have been verified to list (silkscreen) the above locations as ROM1, ROM2, ROM3 & ROM4 */ + // NOTE: ROM boards are known to exist and have been verified to list (silkscreen) the above locations as ROM1, ROM2, ROM3 & ROM4 ROM_LOAD32_BYTE( "timekill_grom01.grom1", 0x800000, 0x020000, CRC(b030c3d9) SHA1(f5c21285ec8ff4f74205e0cf18da67e733e31183) ) ROM_LOAD32_BYTE( "timekill_grom02.grom2", 0x800001, 0x020000, CRC(e98492a4) SHA1(fe8fb4bd3900109f3872f2930e8ddc9d19f599fd) ) ROM_LOAD32_BYTE( "timekill_grom03.grom3", 0x800002, 0x020000, CRC(6088fa64) SHA1(a3eee10bdef48fefec3836f551172dbe0819acf6) ) ROM_LOAD32_BYTE( "timekill_grom04.grom4", 0x800003, 0x020000, CRC(95be2318) SHA1(60580c87d63a114df44e2580e138128388ff447b) ) - ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) /* Sound board P/N 1052 REV 4 */ - ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) /* Labeled TKSROM00 (U18) */ - ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) /* Labeled TKSROM01 (U20) */ - ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) /* Labeled TKSROM02 (U26) */ + ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) // Sound board P/N 1052 REV 4 + ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) // Labeled TKSROM00 (U18) + ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) // Labeled TKSROM01 (U20) + ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) // Labeled TKSROM02 (U26) ROM_END -ROM_START( timekill132i ) /* Version 1.32I (3-tier board set: P/N 1050 Rev 1, P/N 1051 Rev 0 & P/N 1052 Rev 2) - Additional Violence Level: Level 4 - Limbs, Decapitations, No Blood */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "tk00_v1.32i_u54.u54", 0x00000, 0x40000, CRC(6cef5e8c) SHA1(43cd3e704567be7a60558e12c43f0bb4456ec96d) ) /* Labeled TK00 V1.32I (U54) */ - ROM_LOAD16_BYTE( "tk01_v1.32i_u53.u53", 0x00001, 0x40000, CRC(3360f6a3) SHA1(37b49928db6d672a2bc9ddf4d35d649655450c08) ) /* Labeled TK01 V1.32I (U53) */ +ROM_START( timekill132i ) // Version 1.32I (3-tier board set: P/N 1050 Rev 1, P/N 1051 Rev 0 & P/N 1052 Rev 2) - Additional Violence Level: Level 4 - Limbs, Decapitations, No Blood + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "tk00_v1.32i_u54.u54", 0x00000, 0x40000, CRC(6cef5e8c) SHA1(43cd3e704567be7a60558e12c43f0bb4456ec96d) ) // Labeled TK00 V1.32I (U54) + ROM_LOAD16_BYTE( "tk01_v1.32i_u53.u53", 0x00001, 0x40000, CRC(3360f6a3) SHA1(37b49928db6d672a2bc9ddf4d35d649655450c08) ) // Labeled TK01 V1.32I (U53) - ROM_REGION( 0x28000, "soundcpu", 0 ) /* At 0x18002 in ROM: ITSOUND Ver 4.1 OTTO Sound Board 6255 I/O 6/3/92 */ - ROM_LOAD( "tk_snd_v_4.1_u17.u17", 0x10000, 0x18000, CRC(c699af7b) SHA1(55863513a1c27dcb257dbc20e522cfafa9b92c9d) ) /* labeled TK SND V 4.1 (U17) */ + ROM_REGION( 0x28000, "soundcpu", 0 ) // At 0x18002 in ROM: ITSOUND Ver 4.1 OTTO Sound Board 6255 I/O 6/3/92 + ROM_LOAD( "tk_snd_v_4.1_u17.u17", 0x10000, 0x18000, CRC(c699af7b) SHA1(55863513a1c27dcb257dbc20e522cfafa9b92c9d) ) // labeled TK SND V 4.1 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) /* ROM board P/N 1051 REV0 */ - ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) /* 42 pin mask ROM */ + ROM_REGION( 0x880000, "grom", 0 ) // ROM board P/N 1051 REV0 + ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) // 42 pin mask ROM - /* NOTE: ROM boards are known to exist and have been verified to list (silkscreen) the above locations as ROM1, ROM2, ROM3 & ROM4 */ + // NOTE: ROM boards are known to exist and have been verified to list (silkscreen) the above locations as ROM1, ROM2, ROM3 & ROM4 ROM_LOAD32_BYTE( "timekill_grom01.grom1", 0x800000, 0x020000, CRC(b030c3d9) SHA1(f5c21285ec8ff4f74205e0cf18da67e733e31183) ) ROM_LOAD32_BYTE( "timekill_grom02.grom2", 0x800001, 0x020000, CRC(e98492a4) SHA1(fe8fb4bd3900109f3872f2930e8ddc9d19f599fd) ) ROM_LOAD32_BYTE( "timekill_grom03.grom3", 0x800002, 0x020000, CRC(6088fa64) SHA1(a3eee10bdef48fefec3836f551172dbe0819acf6) ) ROM_LOAD32_BYTE( "timekill_grom04.grom4", 0x800003, 0x020000, CRC(95be2318) SHA1(60580c87d63a114df44e2580e138128388ff447b) ) - ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) /* Sound board P/N 1052 REV 4 */ - ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) /* Labeled TKSROM00 (U18) */ - ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) /* Labeled TKSROM01 (U20) */ - ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) /* Labeled TKSROM02 (U26) */ + ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) // Sound board P/N 1052 REV 4 + ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) // Labeled TKSROM00 (U18) + ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) // Labeled TKSROM01 (U20) + ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) // Labeled TKSROM02 (U26) ROM_END -ROM_START( timekill131 ) /* Version 1.31 (3-tier board set: P/N 1050 Rev 1, P/N 1051 Rev 0 & P/N 1052 Rev 2) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "tk00_v1.31_u54.u54", 0x00000, 0x40000, CRC(e09ae32b) SHA1(b090a38600d0499f7b4cb80a2715f27216d408b0) ) /* Labeled TK00 V1.31 (U54) */ - ROM_LOAD16_BYTE( "tk01_v1.31_u53.u53", 0x00001, 0x40000, CRC(c29137ec) SHA1(4dcfba13b6f865a256bcb0406b6c83c309b17313) ) /* Labeled TK01 V1.31 (U53) */ +ROM_START( timekill131 ) // Version 1.31 (3-tier board set: P/N 1050 Rev 1, P/N 1051 Rev 0 & P/N 1052 Rev 2) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "tk00_v1.31_u54.u54", 0x00000, 0x40000, CRC(e09ae32b) SHA1(b090a38600d0499f7b4cb80a2715f27216d408b0) ) // Labeled TK00 V1.31 (U54) + ROM_LOAD16_BYTE( "tk01_v1.31_u53.u53", 0x00001, 0x40000, CRC(c29137ec) SHA1(4dcfba13b6f865a256bcb0406b6c83c309b17313) ) // Labeled TK01 V1.31 (U53) - ROM_REGION( 0x28000, "soundcpu", 0 ) /* At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 */ - ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) /* Labeled TIMEKILLSND (U17) */ + ROM_REGION( 0x28000, "soundcpu", 0 ) // At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 + ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) // Labeled TIMEKILLSND (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) /* ROM board P/N 1051 REV0 */ - ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) /* 42 pin mask ROM */ + ROM_REGION( 0x880000, "grom", 0 ) // ROM board P/N 1051 REV0 + ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) // 42 pin mask ROM - /* NOTE: ROM boards are known to exist and have been verified to list (silkscreen) the above locations as ROM1, ROM2, ROM3 & ROM4 */ + // NOTE: ROM boards are known to exist and have been verified to list (silkscreen) the above locations as ROM1, ROM2, ROM3 & ROM4 ROM_LOAD32_BYTE( "timekill_grom01.grom1", 0x800000, 0x020000, CRC(b030c3d9) SHA1(f5c21285ec8ff4f74205e0cf18da67e733e31183) ) ROM_LOAD32_BYTE( "timekill_grom02.grom2", 0x800001, 0x020000, CRC(e98492a4) SHA1(fe8fb4bd3900109f3872f2930e8ddc9d19f599fd) ) ROM_LOAD32_BYTE( "timekill_grom03.grom3", 0x800002, 0x020000, CRC(6088fa64) SHA1(a3eee10bdef48fefec3836f551172dbe0819acf6) ) ROM_LOAD32_BYTE( "timekill_grom04.grom4", 0x800003, 0x020000, CRC(95be2318) SHA1(60580c87d63a114df44e2580e138128388ff447b) ) - ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) /* Sound board P/N 1052 REV 4 */ - ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) /* Labeled TKSROM00 (U18) */ - ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) /* Labeled TKSROM01 (U20) */ - ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) /* Labeled TKSROM02 (U26) */ + ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) // Sound board P/N 1052 REV 4 + ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) // Labeled TKSROM00 (U18) + ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) // Labeled TKSROM01 (U20) + ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) // Labeled TKSROM02 (U26) ROM_END -ROM_START( timekill121 ) /* Version 1.21 (3-tier board set: P/N 1050 Rev 1, P/N 1051 Rev 0 & P/N 1052 Rev 2) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "tk00_v1.21_u54.u54", 0x00000, 0x40000, CRC(4938a940) SHA1(c42c5067ba0536ab22071c80a50434905acd93c2) ) /* Labeled TK00 V1.21 (U54) */ - ROM_LOAD16_BYTE( "tk01_v1.21_u53.u53", 0x00001, 0x40000, CRC(0bb75c40) SHA1(99829ecb0692ea8b313bd8c2e982258c97599b06) ) /* Labeled TK01 V1.21 (U53) */ +ROM_START( timekill121 ) // Version 1.21 (3-tier board set: P/N 1050 Rev 1, P/N 1051 Rev 0 & P/N 1052 Rev 2) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "tk00_v1.21_u54.u54", 0x00000, 0x40000, CRC(4938a940) SHA1(c42c5067ba0536ab22071c80a50434905acd93c2) ) // Labeled TK00 V1.21 (U54) + ROM_LOAD16_BYTE( "tk01_v1.21_u53.u53", 0x00001, 0x40000, CRC(0bb75c40) SHA1(99829ecb0692ea8b313bd8c2e982258c97599b06) ) // Labeled TK01 V1.21 (U53) - ROM_REGION( 0x28000, "soundcpu", 0 ) /* At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 */ - ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) /* Labeled TIMEKILLSND (U17) */ + ROM_REGION( 0x28000, "soundcpu", 0 ) // At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 + ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) // Labeled TIMEKILLSND (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) /* ROM board P/N 1051 REV0 */ - ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) /* 42 pin mask ROM */ + ROM_REGION( 0x880000, "grom", 0 ) // ROM board P/N 1051 REV0 + ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) // 42 pin mask ROM - /* NOTE: ROM boards are known to exist and have been verified to list (silkscreen) the above locations as ROM1, ROM2, ROM3 & ROM4 */ + // NOTE: ROM boards are known to exist and have been verified to list (silkscreen) the above locations as ROM1, ROM2, ROM3 & ROM4 ROM_LOAD32_BYTE( "timekill_grom01.grom1", 0x800000, 0x020000, CRC(b030c3d9) SHA1(f5c21285ec8ff4f74205e0cf18da67e733e31183) ) ROM_LOAD32_BYTE( "timekill_grom02.grom2", 0x800001, 0x020000, CRC(e98492a4) SHA1(fe8fb4bd3900109f3872f2930e8ddc9d19f599fd) ) ROM_LOAD32_BYTE( "timekill_grom03.grom3", 0x800002, 0x020000, CRC(6088fa64) SHA1(a3eee10bdef48fefec3836f551172dbe0819acf6) ) ROM_LOAD32_BYTE( "timekill_grom04.grom4", 0x800003, 0x020000, CRC(95be2318) SHA1(60580c87d63a114df44e2580e138128388ff447b) ) - ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) /* Sound board P/N 1052 REV 4 */ - ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) /* Labeled TKSROM00 (U18) */ - ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) /* Labeled TKSROM01 (U20) */ - ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) /* Labeled TKSROM02 (U26) */ + ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) // Sound board P/N 1052 REV 4 + ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) // Labeled TKSROM00 (U18) + ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) // Labeled TKSROM01 (U20) + ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) // Labeled TKSROM02 (U26) ROM_END -ROM_START( timekill121a ) /* Version 1.21 (3-tier board set: P/N 1050 Rev 1, P/N 1049 Rev 1 & P/N 1052 Rev 2) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "tk00_v1.21_u54.u54", 0x00000, 0x40000, CRC(4938a940) SHA1(c42c5067ba0536ab22071c80a50434905acd93c2) ) /* Labeled TK00 V1.21 (U54) */ - ROM_LOAD16_BYTE( "tk01_v1.21_u53.u53", 0x00001, 0x40000, CRC(0bb75c40) SHA1(99829ecb0692ea8b313bd8c2e982258c97599b06) ) /* Labeled TK01 V1.21 (U53) */ +ROM_START( timekill121a ) // Version 1.21 (3-tier board set: P/N 1050 Rev 1, P/N 1049 Rev 1 & P/N 1052 Rev 2) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "tk00_v1.21_u54.u54", 0x00000, 0x40000, CRC(4938a940) SHA1(c42c5067ba0536ab22071c80a50434905acd93c2) ) // Labeled TK00 V1.21 (U54) + ROM_LOAD16_BYTE( "tk01_v1.21_u53.u53", 0x00001, 0x40000, CRC(0bb75c40) SHA1(99829ecb0692ea8b313bd8c2e982258c97599b06) ) // Labeled TK01 V1.21 (U53) - ROM_REGION( 0x28000, "soundcpu", 0 ) /* At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 */ - ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) /* Labeled TIMEKILLSND (U17) */ + ROM_REGION( 0x28000, "soundcpu", 0 ) // At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 + ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) // Labeled TIMEKILLSND (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) /* ROM board P/N 1049 REV1 */ + ROM_REGION( 0x880000, "grom", 0 ) // ROM board P/N 1049 REV1 ROM_LOAD32_BYTE( "timekill_grom00.grom00", 0x000000, 0x080000, CRC(980aab02) SHA1(c5ce18748b1677d7b8fc599355d282d7fb9dda11) ) ROM_LOAD32_BYTE( "timekill_grom05.grom05", 0x000001, 0x080000, CRC(0b28ae65) SHA1(854091d312512eedb0f5acc7b31d7033dd138352) ) ROM_LOAD32_BYTE( "timekill_grom10.grom10", 0x000002, 0x080000, CRC(6092c59e) SHA1(70be57e2039786f9384f7d39daccfea3028afdd6) ) @@ -2093,55 +2066,55 @@ ROM_START( timekill121a ) /* Version 1.21 (3-tier board set: P/N 1050 Rev 1, P/N ROM_LOAD32_BYTE( "timekill_grom08.grom08", 0x600001, 0x080000, CRC(7d6f7ba9) SHA1(cc4a51a3e883345d3dee600913f3d6ba5b74951e) ) ROM_LOAD32_BYTE( "timekill_grom13.grom13", 0x600002, 0x080000, CRC(ecde039d) SHA1(83f5d979e3055ac09b5b652e40115338559f9a53) ) ROM_LOAD32_BYTE( "timekill_grom18.grom18", 0x600003, 0x080000, CRC(05cb6d82) SHA1(ddba15ceabcbcce86baf95d844e3ef5e1246d926) ) - ROM_LOAD32_BYTE( "timekill_grom04.grom04", 0x800000, 0x020000, CRC(b030c3d9) SHA1(f5c21285ec8ff4f74205e0cf18da67e733e31183) ) /* == timekill_grom01.grom1 */ - ROM_LOAD32_BYTE( "timekill_grom09.grom09", 0x800001, 0x020000, CRC(e98492a4) SHA1(fe8fb4bd3900109f3872f2930e8ddc9d19f599fd) ) /* == timekill_grom02.grom2 */ - ROM_LOAD32_BYTE( "timekill_grom14.grom14", 0x800002, 0x020000, CRC(6088fa64) SHA1(a3eee10bdef48fefec3836f551172dbe0819acf6) ) /* == timekill_grom03.grom3 */ - ROM_LOAD32_BYTE( "timekill_grom19.grom19", 0x800003, 0x020000, CRC(95be2318) SHA1(60580c87d63a114df44e2580e138128388ff447b) ) /* == timekill_grom04.grom4 */ - - ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) /* Sound board P/N 1052 REV 4 */ - ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) /* Labeled TKSROM00 (U18) */ - ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) /* Labeled TKSROM01 (U20) */ - ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) /* Labeled TKSROM02 (U26) */ + ROM_LOAD32_BYTE( "timekill_grom04.grom04", 0x800000, 0x020000, CRC(b030c3d9) SHA1(f5c21285ec8ff4f74205e0cf18da67e733e31183) ) // == timekill_grom01.grom1 + ROM_LOAD32_BYTE( "timekill_grom09.grom09", 0x800001, 0x020000, CRC(e98492a4) SHA1(fe8fb4bd3900109f3872f2930e8ddc9d19f599fd) ) // == timekill_grom02.grom2 + ROM_LOAD32_BYTE( "timekill_grom14.grom14", 0x800002, 0x020000, CRC(6088fa64) SHA1(a3eee10bdef48fefec3836f551172dbe0819acf6) ) // == timekill_grom03.grom3 + ROM_LOAD32_BYTE( "timekill_grom19.grom19", 0x800003, 0x020000, CRC(95be2318) SHA1(60580c87d63a114df44e2580e138128388ff447b) ) // == timekill_grom04.grom4 + + ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) // Sound board P/N 1052 REV 4 + ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) // Labeled TKSROM00 (U18) + ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) // Labeled TKSROM01 (U20) + ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) // Labeled TKSROM02 (U26) ROM_END -ROM_START( timekill120 ) /* Version 1.20 (3-tier board set: P/N 1050 Rev 1, P/N 1057 Rev 0 & P/N 1052 Rev 2) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "tk00_v1.2_u54.u54", 0x00000, 0x40000, CRC(df1ce59d) SHA1(57365da1c7c0bd2f5e342099fecefc8cd9927e81) ) /* Labeled TK00 V1.2 (U54) - service mode shows v1.20 */ - ROM_LOAD16_BYTE( "tk01_v1.2_u53.u53", 0x00001, 0x40000, CRC(d42b9849) SHA1(d1d01689bdb79624cc13545c5cb0e9af5eebba88) ) /* Labeled TK01 V1.2 (U53) - service mode shows v1.20 */ +ROM_START( timekill120 ) // Version 1.20 (3-tier board set: P/N 1050 Rev 1, P/N 1057 Rev 0 & P/N 1052 Rev 2) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "tk00_v1.2_u54.u54", 0x00000, 0x40000, CRC(df1ce59d) SHA1(57365da1c7c0bd2f5e342099fecefc8cd9927e81) ) // Labeled TK00 V1.2 (U54) - service mode shows v1.20 + ROM_LOAD16_BYTE( "tk01_v1.2_u53.u53", 0x00001, 0x40000, CRC(d42b9849) SHA1(d1d01689bdb79624cc13545c5cb0e9af5eebba88) ) // Labeled TK01 V1.2 (U53) - service mode shows v1.20 - ROM_REGION( 0x28000, "soundcpu", 0 ) /* At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 */ - ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) /* Labeled TIMEKILLSND (U17) */ + ROM_REGION( 0x28000, "soundcpu", 0 ) // At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 + ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) // Labeled TIMEKILLSND (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) /* ROM board P/N 1057 REV0 */ - ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) /* 42 pin mask ROM */ - ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) /* 42 pin mask ROM */ + ROM_REGION( 0x880000, "grom", 0 ) // ROM board P/N 1057 REV0 + ROM_LOAD32_BYTE( "time_killers_0.rom0", 0x000000, 0x200000, CRC(94cbf6f8) SHA1(dac5c4d9c8e42336c236ecc3c72b3b1f8282dc2f) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_1.rom1", 0x000001, 0x200000, CRC(c07dea98) SHA1(dd8b88beb9781579eb0a17231ad2a274b70ae1bc) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_2.rom2", 0x000002, 0x200000, CRC(183eed2a) SHA1(3905268fe45ecc47cd4d349666b4d33efda2140b) ) // 42 pin mask ROM + ROM_LOAD32_BYTE( "time_killers_3.rom3", 0x000003, 0x200000, CRC(b1da1058) SHA1(a1d483701c661d69cecc9d073b23683b119f5ef1) ) // 42 pin mask ROM - /* NOTE: The 1057 ROM board has 4 identical sets of the 42 pin mask ROMs at locations ROMA0-ROMA3, ROMB0-ROMB3, ROMC0-ROMC3 & ROMD0-ROMD3 */ + // NOTE: The 1057 ROM board has 4 identical sets of the 42 pin mask ROMs at locations ROMA0-ROMA3, ROMB0-ROMB3, ROMC0-ROMC3 & ROMD0-ROMD3 ROM_LOAD32_BYTE( "timekill_grom01.grom1", 0x800000, 0x020000, CRC(b030c3d9) SHA1(f5c21285ec8ff4f74205e0cf18da67e733e31183) ) ROM_LOAD32_BYTE( "timekill_grom02.grom2", 0x800001, 0x020000, CRC(e98492a4) SHA1(fe8fb4bd3900109f3872f2930e8ddc9d19f599fd) ) ROM_LOAD32_BYTE( "timekill_grom03.grom3", 0x800002, 0x020000, CRC(6088fa64) SHA1(a3eee10bdef48fefec3836f551172dbe0819acf6) ) ROM_LOAD32_BYTE( "timekill_grom04.grom4", 0x800003, 0x020000, CRC(95be2318) SHA1(60580c87d63a114df44e2580e138128388ff447b) ) - ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) /* Sound board P/N 1052 REV 4 */ - ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) /* Labeled TKSROM00 (U18) */ - ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) /* Labeled TKSROM01 (U20) */ - ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) /* Labeled TKSROM02 (U26) */ + ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) // Sound board P/N 1052 REV 4 + ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) // Labeled TKSROM00 (U18) + ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) // Labeled TKSROM01 (U20) + ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) // Labeled TKSROM02 (U26) ROM_END -ROM_START( timekill100 ) /* Version 1.00? - actual version not shown (3-tier board set: P/N 1050 Rev 1, P/N 1049 Rev 1 & P/N 1052 Rev 2) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "tk00.bim_u54.u54", 0x00000, 0x40000, CRC(2b379f30) SHA1(7034cb0e6ba49ba9147fdb7ff6cbe34451ed4465) ) /* Labeled TK00.BIM (U54) */ - ROM_LOAD16_BYTE( "tk01.bim_u53.u53", 0x00001, 0x40000, CRC(e43e029c) SHA1(4bb069fffaa7482674f52eb4106409842f2c2a0e) ) /* Labeled TK01.BIM (U53) */ +ROM_START( timekill100 ) // Version 1.00? - actual version not shown (3-tier board set: P/N 1050 Rev 1, P/N 1049 Rev 1 & P/N 1052 Rev 2) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "tk00.bim_u54.u54", 0x00000, 0x40000, CRC(2b379f30) SHA1(7034cb0e6ba49ba9147fdb7ff6cbe34451ed4465) ) // Labeled TK00.BIM (U54) + ROM_LOAD16_BYTE( "tk01.bim_u53.u53", 0x00001, 0x40000, CRC(e43e029c) SHA1(4bb069fffaa7482674f52eb4106409842f2c2a0e) ) // Labeled TK01.BIM (U53) - ROM_REGION( 0x28000, "soundcpu", 0 ) /* At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 */ - ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) /* Labeled TIMEKILLSND (U17) */ + ROM_REGION( 0x28000, "soundcpu", 0 ) // At 0x18002 in ROM: ITS Ver 4.0 OTTO Sound Board 6255 I/O 6/3/92 + ROM_LOAD( "timekillsnd_u17.u17", 0x10000, 0x18000, CRC(ab1684c3) SHA1(cc7e591fd160b259f8aecddb2c5a3c36e4e37b2f) ) // Labeled TIMEKILLSND (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) /* ROM board P/N 1049 REV1 */ + ROM_REGION( 0x880000, "grom", 0 ) // ROM board P/N 1049 REV1 ROM_LOAD32_BYTE( "timekill_grom00.grom00", 0x000000, 0x080000, CRC(980aab02) SHA1(c5ce18748b1677d7b8fc599355d282d7fb9dda11) ) ROM_LOAD32_BYTE( "timekill_grom05.grom05", 0x000001, 0x080000, CRC(0b28ae65) SHA1(854091d312512eedb0f5acc7b31d7033dd138352) ) ROM_LOAD32_BYTE( "timekill_grom10.grom10", 0x000002, 0x080000, CRC(6092c59e) SHA1(70be57e2039786f9384f7d39daccfea3028afdd6) ) @@ -2158,28 +2131,28 @@ ROM_START( timekill100 ) /* Version 1.00? - actual version not shown (3-tier boa ROM_LOAD32_BYTE( "timekill_grom08.grom08", 0x600001, 0x080000, CRC(7d6f7ba9) SHA1(cc4a51a3e883345d3dee600913f3d6ba5b74951e) ) ROM_LOAD32_BYTE( "timekill_grom13.grom13", 0x600002, 0x080000, CRC(ecde039d) SHA1(83f5d979e3055ac09b5b652e40115338559f9a53) ) ROM_LOAD32_BYTE( "timekill_grom18.grom18", 0x600003, 0x080000, CRC(05cb6d82) SHA1(ddba15ceabcbcce86baf95d844e3ef5e1246d926) ) - ROM_LOAD32_BYTE( "timekill_grom04.grom04", 0x800000, 0x020000, CRC(b030c3d9) SHA1(f5c21285ec8ff4f74205e0cf18da67e733e31183) ) /* == timekill_grom01.grom1 */ - ROM_LOAD32_BYTE( "timekill_grom09.grom09", 0x800001, 0x020000, CRC(e98492a4) SHA1(fe8fb4bd3900109f3872f2930e8ddc9d19f599fd) ) /* == timekill_grom02.grom2 */ - ROM_LOAD32_BYTE( "timekill_grom14.grom14", 0x800002, 0x020000, CRC(6088fa64) SHA1(a3eee10bdef48fefec3836f551172dbe0819acf6) ) /* == timekill_grom03.grom3 */ - ROM_LOAD32_BYTE( "timekill_grom19.grom19", 0x800003, 0x020000, CRC(95be2318) SHA1(60580c87d63a114df44e2580e138128388ff447b) ) /* == timekill_grom04.grom4 */ - - ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) /* Sound board P/N 1052 REV 4 */ - ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) /* Labeled TKSROM00 (U18) */ - ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) /* Labeled TKSROM01 (U20) */ - ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) /* Labeled TKSROM02 (U26) */ + ROM_LOAD32_BYTE( "timekill_grom04.grom04", 0x800000, 0x020000, CRC(b030c3d9) SHA1(f5c21285ec8ff4f74205e0cf18da67e733e31183) ) // == timekill_grom01.grom1 + ROM_LOAD32_BYTE( "timekill_grom09.grom09", 0x800001, 0x020000, CRC(e98492a4) SHA1(fe8fb4bd3900109f3872f2930e8ddc9d19f599fd) ) // == timekill_grom02.grom2 + ROM_LOAD32_BYTE( "timekill_grom14.grom14", 0x800002, 0x020000, CRC(6088fa64) SHA1(a3eee10bdef48fefec3836f551172dbe0819acf6) ) // == timekill_grom03.grom3 + ROM_LOAD32_BYTE( "timekill_grom19.grom19", 0x800003, 0x020000, CRC(95be2318) SHA1(60580c87d63a114df44e2580e138128388ff447b) ) // == timekill_grom04.grom4 + + ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) // Sound board P/N 1052 REV 4 + ROM_LOAD16_BYTE( "tksrom00_u18.u18", 0x000000, 0x80000, CRC(79d8b83a) SHA1(78934b4d0ccca8fefcf8277e4296eb1d59cd575b) ) // Labeled TKSROM00 (U18) + ROM_LOAD16_BYTE( "tksrom01_u20.u20", 0x100000, 0x80000, CRC(ec01648c) SHA1(b83c66cf22db5d89b9ed79b79861b79429d8380c) ) // Labeled TKSROM01 (U20) + ROM_LOAD16_BYTE( "tksrom02_u26.u26", 0x200000, 0x80000, CRC(051ced3e) SHA1(6b63c4837e709806ffea9a37d93933635d356a6e) ) // Labeled TKSROM02 (U26) ROM_END ROM_START( bloodstm ) - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "bld00_v222.u83", 0x00000, 0x40000, CRC(95f36db6) SHA1(72ec5ca93aed8fb12d5e5b7ff3d07c5cf1dab4bb) ) /* Labeled BLD00 V2.22 (U83) */ - ROM_LOAD16_BYTE( "bld01_v222.u88", 0x00001, 0x40000, CRC(fcc04b93) SHA1(7029d68f20196b6c2c30339500c7da54f2b5b054) ) /* Labeled BLD01 V2.22 (U88) */ + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "bld00_v222.u83", 0x00000, 0x40000, CRC(95f36db6) SHA1(72ec5ca93aed8fb12d5e5b7ff3d07c5cf1dab4bb) ) // Labeled BLD00 V2.22 (U83) + ROM_LOAD16_BYTE( "bld01_v222.u88", 0x00001, 0x40000, CRC(fcc04b93) SHA1(7029d68f20196b6c2c30339500c7da54f2b5b054) ) // Labeled BLD01 V2.22 (U88) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) /* Labeled BLDSND V1.0 (U17) */ + ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) // Labeled BLDSND V1.0 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "bsgrom0.bin", 0x000000, 0x080000, CRC(4e10b8c1) SHA1(b80f7dbf32faa97829c735da6dc0ee424dc9ecec) ) ROM_LOAD32_BYTE( "bsgrom5.bin", 0x000001, 0x080000, CRC(6333b6ce) SHA1(53b884e09d198f8f53449bd011ba743c28b2c934) ) ROM_LOAD32_BYTE( "bsgrom10.bin", 0x000002, 0x080000, CRC(a972a65c) SHA1(7772c2e0aaa0b3183c6287125b95fd1cd0c3775a) ) @@ -2199,7 +2172,7 @@ ROM_START( bloodstm ) ROM_FILL( 0x800000, 0x080000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "bssrom0.bin", 0x000000, 0x80000, CRC(ee4570c8) SHA1(73dd292224bf182770b3cc2d90eb52b7d7b24378) ) @@ -2208,7 +2181,7 @@ ROM_START( bloodstm ) ROM_END ROM_START( bloodstm221 ) // this board had generic stickers - ROM_REGION16_BE( 0x80000, "user1", 0 ) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) ROM_LOAD16_BYTE( "bld00_v221.u83", 0x00000, 0x40000, CRC(01907aec) SHA1(a954366f2374c0836140e3b75a55ff47e4cfa645) ) ROM_LOAD16_BYTE( "bld01_v221.u88", 0x00001, 0x40000, CRC(eeae123e) SHA1(9fdd53d6651cac16402a9c3fe0ae15c9b1baa0db) ) @@ -2216,7 +2189,7 @@ ROM_START( bloodstm221 ) // this board had generic stickers ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "bsgrom0.bin", 0x000000, 0x080000, CRC(4e10b8c1) SHA1(b80f7dbf32faa97829c735da6dc0ee424dc9ecec) ) ROM_LOAD32_BYTE( "bsgrom5.bin", 0x000001, 0x080000, CRC(6333b6ce) SHA1(53b884e09d198f8f53449bd011ba743c28b2c934) ) ROM_LOAD32_BYTE( "bsgrom10.bin", 0x000002, 0x080000, CRC(a972a65c) SHA1(7772c2e0aaa0b3183c6287125b95fd1cd0c3775a) ) @@ -2245,15 +2218,15 @@ ROM_START( bloodstm221 ) // this board had generic stickers ROM_END ROM_START( bloodstm220 ) - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "bld00_v22.u83", 0x00000, 0x40000, CRC(904e9208) SHA1(12e96027724b905140250db969130d90b1afec83) ) /* Labeled BLD00 V2.2 (U83) */ - ROM_LOAD16_BYTE( "bld01_v22.u88", 0x00001, 0x40000, CRC(78336a7b) SHA1(76002ce4a2d83ceae10d9c9c123013832a081150) ) /* Labeled BLD01 V2.2 (U88) */ + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "bld00_v22.u83", 0x00000, 0x40000, CRC(904e9208) SHA1(12e96027724b905140250db969130d90b1afec83) ) // Labeled BLD00 V2.2 (U83) + ROM_LOAD16_BYTE( "bld01_v22.u88", 0x00001, 0x40000, CRC(78336a7b) SHA1(76002ce4a2d83ceae10d9c9c123013832a081150) ) // Labeled BLD01 V2.2 (U88) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) /* Labeled BLDSND V1.0 (U17) */ + ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) // Labeled BLDSND V1.0 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "bsgrom0.bin", 0x000000, 0x080000, CRC(4e10b8c1) SHA1(b80f7dbf32faa97829c735da6dc0ee424dc9ecec) ) ROM_LOAD32_BYTE( "bsgrom5.bin", 0x000001, 0x080000, CRC(6333b6ce) SHA1(53b884e09d198f8f53449bd011ba743c28b2c934) ) ROM_LOAD32_BYTE( "bsgrom10.bin", 0x000002, 0x080000, CRC(a972a65c) SHA1(7772c2e0aaa0b3183c6287125b95fd1cd0c3775a) ) @@ -2273,7 +2246,7 @@ ROM_START( bloodstm220 ) ROM_FILL( 0x800000, 0x080000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "bssrom0.bin", 0x000000, 0x80000, CRC(ee4570c8) SHA1(73dd292224bf182770b3cc2d90eb52b7d7b24378) ) @@ -2282,15 +2255,15 @@ ROM_START( bloodstm220 ) ROM_END ROM_START( bloodstm210 ) - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "bld00_v21.u83", 0x00000, 0x40000, CRC(71215c8e) SHA1(ee0f94c3a2619d7e3cc1ba5e1888a97b0c75a3ae) ) /* Labeled BLD00 V2.1 (U83) */ - ROM_LOAD16_BYTE( "bld01_v21.u88", 0x00001, 0x40000, CRC(da403da6) SHA1(0f09f38ae932acb4ddbb6323bce58be7284cb24b) ) /* Labeled BLD01 V2.1 (U88) */ + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "bld00_v21.u83", 0x00000, 0x40000, CRC(71215c8e) SHA1(ee0f94c3a2619d7e3cc1ba5e1888a97b0c75a3ae) ) // Labeled BLD00 V2.1 (U83) + ROM_LOAD16_BYTE( "bld01_v21.u88", 0x00001, 0x40000, CRC(da403da6) SHA1(0f09f38ae932acb4ddbb6323bce58be7284cb24b) ) // Labeled BLD01 V2.1 (U88) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) /* Labeled BLDSND V1.0 (U17) */ + ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) // Labeled BLDSND V1.0 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "bsgrom0.bin", 0x000000, 0x080000, CRC(4e10b8c1) SHA1(b80f7dbf32faa97829c735da6dc0ee424dc9ecec) ) ROM_LOAD32_BYTE( "bsgrom5.bin", 0x000001, 0x080000, CRC(6333b6ce) SHA1(53b884e09d198f8f53449bd011ba743c28b2c934) ) ROM_LOAD32_BYTE( "bsgrom10.bin", 0x000002, 0x080000, CRC(a972a65c) SHA1(7772c2e0aaa0b3183c6287125b95fd1cd0c3775a) ) @@ -2310,7 +2283,7 @@ ROM_START( bloodstm210 ) ROM_FILL( 0x800000, 0x080000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "bssrom0.bin", 0x000000, 0x80000, CRC(ee4570c8) SHA1(73dd292224bf182770b3cc2d90eb52b7d7b24378) ) @@ -2319,15 +2292,15 @@ ROM_START( bloodstm210 ) ROM_END ROM_START( bloodstm110 ) - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "bld00_v11.u83", 0x00000, 0x40000, CRC(4fff8f9b) SHA1(90f450497935322b0082a70e10abf758fc441dd0) ) /* Labeled BLD00 V1.1 (U83) */ - ROM_LOAD16_BYTE( "bld01_v11.u88", 0x00001, 0x40000, CRC(59ce23ea) SHA1(6aa02fff07f5ec6dff4f6db9ea7878a722079f81) ) /* Labeled BLD01 V1.1 (U88) */ + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "bld00_v11.u83", 0x00000, 0x40000, CRC(4fff8f9b) SHA1(90f450497935322b0082a70e10abf758fc441dd0) ) // Labeled BLD00 V1.1 (U83) + ROM_LOAD16_BYTE( "bld01_v11.u88", 0x00001, 0x40000, CRC(59ce23ea) SHA1(6aa02fff07f5ec6dff4f6db9ea7878a722079f81) ) // Labeled BLD01 V1.1 (U88) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) /* Labeled BLDSND V1.0 (U17) */ + ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) // Labeled BLDSND V1.0 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "bsgrom0.bin", 0x000000, 0x080000, CRC(4e10b8c1) SHA1(b80f7dbf32faa97829c735da6dc0ee424dc9ecec) ) ROM_LOAD32_BYTE( "bsgrom5.bin", 0x000001, 0x080000, CRC(6333b6ce) SHA1(53b884e09d198f8f53449bd011ba743c28b2c934) ) ROM_LOAD32_BYTE( "bsgrom10.bin", 0x000002, 0x080000, CRC(a972a65c) SHA1(7772c2e0aaa0b3183c6287125b95fd1cd0c3775a) ) @@ -2347,7 +2320,7 @@ ROM_START( bloodstm110 ) ROM_FILL( 0x800000, 0x080000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "bssrom0.bin", 0x000000, 0x80000, CRC(ee4570c8) SHA1(73dd292224bf182770b3cc2d90eb52b7d7b24378) ) @@ -2356,15 +2329,15 @@ ROM_START( bloodstm110 ) ROM_END ROM_START( bloodstm104 ) - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "bld00_v10.u83", 0x00000, 0x40000, CRC(a0982119) SHA1(7a55f662db062488714b42aedea56eea3b80aed5) ) /* Labeled BLD00 V1.0 (U83) */ - ROM_LOAD16_BYTE( "bld01_v10.u88", 0x00001, 0x40000, CRC(65800339) SHA1(379e57bd2c31180fa077b9a6e9fcffacde95280c) ) /* Labeled BLD01 V1.0 (U88) */ + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "bld00_v10.u83", 0x00000, 0x40000, CRC(a0982119) SHA1(7a55f662db062488714b42aedea56eea3b80aed5) ) // Labeled BLD00 V1.0 (U83) + ROM_LOAD16_BYTE( "bld01_v10.u88", 0x00001, 0x40000, CRC(65800339) SHA1(379e57bd2c31180fa077b9a6e9fcffacde95280c) ) // Labeled BLD01 V1.0 (U88) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) /* Labeled BLDSND V1.0 (U17) */ + ROM_LOAD( "bldsnd_v10.u17", 0x10000, 0x18000, CRC(dddeedbb) SHA1(f8ea786836630fc44bba968845fd2cb42cd81592) ) // Labeled BLDSND V1.0 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "bsgrom0.bin", 0x000000, 0x080000, CRC(4e10b8c1) SHA1(b80f7dbf32faa97829c735da6dc0ee424dc9ecec) ) ROM_LOAD32_BYTE( "bsgrom5.bin", 0x000001, 0x080000, CRC(6333b6ce) SHA1(53b884e09d198f8f53449bd011ba743c28b2c934) ) ROM_LOAD32_BYTE( "bsgrom10.bin", 0x000002, 0x080000, CRC(a972a65c) SHA1(7772c2e0aaa0b3183c6287125b95fd1cd0c3775a) ) @@ -2384,7 +2357,7 @@ ROM_START( bloodstm104 ) ROM_FILL( 0x800000, 0x080000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "bssrom0.bin", 0x000000, 0x80000, CRC(ee4570c8) SHA1(73dd292224bf182770b3cc2d90eb52b7d7b24378) ) @@ -2393,93 +2366,93 @@ ROM_START( bloodstm104 ) ROM_END -ROM_START( hardyard ) /* Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "fb00_v1.20_u83.u83", 0x00000, 0x40000, CRC(c7497692) SHA1(6c11535cf011e15dd7ffb5eba8e8da557c38277e) ) /* Labeled FB00 V1.20 (U83) */ - ROM_LOAD16_BYTE( "fb01_v1.20_u88.u88", 0x00001, 0x40000, CRC(3320c79a) SHA1(d1d32048c541782e60c525d9789fe12607a6df3a) ) /* Labeled FB01 V1.20 (U88) */ +ROM_START( hardyard ) // Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "fb00_v1.20_u83.u83", 0x00000, 0x40000, CRC(c7497692) SHA1(6c11535cf011e15dd7ffb5eba8e8da557c38277e) ) // Labeled FB00 V1.20 (U83) + ROM_LOAD16_BYTE( "fb01_v1.20_u88.u88", 0x00001, 0x40000, CRC(3320c79a) SHA1(d1d32048c541782e60c525d9789fe12607a6df3a) ) // Labeled FB01 V1.20 (U88) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "fb_snd_v1.1_u17.u17", 0x10000, 0x18000, CRC(d221b121) SHA1(06f351274a9dcb522f67f58499c9dc2ef5f06c07) ) /* Labeled FB SND V1.1 (U17) */ + ROM_LOAD( "fb_snd_v1.1_u17.u17", 0x10000, 0x18000, CRC(d221b121) SHA1(06f351274a9dcb522f67f58499c9dc2ef5f06c07) ) // Labeled FB SND V1.1 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "footbal_0.grom0.itfb0", 0x000000, 0x100000, CRC(0b7781af) SHA1(0e6b617a5d9a2d0d50a3839231177f2934177b87) ) /* mask ROM, socket silkscreened GROM0/ITFB0 */ - ROM_LOAD32_BYTE( "footbal_1.grom5.itfb1", 0x000001, 0x100000, CRC(178d0f9b) SHA1(2c13be9063742c24a4b8409fe1d16f6c989f20e0) ) /* mask ROM, socket silkscreened GROM5/ITFB1 */ - ROM_LOAD32_BYTE( "footbal_2.grom10.itfb2", 0x000002, 0x100000, CRC(0a17231e) SHA1(1499783ac32c3c6956d4084d623a432aecfd7769) ) /* mask ROM, socket silkscreened GROM10/ITFB2 */ - ROM_LOAD32_BYTE( "footbal_3.grom15.itfb3", 0x000003, 0x100000, CRC(104456af) SHA1(6b6adca80f663cdc8fcbdf58c033d32193e91b4b) ) /* mask ROM, socket silkscreened GROM15/ITFB3 */ - ROM_LOAD32_BYTE( "footbal_4.grom1.itfb4", 0x400000, 0x100000, CRC(2cb6f454) SHA1(e3af2809d43ddb4f17342a0b63848bf9a579b1eb) ) /* mask ROM, socket silkscreened GROM1/ITFB4 */ - ROM_LOAD32_BYTE( "footbal_5.grom6.itfb5", 0x400001, 0x100000, CRC(9b19b873) SHA1(4393dce2fd6e1f3c2b855759a985e1e068959e0a) ) /* mask ROM, socket silkscreened GROM6/ITFB5 */ - ROM_LOAD32_BYTE( "footbal_6.grom11.itfb6", 0x400002, 0x100000, CRC(58694394) SHA1(9b0742d136de9870f50a1f47347071a21283067b) ) /* mask ROM, socket silkscreened GROM11/ITFB6 */ - ROM_LOAD32_BYTE( "footbal_7.grom16.itfb7", 0x400003, 0x100000, CRC(9b7a2d1a) SHA1(e4aa8d5f76b26d16cabaf88dfa1bfba8052fe99d) ) /* mask ROM, socket silkscreened GROM16/ITFB7 */ - ROM_LOAD32_BYTE( "itfb-8.grom2.itfb8", 0x800000, 0x020000, CRC(a1656bf8) SHA1(4df05a1cdf5d636956d1c3d1f4f1988b254608d5) ) /* EPROM, socket silkscreened GROM2/ITFB8 */ - ROM_LOAD32_BYTE( "itfb-9.grom7.itfb9", 0x800001, 0x020000, CRC(2afa9e10) SHA1(d422447fd2fc2f9350af472eb1f1223383a1a259) ) /* EPROM, socket silkscreened GROM7/ITFB9 */ - ROM_LOAD32_BYTE( "itfb-10.grom12.itfb10", 0x800002, 0x020000, CRC(d5d15b38) SHA1(f414c19d8d88f916fbfa24fc3e16cea2e0acce08) ) /* EPROM, socket silkscreened GROM12/ITFB10 */ - ROM_LOAD32_BYTE( "itfb-11.grom17.itfb11", 0x800003, 0x020000, CRC(cd4f0df0) SHA1(632eb0cf27d7bf3df09d03f373a3195dd5a702b8) ) /* EPROM, socket silkscreened GROM17/ITFB11 */ + ROM_REGION( 0x880000, "grom", 0 ) + ROM_LOAD32_BYTE( "footbal_0.grom0.itfb0", 0x000000, 0x100000, CRC(0b7781af) SHA1(0e6b617a5d9a2d0d50a3839231177f2934177b87) ) // mask ROM, socket silkscreened GROM0/ITFB0 + ROM_LOAD32_BYTE( "footbal_1.grom5.itfb1", 0x000001, 0x100000, CRC(178d0f9b) SHA1(2c13be9063742c24a4b8409fe1d16f6c989f20e0) ) // mask ROM, socket silkscreened GROM5/ITFB1 + ROM_LOAD32_BYTE( "footbal_2.grom10.itfb2", 0x000002, 0x100000, CRC(0a17231e) SHA1(1499783ac32c3c6956d4084d623a432aecfd7769) ) // mask ROM, socket silkscreened GROM10/ITFB2 + ROM_LOAD32_BYTE( "footbal_3.grom15.itfb3", 0x000003, 0x100000, CRC(104456af) SHA1(6b6adca80f663cdc8fcbdf58c033d32193e91b4b) ) // mask ROM, socket silkscreened GROM15/ITFB3 + ROM_LOAD32_BYTE( "footbal_4.grom1.itfb4", 0x400000, 0x100000, CRC(2cb6f454) SHA1(e3af2809d43ddb4f17342a0b63848bf9a579b1eb) ) // mask ROM, socket silkscreened GROM1/ITFB4 + ROM_LOAD32_BYTE( "footbal_5.grom6.itfb5", 0x400001, 0x100000, CRC(9b19b873) SHA1(4393dce2fd6e1f3c2b855759a985e1e068959e0a) ) // mask ROM, socket silkscreened GROM6/ITFB5 + ROM_LOAD32_BYTE( "footbal_6.grom11.itfb6", 0x400002, 0x100000, CRC(58694394) SHA1(9b0742d136de9870f50a1f47347071a21283067b) ) // mask ROM, socket silkscreened GROM11/ITFB6 + ROM_LOAD32_BYTE( "footbal_7.grom16.itfb7", 0x400003, 0x100000, CRC(9b7a2d1a) SHA1(e4aa8d5f76b26d16cabaf88dfa1bfba8052fe99d) ) // mask ROM, socket silkscreened GROM16/ITFB7 + ROM_LOAD32_BYTE( "itfb-8.grom2.itfb8", 0x800000, 0x020000, CRC(a1656bf8) SHA1(4df05a1cdf5d636956d1c3d1f4f1988b254608d5) ) // EPROM, socket silkscreened GROM2/ITFB8 + ROM_LOAD32_BYTE( "itfb-9.grom7.itfb9", 0x800001, 0x020000, CRC(2afa9e10) SHA1(d422447fd2fc2f9350af472eb1f1223383a1a259) ) // EPROM, socket silkscreened GROM7/ITFB9 + ROM_LOAD32_BYTE( "itfb-10.grom12.itfb10", 0x800002, 0x020000, CRC(d5d15b38) SHA1(f414c19d8d88f916fbfa24fc3e16cea2e0acce08) ) // EPROM, socket silkscreened GROM12/ITFB10 + ROM_LOAD32_BYTE( "itfb-11.grom17.itfb11", 0x800003, 0x020000, CRC(cd4f0df0) SHA1(632eb0cf27d7bf3df09d03f373a3195dd5a702b8) ) // EPROM, socket silkscreened GROM17/ITFB11 ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "fb_srom00.srom0", 0x000000, 0x080000, CRC(b0a76ad2) SHA1(d1125cf96f6b9613840b8d22afa59748fb32ab90) ) ROM_LOAD16_BYTE( "fb_srom01.srom1", 0x100000, 0x080000, CRC(9fbf6a02) SHA1(90c86a94767a383895183a25b15084ed62891518) ) ROM_END -ROM_START( hardyard11 ) /* Version 1.1 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "fb00_v1.10_u83.u83", 0x00000, 0x40000, CRC(603f8a03) SHA1(b6c037c960dd09269b948533109ff379e091c62d) ) /* Labeled FB00 V1.10 (U83) */ - ROM_LOAD16_BYTE( "fb01_v1.10_u88.u88", 0x00001, 0x40000, CRC(7b11db88) SHA1(d45eb5dece4b86b833f0824ffc04ad406a15603d) ) /* Labeled FB01 V1.10 (U88) */ +ROM_START( hardyard11 ) // Version 1.1 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "fb00_v1.10_u83.u83", 0x00000, 0x40000, CRC(603f8a03) SHA1(b6c037c960dd09269b948533109ff379e091c62d) ) // Labeled FB00 V1.10 (U83) + ROM_LOAD16_BYTE( "fb01_v1.10_u88.u88", 0x00001, 0x40000, CRC(7b11db88) SHA1(d45eb5dece4b86b833f0824ffc04ad406a15603d) ) // Labeled FB01 V1.10 (U88) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "fb_snd_v1.1_u17.u17", 0x10000, 0x18000, CRC(d221b121) SHA1(06f351274a9dcb522f67f58499c9dc2ef5f06c07) ) /* Labeled FB SND V1.1 (U17) */ + ROM_LOAD( "fb_snd_v1.1_u17.u17", 0x10000, 0x18000, CRC(d221b121) SHA1(06f351274a9dcb522f67f58499c9dc2ef5f06c07) ) // Labeled FB SND V1.1 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "footbal_0.grom0.itfb0", 0x000000, 0x100000, CRC(0b7781af) SHA1(0e6b617a5d9a2d0d50a3839231177f2934177b87) ) /* mask ROM, socket silkscreened GROM0/ITFB0 */ - ROM_LOAD32_BYTE( "footbal_1.grom5.itfb1", 0x000001, 0x100000, CRC(178d0f9b) SHA1(2c13be9063742c24a4b8409fe1d16f6c989f20e0) ) /* mask ROM, socket silkscreened GROM5/ITFB1 */ - ROM_LOAD32_BYTE( "footbal_2.grom10.itfb2", 0x000002, 0x100000, CRC(0a17231e) SHA1(1499783ac32c3c6956d4084d623a432aecfd7769) ) /* mask ROM, socket silkscreened GROM10/ITFB2 */ - ROM_LOAD32_BYTE( "footbal_3.grom15.itfb3", 0x000003, 0x100000, CRC(104456af) SHA1(6b6adca80f663cdc8fcbdf58c033d32193e91b4b) ) /* mask ROM, socket silkscreened GROM15/ITFB3 */ - ROM_LOAD32_BYTE( "footbal_4.grom1.itfb4", 0x400000, 0x100000, CRC(2cb6f454) SHA1(e3af2809d43ddb4f17342a0b63848bf9a579b1eb) ) /* mask ROM, socket silkscreened GROM1/ITFB4 */ - ROM_LOAD32_BYTE( "footbal_5.grom6.itfb5", 0x400001, 0x100000, CRC(9b19b873) SHA1(4393dce2fd6e1f3c2b855759a985e1e068959e0a) ) /* mask ROM, socket silkscreened GROM6/ITFB5 */ - ROM_LOAD32_BYTE( "footbal_6.grom11.itfb6", 0x400002, 0x100000, CRC(58694394) SHA1(9b0742d136de9870f50a1f47347071a21283067b) ) /* mask ROM, socket silkscreened GROM11/ITFB6 */ - ROM_LOAD32_BYTE( "footbal_7.grom16.itfb7", 0x400003, 0x100000, CRC(9b7a2d1a) SHA1(e4aa8d5f76b26d16cabaf88dfa1bfba8052fe99d) ) /* mask ROM, socket silkscreened GROM16/ITFB7 */ - ROM_LOAD32_BYTE( "itfb-8.grom2.itfb8", 0x800000, 0x020000, CRC(a1656bf8) SHA1(4df05a1cdf5d636956d1c3d1f4f1988b254608d5) ) /* EPROM, socket silkscreened GROM2/ITFB8 */ - ROM_LOAD32_BYTE( "itfb-9.grom7.itfb9", 0x800001, 0x020000, CRC(2afa9e10) SHA1(d422447fd2fc2f9350af472eb1f1223383a1a259) ) /* EPROM, socket silkscreened GROM7/ITFB9 */ - ROM_LOAD32_BYTE( "itfb-10.grom12.itfb10", 0x800002, 0x020000, CRC(d5d15b38) SHA1(f414c19d8d88f916fbfa24fc3e16cea2e0acce08) ) /* EPROM, socket silkscreened GROM12/ITFB10 */ - ROM_LOAD32_BYTE( "itfb-11.grom17.itfb11", 0x800003, 0x020000, CRC(cd4f0df0) SHA1(632eb0cf27d7bf3df09d03f373a3195dd5a702b8) ) /* EPROM, socket silkscreened GROM17/ITFB11 */ + ROM_REGION( 0x880000, "grom", 0 ) + ROM_LOAD32_BYTE( "footbal_0.grom0.itfb0", 0x000000, 0x100000, CRC(0b7781af) SHA1(0e6b617a5d9a2d0d50a3839231177f2934177b87) ) // mask ROM, socket silkscreened GROM0/ITFB0 + ROM_LOAD32_BYTE( "footbal_1.grom5.itfb1", 0x000001, 0x100000, CRC(178d0f9b) SHA1(2c13be9063742c24a4b8409fe1d16f6c989f20e0) ) // mask ROM, socket silkscreened GROM5/ITFB1 + ROM_LOAD32_BYTE( "footbal_2.grom10.itfb2", 0x000002, 0x100000, CRC(0a17231e) SHA1(1499783ac32c3c6956d4084d623a432aecfd7769) ) // mask ROM, socket silkscreened GROM10/ITFB2 + ROM_LOAD32_BYTE( "footbal_3.grom15.itfb3", 0x000003, 0x100000, CRC(104456af) SHA1(6b6adca80f663cdc8fcbdf58c033d32193e91b4b) ) // mask ROM, socket silkscreened GROM15/ITFB3 + ROM_LOAD32_BYTE( "footbal_4.grom1.itfb4", 0x400000, 0x100000, CRC(2cb6f454) SHA1(e3af2809d43ddb4f17342a0b63848bf9a579b1eb) ) // mask ROM, socket silkscreened GROM1/ITFB4 + ROM_LOAD32_BYTE( "footbal_5.grom6.itfb5", 0x400001, 0x100000, CRC(9b19b873) SHA1(4393dce2fd6e1f3c2b855759a985e1e068959e0a) ) // mask ROM, socket silkscreened GROM6/ITFB5 + ROM_LOAD32_BYTE( "footbal_6.grom11.itfb6", 0x400002, 0x100000, CRC(58694394) SHA1(9b0742d136de9870f50a1f47347071a21283067b) ) // mask ROM, socket silkscreened GROM11/ITFB6 + ROM_LOAD32_BYTE( "footbal_7.grom16.itfb7", 0x400003, 0x100000, CRC(9b7a2d1a) SHA1(e4aa8d5f76b26d16cabaf88dfa1bfba8052fe99d) ) // mask ROM, socket silkscreened GROM16/ITFB7 + ROM_LOAD32_BYTE( "itfb-8.grom2.itfb8", 0x800000, 0x020000, CRC(a1656bf8) SHA1(4df05a1cdf5d636956d1c3d1f4f1988b254608d5) ) // EPROM, socket silkscreened GROM2/ITFB8 + ROM_LOAD32_BYTE( "itfb-9.grom7.itfb9", 0x800001, 0x020000, CRC(2afa9e10) SHA1(d422447fd2fc2f9350af472eb1f1223383a1a259) ) // EPROM, socket silkscreened GROM7/ITFB9 + ROM_LOAD32_BYTE( "itfb-10.grom12.itfb10", 0x800002, 0x020000, CRC(d5d15b38) SHA1(f414c19d8d88f916fbfa24fc3e16cea2e0acce08) ) // EPROM, socket silkscreened GROM12/ITFB10 + ROM_LOAD32_BYTE( "itfb-11.grom17.itfb11", 0x800003, 0x020000, CRC(cd4f0df0) SHA1(632eb0cf27d7bf3df09d03f373a3195dd5a702b8) ) // EPROM, socket silkscreened GROM17/ITFB11 ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "fb_srom00.srom0", 0x000000, 0x080000, CRC(b0a76ad2) SHA1(d1125cf96f6b9613840b8d22afa59748fb32ab90) ) ROM_LOAD16_BYTE( "fb_srom01.srom1", 0x100000, 0x080000, CRC(9fbf6a02) SHA1(90c86a94767a383895183a25b15084ed62891518) ) ROM_END -ROM_START( hardyard10 ) /* Version 1.0 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) +ROM_START( hardyard10 ) // Version 1.0 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) ROM_LOAD16_BYTE( "fb00_v1.0_u83.u83", 0x00000, 0x40000, CRC(f839393c) SHA1(ba06172bc4781f7738ce43019031715fee4b344c) ) ROM_LOAD16_BYTE( "fb01_v1.0_u88.u88", 0x00001, 0x40000, CRC(ca444702) SHA1(49bcc0994da9cd2c31c0cd78b822aceeaffd035f) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "fb_snd_v1.0_u17.u17", 0x10000, 0x18000, CRC(6c6db5b8) SHA1(925e7c7cc7c3d290f4a334f24eef574aaac3150c) ) /* Labeled FB SND V1.0 (U17) */ + ROM_LOAD( "fb_snd_v1.0_u17.u17", 0x10000, 0x18000, CRC(6c6db5b8) SHA1(925e7c7cc7c3d290f4a334f24eef574aaac3150c) ) // Labeled FB SND V1.0 (U17) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "footbal_0.grom0.itfb0", 0x000000, 0x100000, CRC(0b7781af) SHA1(0e6b617a5d9a2d0d50a3839231177f2934177b87) ) /* mask ROM, socket silkscreened GROM0/ITFB0 */ - ROM_LOAD32_BYTE( "footbal_1.grom5.itfb1", 0x000001, 0x100000, CRC(178d0f9b) SHA1(2c13be9063742c24a4b8409fe1d16f6c989f20e0) ) /* mask ROM, socket silkscreened GROM5/ITFB1 */ - ROM_LOAD32_BYTE( "footbal_2.grom10.itfb2", 0x000002, 0x100000, CRC(0a17231e) SHA1(1499783ac32c3c6956d4084d623a432aecfd7769) ) /* mask ROM, socket silkscreened GROM10/ITFB2 */ - ROM_LOAD32_BYTE( "footbal_3.grom15.itfb3", 0x000003, 0x100000, CRC(104456af) SHA1(6b6adca80f663cdc8fcbdf58c033d32193e91b4b) ) /* mask ROM, socket silkscreened GROM15/ITFB3 */ - ROM_LOAD32_BYTE( "footbal_4.grom1.itfb4", 0x400000, 0x100000, CRC(2cb6f454) SHA1(e3af2809d43ddb4f17342a0b63848bf9a579b1eb) ) /* mask ROM, socket silkscreened GROM1/ITFB4 */ - ROM_LOAD32_BYTE( "footbal_5.grom6.itfb5", 0x400001, 0x100000, CRC(9b19b873) SHA1(4393dce2fd6e1f3c2b855759a985e1e068959e0a) ) /* mask ROM, socket silkscreened GROM6/ITFB5 */ - ROM_LOAD32_BYTE( "footbal_6.grom11.itfb6", 0x400002, 0x100000, CRC(58694394) SHA1(9b0742d136de9870f50a1f47347071a21283067b) ) /* mask ROM, socket silkscreened GROM11/ITFB6 */ - ROM_LOAD32_BYTE( "footbal_7.grom16.itfb7", 0x400003, 0x100000, CRC(9b7a2d1a) SHA1(e4aa8d5f76b26d16cabaf88dfa1bfba8052fe99d) ) /* mask ROM, socket silkscreened GROM16/ITFB7 */ - ROM_LOAD32_BYTE( "itfb-8.grom2.itfb8", 0x800000, 0x020000, CRC(a1656bf8) SHA1(4df05a1cdf5d636956d1c3d1f4f1988b254608d5) ) /* EPROM, socket silkscreened GROM2/ITFB8 */ - ROM_LOAD32_BYTE( "itfb-9.grom7.itfb9", 0x800001, 0x020000, CRC(2afa9e10) SHA1(d422447fd2fc2f9350af472eb1f1223383a1a259) ) /* EPROM, socket silkscreened GROM7/ITFB9 */ - ROM_LOAD32_BYTE( "itfb-10.grom12.itfb10", 0x800002, 0x020000, CRC(d5d15b38) SHA1(f414c19d8d88f916fbfa24fc3e16cea2e0acce08) ) /* EPROM, socket silkscreened GROM12/ITFB10 */ - ROM_LOAD32_BYTE( "itfb-11.grom17.itfb11", 0x800003, 0x020000, CRC(cd4f0df0) SHA1(632eb0cf27d7bf3df09d03f373a3195dd5a702b8) ) /* EPROM, socket silkscreened GROM17/ITFB11 */ + ROM_REGION( 0x880000, "grom", 0 ) + ROM_LOAD32_BYTE( "footbal_0.grom0.itfb0", 0x000000, 0x100000, CRC(0b7781af) SHA1(0e6b617a5d9a2d0d50a3839231177f2934177b87) ) // mask ROM, socket silkscreened GROM0/ITFB0 + ROM_LOAD32_BYTE( "footbal_1.grom5.itfb1", 0x000001, 0x100000, CRC(178d0f9b) SHA1(2c13be9063742c24a4b8409fe1d16f6c989f20e0) ) // mask ROM, socket silkscreened GROM5/ITFB1 + ROM_LOAD32_BYTE( "footbal_2.grom10.itfb2", 0x000002, 0x100000, CRC(0a17231e) SHA1(1499783ac32c3c6956d4084d623a432aecfd7769) ) // mask ROM, socket silkscreened GROM10/ITFB2 + ROM_LOAD32_BYTE( "footbal_3.grom15.itfb3", 0x000003, 0x100000, CRC(104456af) SHA1(6b6adca80f663cdc8fcbdf58c033d32193e91b4b) ) // mask ROM, socket silkscreened GROM15/ITFB3 + ROM_LOAD32_BYTE( "footbal_4.grom1.itfb4", 0x400000, 0x100000, CRC(2cb6f454) SHA1(e3af2809d43ddb4f17342a0b63848bf9a579b1eb) ) // mask ROM, socket silkscreened GROM1/ITFB4 + ROM_LOAD32_BYTE( "footbal_5.grom6.itfb5", 0x400001, 0x100000, CRC(9b19b873) SHA1(4393dce2fd6e1f3c2b855759a985e1e068959e0a) ) // mask ROM, socket silkscreened GROM6/ITFB5 + ROM_LOAD32_BYTE( "footbal_6.grom11.itfb6", 0x400002, 0x100000, CRC(58694394) SHA1(9b0742d136de9870f50a1f47347071a21283067b) ) // mask ROM, socket silkscreened GROM11/ITFB6 + ROM_LOAD32_BYTE( "footbal_7.grom16.itfb7", 0x400003, 0x100000, CRC(9b7a2d1a) SHA1(e4aa8d5f76b26d16cabaf88dfa1bfba8052fe99d) ) // mask ROM, socket silkscreened GROM16/ITFB7 + ROM_LOAD32_BYTE( "itfb-8.grom2.itfb8", 0x800000, 0x020000, CRC(a1656bf8) SHA1(4df05a1cdf5d636956d1c3d1f4f1988b254608d5) ) // EPROM, socket silkscreened GROM2/ITFB8 + ROM_LOAD32_BYTE( "itfb-9.grom7.itfb9", 0x800001, 0x020000, CRC(2afa9e10) SHA1(d422447fd2fc2f9350af472eb1f1223383a1a259) ) // EPROM, socket silkscreened GROM7/ITFB9 + ROM_LOAD32_BYTE( "itfb-10.grom12.itfb10", 0x800002, 0x020000, CRC(d5d15b38) SHA1(f414c19d8d88f916fbfa24fc3e16cea2e0acce08) ) // EPROM, socket silkscreened GROM12/ITFB10 + ROM_LOAD32_BYTE( "itfb-11.grom17.itfb11", 0x800003, 0x020000, CRC(cd4f0df0) SHA1(632eb0cf27d7bf3df09d03f373a3195dd5a702b8) ) // EPROM, socket silkscreened GROM17/ITFB11 ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "fb_srom00.srom0", 0x000000, 0x080000, CRC(b0a76ad2) SHA1(d1125cf96f6b9613840b8d22afa59748fb32ab90) ) @@ -2487,8 +2460,8 @@ ROM_START( hardyard10 ) /* Version 1.0 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_END -ROM_START( pairs ) /* Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) +ROM_START( pairs ) // Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) ROM_LOAD16_BYTE( "pair0_u83_x_v1.2.u83", 0x00000, 0x20000, CRC(a9c761d8) SHA1(2618c9c3f336cf30f760fd88f12c09985cfd4ee7) ) ROM_LOAD16_BYTE( "pair1_u88_x_v1.2.u88", 0x00001, 0x20000, CRC(5141eb86) SHA1(3bb10d588e6334a33e5c2c468651699e84f46cdc) ) @@ -2496,7 +2469,7 @@ ROM_START( pairs ) /* Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1061 R ROM_LOAD( "pairsnd_u17_v1.u17", 0x10000, 0x18000, CRC(7a514cfd) SHA1(ef5bc74c9560d2c058298051070fa748e58f07e1) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "pairx_grom0_v1.grom0", 0x000000, 0x80000, CRC(baf1c2dd) SHA1(4de50001bce294ea5eea581cee9ca5a966701176) ) ROM_LOAD32_BYTE( "pairx_grom5_v1.grom5", 0x000001, 0x80000, CRC(30e993f3) SHA1(fe32aabacbe9d6d9419410faafe048c01988ac78) ) ROM_LOAD32_BYTE( "pairx_grom10_v1.grom10", 0x000002, 0x80000, CRC(3f52f50d) SHA1(abb7ec8fa1af0876dacfe04d76fbc8fc18a2b610) ) @@ -2507,14 +2480,14 @@ ROM_START( pairs ) /* Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1061 R ROM_LOAD32_BYTE( "pairx_grom16_v1.grom16", 0x200003, 0x40000, CRC(b2975259) SHA1(aa82f8e855f2ebf1d7178a46f2b515d7c9a26299) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "srom0.bin", 0x000000, 0x80000, CRC(19a857f9) SHA1(2515b4c127191d52d3b5a72477384847d8cabad3) ) /* Unknown label and / or revision */ + ROM_LOAD16_BYTE( "srom0.bin", 0x000000, 0x80000, CRC(19a857f9) SHA1(2515b4c127191d52d3b5a72477384847d8cabad3) ) // Unknown label and / or revision ROM_END -ROM_START( pairsa ) /* Version 1 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) +ROM_START( pairsa ) // Version 1 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) ROM_LOAD16_BYTE( "pair0_u83_x_v1.u83", 0x00000, 0x20000, CRC(774995a3) SHA1(93df91378b56802d14c105f7f48ed8a4f7bafffd) ) ROM_LOAD16_BYTE( "pair1_u83_x_v1.u88", 0x00001, 0x20000, CRC(85d0b73a) SHA1(48a6ac6de94be13e407da13e3e2440d858714b4b) ) @@ -2522,7 +2495,7 @@ ROM_START( pairsa ) /* Version 1 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev ROM_LOAD( "pairsnd_u17_v1.u17", 0x10000, 0x18000, CRC(7a514cfd) SHA1(ef5bc74c9560d2c058298051070fa748e58f07e1) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "pairx_grom0_v1.grom0", 0x000000, 0x80000, CRC(baf1c2dd) SHA1(4de50001bce294ea5eea581cee9ca5a966701176) ) ROM_LOAD32_BYTE( "pairx_grom5_v1.grom5", 0x000001, 0x80000, CRC(30e993f3) SHA1(fe32aabacbe9d6d9419410faafe048c01988ac78) ) ROM_LOAD32_BYTE( "pairx_grom10_v1.grom10", 0x000002, 0x80000, CRC(3f52f50d) SHA1(abb7ec8fa1af0876dacfe04d76fbc8fc18a2b610) ) @@ -2533,22 +2506,22 @@ ROM_START( pairsa ) /* Version 1 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev ROM_LOAD32_BYTE( "pairx_grom16_v1.grom16", 0x200003, 0x40000, CRC(b2975259) SHA1(aa82f8e855f2ebf1d7178a46f2b515d7c9a26299) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "srom0_pairs_v1.srom0", 0x000000, 0x80000, CRC(1d96c581) SHA1(3b7c84b7db3b098ec28c7058c16f97e9cf0e4733) ) ROM_END -ROM_START( hotmemry ) /* Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "hotmem0_u83_v1.2.u83", 0x00000, 0x40000, CRC(5b9d87a2) SHA1(5a1ca7b622832fcb641e081d0c2a49c38ca795cd) ) /* Labeled HOTMEM0 U83 V1.2 */ - ROM_LOAD16_BYTE( "hotmem1_u88_v1.2.u88", 0x00001, 0x40000, CRC(aeea087c) SHA1(3a8bdc04bc4051691823d0c5a1a3429475692100) ) /* Labeled HOTMEM1 U88 V1.2 */ +ROM_START( hotmemry ) // Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "hotmem0_u83_v1.2.u83", 0x00000, 0x40000, CRC(5b9d87a2) SHA1(5a1ca7b622832fcb641e081d0c2a49c38ca795cd) ) // Labeled HOTMEM0 U83 V1.2 + ROM_LOAD16_BYTE( "hotmem1_u88_v1.2.u88", 0x00001, 0x40000, CRC(aeea087c) SHA1(3a8bdc04bc4051691823d0c5a1a3429475692100) ) // Labeled HOTMEM1 U88 V1.2 ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "hotmemsnd_u17_v1.u17", 0x10000, 0x18000, CRC(805941c7) SHA1(4a6832d93ff2b986cb54052658af62584782cb59) ) /* Labeled HOTMEMSND U17 V1 */ + ROM_LOAD( "hotmemsnd_u17_v1.u17", 0x10000, 0x18000, CRC(805941c7) SHA1(4a6832d93ff2b986cb54052658af62584782cb59) ) // Labeled HOTMEMSND U17 V1 ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "hotmem_grom0_v1.grom0", 0x000000, 0x80000, CRC(68f279ef) SHA1(66098e68474e692676662b03835d1b74f581b0f4) ) ROM_LOAD32_BYTE( "hotmem_grom5_v1.grom5", 0x000001, 0x80000, CRC(295bb43d) SHA1(ccecdbc9dc9ef925fe59a53eeff89135d2ae748d) ) ROM_LOAD32_BYTE( "hotmem_grom10_v1.grom10", 0x000002, 0x80000, CRC(f8cc939b) SHA1(cbd35346f057f1e615705acb2595ba550f6d8772) ) @@ -2559,22 +2532,22 @@ ROM_START( hotmemry ) /* Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_LOAD32_BYTE( "hotmem_grom16_v1.grom16", 0x200003, 0x40000, CRC(4507a895) SHA1(3d6cd6cd81b62545f7be5991f67803cf11c96ee6) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "srom0_hotmem_v1.srom0", 0x000000, 0x80000, CRC(c1103224) SHA1(52cf341ff9092ecb8cb94f66a96ee0c726bf1412) ) ROM_END -ROM_START( hotmemry11 ) /* Version 1.1 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", ROMREGION_ERASEFF ) - ROM_LOAD16_BYTE( "hotmem0_u83_v1.1.u83", 0x00000, 0x20000, CRC(8d614b1b) SHA1(46567b83c595f166573ce6cf93456dbd10ab5b80) ) /* Labeled HOTMEM0 U83 V1.1 */ - ROM_LOAD16_BYTE( "hotmem1_u88_v1.1.u88", 0x00001, 0x20000, CRC(009639fb) SHA1(8f559a838a12a4e3d39acbea87a9816a66a3f8f8) ) /* Labeled HOTMEM1 U88 V1.1 */ +ROM_START( hotmemry11 ) // Version 1.1 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", ROMREGION_ERASEFF ) + ROM_LOAD16_BYTE( "hotmem0_u83_v1.1.u83", 0x00000, 0x20000, CRC(8d614b1b) SHA1(46567b83c595f166573ce6cf93456dbd10ab5b80) ) // Labeled HOTMEM0 U83 V1.1 + ROM_LOAD16_BYTE( "hotmem1_u88_v1.1.u88", 0x00001, 0x20000, CRC(009639fb) SHA1(8f559a838a12a4e3d39acbea87a9816a66a3f8f8) ) // Labeled HOTMEM1 U88 V1.1 ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "hotmemsnd_u17_v1.u17", 0x10000, 0x18000, CRC(805941c7) SHA1(4a6832d93ff2b986cb54052658af62584782cb59) ) /* Labeled HOTMEMSND U17 V1 */ + ROM_LOAD( "hotmemsnd_u17_v1.u17", 0x10000, 0x18000, CRC(805941c7) SHA1(4a6832d93ff2b986cb54052658af62584782cb59) ) // Labeled HOTMEMSND U17 V1 ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "hotmem_grom0_v1.grom0", 0x000000, 0x80000, CRC(68f279ef) SHA1(66098e68474e692676662b03835d1b74f581b0f4) ) ROM_LOAD32_BYTE( "hotmem_grom5_v1.grom5", 0x000001, 0x80000, CRC(295bb43d) SHA1(ccecdbc9dc9ef925fe59a53eeff89135d2ae748d) ) ROM_LOAD32_BYTE( "hotmem_grom10_v1.grom10", 0x000002, 0x80000, CRC(f8cc939b) SHA1(cbd35346f057f1e615705acb2595ba550f6d8772) ) @@ -2585,51 +2558,51 @@ ROM_START( hotmemry11 ) /* Version 1.1 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_LOAD32_BYTE( "hotmem_grom16_v1.grom16", 0x200003, 0x40000, CRC(4507a895) SHA1(3d6cd6cd81b62545f7be5991f67803cf11c96ee6) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "srom0_hotmem_v1.srom0", 0x000000, 0x80000, CRC(c1103224) SHA1(52cf341ff9092ecb8cb94f66a96ee0c726bf1412) ) ROM_END -ROM_START( pairsred ) /* Version RED V1.0 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "pair0_u83_redv1.u83", 0x00000, 0x20000, CRC(cf27b93c) SHA1(4db1d5a756e237d49ace8b5c45d3c4d721a996d5) ) /* Labeled PAIR0 U83 RED V1 */ - ROM_LOAD16_BYTE( "pair1_u88_redv1.u88", 0x00001, 0x20000, CRC(7ad48e7e) SHA1(ee4c543fbbeb26bcad45a06cda43572f081acb84) ) /* Labeled PAIR1 U88 RED V1 */ +ROM_START( pairsred ) // Version RED V1.0 (3-tier board set: P/N 1059 Rev 3, P/N 1061 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "pair0_u83_redv1.u83", 0x00000, 0x20000, CRC(cf27b93c) SHA1(4db1d5a756e237d49ace8b5c45d3c4d721a996d5) ) // Labeled PAIR0 U83 RED V1 + ROM_LOAD16_BYTE( "pair1_u88_redv1.u88", 0x00001, 0x20000, CRC(7ad48e7e) SHA1(ee4c543fbbeb26bcad45a06cda43572f081acb84) ) // Labeled PAIR1 U88 RED V1 ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "pairsnd_u17_redv1.u17", 0x10000, 0x18000, CRC(198e1743) SHA1(16bd21b2d3cabbd51e4d84f7cf007ae6cd4cf624) ) /* Labeled PAIRSND U17 REDV1 */ + ROM_LOAD( "pairsnd_u17_redv1.u17", 0x10000, 0x18000, CRC(198e1743) SHA1(16bd21b2d3cabbd51e4d84f7cf007ae6cd4cf624) ) // Labeled PAIRSND U17 REDV1 ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "pair-red_grom0", 0x000000, 0x40000, CRC(1bbcc6c6) SHA1(c31dc5b0bc83455e0ad60fcfa42dba49b91ed1b0) ) /* Labeled PAIR-RED GROM0 V1 */ - ROM_LOAD32_BYTE( "pair-red_grom5", 0x000001, 0x40000, CRC(eff93bde) SHA1(3b1234146677ca4dd16962411a2607d0eb933c01) ) /* Labeled PAIR-RED GROM5 V1 */ - ROM_LOAD32_BYTE( "pair-red_grom10", 0x000002, 0x40000, CRC(016f4d19) SHA1(32886b3ecfbebb835d0c311b3135521af3120a77) ) /* Labeled PAIR-RED GROM10 V1 */ - ROM_LOAD32_BYTE( "pair-red_grom15", 0x000003, 0x40000, CRC(dc95160d) SHA1(218d6c460780aadc0f371b8c1ae2d5fe6b1818c0) ) /* Labeled PAIR-RED GROM15 V1 */ + ROM_REGION( 0x880000, "grom", 0 ) + ROM_LOAD32_BYTE( "pair-red_grom0", 0x000000, 0x40000, CRC(1bbcc6c6) SHA1(c31dc5b0bc83455e0ad60fcfa42dba49b91ed1b0) ) // Labeled PAIR-RED GROM0 V1 + ROM_LOAD32_BYTE( "pair-red_grom5", 0x000001, 0x40000, CRC(eff93bde) SHA1(3b1234146677ca4dd16962411a2607d0eb933c01) ) // Labeled PAIR-RED GROM5 V1 + ROM_LOAD32_BYTE( "pair-red_grom10", 0x000002, 0x40000, CRC(016f4d19) SHA1(32886b3ecfbebb835d0c311b3135521af3120a77) ) // Labeled PAIR-RED GROM10 V1 + ROM_LOAD32_BYTE( "pair-red_grom15", 0x000003, 0x40000, CRC(dc95160d) SHA1(218d6c460780aadc0f371b8c1ae2d5fe6b1818c0) ) // Labeled PAIR-RED GROM15 V1 ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "srom0_pairs_redv1", 0x000000, 0x80000, CRC(a998e29f) SHA1(fb0556d0e1a6621256e83fb6b0d0ed9885dff1b0) ) /* Labeled SROM0 PAIRS REDV1 */ + ROM_LOAD16_BYTE( "srom0_pairs_redv1", 0x000000, 0x80000, CRC(a998e29f) SHA1(fb0556d0e1a6621256e83fb6b0d0ed9885dff1b0) ) // Labeled SROM0 PAIRS REDV1 ROM_END -ROM_START( wcbowl ) /* Version 1.66 (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "wcb_prom0_v1.66n.prom0", 0x00000, 0x20000, CRC(f6774112) SHA1(cb09bb3e40490b3cdc3a5f7d18168384b5b29d85) ) /* original labels also found without the "N" */ +ROM_START( wcbowl ) // Version 1.66 (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "wcb_prom0_v1.66n.prom0", 0x00000, 0x20000, CRC(f6774112) SHA1(cb09bb3e40490b3cdc3a5f7d18168384b5b29d85) ) // original labels also found without the "N" ROM_LOAD32_BYTE( "wcb_prom1_v1.66n.prom1", 0x00001, 0x20000, CRC(931821ae) SHA1(328cd78ba70fe3cb0bdbc53833fe6fb153aceaea) ) ROM_LOAD32_BYTE( "wcb_prom2_v1.66n.prom2", 0x00002, 0x20000, CRC(c54f5e40) SHA1(2cd92ba1db74b24e908d10f733757801db180dd0) ) ROM_LOAD32_BYTE( "wcb_prom3_v1.66n.prom3", 0x00003, 0x20000, CRC(dd72c796) SHA1(4c1542c51848a88a663e56ae0b47bf9d2d9f7d54) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) /* actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 */ + ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) // actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 ROM_CONTINUE( 0x08000, 0x08000 ) ROM_REGION( 0x2000, "pic", 0 ) // PIC16C54 ROM_LOAD( "itbwl-3 1997 it,inc.1996", 0x0000, 0x1fff, CRC(1461cbe0) SHA1(97cc1f985d9c8bbe3fd829681883b6c4ae15c5bd) ) // not hooked up - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "wcb_grom0_0_s.grm0_0", 0x000000, 0x080000, CRC(6fcb4246) SHA1(91fb5d18ea9494b08251d1e611c80414df3aad66) ) ROM_LOAD32_BYTE( "wcb_grom0_1_s.grm0_1", 0x000001, 0x080000, CRC(2ae31f45) SHA1(85218aa9a7ca7c6870427ffbd08b78255813ff90) ) ROM_LOAD32_BYTE( "wcb_grom0_2_s.grm0_2", 0x000002, 0x080000, CRC(bccc0f35) SHA1(2389662e881e86f8cdb36eb2a082923d976676c8) ) @@ -2641,29 +2614,29 @@ ROM_START( wcbowl ) /* Version 1.66 (PCB P/N 1083 Rev 2) */ ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) /* Newer sound sample ROMs */ + ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) // Newer sound sample ROMs ROM_REGION16_BE( 0x400000, "ensoniq.1", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) /* Newer sound sample ROMs, ROM is a 27C020 in this set */ + ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) // Newer sound sample ROMs, ROM is a 27C020 in this set ROM_END -ROM_START( wcbowl165 ) /* Version 1.65 (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "wcb_prom0_v1.65n.prom0", 0x00000, 0x20000, CRC(cf0f6c25) SHA1(90685288994dce73d5b1070a55fca3f1713c5bb6) ) /* original labels also found without the "N" */ +ROM_START( wcbowl165 ) // Version 1.65 (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "wcb_prom0_v1.65n.prom0", 0x00000, 0x20000, CRC(cf0f6c25) SHA1(90685288994dce73d5b1070a55fca3f1713c5bb6) ) // original labels also found without the "N" ROM_LOAD32_BYTE( "wcb_prom1_v1.65n.prom1", 0x00001, 0x20000, CRC(076ab158) SHA1(e6d8a6726e27ba6916d4711dff88f26f1dc162e1) ) ROM_LOAD32_BYTE( "wcb_prom2_v1.65n.prom2", 0x00002, 0x20000, CRC(47259009) SHA1(78a6e70e747030a5ed43d49384061e53f4a77675) ) ROM_LOAD32_BYTE( "wcb_prom3_v1.65n.prom3", 0x00003, 0x20000, CRC(4c6b4e4f) SHA1(77f5f4b632dd1919ae210bbdc75042bdbebf6660) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) /* actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 */ + ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) // actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 ROM_CONTINUE( 0x08000, 0x08000 ) ROM_REGION( 0x2000, "pic", 0 ) // PIC16C54 ROM_LOAD( "itbwl-3 1997 it,inc.1996", 0x0000, 0x1fff, CRC(1461cbe0) SHA1(97cc1f985d9c8bbe3fd829681883b6c4ae15c5bd) ) // not hooked up - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "wcb_grom0_0_s.grm0_0", 0x000000, 0x080000, CRC(6fcb4246) SHA1(91fb5d18ea9494b08251d1e611c80414df3aad66) ) ROM_LOAD32_BYTE( "wcb_grom0_1_s.grm0_1", 0x000001, 0x080000, CRC(2ae31f45) SHA1(85218aa9a7ca7c6870427ffbd08b78255813ff90) ) ROM_LOAD32_BYTE( "wcb_grom0_2_s.grm0_2", 0x000002, 0x080000, CRC(bccc0f35) SHA1(2389662e881e86f8cdb36eb2a082923d976676c8) ) @@ -2675,29 +2648,29 @@ ROM_START( wcbowl165 ) /* Version 1.65 (PCB P/N 1083 Rev 2) */ ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) /* Newer sound sample ROMs */ + ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) // Newer sound sample ROMs ROM_REGION16_BE( 0x400000, "ensoniq.1", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) /* Newer sound sample roms, ROM is a 27C020 in this set */ + ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) // Newer sound sample roms, ROM is a 27C020 in this set ROM_END -ROM_START( wcbowl161 ) /* Version 1.61 (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( wcbowl161 ) // Version 1.61 (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "wcb_prom0_v1.61n.prom0", 0x00000, 0x20000, CRC(b879d4a7) SHA1(8b5af3f4d3522bdb8e1d6092b2e311fbfaec2bd0) ) ROM_LOAD32_BYTE( "wcb_prom1_v1.61n.prom1", 0x00001, 0x20000, CRC(49f3ed6a) SHA1(6c6857bd3fbfe0cfeaf0e512bbbd795376a21472) ) ROM_LOAD32_BYTE( "wcb_prom2_v1.61n.prom2", 0x00002, 0x20000, CRC(47259009) SHA1(78a6e70e747030a5ed43d49384061e53f4a77675) ) ROM_LOAD32_BYTE( "wcb_prom3_v1.61n.prom3", 0x00003, 0x20000, CRC(e5081f85) SHA1(a5513b8dd917a35f1c8b7f833c2d5622353d39f0) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcbsnd_u88_v4.0.u88", 0x10000, 0x18000, CRC(194a51d7) SHA1(c67b042008ff2a2713562d3789e5bc3a312fae17) ) /* Version 4.0, may be labeled "WCBSND U88 V4.0T" */ + ROM_LOAD( "wcbsnd_u88_v4.0.u88", 0x10000, 0x18000, CRC(194a51d7) SHA1(c67b042008ff2a2713562d3789e5bc3a312fae17) ) // Version 4.0, may be labeled "WCBSND U88 V4.0T" ROM_CONTINUE( 0x08000, 0x08000 ) ROM_REGION( 0x2000, "pic", 0 ) // PIC16C54 ROM_LOAD( "itbwl-3 1997 it,inc.1996", 0x0000, 0x1fff, CRC(1461cbe0) SHA1(97cc1f985d9c8bbe3fd829681883b6c4ae15c5bd) ) // not hooked up - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "wcb_grom0_0_s.grm0_0", 0x000000, 0x080000, CRC(6fcb4246) SHA1(91fb5d18ea9494b08251d1e611c80414df3aad66) ) ROM_LOAD32_BYTE( "wcb_grom0_1_s.grm0_1", 0x000001, 0x080000, CRC(2ae31f45) SHA1(85218aa9a7ca7c6870427ffbd08b78255813ff90) ) ROM_LOAD32_BYTE( "wcb_grom0_2_s.grm0_2", 0x000002, 0x080000, CRC(bccc0f35) SHA1(2389662e881e86f8cdb36eb2a082923d976676c8) ) @@ -2709,29 +2682,29 @@ ROM_START( wcbowl161 ) /* Version 1.61 (PCB P/N 1083 Rev 2) */ ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom0.srom0", 0x000000, 0x080000, CRC(c3821cb5) SHA1(3c2c27d1e577201cbd0d28cc48fc80ae7747faa1) ) /* Older sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom1.srom1", 0x200000, 0x080000, CRC(37bfa3c7) SHA1(98c98296acaa55e6fd12a62305ff387c863fc5ed) ) /* Older sound sample ROMs */ + ROM_LOAD16_BYTE( "wcb_srom0.srom0", 0x000000, 0x080000, CRC(c3821cb5) SHA1(3c2c27d1e577201cbd0d28cc48fc80ae7747faa1) ) // Older sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom1.srom1", 0x200000, 0x080000, CRC(37bfa3c7) SHA1(98c98296acaa55e6fd12a62305ff387c863fc5ed) ) // Older sound sample ROMs ROM_REGION16_BE( 0x400000, "ensoniq.1", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom2.srom2", 0x000000, 0x080000, CRC(f82c08fd) SHA1(8f6f47f5a4b68a31df4c2eb330dc95a9963e55c1) ) /* Older sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom3.srom3", 0x200000, 0x020000, CRC(1c2efdee) SHA1(d306c9e7f9c4c2662561401170439a10a9ee89ed) ) /* Older sound sample ROMs, ROM is a 27C010 in this set */ + ROM_LOAD16_BYTE( "wcb_srom2.srom2", 0x000000, 0x080000, CRC(f82c08fd) SHA1(8f6f47f5a4b68a31df4c2eb330dc95a9963e55c1) ) // Older sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom3.srom3", 0x200000, 0x020000, CRC(1c2efdee) SHA1(d306c9e7f9c4c2662561401170439a10a9ee89ed) ) // Older sound sample ROMs, ROM is a 27C010 in this set ROM_END -ROM_START( wcbowl16 ) /* Version 1.6 (PCB P/N 1083 Rev 2), This is the first set to move to the single board platform */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( wcbowl16 ) // Version 1.6 (PCB P/N 1083 Rev 2), This is the first set to move to the single board platform + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "wcb_prom0_v1.6n.prom0", 0x00000, 0x20000, CRC(332c558f) SHA1(179b763e2189c11cf6751eb6c419fe4417b288a8) ) ROM_LOAD32_BYTE( "wcb_prom1_v1.6n.prom1", 0x00001, 0x20000, CRC(c5750857) SHA1(8121b56d304ab405b06d4aa4c7d2db2f912f0bf2) ) ROM_LOAD32_BYTE( "wcb_prom2_v1.6n.prom2", 0x00002, 0x20000, CRC(28f4ee8a) SHA1(a6a2b9cca622df0b9d181c35f4d01e8ab00392a0) ) ROM_LOAD32_BYTE( "wcb_prom3_v1.6n.prom3", 0x00003, 0x20000, CRC(f0a58979) SHA1(c837b2a5b0e5ae993f1e453b59e3fbd9ed5de2a7) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcbsnd_u88_v3.0n.u88", 0x10000, 0x18000, CRC(45c4f659) SHA1(cfd140b9947654f677409a0fb4fa0c7b65992f95) ) /* Version 3.0N */ + ROM_LOAD( "wcbsnd_u88_v3.0n.u88", 0x10000, 0x18000, CRC(45c4f659) SHA1(cfd140b9947654f677409a0fb4fa0c7b65992f95) ) // Version 3.0N ROM_CONTINUE( 0x08000, 0x08000 ) ROM_REGION( 0x2000, "pic", 0 ) // PIC16C54 ROM_LOAD( "itbwl-3 1997 it,inc.1996", 0x0000, 0x1fff, CRC(1461cbe0) SHA1(97cc1f985d9c8bbe3fd829681883b6c4ae15c5bd) ) // not hooked up - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "wcb_grom0_0_s.grm0_0", 0x000000, 0x080000, CRC(6fcb4246) SHA1(91fb5d18ea9494b08251d1e611c80414df3aad66) ) ROM_LOAD32_BYTE( "wcb_grom0_1_s.grm0_1", 0x000001, 0x080000, CRC(2ae31f45) SHA1(85218aa9a7ca7c6870427ffbd08b78255813ff90) ) ROM_LOAD32_BYTE( "wcb_grom0_2_s.grm0_2", 0x000002, 0x080000, CRC(bccc0f35) SHA1(2389662e881e86f8cdb36eb2a082923d976676c8) ) @@ -2743,31 +2716,31 @@ ROM_START( wcbowl16 ) /* Version 1.6 (PCB P/N 1083 Rev 2), This is the first s ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom0.srom0", 0x000000, 0x080000, CRC(c3821cb5) SHA1(3c2c27d1e577201cbd0d28cc48fc80ae7747faa1) ) /* Older sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom1.srom1", 0x200000, 0x080000, CRC(37bfa3c7) SHA1(98c98296acaa55e6fd12a62305ff387c863fc5ed) ) /* Older sound sample ROMs */ + ROM_LOAD16_BYTE( "wcb_srom0.srom0", 0x000000, 0x080000, CRC(c3821cb5) SHA1(3c2c27d1e577201cbd0d28cc48fc80ae7747faa1) ) // Older sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom1.srom1", 0x200000, 0x080000, CRC(37bfa3c7) SHA1(98c98296acaa55e6fd12a62305ff387c863fc5ed) ) // Older sound sample ROMs ROM_REGION16_BE( 0x400000, "ensoniq.1", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom2.srom2", 0x000000, 0x080000, CRC(f82c08fd) SHA1(8f6f47f5a4b68a31df4c2eb330dc95a9963e55c1) ) /* Older sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom3.srom3", 0x200000, 0x020000, CRC(1c2efdee) SHA1(d306c9e7f9c4c2662561401170439a10a9ee89ed) ) /* Older sound sample ROMs, ROM is a 27C010 in this set */ + ROM_LOAD16_BYTE( "wcb_srom2.srom2", 0x000000, 0x080000, CRC(f82c08fd) SHA1(8f6f47f5a4b68a31df4c2eb330dc95a9963e55c1) ) // Older sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom3.srom3", 0x200000, 0x020000, CRC(1c2efdee) SHA1(d306c9e7f9c4c2662561401170439a10a9ee89ed) ) // Older sound sample ROMs, ROM is a 27C010 in this set ROM_END -ROM_START( wcbowl15 ) /* Version 1.5 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "wcb_v1.5_u83.u83", 0x00000, 0x20000, CRC(3ca9ab85) SHA1(364946dceb3f7279b7d67d9d685a98ba7f4901aa) ) /* Labeled as "WCB V1.5 (U83)" */ - ROM_LOAD16_BYTE( "wcb_v1.5_u88.u88", 0x00001, 0x20000, CRC(d43e6fad) SHA1(fd72f6945e7f5ef86dc28503749d18086dd29906) ) /* Labeled as "WCB V1.5 (U88)" */ +ROM_START( wcbowl15 ) // Version 1.5 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "wcb_v1.5_u83.u83", 0x00000, 0x20000, CRC(3ca9ab85) SHA1(364946dceb3f7279b7d67d9d685a98ba7f4901aa) ) // Labeled as "WCB V1.5 (U83)" + ROM_LOAD16_BYTE( "wcb_v1.5_u88.u88", 0x00001, 0x20000, CRC(d43e6fad) SHA1(fd72f6945e7f5ef86dc28503749d18086dd29906) ) // Labeled as "WCB V1.5 (U88)" ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) /* Labeled as "WCB SND V2.0" */ + ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) // Labeled as "WCB SND V2.0" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg ROMs: ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) ) ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) ) ROM_LOAD32_BYTE( "wcb_grom0_3_+.grm0_3", 0x000003, 0x100000, CRC(0348a7f0) SHA1(462f77514c0e9a28da63732a4f31e9483d4c483e) ) */ - ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) /* May also be labeled as "WCB GRM0_0" ect */ + ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) // May also be labeled as "WCB GRM0_0" ect ROM_LOAD32_BYTE( "wcb_grom0_1.grm0_1", 0x000001, 0x080000, CRC(e26dcedb) SHA1(15441b97dd3d50d28007062fe28841fa3f762ec9) ) ROM_LOAD32_BYTE( "wcb_grom0_2.grm0_2", 0x000002, 0x080000, CRC(32735875) SHA1(4017a8577d8efa8c5b95bd30723ebbf6ecaeba2b) ) ROM_LOAD32_BYTE( "wcb_grom0_3.grm0_3", 0x000003, 0x080000, CRC(019d0ab8) SHA1(3281eada296ad746da80ef6e5909c50b03b90d08) ) @@ -2778,30 +2751,30 @@ ROM_START( wcbowl15 ) /* Version 1.5 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) /* Ensoniq 2MX16U 1350901801 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) // Ensoniq 2MX16U 1350901801 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "wcb__srom0.srom0", 0x000000, 0x080000, CRC(115bcd1f) SHA1(c321bf3145c11de1351c8f9cd554ab3d6600e854) ) ROM_LOAD16_BYTE( "wcb__srom1.srom1", 0x100000, 0x080000, CRC(87a4a4d8) SHA1(60db2f466686481857eb39b90ac7a19d0a96adac) ) ROM_END -ROM_START( wcbowl14 ) /* Version 1.4 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "wcb_v1.4_u83.u83", 0x00000, 0x20000, CRC(7086131f) SHA1(86fe6f725785a5b1a0fc13ca60823f30713253bc) ) /* Labeled as "WCB V1.4 (U83)" */ - ROM_LOAD16_BYTE( "wcb_v1.4_u88.u88", 0x00001, 0x20000, CRC(0225aac1) SHA1(dd37ff8405e98c61acd042d23be93de24af37884) ) /* Labeled as "WCB V1.4 (U88)" */ +ROM_START( wcbowl14 ) // Version 1.4 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "wcb_v1.4_u83.u83", 0x00000, 0x20000, CRC(7086131f) SHA1(86fe6f725785a5b1a0fc13ca60823f30713253bc) ) // Labeled as "WCB V1.4 (U83)" + ROM_LOAD16_BYTE( "wcb_v1.4_u88.u88", 0x00001, 0x20000, CRC(0225aac1) SHA1(dd37ff8405e98c61acd042d23be93de24af37884) ) // Labeled as "WCB V1.4 (U88)" ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) /* Labeled as "WCB SND V2.0" */ + ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) // Labeled as "WCB SND V2.0" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg ROMs: ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) ) ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) ) ROM_LOAD32_BYTE( "wcb_grom0_3_+.grm0_3", 0x000003, 0x100000, CRC(0348a7f0) SHA1(462f77514c0e9a28da63732a4f31e9483d4c483e) ) */ - ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) /* May also be labeled as "WCB GRM0_0" ect */ + ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) // May also be labeled as "WCB GRM0_0" ect ROM_LOAD32_BYTE( "wcb_grom0_1.grm0_1", 0x000001, 0x080000, CRC(e26dcedb) SHA1(15441b97dd3d50d28007062fe28841fa3f762ec9) ) ROM_LOAD32_BYTE( "wcb_grom0_2.grm0_2", 0x000002, 0x080000, CRC(32735875) SHA1(4017a8577d8efa8c5b95bd30723ebbf6ecaeba2b) ) ROM_LOAD32_BYTE( "wcb_grom0_3.grm0_3", 0x000003, 0x080000, CRC(019d0ab8) SHA1(3281eada296ad746da80ef6e5909c50b03b90d08) ) @@ -2812,30 +2785,30 @@ ROM_START( wcbowl14 ) /* Version 1.4 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) /* Ensoniq 2MX16U 1350901801 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) // Ensoniq 2MX16U 1350901801 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "wcb__srom0.srom0", 0x000000, 0x080000, CRC(115bcd1f) SHA1(c321bf3145c11de1351c8f9cd554ab3d6600e854) ) ROM_LOAD16_BYTE( "wcb__srom1.srom1", 0x100000, 0x080000, CRC(87a4a4d8) SHA1(60db2f466686481857eb39b90ac7a19d0a96adac) ) ROM_END -ROM_START( wcbowl13 ) /* Version 1.3 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "wcb_v1.3_u83.u83", 0x00000, 0x20000, CRC(2b6d284e) SHA1(339951661509d07b69c670b7249f30a616872bdf) ) /* Labeled as "WCB V1.3 (U83)" */ - ROM_LOAD16_BYTE( "wcb_v1.3_u88.u88", 0x00001, 0x20000, CRC(039af877) SHA1(2ac9a57e358ab1ccf9a4d18f7992b59f172e31cf) ) /* Labeled as "WCB V1.3 (U88)" */ +ROM_START( wcbowl13 ) // Version 1.3 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "wcb_v1.3_u83.u83", 0x00000, 0x20000, CRC(2b6d284e) SHA1(339951661509d07b69c670b7249f30a616872bdf) ) // Labeled as "WCB V1.3 (U83)" + ROM_LOAD16_BYTE( "wcb_v1.3_u88.u88", 0x00001, 0x20000, CRC(039af877) SHA1(2ac9a57e358ab1ccf9a4d18f7992b59f172e31cf) ) // Labeled as "WCB V1.3 (U88)" ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) /* Labeled as "WCB SND V2.0" */ + ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) // Labeled as "WCB SND V2.0" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg ROMs: ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) ) ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) ) ROM_LOAD32_BYTE( "wcb_grom0_3_+.grm0_3", 0x000003, 0x100000, CRC(0348a7f0) SHA1(462f77514c0e9a28da63732a4f31e9483d4c483e) ) */ - ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) /* May also be labeled as "WCB GRM0_0" ect */ + ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) // May also be labeled as "WCB GRM0_0" ect ROM_LOAD32_BYTE( "wcb_grom0_1.grm0_1", 0x000001, 0x080000, CRC(e26dcedb) SHA1(15441b97dd3d50d28007062fe28841fa3f762ec9) ) ROM_LOAD32_BYTE( "wcb_grom0_2.grm0_2", 0x000002, 0x080000, CRC(32735875) SHA1(4017a8577d8efa8c5b95bd30723ebbf6ecaeba2b) ) ROM_LOAD32_BYTE( "wcb_grom0_3.grm0_3", 0x000003, 0x080000, CRC(019d0ab8) SHA1(3281eada296ad746da80ef6e5909c50b03b90d08) ) @@ -2846,30 +2819,30 @@ ROM_START( wcbowl13 ) /* Version 1.3 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) /* Ensoniq 2MX16U 1350901801 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) // Ensoniq 2MX16U 1350901801 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "wcb__srom0.srom0", 0x000000, 0x080000, CRC(115bcd1f) SHA1(c321bf3145c11de1351c8f9cd554ab3d6600e854) ) ROM_LOAD16_BYTE( "wcb__srom1.srom1", 0x100000, 0x080000, CRC(87a4a4d8) SHA1(60db2f466686481857eb39b90ac7a19d0a96adac) ) ROM_END -ROM_START( wcbowl13j ) /* Version 1.3 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "wcb_v1.3j_u83.u83", 0x00000, 0x20000, CRC(5805fd92) SHA1(6ec49958364731c9fdac42dfdf515f6a7a91366a) ) /* Labeled as "WCB V1.3J (U83)" */ - ROM_LOAD16_BYTE( "wcb_v1.3j_u88.u88", 0x00001, 0x20000, CRC(b846660e) SHA1(afb3f459a819afee128849751840db3c02d4762a) ) /* Labeled as "WCB V1.3J (U88)" */ +ROM_START( wcbowl13j ) // Version 1.3 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "wcb_v1.3j_u83.u83", 0x00000, 0x20000, CRC(5805fd92) SHA1(6ec49958364731c9fdac42dfdf515f6a7a91366a) ) // Labeled as "WCB V1.3J (U83)" + ROM_LOAD16_BYTE( "wcb_v1.3j_u88.u88", 0x00001, 0x20000, CRC(b846660e) SHA1(afb3f459a819afee128849751840db3c02d4762a) ) // Labeled as "WCB V1.3J (U88)" ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) /* Labeled as "WCB SND V2.0" */ + ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) // Labeled as "WCB SND V2.0" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg roms: ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) ) ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) ) ROM_LOAD32_BYTE( "wcb_grom0_3_+.grm0_3", 0x000003, 0x100000, CRC(0348a7f0) SHA1(462f77514c0e9a28da63732a4f31e9483d4c483e) ) */ - ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) /* May also be labeled as "WCB GRM0_0" ect */ + ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) // May also be labeled as "WCB GRM0_0" ect ROM_LOAD32_BYTE( "wcb_grom0_1.grm0_1", 0x000001, 0x080000, CRC(e26dcedb) SHA1(15441b97dd3d50d28007062fe28841fa3f762ec9) ) ROM_LOAD32_BYTE( "wcb_grom0_2.grm0_2", 0x000002, 0x080000, CRC(32735875) SHA1(4017a8577d8efa8c5b95bd30723ebbf6ecaeba2b) ) ROM_LOAD32_BYTE( "wcb_grom0_3.grm0_3", 0x000003, 0x080000, CRC(019d0ab8) SHA1(3281eada296ad746da80ef6e5909c50b03b90d08) ) @@ -2880,30 +2853,30 @@ ROM_START( wcbowl13j ) /* Version 1.3 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) /* Ensoniq 2MX16U 1350901801 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) // Ensoniq 2MX16U 1350901801 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "wcb__srom0.srom0", 0x000000, 0x080000, CRC(115bcd1f) SHA1(c321bf3145c11de1351c8f9cd554ab3d6600e854) ) ROM_LOAD16_BYTE( "wcb__srom1.srom1", 0x100000, 0x080000, CRC(87a4a4d8) SHA1(60db2f466686481857eb39b90ac7a19d0a96adac) ) ROM_END -ROM_START( wcbowl12 ) /* Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "wcb_v1.2_u83.u83", 0x00000, 0x20000, CRC(0602c5ce) SHA1(4339f77301f9c607c6f1dc81270d03681e874e69) ) /* Labeled as "WCB V1.2 (U83)" */ - ROM_LOAD16_BYTE( "wcb_v1.2_u88.u88", 0x00001, 0x20000, CRC(49573493) SHA1(42813573f4ab951cd830193c0ffe2ce7d79c354b) ) /* Labeled as "WCB V1.2 (U88)" */ +ROM_START( wcbowl12 ) // Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "wcb_v1.2_u83.u83", 0x00000, 0x20000, CRC(0602c5ce) SHA1(4339f77301f9c607c6f1dc81270d03681e874e69) ) // Labeled as "WCB V1.2 (U83)" + ROM_LOAD16_BYTE( "wcb_v1.2_u88.u88", 0x00001, 0x20000, CRC(49573493) SHA1(42813573f4ab951cd830193c0ffe2ce7d79c354b) ) // Labeled as "WCB V1.2 (U88)" ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) /* Labeled as "WCB SND V2.0" */ + ROM_LOAD( "wcb_snd_v2.0.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) // Labeled as "WCB SND V2.0" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg ROMs: ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) ) ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) ) ROM_LOAD32_BYTE( "wcb_grom0_3_+.grm0_3", 0x000003, 0x100000, CRC(0348a7f0) SHA1(462f77514c0e9a28da63732a4f31e9483d4c483e) ) */ - ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) /* May also be labeled as "WCB GRM0_0" ect */ + ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) // May also be labeled as "WCB GRM0_0" ect ROM_LOAD32_BYTE( "wcb_grom0_1.grm0_1", 0x000001, 0x080000, CRC(e26dcedb) SHA1(15441b97dd3d50d28007062fe28841fa3f762ec9) ) ROM_LOAD32_BYTE( "wcb_grom0_2.grm0_2", 0x000002, 0x080000, CRC(32735875) SHA1(4017a8577d8efa8c5b95bd30723ebbf6ecaeba2b) ) ROM_LOAD32_BYTE( "wcb_grom0_3.grm0_3", 0x000003, 0x080000, CRC(019d0ab8) SHA1(3281eada296ad746da80ef6e5909c50b03b90d08) ) @@ -2914,30 +2887,30 @@ ROM_START( wcbowl12 ) /* Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) /* Ensoniq 2MX16U 1350901801 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) // Ensoniq 2MX16U 1350901801 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "wcb__srom0.srom0", 0x000000, 0x080000, CRC(115bcd1f) SHA1(c321bf3145c11de1351c8f9cd554ab3d6600e854) ) ROM_LOAD16_BYTE( "wcb__srom1.srom1", 0x100000, 0x080000, CRC(87a4a4d8) SHA1(60db2f466686481857eb39b90ac7a19d0a96adac) ) ROM_END -ROM_START( wcbowl11 ) /* Version 1.1 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "wcb_v1.1_u83.u83", 0x00000, 0x20000, CRC(d4902392) SHA1(7dfef3c15a8c6e9eab93742543afce4b39675d0d) ) /* Labeled as "WCB V1.1 (U83)" */ - ROM_LOAD16_BYTE( "wcb_v1.1_u88.u88", 0x00001, 0x20000, CRC(ea81a95c) SHA1(c36e7b52435c68bec34d6fe22f623eac16879b50) ) /* Labeled as "WCB V1.1 (U88)" */ +ROM_START( wcbowl11 ) // Version 1.1 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "wcb_v1.1_u83.u83", 0x00000, 0x20000, CRC(d4902392) SHA1(7dfef3c15a8c6e9eab93742543afce4b39675d0d) ) // Labeled as "WCB V1.1 (U83)" + ROM_LOAD16_BYTE( "wcb_v1.1_u88.u88", 0x00001, 0x20000, CRC(ea81a95c) SHA1(c36e7b52435c68bec34d6fe22f623eac16879b50) ) // Labeled as "WCB V1.1 (U88)" ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcb_snd_v1.0.u17", 0x10000, 0x18000, CRC(28f14071) SHA1(fb5d6bb5a0337e93850ef46575601bf377cc0e93) ) /* Labeled as "WCB SND V1.0" */ + ROM_LOAD( "wcb_snd_v1.0.u17", 0x10000, 0x18000, CRC(28f14071) SHA1(fb5d6bb5a0337e93850ef46575601bf377cc0e93) ) // Labeled as "WCB SND V1.0" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg ROMs: ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) ) ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) ) ROM_LOAD32_BYTE( "wcb_grom0_3_+.grm0_3", 0x000003, 0x100000, CRC(0348a7f0) SHA1(462f77514c0e9a28da63732a4f31e9483d4c483e) ) */ - ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) /* May also be labeled as "WCB GRM0_0" ect */ + ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) // May also be labeled as "WCB GRM0_0" ect ROM_LOAD32_BYTE( "wcb_grom0_1.grm0_1", 0x000001, 0x080000, CRC(e26dcedb) SHA1(15441b97dd3d50d28007062fe28841fa3f762ec9) ) ROM_LOAD32_BYTE( "wcb_grom0_2.grm0_2", 0x000002, 0x080000, CRC(32735875) SHA1(4017a8577d8efa8c5b95bd30723ebbf6ecaeba2b) ) ROM_LOAD32_BYTE( "wcb_grom0_3.grm0_3", 0x000003, 0x080000, CRC(019d0ab8) SHA1(3281eada296ad746da80ef6e5909c50b03b90d08) ) @@ -2948,30 +2921,30 @@ ROM_START( wcbowl11 ) /* Version 1.1 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "wcb__srom0.srom0", 0x000000, 0x080000, CRC(115bcd1f) SHA1(c321bf3145c11de1351c8f9cd554ab3d6600e854) ) ROM_LOAD16_BYTE( "wcb__srom1.srom1", 0x100000, 0x080000, CRC(87a4a4d8) SHA1(60db2f466686481857eb39b90ac7a19d0a96adac) ) ROM_END -ROM_START( wcbowl10 ) /* Version 1.0 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) */ - ROM_REGION16_BE( 0x80000, "user1", 0 ) - ROM_LOAD16_BYTE( "wcb_v1.0_u83.u83", 0x00000, 0x20000, CRC(675ad0b1) SHA1(383fff7b4ad6acf62b76a573ec0fa214eccd7884) ) /* Labeled as "WCB V1.0 (U83)" */ - ROM_LOAD16_BYTE( "wcb_v1.0_u88.u88", 0x00001, 0x20000, CRC(3afbec1c) SHA1(37f122c7e811354216aab94c274ecc7a0fc73530) ) /* Labeled as "WCB V1.0 (U88)" */ +ROM_START( wcbowl10 ) // Version 1.0 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) + ROM_REGION16_BE( 0x80000, "maindata", 0 ) + ROM_LOAD16_BYTE( "wcb_v1.0_u83.u83", 0x00000, 0x20000, CRC(675ad0b1) SHA1(383fff7b4ad6acf62b76a573ec0fa214eccd7884) ) // Labeled as "WCB V1.0 (U83)" + ROM_LOAD16_BYTE( "wcb_v1.0_u88.u88", 0x00001, 0x20000, CRC(3afbec1c) SHA1(37f122c7e811354216aab94c274ecc7a0fc73530) ) // Labeled as "WCB V1.0 (U88)" ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcb_snd_v1.0.u17", 0x10000, 0x18000, CRC(28f14071) SHA1(fb5d6bb5a0337e93850ef46575601bf377cc0e93) ) /* Labeled as "WCB SND V1.0" */ + ROM_LOAD( "wcb_snd_v1.0.u17", 0x10000, 0x18000, CRC(28f14071) SHA1(fb5d6bb5a0337e93850ef46575601bf377cc0e93) ) // Labeled as "WCB SND V1.0" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg ROMs: ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) ) ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) ) ROM_LOAD32_BYTE( "wcb_grom0_3_+.grm0_3", 0x000003, 0x100000, CRC(0348a7f0) SHA1(462f77514c0e9a28da63732a4f31e9483d4c483e) ) */ - ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) /* May also be labeled as "WCB GRM0_0" ect */ + ROM_LOAD32_BYTE( "wcb_grom0_0.grm0_0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) // May also be labeled as "WCB GRM0_0" ect ROM_LOAD32_BYTE( "wcb_grom0_1.grm0_1", 0x000001, 0x080000, CRC(e26dcedb) SHA1(15441b97dd3d50d28007062fe28841fa3f762ec9) ) ROM_LOAD32_BYTE( "wcb_grom0_2.grm0_2", 0x000002, 0x080000, CRC(32735875) SHA1(4017a8577d8efa8c5b95bd30723ebbf6ecaeba2b) ) ROM_LOAD32_BYTE( "wcb_grom0_3.grm0_3", 0x000003, 0x080000, CRC(019d0ab8) SHA1(3281eada296ad746da80ef6e5909c50b03b90d08) ) @@ -2982,25 +2955,25 @@ ROM_START( wcbowl10 ) /* Version 1.0 (3-tier board set: P/N 1059 Rev 3, P/N 10 ROM_FILL( 0x400000, 0x480000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "wcb__srom0.srom0", 0x000000, 0x080000, CRC(115bcd1f) SHA1(c321bf3145c11de1351c8f9cd554ab3d6600e854) ) ROM_LOAD16_BYTE( "wcb__srom1.srom1", 0x100000, 0x080000, CRC(87a4a4d8) SHA1(60db2f466686481857eb39b90ac7a19d0a96adac) ) ROM_END -ROM_START( wcbowldx ) /* Deluxe version 2.00 (PCB P/N 1083 Rev 2), This version is derived from the Tournament v1.40 set, but tournament features have be removed/disabled */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( wcbowldx ) // Deluxe version 2.00 (PCB P/N 1083 Rev 2), This version is derived from the Tournament v1.40 set, but tournament features have be removed/disabled + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "wcbd_prom0_2.00.prom0", 0x00000, 0x20000, CRC(280df7f0) SHA1(dacffe8fc21263093b0f4a4fbf444abd49afbff1) ) ROM_LOAD32_BYTE( "wcbd_prom1_2.00.prom1", 0x00001, 0x20000, CRC(526eded0) SHA1(106d5503ed4db2411e1f3446d613eac525a8a9cc) ) ROM_LOAD32_BYTE( "wcbd_prom2_2.00.prom2", 0x00002, 0x20000, CRC(cb263173) SHA1(66acafaa9aba375124921774efc152e2a298a464) ) ROM_LOAD32_BYTE( "wcbd_prom3_2.00.prom3", 0x00003, 0x20000, CRC(43ecad0b) SHA1(890a843c162c052a790e432db10f968875be835c) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) /* actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 */ + ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) // actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "wcbd_grom0_0_s.grm0_0", 0x000000, 0x080000, CRC(6fcb4246) SHA1(91fb5d18ea9494b08251d1e611c80414df3aad66) ) ROM_LOAD32_BYTE( "wcbd_grom0_1_s.grm0_1", 0x000001, 0x080000, CRC(2ae31f45) SHA1(85218aa9a7ca7c6870427ffbd08b78255813ff90) ) ROM_LOAD32_BYTE( "wcbd_grom0_2_s.grm0_2", 0x000002, 0x080000, CRC(bccc0f35) SHA1(2389662e881e86f8cdb36eb2a082923d976676c8) ) @@ -3016,29 +2989,29 @@ ROM_START( wcbowldx ) /* Deluxe version 2.00 (PCB P/N 1083 Rev 2), This versio ROM_FILL( 0x500000, 0x380000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) /* Newer sound sample ROMs */ + ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) // Newer sound sample ROMs ROM_REGION16_BE( 0x400000, "ensoniq.1", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) /* Newer sound sample ROMs, ROM is a 27C020 in this set */ + ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) // Newer sound sample ROMs, ROM is a 27C020 in this set ROM_END -ROM_START( wcbowl140 ) /* Version 1.40 Tournament (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "wcbf_prom0_1.40.prom0", 0x00000, 0x20000, CRC(9d31ceb1) SHA1(d147976a763ba1e18d861351b12c5d275b94a562) ) /* First WCB set to contain the Flash Bowling */ - ROM_LOAD32_BYTE( "wcbf_prom1_1.40.prom1", 0x00001, 0x20000, CRC(c6669452) SHA1(ba58da7bee5120682e2306454da287c969014899) ) /* Has BLUE background like the WCB Deluxe set */ +ROM_START( wcbowl140 ) // Version 1.40 Tournament (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "wcbf_prom0_1.40.prom0", 0x00000, 0x20000, CRC(9d31ceb1) SHA1(d147976a763ba1e18d861351b12c5d275b94a562) ) // First WCB set to contain the Flash Bowling + ROM_LOAD32_BYTE( "wcbf_prom1_1.40.prom1", 0x00001, 0x20000, CRC(c6669452) SHA1(ba58da7bee5120682e2306454da287c969014899) ) // Has BLUE background like the WCB Deluxe set ROM_LOAD32_BYTE( "wcbf_prom2_1.40.prom2", 0x00002, 0x20000, CRC(d2fc4d09) SHA1(17983759ad6137a2e67b8414ea58880865311534) ) ROM_LOAD32_BYTE( "wcbf_prom3_1.40.prom3", 0x00003, 0x20000, CRC(c41258a4) SHA1(182e8a25bdb126a4de8a44a1c26fd8b66f06d66e) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) /* actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 */ + ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) // actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 ROM_CONTINUE( 0x08000, 0x08000 ) ROM_REGION( 0x2000, "pic", 0 ) // PIC16C54 ROM_LOAD( "itbwl-3 1997 it,inc.1996", 0x0000, 0x1fff, CRC(1461cbe0) SHA1(97cc1f985d9c8bbe3fd829681883b6c4ae15c5bd) ) // not hooked up - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "wcb_grom0_0_s.grm0_0", 0x000000, 0x080000, CRC(6fcb4246) SHA1(91fb5d18ea9494b08251d1e611c80414df3aad66) ) ROM_LOAD32_BYTE( "wcb_grom0_1_s.grm0_1", 0x000001, 0x080000, CRC(2ae31f45) SHA1(85218aa9a7ca7c6870427ffbd08b78255813ff90) ) ROM_LOAD32_BYTE( "wcb_grom0_2_s.grm0_2", 0x000002, 0x080000, CRC(bccc0f35) SHA1(2389662e881e86f8cdb36eb2a082923d976676c8) ) @@ -3054,29 +3027,29 @@ ROM_START( wcbowl140 ) /* Version 1.40 Tournament (PCB P/N 1083 Rev 2) */ ROM_FILL( 0x500000, 0x380000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) /* Newer sound sample ROMs */ + ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) // Newer sound sample ROMs ROM_REGION16_BE( 0x400000, "ensoniq.1", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) /* Newer sound sample ROMs, ROM is a 27C020 in this set */ + ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) // Newer sound sample ROMs, ROM is a 27C020 in this set ROM_END -ROM_START( wcbowl130 ) /* Version 1.30 Tournament (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "wcb_prom0_v1.30t.prom0", 0x00000, 0x20000, CRC(fbcde4e0) SHA1(8174c045686305c398f0414e2dea666ee4f9d668) ) /* Does NOT contain the Flash Bowling variation game */ - ROM_LOAD32_BYTE( "wcb_prom1_v1.30t.prom1", 0x00001, 0x20000, CRC(f4b8e7c3) SHA1(29471a464e783e820d7cde356b49d26b9394f513) ) /* Has RED background like other WCB sets */ +ROM_START( wcbowl130 ) // Version 1.30 Tournament (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "wcb_prom0_v1.30t.prom0", 0x00000, 0x20000, CRC(fbcde4e0) SHA1(8174c045686305c398f0414e2dea666ee4f9d668) ) // Does NOT contain the Flash Bowling variation game + ROM_LOAD32_BYTE( "wcb_prom1_v1.30t.prom1", 0x00001, 0x20000, CRC(f4b8e7c3) SHA1(29471a464e783e820d7cde356b49d26b9394f513) ) // Has RED background like other WCB sets ROM_LOAD32_BYTE( "wcb_prom2_v1.30t.prom2", 0x00002, 0x20000, CRC(f441afae) SHA1(31d619e63f951cfb08481474f08d278aeaa15c46) ) ROM_LOAD32_BYTE( "wcb_prom3_v1.30t.prom3", 0x00003, 0x20000, CRC(47e26d4b) SHA1(44459daef1ffe19640b26adcf122dfcd4a327a68) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) /* actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 */ + ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) // actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 ROM_CONTINUE( 0x08000, 0x08000 ) ROM_REGION( 0x2000, "pic", 0 ) // PIC16C54 ROM_LOAD( "itbwl-3 1997 it,inc.1996", 0x0000, 0x1fff, CRC(1461cbe0) SHA1(97cc1f985d9c8bbe3fd829681883b6c4ae15c5bd) ) // not hooked up - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "wcb_grom0_0_s.grm0_0", 0x000000, 0x080000, CRC(6fcb4246) SHA1(91fb5d18ea9494b08251d1e611c80414df3aad66) ) ROM_LOAD32_BYTE( "wcb_grom0_1_s.grm0_1", 0x000001, 0x080000, CRC(2ae31f45) SHA1(85218aa9a7ca7c6870427ffbd08b78255813ff90) ) ROM_LOAD32_BYTE( "wcb_grom0_2_s.grm0_2", 0x000002, 0x080000, CRC(bccc0f35) SHA1(2389662e881e86f8cdb36eb2a082923d976676c8) ) @@ -3092,28 +3065,28 @@ ROM_START( wcbowl130 ) /* Version 1.30 Tournament (PCB P/N 1083 Rev 2) */ ROM_FILL( 0x500000, 0x380000, 0xff ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) /* Newer sound sample ROMs */ + ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) // Newer sound sample ROMs ROM_REGION16_BE( 0x400000, "ensoniq.1", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) /* Newer sound sample ROMs */ - ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) /* Newer sound sample ROMs, ROM is a 27C020 in this set */ + ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) // Newer sound sample ROMs + ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) // Newer sound sample ROMs, ROM is a 27C020 in this set ROM_END ROM_START( drivedge ) - ROM_REGION32_BE( 0x8000, "user1", 0 ) /* Main board P/N 1053 REV3 */ - ROM_LOAD( "itde_er_u130_v1.0.u130", 0x00000, 0x8000, CRC(873579b0) SHA1(ce7fcbea780aee376c2f4c659a75fcf6b7abbdb4) ) /* Labeled as "ITDE ER (U130) V1.0" */ + ROM_REGION32_BE( 0x8000, "maindata", 0 ) // Main board P/N 1053 REV3 + ROM_LOAD( "itde_er_u130_v1.0.u130", 0x00000, 0x8000, CRC(873579b0) SHA1(ce7fcbea780aee376c2f4c659a75fcf6b7abbdb4) ) // Labeled as "ITDE ER (U130) V1.0" - ROM_REGION( 0x28000, "soundcpu", 0 ) /* Sound board P/N 1054 REV2 */ - ROM_LOAD( "itde_sndu17_v1.2.u17", 0x10000, 0x18000, CRC(6e8ca8bc) SHA1(98ad36877b40123b0396943754234df8de183687) ) /* Labeled as "ITDE SND(U17) V1.2" */ + ROM_REGION( 0x28000, "soundcpu", 0 ) // Sound board P/N 1054 REV2 + ROM_LOAD( "itde_sndu17_v1.2.u17", 0x10000, 0x18000, CRC(6e8ca8bc) SHA1(98ad36877b40123b0396943754234df8de183687) ) // Labeled as "ITDE SND(U17) V1.2" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x10000, "cpu4", 0 ) /* Network daughterboard P/N 1055 REV3 */ - ROM_LOAD( "vidnet_v1.0_u7.u7", 0x08000, 0x08000, CRC(dea8b9de) SHA1(46ba3a549522d7e6a32792814a04fd34839c7e55) ) /* Labeled as "VIDNET V1.0 (U7)" */ + ROM_REGION( 0x10000, "cpu4", 0 ) // Network daughterboard P/N 1055 REV3 + ROM_LOAD( "vidnet_v1.0_u7.u7", 0x08000, 0x08000, CRC(dea8b9de) SHA1(46ba3a549522d7e6a32792814a04fd34839c7e55) ) // Labeled as "VIDNET V1.0 (U7)" - ROM_REGION( 0xa00000, "gfx1", 0 ) /* ROM board P/N 1049 REV1 */ - ROM_LOAD32_BYTE( "grom0_itde_gv1.2.grom0", 0x000000, 0x80000, CRC(7fe5b01b) SHA1(b31e48971253d77e2277434b1b1590cbbea2209f) ) /* These 8 labeled as GV1.2 */ + ROM_REGION( 0xa00000, "grom", 0 ) // ROM board P/N 1049 REV1 + ROM_LOAD32_BYTE( "grom0_itde_gv1.2.grom0", 0x000000, 0x80000, CRC(7fe5b01b) SHA1(b31e48971253d77e2277434b1b1590cbbea2209f) ) // These 8 labeled as GV1.2 ROM_LOAD32_BYTE( "grom5_itde_gv1.2.grom5", 0x000001, 0x80000, CRC(5ea6dbc2) SHA1(c2de55ec6a527d0555504070a7ecb43b8aa797ea) ) ROM_LOAD32_BYTE( "grom10_itde_gv1.2.grom10", 0x000002, 0x80000, CRC(76be06cd) SHA1(b533a07853b531e318c5a85139a74ca3edb9089f) ) ROM_LOAD32_BYTE( "grom15_itde_gv1.2.grom15", 0x000003, 0x80000, CRC(119bf46b) SHA1(67f5434581d5f0042c7acd36d2c64ffe69efaa76) ) @@ -3121,41 +3094,41 @@ ROM_START( drivedge ) ROM_LOAD32_BYTE( "grom6_itde_gv1.2.grom6", 0x200001, 0x80000, CRC(2cb76b9a) SHA1(0db32cb572121c8a751dcce55b94adc48f9be738) ) ROM_LOAD32_BYTE( "grom11_itde_gv1.2.grom11", 0x200002, 0x80000, CRC(5d29018c) SHA1(11f346afedfac4f7b0d5d4995dd38ec2d7fc7777) ) ROM_LOAD32_BYTE( "grom16_itde_gv1.2.grom16", 0x200003, 0x80000, CRC(476940fb) SHA1(00dab9aeb0d5cc23e4f78f15cb976ddcafa63b42) ) - ROM_LOAD32_BYTE( "grom2_itde_dv1.2.grom2", 0x400000, 0x80000, CRC(5ccc4c62) SHA1(fc49bba2208a1157fe0948fcadac79c597f382c4) ) /* These 4 labeled as DV1.2 */ + ROM_LOAD32_BYTE( "grom2_itde_dv1.2.grom2", 0x400000, 0x80000, CRC(5ccc4c62) SHA1(fc49bba2208a1157fe0948fcadac79c597f382c4) ) // These 4 labeled as DV1.2 ROM_LOAD32_BYTE( "grom7_itde_dv1.2.grom7", 0x400001, 0x80000, CRC(45367070) SHA1(c7cf074f95cf287c4caf70d2286608c50ad01044) ) ROM_LOAD32_BYTE( "grom12_itde_dv1.2.grom12", 0x400002, 0x80000, CRC(b978ef5a) SHA1(d1fce9c7966b8324ce1a4a99d92cd69ec32f5c47) ) ROM_LOAD32_BYTE( "grom17_itde_dv1.2.grom17", 0x400003, 0x80000, CRC(eff8abac) SHA1(83da116368fae05a0c3c12ea72656681912a1175) ) - ROM_LOAD32_BYTE( "grom3_itde_mv1.2.grom3", 0x600000, 0x20000, CRC(9cd252c9) SHA1(7db6bdeeb2967154cd104ac2e20761cb99046d70) ) /* These 4 labeled as MV1.2 */ + ROM_LOAD32_BYTE( "grom3_itde_mv1.2.grom3", 0x600000, 0x20000, CRC(9cd252c9) SHA1(7db6bdeeb2967154cd104ac2e20761cb99046d70) ) // These 4 labeled as MV1.2 ROM_LOAD32_BYTE( "grom8_itde_mv1.2.grom8", 0x600001, 0x20000, CRC(43f10ca4) SHA1(9eb0e2fd1adc25b334f86582be8e5960de0caba7) ) ROM_LOAD32_BYTE( "grom13_itde_mv1.2.grom13", 0x600002, 0x20000, CRC(431d131e) SHA1(efe5a4aa65fde1f094adc6e701db8be94a4b625c) ) ROM_LOAD32_BYTE( "grom18_itde_mv1.2.grom18", 0x600003, 0x20000, CRC(b09e0d9c) SHA1(b14ff39b028c0070ccca601c21542896168bd0b7) ) - ROM_LOAD32_BYTE( "grom4_itde_pv1.6.grom4", 0x800000, 0x20000, CRC(c499cdfa) SHA1(acec47fb606f999f9d88fdce1b5860d5afcd5106) ) /* These 4 labeled as PV1.6 */ + ROM_LOAD32_BYTE( "grom4_itde_pv1.6.grom4", 0x800000, 0x20000, CRC(c499cdfa) SHA1(acec47fb606f999f9d88fdce1b5860d5afcd5106) ) // These 4 labeled as PV1.6 ROM_LOAD32_BYTE( "grom9_itde_pv1.6.grom9", 0x800001, 0x20000, CRC(e5f21566) SHA1(ce41c7e808799eea217e14e9aabe6ce617f87287) ) ROM_LOAD32_BYTE( "grom14_itde_pv1.6.grom14", 0x800002, 0x20000, CRC(09dbe382) SHA1(a85ecba433eb9bb75b4060d1b6391f66f4c8146c) ) ROM_LOAD32_BYTE( "grom19_itde_pv1.6.grom19", 0x800003, 0x20000, CRC(4ced78e1) SHA1(7995c8684ca28cbdf620d10297850463fa473fe8) ) - ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) /* Sound board P/N 1054 REV2 */ - ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 */ + ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) // Sound board P/N 1054 REV2 + ROM_LOAD16_BYTE( "ensoniq.2m", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 - ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) /* Sound board P/N 1054 REV2 */ + ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) // Sound board P/N 1054 REV2 ROM_LOAD16_BYTE( "srom0_itde_v1.0.srom0", 0x000000, 0x80000, CRC(649c685f) SHA1(95d8f257cac621c8bd4abaa88ea5f7b3b8adea4c) ) ROM_LOAD16_BYTE( "srom1_itde_v1.0.srom1", 0x100000, 0x80000, CRC(df4fff97) SHA1(3c43623bfc176639417e86a037b92026e84a5dce) ) ROM_END -ROM_START( sftm ) /* Version 1.12, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( sftm ) // Version 1.12, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "sfm_prom0_v1.12.prom0", 0x00000, 0x40000, CRC(9d09355c) SHA1(ca8c31d580e4b18b630c38e4ac1c353cf27ab4a2) ) ROM_LOAD32_BYTE( "sfm_prom1_v1.12.prom1", 0x00001, 0x40000, CRC(a58ac6a9) SHA1(a481a789c397151efcbec7ad9983daa30f289d4e) ) ROM_LOAD32_BYTE( "sfm_prom2_v1.12.prom2", 0x00002, 0x40000, CRC(2f21a4f6) SHA1(66b158c40375a0f729d44fd4c888cf6a5bbe2bf1) ) ROM_LOAD32_BYTE( "sfm_prom3_v1.12.prom3", 0x00003, 0x40000, CRC(d26648d9) SHA1(9e3e1fa104da680c4a704d10d6518eea6382f039) ) ROM_REGION( 0x48000, "soundcpu", 0 ) - ROM_LOAD( "sfm_snd_v1.u23", 0x10000, 0x38000, CRC(10d85366) SHA1(10d539c3ba37e277642c0c5888cb1886fb0f55fc) ) /* Labeled as "SFM SND V1 U23" */ + ROM_LOAD( "sfm_snd_v1.u23", 0x10000, 0x38000, CRC(10d85366) SHA1(10d539c3ba37e277642c0c5888cb1886fb0f55fc) ) // Labeled as "SFM SND V1 U23" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x2080000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) /* KM 23C3200AG-12 mask ROMs */ + ROM_REGION( 0x2080000, "grom", 0 ) + ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) // KM 23C3200AG-12 mask ROMs ROM_LOAD32_BYTE( "rm0-1.grm0_1", 0x0000001, 0x400000, CRC(6f5910fa) SHA1(1979d19dd36a9118dfaf021e05302982be5dbe69) ) ROM_LOAD32_BYTE( "rm0-2.grm0_2", 0x0000002, 0x400000, CRC(b8a2add5) SHA1(62e5bef936f014ac836c0cd5322eaba7018496b4) ) ROM_LOAD32_BYTE( "rm0-3.grm0_3", 0x0000003, 0x400000, CRC(6b6ff867) SHA1(72bc95ef361f9238602f0e03aed0adac8b59d227) ) @@ -3164,7 +3137,7 @@ ROM_START( sftm ) /* Version 1.12, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 RO ROM_LOAD32_BYTE( "rm1-2.grm1_2", 0x1000002, 0x400000, CRC(903e56c2) SHA1(843ed9855ffdf37b100b3c5614139d552fd9cd6d) ) ROM_LOAD32_BYTE( "rm1-3.grm1_3", 0x1000003, 0x400000, CRC(fac35686) SHA1(ba99ab265620575c14c46806dc543d1f9fd24462) ) - /* GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations */ + // GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations ROM_LOAD32_BYTE( "sfm_grm3_0.grm3_0", 0x2000000, 0x020000, CRC(3e1f76f7) SHA1(8aefe376e7248a583a6af02e5f9b2a4b48cc91d7) ) ROM_LOAD32_BYTE( "sfm_grm3_1.grm3_1", 0x2000001, 0x020000, CRC(578054b6) SHA1(99201959de28dbfd7692cedea4485751d3d4788f) ) @@ -3172,25 +3145,25 @@ ROM_START( sftm ) /* Version 1.12, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 RO ROM_LOAD32_BYTE( "sfm_grm3_3.grm3_3", 0x2000003, 0x020000, CRC(cd38d1d6) SHA1(0cea60d6897b34eeb13997030f6ee7e1dfb3c833) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) /* Custom 42 Pin mask ROM sample set */ + ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) // Custom 42 Pin mask ROM sample set ROM_REGION16_BE( 0x400000, "ensoniq.3", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "sfm_srom3.srom3", 0x000000, 0x080000, CRC(4f181534) SHA1(e858a33b22558665427146ec79dfba48edc20c2c) ) ROM_END -ROM_START( sftm111 ) /* Version 1.11, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "sfm_prom0_v1.11.prom0", 0x00000, 0x40000, CRC(28187ddc) SHA1(7e4fa285be9389c913fca849098a7c0d9404df7a) ) /* CAPCOM labels */ +ROM_START( sftm111 ) // Version 1.11, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "sfm_prom0_v1.11.prom0", 0x00000, 0x40000, CRC(28187ddc) SHA1(7e4fa285be9389c913fca849098a7c0d9404df7a) ) // CAPCOM labels ROM_LOAD32_BYTE( "sfm_prom1_v1.11.prom1", 0x00001, 0x40000, CRC(ec2ce6fa) SHA1(b79aebb73ba77c2ebe081142853e81473743ac46) ) ROM_LOAD32_BYTE( "sfm_prom2_v1.11.prom2", 0x00002, 0x40000, CRC(be20510e) SHA1(52e154fe4b77e461961fa23593383ef9b6dfb92f) ) ROM_LOAD32_BYTE( "sfm_prom3_v1.11.prom3", 0x00003, 0x40000, CRC(eead342f) SHA1(b6df89527b527543df5535ef00945e64ff321e09) ) ROM_REGION( 0x48000, "soundcpu", 0 ) - ROM_LOAD( "sfm_snd_v1.u23", 0x10000, 0x38000, CRC(10d85366) SHA1(10d539c3ba37e277642c0c5888cb1886fb0f55fc) ) /* Labeled as "SFM SND V1 U23" */ + ROM_LOAD( "sfm_snd_v1.u23", 0x10000, 0x38000, CRC(10d85366) SHA1(10d539c3ba37e277642c0c5888cb1886fb0f55fc) ) // Labeled as "SFM SND V1 U23" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x2080000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) /* KM 23C3200AG-12 mask ROMs */ + ROM_REGION( 0x2080000, "grom", 0 ) + ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) // KM 23C3200AG-12 mask ROMs ROM_LOAD32_BYTE( "rm0-1.grm0_1", 0x0000001, 0x400000, CRC(6f5910fa) SHA1(1979d19dd36a9118dfaf021e05302982be5dbe69) ) ROM_LOAD32_BYTE( "rm0-2.grm0_2", 0x0000002, 0x400000, CRC(b8a2add5) SHA1(62e5bef936f014ac836c0cd5322eaba7018496b4) ) ROM_LOAD32_BYTE( "rm0-3.grm0_3", 0x0000003, 0x400000, CRC(6b6ff867) SHA1(72bc95ef361f9238602f0e03aed0adac8b59d227) ) @@ -3199,7 +3172,7 @@ ROM_START( sftm111 ) /* Version 1.11, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM_LOAD32_BYTE( "rm1-2.grm1_2", 0x1000002, 0x400000, CRC(903e56c2) SHA1(843ed9855ffdf37b100b3c5614139d552fd9cd6d) ) ROM_LOAD32_BYTE( "rm1-3.grm1_3", 0x1000003, 0x400000, CRC(fac35686) SHA1(ba99ab265620575c14c46806dc543d1f9fd24462) ) - /* GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations */ + // GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations ROM_LOAD32_BYTE( "sfm_grm3_0.grm3_0", 0x2000000, 0x020000, CRC(3e1f76f7) SHA1(8aefe376e7248a583a6af02e5f9b2a4b48cc91d7) ) ROM_LOAD32_BYTE( "sfm_grm3_1.grm3_1", 0x2000001, 0x020000, CRC(578054b6) SHA1(99201959de28dbfd7692cedea4485751d3d4788f) ) @@ -3207,25 +3180,25 @@ ROM_START( sftm111 ) /* Version 1.11, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM_LOAD32_BYTE( "sfm_grm3_3.grm3_3", 0x2000003, 0x020000, CRC(cd38d1d6) SHA1(0cea60d6897b34eeb13997030f6ee7e1dfb3c833) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) /* Custom 42 Pin mask ROM sample set */ + ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) // Custom 42 Pin mask ROM sample set ROM_REGION16_BE( 0x400000, "ensoniq.3", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "sfm_srom3.srom3", 0x000000, 0x080000, CRC(4f181534) SHA1(e858a33b22558665427146ec79dfba48edc20c2c) ) ROM_END -ROM_START( sftm110 ) /* Version 1.10, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "sfm_prom0_v1.1.prom0", 0x00000, 0x40000, CRC(00c0c63c) SHA1(39f614cca51fe7843c2158b6d9abdc52dc1b0bef) ) /* CAPCOM labels */ +ROM_START( sftm110 ) // Version 1.10, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "sfm_prom0_v1.1.prom0", 0x00000, 0x40000, CRC(00c0c63c) SHA1(39f614cca51fe7843c2158b6d9abdc52dc1b0bef) ) // CAPCOM labels ROM_LOAD32_BYTE( "sfm_prom1_v1.1.prom1", 0x00001, 0x40000, CRC(d4d2a67e) SHA1(88069caf171bb9c5602bc493f1f1dafa26d2fc78) ) ROM_LOAD32_BYTE( "sfm_prom2_v1.1.prom2", 0x00002, 0x40000, CRC(d7b36c92) SHA1(fbdb6f3636b84b76cf42351392492b791429a0e4) ) ROM_LOAD32_BYTE( "sfm_prom3_v1.1.prom3", 0x00003, 0x40000, CRC(be3efdbd) SHA1(169aff265d1520031988e51083d1f208cf2529b4) ) ROM_REGION( 0x48000, "soundcpu", 0 ) - ROM_LOAD( "sfm_snd_v1.u23", 0x10000, 0x38000, CRC(10d85366) SHA1(10d539c3ba37e277642c0c5888cb1886fb0f55fc) ) /* Labeled as "SFM SND V1 U23" */ + ROM_LOAD( "sfm_snd_v1.u23", 0x10000, 0x38000, CRC(10d85366) SHA1(10d539c3ba37e277642c0c5888cb1886fb0f55fc) ) // Labeled as "SFM SND V1 U23" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x2080000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) /* KM 23C3200AG-12 mask ROMs */ + ROM_REGION( 0x2080000, "grom", 0 ) + ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) // KM 23C3200AG-12 mask ROMs ROM_LOAD32_BYTE( "rm0-1.grm0_1", 0x0000001, 0x400000, CRC(6f5910fa) SHA1(1979d19dd36a9118dfaf021e05302982be5dbe69) ) ROM_LOAD32_BYTE( "rm0-2.grm0_2", 0x0000002, 0x400000, CRC(b8a2add5) SHA1(62e5bef936f014ac836c0cd5322eaba7018496b4) ) ROM_LOAD32_BYTE( "rm0-3.grm0_3", 0x0000003, 0x400000, CRC(6b6ff867) SHA1(72bc95ef361f9238602f0e03aed0adac8b59d227) ) @@ -3234,7 +3207,7 @@ ROM_START( sftm110 ) /* Version 1.10, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM_LOAD32_BYTE( "rm1-2.grm1_2", 0x1000002, 0x400000, CRC(903e56c2) SHA1(843ed9855ffdf37b100b3c5614139d552fd9cd6d) ) ROM_LOAD32_BYTE( "rm1-3.grm1_3", 0x1000003, 0x400000, CRC(fac35686) SHA1(ba99ab265620575c14c46806dc543d1f9fd24462) ) - /* GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations */ + // GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations ROM_LOAD32_BYTE( "sfm_grm3_0.grm3_0", 0x2000000, 0x020000, CRC(3e1f76f7) SHA1(8aefe376e7248a583a6af02e5f9b2a4b48cc91d7) ) ROM_LOAD32_BYTE( "sfm_grm3_1.grm3_1", 0x2000001, 0x020000, CRC(578054b6) SHA1(99201959de28dbfd7692cedea4485751d3d4788f) ) @@ -3242,27 +3215,27 @@ ROM_START( sftm110 ) /* Version 1.10, P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM_LOAD32_BYTE( "sfm_grm3_3.grm3_3", 0x2000003, 0x020000, CRC(cd38d1d6) SHA1(0cea60d6897b34eeb13997030f6ee7e1dfb3c833) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) /* Custom 42 Pin mask ROM sample set */ + ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) // Custom 42 Pin mask ROM sample set ROM_REGION16_BE( 0x400000, "ensoniq.3", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "sfm_srom3.srom3", 0x000000, 0x080000, CRC(4f181534) SHA1(e858a33b22558665427146ec79dfba48edc20c2c) ) ROM_END -/* There is known to exist a PCB with hand written labels shown as V1.23 */ +// There is known to exist a PCB with hand written labels shown as V1.23 -ROM_START( sftmj114 ) /* Version 1.14N (Japan), P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( sftmj114 ) // Version 1.14N (Japan), P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "sfmn_prom0_v1.14.prom0", 0x00000, 0x40000, CRC(2a0c0bb7) SHA1(5722a399ed5dff55d47e096fb04a5d5b16de2f9a) ) ROM_LOAD32_BYTE( "sfmn_prom1_v1.14.prom1", 0x00001, 0x40000, CRC(088aa12c) SHA1(3c488068edea7ee726b7b837fedeeb0374a7b1ac) ) ROM_LOAD32_BYTE( "sfmn_prom2_v1.14.prom2", 0x00002, 0x40000, CRC(7120836e) SHA1(219ca837d1396ec39bb08272d2d9060441e45daf) ) ROM_LOAD32_BYTE( "sfmn_prom3_v1.14.prom3", 0x00003, 0x40000, CRC(84eb200d) SHA1(84150d978bd0b9f6363adde35c74fc5c77af6cf1) ) ROM_REGION( 0x48000, "soundcpu", 0 ) - ROM_LOAD( "sfm_snd_v1.11.u23", 0x10000, 0x38000, CRC(004854ed) SHA1(7ecb74dc3f45b038cc9904fea5c89d3e74fcbcf3) ) /* Labeled as "SFM SND V1.11 U23" */ + ROM_LOAD( "sfm_snd_v1.11.u23", 0x10000, 0x38000, CRC(004854ed) SHA1(7ecb74dc3f45b038cc9904fea5c89d3e74fcbcf3) ) // Labeled as "SFM SND V1.11 U23" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x2080000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) /* KM 23C3200AG-12 mask ROMs */ + ROM_REGION( 0x2080000, "grom", 0 ) + ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) // KM 23C3200AG-12 mask ROMs ROM_LOAD32_BYTE( "rm0-1.grm0_1", 0x0000001, 0x400000, CRC(6f5910fa) SHA1(1979d19dd36a9118dfaf021e05302982be5dbe69) ) ROM_LOAD32_BYTE( "rm0-2.grm0_2", 0x0000002, 0x400000, CRC(b8a2add5) SHA1(62e5bef936f014ac836c0cd5322eaba7018496b4) ) ROM_LOAD32_BYTE( "rm0-3.grm0_3", 0x0000003, 0x400000, CRC(6b6ff867) SHA1(72bc95ef361f9238602f0e03aed0adac8b59d227) ) @@ -3271,7 +3244,7 @@ ROM_START( sftmj114 ) /* Version 1.14N (Japan), P/N 1064 REV 1 Mainboard, P/N ROM_LOAD32_BYTE( "rm1-2.grm1_2", 0x1000002, 0x400000, CRC(903e56c2) SHA1(843ed9855ffdf37b100b3c5614139d552fd9cd6d) ) ROM_LOAD32_BYTE( "rm1-3.grm1_3", 0x1000003, 0x400000, CRC(fac35686) SHA1(ba99ab265620575c14c46806dc543d1f9fd24462) ) - /* GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations */ + // GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations ROM_LOAD32_BYTE( "sfm_grm3_0.grm3_0", 0x2000000, 0x020000, CRC(3e1f76f7) SHA1(8aefe376e7248a583a6af02e5f9b2a4b48cc91d7) ) ROM_LOAD32_BYTE( "sfm_grm3_1.grm3_1", 0x2000001, 0x020000, CRC(578054b6) SHA1(99201959de28dbfd7692cedea4485751d3d4788f) ) @@ -3279,25 +3252,25 @@ ROM_START( sftmj114 ) /* Version 1.14N (Japan), P/N 1064 REV 1 Mainboard, P/N ROM_LOAD32_BYTE( "sfm_grm3_3.grm3_3", 0x2000003, 0x020000, CRC(cd38d1d6) SHA1(0cea60d6897b34eeb13997030f6ee7e1dfb3c833) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) /* Custom 42 Pin mask ROM sample set */ + ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) // Custom 42 Pin mask ROM sample set ROM_REGION16_BE( 0x400000, "ensoniq.3", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "sfm_srom3.srom3", 0x000000, 0x080000, CRC(4f181534) SHA1(e858a33b22558665427146ec79dfba48edc20c2c) ) ROM_END -ROM_START( sftmj112 ) /* Version 1.12N (Japan), P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "sfmn_prom0_v1.12.prom0", 0x00000, 0x40000, CRC(640a04a8) SHA1(adc7f5880962cbcc5f9f28e72a84070da6e2ec36) ) /* CAPCOM labels */ +ROM_START( sftmj112 ) // Version 1.12N (Japan), P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "sfmn_prom0_v1.12.prom0", 0x00000, 0x40000, CRC(640a04a8) SHA1(adc7f5880962cbcc5f9f28e72a84070da6e2ec36) ) // CAPCOM labels ROM_LOAD32_BYTE( "sfmn_prom1_v1.12.prom1", 0x00001, 0x40000, CRC(2a27b690) SHA1(f63c3665ec030ecc2d7a10ead182941ade1c79d0) ) ROM_LOAD32_BYTE( "sfmn_prom2_v1.12.prom2", 0x00002, 0x40000, CRC(cec1dd7b) SHA1(4c4cf14bc17ddef216d16a7fbcef2e4694b45eb4) ) ROM_LOAD32_BYTE( "sfmn_prom3_v1.12.prom3", 0x00003, 0x40000, CRC(48fa60f4) SHA1(2d8bd4b5e3279af188feb3fb5e52a3d234bedd0a) ) ROM_REGION( 0x48000, "soundcpu", 0 ) - ROM_LOAD( "sfm_snd_v1.11.u23", 0x10000, 0x38000, CRC(004854ed) SHA1(7ecb74dc3f45b038cc9904fea5c89d3e74fcbcf3) ) /* Labeled as "SFM SND V1.11 U23" */ + ROM_LOAD( "sfm_snd_v1.11.u23", 0x10000, 0x38000, CRC(004854ed) SHA1(7ecb74dc3f45b038cc9904fea5c89d3e74fcbcf3) ) // Labeled as "SFM SND V1.11 U23" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x2080000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) /* KM 23C3200AG-12 mask ROMs */ + ROM_REGION( 0x2080000, "grom", 0 ) + ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) // KM 23C3200AG-12 mask ROMs ROM_LOAD32_BYTE( "rm0-1.grm0_1", 0x0000001, 0x400000, CRC(6f5910fa) SHA1(1979d19dd36a9118dfaf021e05302982be5dbe69) ) ROM_LOAD32_BYTE( "rm0-2.grm0_2", 0x0000002, 0x400000, CRC(b8a2add5) SHA1(62e5bef936f014ac836c0cd5322eaba7018496b4) ) ROM_LOAD32_BYTE( "rm0-3.grm0_3", 0x0000003, 0x400000, CRC(6b6ff867) SHA1(72bc95ef361f9238602f0e03aed0adac8b59d227) ) @@ -3306,7 +3279,7 @@ ROM_START( sftmj112 ) /* Version 1.12N (Japan), P/N 1064 REV 1 Mainboard, P/N ROM_LOAD32_BYTE( "rm1-2.grm1_2", 0x1000002, 0x400000, CRC(903e56c2) SHA1(843ed9855ffdf37b100b3c5614139d552fd9cd6d) ) ROM_LOAD32_BYTE( "rm1-3.grm1_3", 0x1000003, 0x400000, CRC(fac35686) SHA1(ba99ab265620575c14c46806dc543d1f9fd24462) ) - /* GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations */ + // GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations ROM_LOAD32_BYTE( "sfm_grm3_0.grm3_0", 0x2000000, 0x020000, CRC(3e1f76f7) SHA1(8aefe376e7248a583a6af02e5f9b2a4b48cc91d7) ) ROM_LOAD32_BYTE( "sfm_grm3_1.grm3_1", 0x2000001, 0x020000, CRC(578054b6) SHA1(99201959de28dbfd7692cedea4485751d3d4788f) ) @@ -3314,25 +3287,25 @@ ROM_START( sftmj112 ) /* Version 1.12N (Japan), P/N 1064 REV 1 Mainboard, P/N ROM_LOAD32_BYTE( "sfm_grm3_3.grm3_3", 0x2000003, 0x020000, CRC(cd38d1d6) SHA1(0cea60d6897b34eeb13997030f6ee7e1dfb3c833) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) /* Custom 42 Pin mask ROM sample set */ + ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) // Custom 42 Pin mask ROM sample set ROM_REGION16_BE( 0x400000, "ensoniq.3", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "sfm_srom3.srom3", 0x000000, 0x080000, CRC(4f181534) SHA1(e858a33b22558665427146ec79dfba48edc20c2c) ) ROM_END -ROM_START( sftmk112 ) /* Version 1.12K (Korea), P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "sfmk_prom0_v1.12.prom0", 0x00000, 0x40000, CRC(1864ca77) SHA1(44702d69a5ee6a11328281943e04bd64b12b02a1) ) /* CAPCOM labels */ +ROM_START( sftmk112 ) // Version 1.12K (Korea), P/N 1064 REV 1 Mainboard, P/N 1073 REV 0 ROM board, P/N 1066 REV 2 Sound board + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "sfmk_prom0_v1.12.prom0", 0x00000, 0x40000, CRC(1864ca77) SHA1(44702d69a5ee6a11328281943e04bd64b12b02a1) ) // CAPCOM labels ROM_LOAD32_BYTE( "sfmk_prom1_v1.12.prom1", 0x00001, 0x40000, CRC(a93c52aa) SHA1(51539e79cfe8a2826f77b09ec8beeb94c2bb0767) ) ROM_LOAD32_BYTE( "sfmk_prom2_v1.12.prom2", 0x00002, 0x40000, CRC(8ddf8a7d) SHA1(63e5b0f7b2d60a8a61b9fccc54f672e48e68b744) ) ROM_LOAD32_BYTE( "sfmk_prom3_v1.12.prom3", 0x00003, 0x40000, CRC(9a83e6fe) SHA1(2a6dfaa19d5585c90b67fba025fc94d7fa528847) ) ROM_REGION( 0x48000, "soundcpu", 0 ) - ROM_LOAD( "sfm_snd_v1.11.u23", 0x10000, 0x38000, CRC(004854ed) SHA1(7ecb74dc3f45b038cc9904fea5c89d3e74fcbcf3) ) /* Labeled as "SFM SND V1.11 U23" */ + ROM_LOAD( "sfm_snd_v1.11.u23", 0x10000, 0x38000, CRC(004854ed) SHA1(7ecb74dc3f45b038cc9904fea5c89d3e74fcbcf3) ) // Labeled as "SFM SND V1.11 U23" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x2080000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) /* KM 23C3200AG-12 mask ROMs */ + ROM_REGION( 0x2080000, "grom", 0 ) + ROM_LOAD32_BYTE( "rm0-0.grm0_0", 0x0000000, 0x400000, CRC(09ef29cb) SHA1(430da5b00554582391478849d5b1547fe12eedbe) ) // KM 23C3200AG-12 mask ROMs ROM_LOAD32_BYTE( "rm0-1.grm0_1", 0x0000001, 0x400000, CRC(6f5910fa) SHA1(1979d19dd36a9118dfaf021e05302982be5dbe69) ) ROM_LOAD32_BYTE( "rm0-2.grm0_2", 0x0000002, 0x400000, CRC(b8a2add5) SHA1(62e5bef936f014ac836c0cd5322eaba7018496b4) ) ROM_LOAD32_BYTE( "rm0-3.grm0_3", 0x0000003, 0x400000, CRC(6b6ff867) SHA1(72bc95ef361f9238602f0e03aed0adac8b59d227) ) @@ -3341,7 +3314,7 @@ ROM_START( sftmk112 ) /* Version 1.12K (Korea), P/N 1064 REV 1 Mainboard, P/N ROM_LOAD32_BYTE( "rm1-2.grm1_2", 0x1000002, 0x400000, CRC(903e56c2) SHA1(843ed9855ffdf37b100b3c5614139d552fd9cd6d) ) ROM_LOAD32_BYTE( "rm1-3.grm1_3", 0x1000003, 0x400000, CRC(fac35686) SHA1(ba99ab265620575c14c46806dc543d1f9fd24462) ) - /* GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations */ + // GROM2_0 through GROM2_3 are unpopulated 23C32000 mask ROM locations ROM_LOAD32_BYTE( "sfm_grm3_0.grm3_0", 0x2000000, 0x020000, CRC(3e1f76f7) SHA1(8aefe376e7248a583a6af02e5f9b2a4b48cc91d7) ) ROM_LOAD32_BYTE( "sfm_grm3_1.grm3_1", 0x2000001, 0x020000, CRC(578054b6) SHA1(99201959de28dbfd7692cedea4485751d3d4788f) ) @@ -3349,25 +3322,25 @@ ROM_START( sftmk112 ) /* Version 1.12K (Korea), P/N 1064 REV 1 Mainboard, P/N ROM_LOAD32_BYTE( "sfm_grm3_3.grm3_3", 0x2000003, 0x020000, CRC(cd38d1d6) SHA1(0cea60d6897b34eeb13997030f6ee7e1dfb3c833) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) /* Custom 42 Pin mask ROM sample set */ + ROM_LOAD16_BYTE( "sfm_srom0.srom0", 0x000000, 0x200000, CRC(6ca1d3fc) SHA1(904f4c55a1bc83531a6d87ff706afd8cdfaee83b) ) // Custom 42 Pin mask ROM sample set ROM_REGION16_BE( 0x400000, "ensoniq.3", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "sfm_srom3.srom3", 0x000000, 0x080000, CRC(4f181534) SHA1(e858a33b22558665427146ec79dfba48edc20c2c) ) ROM_END -ROM_START( shufshot ) /* Version 1.40 (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( shufshot ) // Version 1.40 (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "shot_prom0_v1.40.prom0", 0x00000, 0x20000, CRC(33c0c98b) SHA1(9960a1e8131e5dde33450560665f315e5a97dc05) ) ROM_LOAD32_BYTE( "shot_prom1_v1.40.prom1", 0x00001, 0x20000, CRC(d30a8831) SHA1(3a7937b542f703dfc2ae74b6fdb2ac6a8e22bdbd) ) ROM_LOAD32_BYTE( "shot_prom2_v1.40.prom2", 0x00002, 0x20000, CRC(ea10ada8) SHA1(e8167def9929876f6d2b4771b265114d9b04136e) ) ROM_LOAD32_BYTE( "shot_prom3_v1.40.prom3", 0x00003, 0x20000, CRC(4b28f28b) SHA1(602e230cc69ae872e40d72c85ec66f111826c15e) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) /* labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 */ + ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) // labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "grom", 0 ) ROM_LOAD32_BYTE( "shf_grom0_0.grm0_0", 0x000000, 0x80000, CRC(832a3d6a) SHA1(443328fa61b79c93ec6c9d24893b2ec38358a905) ) ROM_LOAD32_BYTE( "shf_grom0_1.grm0_1", 0x000001, 0x80000, CRC(155e48a2) SHA1(187d65423ff9a3d6b6c34c885a1b2397fa5371cf) ) ROM_LOAD32_BYTE( "shf_grom0_2.grm0_2", 0x000002, 0x80000, CRC(9f2b470d) SHA1(012e917856042cbe00d476e3220a7f9c841bd199) ) @@ -3380,8 +3353,8 @@ ROM_START( shufshot ) /* Version 1.40 (PCB P/N 1083 Rev 2) */ ROM_LOAD32_BYTE( "shf_grom2_1.grm2_1", 0x400001, 0x80000, CRC(4b52ab1a) SHA1(5c438df7f2edea8f4d8734408fd94acf9d340755) ) ROM_LOAD32_BYTE( "shf_grom2_2.grm2_2", 0x400002, 0x80000, CRC(f45fad03) SHA1(3ff062928ef5bcdce8748ddd972c5da67207227a) ) ROM_LOAD32_BYTE( "shf_grom2_3.grm2_3", 0x400003, 0x80000, CRC(1bcb26c8) SHA1(49e730c56c4a3171a2962fa65f3b16481590c636) ) - ROM_LOAD32_BYTE( "shfa_grom3_0.grm3_0", 0x600000, 0x80000, CRC(c5afc9d1) SHA1(db1f1559b26d2a7c21486f005fffae16e74af1c6) ) /* although different CRC32 values, they match programs internal checksum values */ - ROM_LOAD32_BYTE( "shfa_grom3_1.grm3_1", 0x600001, 0x80000, CRC(70dd7b68) SHA1(305bfcefb24f68bed4055c0e8819c31c95f7f853) ) /* changed with version 1.38 on IT dev CD */ + ROM_LOAD32_BYTE( "shfa_grom3_0.grm3_0", 0x600000, 0x80000, CRC(c5afc9d1) SHA1(db1f1559b26d2a7c21486f005fffae16e74af1c6) ) // although different CRC32 values, they match programs internal checksum values + ROM_LOAD32_BYTE( "shfa_grom3_1.grm3_1", 0x600001, 0x80000, CRC(70dd7b68) SHA1(305bfcefb24f68bed4055c0e8819c31c95f7f853) ) // changed with version 1.38 on IT dev CD ROM_LOAD32_BYTE( "shfa_grom3_2.grm3_2", 0x600002, 0x80000, CRC(da56512d) SHA1(dce114b079ff06693a8ec8247c3d4e87969d686f) ) ROM_LOAD32_BYTE( "shfa_grom3_3.grm3_3", 0x600003, 0x80000, CRC(21727c50) SHA1(db7f16f045f04b3bcb4b968344bc2eb641658add) ) @@ -3390,18 +3363,18 @@ ROM_START( shufshot ) /* Version 1.40 (PCB P/N 1083 Rev 2) */ ROM_LOAD16_BYTE( "shf_srom1.srom1", 0x200000, 0x80000, CRC(8c89948a) SHA1(1054eca5de352c17f34f31ef16297ba6177a37ba) ) ROM_END -ROM_START( shufshot139 ) /* Version 1.39 (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( shufshot139 ) // Version 1.39 (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "shot_prom0_v1.39.prom0", 0x00000, 0x20000, CRC(e811fc4a) SHA1(9e1d8f64ac89ac865929f6a23f66d95eeeda3ac9) ) ROM_LOAD32_BYTE( "shot_prom1_v1.39.prom1", 0x00001, 0x20000, CRC(f9d120c5) SHA1(f94216f1fb6d810ddee98479e83f0719b30b768f) ) ROM_LOAD32_BYTE( "shot_prom2_v1.39.prom2", 0x00002, 0x20000, CRC(9f12414d) SHA1(c1120079173f7ed6118f7105443afd7d38d8af94) ) ROM_LOAD32_BYTE( "shot_prom3_v1.39.prom3", 0x00003, 0x20000, CRC(108a69be) SHA1(1b2ebe4767be084707522a90f009d3a70e03d578) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) /* labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 */ + ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) // labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x800000, "gfx1", 0 ) /* some Shuffleshot v1.39 PCBs are known to use the older GROM3_0 through GROM3_3 data */ + ROM_REGION( 0x800000, "grom", 0 ) // some Shuffleshot v1.39 PCBs are known to use the older GROM3_0 through GROM3_3 data ROM_LOAD32_BYTE( "shf_grom0_0.grm0_0", 0x000000, 0x80000, CRC(832a3d6a) SHA1(443328fa61b79c93ec6c9d24893b2ec38358a905) ) ROM_LOAD32_BYTE( "shf_grom0_1.grm0_1", 0x000001, 0x80000, CRC(155e48a2) SHA1(187d65423ff9a3d6b6c34c885a1b2397fa5371cf) ) ROM_LOAD32_BYTE( "shf_grom0_2.grm0_2", 0x000002, 0x80000, CRC(9f2b470d) SHA1(012e917856042cbe00d476e3220a7f9c841bd199) ) @@ -3414,8 +3387,8 @@ ROM_START( shufshot139 ) /* Version 1.39 (PCB P/N 1083 Rev 2) */ ROM_LOAD32_BYTE( "shf_grom2_1.grm2_1", 0x400001, 0x80000, CRC(4b52ab1a) SHA1(5c438df7f2edea8f4d8734408fd94acf9d340755) ) ROM_LOAD32_BYTE( "shf_grom2_2.grm2_2", 0x400002, 0x80000, CRC(f45fad03) SHA1(3ff062928ef5bcdce8748ddd972c5da67207227a) ) ROM_LOAD32_BYTE( "shf_grom2_3.grm2_3", 0x400003, 0x80000, CRC(1bcb26c8) SHA1(49e730c56c4a3171a2962fa65f3b16481590c636) ) - ROM_LOAD32_BYTE( "shfa_grom3_0.grm3_0", 0x600000, 0x80000, CRC(c5afc9d1) SHA1(db1f1559b26d2a7c21486f005fffae16e74af1c6) ) /* although different CRC32 values, they match programs internal checksum values */ - ROM_LOAD32_BYTE( "shfa_grom3_1.grm3_1", 0x600001, 0x80000, CRC(70dd7b68) SHA1(305bfcefb24f68bed4055c0e8819c31c95f7f853) ) /* changed with version 1.38 on IT dev CD */ + ROM_LOAD32_BYTE( "shfa_grom3_0.grm3_0", 0x600000, 0x80000, CRC(c5afc9d1) SHA1(db1f1559b26d2a7c21486f005fffae16e74af1c6) ) // although different CRC32 values, they match programs internal checksum values + ROM_LOAD32_BYTE( "shfa_grom3_1.grm3_1", 0x600001, 0x80000, CRC(70dd7b68) SHA1(305bfcefb24f68bed4055c0e8819c31c95f7f853) ) // changed with version 1.38 on IT dev CD ROM_LOAD32_BYTE( "shfa_grom3_2.grm3_2", 0x600002, 0x80000, CRC(da56512d) SHA1(dce114b079ff06693a8ec8247c3d4e87969d686f) ) ROM_LOAD32_BYTE( "shfa_grom3_3.grm3_3", 0x600003, 0x80000, CRC(21727c50) SHA1(db7f16f045f04b3bcb4b968344bc2eb641658add) ) @@ -3424,18 +3397,18 @@ ROM_START( shufshot139 ) /* Version 1.39 (PCB P/N 1083 Rev 2) */ ROM_LOAD16_BYTE( "shf_srom1.srom1", 0x200000, 0x80000, CRC(8c89948a) SHA1(1054eca5de352c17f34f31ef16297ba6177a37ba) ) ROM_END -ROM_START( shufshot138 ) /* Version 1.38 (PCB P/N 1083 Rev 2) - Not offically released? - found on dev CD */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( shufshot138 ) // Version 1.38 (PCB P/N 1083 Rev 2) - Not offically released? - found on dev CD + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "shot_prom0_v1.38.prom0", 0x00000, 0x20000, CRC(68f823ff) SHA1(f9de8e45dd87e39bb256963cd356cbb9f985f3e8) ) ROM_LOAD32_BYTE( "shot_prom1_v1.38.prom1", 0x00001, 0x20000, CRC(bdd9a8e9) SHA1(b4c0d3ab5ed66c7f43f309236708df355385ec5e) ) ROM_LOAD32_BYTE( "shot_prom2_v1.38.prom2", 0x00002, 0x20000, CRC(92008e13) SHA1(2ed7cde67131e4baf1c127004d61d433d983467e) ) ROM_LOAD32_BYTE( "shot_prom3_v1.38.prom3", 0x00003, 0x20000, CRC(723cb9a5) SHA1(2ac209053bce245130b6056fe0ebe048596ae3b4) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) /* labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 */ + ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) // labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "grom", 0 ) ROM_LOAD32_BYTE( "shf_grom0_0.grm0_0", 0x000000, 0x80000, CRC(832a3d6a) SHA1(443328fa61b79c93ec6c9d24893b2ec38358a905) ) ROM_LOAD32_BYTE( "shf_grom0_1.grm0_1", 0x000001, 0x80000, CRC(155e48a2) SHA1(187d65423ff9a3d6b6c34c885a1b2397fa5371cf) ) ROM_LOAD32_BYTE( "shf_grom0_2.grm0_2", 0x000002, 0x80000, CRC(9f2b470d) SHA1(012e917856042cbe00d476e3220a7f9c841bd199) ) @@ -3448,8 +3421,8 @@ ROM_START( shufshot138 ) /* Version 1.38 (PCB P/N 1083 Rev 2) - Not offically ROM_LOAD32_BYTE( "shf_grom2_1.grm2_1", 0x400001, 0x80000, CRC(4b52ab1a) SHA1(5c438df7f2edea8f4d8734408fd94acf9d340755) ) ROM_LOAD32_BYTE( "shf_grom2_2.grm2_2", 0x400002, 0x80000, CRC(f45fad03) SHA1(3ff062928ef5bcdce8748ddd972c5da67207227a) ) ROM_LOAD32_BYTE( "shf_grom2_3.grm2_3", 0x400003, 0x80000, CRC(1bcb26c8) SHA1(49e730c56c4a3171a2962fa65f3b16481590c636) ) - ROM_LOAD32_BYTE( "shfa_grom3_0.grm3_0", 0x600000, 0x80000, CRC(c5afc9d1) SHA1(db1f1559b26d2a7c21486f005fffae16e74af1c6) ) /* although different CRC32 values, they match programs internal checksum values */ - ROM_LOAD32_BYTE( "shfa_grom3_1.grm3_1", 0x600001, 0x80000, CRC(70dd7b68) SHA1(305bfcefb24f68bed4055c0e8819c31c95f7f853) ) /* changed with version 1.38 on IT dev CD */ + ROM_LOAD32_BYTE( "shfa_grom3_0.grm3_0", 0x600000, 0x80000, CRC(c5afc9d1) SHA1(db1f1559b26d2a7c21486f005fffae16e74af1c6) ) // although different CRC32 values, they match programs internal checksum values + ROM_LOAD32_BYTE( "shfa_grom3_1.grm3_1", 0x600001, 0x80000, CRC(70dd7b68) SHA1(305bfcefb24f68bed4055c0e8819c31c95f7f853) ) // changed with version 1.38 on IT dev CD ROM_LOAD32_BYTE( "shfa_grom3_2.grm3_2", 0x600002, 0x80000, CRC(da56512d) SHA1(dce114b079ff06693a8ec8247c3d4e87969d686f) ) ROM_LOAD32_BYTE( "shfa_grom3_3.grm3_3", 0x600003, 0x80000, CRC(21727c50) SHA1(db7f16f045f04b3bcb4b968344bc2eb641658add) ) @@ -3458,18 +3431,18 @@ ROM_START( shufshot138 ) /* Version 1.38 (PCB P/N 1083 Rev 2) - Not offically ROM_LOAD16_BYTE( "shf_srom1.srom1", 0x200000, 0x80000, CRC(8c89948a) SHA1(1054eca5de352c17f34f31ef16297ba6177a37ba) ) ROM_END -ROM_START( shufshot137 ) /* Version 1.37 (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( shufshot137 ) // Version 1.37 (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "shot_prom0_v1.37.prom0", 0x00000, 0x20000, CRC(6499c76f) SHA1(60fdaefb09088ac609addd40569bd7fab12593bc) ) ROM_LOAD32_BYTE( "shot_prom1_v1.37.prom1", 0x00001, 0x20000, CRC(64fb47a4) SHA1(32ce9d91b16b8aaf545c0a22842ad8d806727a17) ) ROM_LOAD32_BYTE( "shot_prom2_v1.37.prom2", 0x00002, 0x20000, CRC(e0df3025) SHA1(edff5c5c4486981ac0783f337a0845854d0217f0) ) ROM_LOAD32_BYTE( "shot_prom3_v1.37.prom3", 0x00003, 0x20000, CRC(efa66ad8) SHA1(d8dc754529284e6c06b912e226c8a4520aab49fc) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) /* labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 */ + ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) // labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "grom", 0 ) ROM_LOAD32_BYTE( "shf_grom0_0.grm0_0", 0x000000, 0x80000, CRC(832a3d6a) SHA1(443328fa61b79c93ec6c9d24893b2ec38358a905) ) ROM_LOAD32_BYTE( "shf_grom0_1.grm0_1", 0x000001, 0x80000, CRC(155e48a2) SHA1(187d65423ff9a3d6b6c34c885a1b2397fa5371cf) ) ROM_LOAD32_BYTE( "shf_grom0_2.grm0_2", 0x000002, 0x80000, CRC(9f2b470d) SHA1(012e917856042cbe00d476e3220a7f9c841bd199) ) @@ -3492,18 +3465,18 @@ ROM_START( shufshot137 ) /* Version 1.37 (PCB P/N 1083 Rev 2) */ ROM_LOAD16_BYTE( "shf_srom1.srom1", 0x200000, 0x80000, CRC(8c89948a) SHA1(1054eca5de352c17f34f31ef16297ba6177a37ba) ) ROM_END -ROM_START( shufshot135 ) /* Version 1.35 (PCB P/N 1083 Rev 2) - Not offically released? - found on dev CD */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( shufshot135 ) // Version 1.35 (PCB P/N 1083 Rev 2) - Not offically released? - found on dev CD + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "shot_prom0_v1.35.prom0", 0x00000, 0x20000, CRC(1a1d510c) SHA1(b1919beee499fb4e213a987ad796742dbfbd540b) ) ROM_LOAD32_BYTE( "shot_prom1_v1.35.prom1", 0x00001, 0x20000, CRC(5d7d5017) SHA1(8330339bd45c30066650a2a6cc7e12f365c91608) ) ROM_LOAD32_BYTE( "shot_prom2_v1.35.prom2", 0x00002, 0x20000, CRC(6f27b111) SHA1(9f9a95948662003edee2aeb2230b64e6401b4e49) ) ROM_LOAD32_BYTE( "shot_prom3_v1.35.prom3", 0x00003, 0x20000, CRC(bf6fabbb) SHA1(3f52791b974a6170fad492c0270270f5712c8506) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) /* labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 */ + ROM_LOAD( "shotsnd_u88_v1.1.u88", 0x10000, 0x18000, CRC(e37d599d) SHA1(105f91e968ecf553d910a97726ddc536289bbb2b) ) // labeled SHOTSND U88 V1.1, also known to be labeled SHOTSND U88 ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "grom", 0 ) ROM_LOAD32_BYTE( "shf_grom0_0.grm0_0", 0x000000, 0x80000, CRC(832a3d6a) SHA1(443328fa61b79c93ec6c9d24893b2ec38358a905) ) ROM_LOAD32_BYTE( "shf_grom0_1.grm0_1", 0x000001, 0x80000, CRC(155e48a2) SHA1(187d65423ff9a3d6b6c34c885a1b2397fa5371cf) ) ROM_LOAD32_BYTE( "shf_grom0_2.grm0_2", 0x000002, 0x80000, CRC(9f2b470d) SHA1(012e917856042cbe00d476e3220a7f9c841bd199) ) @@ -3527,8 +3500,8 @@ ROM_START( shufshot135 ) /* Version 1.35 (PCB P/N 1083 Rev 2) - Not offically ROM_END -ROM_START( gt3d ) /* Version 1.93N for the single large type PCB P/N 1083 Rev 2 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3d ) // Version 1.93N for the single large type PCB P/N 1083 Rev 2 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.93n.prom0", 0x00000, 0x80000, CRC(cacacb44) SHA1(747f48a52e140ab3e321b8f6a96f06bc70dc7cfa) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.93n.prom1", 0x00001, 0x80000, CRC(4c172d7f) SHA1(d4217d5d4d561e46e0213e6f8dc8d9a874f86877) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.93n.prom2", 0x00002, 0x80000, CRC(b53fe6f0) SHA1(4fbaa2f2a877c051b06ffa570e40156142d8e6bf) ) @@ -3538,7 +3511,7 @@ ROM_START( gt3d ) /* Version 1.93N for the single large type PCB P/N 1083 Rev ROM_LOAD( "gtg3nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3547,7 +3520,7 @@ ROM_START( gt3d ) /* Version 1.93N for the single large type PCB P/N 1083 Rev ROM_LOAD32_BYTE( "gtg3_grom1_1.grm1_1", 0x200001, 0x80000, CRC(0aadfad2) SHA1(56a283b30a13b77ec53b7ae2b4129d44b7fa25d4) ) ROM_LOAD32_BYTE( "gtg3_grom1_2.grm1_2", 0x200002, 0x80000, CRC(27871980) SHA1(fe473d12cb4805e25dcac8f9ae187891936b961b) ) ROM_LOAD32_BYTE( "gtg3_grom1_3.grm1_3", 0x200003, 0x80000, CRC(7dbc242b) SHA1(9aa5074cad633446e0110a1a3d9c6e1f2158070a) ) - ROM_LOAD32_BYTE( "gtg3_grom2_0_t.grm2_0", 0x400000, 0x80000, CRC(80ae7148) SHA1(e19d3390a2a0dad260d770fdbbb64d1f8e43d53f) ) /* actually labeled as "GTG3 GROM2_0 T" ect */ + ROM_LOAD32_BYTE( "gtg3_grom2_0_t.grm2_0", 0x400000, 0x80000, CRC(80ae7148) SHA1(e19d3390a2a0dad260d770fdbbb64d1f8e43d53f) ) // actually labeled as "GTG3 GROM2_0 T" ect ROM_LOAD32_BYTE( "gtg3_grom2_1_t.grm2_1", 0x400001, 0x80000, CRC(0f85a618) SHA1(d9ced21c20f9ed6b7f19e7645d75b239ea709b79) ) ROM_LOAD32_BYTE( "gtg3_grom2_2_t.grm2_2", 0x400002, 0x80000, CRC(09ca5fbf) SHA1(6a6ed4d5d76035d8acc33c6494fba6012194362e) ) ROM_LOAD32_BYTE( "gtg3_grom2_3_t.grm2_3", 0x400003, 0x80000, CRC(d136853a) SHA1(0777d6bfab9e3d57c2a61d058fd185fc1f547698) ) @@ -3557,18 +3530,18 @@ ROM_START( gt3d ) /* Version 1.93N for the single large type PCB P/N 1083 Rev ROM_LOAD16_BYTE( "gtg3_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt3ds192 ) /* Version 1.92 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3ds192 ) // Version 1.92 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.92s.prom0", 0x00000, 0x80000, CRC(eee38005) SHA1(3a879dce1abf449e847ba8f45ff5e1d70d13c966) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.92s.prom1", 0x00001, 0x80000, CRC(818ba70e) SHA1(abeadd0efa8ea0d7924ff0951aafe8ee4a5f45d9) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.92s.prom2", 0x00002, 0x80000, CRC(7ab661a1) SHA1(9db0a64c91ba15dad6ca071639d8e2d366dc7756) ) ROM_LOAD32_BYTE( "gtg3_prom3_v1.92s.prom3", 0x00003, 0x80000, CRC(f9f96c01) SHA1(037c8d2d0d81c08745c044121c62f05a814db576) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3-snd_u23_v1.2.u23", 0x10000, 0x18000, CRC(cbbe41f9) SHA1(6a602addff87d32bb6df3ffb0563e8b2d3c4adcc) ) /* actually labeled as "GTG3-SND(U23) v1.2" */ + ROM_LOAD( "gtg3-snd_u23_v1.2.u23", 0x10000, 0x18000, CRC(cbbe41f9) SHA1(6a602addff87d32bb6df3ffb0563e8b2d3c4adcc) ) // actually labeled as "GTG3-SND(U23) v1.2" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3583,7 +3556,7 @@ ROM_START( gt3ds192 ) /* Version 1.92 for the 3 tier type PCB with short ROM boa ROM_LOAD32_BYTE( "gtg3_grom2_3.grm2_3", 0x400003, 0x80000, CRC(77869bcf) SHA1(dde3b64578b79a94c7e346561a691229bbcfadac) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "gtg3_srom1.srom1", 0x000000, 0x80000, CRC(ac669434) SHA1(6941884c553515f5bc06af772897835a44aa8e4c) ) @@ -3593,18 +3566,18 @@ ROM_START( gt3ds192 ) /* Version 1.92 for the 3 tier type PCB with short ROM boa ROM_LOAD16_BYTE( "gtg3_srom3.srom3", 0x000000, 0x20000, CRC(d2462965) SHA1(45d2c9aaac681315d2e5cb39be151467f278e395) ) ROM_END -ROM_START( gt3dl192 ) /* Version 1.92 for the 3 tier type PCB with long ROM board P/N 1080 REV 5 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dl192 ) // Version 1.92 for the 3 tier type PCB with long ROM board P/N 1080 REV 5 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.92l.prom0", 0x00000, 0x80000, CRC(b449b939) SHA1(d5845fa4ed2702c2f05bfd22fe436c3b85ace0f8) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.92l.prom1", 0x00001, 0x80000, CRC(ff986e67) SHA1(1d03aa7bf6a301eedb2beef93d54b58abe4e63a6) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.92l.prom2", 0x00002, 0x80000, CRC(eb959447) SHA1(62a6382c5dc7d97b19c2e21ed47bb87d530cb43d) ) ROM_LOAD32_BYTE( "gtg3_prom3_v1.92l.prom3", 0x00003, 0x80000, CRC(0265b798) SHA1(44c73f66f6b29a3cc6208cd7fde00605b61f8f15) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3-snd_u23_v2.2.u23", 0x10000, 0x18000, CRC(26fe2e92) SHA1(437ca0ea94dc0fa215f5375daa41d3dfe9bb17e0) ) /* actually labeled as "GTG3-SND(U23) v2.2" */ + ROM_LOAD( "gtg3-snd_u23_v2.2.u23", 0x10000, 0x18000, CRC(26fe2e92) SHA1(437ca0ea94dc0fa215f5375daa41d3dfe9bb17e0) ) // actually labeled as "GTG3-SND(U23) v2.2" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3619,7 +3592,7 @@ ROM_START( gt3dl192 ) /* Version 1.92 for the 3 tier type PCB with long ROM boar ROM_LOAD32_BYTE( "gtg3_grom2_3.grm2_3", 0x400003, 0x80000, CRC(77869bcf) SHA1(dde3b64578b79a94c7e346561a691229bbcfadac) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) /* Ensoniq 2MX16U 1350901801 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) // Ensoniq 2MX16U 1350901801 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "gtg3_srom1.srom1", 0x000000, 0x80000, CRC(ac669434) SHA1(6941884c553515f5bc06af772897835a44aa8e4c) ) @@ -3629,18 +3602,18 @@ ROM_START( gt3dl192 ) /* Version 1.92 for the 3 tier type PCB with long ROM boar ROM_LOAD16_BYTE( "gtg3_srom3.srom3", 0x000000, 0x20000, CRC(d2462965) SHA1(45d2c9aaac681315d2e5cb39be151467f278e395) ) ROM_END -ROM_START( gt3dl191 ) /* Version 1.91 for the 3 tier type PCB with long ROM board P/N 1080 REV 5 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dl191 ) // Version 1.91 for the 3 tier type PCB with long ROM board P/N 1080 REV 5 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.91l.prom0", 0x00000, 0x80000, CRC(a3ea30d8) SHA1(675ca44b3a4fb542dfe4e9ce8463d2fc91491405) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.91l.prom1", 0x00001, 0x80000, CRC(3aa87e56) SHA1(67c8bb5a869e1ff816e3d1da74fe4de4b1b3203c) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.91l.prom2", 0x00002, 0x80000, CRC(41720e87) SHA1(c699b9ac892649004f1437bd3fe68a23b5d7ba27) ) ROM_LOAD32_BYTE( "gtg3_prom3_v1.91l.prom3", 0x00003, 0x80000, CRC(30946139) SHA1(94ba341e13ffa27b56c12242b156fdf0698ad171) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3-snd_u23_v2.1.u23", 0x10000, 0x18000, CRC(6ae2646d) SHA1(0c62cc5f2911913167c5391648325409e7a3d892) ) /* actually labeled as "GTG3-SND(U23) v2.1" */ + ROM_LOAD( "gtg3-snd_u23_v2.1.u23", 0x10000, 0x18000, CRC(6ae2646d) SHA1(0c62cc5f2911913167c5391648325409e7a3d892) ) // actually labeled as "GTG3-SND(U23) v2.1" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3655,7 +3628,7 @@ ROM_START( gt3dl191 ) /* Version 1.91 for the 3 tier type PCB with long ROM boar ROM_LOAD32_BYTE( "gtg3_grom2_3.grm2_3", 0x400003, 0x80000, CRC(77869bcf) SHA1(dde3b64578b79a94c7e346561a691229bbcfadac) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) /* Ensoniq 2MX16U 1350901801 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) // Ensoniq 2MX16U 1350901801 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "gtg3_srom1.srom1", 0x000000, 0x80000, CRC(ac669434) SHA1(6941884c553515f5bc06af772897835a44aa8e4c) ) @@ -3665,18 +3638,18 @@ ROM_START( gt3dl191 ) /* Version 1.91 for the 3 tier type PCB with long ROM boar ROM_LOAD16_BYTE( "gtg3_srom3.srom3", 0x000000, 0x20000, CRC(d2462965) SHA1(45d2c9aaac681315d2e5cb39be151467f278e395) ) ROM_END -ROM_START( gt3dl19 ) /* Version 1.9 for the 3 tier type PCB with long ROM board P/N 1080 REV 5 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dl19 ) // Version 1.9 for the 3 tier type PCB with long ROM board P/N 1080 REV 5 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.9l.prom0", 0x00000, 0x80000, CRC(b6293cf6) SHA1(96cc035b004719d3f56f08efe67216474724e83f) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.9l.prom1", 0x00001, 0x80000, CRC(270b7936) SHA1(a101c94535dd3713f0e4c99c1079c2471bcd08d8) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.9l.prom2", 0x00002, 0x80000, CRC(3f892e81) SHA1(523146aa88c3fa4b7fbbf3f8b8c106b3e9c796ab) ) ROM_LOAD32_BYTE( "gtg3_prom3_v1.9l.prom3", 0x00003, 0x80000, CRC(b63ef2c0) SHA1(0238aeaa97da877675c94c7ecde1f29d3c9a0251) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3-snd_u23_v2.0.u23", 0x10000, 0x18000, CRC(3f69a9ea) SHA1(02610aa31f8b3422e15acd7b5e66ecfc4f53aba4) ) /* actually labeled as "GTG3-SND(U23) v2.0" */ + ROM_LOAD( "gtg3-snd_u23_v2.0.u23", 0x10000, 0x18000, CRC(3f69a9ea) SHA1(02610aa31f8b3422e15acd7b5e66ecfc4f53aba4) ) // actually labeled as "GTG3-SND(U23) v2.0" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3691,7 +3664,7 @@ ROM_START( gt3dl19 ) /* Version 1.9 for the 3 tier type PCB with long ROM board ROM_LOAD32_BYTE( "gtg3_grom2_3.grm2_3", 0x400003, 0x80000, CRC(77869bcf) SHA1(dde3b64578b79a94c7e346561a691229bbcfadac) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) /* Ensoniq 2MX16U 1350901801 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2mx16u.rom0", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) // Ensoniq 2MX16U 1350901801 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "gtg3_srom1.srom1", 0x000000, 0x80000, CRC(ac669434) SHA1(6941884c553515f5bc06af772897835a44aa8e4c) ) @@ -3701,18 +3674,18 @@ ROM_START( gt3dl19 ) /* Version 1.9 for the 3 tier type PCB with long ROM board ROM_LOAD16_BYTE( "gtg3_srom3.srom3", 0x000000, 0x20000, CRC(d2462965) SHA1(45d2c9aaac681315d2e5cb39be151467f278e395) ) ROM_END -ROM_START( gt3dv18 ) /* Version 1.8 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dv18 ) // Version 1.8 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.8.prom0", 0x00000, 0x80000, CRC(0fa53c40) SHA1(45e339dede03d749c00f9459eebb26de4965c31c) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.8.prom1", 0x00001, 0x80000, CRC(bef2cbe3) SHA1(ffed58db023d05817bd7a32958699115f4fbf37d) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.8.prom2", 0x00002, 0x80000, CRC(1d5fb128) SHA1(bef5ff44836a5d32431c4ef998c9041b5c769281) ) ROM_LOAD32_BYTE( "gtg3_prom3_v1.8.prom3", 0x00003, 0x80000, CRC(5542c335) SHA1(8e906512dc9c14f99c52faaa4315a7839dbd648c) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3-snd_u23_v1.1.u23", 0x10000, 0x18000, CRC(2f4cde9f) SHA1(571597e992e334e87307830e4a6a439c9d15fa76) ) /* actually labeled as "GTG3-SND(U23) v1.1" */ + ROM_LOAD( "gtg3-snd_u23_v1.1.u23", 0x10000, 0x18000, CRC(2f4cde9f) SHA1(571597e992e334e87307830e4a6a439c9d15fa76) ) // actually labeled as "GTG3-SND(U23) v1.1" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3727,7 +3700,7 @@ ROM_START( gt3dv18 ) /* Version 1.8 for the 3 tier type PCB with short ROM board ROM_LOAD32_BYTE( "gtg3_grom2_3.grm2_3", 0x400003, 0x80000, CRC(77869bcf) SHA1(dde3b64578b79a94c7e346561a691229bbcfadac) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "gtg3_srom1.srom1", 0x000000, 0x80000, CRC(ac669434) SHA1(6941884c553515f5bc06af772897835a44aa8e4c) ) @@ -3737,18 +3710,18 @@ ROM_START( gt3dv18 ) /* Version 1.8 for the 3 tier type PCB with short ROM board ROM_LOAD16_BYTE( "gtg3_srom3.srom3", 0x000000, 0x20000, CRC(d2462965) SHA1(45d2c9aaac681315d2e5cb39be151467f278e395) ) ROM_END -ROM_START( gt3dv17 ) /* Version 1.7 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dv17 ) // Version 1.7 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.7.prom0", 0x00000, 0x80000, CRC(9a6fc839) SHA1(bd9a98f4a29786a3f28abb4e7eca63f62bb0dcf7) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.7.prom1", 0x00001, 0x80000, CRC(26606578) SHA1(791782d4d99c2239e2967a8cf1467bad831b7500) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.7.prom2", 0x00002, 0x80000, CRC(9c4d348b) SHA1(04167b9c4f3c99c5a1e0396c094cb9185c8d17c1) ) ROM_LOAD32_BYTE( "gtg3_prom3_v1.7.prom3", 0x00003, 0x80000, CRC(53b1d6e7) SHA1(f1662275d45316a892d7722cd2fa1c2259acbcfa) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3-snd_u23_v1.1.u23", 0x10000, 0x18000, CRC(2f4cde9f) SHA1(571597e992e334e87307830e4a6a439c9d15fa76) ) /* actually labeled as "GTG3-SND(U23) v1.1" */ + ROM_LOAD( "gtg3-snd_u23_v1.1.u23", 0x10000, 0x18000, CRC(2f4cde9f) SHA1(571597e992e334e87307830e4a6a439c9d15fa76) ) // actually labeled as "GTG3-SND(U23) v1.1" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3763,7 +3736,7 @@ ROM_START( gt3dv17 ) /* Version 1.7 for the 3 tier type PCB with short ROM board ROM_LOAD32_BYTE( "gtg3_grom2_3.grm2_3", 0x400003, 0x80000, CRC(77869bcf) SHA1(dde3b64578b79a94c7e346561a691229bbcfadac) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "gtg3_srom1.srom1", 0x000000, 0x80000, CRC(ac669434) SHA1(6941884c553515f5bc06af772897835a44aa8e4c) ) @@ -3773,18 +3746,18 @@ ROM_START( gt3dv17 ) /* Version 1.7 for the 3 tier type PCB with short ROM board ROM_LOAD16_BYTE( "gtg3_srom3.srom3", 0x000000, 0x20000, CRC(d2462965) SHA1(45d2c9aaac681315d2e5cb39be151467f278e395) ) ROM_END -ROM_START( gt3dv16 ) /* Version 1.6 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dv16 ) // Version 1.6 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.6.prom0", 0x00000, 0x80000, CRC(99d9a7e7) SHA1(62621fba9e9b1e1d11038238ebad8755db58ff21) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.6.prom1", 0x00001, 0x80000, CRC(0ec4b307) SHA1(4e425462a32c7b85b02a694d6c65e69a0eb29ce8) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.6.prom2", 0x00002, 0x80000, CRC(02ce6085) SHA1(8148a0d67646ec1ecb440e087ac20d3e64bf525d) ) ROM_LOAD32_BYTE( "gtg3_prom3_v1.6.prom3", 0x00003, 0x80000, CRC(e77fa8a2) SHA1(34c6a5e24c115fdbb33d605aad07c7861ee7f3c8) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3-snd_u23_v1.1.u23", 0x10000, 0x18000, CRC(2f4cde9f) SHA1(571597e992e334e87307830e4a6a439c9d15fa76) ) /* actually labeled as "GTG3-SND(U23) v1.1" */ + ROM_LOAD( "gtg3-snd_u23_v1.1.u23", 0x10000, 0x18000, CRC(2f4cde9f) SHA1(571597e992e334e87307830e4a6a439c9d15fa76) ) // actually labeled as "GTG3-SND(U23) v1.1" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3799,7 +3772,7 @@ ROM_START( gt3dv16 ) /* Version 1.6 for the 3 tier type PCB with short ROM board ROM_LOAD32_BYTE( "gtg3_grom2_3.grm2_3", 0x400003, 0x80000, CRC(77869bcf) SHA1(dde3b64578b79a94c7e346561a691229bbcfadac) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "gtg3_srom1.srom1", 0x000000, 0x80000, CRC(ac669434) SHA1(6941884c553515f5bc06af772897835a44aa8e4c) ) @@ -3809,18 +3782,18 @@ ROM_START( gt3dv16 ) /* Version 1.6 for the 3 tier type PCB with short ROM board ROM_LOAD16_BYTE( "gtg3_srom3.srom3", 0x000000, 0x20000, CRC(d2462965) SHA1(45d2c9aaac681315d2e5cb39be151467f278e395) ) ROM_END -ROM_START( gt3dv15 ) /* Version 1.5 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dv15 ) // Version 1.5 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.5.prom0", 0x00000, 0x80000, CRC(51a5e811) SHA1(ee5399e6f8ab2955c875adcb8ec7a859e42daa01) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.5.prom1", 0x00001, 0x80000, CRC(1e8744ad) SHA1(2c38857f88f16b881b93db91ef9d15b710f2d40c) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.5.prom2", 0x00002, 0x80000, CRC(e465c813) SHA1(b836cc01c6fb86980dda2d4418cd1ecb9899cb17) ) ROM_LOAD32_BYTE( "gtg3_prom3_v1.5.prom3", 0x00003, 0x80000, CRC(3b25e198) SHA1(5b8cd9771126739e8834c11d0d6ae08b2990e3b0) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3-snd_u23_v1.1.u23", 0x10000, 0x18000, CRC(2f4cde9f) SHA1(571597e992e334e87307830e4a6a439c9d15fa76) ) /* actually labeled as "GTG3-SND(U23) v1.1" */ + ROM_LOAD( "gtg3-snd_u23_v1.1.u23", 0x10000, 0x18000, CRC(2f4cde9f) SHA1(571597e992e334e87307830e4a6a439c9d15fa76) ) // actually labeled as "GTG3-SND(U23) v1.1" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3835,7 +3808,7 @@ ROM_START( gt3dv15 ) /* Version 1.5 for the 3 tier type PCB with short ROM board ROM_LOAD32_BYTE( "gtg3_grom2_3.grm2_3", 0x400003, 0x80000, CRC(77869bcf) SHA1(dde3b64578b79a94c7e346561a691229bbcfadac) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "gtg3_srom1.srom1", 0x000000, 0x80000, CRC(ac669434) SHA1(6941884c553515f5bc06af772897835a44aa8e4c) ) @@ -3845,18 +3818,18 @@ ROM_START( gt3dv15 ) /* Version 1.5 for the 3 tier type PCB with short ROM board ROM_LOAD16_BYTE( "gtg3_srom3.srom3", 0x000000, 0x20000, CRC(d2462965) SHA1(45d2c9aaac681315d2e5cb39be151467f278e395) ) ROM_END -ROM_START( gt3dv14 ) /* Version 1.4 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dv14 ) // Version 1.4 for the 3 tier type PCB with short ROM board P/N 1069 REV 2 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v1.4.prom0", 0x00000, 0x80000, CRC(396934a7) SHA1(061941e7472f6386be7fa0675ba109dfccb6d35f) ) ROM_LOAD32_BYTE( "gtg3_prom1_v1.4.prom1", 0x00001, 0x80000, CRC(5ba19b8d) SHA1(31d6c9c89ad231fb99d2ff762660fa390c53e129) ) ROM_LOAD32_BYTE( "gtg3_prom2_v1.4.prom2", 0x00002, 0x80000, CRC(23991fcf) SHA1(5ba460ed88cebe1656501cadff27f2c0c90b721c) ) ROM_LOAD32_BYTE( "gtg3_prom3_v1.4.prom3", 0x00003, 0x80000, CRC(2f7b5a26) SHA1(d0e676fc03ff7592f2d6bae806bee242e42c4452) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3-snd_u23_v1.0.u23", 0x10000, 0x18000, CRC(4f106cd1) SHA1(a3c3e6c649084fe6472e0a1f95d538c67d29098c) ) /* actually labeled as "GTG3-SND(U23) v1.0" */ + ROM_LOAD( "gtg3-snd_u23_v1.0.u23", 0x10000, 0x18000, CRC(4f106cd1) SHA1(a3c3e6c649084fe6472e0a1f95d538c67d29098c) ) // actually labeled as "GTG3-SND(U23) v1.0" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3871,7 +3844,7 @@ ROM_START( gt3dv14 ) /* Version 1.4 for the 3 tier type PCB with short ROM board ROM_LOAD32_BYTE( "gtg3_grom2_3.grm2_3", 0x400003, 0x80000, CRC(77869bcf) SHA1(dde3b64578b79a94c7e346561a691229bbcfadac) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) /* Ensoniq 2m 1350901601 at "ROM0" */ + ROM_LOAD16_BYTE( "ensoniq_2m.rom0", 0x000000, 0x200000, CRC(9fdc4825) SHA1(71e5255c66d9010be7e6f27916b605441fc53839) ) // Ensoniq 2m 1350901601 at "ROM0" ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "gtg3_srom1.srom1", 0x000000, 0x80000, CRC(ac669434) SHA1(6941884c553515f5bc06af772897835a44aa8e4c) ) @@ -3881,8 +3854,8 @@ ROM_START( gt3dv14 ) /* Version 1.4 for the 3 tier type PCB with short ROM board ROM_LOAD16_BYTE( "gtg3_srom3.srom3", 0x000000, 0x20000, CRC(d2462965) SHA1(45d2c9aaac681315d2e5cb39be151467f278e395) ) ROM_END -ROM_START( gt3dt231 ) /* Version 2.31 Tournament Edition (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dt231 ) // Version 2.31 Tournament Edition (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v2.31t.prom0", 0x00000, 0x100000, CRC(92a5c3e9) SHA1(a20c9ffb9b08eff1d59b77d08e6411275c58d932) ) ROM_LOAD32_BYTE( "gtg3_prom1_v2.31t.prom1", 0x00001, 0x100000, CRC(a3b60226) SHA1(2b78fb2917ad66883d2353d82f48b5aeb599d444) ) ROM_LOAD32_BYTE( "gtg3_prom2_v2.31t.prom2", 0x00002, 0x100000, CRC(d1659616) SHA1(7035ce46bde63024237e6c4777ddd10b58caeb98) ) @@ -3892,7 +3865,7 @@ ROM_START( gt3dt231 ) /* Version 2.31 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD( "gtg3nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gtg3_grom0_0.grm0_0", 0x000000, 0x80000, CRC(1b10379d) SHA1(b6d61771e2bc3909ea4229777867b217a3e9e580) ) ROM_LOAD32_BYTE( "gtg3_grom0_1.grm0_1", 0x000001, 0x80000, CRC(3b852e1a) SHA1(4b3653d55c52fc2eb5438d1604247a8e68d569a5) ) ROM_LOAD32_BYTE( "gtg3_grom0_2.grm0_2", 0x000002, 0x80000, CRC(d43ffb35) SHA1(748be07e03bbbb40cd7a725c708cacc46f33d9ca) ) @@ -3901,7 +3874,7 @@ ROM_START( gt3dt231 ) /* Version 2.31 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD32_BYTE( "gtg3_grom1_1.grm1_1", 0x200001, 0x80000, CRC(0aadfad2) SHA1(56a283b30a13b77ec53b7ae2b4129d44b7fa25d4) ) ROM_LOAD32_BYTE( "gtg3_grom1_2.grm1_2", 0x200002, 0x80000, CRC(27871980) SHA1(fe473d12cb4805e25dcac8f9ae187891936b961b) ) ROM_LOAD32_BYTE( "gtg3_grom1_3.grm1_3", 0x200003, 0x80000, CRC(7dbc242b) SHA1(9aa5074cad633446e0110a1a3d9c6e1f2158070a) ) - ROM_LOAD32_BYTE( "gtg3_grom2_0_t.grm2_0", 0x400000, 0x80000, CRC(80ae7148) SHA1(e19d3390a2a0dad260d770fdbbb64d1f8e43d53f) ) /* actually labeled as "GTG3 GROM2_0 T" ect */ + ROM_LOAD32_BYTE( "gtg3_grom2_0_t.grm2_0", 0x400000, 0x80000, CRC(80ae7148) SHA1(e19d3390a2a0dad260d770fdbbb64d1f8e43d53f) ) // actually labeled as "GTG3 GROM2_0 T" ect ROM_LOAD32_BYTE( "gtg3_grom2_1_t.grm2_1", 0x400001, 0x80000, CRC(0f85a618) SHA1(d9ced21c20f9ed6b7f19e7645d75b239ea709b79) ) ROM_LOAD32_BYTE( "gtg3_grom2_2_t.grm2_2", 0x400002, 0x80000, CRC(09ca5fbf) SHA1(6a6ed4d5d76035d8acc33c6494fba6012194362e) ) ROM_LOAD32_BYTE( "gtg3_grom2_3_t.grm2_3", 0x400003, 0x80000, CRC(d136853a) SHA1(0777d6bfab9e3d57c2a61d058fd185fc1f547698) ) @@ -3911,8 +3884,8 @@ ROM_START( gt3dt231 ) /* Version 2.31 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD16_BYTE( "gtg3_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt3dt211 ) /* Version 2.11 Tournament Edition (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt3dt211 ) // Version 2.11 Tournament Edition (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg3_prom0_v2.11t.prom0", 0x00000, 0x100000, CRC(54360fdf) SHA1(05687f7f41f719458ee72b4517c7be3e33ee80cf) ) ROM_LOAD32_BYTE( "gtg3_prom1_v2.11t.prom1", 0x00001, 0x100000, CRC(9142ebb7) SHA1(ae3c9bf1a954c2f790cdb7953a6fea3d1d277aa9) ) ROM_LOAD32_BYTE( "gtg3_prom2_v2.11t.prom2", 0x00002, 0x100000, CRC(058b906a) SHA1(ff2cb3b955f7ce8041c967ed08b92e355d9abe2d) ) @@ -3922,8 +3895,8 @@ ROM_START( gt3dt211 ) /* Version 2.11 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD( "gtg3nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) - ROM_LOAD32_BYTE( "gtg3_grom0_0++.grm0_0", 0x000000, 0x100000, CRC(22c481b7) SHA1(399bffec5e3b27aec2ebd8d7d49689b92f453e39) ) /* actually labeled "GTG3 GROM0_0**" ect */ + ROM_REGION( 0x600000, "grom", 0 ) + ROM_LOAD32_BYTE( "gtg3_grom0_0++.grm0_0", 0x000000, 0x100000, CRC(22c481b7) SHA1(399bffec5e3b27aec2ebd8d7d49689b92f453e39) ) // actually labeled "GTG3 GROM0_0**" ect ROM_LOAD32_BYTE( "gtg3_grom0_1++.grm0_1", 0x000001, 0x100000, CRC(40e4032b) SHA1(e8a39ce415cf2326464efc5af23e9b7921621932) ) ROM_LOAD32_BYTE( "gtg3_grom0_2++.grm0_2", 0x000002, 0x100000, CRC(67a02ef9) SHA1(4f9e5217eeaf68fc72af1dc9e3a16d876de8d11d) ) ROM_LOAD32_BYTE( "gtg3_grom0_3++.grm0_3", 0x000003, 0x100000, CRC(1173a710) SHA1(1f612c1efbf38796707f5b5fecf9d4044691f031) ) @@ -3931,7 +3904,7 @@ ROM_START( gt3dt211 ) /* Version 2.11 Tournament Edition (PCB P/N 1083 Rev 2) */ The above 4 ROMs have the same exact data as the other sets, but in 8 meg ROMs instead of 4 meg ROMs. This is the only set that specifically checks for these ROMs in this format */ - ROM_LOAD32_BYTE( "gtg3_grom1_0+.grm1_0", 0x400000, 0x080000, CRC(80ae7148) SHA1(e19d3390a2a0dad260d770fdbbb64d1f8e43d53f) ) /* actually labeled "GTG3 GROM1_0*" ect */ + ROM_LOAD32_BYTE( "gtg3_grom1_0+.grm1_0", 0x400000, 0x080000, CRC(80ae7148) SHA1(e19d3390a2a0dad260d770fdbbb64d1f8e43d53f) ) // actually labeled "GTG3 GROM1_0*" ect ROM_LOAD32_BYTE( "gtg3_grom1_1+.grm1_1", 0x400001, 0x080000, CRC(0f85a618) SHA1(d9ced21c20f9ed6b7f19e7645d75b239ea709b79) ) ROM_LOAD32_BYTE( "gtg3_grom1_2+.grm1_2", 0x400002, 0x080000, CRC(09ca5fbf) SHA1(6a6ed4d5d76035d8acc33c6494fba6012194362e) ) ROM_LOAD32_BYTE( "gtg3_grom1_3+.grm1_3", 0x400003, 0x080000, CRC(d136853a) SHA1(0777d6bfab9e3d57c2a61d058fd185fc1f547698) ) @@ -3942,8 +3915,8 @@ ROM_START( gt3dt211 ) /* Version 2.11 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_END -ROM_START( gt97 ) /* Version 1.30 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt97 ) // Version 1.30 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt97_prom0_v1.30.prom0", 0x00000, 0x80000, CRC(7490ba4e) SHA1(b833d4175617727b3dc80e242457996a2efb844c) ) ROM_LOAD32_BYTE( "gt97_prom1_v1.30.prom1", 0x00001, 0x80000, CRC(71f9c5f3) SHA1(c472aa1bcc217656f409614b73f0b7662215c202) ) ROM_LOAD32_BYTE( "gt97_prom2_v1.30.prom2", 0x00002, 0x80000, CRC(8292b51a) SHA1(f8167b0aef87fb286006a17043de041c71afe41d) ) @@ -3953,7 +3926,7 @@ ROM_START( gt97 ) /* Version 1.30 */ ROM_LOAD( "gt97nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt97_grom0_0.grm0_0", 0x000000, 0x80000, CRC(81784aaf) SHA1(9544ed2087ca5f71c747e3b782513614937a51ed) ) ROM_LOAD32_BYTE( "gt97_grom0_1.grm0_1", 0x000001, 0x80000, CRC(345bda44) SHA1(b6d66c99bd68396e1e94ece76989a6190571ae14) ) ROM_LOAD32_BYTE( "gt97_grom0_2.grm0_2", 0x000002, 0x80000, CRC(b2beb40d) SHA1(2b955919e7e5f9093eb3a856f93c39684437b371) ) @@ -3972,8 +3945,8 @@ ROM_START( gt97 ) /* Version 1.30 */ ROM_LOAD16_BYTE( "gt97_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt97v122 ) /* Version 1.22 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt97v122 ) // Version 1.22 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt97_prom0_v1.22.prom0", 0x00000, 0x80000, CRC(4a543c99) SHA1(733b904a964c02a118186eaa0e4ff7670fb8ffef) ) ROM_LOAD32_BYTE( "gt97_prom1_v1.22.prom1", 0x00001, 0x80000, CRC(27668628) SHA1(f0816f4589536de0dc30aef3eb2b99b2a22ddba4) ) ROM_LOAD32_BYTE( "gt97_prom2_v1.22.prom2", 0x00002, 0x80000, CRC(d73a769f) SHA1(41c2416424efbd9d341ab5eea1451402dca1c340) ) @@ -3983,7 +3956,7 @@ ROM_START( gt97v122 ) /* Version 1.22 */ ROM_LOAD( "gt97nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt97_grom0_0.grm0_0", 0x000000, 0x80000, CRC(81784aaf) SHA1(9544ed2087ca5f71c747e3b782513614937a51ed) ) ROM_LOAD32_BYTE( "gt97_grom0_1.grm0_1", 0x000001, 0x80000, CRC(345bda44) SHA1(b6d66c99bd68396e1e94ece76989a6190571ae14) ) ROM_LOAD32_BYTE( "gt97_grom0_2.grm0_2", 0x000002, 0x80000, CRC(b2beb40d) SHA1(2b955919e7e5f9093eb3a856f93c39684437b371) ) @@ -4002,8 +3975,8 @@ ROM_START( gt97v122 ) /* Version 1.22 */ ROM_LOAD16_BYTE( "gt97_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt97v121 ) /* Version 1.21 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt97v121 ) // Version 1.21 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt97_prom0_v1.21.prom0", 0x00000, 0x80000, CRC(a210a2c6) SHA1(40475387d731ab87957e6b46725195a057d42067) ) ROM_LOAD32_BYTE( "gt97_prom1_v1.21.prom1", 0x00001, 0x80000, CRC(a60806f8) SHA1(8695a24d7f186462bcfdfaa391896c7518717c57) ) ROM_LOAD32_BYTE( "gt97_prom2_v1.21.prom2", 0x00002, 0x80000, CRC(a97ce668) SHA1(b392a3aab1f1887adc31fb802e7d7bedeb36c3c9) ) @@ -4013,7 +3986,7 @@ ROM_START( gt97v121 ) /* Version 1.21 */ ROM_LOAD( "gt97nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt97_grom0_0.grm0_0", 0x000000, 0x80000, CRC(81784aaf) SHA1(9544ed2087ca5f71c747e3b782513614937a51ed) ) ROM_LOAD32_BYTE( "gt97_grom0_1.grm0_1", 0x000001, 0x80000, CRC(345bda44) SHA1(b6d66c99bd68396e1e94ece76989a6190571ae14) ) ROM_LOAD32_BYTE( "gt97_grom0_2.grm0_2", 0x000002, 0x80000, CRC(b2beb40d) SHA1(2b955919e7e5f9093eb3a856f93c39684437b371) ) @@ -4032,21 +4005,21 @@ ROM_START( gt97v121 ) /* Version 1.21 */ ROM_LOAD16_BYTE( "gt97_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt97s121 ) /* Version 1.21S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt97s121 ) // Version 1.21S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt97_prom0_v1.21s.prom0", 0x00000, 0x80000, CRC(1143f45b) SHA1(df1f30d8054133be140f66219d69cd6bff74713a) ) ROM_LOAD32_BYTE( "gt97_prom1_v1.21s.prom1", 0x00001, 0x80000, CRC(e7cfb1ea) SHA1(8f6cf3cae920e07e14009a933821abe5b0ec6eb1) ) ROM_LOAD32_BYTE( "gt97_prom2_v1.21s.prom2", 0x00002, 0x80000, CRC(0cc24291) SHA1(941cada0f6c34ce8f6a23d5bf3ba052bb0edd9f1) ) ROM_LOAD32_BYTE( "gt97_prom3_v1.21s.prom3", 0x00003, 0x80000, CRC(922727c2) SHA1(57f8b772841fdf2fb575301698ed60b119392ec9) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) /* actually labeled "GTG3 NR(U23) V2.2" */ + ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) // actually labeled "GTG3 NR(U23) V2.2" ROM_CONTINUE( 0x08000, 0x08000 ) ROM_REGION( 0x2000, "pic", 0 ) // PIC16C54 ROM_LOAD( "itgfm-3 1997 it, inc", 0x0000, 0x1fff, CRC(2527dffc) SHA1(e7e1d9f2f813c5770cb0a340e68b700fc5c39991) ) // not hooked up - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt97_grom0_0.grm0_0", 0x000000, 0x80000, CRC(81784aaf) SHA1(9544ed2087ca5f71c747e3b782513614937a51ed) ) ROM_LOAD32_BYTE( "gt97_grom0_1.grm0_1", 0x000001, 0x80000, CRC(345bda44) SHA1(b6d66c99bd68396e1e94ece76989a6190571ae14) ) ROM_LOAD32_BYTE( "gt97_grom0_2.grm0_2", 0x000002, 0x80000, CRC(b2beb40d) SHA1(2b955919e7e5f9093eb3a856f93c39684437b371) ) @@ -4061,12 +4034,12 @@ ROM_START( gt97s121 ) /* Version 1.21S for the 3 tier type PCB with short ROM bo ROM_LOAD32_BYTE( "gt97_grom2_3.grm2_3", 0x400003, 0x80000, CRC(72e8ae60) SHA1(410da9970c50021f1724c8c51678691322eece92) ) ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) /* actually labeled "GTG3 SROM1 NR**" */ - ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) /* actually labeled "GTG3 SROM2 NR*" */ + ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) // actually labeled "GTG3 SROM1 NR**" + ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) // actually labeled "GTG3 SROM2 NR*" ROM_END -ROM_START( gt97v120 ) /* Version 1.20 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt97v120 ) // Version 1.20 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt97_prom0_v1.20.prom0", 0x00000, 0x80000, CRC(cdc4226f) SHA1(35ae8514f543f1cf45b303952f34a0a395733268) ) ROM_LOAD32_BYTE( "gt97_prom1_v1.20.prom1", 0x00001, 0x80000, CRC(b36fc43f) SHA1(43e5acbb751b216e8da0249eb3e596d8e453b0dc) ) ROM_LOAD32_BYTE( "gt97_prom2_v1.20.prom2", 0x00002, 0x80000, CRC(30b0d97e) SHA1(423808f0957cd259a33f5fad43222edbacb445ea) ) @@ -4076,7 +4049,7 @@ ROM_START( gt97v120 ) /* Version 1.20 */ ROM_LOAD( "gt97nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt97_grom0_0.grm0_0", 0x000000, 0x80000, CRC(81784aaf) SHA1(9544ed2087ca5f71c747e3b782513614937a51ed) ) ROM_LOAD32_BYTE( "gt97_grom0_1.grm0_1", 0x000001, 0x80000, CRC(345bda44) SHA1(b6d66c99bd68396e1e94ece76989a6190571ae14) ) ROM_LOAD32_BYTE( "gt97_grom0_2.grm0_2", 0x000002, 0x80000, CRC(b2beb40d) SHA1(2b955919e7e5f9093eb3a856f93c39684437b371) ) @@ -4095,8 +4068,8 @@ ROM_START( gt97v120 ) /* Version 1.20 */ ROM_LOAD16_BYTE( "gt97_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt97t243 ) /* Version 2.43 Tournament Edition (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt97t243 ) // Version 2.43 Tournament Edition (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt97_prom0_v2.43t.prom0", 0x00000, 0x100000, CRC(b8de60f1) SHA1(06b1f8b9d0b878d5a19e6756957e2df19e013ad6) ) ROM_LOAD32_BYTE( "gt97_prom1_v2.43t.prom1", 0x00001, 0x100000, CRC(8152e5d3) SHA1(2a4f8acc6a4e33864c97d5974e2230b1cf3632ea) ) ROM_LOAD32_BYTE( "gt97_prom2_v2.43t.prom2", 0x00002, 0x100000, CRC(b80061be) SHA1(9a6a6281690b3bd2eabb081467bfda074639fa6a) ) @@ -4106,7 +4079,7 @@ ROM_START( gt97t243 ) /* Version 2.43 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD( "gt97nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt97_grom0_0.grm0_0", 0x000000, 0x80000, CRC(81784aaf) SHA1(9544ed2087ca5f71c747e3b782513614937a51ed) ) ROM_LOAD32_BYTE( "gt97_grom0_1.grm0_1", 0x000001, 0x80000, CRC(345bda44) SHA1(b6d66c99bd68396e1e94ece76989a6190571ae14) ) ROM_LOAD32_BYTE( "gt97_grom0_2.grm0_2", 0x000002, 0x80000, CRC(b2beb40d) SHA1(2b955919e7e5f9093eb3a856f93c39684437b371) ) @@ -4125,8 +4098,8 @@ ROM_START( gt97t243 ) /* Version 2.43 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD16_BYTE( "gt97_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt97t240 ) /* Version 2.40 Tournament Edition (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt97t240 ) // Version 2.40 Tournament Edition (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt97_prom0_v2.40t.prom0", 0x00000, 0x100000, CRC(88a386d0) SHA1(003dbf784125b1a442f85e18f8161695dcacc3a8) ) ROM_LOAD32_BYTE( "gt97_prom1_v2.40t.prom1", 0x00001, 0x100000, CRC(b0d751aa) SHA1(7e6ab9c2bb0bd4f50360655c59f48c44f6135f4f) ) ROM_LOAD32_BYTE( "gt97_prom2_v2.40t.prom2", 0x00002, 0x100000, CRC(451be534) SHA1(2f78cdba607c4b936b5cbdb520757d038d9aa7a3) ) @@ -4136,7 +4109,7 @@ ROM_START( gt97t240 ) /* Version 2.40 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD( "gt97nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt97_grom0_0.grm0_0", 0x000000, 0x80000, CRC(81784aaf) SHA1(9544ed2087ca5f71c747e3b782513614937a51ed) ) ROM_LOAD32_BYTE( "gt97_grom0_1.grm0_1", 0x000001, 0x80000, CRC(345bda44) SHA1(b6d66c99bd68396e1e94ece76989a6190571ae14) ) ROM_LOAD32_BYTE( "gt97_grom0_2.grm0_2", 0x000002, 0x80000, CRC(b2beb40d) SHA1(2b955919e7e5f9093eb3a856f93c39684437b371) ) @@ -4156,8 +4129,8 @@ ROM_START( gt97t240 ) /* Version 2.40 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_END -ROM_START( gt98 ) /* Version 1.10 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt98 ) // Version 1.10 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt98_prom0_v1.10.prom0", 0x00000, 0x80000, CRC(dd93ab2a) SHA1(b7eb6331f781422d6d46babcc24a85ae36b25914) ) ROM_LOAD32_BYTE( "gt98_prom1_v1.10.prom1", 0x00001, 0x80000, CRC(6ea92960) SHA1(05d22ad6c6027afe7ebb3bc7c70f58d840ed3d4e) ) ROM_LOAD32_BYTE( "gt98_prom2_v1.10.prom2", 0x00002, 0x80000, CRC(27a8a15f) SHA1(f1eb7b24f9cb77877ceaa033abfde124e159cb2b) ) @@ -4167,7 +4140,7 @@ ROM_START( gt98 ) /* Version 1.10 */ ROM_LOAD( "gt98nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt98_grom0_0.grm0_0", 0x000000, 0x80000, CRC(2d79492b) SHA1(16d66d937c34ddf616f31cba0d285326a31cad85) ) ROM_LOAD32_BYTE( "gt98_grom0_1.grm0_1", 0x000001, 0x80000, CRC(79afda1a) SHA1(77a9883f14b58ceece9c76ce88bb900bc4accf25) ) ROM_LOAD32_BYTE( "gt98_grom0_2.grm0_2", 0x000002, 0x80000, CRC(8c381f56) SHA1(41a5b70f9e524a1cade031f864350ec75c08c956) ) @@ -4186,8 +4159,8 @@ ROM_START( gt98 ) /* Version 1.10 */ ROM_LOAD16_BYTE( "gt98_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt98v100 ) /* Version 1.00 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt98v100 ) // Version 1.00 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt98_prom0_v1.00.prom0", 0x00000, 0x80000, CRC(f2dc0a6c) SHA1(59f7f8c7feb30c6416cb4ac2299f2c620d4c4e5f) ) ROM_LOAD32_BYTE( "gt98_prom1_v1.00.prom1", 0x00001, 0x80000, CRC(b0ca22f3) SHA1(f849b42d449e07a12e0bc20b98693125506c7ed6) ) ROM_LOAD32_BYTE( "gt98_prom2_v1.00.prom2", 0x00002, 0x80000, CRC(f940acdc) SHA1(3b5f5f299dbd7d4e0bef4aac8787f955f31754c2) ) @@ -4197,7 +4170,7 @@ ROM_START( gt98v100 ) /* Version 1.00 */ ROM_LOAD( "gt98nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt98_grom0_0.grm0_0", 0x000000, 0x80000, CRC(2d79492b) SHA1(16d66d937c34ddf616f31cba0d285326a31cad85) ) ROM_LOAD32_BYTE( "gt98_grom0_1.grm0_1", 0x000001, 0x80000, CRC(79afda1a) SHA1(77a9883f14b58ceece9c76ce88bb900bc4accf25) ) ROM_LOAD32_BYTE( "gt98_grom0_2.grm0_2", 0x000002, 0x80000, CRC(8c381f56) SHA1(41a5b70f9e524a1cade031f864350ec75c08c956) ) @@ -4216,8 +4189,8 @@ ROM_START( gt98v100 ) /* Version 1.00 */ ROM_LOAD16_BYTE( "gt98_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt98c100 ) /* Version 1.00C */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt98c100 ) // Version 1.00C + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt98_prom0_v1.00c.prom0", 0x00000, 0x80000, CRC(bb508580) SHA1(6ba243386a32dbe9b14b3cef8d9ce9fac8ec4b28) ) ROM_LOAD32_BYTE( "gt98_prom1_v1.00c.prom1", 0x00001, 0x80000, CRC(0e414c17) SHA1(08dae822c4e0b3c5c7e7f09e77e01d3663067927) ) ROM_LOAD32_BYTE( "gt98_prom2_v1.00c.prom2", 0x00002, 0x80000, CRC(628e84eb) SHA1(b31b74bee1ab4eda7c8f1c4e62bd61837b2c9f1f) ) @@ -4227,7 +4200,7 @@ ROM_START( gt98c100 ) /* Version 1.00C */ ROM_LOAD( "gt98nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt98_grom0_0.grm0_0", 0x000000, 0x80000, CRC(2d79492b) SHA1(16d66d937c34ddf616f31cba0d285326a31cad85) ) ROM_LOAD32_BYTE( "gt98_grom0_1.grm0_1", 0x000001, 0x80000, CRC(79afda1a) SHA1(77a9883f14b58ceece9c76ce88bb900bc4accf25) ) ROM_LOAD32_BYTE( "gt98_grom0_2.grm0_2", 0x000002, 0x80000, CRC(8c381f56) SHA1(41a5b70f9e524a1cade031f864350ec75c08c956) ) @@ -4246,18 +4219,18 @@ ROM_START( gt98c100 ) /* Version 1.00C */ ROM_LOAD16_BYTE( "gt98_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt98s100 ) /* Version 1.00S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt98s100 ) // Version 1.00S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt98_prom0_v1.00s.prom0", 0x00000, 0x80000, CRC(962ff444) SHA1(f9abefaee82f811ef1d3df45782edd5bcb1da23a) ) ROM_LOAD32_BYTE( "gt98_prom1_v1.00s.prom1", 0x00001, 0x80000, CRC(be0ac375) SHA1(40b99004a7698866eeb0e2defda52e61be455f36) ) ROM_LOAD32_BYTE( "gt98_prom2_v1.00s.prom2", 0x00002, 0x80000, CRC(304e881c) SHA1(582ff2c1c03853eec9830663d5263b499e68f285) ) ROM_LOAD32_BYTE( "gt98_prom3_v1.00s.prom3", 0x00003, 0x80000, CRC(ac04ea81) SHA1(f8a7c896cb0af747bab49b3438f52aaa1b0dfc73) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) /* actually labeled "GTG3 NR(U23) V2.2" */ + ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) // actually labeled "GTG3 NR(U23) V2.2" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt98_grom0_0.grm0_0", 0x000000, 0x80000, CRC(2d79492b) SHA1(16d66d937c34ddf616f31cba0d285326a31cad85) ) ROM_LOAD32_BYTE( "gt98_grom0_1.grm0_1", 0x000001, 0x80000, CRC(79afda1a) SHA1(77a9883f14b58ceece9c76ce88bb900bc4accf25) ) ROM_LOAD32_BYTE( "gt98_grom0_2.grm0_2", 0x000002, 0x80000, CRC(8c381f56) SHA1(41a5b70f9e524a1cade031f864350ec75c08c956) ) @@ -4272,12 +4245,12 @@ ROM_START( gt98s100 ) /* Version 1.00S for the 3 tier type PCB with short ROM bo ROM_LOAD32_BYTE( "gt98_grom2_3.grm2_3", 0x400003, 0x80000, CRC(78745131) SHA1(c430be4cb650f1f6265406ca8fcad8df809282f5) ) ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) /* actually labeled "GTG3 SROM1 NR**" */ - ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) /* actually labeled "GTG3 SROM2 NR*" */ + ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) // actually labeled "GTG3 SROM1 NR**" + ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) // actually labeled "GTG3 SROM2 NR*" ROM_END -ROM_START( gt98t303 ) /* Version 3.03 Tournament Edition (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt98t303 ) // Version 3.03 Tournament Edition (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt98_prom0_v3.03t.prom0", 0x00000, 0x100000, CRC(e3879c30) SHA1(fa9dd2df8969a98a3c87c6a96594e1f49ca7ec91) ) ROM_LOAD32_BYTE( "gt98_prom1_v3.03t.prom1", 0x00001, 0x100000, CRC(6a42ab1e) SHA1(9d8c5a48f0b91dcc8898913eec3d09ddded0f43d) ) ROM_LOAD32_BYTE( "gt98_prom2_v3.03t.prom2", 0x00002, 0x100000, CRC(a695c1bc) SHA1(e10ce3a97c28ba439c06b2cbd3ebe0cb456687a9) ) @@ -4287,7 +4260,7 @@ ROM_START( gt98t303 ) /* Version 3.03 Tournament Edition (PCB P/N 1083 Rev 2) ROM_LOAD( "gt98nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt98_grom0_0.grm0_0", 0x000000, 0x80000, CRC(2d79492b) SHA1(16d66d937c34ddf616f31cba0d285326a31cad85) ) ROM_LOAD32_BYTE( "gt98_grom0_1.grm0_1", 0x000001, 0x80000, CRC(79afda1a) SHA1(77a9883f14b58ceece9c76ce88bb900bc4accf25) ) ROM_LOAD32_BYTE( "gt98_grom0_2.grm0_2", 0x000002, 0x80000, CRC(8c381f56) SHA1(41a5b70f9e524a1cade031f864350ec75c08c956) ) @@ -4306,8 +4279,8 @@ ROM_START( gt98t303 ) /* Version 3.03 Tournament Edition (PCB P/N 1083 Rev 2) ROM_LOAD16_BYTE( "gt98_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt98t302 ) /* Version 3.02 Tournament Edition (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt98t302 ) // Version 3.02 Tournament Edition (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt98_prom0_v3.02t.prom0", 0x00000, 0x100000, CRC(744e0d9b) SHA1(affb05390485d3523478199493e15f32359511f1) ) ROM_LOAD32_BYTE( "gt98_prom1_v3.02t.prom1", 0x00001, 0x100000, CRC(b25508a1) SHA1(a744a212cb95852e1b7eb3051bb12a448e161ca7) ) ROM_LOAD32_BYTE( "gt98_prom2_v3.02t.prom2", 0x00002, 0x100000, CRC(98a3466e) SHA1(a0f8a897cb7b4752c63079c04725e7800e71ae13) ) @@ -4317,7 +4290,7 @@ ROM_START( gt98t302 ) /* Version 3.02 Tournament Edition (PCB P/N 1083 Rev 2) ROM_LOAD( "gt98nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt98_grom0_0.grm0_0", 0x000000, 0x80000, CRC(2d79492b) SHA1(16d66d937c34ddf616f31cba0d285326a31cad85) ) ROM_LOAD32_BYTE( "gt98_grom0_1.grm0_1", 0x000001, 0x80000, CRC(79afda1a) SHA1(77a9883f14b58ceece9c76ce88bb900bc4accf25) ) ROM_LOAD32_BYTE( "gt98_grom0_2.grm0_2", 0x000002, 0x80000, CRC(8c381f56) SHA1(41a5b70f9e524a1cade031f864350ec75c08c956) ) @@ -4336,8 +4309,8 @@ ROM_START( gt98t302 ) /* Version 3.02 Tournament Edition (PCB P/N 1083 Rev 2) ROM_LOAD16_BYTE( "gt98_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gtdiamond ) /* Version 3.05TL Tournament Edition (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gtdiamond ) // Version 3.05TL Tournament Edition (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt98_golf_elc_prom0_v3.05tl.prom0", 0x00000, 0x100000, CRC(b6b0e3b8) SHA1(e2ff88f205ad902d78b8c52ed554eb612c300d3c) ) ROM_LOAD32_BYTE( "gt98_golf_elc_prom1_v3.05tl.prom1", 0x00001, 0x100000, CRC(ba15f3a3) SHA1(9ebe81c3f7f8526bf73c6728071905e7803b4101) ) ROM_LOAD32_BYTE( "gt98_golf_elc_prom2_v3.05tl.prom2", 0x00002, 0x100000, CRC(015e1c94) SHA1(836f84272133d47a1742488e12a35af1832999bc) ) @@ -4347,7 +4320,7 @@ ROM_START( gtdiamond ) /* Version 3.05TL Tournament Edition (PCB P/N 1083 Rev 2 ROM_LOAD( "gt98nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt98_grom0_0.grm0_0", 0x000000, 0x80000, CRC(2d79492b) SHA1(16d66d937c34ddf616f31cba0d285326a31cad85) ) ROM_LOAD32_BYTE( "gt98_grom0_1.grm0_1", 0x000001, 0x80000, CRC(79afda1a) SHA1(77a9883f14b58ceece9c76ce88bb900bc4accf25) ) ROM_LOAD32_BYTE( "gt98_grom0_2.grm0_2", 0x000002, 0x80000, CRC(8c381f56) SHA1(41a5b70f9e524a1cade031f864350ec75c08c956) ) @@ -4357,9 +4330,9 @@ ROM_START( gtdiamond ) /* Version 3.05TL Tournament Edition (PCB P/N 1083 Rev 2 ROM_LOAD32_BYTE( "gt98_grom1_2.grm1_2", 0x200002, 0x80000, CRC(9c113abc) SHA1(8cb23da237dce73bbd283662c6344876d1c352f3) ) ROM_LOAD32_BYTE( "gt98_grom1_3.grm1_3", 0x200003, 0x80000, CRC(231bbe58) SHA1(b662a2ffd881a22ec0503810dca8bd61a4994463) ) - /* The Euro version has different GROM2_x compared to the standard US versions. */ + // The Euro version has different GROM2_x compared to the standard US versions. - ROM_LOAD32_BYTE( "gt98_grome2_0.grm2_0", 0x400000, 0x80000, CRC(0c898920) SHA1(9e656f94e79fd16a51706559fbe66fd0df1e670c) ) /* actually labeled "GT98 GROME2_0" ect.. */ + ROM_LOAD32_BYTE( "gt98_grome2_0.grm2_0", 0x400000, 0x80000, CRC(0c898920) SHA1(9e656f94e79fd16a51706559fbe66fd0df1e670c) ) // actually labeled "GT98 GROME2_0" ect.. ROM_LOAD32_BYTE( "gt98_grome2_1.grm2_1", 0x400001, 0x80000, CRC(cbe5b2b2) SHA1(f661dbd472775c99a5a4b35965c992b3de6e0984) ) ROM_LOAD32_BYTE( "gt98_grome2_2.grm2_2", 0x400002, 0x80000, CRC(71bd4441) SHA1(6cb36aafb50ec0a9193a1a885f31a02d1fdd059d) ) ROM_LOAD32_BYTE( "gt98_grome2_3.grm2_3", 0x400003, 0x80000, CRC(86149804) SHA1(32fcde6061c9cea991c8d1d96e32b99a5ef2e825) ) @@ -4370,8 +4343,8 @@ ROM_START( gtdiamond ) /* Version 3.05TL Tournament Edition (PCB P/N 1083 Rev 2 ROM_END -ROM_START( gt99 ) /* Version 1.00 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt99 ) // Version 1.00 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt99_prom0_v1.00.prom0", 0x00000, 0x80000, CRC(1ca05267) SHA1(431788db68122df5b6c0642ffc84954fb3043295) ) ROM_LOAD32_BYTE( "gt99_prom1_v1.00.prom1", 0x00001, 0x80000, CRC(4fb757fa) SHA1(9efa6f933b20e5a6de9a5da3c0197cf29c8f1df2) ) ROM_LOAD32_BYTE( "gt99_prom2_v1.00.prom2", 0x00002, 0x80000, CRC(3eb2b13a) SHA1(6b6b79c7f07cc345f392d12625548c8fae6a1d42) ) @@ -4381,7 +4354,7 @@ ROM_START( gt99 ) /* Version 1.00 */ ROM_LOAD( "gt99nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt99_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt99_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt99_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4391,7 +4364,7 @@ ROM_START( gt99 ) /* Version 1.00 */ ROM_LOAD32_BYTE( "gt99_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt99_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt99_grom2_0.grm2_0", 0x400000, 0x80000, CRC(693d9d68) SHA1(c8f0a5ca72b239aed8150a79f330b109bd6c3d95) ) ROM_LOAD32_BYTE( "gt99_grom2_1.grm2_1", 0x400001, 0x80000, CRC(2c0b8b8c) SHA1(f36c40b29ad9a4849f12eaa79c6b26aa85ca6ee9) ) @@ -4403,18 +4376,18 @@ ROM_START( gt99 ) /* Version 1.00 */ ROM_LOAD16_BYTE( "gt99_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt99s100 ) /* Version 1.00S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt99s100 ) // Version 1.00S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt99_prom0_v1.00s.prom0", 0x00000, 0x80000, CRC(58e7c4e1) SHA1(2d5e2d841ffb626338f4dd9ffb558d05ed476078) ) ROM_LOAD32_BYTE( "gt99_prom1_v1.00s.prom1", 0x00001, 0x80000, CRC(09f8bdf4) SHA1(b933b48e19ca31ead93027ea328c2d9e581cbd31) ) ROM_LOAD32_BYTE( "gt99_prom2_v1.00s.prom2", 0x00002, 0x80000, CRC(fd084b68) SHA1(bd39ea7d201892f5583db21685010c75354ac3b9) ) ROM_LOAD32_BYTE( "gt99_prom3_v1.00s.prom3", 0x00003, 0x80000, CRC(3ff88ff7) SHA1(ca59f5888932be78434ae9a1b5cb06b01156c8ba) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) /* actually labeled "GTG3 NR(U23) V2.2" */ + ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) // actually labeled "GTG3 NR(U23) V2.2" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt99_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt99_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt99_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4424,7 +4397,7 @@ ROM_START( gt99s100 ) /* Version 1.00S for the 3 tier type PCB with short ROM ROM_LOAD32_BYTE( "gt99_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt99_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt99_grom2_0.grm2_0", 0x400000, 0x80000, CRC(693d9d68) SHA1(c8f0a5ca72b239aed8150a79f330b109bd6c3d95) ) ROM_LOAD32_BYTE( "gt99_grom2_1.grm2_1", 0x400001, 0x80000, CRC(2c0b8b8c) SHA1(f36c40b29ad9a4849f12eaa79c6b26aa85ca6ee9) ) @@ -4432,12 +4405,12 @@ ROM_START( gt99s100 ) /* Version 1.00S for the 3 tier type PCB with short ROM ROM_LOAD32_BYTE( "gt99_grom2_3.grm2_3", 0x400003, 0x80000, CRC(cfccd5c2) SHA1(6d87675e9cdaebc801a6f52688e0a142f578d36d) ) ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) /* actually labeled "GTG3 SROM1 NR**" */ - ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) /* actually labeled "GTG3 SROM2 NR*" */ + ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) // actually labeled "GTG3 SROM1 NR**" + ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) // actually labeled "GTG3 SROM2 NR*" ROM_END -ROM_START( gt99t400 ) /* Version 4.00 Tournament Edition (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt99t400 ) // Version 4.00 Tournament Edition (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt99_prom0_v4.00t.prom0", 0x00000, 0x100000, CRC(bc58e0a2) SHA1(9e207acb860d532238f6105fd5b0d283056e016f) ) ROM_LOAD32_BYTE( "gt99_prom1_v4.00t.prom1", 0x00001, 0x100000, CRC(89d8cc6b) SHA1(ff2a5452c1c3a14c22abe380cb1ce263c23cc071) ) ROM_LOAD32_BYTE( "gt99_prom2_v4.00t.prom2", 0x00002, 0x100000, CRC(891e26c1) SHA1(11eeb60160924fbf58e409465541ef1cb15ff933) ) @@ -4447,7 +4420,7 @@ ROM_START( gt99t400 ) /* Version 4.00 Tournament Edition (PCB P/N 1083 Rev 2) ROM_LOAD( "gt99nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt99_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt99_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt99_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4457,7 +4430,7 @@ ROM_START( gt99t400 ) /* Version 4.00 Tournament Edition (PCB P/N 1083 Rev 2) ROM_LOAD32_BYTE( "gt99_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt99_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt99_grom2_0.grm2_0", 0x400000, 0x80000, CRC(693d9d68) SHA1(c8f0a5ca72b239aed8150a79f330b109bd6c3d95) ) ROM_LOAD32_BYTE( "gt99_grom2_1.grm2_1", 0x400001, 0x80000, CRC(2c0b8b8c) SHA1(f36c40b29ad9a4849f12eaa79c6b26aa85ca6ee9) ) @@ -4469,8 +4442,8 @@ ROM_START( gt99t400 ) /* Version 4.00 Tournament Edition (PCB P/N 1083 Rev 2) ROM_LOAD16_BYTE( "gt99_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gtroyal ) /* Version 4.02T EDM (Tournament Edition, PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gtroyal ) // Version 4.02T EDM (Tournament Edition, PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtr_prom0_v4.02t_edm.prom0", 0x00000, 0x100000, CRC(ae499ea3) SHA1(0de651900fd92b2de3fcbc092c1292d546f12819) ) ROM_LOAD32_BYTE( "gtr_prom1_v4.02t_edm.prom1", 0x00001, 0x100000, CRC(87ee04b5) SHA1(2c4c4a80073bfd28066bef371fbd1008149cc56c) ) ROM_LOAD32_BYTE( "gtr_prom2_v4.02t_edm.prom2", 0x00002, 0x100000, CRC(a925d392) SHA1(07e398279a0abd058a4bda700a7f3fe90737cb04) ) @@ -4480,7 +4453,7 @@ ROM_START( gtroyal ) /* Version 4.02T EDM (Tournament Edition, PCB P/N 1083 R ROM_LOAD( "gt99nr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt99_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt99_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt99_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4490,7 +4463,7 @@ ROM_START( gtroyal ) /* Version 4.02T EDM (Tournament Edition, PCB P/N 1083 R ROM_LOAD32_BYTE( "gt99_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt99_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT Royal uses the same 12 graphics ROMs as a standard US GT99 version */ + // GT Royal uses the same 12 graphics ROMs as a standard US GT99 version ROM_LOAD32_BYTE( "gt99_grom2_0.grm2_0", 0x400000, 0x80000, CRC(693d9d68) SHA1(c8f0a5ca72b239aed8150a79f330b109bd6c3d95) ) ROM_LOAD32_BYTE( "gt99_grom2_1.grm2_1", 0x400001, 0x80000, CRC(2c0b8b8c) SHA1(f36c40b29ad9a4849f12eaa79c6b26aa85ca6ee9) ) @@ -4503,8 +4476,8 @@ ROM_START( gtroyal ) /* Version 4.02T EDM (Tournament Edition, PCB P/N 1083 R ROM_END -ROM_START( gt2k ) /* Version 1.00 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt2k ) // Version 1.00 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt2k_prom0_v1.00.prom0", 0x00000, 0x80000, CRC(b83d7b67) SHA1(9e3c4f5d09ae63d75f4c9499b0a09acea7b022b2) ) ROM_LOAD32_BYTE( "gt2k_prom1_v1.00.prom1", 0x00001, 0x80000, CRC(89bd952d) SHA1(8b49610b9947dbc4cb3ab28f6aed31d8b848a2bf) ) ROM_LOAD32_BYTE( "gt2k_prom2_v1.00.prom2", 0x00002, 0x80000, CRC(b603d283) SHA1(dc02b4969f96a089766b07eb45a2eb6be6ae0aad) ) @@ -4514,7 +4487,7 @@ ROM_START( gt2k ) /* Version 1.00 */ ROM_LOAD( "gt2knr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt2k_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt2k_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt2k_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4524,7 +4497,7 @@ ROM_START( gt2k ) /* Version 1.00 */ ROM_LOAD32_BYTE( "gt2k_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt2k_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt2k_grom2_0.grm2_0", 0x400000, 0x80000, CRC(cc11b93f) SHA1(f281448c8fa23595dd2664cc8c168565b60d4fc1) ) ROM_LOAD32_BYTE( "gt2k_grom2_1.grm2_1", 0x400001, 0x80000, CRC(1c3a0126) SHA1(3f9de1239dd64b9f50220842ffcf3e0f8928d2dc) ) @@ -4536,8 +4509,8 @@ ROM_START( gt2k ) /* Version 1.00 */ ROM_LOAD16_BYTE( "gt2k_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt2kp100 ) /* Version 1.00 Infinite Loop Protection */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt2kp100 ) // Version 1.00 Infinite Loop Protection + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt2kprm0.10p", 0x00000, 0x80000, CRC(16e8502d) SHA1(8bdf90793ae6d38dc0638c74a1c804c395ac5868) ) ROM_LOAD32_BYTE( "gt2kprm1.10p", 0x00001, 0x80000, CRC(bf47cd95) SHA1(f63ac0dbe2668dfc2ba675862b0b0c754f89a9a8) ) ROM_LOAD32_BYTE( "gt2kprm2.10p", 0x00002, 0x80000, CRC(204ddf15) SHA1(395659f4852021ef19967af5f3966c14cef6f327) ) @@ -4547,7 +4520,7 @@ ROM_START( gt2kp100 ) /* Version 1.00 Infinite Loop Protection */ ROM_LOAD( "gt2knr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt2k_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt2k_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt2k_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4557,7 +4530,7 @@ ROM_START( gt2kp100 ) /* Version 1.00 Infinite Loop Protection */ ROM_LOAD32_BYTE( "gt2k_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt2k_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt2k_grom2_0.grm2_0", 0x400000, 0x80000, CRC(cc11b93f) SHA1(f281448c8fa23595dd2664cc8c168565b60d4fc1) ) ROM_LOAD32_BYTE( "gt2k_grom2_1.grm2_1", 0x400001, 0x80000, CRC(1c3a0126) SHA1(3f9de1239dd64b9f50220842ffcf3e0f8928d2dc) ) @@ -4569,18 +4542,18 @@ ROM_START( gt2kp100 ) /* Version 1.00 Infinite Loop Protection */ ROM_LOAD16_BYTE( "gt2k_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gt2ks100 ) /* Version 1.00S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "gt2k_kit_prom0_v1.00m.prom0", 0x00000, 0x80000, CRC(3aab67c8) SHA1(c08dcad9e7c2440058ee4d683b2257c6ae42ad4d) ) /* Games shows Golden Tee 2K v1.00S */ +ROM_START( gt2ks100 ) // Version 1.00S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "gt2k_kit_prom0_v1.00m.prom0", 0x00000, 0x80000, CRC(3aab67c8) SHA1(c08dcad9e7c2440058ee4d683b2257c6ae42ad4d) ) // Games shows Golden Tee 2K v1.00S ROM_LOAD32_BYTE( "gt2k_kit_prom1_v1.00m.prom1", 0x00001, 0x80000, CRC(47d4a74d) SHA1(b4f80de1ffea11bf716c891519990e0fe2dfbc23) ) ROM_LOAD32_BYTE( "gt2k_kit_prom2_v1.00m.prom2", 0x00002, 0x80000, CRC(77a222cc) SHA1(bab3732c49c388f43db27c3c36c6eba02ec92708) ) ROM_LOAD32_BYTE( "gt2k_kit_prom3_v1.00m.prom3", 0x00003, 0x80000, CRC(c3e77ad5) SHA1(3861779c1a60778a686c3cae5b77ea408de1bb1f) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) /* actually labeled "GTG3 NR(U23) V2.2" */ + ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) // actually labeled "GTG3 NR(U23) V2.2" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt2k_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt2k_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt2k_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4590,7 +4563,7 @@ ROM_START( gt2ks100 ) /* Version 1.00S for the 3 tier type PCB with short ROM ROM_LOAD32_BYTE( "gt2k_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt2k_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt2k_grom2_0.grm2_0", 0x400000, 0x80000, CRC(cc11b93f) SHA1(f281448c8fa23595dd2664cc8c168565b60d4fc1) ) ROM_LOAD32_BYTE( "gt2k_grom2_1.grm2_1", 0x400001, 0x80000, CRC(1c3a0126) SHA1(3f9de1239dd64b9f50220842ffcf3e0f8928d2dc) ) @@ -4598,12 +4571,12 @@ ROM_START( gt2ks100 ) /* Version 1.00S for the 3 tier type PCB with short ROM ROM_LOAD32_BYTE( "gt2k_grom2_3.grm2_3", 0x400003, 0x80000, CRC(f0f7373f) SHA1(6d71f338992598feffd9b4ac26bd0cf2f9edb53e) ) ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) /* actually labeled "GTG3 SROM1 NR**" */ - ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) /* actually labeled "GTG3 SROM2 NR*" */ + ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) // actually labeled "GTG3 SROM1 NR**" + ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) // actually labeled "GTG3 SROM2 NR*" ROM_END -ROM_START( gt2kt500 ) /* Version 5.00 Tournament Edition (PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gt2kt500 ) // Version 5.00 Tournament Edition (PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt2k_prom0_v5.00t.prom0", 0x00000, 0x100000, CRC(8f20f9eb) SHA1(e7b19c34fff39040b8849483146303d4eb394da6) ) ROM_LOAD32_BYTE( "gt2k_prom1_v5.00t.prom1", 0x00001, 0x100000, CRC(bdecc1f5) SHA1(f97edb54cffdba68d46dfb86d884192ffaa0d204) ) ROM_LOAD32_BYTE( "gt2k_prom2_v5.00t.prom2", 0x00002, 0x100000, CRC(46666c15) SHA1(7a90a8131a68b0b7bc394bdf5ef702be8164c1ee) ) @@ -4613,7 +4586,7 @@ ROM_START( gt2kt500 ) /* Version 5.00 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD( "gt2knr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt2k_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt2k_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt2k_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4623,7 +4596,7 @@ ROM_START( gt2kt500 ) /* Version 5.00 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD32_BYTE( "gt2k_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt2k_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt2k_grom2_0.grm2_0", 0x400000, 0x80000, CRC(cc11b93f) SHA1(f281448c8fa23595dd2664cc8c168565b60d4fc1) ) ROM_LOAD32_BYTE( "gt2k_grom2_1.grm2_1", 0x400001, 0x80000, CRC(1c3a0126) SHA1(3f9de1239dd64b9f50220842ffcf3e0f8928d2dc) ) @@ -4635,8 +4608,8 @@ ROM_START( gt2kt500 ) /* Version 5.00 Tournament Edition (PCB P/N 1083 Rev 2) */ ROM_LOAD16_BYTE( "gt2k_srom1_nr.srom1", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gtsupreme ) /* Version 5.10T ELC S (Tournament Edition, PCB P/N 1083 Rev 2) */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gtsupreme ) // Version 5.10T ELC S (Tournament Edition, PCB P/N 1083 Rev 2) + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtg_sup_elc_prom0_5.10t.prom0", 0x00000, 0x100000, CRC(a14f7e2b) SHA1(fa913452701e580a9242994020a42e0be7d41a60) ) ROM_LOAD32_BYTE( "gtg_sup_elc_prom1_5.10t.prom1", 0x00001, 0x100000, CRC(772f4dc9) SHA1(c44c1893f28386b6457bffd0a85b361c1033a805) ) ROM_LOAD32_BYTE( "gtg_sup_elc_prom2_5.10t.prom2", 0x00002, 0x100000, CRC(fbaae916) SHA1(dd436f71a89acf3a6de3feffebf35f071b73ae77) ) @@ -4646,7 +4619,7 @@ ROM_START( gtsupreme ) /* Version 5.10T ELC S (Tournament Edition, PCB P/N 1083 ROM_LOAD( "gt2knr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt2k_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt2k_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt2k_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4656,9 +4629,9 @@ ROM_START( gtsupreme ) /* Version 5.10T ELC S (Tournament Edition, PCB P/N 1083 ROM_LOAD32_BYTE( "gt2k_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt2k_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ - /* The Euro version has different GROM2_x compared to the standard US versions. GT Supreme PCBs have been seen */ - /* with GT 2K mask ROMs as well as all GROMs labeled "GT SUPREME" */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic + // The Euro version has different GROM2_x compared to the standard US versions. GT Supreme PCBs have been seen + // with GT 2K mask ROMs as well as all GROMs labeled "GT SUPREME" ROM_LOAD32_BYTE( "gt_supreme_grom2_0.grm2_0", 0x400000, 0x80000, CRC(33998a3e) SHA1(53832e37c42155eb9c774eb33b8b36fe387fa162) ) ROM_LOAD32_BYTE( "gt_supreme_grom2_1.grm2_1", 0x400001, 0x80000, CRC(afa937ef) SHA1(3a6cb5a6b40ad8c77f1eceeda65afd007c8388d7) ) @@ -4671,8 +4644,8 @@ ROM_START( gtsupreme ) /* Version 5.10T ELC S (Tournament Edition, PCB P/N 1083 ROM_END -ROM_START( gtclassc ) /* Version 1.00 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gtclassc ) // Version 1.00 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gt_classic_prom0_v1.00.prom0", 0x00000, 0x80000, CRC(a57e6ef0) SHA1(9a67b8d9314a774654f89343df2e6a6fd3cfef01) ) ROM_LOAD32_BYTE( "gt_classic_prom1_v1.00.prom1", 0x00001, 0x80000, CRC(15f8a831) SHA1(982675b26f5f19aaf7d8adc73474e05dd82c56a3) ) ROM_LOAD32_BYTE( "gt_classic_prom2_v1.00.prom2", 0x00002, 0x80000, CRC(2f260a93) SHA1(b953e003a588e6c1d7d7c065afd6cdfefb526642) ) @@ -4682,7 +4655,7 @@ ROM_START( gtclassc ) /* Version 1.00 */ ROM_LOAD( "gt_classicnr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt_classic_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt_classic_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt_classic_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4692,7 +4665,7 @@ ROM_START( gtclassc ) /* Version 1.00 */ ROM_LOAD32_BYTE( "gt_classic_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt_classic_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt_classic_grom2_0.grm2_0", 0x400000, 0x80000, CRC(c4f54398) SHA1(08e57ef5cb56c793edc677d53b2e036acf558564) ) ROM_LOAD32_BYTE( "gt_classic_grom2_1.grm2_1", 0x400001, 0x80000, CRC(2c1f83cf) SHA1(a5a8724c59177fbf2a676ece0e93a08a3a1b0d68) ) @@ -4704,8 +4677,8 @@ ROM_START( gtclassc ) /* Version 1.00 */ ROM_LOAD16_BYTE( "gt_classic_srom1.nr", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gtclasscp ) /* Version 1.00 Infinite Loop Protection */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) +ROM_START( gtclasscp ) // Version 1.00 Infinite Loop Protection + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) ROM_LOAD32_BYTE( "gtcpprm0.100", 0x00000, 0x80000, CRC(21f0e0ea) SHA1(734f5ec7f28451d46656c8a0c2cc96c09c55cf9b) ) ROM_LOAD32_BYTE( "gtcpprm1.100", 0x00001, 0x80000, CRC(d2a69fbc) SHA1(a34d87bbfe1d9273d16cb73fe20fbf8ccd04e2b1) ) ROM_LOAD32_BYTE( "gtcpprm2.100", 0x00002, 0x80000, CRC(a8dea029) SHA1(b2541879aab7e468da846e464f7f642262db03b3) ) @@ -4715,7 +4688,7 @@ ROM_START( gtclasscp ) /* Version 1.00 Infinite Loop Protection */ ROM_LOAD( "gt_classicnr_u88_v1.0.u88", 0x10000, 0x18000, CRC(2cee9e98) SHA1(02edac7abab2335c1cd824d1d9b26aa32238a2de) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt_classic_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt_classic_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt_classic_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4725,7 +4698,7 @@ ROM_START( gtclasscp ) /* Version 1.00 Infinite Loop Protection */ ROM_LOAD32_BYTE( "gt_classic_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt_classic_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt_classic_grom2_0.grm2_0", 0x400000, 0x80000, CRC(c4f54398) SHA1(08e57ef5cb56c793edc677d53b2e036acf558564) ) ROM_LOAD32_BYTE( "gt_classic_grom2_1.grm2_1", 0x400001, 0x80000, CRC(2c1f83cf) SHA1(a5a8724c59177fbf2a676ece0e93a08a3a1b0d68) ) @@ -4737,18 +4710,18 @@ ROM_START( gtclasscp ) /* Version 1.00 Infinite Loop Protection */ ROM_LOAD16_BYTE( "gt_classic_srom1.nr", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) ROM_END -ROM_START( gtclasscs ) /* Version 1.00S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 */ - ROM_REGION32_BE( CODE_SIZE, "user1", 0 ) - ROM_LOAD32_BYTE( "gt_classic_prom0_v1.00m.prom0", 0x00000, 0x80000, CRC(1e41884f) SHA1(354baf00ad7cba4cdcd55c3a26dd0171dc39448a) ) /* Games shows Golden Tee Classic v1.00S */ +ROM_START( gtclasscs ) // Version 1.00S for the 3 tier type PCB with short ROM board P/N 1088 Rev 0 + ROM_REGION32_BE( CODE_SIZE, "maindata", 0 ) + ROM_LOAD32_BYTE( "gt_classic_prom0_v1.00m.prom0", 0x00000, 0x80000, CRC(1e41884f) SHA1(354baf00ad7cba4cdcd55c3a26dd0171dc39448a) ) // Games shows Golden Tee Classic v1.00S ROM_LOAD32_BYTE( "gt_classic_prom1_v1.00m.prom1", 0x00001, 0x80000, CRC(31c18b2c) SHA1(0ce5ff917b135786354d87aae88f64fdd17b1a47) ) ROM_LOAD32_BYTE( "gt_classic_prom2_v1.00m.prom2", 0x00002, 0x80000, CRC(8896efcb) SHA1(59cb9793c610a9e9b3119d8d570a15253a821ede) ) ROM_LOAD32_BYTE( "gt_classic_prom3_v1.00m.prom3", 0x00003, 0x80000, CRC(567a9490) SHA1(45379c9a26b82d0a8dbb5da26a9f23dbf1e87fc1) ) ROM_REGION( 0x28000, "soundcpu", 0 ) - ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) /* actually labeled "GTG3 NR(U23) V2.2" */ + ROM_LOAD( "gtg3_nr_u23_v2.2.u23", 0x10000, 0x18000, CRC(04effd73) SHA1(4277031655f8de851eba0e4134ba619a12f5dd4a) ) // actually labeled "GTG3 NR(U23) V2.2" ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_REGION( 0x600000, "grom", 0 ) ROM_LOAD32_BYTE( "gt_classic_grom0_0.grm0_0", 0x000000, 0x80000, CRC(c22b50f9) SHA1(9e8acfce6cc30adc150b602d026c00fa1fb7747f) ) ROM_LOAD32_BYTE( "gt_classic_grom0_1.grm0_1", 0x000001, 0x80000, CRC(d6d6be57) SHA1(fda20185e842dd4aa1a1601f95e5cc787644f4c3) ) ROM_LOAD32_BYTE( "gt_classic_grom0_2.grm0_2", 0x000002, 0x80000, CRC(005d4791) SHA1(b03d5835465ccc4fe73f4adb1342ef2b38aad90c) ) @@ -4758,7 +4731,7 @@ ROM_START( gtclasscs ) /* Version 1.00S for the 3 tier type PCB with short ROM ROM_LOAD32_BYTE( "gt_classic_grom1_2.grm1_2", 0x200002, 0x80000, CRC(d73d8afc) SHA1(2fced1ee7dd11c6db07750f617356c6608ac0291) ) ROM_LOAD32_BYTE( "gt_classic_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) ) - /* GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic */ + // GT99, GT2K & GT Classic all share the above listed 8 graphics ROMs and may be labeled GT99, GT2K or GTClassic ROM_LOAD32_BYTE( "gt_classic_grom2_0.grm2_0", 0x400000, 0x80000, CRC(c4f54398) SHA1(08e57ef5cb56c793edc677d53b2e036acf558564) ) ROM_LOAD32_BYTE( "gt_classic_grom2_1.grm2_1", 0x400001, 0x80000, CRC(2c1f83cf) SHA1(a5a8724c59177fbf2a676ece0e93a08a3a1b0d68) ) @@ -4766,8 +4739,8 @@ ROM_START( gtclasscs ) /* Version 1.00S for the 3 tier type PCB with short ROM ROM_LOAD32_BYTE( "gt_classic_grom2_3.grm2_3", 0x400003, 0x80000, CRC(7ad615c1) SHA1(b5360885f775ba5e5e13fa624091cca6e3e6948a) ) ROM_REGION16_BE( 0x400000, "ensoniq.2", ROMREGION_ERASE00 ) - ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) /* actually labeled "GTG3 SROM1 NR**" */ - ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) /* actually labeled "GTG3 SROM2 NR*" */ + ROM_LOAD16_BYTE( "gtg3_srom1_nr++.srom1", 0x000000, 0x100000, CRC(44983bd7) SHA1(a6ac966ec113b079434d7f871e4ce7266206d234) ) // actually labeled "GTG3 SROM1 NR**" + ROM_LOAD16_BYTE( "gtg3_srom2_nr+.srom2", 0x200000, 0x080000, CRC(1b3f18b6) SHA1(3b65de6a90c5ede183b5f8ca1875736bc1425772) ) // actually labeled "GTG3 SROM2 NR*" ROM_END /*************************************************************************** @@ -4781,7 +4754,7 @@ ROM_END ****************************************************************************/ ROM_START( shoottv ) - ROM_REGION32_BE( CODE_SIZE, "user1", ROMREGION_ERASEFF ) + ROM_REGION32_BE( CODE_SIZE, "maindata", ROMREGION_ERASEFF ) ROM_LOAD32_BYTE( "gun_0.bin", 0x00000, 0xc5f9, CRC(1086b219) SHA1(a9e9545911e427e819d4c98885cbfe871ce7e83a) ) // from GUN/roms ROM_LOAD32_BYTE( "gun_1.bin", 0x00001, 0xc5f9, CRC(a0f0e5ea) SHA1(39560d76759d17c34c353dbe202ec22af234238d) ) ROM_LOAD32_BYTE( "gun_2.bin", 0x00002, 0xc5f9, CRC(1b84cf05) SHA1(8f4b816ab2808258399072545f5dda0316e554ea) ) @@ -4791,7 +4764,7 @@ ROM_START( shoottv ) ROM_LOAD( "gun.bim", 0x10000, 0x18000, CRC(7439569a) SHA1(f02ec03307a2fb8a00d2ab1c7e1a62c0c74a98e9) ) // from GUN/matt back/gun ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0x880000, "gfx1", 0 ) + ROM_REGION( 0x880000, "grom", 0 ) ROM_LOAD32_BYTE( "grom00_0.bin", 0x000000, 0x80000, CRC(9a06d497) SHA1(c92826d2b7f356518e68282eef7c6f42779782f2) ) // from GUN/roms ROM_LOAD32_BYTE( "grom00_1.bin", 0x000001, 0x80000, CRC(018ff629) SHA1(34f9d79832daeeeefd0085bf41ee8ec31bdb6815) ) ROM_LOAD32_BYTE( "grom00_2.bin", 0x000002, 0x80000, CRC(f47ea010) SHA1(f83b2457d23095208bd6c200e1d358026ae5ad3a) ) @@ -4808,7 +4781,7 @@ ROM_END ROM_START( pubball ) - ROM_REGION32_BE( CODE_SIZE, "user1", ROMREGION_ERASEFF ) + ROM_REGION32_BE( CODE_SIZE, "maindata", ROMREGION_ERASEFF ) ROM_LOAD32_BYTE( "bb0.bin", 0x00000, 0x25a91, CRC(f9350590) SHA1(91352373fb6a41495bb04db01d097e76770c5419) ) // from SOURCE ROM_LOAD32_BYTE( "bb1.bin", 0x00001, 0x25a91, CRC(5711f503) SHA1(94765a5e9311fffbf0bc386c3b531c79acd7cada) ) ROM_LOAD32_BYTE( "bb2.bin", 0x00002, 0x25a91, CRC(3e202dc6) SHA1(a1a9fdff1957a8e43f002883666f1cd489879258) ) @@ -4818,7 +4791,7 @@ ROM_START( pubball ) ROM_LOAD( "bball.bim", 0x10000, 0x18000, CRC(915a9116) SHA1(54dbb9f8eb358c5dbe2022fad86cdd411c893b83) ) // from SOUNDS ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_REGION( 0xE00000, "gfx1", 0 ) + ROM_REGION( 0xe00000, "grom", 0 ) ROM_LOAD32_BYTE( "grom00_0.bin", 0x000000, 0x100000, CRC(46822b0f) SHA1(0b9758a1ccad252973a1fc61dc1a4eb1d0eb1636) ) // from ART ROM_LOAD32_BYTE( "grom00_1.bin", 0x000001, 0x100000, CRC(c11236ce) SHA1(1459646b4d947aa63b037c7c5ab19d3261cbaa19) ) ROM_LOAD32_BYTE( "grom00_2.bin", 0x000002, 0x100000, CRC(e6be30f3) SHA1(832aff7b9a42fa57ccff09554c9f65f469e1045d) ) @@ -4831,10 +4804,10 @@ ROM_START( pubball ) ROM_LOAD32_BYTE( "grom02_1.bin", 0x800001, 0x100000, CRC(3df38e91) SHA1(f3adf29598481d050258d266a360d5b40d86f665) ) ROM_LOAD32_BYTE( "grom02_2.bin", 0x800002, 0x100000, CRC(7c47dde9) SHA1(654656878676278e0ea73e367337eaac5f1f1d50) ) ROM_LOAD32_BYTE( "grom02_3.bin", 0x800003, 0x100000, CRC(e6eb01bf) SHA1(f0e7f2372dfd072e005fbf7489f54242523b4a28) ) - ROM_LOAD32_BYTE( "grom3_0.bin", 0xC00000, 0x080000, CRC(376beb10) SHA1(2dcea69b5e81d010b4c660df189a560742719ce6) ) - ROM_LOAD32_BYTE( "grom3_1.bin", 0xC00001, 0x080000, CRC(3b3cb8ba) SHA1(eabac9e381dd652a4575f159dac45499406b2702) ) - ROM_LOAD32_BYTE( "grom3_2.bin", 0xC00002, 0x080000, CRC(3bdfac73) SHA1(64777cdf92bbdfbfb6806039421a28f9810b6b03) ) - ROM_LOAD32_BYTE( "grom3_3.bin", 0xC00003, 0x080000, CRC(1de04025) SHA1(25ba2fa49cc2423642020e05586662f67943381b) ) + ROM_LOAD32_BYTE( "grom3_0.bin", 0xc00000, 0x080000, CRC(376beb10) SHA1(2dcea69b5e81d010b4c660df189a560742719ce6) ) + ROM_LOAD32_BYTE( "grom3_1.bin", 0xc00001, 0x080000, CRC(3b3cb8ba) SHA1(eabac9e381dd652a4575f159dac45499406b2702) ) + ROM_LOAD32_BYTE( "grom3_2.bin", 0xc00002, 0x080000, CRC(3bdfac73) SHA1(64777cdf92bbdfbfb6806039421a28f9810b6b03) ) + ROM_LOAD32_BYTE( "grom3_3.bin", 0xc00003, 0x080000, CRC(1de04025) SHA1(25ba2fa49cc2423642020e05586662f67943381b) ) ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "bbsrom0.bin", 0x000000, 0x0f8b8e, CRC(2a69f77e) SHA1(c98ccdb0d79e77bf87077ac29626d84a811d1326) ) // from SOUNDS @@ -4910,7 +4883,7 @@ void itech32_state::init_wcbowl() m_vram_height = 1024; m_planes = 1; - m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680001, read8smo_delegate(*this, FUNC(itech32_state::trackball_r)), 0x00ff); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680001, read8smo_delegate(*this, FUNC(itech32_state::trackball_r<0>)), 0x00ff); m_maincpu->space(AS_PROGRAM).nop_read(0x578000, 0x57ffff); m_maincpu->space(AS_PROGRAM).install_read_handler(0x680080, 0x680081, read16smo_delegate(*this, FUNC(itech32_state::wcbowl_prot_result_r))); @@ -4930,8 +4903,8 @@ void itech32_state::init_wcbowlj() m_vram_height = 1024; m_planes = 1; - m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680001, read8smo_delegate(*this, FUNC(itech32_state::trackball_r)), 0x00ff); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x680040, 0x680041, read8smo_delegate(*this, FUNC(itech32_state::trackball_p2_r)), 0x00ff); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680001, read8smo_delegate(*this, FUNC(itech32_state::trackball_r<0>)), 0x00ff); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x680040, 0x680041, read8smo_delegate(*this, FUNC(itech32_state::trackball_r<1>)), 0x00ff); m_maincpu->space(AS_PROGRAM).nop_read(0x578000, 0x57ffff); m_maincpu->space(AS_PROGRAM).install_read_handler(0x680080, 0x680081, read16smo_delegate(*this, FUNC(itech32_state::wcbowl_prot_result_r))); @@ -4979,8 +4952,8 @@ void itech32_state::init_shuffle_bowl_common(int prot_addr) m_maincpu->space(AS_PROGRAM).install_write_handler(0x300000, 0x300003, write8smo_delegate(*this, FUNC(itech32_state::color_w<0>)), 0x000000ff); m_maincpu->space(AS_PROGRAM).install_write_handler(0x380000, 0x380003, write8smo_delegate(*this, FUNC(itech32_state::color_w<1>)), 0x000000ff); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_p1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_p2_r))); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_r<0>))); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_r<1>))); } @@ -4992,7 +4965,7 @@ void itech32_state::init_shufshot() void itech32_state::init_wcbowln() { - /* The security PROM is NOT interchangeable between the Deluxe and "normal" versions. */ + // The security PROM is NOT interchangeable between the Deluxe and "normal" versions. init_shuffle_bowl_common(0x1116); } @@ -5003,7 +4976,7 @@ void itech32_state::install_timekeeper() void itech32_state::init_wcbowlt() { - /* Tournament Version, Same protection memory address as WCB Deluxe, but uses the standard WCB pic ITBWL-3 */ + // Tournament Version, Same protection memory address as WCB Deluxe, but uses the standard WCB pic ITBWL-3 init_shuffle_bowl_common(0x111a); install_timekeeper(); @@ -5049,8 +5022,8 @@ void itech32_state::init_aama() board share the same sound CPU code and sample ROMs. This board has all versions of GT for it, GT3D through GTClassic */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_p1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_p2_r))); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_r<0>))); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_r<1>))); init_gt_common(); } @@ -5074,7 +5047,7 @@ void itech32_state::init_s_ver() board: GT97 v1.21S, GT98, GT99, GT2K & GT Classic Versions 1.00S Trackball info is read through 200202 (actually 200203). */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x200200, 0x200203, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_p1_r))); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x200200, 0x200203, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_r<0>))); init_gt_common(); } @@ -5095,7 +5068,7 @@ void itech32_state::init_gt3dl() void itech32_state::init_gt2kp() { - /* a little extra protection */ + // a little extra protection m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680003, read32smo_delegate(*this, FUNC(itech32_state::gt2kp_prot_result_r))); init_aama(); @@ -5116,7 +5089,7 @@ Label1 bne.s Label1 ; Infinite loop if result isn't 0x01 void itech32_state::init_gtclasscp() { - /* a little extra protection */ + // a little extra protection m_maincpu->space(AS_PROGRAM).install_read_handler(0x680000, 0x680003, read32smo_delegate(*this, FUNC(itech32_state::gtclass_prot_result_r))); init_aama(); @@ -5143,8 +5116,8 @@ void itech32_state::init_pubball() m_maincpu->space(AS_PROGRAM).install_write_handler(0x300000, 0x300003, write8smo_delegate(*this, FUNC(itech32_state::color_w<0>)), 0x000000ff); m_maincpu->space(AS_PROGRAM).install_write_handler(0x380000, 0x380003, write8smo_delegate(*this, FUNC(itech32_state::color_w<1>)), 0x000000ff); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_p1_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_p2_r))); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x180800, 0x180803, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_r<0>))); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x181000, 0x181003, read32smo_delegate(*this, FUNC(itech32_state::trackball32_4bit_r<1>))); } @@ -5154,61 +5127,61 @@ void itech32_state::init_pubball() * *************************************/ -GAME( 1992, timekill, 0, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.32)", MACHINE_SUPPORTS_SAVE ) /* P/N 1051 Rev 0 ROM board */ -GAME( 1992, timekill132i, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.32I)", MACHINE_SUPPORTS_SAVE ) /* P/N 1051 Rev 0 ROM board */ -GAME( 1992, timekill131, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.31)", MACHINE_SUPPORTS_SAVE ) /* P/N 1051 Rev 0 ROM board */ -GAME( 1992, timekill121, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.21)", MACHINE_SUPPORTS_SAVE ) /* P/N 1051 Rev 0 ROM board */ -GAME( 1992, timekill121a, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.21, alternate ROM board)", MACHINE_SUPPORTS_SAVE ) /* P/N 1049 Rev 1 ROM board */ -GAME( 1992, timekill120, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.20, alternate ROM board)", MACHINE_SUPPORTS_SAVE ) /* P/N 1057 Rev 0 ROM board */ -GAME( 1992, timekill100, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.00)", MACHINE_SUPPORTS_SAVE ) /* P/N 1049 Rev 1 ROM board */ - -GAME( 1993, hardyard, 0, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.20)", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, hardyard11, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.10)", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, hardyard10, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.00)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1994, bloodstm, 0, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.22)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm221, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.21)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm220, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.20)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm210, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.10)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm110, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.10)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm104, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.04)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1994, pairs, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1.2, 09/30/94)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, pairsa, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1, 09/07/94)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, hotmemry, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Incredible Technologies (Tuning license)", "Hot Memory (V1.2, Germany, 12/28/94)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, hotmemry11, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Incredible Technologies (Tuning license)", "Hot Memory (V1.1, Germany, 11/30/94)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1994, pairsred, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs Redemption (V1.0, 10/25/94)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1994, drivedge, 0, drivedge, drivedge, drivedge_state, empty_init, ROT0, "Strata/Incredible Technologies", "Driver's Edge (v1.6)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) - -GAME( 1995, wcbowl, 0, sftm, wcbowln, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.66)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1995, wcbowl165, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.65)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1995, wcbowl161, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.61)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1995, wcbowl16, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.6)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1995, wcbowl15, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.5)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl14, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.4)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl13, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.3)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl13j, wcbowl, bloodstm, wcbowlj, itech32_state, init_wcbowlj, ROT0, "Incredible Technologies", "World Class Bowling (v1.3J, Japan)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl12, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.2)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl11, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.1)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl10, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.0)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1999, wcbowldx, wcbowl, sftm, wcbowldx, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "World Class Bowling Deluxe (v2.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-4 */ -GAME( 1997, wcbowl140, wcbowl, tourny, wcbowldx, itech32_state, init_wcbowlt, ROT0, "Incredible Technologies", "World Class Bowling Tournament (v1.40)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1997, wcbowl130, wcbowl, tourny, wcbowlo, itech32_state, init_wcbowlt, ROT0, "Incredible Technologies", "World Class Bowling Tournament (v1.30)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ - -GAME( 1995, sftm, 0, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ -GAME( 1995, sftm111, sftm, sftm, sftm, itech32_state, init_sftm110, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.11)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ -GAME( 1995, sftm110, sftm, sftm, sftm, itech32_state, init_sftm110, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.10)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ -GAME( 1995, sftmj114, sftm, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.14N, Japan)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ -GAME( 1995, sftmj112, sftm, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12N, Japan)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ -GAME( 1995, sftmk112, sftm, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12K, Korea)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ - -GAME( 1997, shufshot, 0, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.40)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ -GAME( 1997, shufshot139, shufshot, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.39)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ -GAME( 1997, shufshot138, shufshot, sftm, shufshto, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.38)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ -GAME( 1997, shufshot137, shufshot, sftm, shufshto, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.37)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ -GAME( 1997, shufshot135, shufshot, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.35)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ +GAME( 1992, timekill, 0, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata / Incredible Technologies", "Time Killers (v1.32)", MACHINE_SUPPORTS_SAVE ) // P/N 1051 Rev 0 ROM board +GAME( 1992, timekill132i, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata / Incredible Technologies", "Time Killers (v1.32I)", MACHINE_SUPPORTS_SAVE ) // P/N 1051 Rev 0 ROM board +GAME( 1992, timekill131, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata / Incredible Technologies", "Time Killers (v1.31)", MACHINE_SUPPORTS_SAVE ) // P/N 1051 Rev 0 ROM board +GAME( 1992, timekill121, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata / Incredible Technologies", "Time Killers (v1.21)", MACHINE_SUPPORTS_SAVE ) // P/N 1051 Rev 0 ROM board +GAME( 1992, timekill121a, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata / Incredible Technologies", "Time Killers (v1.21, alternate ROM board)", MACHINE_SUPPORTS_SAVE ) // P/N 1049 Rev 1 ROM board +GAME( 1992, timekill120, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata / Incredible Technologies", "Time Killers (v1.20, alternate ROM board)", MACHINE_SUPPORTS_SAVE ) // P/N 1057 Rev 0 ROM board +GAME( 1992, timekill100, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata / Incredible Technologies", "Time Killers (v1.00)", MACHINE_SUPPORTS_SAVE ) // P/N 1049 Rev 1 ROM board + +GAME( 1993, hardyard, 0, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata / Incredible Technologies", "Hard Yardage (v1.20)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, hardyard11, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata / Incredible Technologies", "Hard Yardage (v1.10)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, hardyard10, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata / Incredible Technologies", "Hard Yardage (v1.00)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1994, bloodstm, 0, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata / Incredible Technologies", "Blood Storm (v2.22)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm221, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata / Incredible Technologies", "Blood Storm (v2.21)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm220, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata / Incredible Technologies", "Blood Storm (v2.20)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm210, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata / Incredible Technologies", "Blood Storm (v2.10)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm110, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata / Incredible Technologies", "Blood Storm (v1.10)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm104, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata / Incredible Technologies", "Blood Storm (v1.04)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1994, pairs, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata / Incredible Technologies", "Pairs (V1.2, 09/30/94)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, pairsa, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata / Incredible Technologies", "Pairs (V1, 09/07/94)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, hotmemry, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Incredible Technologies (Tuning license)", "Hot Memory (V1.2, Germany, 12/28/94)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, hotmemry11, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Incredible Technologies (Tuning license)", "Hot Memory (V1.1, Germany, 11/30/94)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1994, pairsred, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata / Incredible Technologies", "Pairs Redemption (V1.0, 10/25/94)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1994, drivedge, 0, drivedge, drivedge, drivedge_state, empty_init, ROT0, "Strata / Incredible Technologies", "Driver's Edge (v1.6)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) + +GAME( 1995, wcbowl, 0, sftm, wcbowln, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.66)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-3 +GAME( 1995, wcbowl165, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.65)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-3 +GAME( 1995, wcbowl161, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.61)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-3 +GAME( 1995, wcbowl16, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.6)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-3 +GAME( 1995, wcbowl15, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.5)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-1 +GAME( 1995, wcbowl14, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.4)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-1 +GAME( 1995, wcbowl13, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.3)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-1 +GAME( 1995, wcbowl13j, wcbowl, bloodstm, wcbowlj, itech32_state, init_wcbowlj, ROT0, "Incredible Technologies (Excellent System Ltd. license)", "World Class Bowling (v1.3J, Japan)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-1 +GAME( 1995, wcbowl12, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.2)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-1 +GAME( 1995, wcbowl11, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.1)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-1 +GAME( 1995, wcbowl10, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.0)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-1 +GAME( 1999, wcbowldx, wcbowl, sftm, wcbowldx, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "World Class Bowling Deluxe (v2.00)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-4 +GAME( 1997, wcbowl140, wcbowl, tourny, wcbowldx, itech32_state, init_wcbowlt, ROT0, "Incredible Technologies", "World Class Bowling Tournament (v1.40)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-3 +GAME( 1997, wcbowl130, wcbowl, tourny, wcbowlo, itech32_state, init_wcbowlt, ROT0, "Incredible Technologies", "World Class Bowling Tournament (v1.30)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITBWL-3 + +GAME( 1995, sftm, 0, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSF-1 +GAME( 1995, sftm111, sftm, sftm, sftm, itech32_state, init_sftm110, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.11)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSF-1 +GAME( 1995, sftm110, sftm, sftm, sftm, itech32_state, init_sftm110, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.10)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSF-1 +GAME( 1995, sftmj114, sftm, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.14N, Japan)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSF-1 +GAME( 1995, sftmj112, sftm, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12N, Japan)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSF-1 +GAME( 1995, sftmk112, sftm, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12K, Korea)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSF-1 + +GAME( 1997, shufshot, 0, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "Shuffleshot (v1.40)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSHF-1 +GAME( 1997, shufshot139, shufshot, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "Shuffleshot (v1.39)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSHF-1 +GAME( 1997, shufshot138, shufshot, sftm, shufshto, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "Shuffleshot (v1.38)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSHF-1 +GAME( 1997, shufshot137, shufshot, sftm, shufshto, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "Shuffleshot (v1.37)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSHF-1 +GAME( 1997, shufshot135, shufshot, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "Shuffleshot (v1.35)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITSHF-1 /* The following naming conventions are used: @@ -5251,49 +5224,49 @@ NOTE: There is an "8 Meg board" version of the P/N 1083 Rev 2 PCB, so GROM0_0 th Parent set will always be gt(year) with the most recent version. IE: gt97 is Golden Tee '97 v1.30 */ -GAME( 1995, gt3d, 0, sftm, gt3d, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.93N)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-2 */ -GAME( 1995, gt3dl192, gt3d, sftm, gt3d, itech32_state, init_gt3dl, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.92L)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-2 */ -GAME( 1995, gt3dl191, gt3d, sftm, gt3d, itech32_state, init_gt3dl, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.91L)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-2 */ -GAME( 1995, gt3dl19, gt3d, sftm, gt3d, itech32_state, init_gt3dl, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.9L)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-2 */ -GAME( 1995, gt3ds192, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.92S)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-1 */ -GAME( 1995, gt3dv18, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.8)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-1 */ -GAME( 1995, gt3dv17, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.7)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-1 */ -GAME( 1995, gt3dv16, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.6)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-1 */ -GAME( 1995, gt3dv15, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.5)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-1 */ -GAME( 1995, gt3dv14, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.4)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-1 */ -GAME( 1995, gt3dt231, gt3d, tourny, gt3d, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee 3D Golf Tournament (v2.31)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-2 */ -GAME( 1995, gt3dt211, gt3d, tourny, gt3d, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee 3D Golf Tournament (v2.11)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF-2 */ - -GAME( 1997, gt97, 0, sftm, gt97, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.30)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFS-3 */ -GAME( 1997, gt97v122, gt97, sftm, gt97o, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.22)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFS-3 */ -GAME( 1997, gt97v121, gt97, sftm, gt97o, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.21)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFS-3 */ -GAME( 1997, gt97s121, gt97, sftm, gt97s, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.21S)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFM-3 */ -GAME( 1997, gt97v120, gt97, sftm, gt97o, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.20)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFS-3 */ -GAME( 1997, gt97t243, gt97, tourny, gt97o, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '97 Tournament (v2.43)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFS-3 */ -GAME( 1997, gt97t240, gt97, tourny, gt97o, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '97 Tournament (v2.40)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFS-3 */ - -GAME( 1998, gt98, 0, sftm, aama, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '98 (v1.10)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF98 */ -GAME( 1998, gt98v100, gt98, sftm, gt98, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '98 (v1.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF98 */ -GAME( 1998, gt98c100, gt98, sftm, gt98, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '98 (v1.00C)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF98 */ -GAME( 1998, gt98s100, gt98, sftm, gt98s, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee '98 (v1.00S)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF98-M */ -GAME( 1998, gt98t303, gt98, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '98 Tournament (v3.03)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF98 */ -GAME( 1998, gt98t302, gt98, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '98 Tournament (v3.02)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF98 */ -GAME( 1998, gtdiamond, gt98, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee Diamond Edition Tournament (v3.05T ELC)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF98 */ - -GAME( 1999, gt99, 0, sftm, aama, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '99 (v1.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF99 */ -GAME( 1999, gt99s100, gt99, sftm, s_ver, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee '99 (v1.00S)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF99-M */ -GAME( 1999, gt99t400, gt99, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '99 Tournament (v4.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF99 */ -GAME( 1999, gtroyal, gt99, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee Royal Edition Tournament (v4.02T EDM)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF99I */ - -GAME( 2000, gt2k, 0, sftm, aama, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee 2K (v1.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF2K */ -GAME( 2000, gt2kp100, gt2k, sftm, aama, itech32_state, init_gt2kp, ROT0, "Incredible Technologies", "Golden Tee 2K (v1.00) (alt protection)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ???? */ -GAME( 2000, gt2ks100, gt2k, sftm, s_ver, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee 2K (v1.00S)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF2K-M */ -GAME( 2000, gt2kt500, gt2k, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee 2K Tournament (v5.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF2K */ -GAME( 2002, gtsupreme, gt2k, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee Supreme Edition Tournament (v5.10T ELC S)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGF2K-I */ - -GAME( 2001, gtclassc, 0, sftm, aama, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee Classic (v1.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFCL */ -GAME( 2001, gtclasscp, gtclassc, sftm, aama, itech32_state, init_gtclasscp, ROT0, "Incredible Technologies", "Golden Tee Classic (v1.00) (alt protection)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFCL */ -GAME( 2001, gtclasscs, gtclassc, sftm, s_ver, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee Classic (v1.00S)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITGFCL-M */ +GAME( 1995, gt3d, 0, sftm, gt3d, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.93N)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-2 +GAME( 1995, gt3dl192, gt3d, sftm, gt3d, itech32_state, init_gt3dl, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.92L)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-2 +GAME( 1995, gt3dl191, gt3d, sftm, gt3d, itech32_state, init_gt3dl, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.91L)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-2 +GAME( 1995, gt3dl19, gt3d, sftm, gt3d, itech32_state, init_gt3dl, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.9L)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-2 +GAME( 1995, gt3ds192, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.92S)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-1 +GAME( 1995, gt3dv18, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.8)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-1 +GAME( 1995, gt3dv17, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.7)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-1 +GAME( 1995, gt3dv16, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.6)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-1 +GAME( 1995, gt3dv15, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.5)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-1 +GAME( 1995, gt3dv14, gt3d, sftm, gt3d, itech32_state, init_gt3d, ROT0, "Incredible Technologies", "Golden Tee 3D Golf (v1.4)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-1 +GAME( 1995, gt3dt231, gt3d, tourny, gt3d, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee 3D Golf Tournament (v2.31)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-2 +GAME( 1995, gt3dt211, gt3d, tourny, gt3d, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee 3D Golf Tournament (v2.11)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF-2 + +GAME( 1997, gt97, 0, sftm, gt97, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.30)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFS-3 +GAME( 1997, gt97v122, gt97, sftm, gt97o, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.22)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFS-3 +GAME( 1997, gt97v121, gt97, sftm, gt97o, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.21)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFS-3 +GAME( 1997, gt97s121, gt97, sftm, gt97s, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.21S)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFM-3 +GAME( 1997, gt97v120, gt97, sftm, gt97o, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '97 (v1.20)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFS-3 +GAME( 1997, gt97t243, gt97, tourny, gt97o, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '97 Tournament (v2.43)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFS-3 +GAME( 1997, gt97t240, gt97, tourny, gt97o, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '97 Tournament (v2.40)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFS-3 + +GAME( 1998, gt98, 0, sftm, aama, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '98 (v1.10)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF98 +GAME( 1998, gt98v100, gt98, sftm, gt98, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '98 (v1.00)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF98 +GAME( 1998, gt98c100, gt98, sftm, gt98, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '98 (v1.00C)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF98 +GAME( 1998, gt98s100, gt98, sftm, gt98s, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee '98 (v1.00S)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF98-M +GAME( 1998, gt98t303, gt98, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '98 Tournament (v3.03)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF98 +GAME( 1998, gt98t302, gt98, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '98 Tournament (v3.02)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF98 +GAME( 1998, gtdiamond, gt98, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee Diamond Edition Tournament (v3.05T ELC)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF98 + +GAME( 1999, gt99, 0, sftm, aama, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee '99 (v1.00)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF99 +GAME( 1999, gt99s100, gt99, sftm, s_ver, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee '99 (v1.00S)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF99-M +GAME( 1999, gt99t400, gt99, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee '99 Tournament (v4.00)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF99 +GAME( 1999, gtroyal, gt99, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee Royal Edition Tournament (v4.02T EDM)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF99I + +GAME( 2000, gt2k, 0, sftm, aama, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee 2K (v1.00)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF2K +GAME( 2000, gt2kp100, gt2k, sftm, aama, itech32_state, init_gt2kp, ROT0, "Incredible Technologies", "Golden Tee 2K (v1.00) (alt protection)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ???? +GAME( 2000, gt2ks100, gt2k, sftm, s_ver, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee 2K (v1.00S)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF2K-M +GAME( 2000, gt2kt500, gt2k, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee 2K Tournament (v5.00)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF2K +GAME( 2002, gtsupreme, gt2k, tourny, gt98s, itech32_state, init_aamat, ROT0, "Incredible Technologies", "Golden Tee Supreme Edition Tournament (v5.10T ELC S)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGF2K-I + +GAME( 2001, gtclassc, 0, sftm, aama, itech32_state, init_aama, ROT0, "Incredible Technologies", "Golden Tee Classic (v1.00)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFCL +GAME( 2001, gtclasscp, gtclassc, sftm, aama, itech32_state, init_gtclasscp, ROT0, "Incredible Technologies", "Golden Tee Classic (v1.00) (alt protection)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFCL +GAME( 2001, gtclasscs, gtclassc, sftm, s_ver, itech32_state, init_s_ver, ROT0, "Incredible Technologies", "Golden Tee Classic (v1.00S)" , MACHINE_SUPPORTS_SAVE ) // PIC 16C54 labeled as ITGFCL-M GAME( 199?, shoottv, 0, shoottv, shoottv, shoottv_state, empty_init, ROT0, "Incredible Technologies", "Must Shoot TV (prototype)" , MACHINE_SUPPORTS_SAVE ) GAME( 1996, pubball, 0, pubball, pubball, itech32_state, init_pubball,ROT0, "Midway / Incredible Technologies", "Power Up Baseball (prototype)" , MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/itech/itech32.h b/src/mame/itech/itech32.h index 95a5d66381a2a..e88b1285c0250 100644 --- a/src/mame/itech/itech32.h +++ b/src/mame/itech/itech32.h @@ -20,12 +20,7 @@ #include "emupal.h" #include "screen.h" -#define VIDEO_CLOCK XTAL(8'000'000) // video (pixel) clock -#define CPU_CLOCK XTAL(12'000'000) // clock for 68000-based systems -#define CPU020_CLOCK XTAL(25'000'000) // clock for 68EC020-based systems -#define SOUND_CLOCK XTAL(16'000'000) // clock for sound board -#define TMS_CLOCK XTAL(40'000'000) // TMS320C31 clocks on drivedge - +#define LOG_DRIVEDGE_UNINIT_RAM 0 class itech32_state : public driver_device { @@ -34,7 +29,7 @@ class itech32_state : public driver_device driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), - m_via(*this, "via6522_0"), + m_via(*this, "via6522"), m_ensoniq(*this, "ensoniq"), m_screen(*this, "screen"), m_palette(*this, "palette"), @@ -46,10 +41,12 @@ class itech32_state : public driver_device m_nvram32(*this, "nvram32"), m_main_ram32(*this, "main_ram"), m_video(*this, "video", 0x200, ENDIANNESS_BIG), - m_main_rom16(*this, "user1"), - m_main_rom32(*this, "user1"), - m_grom(*this, "gfx1"), - m_soundbank(*this, "soundbank") + m_main_rom16(*this, "maindata"), + m_main_rom32(*this, "maindata"), + m_grom(*this, "grom"), + m_soundbank(*this, "soundbank"), + m_trackball_x(*this, "TRACKX%u", 1U), + m_trackball_y(*this, "TRACKY%u", 1U) { } void base_devices(machine_config &config); @@ -82,6 +79,8 @@ class itech32_state : public driver_device int special_port_r(); protected: + static constexpr XTAL VIDEO_CLOCK = XTAL(8'000'000); // video (pixel) clock + required_device m_maincpu; required_device m_soundcpu; optional_device m_via; // sftm, wcbowl and gt games don't have the via @@ -103,6 +102,9 @@ class itech32_state : public driver_device required_region_ptr m_grom; required_memory_bank m_soundbank; + optional_ioport_array<2> m_trackball_x; + optional_ioport_array<2> m_trackball_y; + virtual void nvram_init(nvram_device &nvram, void *base, size_t length); std::unique_ptr m_videoram; @@ -112,16 +114,11 @@ class itech32_state : public driver_device u8 m_irq_base = 0; u8 m_sound_return = 0; offs_t m_itech020_prot_address = 0; - int m_special_result = 0; - int m_p1_effx = 0; - int m_p1_effy = 0; - int m_p1_lastresult = 0; - attotime m_p1_lasttime{}; - int m_p2_effx = 0; - int m_p2_effy = 0; - int m_p2_lastresult = 0; - attotime m_p2_lasttime{}; - u8 m_written[0x8000]{}; + u8 m_special_result = 0; + s32 m_effx[2]{}; + s32 m_effy[2]{}; + u8 m_lastresult[2]{}; + attotime m_lasttime[2]{}; u16 m_xfer_xcount = 0; u16 m_xfer_ycount = 0; u16 m_xfer_xcur = 0; @@ -144,11 +141,9 @@ class itech32_state : public driver_device u32 m_grom_bank_mask = 0; void int1_ack_w(u16 data); - u8 trackball_r(); - u8 trackball_p2_r(); + template u8 trackball_r(); u16 trackball_8bit_r(); - u32 trackball32_4bit_p1_r(); - u32 trackball32_4bit_p2_r(); + template u32 trackball32_4bit_r(); u32 trackball32_4bit_combined_r(); u16 wcbowl_prot_result_r(); u8 itech020_prot_result_r(); @@ -190,7 +185,7 @@ class itech32_state : public driver_device inline void disable_clipping(); inline void enable_clipping(); virtual void logblit(const char *tag); - void update_interrupts(int fast); + void update_interrupts(); void draw_raw(u16 *base, u16 color); void draw_raw_widthpix(u16 *base, u16 color); virtual void command_blit_raw(); @@ -232,9 +227,17 @@ class drivedge_state : public itech32_state virtual void machine_start() override; virtual void machine_reset() override; +private: u16 steering_r(); u16 gas_r(); +#if LOG_DRIVEDGE_UNINIT_RAM + u32 test1_r(offs_t offset, u32 mem_mask); + u32 test2_r(offs_t offset, u32 mem_mask); + void test1_w(offs_t offset, u32 data, u32 mem_mask); + void test2_w(offs_t offset, u32 data, u32 mem_mask); +#endif + u32 tms1_speedup_r(address_space &space); u32 tms2_speedup_r(address_space &space); void tms_reset_assert_w(u32 data); @@ -270,6 +273,9 @@ class drivedge_state : public itech32_state required_ioport m_gas; u8 m_tms_spinning[2]; +#if LOG_DRIVEDGE_UNINIT_RAM + u8 m_written[0x8000]{}; +#endif }; class shoottv_state : public itech32_state diff --git a/src/mame/itech/itech32_v.cpp b/src/mame/itech/itech32_v.cpp index 046bb0e1daa08..9465f3c6a4a8e 100644 --- a/src/mame/itech/itech32_v.cpp +++ b/src/mame/itech/itech32_v.cpp @@ -10,8 +10,6 @@ #include "emu.h" #include "itech32.h" -#include "cpu/m68000/m68000.h" - #include @@ -21,7 +19,16 @@ * *************************************/ -#define BLIT_LOGGING 0 +#define LOG_BLITTER (1U << 1) +#define LOG_SCREEN (1U << 2) + +#define LOG_ALL (LOG_BLITTER | LOG_SCREEN) + +#define VERBOSE (0) +#include "logmacro.h" + +#define LOGBLITTER(...) LOGMASKED(LOG_BLITTER, __VA_ARGS__) +#define LOGSCREEN(...) LOGMASKED(LOG_SCREEN, __VA_ARGS__) @@ -31,96 +38,96 @@ * *************************************/ -#define VIDEO_UNKNOWN00 m_video[0x00/2] /* $0087 at startup */ +#define VIDEO_UNKNOWN00 m_video[0x00/2] // $0087 at startup #define VIDEO_STATUS m_video[0x00/2] #define VIDEO_INTSTATE m_video[0x02/2] #define VIDEO_INTACK m_video[0x02/2] #define VIDEO_TRANSFER m_video[0x04/2] -#define VIDEO_TRANSFER_FLAGS m_video[0x06/2] /* $5080 at startup (kept at $1512) */ -#define VIDEO_COMMAND m_video[0x08/2] /* $0005 at startup */ -#define VIDEO_INTENABLE m_video[0x0a/2] /* $0144 at startup (kept at $1514) */ +#define VIDEO_TRANSFER_FLAGS m_video[0x06/2] // $5080 at startup (kept at $1512) +#define VIDEO_COMMAND m_video[0x08/2] // $0005 at startup +#define VIDEO_INTENABLE m_video[0x0a/2] // $0144 at startup (kept at $1514) #define VIDEO_TRANSFER_HEIGHT m_video[0x0c/2] #define VIDEO_TRANSFER_WIDTH m_video[0x0e/2] #define VIDEO_TRANSFER_ADDRLO m_video[0x10/2] #define VIDEO_TRANSFER_X m_video[0x12/2] #define VIDEO_TRANSFER_Y m_video[0x14/2] -#define VIDEO_SRC_YSTEP m_video[0x16/2] /* $0011 at startup */ +#define VIDEO_SRC_YSTEP m_video[0x16/2] // $0011 at startup #define VIDEO_SRC_XSTEP m_video[0x18/2] #define VIDEO_DST_XSTEP m_video[0x1a/2] #define VIDEO_DST_YSTEP m_video[0x1c/2] #define VIDEO_YSTEP_PER_X m_video[0x1e/2] #define VIDEO_XSTEP_PER_Y m_video[0x20/2] -#define VIDEO_UNKNOWN22 m_video[0x22/2] /* $0033 at startup */ +#define VIDEO_UNKNOWN22 m_video[0x22/2] // $0033 at startup #define VIDEO_LEFTCLIP m_video[0x24/2] #define VIDEO_RIGHTCLIP m_video[0x26/2] #define VIDEO_TOPCLIP m_video[0x28/2] #define VIDEO_BOTTOMCLIP m_video[0x2a/2] -#define VIDEO_INTSCANLINE m_video[0x2c/2] /* $00ef at startup */ -#define VIDEO_TRANSFER_ADDRHI m_video[0x2e/2] /* $0000 at startup */ - -#define VIDEO_UNKNOWN30 m_video[0x30/2] /* $0040 at startup */ -#define VIDEO_VTOTAL m_video[0x32/2] /* $0106 at startup */ -#define VIDEO_VSYNC m_video[0x34/2] /* $0101 at startup */ -#define VIDEO_VBLANK_START m_video[0x36/2] /* $00f3 at startup */ -#define VIDEO_VBLANK_END m_video[0x38/2] /* $0003 at startup */ -#define VIDEO_HTOTAL m_video[0x3a/2] /* $01fc at startup */ -#define VIDEO_HSYNC m_video[0x3c/2] /* $01e4 at startup */ -#define VIDEO_HBLANK_START m_video[0x3e/2] /* $01b2 at startup */ -#define VIDEO_HBLANK_END m_video[0x40/2] /* $0032 at startup */ -#define VIDEO_UNKNOWN42 m_video[0x42/2] /* $0015 at startup */ -#define VIDEO_DISPLAY_YORIGIN1 m_video[0x44/2] /* $0000 at startup */ -#define VIDEO_DISPLAY_YORIGIN2 m_video[0x46/2] /* $0000 at startup */ -#define VIDEO_DISPLAY_YSCROLL2 m_video[0x48/2] /* $0000 at startup */ -#define VIDEO_UNKNOWN4a m_video[0x4a/2] /* $0000 at startup */ -#define VIDEO_DISPLAY_XORIGIN1 m_video[0x4c/2] /* $0000 at startup */ -#define VIDEO_DISPLAY_XORIGIN2 m_video[0x4e/2] /* $0000 at startup */ -#define VIDEO_DISPLAY_XSCROLL2 m_video[0x50/2] /* $0000 at startup */ -#define VIDEO_UNKNOWN52 m_video[0x52/2] /* $0000 at startup */ -#define VIDEO_UNKNOWN54 m_video[0x54/2] /* $0080 at startup */ -#define VIDEO_UNKNOWN56 m_video[0x56/2] /* $00c0 at startup */ -#define VIDEO_UNKNOWN58 m_video[0x58/2] /* $01c0 at startup */ -#define VIDEO_UNKNOWN5a m_video[0x5a/2] /* $01c0 at startup */ -#define VIDEO_UNKNOWN5c m_video[0x5c/2] /* $01cf at startup */ -#define VIDEO_UNKNOWN5e m_video[0x5e/2] /* $01cf at startup, kept $01bf in running game, $01c3 at testing */ -#define VIDEO_UNKNOWN60 m_video[0x60/2] /* $01e3 at startup */ -#define VIDEO_UNKNOWN62 m_video[0x62/2] /* $01cf at startup */ -#define VIDEO_UNKNOWN64 m_video[0x64/2] /* $01ff at startup */ -#define VIDEO_UNKNOWN66 m_video[0x66/2] /* $0183 at startup, kept $01bf in running game, $1ff at testing */ -#define VIDEO_UNKNOWN68 m_video[0x68/2] /* $01ff at startup */ -#define VIDEO_UNKNOWN6a m_video[0x6a/2] /* $000f at startup */ -#define VIDEO_UNKNOWN6c m_video[0x6c/2] /* $018f at startup */ -#define VIDEO_UNKNOWN6e m_video[0x6e/2] /* $01ff at startup, kept $01ff in running game, $01c3 at testing */ -#define VIDEO_UNKNOWN70 m_video[0x70/2] /* $000f at startup */ -#define VIDEO_UNKNOWN72 m_video[0x72/2] /* $000f at startup */ -#define VIDEO_UNKNOWN74 m_video[0x74/2] /* $01ff at startup */ -#define VIDEO_UNKNOWN76 m_video[0x76/2] /* $01ff at startup */ -#define VIDEO_UNKNOWN78 m_video[0x78/2] /* $01ff at startup */ -#define VIDEO_UNKNOWN7a m_video[0x7a/2] /* $01ff at startup */ -#define VIDEO_UNKNOWN7c m_video[0x7c/2] /* $0820 at startup */ -#define VIDEO_UNKNOWN7e m_video[0x7e/2] /* $0100 at startup */ - -#define VIDEO_STARTSTEP m_video[0x80/2] /* drivedge only? */ -#define VIDEO_LEFTSTEPLO m_video[0x82/2] /* drivedge only? */ -#define VIDEO_LEFTSTEPHI m_video[0x84/2] /* drivedge only? */ -#define VIDEO_RIGHTSTEPLO m_video[0x86/2] /* drivedge only? */ -#define VIDEO_RIGHTSTEPHI m_video[0x88/2] /* drivedge only? */ - -#define VIDEOINT_SCANLINE 0x0004 -#define VIDEOINT_BLITTER 0x0040 - -#define XFERFLAG_TRANSPARENT 0x0001 -#define XFERFLAG_XFLIP 0x0002 -#define XFERFLAG_YFLIP 0x0004 -#define XFERFLAG_DSTXSCALE 0x0008 -#define XFERFLAG_DYDXSIGN 0x0010 -#define XFERFLAG_DXDYSIGN 0x0020 -#define XFERFLAG_UNKNOWN8 0x0100 -#define XFERFLAG_CLIP 0x0400 -#define XFERFLAG_WIDTHPIX 0x8000 - -#define XFERFLAG_KNOWNFLAGS (XFERFLAG_TRANSPARENT | XFERFLAG_XFLIP | XFERFLAG_YFLIP | XFERFLAG_DSTXSCALE | XFERFLAG_DYDXSIGN | XFERFLAG_DXDYSIGN | XFERFLAG_CLIP | XFERFLAG_WIDTHPIX) - -#define VRAM_WIDTH 512 +#define VIDEO_INTSCANLINE m_video[0x2c/2] // $00ef at startup +#define VIDEO_TRANSFER_ADDRHI m_video[0x2e/2] // $0000 at startup + +#define VIDEO_UNKNOWN30 m_video[0x30/2] // $0040 at startup +#define VIDEO_VTOTAL m_video[0x32/2] // $0106 at startup +#define VIDEO_VSYNC m_video[0x34/2] // $0101 at startup +#define VIDEO_VBLANK_START m_video[0x36/2] // $00f3 at startup +#define VIDEO_VBLANK_END m_video[0x38/2] // $0003 at startup +#define VIDEO_HTOTAL m_video[0x3a/2] // $01fc at startup +#define VIDEO_HSYNC m_video[0x3c/2] // $01e4 at startup +#define VIDEO_HBLANK_START m_video[0x3e/2] // $01b2 at startup +#define VIDEO_HBLANK_END m_video[0x40/2] // $0032 at startup +#define VIDEO_UNKNOWN42 m_video[0x42/2] // $0015 at startup +#define VIDEO_DISPLAY_YORIGIN1 m_video[0x44/2] // $0000 at startup +#define VIDEO_DISPLAY_YORIGIN2 m_video[0x46/2] // $0000 at startup +#define VIDEO_DISPLAY_YSCROLL2 m_video[0x48/2] // $0000 at startup +#define VIDEO_UNKNOWN4a m_video[0x4a/2] // $0000 at startup +#define VIDEO_DISPLAY_XORIGIN1 m_video[0x4c/2] // $0000 at startup +#define VIDEO_DISPLAY_XORIGIN2 m_video[0x4e/2] // $0000 at startup +#define VIDEO_DISPLAY_XSCROLL2 m_video[0x50/2] // $0000 at startup +#define VIDEO_UNKNOWN52 m_video[0x52/2] // $0000 at startup +#define VIDEO_UNKNOWN54 m_video[0x54/2] // $0080 at startup +#define VIDEO_UNKNOWN56 m_video[0x56/2] // $00c0 at startup +#define VIDEO_UNKNOWN58 m_video[0x58/2] // $01c0 at startup +#define VIDEO_UNKNOWN5a m_video[0x5a/2] // $01c0 at startup +#define VIDEO_UNKNOWN5c m_video[0x5c/2] // $01cf at startup +#define VIDEO_UNKNOWN5e m_video[0x5e/2] // $01cf at startup, kept $01bf in running game, $01c3 at testing +#define VIDEO_UNKNOWN60 m_video[0x60/2] // $01e3 at startup +#define VIDEO_UNKNOWN62 m_video[0x62/2] // $01cf at startup +#define VIDEO_UNKNOWN64 m_video[0x64/2] // $01ff at startup +#define VIDEO_UNKNOWN66 m_video[0x66/2] // $0183 at startup, kept $01bf in running game, $1ff at testing +#define VIDEO_UNKNOWN68 m_video[0x68/2] // $01ff at startup +#define VIDEO_UNKNOWN6a m_video[0x6a/2] // $000f at startup +#define VIDEO_UNKNOWN6c m_video[0x6c/2] // $018f at startup +#define VIDEO_UNKNOWN6e m_video[0x6e/2] // $01ff at startup, kept $01ff in running game, $01c3 at testing +#define VIDEO_UNKNOWN70 m_video[0x70/2] // $000f at startup +#define VIDEO_UNKNOWN72 m_video[0x72/2] // $000f at startup +#define VIDEO_UNKNOWN74 m_video[0x74/2] // $01ff at startup +#define VIDEO_UNKNOWN76 m_video[0x76/2] // $01ff at startup +#define VIDEO_UNKNOWN78 m_video[0x78/2] // $01ff at startup +#define VIDEO_UNKNOWN7a m_video[0x7a/2] // $01ff at startup +#define VIDEO_UNKNOWN7c m_video[0x7c/2] // $0820 at startup +#define VIDEO_UNKNOWN7e m_video[0x7e/2] // $0100 at startup + +#define VIDEO_STARTSTEP m_video[0x80/2] // drivedge only? +#define VIDEO_LEFTSTEPLO m_video[0x82/2] // drivedge only? +#define VIDEO_LEFTSTEPHI m_video[0x84/2] // drivedge only? +#define VIDEO_RIGHTSTEPLO m_video[0x86/2] // drivedge only? +#define VIDEO_RIGHTSTEPHI m_video[0x88/2] // drivedge only? + +static constexpr u16 VIDEOINT_SCANLINE = 0x0004; +static constexpr u16 VIDEOINT_BLITTER = 0x0040; + +static constexpr u16 XFERFLAG_TRANSPARENT = 0x0001; +static constexpr u16 XFERFLAG_XFLIP = 0x0002; +static constexpr u16 XFERFLAG_YFLIP = 0x0004; +static constexpr u16 XFERFLAG_DSTXSCALE = 0x0008; +static constexpr u16 XFERFLAG_DYDXSIGN = 0x0010; +static constexpr u16 XFERFLAG_DXDYSIGN = 0x0020; +static constexpr u16 XFERFLAG_UNKNOWN8 = 0x0100; +static constexpr u16 XFERFLAG_CLIP = 0x0400; +static constexpr u16 XFERFLAG_WIDTHPIX = 0x8000; + +static constexpr u16 XFERFLAG_KNOWNFLAGS = (XFERFLAG_TRANSPARENT | XFERFLAG_XFLIP | XFERFLAG_YFLIP | XFERFLAG_DSTXSCALE | XFERFLAG_DYDXSIGN | XFERFLAG_DXDYSIGN | XFERFLAG_CLIP | XFERFLAG_WIDTHPIX); + +static constexpr int VRAM_WIDTH = 512; @@ -168,32 +175,30 @@ inline void itech32_state::enable_clipping() void itech32_state::video_start() { - int i; - - /* allocate memory */ + // allocate memory m_videoram = std::make_unique(VRAM_WIDTH * (m_vram_height + 16) * 2); std::fill_n(&m_videoram[0], VRAM_WIDTH * (m_vram_height + 16) * 2, 0xff); - /* videoplane[0] is the foreground; videoplane[1] is the background */ + // videoplane[0] is the foreground; videoplane[1] is the background m_videoplane[0] = &m_videoram[0 * VRAM_WIDTH * (m_vram_height + 16) + 8 * VRAM_WIDTH]; m_videoplane[1] = &m_videoram[1 * VRAM_WIDTH * (m_vram_height + 16) + 8 * VRAM_WIDTH]; - /* set the masks */ + // set the masks m_vram_mask = VRAM_WIDTH * m_vram_height - 1; m_vram_xmask = VRAM_WIDTH - 1; m_vram_ymask = m_vram_height - 1; - /* clear the planes initially */ - for (i = 0; i < VRAM_WIDTH * m_vram_height; i++) + // clear the planes initially + for (int i = 0; i < VRAM_WIDTH * m_vram_height; i++) m_videoplane[0][i] = m_videoplane[1][i] = 0xff; - /* fetch the GROM base */ + // fetch the GROM base m_grom_bank = 0; m_grom_bank_mask = m_grom.length() >> 24; if (m_grom_bank_mask == 2) m_grom_bank_mask = 3; - /* reset statics */ + // reset statics std::fill_n(&m_video[0], m_video.bytes() >> 1, 0); m_scanline_timer = timer_alloc(FUNC(itech32_state::scanline_interrupt), this); @@ -227,8 +232,8 @@ void shoottv_state::video_start() void itech32_state::timekill_colora_w(u8 data) { - m_enable_latch[0] = (~data >> 5) & 1; - m_enable_latch[1] = (~data >> 7) & 1; + m_enable_latch[0] = BIT(~data, 5); + m_enable_latch[1] = BIT(~data, 7); m_color_latch[0] = (data & 0x0f) << 8; } @@ -249,15 +254,15 @@ void itech32_state::timekill_intensity_w(u8 data) void itech32_state::bloodstm_plane_w(u8 data) { - m_enable_latch[0] = (~data >> 1) & 1; - m_enable_latch[1] = (~data >> 2) & 1; + m_enable_latch[0] = BIT(~data, 1); + m_enable_latch[1] = BIT(~data, 2); } void itech32_state::itech020_plane_w(u8 data) { - m_enable_latch[0] = (~data >> 1) & 1; - m_enable_latch[1] = (~data >> 2) & 1; + m_enable_latch[0] = BIT(~data, 1); + m_enable_latch[1] = BIT(~data, 2); m_grom_bank = ((data >> 6) & m_grom_bank_mask) << 24; } @@ -271,7 +276,7 @@ void itech32_state::itech020_plane_w(u8 data) void itech32_state::bloodstm_paletteram_w(offs_t offset, u16 data, u16 mem_mask) { - /* in test mode, the LSB is used; in game mode, the MSB is used */ + // in test mode, the LSB is used; in game mode, the MSB is used if (!ACCESSING_BITS_0_7 && (offset & 1)) { data >>= 8; @@ -296,8 +301,8 @@ void drivedge_state::logblit(const char *tag) if (VIDEO_TRANSFER_FLAGS == 0x5490) { - /* polygon drawing */ - logerror("%s: e=%d%d f=%04x s=(%03x-%03x,%03x) w=%03x h=%03x b=%02x%04x c=%02x%02x ss=%04x,%04x ds=%04x,%04x ls=%04x%04x rs=%04x%04x u80=%04x", tag, + // polygon drawing + LOGBLITTER("%s: e=%d%d f=%04x s=(%03x-%03x,%03x) w=%03x h=%03x b=%02x%04x c=%02x%02x ss=%04x,%04x ds=%04x,%04x ls=%04x%04x rs=%04x%04x u80=%04x", tag, m_enable_latch[0], m_enable_latch[1], VIDEO_TRANSFER_FLAGS, VIDEO_TRANSFER_X, VIDEO_RIGHTCLIP, VIDEO_TRANSFER_Y, VIDEO_TRANSFER_WIDTH, VIDEO_TRANSFER_HEIGHT, @@ -307,7 +312,7 @@ void drivedge_state::logblit(const char *tag) VIDEO_DST_XSTEP, VIDEO_DST_YSTEP, VIDEO_LEFTSTEPHI, VIDEO_LEFTSTEPLO, VIDEO_RIGHTSTEPHI, VIDEO_RIGHTSTEPLO, VIDEO_STARTSTEP); - logerror(" v0=%08x v1=%08x v2=%08x v3=%08x\n", m_zbuf_control[0], m_zbuf_control[1], m_zbuf_control[2], m_zbuf_control[3]); + LOGBLITTER(" v0=%08x v1=%08x v2=%08x v3=%08x\n", m_zbuf_control[0], m_zbuf_control[1], m_zbuf_control[2], m_zbuf_control[3]); } else { @@ -324,7 +329,7 @@ void itech32_state::logblit(const char *tag) m_video[0x1a/2] == 0x000 && m_video[0x1c/2] == 0x100 && m_video[0x1e/2] == 0x000 && m_video[0x20/2] == 0x000) { - logerror("%s: e=%d%d f=%04x c=%02x%02x %02x%04x -> (%03x,%03x) %3dx%3dc=(%03x,%03x)-(%03x,%03x)", tag, + LOGBLITTER("%s: e=%d%d f=%04x c=%02x%02x %02x%04x -> (%03x,%03x) %3dx%3dc=(%03x,%03x)-(%03x,%03x)", tag, m_enable_latch[0], m_enable_latch[1], VIDEO_TRANSFER_FLAGS, m_color_latch[0] >> 8, m_color_latch[1] >> 8, @@ -335,7 +340,7 @@ void itech32_state::logblit(const char *tag) } else { - logerror("%s: e=%d%d f=%04x c=%02x%02x %02x%04x -> (%03x,%03x) %3dx%d c=(%03x,%03x)-(%03x,%03x) s=%04x %04x %04x %04x %04x %04x", tag, + LOGBLITTER("%s: e=%d%d f=%04x c=%02x%02x %02x%04x -> (%03x,%03x) %3dx%d c=(%03x,%03x)-(%03x,%03x) s=%04x %04x %04x %04x %04x %04x", tag, m_enable_latch[0], m_enable_latch[1], VIDEO_TRANSFER_FLAGS, m_color_latch[0] >> 8, m_color_latch[1] >> 8, @@ -346,7 +351,7 @@ void itech32_state::logblit(const char *tag) m_video[0x16/2], m_video[0x18/2], m_video[0x1a/2], m_video[0x1c/2], m_video[0x1e/2], m_video[0x20/2]); } - logerror("\n"); + LOGBLITTER("\n"); } @@ -357,7 +362,7 @@ void itech32_state::logblit(const char *tag) * *************************************/ -void itech32_state::update_interrupts(int fast) +void itech32_state::update_interrupts() { int scanline_state = 0, blitter_state = 0; @@ -372,21 +377,21 @@ void itech32_state::update_interrupts(int fast) TIMER_CALLBACK_MEMBER(itech32_state::scanline_interrupt) { - /* set timer for next frame */ + // set timer for next frame m_scanline_timer->adjust(m_screen->time_until_pos(VIDEO_INTSCANLINE)); - /* set the interrupt bit in the status reg */ - //logerror("-------------- (DISPLAY INT @ %d) ----------------\n", m_screen->vpos()); + // set the interrupt bit in the status reg + //LOGSCREEN("-------------- (DISPLAY INT @ %d) ----------------\n", m_screen->vpos()); VIDEO_INTSTATE |= VIDEOINT_SCANLINE; - /* update the interrupt state */ - update_interrupts(0); + // update the interrupt state + update_interrupts(); } TIMER_CALLBACK_MEMBER(shoottv_state::gun_interrupt) { - s32 vpos = m_screen->vpos(); + const s32 vpos = m_screen->vpos(); if ((vpos & 0x1f) == 0) m_maincpu->set_input_line(5, ASSERT_LINE); if ((vpos & 0x1f) == 16) @@ -402,58 +407,58 @@ TIMER_CALLBACK_MEMBER(shoottv_state::gun_interrupt) void itech32_state::draw_raw(u16 *base, u16 color) { - u8* src = &m_grom[0];// m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; + const u8* src = &m_grom[0];// m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; const u32 grom_length = m_grom.length(); const u32 grom_base = m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO; - int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; - int width = VIDEO_TRANSFER_WIDTH << 8; - int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8; - int xsrcstep = VIDEO_SRC_XSTEP; - int ysrcstep = VIDEO_SRC_YSTEP; + const int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; + const int width = VIDEO_TRANSFER_WIDTH << 8; + const int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8; + const int xsrcstep = VIDEO_SRC_XSTEP; + const int ysrcstep = VIDEO_SRC_YSTEP; int sx, sy = (VIDEO_TRANSFER_Y & 0xfff) << 8; int startx = (VIDEO_TRANSFER_X & 0xfff) << 8; int xdststep = 0x100; int ydststep = VIDEO_DST_YSTEP; int x, y; - /* adjust for (lack of) clipping */ + // adjust for (lack of) clipping if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP)) disable_clipping(); - /* adjust for scaling */ + // adjust for scaling if (VIDEO_TRANSFER_FLAGS & XFERFLAG_DSTXSCALE) xdststep = VIDEO_DST_XSTEP; - /* adjust for flipping */ + // adjust for flipping if (VIDEO_TRANSFER_FLAGS & XFERFLAG_XFLIP) xdststep = -xdststep; if (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ydststep = -ydststep; - /* loop over Y in src pixels */ + // loop over Y in src pixels for (y = 0; y < height; y += ysrcstep, sy += ydststep) { const u32 row_base = (y >> 8) * (width >> 8); - /* simpler case: VIDEO_YSTEP_PER_X is zero */ + // simpler case: VIDEO_YSTEP_PER_X is zero if (VIDEO_YSTEP_PER_X == 0) { - /* clip in the Y direction */ + // clip in the Y direction if (sy >= m_scaled_clip_rect.min_y && sy < m_scaled_clip_rect.max_y) { u32 dstoffs; - /* direction matters here */ + // direction matters here sx = startx; if (xdststep > 0) { - /* skip left pixels */ + // skip left pixels for (x = 0; x < width && sx < m_scaled_clip_rect.min_x; x += xsrcstep, sx += xdststep) ; - /* compute the address */ + // compute the address dstoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); - /* render middle pixels */ + // render middle pixels for ( ; x < width && sx < m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep) { int pixel = src[(grom_base + row_base + (x >> 8)) % grom_length]; @@ -463,13 +468,13 @@ void itech32_state::draw_raw(u16 *base, u16 color) } else { - /* skip right pixels */ + // skip right pixels for (x = 0; x < width && sx >= m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep) ; - /* compute the address */ + // compute the address dstoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); - /* render middle pixels */ + // render middle pixels for ( ; x < width && sx >= m_scaled_clip_rect.min_x; x += xsrcstep, sx += xdststep) { int pixel = src[(grom_base + row_base + (x >> 8)) % grom_length]; @@ -480,13 +485,13 @@ void itech32_state::draw_raw(u16 *base, u16 color) } } - /* slow case: VIDEO_YSTEP_PER_X is non-zero */ + // slow case: VIDEO_YSTEP_PER_X is non-zero else { int ystep = (VIDEO_TRANSFER_FLAGS & XFERFLAG_DYDXSIGN) ? -VIDEO_YSTEP_PER_X : VIDEO_YSTEP_PER_X; int ty = sy; - /* render all pixels */ + // render all pixels sx = startx; for (x = 0; x < width && sx < m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep, ty += ystep) if (m_scaled_clip_rect.contains(sx, ty)) @@ -497,50 +502,50 @@ void itech32_state::draw_raw(u16 *base, u16 color) } } - /* apply skew */ + // apply skew if (VIDEO_TRANSFER_FLAGS & XFERFLAG_DXDYSIGN) startx += VIDEO_XSTEP_PER_Y; else startx -= VIDEO_XSTEP_PER_Y; } - /* restore cliprects */ + // restore cliprects if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP)) enable_clipping(); } -/* draw a scaled primitive such that the specified width is in pixel, not scaled, coordinates */ +// draw a scaled primitive such that the specified width is in pixel, not scaled, coordinates void itech32_state::draw_raw_widthpix(u16 *base, u16 color) { - u8* src = &m_grom[0];// m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; + const u8* src = &m_grom[0];// m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; const u32 grom_length = m_grom.length(); const u32 grom_base = m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO; - int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; - int width = VIDEO_TRANSFER_WIDTH << 8; - int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8; - int xsrcstep = VIDEO_SRC_XSTEP; - int ysrcstep = VIDEO_SRC_YSTEP; + const int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; + const int width = VIDEO_TRANSFER_WIDTH << 8; + const int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8; + const int xsrcstep = VIDEO_SRC_XSTEP; + const int ysrcstep = VIDEO_SRC_YSTEP; int sx, sy = (VIDEO_TRANSFER_Y & 0xfff) << 8; int startx = (VIDEO_TRANSFER_X & 0xfff) << 8; int xdststep = 0x100; int ydststep = VIDEO_DST_YSTEP; int x, y, px; - /* adjust for (lack of) clipping */ + // adjust for (lack of) clipping if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP)) disable_clipping(); - /* adjust for scaling */ + // adjust for scaling if (VIDEO_TRANSFER_FLAGS & XFERFLAG_DSTXSCALE) xdststep = VIDEO_DST_XSTEP; - /* adjust for flipping */ + // adjust for flipping if (VIDEO_TRANSFER_FLAGS & XFERFLAG_XFLIP) xdststep = -xdststep; if (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ydststep = -ydststep; - /* loop over Y in src pixels */ + // loop over Y in src pixels for (y = 0; y < height; y += ysrcstep, sy += ydststep) { const u32 row_base = (y >> 8) * (width >> 8); @@ -548,25 +553,25 @@ void itech32_state::draw_raw_widthpix(u16 *base, u16 color) x = 0; px = 0; - /* simpler case: VIDEO_YSTEP_PER_X is zero */ + // simpler case: VIDEO_YSTEP_PER_X is zero if (VIDEO_YSTEP_PER_X == 0) { - /* clip in the Y direction */ + // clip in the Y direction if (sy >= m_scaled_clip_rect.min_y && sy < m_scaled_clip_rect.max_y) { u32 dstoffs; - /* direction matters here */ + // direction matters here sx = startx; if (xdststep > 0) { - /* skip left pixels */ + // skip left pixels for ( ; px < width && sx < m_scaled_clip_rect.min_x; x += xsrcstep, px += 0x100, sx += xdststep) ; - /* compute the address */ + // compute the address dstoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); - /* render middle pixels */ + // render middle pixels for ( ; px < width && sx < m_scaled_clip_rect.max_x; x += xsrcstep, px += 0x100, sx += xdststep) { int pixel = src[(grom_base + row_base + (x >> 8)) % grom_length]; @@ -576,13 +581,13 @@ void itech32_state::draw_raw_widthpix(u16 *base, u16 color) } else { - /* skip right pixels */ + // skip right pixels for ( ; px < width && sx >= m_scaled_clip_rect.max_x; x += xsrcstep, px += 0x100, sx += xdststep) ; - /* compute the address */ + // compute the address dstoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); - /* render middle pixels */ + // render middle pixels for ( ; px < width && sx >= m_scaled_clip_rect.min_x; x += xsrcstep, px += 0x100, sx += xdststep) { int pixel = src[(grom_base + row_base + (x >> 8)) % grom_length]; @@ -593,13 +598,13 @@ void itech32_state::draw_raw_widthpix(u16 *base, u16 color) } } - /* slow case: VIDEO_YSTEP_PER_X is non-zero */ + // slow case: VIDEO_YSTEP_PER_X is non-zero else { int ystep = (VIDEO_TRANSFER_FLAGS & XFERFLAG_DYDXSIGN) ? -VIDEO_YSTEP_PER_X : VIDEO_YSTEP_PER_X; int ty = sy; - /* render all pixels */ + // render all pixels sx = startx; for ( ; px < width && sx < m_scaled_clip_rect.max_x; x += xsrcstep, px += 0x100, sx += xdststep, ty += ystep) if (m_scaled_clip_rect.contains(sx, ty)) @@ -610,82 +615,82 @@ void itech32_state::draw_raw_widthpix(u16 *base, u16 color) } } - /* apply skew */ + // apply skew if (VIDEO_TRANSFER_FLAGS & XFERFLAG_DXDYSIGN) startx += VIDEO_XSTEP_PER_Y; else startx -= VIDEO_XSTEP_PER_Y; } - /* restore cliprects */ + // restore cliprects if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP)) enable_clipping(); } void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) { - u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; - int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; + const u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; + const int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; int width = VIDEO_TRANSFER_WIDTH << 8; - int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8; - int xsrcstep = VIDEO_SRC_XSTEP; - int ysrcstep = VIDEO_SRC_YSTEP; + const int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT) << 8; + const int xsrcstep = VIDEO_SRC_XSTEP; + const int ysrcstep = VIDEO_SRC_YSTEP; int sx, sy = ((VIDEO_TRANSFER_Y & 0xfff) << 8) + 0x80; int startx = ((VIDEO_TRANSFER_X & 0xfff) << 8) + 0x80; int xdststep = 0x100; int ydststep = VIDEO_DST_YSTEP; - int32_t z0 = m_zbuf_control[2] & 0x7ff00; - int32_t zmatch = (m_zbuf_control[2] & 0x1f) << 11; - int32_t srcdelta = 0; + s32 z0 = m_zbuf_control[2] & 0x7ff00; + const s32 zmatch = (m_zbuf_control[2] & 0x1f) << 11; + s32 srcdelta = 0; int x, y; - /* adjust for (lack of) clipping */ + // adjust for (lack of) clipping if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP)) disable_clipping(); - /* adjust for scaling */ + // adjust for scaling if (VIDEO_TRANSFER_FLAGS & XFERFLAG_DSTXSCALE) xdststep = VIDEO_DST_XSTEP; - /* adjust for flipping */ + // adjust for flipping if (VIDEO_TRANSFER_FLAGS & XFERFLAG_XFLIP) xdststep = -xdststep; if (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ydststep = -ydststep; - /* loop over Y in src pixels */ + // loop over Y in src pixels for (y = 0; y < height; y += ysrcstep, sy += ydststep) { - u8 *rowsrc = src + (srcdelta >> 8); + const u8 *rowsrc = src + (srcdelta >> 8); - /* in the polygon case, we don't factor in the Y */ + // in the polygon case, we don't factor in the Y if (VIDEO_TRANSFER_FLAGS != 0x5490) rowsrc += (y >> 8) * (width >> 8); else width = 1000 << 8; - /* simpler case: VIDEO_YSTEP_PER_X is zero */ + // simpler case: VIDEO_YSTEP_PER_X is zero if (VIDEO_YSTEP_PER_X == 0) { - /* clip in the Y direction */ + // clip in the Y direction if (sy >= m_scaled_clip_rect.min_y && sy < m_scaled_clip_rect.max_y) { u32 dstoffs, zbufoffs; - int32_t z = z0; + s32 z = z0; - /* direction matters here */ + // direction matters here sx = startx; if (xdststep > 0) { - /* skip left pixels */ + // skip left pixels for (x = 0; x < width && sx < m_scaled_clip_rect.min_x; x += xsrcstep, sx += xdststep) - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; - /* compute the address */ + // compute the address dstoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); zbufoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); - /* render middle pixels */ + // render middle pixels if (m_zbuf_control[3] & 0x8000) { for ( ; x < width && sx < m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep) @@ -696,7 +701,7 @@ void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] = (z >> 8) | zmatch; } - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; } } else if (m_zbuf_control[3] & 0x4000) @@ -706,7 +711,7 @@ void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) int pixel = rowsrc[x >> 8]; if (pixel != transparent_pen && zmatch == (zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] & (0x1f << 11))) base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; } } else @@ -719,21 +724,21 @@ void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] = (z >> 8) | zmatch; } - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; } } } else { - /* skip right pixels */ + // skip right pixels for (x = 0; x < width && sx >= m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep) - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; - /* compute the address */ + // compute the address dstoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); zbufoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); - /* render middle pixels */ + // render middle pixels if (m_zbuf_control[3] & 0x8000) { for ( ; x < width && sx >= m_scaled_clip_rect.min_x; x += xsrcstep, sx += xdststep) @@ -744,7 +749,7 @@ void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] = (z >> 8) | zmatch; } - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; } } else if (m_zbuf_control[3] & 0x4000) @@ -754,7 +759,7 @@ void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) int pixel = rowsrc[x >> 8]; if (pixel != transparent_pen && zmatch == (zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] & (0x1f << 11))) base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; } } else @@ -767,21 +772,21 @@ void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] = (z >> 8) | zmatch; } - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; } } } } } - /* slow case: VIDEO_YSTEP_PER_X is non-zero */ + // slow case: VIDEO_YSTEP_PER_X is non-zero else { int ystep = (VIDEO_TRANSFER_FLAGS & XFERFLAG_DYDXSIGN) ? -VIDEO_YSTEP_PER_X : VIDEO_YSTEP_PER_X; int ty = sy; - int32_t z = z0; + s32 z = z0; - /* render all pixels */ + // render all pixels sx = startx; if (m_zbuf_control[3] & 0x8000) { @@ -794,7 +799,7 @@ void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color; zbase[compute_safe_address(sx >> 8, ty >> 8)] = (z >> 8) | zmatch; } - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; } } else if (m_zbuf_control[3] & 0x4000) @@ -809,7 +814,7 @@ void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color; *zbuf = (z >> 8) | zmatch; } - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; } } else @@ -824,32 +829,32 @@ void drivedge_state::draw_raw(u16 *base, u16 *zbase, u16 color) base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color; *zbuf = (z >> 8) | zmatch; } - z += (int32_t)m_zbuf_control[0]; + z += (s32)m_zbuf_control[0]; } } } - /* apply skew */ + // apply skew if (VIDEO_TRANSFER_FLAGS & XFERFLAG_DXDYSIGN) startx += VIDEO_XSTEP_PER_Y; else startx -= VIDEO_XSTEP_PER_Y; - /* update the per-scanline parameters */ + // update the per-scanline parameters if (VIDEO_TRANSFER_FLAGS == 0x5490) { - startx += (int32_t)((VIDEO_LEFTSTEPHI << 16) | VIDEO_LEFTSTEPLO); - m_scaled_clip_rect.max_x += (int32_t)((VIDEO_RIGHTSTEPHI << 16) | VIDEO_RIGHTSTEPLO); - srcdelta += (int16_t)VIDEO_STARTSTEP; + startx += (s32)((VIDEO_LEFTSTEPHI << 16) | VIDEO_LEFTSTEPLO); + m_scaled_clip_rect.max_x += (s32)((VIDEO_RIGHTSTEPHI << 16) | VIDEO_RIGHTSTEPLO); + srcdelta += (s16)VIDEO_STARTSTEP; } - z0 += (int32_t)m_zbuf_control[1]; + z0 += (s32)m_zbuf_control[1]; } - /* restore cliprects */ + // restore cliprects if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP)) enable_clipping(); - /* reflect the final values into registers */ + // reflect the final values into registers VIDEO_TRANSFER_X = (VIDEO_TRANSFER_X & ~0xfff) | (startx >> 8); VIDEO_RIGHTCLIP = (VIDEO_RIGHTCLIP & ~0xfff) | (m_scaled_clip_rect.max_x >> 8); VIDEO_TRANSFER_Y = (VIDEO_TRANSFER_Y & ~0xfff) | ((VIDEO_TRANSFER_Y + (y >> 8)) & 0xfff); @@ -906,53 +911,52 @@ do { \ inline void itech32_state::draw_rle_fast(u16 *base, u16 color) { - u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; - int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; + const u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; + const int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; int width = VIDEO_TRANSFER_WIDTH; - int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); + const int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); int sx = VIDEO_TRANSFER_X & 0xfff; int sy = (VIDEO_TRANSFER_Y & 0xfff) << 8; int xleft, y, count = 0, val = 0, innercount; int ydststep = VIDEO_DST_YSTEP; - int lclip, rclip; - /* determine clipping */ - lclip = m_clip_rect.min_x - sx; + // determine clipping + int lclip = m_clip_rect.min_x - sx; if (lclip < 0) lclip = 0; - rclip = sx + width - m_clip_rect.max_x; + int rclip = sx + width - m_clip_rect.max_x; if (rclip < 0) rclip = 0; width -= lclip + rclip; sx += lclip; - /* adjust for flipping */ + // adjust for flipping if (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ydststep = -ydststep; - /* loop over Y in src pixels */ + // loop over Y in src pixels for (y = 0; y < height; y++, sy += ydststep) { u32 dstoffs; - /* clip in the Y direction */ + // clip in the Y direction if (sy < m_scaled_clip_rect.min_y || sy >= m_scaled_clip_rect.max_y) { SKIP_RLE(width + lclip + rclip, xleft, count, innercount, src); continue; } - /* compute the address */ + // compute the address dstoffs = compute_safe_address(sx, sy >> 8); - /* left clip */ + // left clip SKIP_RLE(lclip, xleft, count, innercount, src); - /* loop until gone */ + // loop until gone for (xleft = width; xleft > 0; ) { - /* load next RLE chunk if needed */ + // load next RLE chunk if needed GET_NEXT_RUN(xleft, count, innercount, src); - /* run of literals */ + // run of literals if (val == -1) while (innercount--) { @@ -962,7 +966,7 @@ inline void itech32_state::draw_rle_fast(u16 *base, u16 color) dstoffs++; } - /* run of non-transparent repeats */ + // run of non-transparent repeats else if (val != transparent_pen) { val |= color; @@ -970,12 +974,12 @@ inline void itech32_state::draw_rle_fast(u16 *base, u16 color) base[dstoffs++ & m_vram_mask] = val; } - /* run of transparent repeats */ + // run of transparent repeats else dstoffs += innercount; } - /* right clip */ + // right clip SKIP_RLE(rclip, xleft, count, innercount, src); } } @@ -983,53 +987,52 @@ inline void itech32_state::draw_rle_fast(u16 *base, u16 color) inline void itech32_state::draw_rle_fast_xflip(u16 *base, u16 color) { - u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; - int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; + const u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; + const int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; int width = VIDEO_TRANSFER_WIDTH; - int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); + const int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); int sx = VIDEO_TRANSFER_X & 0xfff; int sy = (VIDEO_TRANSFER_Y & 0xfff) << 8; int xleft, y, count = 0, val = 0, innercount; int ydststep = VIDEO_DST_YSTEP; - int lclip, rclip; - /* determine clipping */ - lclip = sx - m_clip_rect.max_x; + // determine clipping + int lclip = sx - m_clip_rect.max_x; if (lclip < 0) lclip = 0; - rclip = m_clip_rect.min_x - (sx - width); + int rclip = m_clip_rect.min_x - (sx - width); if (rclip < 0) rclip = 0; width -= lclip + rclip; sx -= lclip; - /* adjust for flipping */ + // adjust for flipping if (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ydststep = -ydststep; - /* loop over Y in src pixels */ + // loop over Y in src pixels for (y = 0; y < height; y++, sy += ydststep) { u32 dstoffs; - /* clip in the Y direction */ + // clip in the Y direction if (sy < m_scaled_clip_rect.min_y || sy >= m_scaled_clip_rect.max_y) { SKIP_RLE(width + lclip + rclip, xleft, count, innercount, src); continue; } - /* compute the address */ + // compute the address dstoffs = compute_safe_address(sx, sy >> 8); - /* left clip */ + // left clip SKIP_RLE(lclip, xleft, count, innercount, src); - /* loop until gone */ + // loop until gone for (xleft = width; xleft > 0; ) { - /* load next RLE chunk if needed */ + // load next RLE chunk if needed GET_NEXT_RUN(xleft, count, innercount, src); - /* run of literals */ + // run of literals if (val == -1) while (innercount--) { @@ -1039,7 +1042,7 @@ inline void itech32_state::draw_rle_fast_xflip(u16 *base, u16 color) dstoffs--; } - /* run of non-transparent repeats */ + // run of non-transparent repeats else if (val != transparent_pen) { val |= color; @@ -1047,12 +1050,12 @@ inline void itech32_state::draw_rle_fast_xflip(u16 *base, u16 color) base[dstoffs-- & m_vram_mask] = val; } - /* run of transparent repeats */ + // run of transparent repeats else dstoffs -= innercount; } - /* right clip */ + // right clip SKIP_RLE(rclip, xleft, count, innercount, src); } } @@ -1067,49 +1070,49 @@ inline void itech32_state::draw_rle_fast_xflip(u16 *base, u16 color) inline void itech32_state::draw_rle_slow(u16 *base, u16 color) { - u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; - int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; - int width = VIDEO_TRANSFER_WIDTH; - int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); + const u8 *src = &m_grom[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom.length()]; + const int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; + const int width = VIDEO_TRANSFER_WIDTH; + const int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); int sx, sy = (VIDEO_TRANSFER_Y & 0xfff) << 8; int xleft, y, count = 0, val = 0, innercount; int xdststep = 0x100; int ydststep = VIDEO_DST_YSTEP; int startx = (VIDEO_TRANSFER_X & 0xfff) << 8; - /* adjust for scaling */ + // adjust for scaling if (VIDEO_TRANSFER_FLAGS & XFERFLAG_DSTXSCALE) xdststep = VIDEO_DST_XSTEP; - /* adjust for flipping */ + // adjust for flipping if (VIDEO_TRANSFER_FLAGS & XFERFLAG_XFLIP) xdststep = -xdststep; if (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ydststep = -ydststep; - /* loop over Y in src pixels */ + // loop over Y in src pixels for (y = 0; y < height; y++, sy += ydststep) { u32 dstoffs; - /* clip in the Y direction */ + // clip in the Y direction if (sy < m_scaled_clip_rect.min_y || sy >= m_scaled_clip_rect.max_y) { SKIP_RLE(width, xleft, count, innercount, src); continue; } - /* compute the address */ + // compute the address sx = startx; dstoffs = compute_safe_address(m_clip_rect.min_x, sy >> 8) - m_clip_rect.min_x; - /* loop until gone */ + // loop until gone for (xleft = width; xleft > 0; ) { - /* load next RLE chunk if needed */ + // load next RLE chunk if needed GET_NEXT_RUN(xleft, count, innercount, src); - /* run of literals */ + // run of literals if (val == -1) for ( ; innercount--; sx += xdststep) { @@ -1119,7 +1122,7 @@ inline void itech32_state::draw_rle_slow(u16 *base, u16 color) base[(dstoffs + (sx >> 8)) & m_vram_mask] = color | pixel; } - /* run of non-transparent repeats */ + // run of non-transparent repeats else if (val != transparent_pen) { val |= color; @@ -1128,12 +1131,12 @@ inline void itech32_state::draw_rle_slow(u16 *base, u16 color) base[(dstoffs + (sx >> 8)) & m_vram_mask] = val; } - /* run of transparent repeats */ + // run of transparent repeats else sx += xdststep * innercount; } - /* apply skew */ + // apply skew if (VIDEO_TRANSFER_FLAGS & XFERFLAG_DXDYSIGN) startx += VIDEO_XSTEP_PER_Y; else @@ -1145,21 +1148,21 @@ inline void itech32_state::draw_rle_slow(u16 *base, u16 color) void itech32_state::draw_rle(u16 *base, u16 color) { - /* adjust for (lack of) clipping */ + // adjust for (lack of) clipping if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP)) disable_clipping(); - /* if we have an X scale, draw it slow */ + // if we have an X scale, draw it slow if (((VIDEO_TRANSFER_FLAGS & XFERFLAG_DSTXSCALE) && VIDEO_DST_XSTEP != 0x100) || VIDEO_XSTEP_PER_Y) draw_rle_slow(base, color); - /* else draw it fast */ + // else draw it fast else if (VIDEO_TRANSFER_FLAGS & XFERFLAG_XFLIP) draw_rle_fast_xflip(base, color); else draw_rle_fast(base, color); - /* restore cliprects */ + // restore cliprects if (!(VIDEO_TRANSFER_FLAGS & XFERFLAG_CLIP)) enable_clipping(); } @@ -1179,11 +1182,11 @@ void itech32_state::shiftreg_clear(u16 *base, u16 *zbase) const int sx = VIDEO_TRANSFER_X & 0xfff; int sy = VIDEO_TRANSFER_Y & 0xfff; - /* first line is the source */ - u16 *src = &base[compute_safe_address(sx, sy)]; + // first line is the source + const u16 *src = &base[compute_safe_address(sx, sy)]; sy += ydir; - /* loop over height */ + // loop over height for (int y = 1; y < height; y++) { memcpy(&base[compute_safe_address(sx, sy)], src, 512*2); @@ -1198,20 +1201,19 @@ void drivedge_state::shiftreg_clear(u16 *base, u16 *zbase) int sx = VIDEO_TRANSFER_X & 0xfff; int sy = VIDEO_TRANSFER_Y & 0xfff; - /* first line is the source */ - u16 *src = &base[compute_safe_address(sx, sy)]; + // first line is the source + const u16 *src = &base[compute_safe_address(sx, sy)]; sy += ydir; - /* loop over height */ + // loop over height for (int y = 1; y < height; y++) { memcpy(&base[compute_safe_address(sx, sy)], src, 512*2); if (zbase) { - u16 zval = ((m_zbuf_control[2] >> 8) & 0x7ff) | ((m_zbuf_control[2] & 0x1f) << 11); + const u16 zval = ((m_zbuf_control[2] >> 8) & 0x7ff) | ((m_zbuf_control[2] & 0x1f) << 11); u16 *dst = &zbase[compute_safe_address(sx, sy)]; - int x; - for (x = 0; x < 512; x++) + for (int x = 0; x < 512; x++) *dst++ = zval; } sy += ydir; @@ -1228,61 +1230,61 @@ void drivedge_state::shiftreg_clear(u16 *base, u16 *zbase) void itech32_state::handle_video_command() { - /* only 6 known commands */ + // only 6 known commands switch (VIDEO_COMMAND) { - /* command 1: blit raw data */ + // command 1: blit raw data case 1: command_blit_raw(); break; - /* command 2: blit RLE-compressed data */ + // command 2: blit RLE-compressed data case 2: { auto profile = g_profiler.start(PROFILER_USER2); - if (BLIT_LOGGING) logblit("Blit RLE"); + if (VERBOSE & LOG_BLITTER) logblit("Blit RLE"); if (m_enable_latch[0]) draw_rle(m_videoplane[0], m_color_latch[0]); if (m_enable_latch[1]) draw_rle(m_videoplane[1], m_color_latch[1]); } break; - /* command 3: set up raw data transfer */ + // command 3: set up raw data transfer case 3: - if (BLIT_LOGGING) logblit("Raw Xfer"); + if (VERBOSE & LOG_BLITTER) logblit("Raw Xfer"); m_xfer_xcount = VIDEO_TRANSFER_WIDTH; m_xfer_ycount = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); m_xfer_xcur = VIDEO_TRANSFER_X & 0xfff; m_xfer_ycur = VIDEO_TRANSFER_Y & 0xfff; break; - /* command 4: flush? */ + // command 4: flush? case 4: break; - /* command 5: reset? */ + // command 5: reset? case 5: break; - /* command 6: perform shift register copy */ + // command 6: perform shift register copy case 6: command_shift_reg(); break; default: - if (BLIT_LOGGING) logerror("Unknown blit command %d\n", VIDEO_COMMAND); + LOGBLITTER("Unknown blit command %d\n", VIDEO_COMMAND); break; } - /* tell the processor we're done */ + // tell the processor we're done VIDEO_INTSTATE |= VIDEOINT_BLITTER; - update_interrupts(1); + update_interrupts(); } void itech32_state::command_blit_raw() { auto profile = g_profiler.start(PROFILER_USER1); - if (BLIT_LOGGING) logblit("Blit Raw"); + if (VERBOSE & LOG_BLITTER) logblit("Blit Raw"); if (VIDEO_TRANSFER_FLAGS & XFERFLAG_WIDTHPIX) { @@ -1299,7 +1301,7 @@ void itech32_state::command_blit_raw() void drivedge_state::command_blit_raw() { auto profile = g_profiler.start(PROFILER_USER1); - if (BLIT_LOGGING) logblit("Blit Raw"); + if (VERBOSE & LOG_BLITTER) logblit("Blit Raw"); if (m_enable_latch[0]) draw_raw(m_videoplane[0], m_videoplane[1], m_color_latch[0]); } @@ -1307,7 +1309,7 @@ void drivedge_state::command_blit_raw() void itech32_state::command_shift_reg() { auto profile = g_profiler.start(PROFILER_USER3); - if (BLIT_LOGGING) logblit("ShiftReg"); + if (VERBOSE & LOG_BLITTER) logblit("ShiftReg"); if (m_enable_latch[0]) shiftreg_clear(m_videoplane[0], nullptr); if (m_enable_latch[1]) shiftreg_clear(m_videoplane[1], nullptr); @@ -1316,7 +1318,7 @@ void itech32_state::command_shift_reg() void drivedge_state::command_shift_reg() { auto profile = g_profiler.start(PROFILER_USER3); - if (BLIT_LOGGING) logblit("ShiftReg"); + if (VERBOSE & LOG_BLITTER) logblit("ShiftReg"); if (m_enable_latch[0]) shiftreg_clear(m_videoplane[0], m_videoplane[1]); } @@ -1337,12 +1339,12 @@ void itech32_state::video_w(offs_t offset, u16 data, u16 mem_mask) switch (offset) { - case 0x02/2: /* VIDEO_INTACK */ + case 0x02/2: // VIDEO_INTACK VIDEO_INTSTATE = old & ~data; - update_interrupts(1); + update_interrupts(); break; - case 0x04/2: /* VIDEO_TRANSFER */ + case 0x04/2: // VIDEO_TRANSFER if (VIDEO_COMMAND == 3 && m_xfer_ycount) { offs_t addr = compute_safe_address(m_xfer_xcur, m_xfer_ycur); @@ -1363,45 +1365,45 @@ void itech32_state::video_w(offs_t offset, u16 data, u16 mem_mask) } break; - case 0x08/2: /* VIDEO_COMMAND */ + case 0x08/2: // VIDEO_COMMAND handle_video_command(); break; - case 0x0a/2: /* VIDEO_INTENABLE */ - update_interrupts(1); + case 0x0a/2: // VIDEO_INTENABLE + update_interrupts(); break; - case 0x24/2: /* VIDEO_LEFTCLIP */ + case 0x24/2: // VIDEO_LEFTCLIP m_clip_rect.min_x = VIDEO_LEFTCLIP; m_scaled_clip_rect.min_x = VIDEO_LEFTCLIP << 8; break; - case 0x26/2: /* VIDEO_RIGHTCLIP */ + case 0x26/2: // VIDEO_RIGHTCLIP m_clip_rect.max_x = VIDEO_RIGHTCLIP; m_scaled_clip_rect.max_x = VIDEO_RIGHTCLIP << 8; break; - case 0x28/2: /* VIDEO_TOPCLIP */ + case 0x28/2: // VIDEO_TOPCLIP m_clip_rect.min_y = VIDEO_TOPCLIP; m_scaled_clip_rect.min_y = VIDEO_TOPCLIP << 8; break; - case 0x2a/2: /* VIDEO_BOTTOMCLIP */ + case 0x2a/2: // VIDEO_BOTTOMCLIP m_clip_rect.max_y = VIDEO_BOTTOMCLIP; m_scaled_clip_rect.max_y = VIDEO_BOTTOMCLIP << 8; break; - case 0x2c/2: /* VIDEO_INTSCANLINE */ + case 0x2c/2: // VIDEO_INTSCANLINE m_scanline_timer->adjust(m_screen->time_until_pos(VIDEO_INTSCANLINE)); break; - case 0x32/2: /* VIDEO_VTOTAL */ - case 0x36/2: /* VIDEO_VBLANK_START */ - case 0x38/2: /* VIDEO_VBLANK_END */ - case 0x3a/2: /* VIDEO_HTOTAL */ - case 0x3e/2: /* VIDEO_HBLANK_START */ - case 0x40/2: /* VIDEO_HBLANK_END */ - /* do some sanity checks first */ + case 0x32/2: // VIDEO_VTOTAL + case 0x36/2: // VIDEO_VBLANK_START + case 0x38/2: // VIDEO_VBLANK_END + case 0x3a/2: // VIDEO_HTOTAL + case 0x3e/2: // VIDEO_HBLANK_START + case 0x40/2: // VIDEO_HBLANK_END + // do some sanity checks first if ((VIDEO_HTOTAL > 0) && (VIDEO_VTOTAL > 0) && (VIDEO_VBLANK_START != VIDEO_VBLANK_END) && (VIDEO_HBLANK_START != VIDEO_HBLANK_END) && @@ -1422,7 +1424,7 @@ void itech32_state::video_w(offs_t offset, u16 data, u16 mem_mask) else visarea.max_y = VIDEO_VTOTAL - VIDEO_VBLANK_END + VIDEO_VBLANK_START - 1; - logerror("Configure Screen: HTOTAL: %x HBSTART: %x HBEND: %x VTOTAL: %x VBSTART: %x VBEND: %x\n", + LOGSCREEN("Configure Screen: HTOTAL: %x HBSTART: %x HBEND: %x VTOTAL: %x VBSTART: %x VBEND: %x\n", VIDEO_HTOTAL, VIDEO_HBLANK_START, VIDEO_HBLANK_END, VIDEO_VTOTAL, VIDEO_VBLANK_START, VIDEO_VBLANK_END); m_screen->configure(VIDEO_HTOTAL, VIDEO_VTOTAL, visarea, HZ_TO_ATTOSECONDS(VIDEO_CLOCK) * VIDEO_HTOTAL * VIDEO_VTOTAL); } @@ -1439,7 +1441,7 @@ u16 itech32_state::video_r(offs_t offset) } else if (offset == 3) { - return 0xef;/*m_screen->vpos() - 1;*/ + return 0xef; // m_screen->vpos() - 1; } return m_video[offset]; @@ -1479,22 +1481,19 @@ void drivedge_state::zbuf_control_w(offs_t offset, u32 data, u32 mem_mask) u32 itech32_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int y; - - /* loop over height */ - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + // loop over height + for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { - u16 *src1 = &m_videoplane[0][compute_safe_address(VIDEO_DISPLAY_XORIGIN1, VIDEO_DISPLAY_YORIGIN1 + y)]; + const u16 *src1 = &m_videoplane[0][compute_safe_address(VIDEO_DISPLAY_XORIGIN1, VIDEO_DISPLAY_YORIGIN1 + y)]; - /* handle multi-plane case */ + // handle multi-plane case if (m_planes > 1) { - u16 *src2 = &m_videoplane[1][compute_safe_address(VIDEO_DISPLAY_XORIGIN2 + VIDEO_DISPLAY_XSCROLL2, VIDEO_DISPLAY_YORIGIN2 + VIDEO_DISPLAY_YSCROLL2 + y)]; + const u16 *src2 = &m_videoplane[1][compute_safe_address(VIDEO_DISPLAY_XORIGIN2 + VIDEO_DISPLAY_XSCROLL2, VIDEO_DISPLAY_YORIGIN2 + VIDEO_DISPLAY_YSCROLL2 + y)]; u16 scanline[384]; - int x; - /* blend the pixels in the scanline; color xxFF is transparent */ - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + // blend the pixels in the scanline; color xxFF is transparent + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { u16 pixel = src1[x]; if ((pixel & 0xff) == 0xff) @@ -1502,11 +1501,11 @@ u32 itech32_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, co scanline[x] = pixel; } - /* draw from the buffer */ + // draw from the buffer draw_scanline16(bitmap, cliprect.min_x, y, cliprect.width(), &scanline[cliprect.min_x], nullptr); } - /* otherwise, draw directly from VRAM */ + // otherwise, draw directly from VRAM else draw_scanline16(bitmap, cliprect.min_x, y, cliprect.width(), &src1[cliprect.min_x], nullptr); } From 4ddd26fe21edba8e7df65b12d721e9bed579e6e4 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 12 Apr 2024 02:49:15 +1000 Subject: [PATCH 060/109] Initial touch input support: * Feed mouse/pen/touch pointer events through UI input manager with Win32 and SDL. * Started migrating UI code to use new API and reworking mouse/touch interaction. * emu/render.cpp: Support pressing multiple clickable layout items simultaneously. * emu/render.cpp: Allow UI elements to be drawn in any window. * emu/rendlay.cpp, luaengine_render.cpp: Added layout view events for pointer input. * ui/ui.cpp: Allow the UI handler to control pointer display. * ui/analogipt.cpp: Added mouse/touch and more keys for navigating field state list. * ui/menu.cpp: Use vertical swipe to scroll and horizontal swipe to adjust. * ui/menu.cpp: Draw after processing input - greatly improves responsiveness. * ui/menu.cpp: Ignore keyboard/gamepad input during pointer actions. * ui/selmenu.cpp: Made left/right info pane arrows repeat when held. * ui/selmenu.cpp: Use middle click to move keyboard focus. * ui/selmenu.cpp: Let filter list scroll if it's too tall, and use a bit of horizontal padding. * ui/selmenu.cpp: Improved divider sizing. * ui/state.cpp: Don't allow clicks to pass through the confirm deletion prompt to the menu. * ui/simpleselgame.cpp: Fixed error message display and graphics/sound status not showing. * ui/simpleselgame.cpp: Allow tap/click to dismiss error message. * ui/utils.cpp: Show UI for choice filters when there are no choices - it's less confusing. * modules/input/input_sdl.cpp: Made scaling for mouse scroll better match RawInput and DirectInput. * modules/input/input_rawinput.cpp: Added support for horizontal scroll axis. * modules/input/input_win32.cpp: Added support for scroll axes and more buttons to mouse/lightgun. * modules/debugger/debugimgui.cpp: Don't fight over events with the UI manager - it breaks menus. * osd/windows/window.cpp: Translate mouse position to window cooridinates for scroll wheel events. * osd/sdl/window.cpp: Supply last mouse position for scroll wheel events if possible. * scripts/build/complay.py: Made zero input mask an error - it was only being used to block clicks. --- docs/source/commandline/sdlconfig.rst | 10 +- docs/source/luascript/ref-input.rst | 10 - docs/source/luascript/ref-render.rst | 60 + docs/source/techspecs/layout_files.rst | 13 +- docs/source/techspecs/layout_script.rst | 93 +- docs/source/usingmame/ui.rst | 30 +- scripts/build/complay.py | 21 +- scripts/src/osd/modules.lua | 1 + scripts/src/osd/windows_cfg.lua | 2 +- src/emu/render.cpp | 436 +++- src/emu/render.h | 55 +- src/emu/rendlay.cpp | 45 + src/emu/rendlay.h | 41 +- src/emu/ui/uimain.h | 4 + src/emu/uiinput.cpp | 262 +- src/emu/uiinput.h | 88 +- src/frontend/mame/luaengine_input.cpp | 9 - src/frontend/mame/luaengine_mem.cpp | 2 +- src/frontend/mame/luaengine_render.cpp | 56 + src/frontend/mame/ui/about.cpp | 15 +- src/frontend/mame/ui/about.h | 3 +- src/frontend/mame/ui/analogipt.cpp | 395 ++- src/frontend/mame/ui/analogipt.h | 32 +- src/frontend/mame/ui/auditmenu.cpp | 2 +- src/frontend/mame/ui/auditmenu.h | 2 +- src/frontend/mame/ui/confswitch.cpp | 38 +- src/frontend/mame/ui/confswitch.h | 4 +- src/frontend/mame/ui/custui.cpp | 6 +- src/frontend/mame/ui/custui.h | 6 +- src/frontend/mame/ui/datmenu.cpp | 287 ++- src/frontend/mame/ui/datmenu.h | 18 +- src/frontend/mame/ui/devopt.cpp | 8 - src/frontend/mame/ui/devopt.h | 1 - src/frontend/mame/ui/dirmenu.cpp | 8 +- src/frontend/mame/ui/filecreate.cpp | 2 +- src/frontend/mame/ui/filecreate.h | 2 +- src/frontend/mame/ui/filemngr.cpp | 2 +- src/frontend/mame/ui/filemngr.h | 2 +- src/frontend/mame/ui/filesel.cpp | 225 +- src/frontend/mame/ui/filesel.h | 60 +- src/frontend/mame/ui/floppycntrl.cpp | 72 +- src/frontend/mame/ui/floppycntrl.h | 2 +- src/frontend/mame/ui/imgcntrl.cpp | 61 +- src/frontend/mame/ui/imgcntrl.h | 7 +- src/frontend/mame/ui/info.cpp | 10 - src/frontend/mame/ui/info.h | 2 - src/frontend/mame/ui/inputdevices.cpp | 2 +- src/frontend/mame/ui/inputmap.cpp | 2 +- src/frontend/mame/ui/inputmap.h | 2 +- src/frontend/mame/ui/menu.cpp | 1508 ++++++++--- src/frontend/mame/ui/menu.h | 189 +- src/frontend/mame/ui/miscmenu.cpp | 2 +- src/frontend/mame/ui/selector.cpp | 2 +- src/frontend/mame/ui/selector.h | 2 +- src/frontend/mame/ui/selgame.cpp | 190 +- src/frontend/mame/ui/selgame.h | 8 +- src/frontend/mame/ui/selmenu.cpp | 2991 +++++++++++++++------- src/frontend/mame/ui/selmenu.h | 185 +- src/frontend/mame/ui/selsoft.cpp | 114 +- src/frontend/mame/ui/selsoft.h | 5 +- src/frontend/mame/ui/simpleselgame.cpp | 214 +- src/frontend/mame/ui/simpleselgame.h | 5 +- src/frontend/mame/ui/sliders.cpp | 5 +- src/frontend/mame/ui/sliders.h | 2 +- src/frontend/mame/ui/slotopt.cpp | 2 +- src/frontend/mame/ui/slotopt.h | 2 +- src/frontend/mame/ui/state.cpp | 27 +- src/frontend/mame/ui/state.h | 6 +- src/frontend/mame/ui/submenu.cpp | 2 +- src/frontend/mame/ui/submenu.h | 2 +- src/frontend/mame/ui/text.cpp | 12 +- src/frontend/mame/ui/text.h | 2 +- src/frontend/mame/ui/textbox.cpp | 329 ++- src/frontend/mame/ui/textbox.h | 30 +- src/frontend/mame/ui/ui.cpp | 321 ++- src/frontend/mame/ui/ui.h | 79 +- src/frontend/mame/ui/utils.cpp | 27 +- src/frontend/mame/ui/utils.h | 30 - src/frontend/mame/ui/viewgfx.cpp | 123 +- src/mame/layout/alphie.lay | 2 +- src/mame/layout/autorace.lay | 2 +- src/mame/layout/bcheetah.lay | 2 +- src/mame/layout/compperf.lay | 6 +- src/mame/layout/copycat.lay | 4 +- src/mame/layout/matchme.lay | 2 +- src/mame/layout/mdndclab.lay | 147 +- src/mame/layout/microvision.lay | 2 +- src/mame/layout/novag_savant.lay | 2 +- src/mame/layout/novag_supercon.lay | 18 +- src/mame/layout/saitek_mark5.lay | 4 +- src/mame/layout/saitek_mark6.lay | 4 +- src/mame/layout/saitek_ssystem3.lay | 4 +- src/mame/layout/saitek_ssystem4.lay | 2 +- src/mame/layout/simon.lay | 4 +- src/mame/layout/ssimon.lay | 6 +- src/mame/layout/strobe.lay | 2 +- src/mame/layout/tmbaskb.lay | 2 +- src/mame/layout/tmvolleyb.lay | 2 +- src/mame/layout/vclock3.lay | 2 +- src/mame/layout/videoart.lay | 2 +- src/osd/interface/uievents.h | 61 + src/osd/modules/debugger/debugimgui.cpp | 247 +- src/osd/modules/input/input_dinput.cpp | 2 +- src/osd/modules/input/input_rawinput.cpp | 80 +- src/osd/modules/input/input_sdl.cpp | 9 +- src/osd/modules/input/input_win32.cpp | 242 +- src/osd/modules/input/input_wincommon.h | 5 +- src/osd/modules/osdwindow.h | 195 ++ src/osd/sdl/osdsdl.cpp | 244 +- src/osd/sdl/osdsdl.h | 11 +- src/osd/sdl/sdlopts.cpp | 3 +- src/osd/sdl/sdlopts.h | 4 +- src/osd/sdl/window.cpp | 372 ++- src/osd/sdl/window.h | 73 +- src/osd/windows/window.cpp | 565 +++- src/osd/windows/window.h | 46 +- src/osd/windows/winmain.h | 11 +- 117 files changed, 8051 insertions(+), 3272 deletions(-) create mode 100644 src/osd/interface/uievents.h diff --git a/docs/source/commandline/sdlconfig.rst b/docs/source/commandline/sdlconfig.rst index eea4b959e603c..df04865a39098 100644 --- a/docs/source/commandline/sdlconfig.rst +++ b/docs/source/commandline/sdlconfig.rst @@ -61,9 +61,17 @@ SDL Keyboard Mapping Keymap file name. Default is ``keymap.dat``. -SDL Joystick Mapping +SDL Input Options -------------------- +.. _mame-scommandline-enabletouch: + +**-enable_touch** + + Enable support for touch input. If this option is switched off, mouse input + simulated from touch devices will be used instead. Default is OFF + (**-noenable_touch**) + .. _mame-scommandline-sixaxis: **-sixaxis** diff --git a/docs/source/luascript/ref-input.rst b/docs/source/luascript/ref-input.rst index 7390d46743fbc..f146d6c78ffca 100644 --- a/docs/source/luascript/ref-input.rst +++ b/docs/source/luascript/ref-input.rst @@ -750,16 +750,6 @@ uiinput:reset() Clears pending events and UI input states. Should be called when leaving a modal state where input is handled directly (e.g. configuring an input combination). -uiinput:find_mouse() - Returns host system mouse pointer X position, Y position, button state, and - the :ref:`render target ` it falls in. The - position is in host pixels, where zero is at the top/left. The button state - is a Boolean indicating whether the primary mouse button is pressed. - - If the mouse pointer is not over one of MAME’s windows, this may return the - position and render target from when the mouse pointer was most recently - over one of MAME’s windows. The render target may be ``nil`` if the mouse - pointer is not over one of MAME’s windows. uiinput:pressed(type) Returns a Boolean indicating whether the specified UI input has been pressed. The input type is an enumerated value. diff --git a/docs/source/luascript/ref-render.rst b/docs/source/luascript/ref-render.rst index 265e52b5016c4..eee432660ddad 100644 --- a/docs/source/luascript/ref-render.rst +++ b/docs/source/luascript/ref-render.rst @@ -1057,6 +1057,66 @@ view:set_recomputed_callback(cb) View coordinates are recomputed in various events, including the window being resized, entering or leaving full-screen mode, and changing the zoom to screen area setting. +view:set_pointer_updated_callback(cb) + Set a function to receive notifications when a pointer enters, moves or + changes button states over the view. The function must accept nine + arguments: + + * The pointer type (``mouse``, ``pen``, ``touch`` or ``unknown``). + * The pointer ID (a non-negative integer that will not change for the + lifetime of a pointer). + * The device ID for grouping pointers to recognise multi-touch gestures + (non-negative integer). + * Horizontal position in layout coordinates. + * Vertical position in layout coordinates. + * A bit mask representing the currently pressed buttons. + * A bit mask representing the buttons that were pressed in this update. + * A bit mask representing the buttons that were released in this update. + * The click count (positive for multi-click actions, or negative if a click + is turned into a hold or drag). + + Call with ``nil`` to remove the callback. +view:set_pointer_left_callback(cb) + Set a function to receive notifications when a pointer leaves the view + normally. The function must accept seven arguments: + + * The pointer type (``mouse``, ``pen``, ``touch`` or ``unknown``). + * The pointer ID (a non-negative integer that will not change for the + lifetime of a pointer). The ID may be reused for a new pointer after + receiving this notification. + * The device ID for grouping pointers to recognise multi-touch gestures + (non-negative integer). + * Horizontal position in layout coordinates. + * Vertical position in layout coordinates. + * A bit mask representing the buttons that were released in this update. + * The click count (positive for multi-click actions, or negative if a click + is turned into a hold or drag). + + Call with ``nil`` to remove the callback. +view:set_pointer_aborted_callback(cb) + Set a function to receive notifications when a pointer leaves the view + abnormally. The function must accept seven arguments: + + * The pointer type (``mouse``, ``pen``, ``touch`` or ``unknown``). + * The pointer ID (a non-negative integer that will not change for the + lifetime of a pointer). The ID may be reused for a new pointer after + receiving this notification. + * The device ID for grouping pointers to recognise multi-touch gestures + (non-negative integer). + * Horizontal position in layout coordinates. + * Vertical position in layout coordinates. + * A bit mask representing the buttons that were released in this update. + * The click count (positive for multi-click actions, or negative if a click + is turned into a hold or drag). + + Call with ``nil`` to remove the callback. +view:set_forget_pointers_callback(cb) + Set a function to receive notifications when the view should stop processing + pointer input. The function must accept no arguments. Call with ``nil`` to + remove the callback. + + This can happen in a number of situations, including the view configuration + changing or a menu taking over input handling. Properties ~~~~~~~~~~ diff --git a/docs/source/techspecs/layout_files.rst b/docs/source/techspecs/layout_files.rst index d9976faf00d54..297521bf9454a 100644 --- a/docs/source/techspecs/layout_files.rst +++ b/docs/source/techspecs/layout_files.rst @@ -1188,7 +1188,7 @@ Clickable items If a view item (``element`` or ``screen`` element) has ``inputtag`` and ``inputmask`` attribute values that correspond to a digital switch field in the emulated system, clicking the element will activate the switch. The switch -will remain active as long as the mouse button is held down and the pointer is +will remain active as long as the primary button is held down and the pointer is within the item’s current bounds. (Note that the bounds may change depending on the item’s animation state, see :ref:`layfile-interact-itemanim`). @@ -1197,6 +1197,12 @@ device that caused the layout file to be loaded. The ``inputmask`` attribute must be an integer specifying the bits of the I/O port field that the item should activate. This sample shows instantiation of clickable buttons: +The ``clickthrough`` attribute controls whether clicks can pass through the view +item to other view items drawn above it. The ``clickthrough`` attribute must be +``yes`` or ``no`` if present. The default is ``no`` (clicks do not pass +through) for view items with ``inputtag`` and ``inputmask`` attributes, and +``yes`` (clicks pass through) for other view items. + .. code-block:: XML @@ -1209,9 +1215,8 @@ should activate. This sample shows instantiation of clickable buttons: -When handling mouse input, MAME treats all layout elements as being rectangular, -and only activates the first clickable item whose area includes the location of -the mouse pointer. +When handling pointer input, MAME treats all layout elements as being +rectangular. .. _layfile-interact-elemstate: diff --git a/docs/source/techspecs/layout_script.rst b/docs/source/techspecs/layout_script.rst index be6166a714640..7e5b7419bb731 100644 --- a/docs/source/techspecs/layout_script.rst +++ b/docs/source/techspecs/layout_script.rst @@ -561,6 +561,96 @@ Dimensions recomputed rotation and zoom to screen area settings. If you’re animating the position of view items, this is a good time to calculate positions and scale factors. + The callback function has no return value and takes no parameters. Call + with ``nil`` as the argument to remove the event handler. +Pointer updated + ``view:set_pointer_updated_callback(cb)`` + + Called when a pointer enters, moves or changes button state over the view. + + The callback function is passed nine arguments: + + * The pointer type as a string. This will be ``mouse``, ``pen``, ``touch`` + or ``unknown``, and will not change for the lifetime of a pointer. + * The pointer ID. This will be a non-negative integer that will not change + for the lifetime of a pointer. Pointer ID values are recycled + aggressively. + * The device ID. This will be a non-negative integer that can be used to + group pointers for recognising multi-touch gestures. + * The horizontal position of the pointer in layout coordinates. + * The vertical position of the pointer in layout coordinates. + * A bit mask representing the currently pressed buttons. The primary button + is the least significant bit. + * A bit mask representing the buttons that were pressed in this update. The + primary button is the least significant bit. + * A bit mask representing the buttons that were released in this update. + The primary button is the least significant bit. + * The click count. This is positive for multi-click actions, or negative if + a click is turned into a hold or drag. This only applies to the primary + button. + + The callback function has no return value. Call with ``nil`` as the + argument to remove the event handler. +Pointer left + ``view:set_pointer_left_callback(cb)`` + + Called when a pointer leaves the view normally. After receiving this event, + the pointer ID may be reused for a new pointer. + + The callback function is passed seven arguments: + + * The pointer type as a string. This will be ``mouse``, ``pen``, ``touch`` + or ``unknown``, and will not change for the lifetime of a pointer. + * The pointer ID. This will be a non-negative integer that will not change + for the lifetime of a pointer. Pointer ID values are recycled + aggressively. + * The device ID. This will be a non-negative integer that can be used to + group pointers for recognising multi-touch gestures. + * The horizontal position of the pointer in layout coordinates. + * The vertical position of the pointer in layout coordinates. + * A bit mask representing the buttons that were released in this update. + The primary button is the least significant bit. + * The click count. This is positive for multi-click actions, or negative if + a click is turned into a hold or drag. This only applies to the primary + button. + + The callback function has no return value. Call with ``nil`` as the + argument to remove the event handler. +Pointer aborted + ``view:set_pointer_aborted_callback(cb)`` + + Called when a pointer leaves the view abnormally. After receiving this + event, the pointer ID may be reused for a new pointer. + + The callback function is passed seven arguments: + + * The pointer type as a string. This will be ``mouse``, ``pen``, ``touch`` + or ``unknown``, and will not change for the lifetime of a pointer. + * The pointer ID. This will be a non-negative integer that will not change + for the lifetime of a pointer. Pointer ID values are recycled + aggressively. + * The device ID. This will be a non-negative integer that can be used to + group pointers for recognising multi-touch gestures. + * The horizontal position of the pointer in layout coordinates. + * The vertical position of the pointer in layout coordinates. + * A bit mask representing the buttons that were released in this update. + The primary button is the least significant bit. + * The click count. This is positive for multi-click actions, or negative if + a click is turned into a hold or drag. This only applies to the primary + button. + + The callback function has no return value. Call with ``nil`` as the + argument to remove the event handler. +Forget pointers + ``view:set_forget_pointers_callback(cb)`` + + Called when the view should stop processing pointer input. This can happen + in a number of situations, including: + + * The user activated a menu. + * The view configuration will change. + * The view will be deactivated. + The callback function has no return value and takes no parameters. Call with ``nil`` as the argument to remove the event handler. @@ -692,4 +782,5 @@ Draw The callback is passed two arguments: the element state (an integer) and the 32-bit ARGB bitmap at the required size. The callback must not attempt to - resize the bitmap. + resize the bitmap. Call with ``nil`` as the argument to remove the event + handler. diff --git a/docs/source/usingmame/ui.rst b/docs/source/usingmame/ui.rst index 60bb55618a201..94c7eba413dcd 100644 --- a/docs/source/usingmame/ui.rst +++ b/docs/source/usingmame/ui.rst @@ -136,9 +136,9 @@ pointing device: * Click menu items to highlight them. * Double-click menu items to select them. * Click the left- or right-pointing triangle to adjust settings. -* For menus with too many items to fit on the screen, click the upward- or - downward-pointing triangle at the top or bottom to scroll up or down by one - screen at a time. +* For menus or text boxes with too many items or lines to fit on the screen, + press on the upward- or downward-pointing triangle at the top or bottom to + scroll up or down. * Use vertical scrolling gestures to scroll menus or text boxes with too many items or lines to fit on the screen. * Click toolbar items to select them, or hover over them to see a description. @@ -148,6 +148,28 @@ combinations to the **Show/Hide Menu**, **Pause**, **UI Back** and/or **UI Cancel** inputs to make it possible to use MAME without a keyboard. +.. _ui-menus-touch: + +Using a touch screen +~~~~~~~~~~~~~~~~~~~~ + +MAME has basic support for navigating menus using a touch screen: + +* Tap menu items to highlight them. +* Double-tap menu items to select them. +* Swipe left or right (horizontally) on the highlighted menu item to adjust the + setting if applicable. +* Swipe up or down (vertically) to scroll menus or text boxes with too many + items to fit on the screen. +* For menus or text boxes with too many items or lines to fit on the screen, + press on the upward- or downward-pointing triangle at the top or bottom to + scroll up or down. + +Note that for SDL-based MAME, the +:ref:`enable_touch ` option must be switched on +to use touch screen support. + + .. _ui-inptcfg: Configuring inputs @@ -493,6 +515,8 @@ or info source with left/right. When focus is on the info/image tabs, left/right switch between tabs. When focus is on the image/info tabs or source, you can scroll the info using up, down, page up, page down, home and end. +You can move focus to an area by clicking on it with the middle mouse button. + .. _ui-simpleselmenu: diff --git a/scripts/build/complay.py b/scripts/build/complay.py index 475806c0e65ad..f0e330240a199 100755 --- a/scripts/build/complay.py +++ b/scripts/build/complay.py @@ -174,6 +174,17 @@ def check_numeric_attribute(self, name, attrs, key, default): self.handle_error('Element %s attribute %s "%s" is not a number' % (name, key, val)) return None + def check_bool_attribute(self, name, attrs, key, default): + if key not in attrs: + return default + val = attrs[key] + if self.VARPATTERN.match(val): + return None + elif val in self.YESNO: + return 'yes' == val + self.handle_error('Element %s attribute %s "%s" is not "yes" or "no"' % (name, key, val)) + return None + def check_parameter(self, attrs): if 'name' not in attrs: self.handle_error('Element param missing attribute name') @@ -253,8 +264,7 @@ def check_orientation(self, attrs): if self.check_int_attribute('orientation', attrs, 'rotate', 0) not in self.ORIENTATIONS: self.handle_error('Element orientation attribute rotate "%s" is unsupported' % (attrs['rotate'], )) for name in ('swapxy', 'flipx', 'flipy'): - if (attrs.get(name, 'no') not in self.YESNO) and (not self.VARPATTERN.match(attrs[name])): - self.handle_error('Element orientation attribute %s "%s" is not "yes" or "no"' % (name, attrs[name])) + self.check_bool_attribute('orientation', attrs, name, None) def check_color(self, attrs): self.check_color_channel(attrs, 'red') @@ -324,8 +334,8 @@ def check_view_item(self, name, attrs): self.handle_error('Element %s has inputraw attribute without inputtag attribute' % (name, )) inputmask = self.check_int_attribute(name, attrs, 'inputmask', None) if (inputmask is not None) and (not inputmask): - if (inputraw is None) or (not inputraw): - self.handle_error('Element %s attribute inputmask "%s" is zero' % (name, attrs['inputmask'])) + self.handle_error('Element %s attribute inputmask "%s" is zero' % (name, attrs['inputmask'])) + self.check_bool_attribute(name, attrs, 'clickthrough', None) def startViewItem(self, name): self.handlers.append((self.viewItemStartHandler, self.viewItemEndHandler)) @@ -676,8 +686,7 @@ def viewItemStartHandler(self, name, attrs): else: have_scroll[-1] = self.format_location() self.check_float_attribute(name, attrs, 'size', 1.0) - if (attrs.get('wrap', 'no') not in self.YESNO) and (not self.VARPATTERN.match(attrs['wrap'])): - self.handle_error('Element %s attribute wrap "%s" is not "yes" or "no"' % (name, attrs['wrap'])) + self.check_bool_attribute(name, attrs, 'wrap', False) if 'inputtag' in attrs: if 'name' in attrs: self.handle_error('Element %s has both attribute inputtag and attribute name' % (name, )) diff --git a/scripts/src/osd/modules.lua b/scripts/src/osd/modules.lua index 43cb768704d5a..db5e57ea57073 100644 --- a/scripts/src/osd/modules.lua +++ b/scripts/src/osd/modules.lua @@ -63,6 +63,7 @@ function osdmodulesbuild() MAME_DIR .. "src/osd/interface/midiport.h", MAME_DIR .. "src/osd/interface/nethandler.cpp", MAME_DIR .. "src/osd/interface/nethandler.h", + MAME_DIR .. "src/osd/interface/uievents.h", MAME_DIR .. "src/osd/modules/debugger/debug_module.h", MAME_DIR .. "src/osd/modules/debugger/debuggdbstub.cpp", MAME_DIR .. "src/osd/modules/debugger/debugimgui.cpp", diff --git a/scripts/src/osd/windows_cfg.lua b/scripts/src/osd/windows_cfg.lua index 01d441c2214c6..85b0cd810f32e 100644 --- a/scripts/src/osd/windows_cfg.lua +++ b/scripts/src/osd/windows_cfg.lua @@ -33,7 +33,7 @@ if _OPTIONS["MODERN_WIN_API"]=="1" then } else defines { - "_WIN32_WINNT=0x0600", + "_WIN32_WINNT=0x0602", "NTDDI_VERSION=0x06000000", } end diff --git a/src/emu/render.cpp b/src/emu/render.cpp index 617b1bf375628..2b9efa1c7fa6f 100644 --- a/src/emu/render.cpp +++ b/src/emu/render.cpp @@ -57,6 +57,7 @@ #include "util/xmlfile.h" #include +#include @@ -99,6 +100,40 @@ struct render_target::object_transform }; +struct render_target::pointer_info +{ + pointer_info() noexcept + : type(osd::ui_event_handler::pointer::UNKNOWN) + , oldpos(std::numeric_limits::min(), std::numeric_limits::min()) + , newpos(std::numeric_limits::min(), std::numeric_limits::min()) + , oldbuttons(0U) + , newbuttons(0U) + , edges(0U, 0U) + { + } + + osd::ui_event_handler::pointer type; + std::pair oldpos; + std::pair newpos; + u32 oldbuttons, newbuttons; + std::pair edges; +}; + + +struct render_target::hit_test +{ + hit_test() noexcept + : inbounds(0U, 0U) + , hit(0U) + { + } + + std::pair inbounds; + u64 hit; +}; + + + //************************************************************************** // GLOBAL VARIABLES @@ -883,19 +918,21 @@ render_container::user_settings::user_settings() // render_target - constructor //------------------------------------------------- -render_target::render_target(render_manager &manager, const internal_layout *layoutfile, u32 flags) - : render_target(manager, layoutfile, flags, CONSTRUCTOR_IMPL) +render_target::render_target(render_manager &manager, render_container *ui, const internal_layout *layoutfile, u32 flags) + : render_target(manager, ui, layoutfile, flags, CONSTRUCTOR_IMPL) { } -render_target::render_target(render_manager &manager, util::xml::data_node const &layout, u32 flags) - : render_target(manager, layout, flags, CONSTRUCTOR_IMPL) +render_target::render_target(render_manager &manager, render_container *ui, util::xml::data_node const &layout, u32 flags) + : render_target(manager, ui, layout, flags, CONSTRUCTOR_IMPL) { } -template render_target::render_target(render_manager &manager, T &&layout, u32 flags, constructor_impl_t) +template +render_target::render_target(render_manager &manager, render_container *ui, T &&layout, u32 flags, constructor_impl_t) : m_next(nullptr) , m_manager(manager) + , m_ui_container(ui) , m_curview(0U) , m_flags(flags) , m_listindex(0) @@ -1030,9 +1067,12 @@ void render_target::set_view(unsigned viewindex) { if (m_views.size() > viewindex) { + forget_pointers(); m_curview = viewindex; current_view().recompute(visibility_mask(), m_layerconfig.zoom_to_screen()); current_view().preload(); + m_clickable_items.clear(); + m_clickable_items.resize(current_view().interactive_items().size()); } } @@ -1049,6 +1089,229 @@ void render_target::set_max_texture_size(int maxwidth, int maxheight) } +//------------------------------------------------- +// pointer_updated - pointer activity within +// target +//------------------------------------------------- + +void render_target::pointer_updated( + osd::ui_event_handler::pointer type, + u16 ptrid, + u16 device, + s32 x, + s32 y, + u32 buttons, + u32 pressed, + u32 released, + s16 clicks) +{ + auto const target_f(map_point_layout(x, y)); + current_view().pointer_updated(type, ptrid, device, target_f.first, target_f.second, buttons, pressed, released, clicks); + + // 64 pointers ought to be enough for anyone + if (64 <= ptrid) + return; + + // just store the updated pointer state + if (m_pointers.size() <= ptrid) + m_pointers.resize(ptrid + 1); + m_pointers[ptrid].type = type; + m_pointers[ptrid].newpos = target_f; + m_pointers[ptrid].newbuttons = buttons; +} + + +//------------------------------------------------- +// pointer_left - pointer left target normally +//------------------------------------------------- + +void render_target::pointer_left( + osd::ui_event_handler::pointer type, + u16 ptrid, + u16 device, + s32 x, + s32 y, + u32 released, + s16 clicks) +{ + auto const target_f(map_point_layout(x, y)); + current_view().pointer_left(type, ptrid, device, target_f.first, target_f.second, released, clicks); + + // store the updated state if relevant + if (m_pointers.size() > ptrid) + { + m_pointers[ptrid].newpos = std::make_pair(std::numeric_limits::min(), std::numeric_limits::min()); + m_pointers[ptrid].newbuttons = 0; + } +} + + +//------------------------------------------------- +// pointer_aborted - pointer left target +// abnormally +//------------------------------------------------- + +void render_target::pointer_aborted( + osd::ui_event_handler::pointer type, + u16 ptrid, + u16 device, + s32 x, + s32 y, + u32 released, + s16 clicks) +{ + // let layout scripts handle pointer input + auto const target_f(map_point_layout(x, y)); + current_view().pointer_aborted(type, ptrid, device, target_f.first, target_f.second, released, clicks); + + // store the updated state if relevant + if (m_pointers.size() > ptrid) + { + m_pointers[ptrid].newpos = std::make_pair(std::numeric_limits::min(), std::numeric_limits::min()); + m_pointers[ptrid].newbuttons = 0; + } +} + + +//------------------------------------------------- +// forget_pointers - stop processing pointer +// input +//------------------------------------------------- + +void render_target::forget_pointers() +{ + current_view().forget_pointers(); + m_pointers.clear(); + for (size_t i = 0; m_clickable_items.size() > i; ++i) + { + if (m_clickable_items[i].hit) + { + layout_view_item const &item(current_view().interactive_items()[i]); + auto const [port, mask] = item.input_tag_and_mask(); + ioport_field *const field(port ? port->field(mask) : nullptr); + if (field) + field->set_value(0); + } + m_clickable_items[i] = hit_test(); + } +} + + +//------------------------------------------------- +// update_pointer_fields - update inputs for new +// pointer state +//------------------------------------------------- + +void render_target::update_pointer_fields() +{ + auto const &x_edges(current_view().interactive_edges_x()); + auto const &y_edges(current_view().interactive_edges_y()); + + // update items bounds intersection checks for pointers + for (size_t ptr = 0; m_pointers.size() > ptr; ++ptr) + { + auto const [x, y] = m_pointers[ptr].newpos; + auto edges = m_pointers[ptr].edges; + + // check for moving across horizontal edges + if (x < m_pointers[ptr].oldpos.first) + { + while (edges.first && (x < x_edges[edges.first - 1].position())) + { + --edges.first; + auto const &edge(x_edges[edges.first]); + if (edge.trailing()) + m_clickable_items[edge.index()].inbounds.first |= u64(1) << ptr; + else + m_clickable_items[edge.index()].inbounds.first &= ~(u64(1) << ptr); + } + } + else if (x > m_pointers[ptr].oldpos.first) + { + while ((x_edges.size() > edges.first) && (x >= x_edges[edges.first].position())) + { + auto const &edge(x_edges[edges.first]); + if (edge.trailing()) + m_clickable_items[edge.index()].inbounds.first &= ~(u64(1) << ptr); + else + m_clickable_items[edge.index()].inbounds.first |= u64(1) << ptr; + ++edges.first; + } + } + + // check for moving across vertical edges + if (y < m_pointers[ptr].oldpos.second) + { + while (edges.second && (y < y_edges[edges.second - 1].position())) + { + --edges.second; + auto const &edge(y_edges[edges.second]); + if (edge.trailing()) + m_clickable_items[edge.index()].inbounds.second |= u64(1) << ptr; + else + m_clickable_items[edge.index()].inbounds.second &= ~(u64(1) << ptr); + } + } + else if (y > m_pointers[ptr].oldpos.second) + { + while ((y_edges.size() > edges.second) && (y >= y_edges[edges.second].position())) + { + auto const &edge(y_edges[edges.second]); + if (edge.trailing()) + m_clickable_items[edge.index()].inbounds.second &= ~(u64(1) << ptr); + else + m_clickable_items[edge.index()].inbounds.second |= u64(1) << ptr; + ++edges.second; + } + } + + // update the pointer's state + m_pointers[ptr].oldpos = m_pointers[ptr].newpos; + m_pointers[ptr].oldbuttons = m_pointers[ptr].newbuttons; + m_pointers[ptr].edges = edges; + } + + // update item hit states + u64 obscured(0U); + for (size_t i = 0; m_clickable_items.size() > i; ++i) + { + layout_view_item const &item(current_view().interactive_items()[i]); + u64 const inbounds(m_clickable_items[i].inbounds.first & m_clickable_items[i].inbounds.second); + u64 hit(m_clickable_items[i].hit); + for (unsigned ptr = 0; m_pointers.size() > ptr; ++ptr) + { + pointer_info const &pointer(m_pointers[ptr]); + bool const prefilter(BIT(~obscured & inbounds, ptr)); + if (!prefilter || !BIT(pointer.newbuttons, 0) || !item.bounds().includes(pointer.newpos.first, pointer.newpos.second)) + { + hit &= ~(u64(1) << ptr); + } + else + { + hit |= u64(1) << ptr; + if (!item.clickthrough()) + obscured |= u64(1) << ptr; + } + } + + // update field state + if (bool(hit) != bool(m_clickable_items[i].hit)) + { + auto const [port, mask] = item.input_tag_and_mask(); + ioport_field *const field(port ? port->field(mask) : nullptr); + if (field) + { + if (hit) + field->set_value(1); + else + field->clear_value(); + } + } + m_clickable_items[i].hit = hit; + } +} + + //------------------------------------------------- // set_visibility_toggle - show or hide selected // parts of a view @@ -1061,7 +1324,7 @@ void render_target::set_visibility_toggle(unsigned index, bool enable) m_views[m_curview].second |= u32(1) << index; else m_views[m_curview].second &= ~(u32(1) << index); - current_view().recompute(visibility_mask(), m_layerconfig.zoom_to_screen()); + update_layer_config(); current_view().preload(); } @@ -1454,8 +1717,8 @@ render_primitive_list &render_target::get_primitives() } } - // process the UI if we are the UI target - if (is_ui_target()) + // process UI elements if applicable + if (m_ui_container) { // compute the transform for the UI object_transform ui_xform; @@ -1468,7 +1731,7 @@ render_primitive_list &render_target::get_primitives() ui_xform.no_center = false; // add UI elements - add_container_primitives(list, root_xform, ui_xform, m_manager.ui_container(), BLENDMODE_ALPHA); + add_container_primitives(list, root_xform, ui_xform, *m_ui_container, BLENDMODE_ALPHA); } // optimize the list before handing it off @@ -1489,7 +1752,7 @@ bool render_target::map_point_container(s32 target_x, s32 target_y, render_conta std::pair target_f(map_point_internal(target_x, target_y)); // explicitly check for the UI container - if (&container == &m_manager.ui_container()) + if (&container == m_ui_container) { // this hit test went against the UI container if ((target_f.first >= 0.0f) && (target_f.first < 1.0f) && (target_f.second >= 0.0f) && (target_f.second < 1.0f)) @@ -1535,74 +1798,6 @@ bool render_target::map_point_container(s32 target_x, s32 target_y, render_conta } -//------------------------------------------------- -// map_point_input - attempts to map a point on -// the specified render_target to an input port -// field, if possible -//------------------------------------------------- - -bool render_target::map_point_input(s32 target_x, s32 target_y, ioport_port *&input_port, ioport_value &input_mask, float &input_x, float &input_y) -{ - std::pair target_f(map_point_internal(target_x, target_y)); - if (m_orientation & ORIENTATION_FLIP_X) - target_f.first = 1.0f - target_f.first; - if (m_orientation & ORIENTATION_FLIP_Y) - target_f.second = 1.0f - target_f.second; - if (m_orientation & ORIENTATION_SWAP_XY) - std::swap(target_f.first, target_f.second); - - auto const &items(current_view().interactive_items()); - m_hit_test.resize(items.size() * 2); - std::fill(m_hit_test.begin(), m_hit_test.end(), false); - - for (auto const &edge : current_view().interactive_edges_x()) - { - if ((edge.position() > target_f.first) || ((edge.position() == target_f.first) && edge.trailing())) - break; - else - m_hit_test[edge.index()] = !edge.trailing(); - } - - for (auto const &edge : current_view().interactive_edges_y()) - { - if ((edge.position() > target_f.second) || ((edge.position() == target_f.second) && edge.trailing())) - break; - else - m_hit_test[items.size() + edge.index()] = !edge.trailing(); - } - - for (unsigned i = 0; items.size() > i; ++i) - { - if (m_hit_test[i] && m_hit_test[items.size() + i]) - { - layout_view_item &item(items[i]); - render_bounds const bounds(item.bounds()); - if (bounds.includes(target_f.first, target_f.second)) - { - if (item.has_input()) - { - // point successfully mapped - std::tie(input_port, input_mask) = item.input_tag_and_mask(); - input_x = (target_f.first - bounds.x0) / bounds.width(); - input_y = (target_f.second - bounds.y0) / bounds.height(); - return true; - } - else - { - break; - } - } - } - } - - // default to point not mapped - input_port = nullptr; - input_mask = 0; - input_x = input_y = -1.0f; - return false; -} - - //------------------------------------------------- // invalidate_all - if any of our primitive lists // contain a reference to the given pointer, @@ -1632,7 +1827,7 @@ void render_target::resolve_tags() for (layout_file &file : m_filelist) file.resolve_tags(); - current_view().recompute(visibility_mask(), m_layerconfig.zoom_to_screen()); + update_layer_config(); current_view().preload(); } @@ -1644,7 +1839,10 @@ void render_target::resolve_tags() void render_target::update_layer_config() { + forget_pointers(); current_view().recompute(visibility_mask(), m_layerconfig.zoom_to_screen()); + m_clickable_items.clear(); + m_clickable_items.resize(current_view().interactive_items().size()); } @@ -2619,6 +2817,25 @@ std::pair render_target::map_point_internal(s32 target_x, s32 targ } +//------------------------------------------------- +// map_point_layout - map point from screen +// coordinates to layout coordinates +//------------------------------------------------- + +std::pair render_target::map_point_layout(s32 target_x, s32 target_y) +{ + using std::swap; + std::pair result(map_point_internal(target_x, target_y)); + if (m_orientation & ORIENTATION_FLIP_X) + result.first = 1.0f - result.first; + if (m_orientation & ORIENTATION_FLIP_Y) + result.second = 1.0f - result.second; + if (m_orientation & ORIENTATION_SWAP_XY) + swap(result.first, result.second); + return result; +} + + //------------------------------------------------- // view_name - return the name of the indexed // view, or nullptr if it doesn't exist @@ -2698,12 +2915,11 @@ void render_target::config_load(util::xml::data_node const *targetnode) set_orientation(orientation_add(rotate, orientation())); // apply the opposite orientation to the UI - if (is_ui_target()) + if (m_ui_container) { - render_container &ui_container = m_manager.ui_container(); - render_container::user_settings settings = ui_container.get_user_settings(); + render_container::user_settings settings = m_ui_container->get_user_settings(); settings.m_orientation = orientation_add(orientation_reverse(rotate), settings.m_orientation); - ui_container.set_user_settings(settings); + m_ui_container->set_user_settings(settings); } } @@ -2743,6 +2959,8 @@ void render_target::config_load(util::xml::data_node const *targetnode) { current_view().recompute(visibility_mask(), m_layerconfig.zoom_to_screen()); current_view().preload(); + m_clickable_items.clear(); + m_clickable_items.resize(current_view().interactive_items().size()); } } } @@ -3104,7 +3322,6 @@ render_manager::render_manager(running_machine &machine) , m_ui_target(nullptr) , m_live_textures(0) , m_texture_id(0) - , m_ui_container(std::make_unique(*this)) { // register callbacks machine.configuration().config_register( @@ -3125,7 +3342,7 @@ render_manager::render_manager(running_machine &machine) render_manager::~render_manager() { // free all the containers since they may own textures - m_ui_container.reset(); + m_ui_containers.clear(); m_screen_container_list.clear(); // better not be any outstanding textures when we die @@ -3181,12 +3398,14 @@ float render_manager::max_update_rate() const render_target *render_manager::target_alloc(const internal_layout *layoutfile, u32 flags) { - return &m_targetlist.append(*new render_target(*this, layoutfile, flags)); + render_container *const ui = (flags & RENDER_CREATE_HIDDEN) ? nullptr : &m_ui_containers.emplace_back(*this); + return &m_targetlist.append(*new render_target(*this, ui, layoutfile, flags)); } render_target *render_manager::target_alloc(util::xml::data_node const &layout, u32 flags) { - return &m_targetlist.append(*new render_target(*this, layout, flags)); + render_container *const ui = (flags & RENDER_CREATE_HIDDEN) ? nullptr : &m_ui_containers.emplace_back(*this); + return &m_targetlist.append(*new render_target(*this, ui, layout, flags)); } @@ -3223,35 +3442,56 @@ render_target *render_manager::target_by_index(int index) const float render_manager::ui_aspect(render_container *rc) { - int orient; + // work out if this is a UI container + render_target *target = nullptr; + if (!rc) + { + target = &ui_target(); + rc = target->ui_container(); + assert(rc); + } + else + { + for (render_target &t : m_targetlist) + { + if (t.ui_container() == rc) + { + target = &t; + break; + } + } + } + float aspect; - if (rc == m_ui_container.get() || rc == nullptr) { - // ui container, aggregated multi-screen target + if (target) + { + // UI container, aggregated multi-screen target - orient = orientation_add(m_ui_target->orientation(), m_ui_container->orientation()); // based on the orientation of the target, compute height/width or width/height + int const orient = orientation_add(target->orientation(), rc->orientation()); if (!(orient & ORIENTATION_SWAP_XY)) - aspect = (float)m_ui_target->height() / (float)m_ui_target->width(); + aspect = float(target->height()) / float(target->width()); else - aspect = (float)m_ui_target->width() / (float)m_ui_target->height(); + aspect = float(target->width()) / float(target->height()); // if we have a valid pixel aspect, apply that and return - if (m_ui_target->pixel_aspect() != 0.0f) + if (target->pixel_aspect() != 0.0f) { - float pixel_aspect = m_ui_target->pixel_aspect(); + float pixel_aspect = target->pixel_aspect(); if (orient & ORIENTATION_SWAP_XY) pixel_aspect = 1.0f / pixel_aspect; return aspect /= pixel_aspect; } - - } else { + } + else + { // single screen container - orient = rc->orientation(); // based on the orientation of the target, compute height/width or width/height + int const orient = rc->orientation(); if (!(orient & ORIENTATION_SWAP_XY)) aspect = (float)rc->screen()->visible_area().height() / (float)rc->screen()->visible_area().width(); else diff --git a/src/emu/render.h b/src/emu/render.h index 2faa5f4639452..c4c0f504edd16 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -48,6 +48,8 @@ #include "rendertypes.h" +#include "interface/uievents.h" + #include #include #include @@ -492,14 +494,15 @@ class render_target friend class render_manager; // construction/destruction - render_target(render_manager &manager, const internal_layout *layoutfile = nullptr, u32 flags = 0); - render_target(render_manager &manager, util::xml::data_node const &layout, u32 flags = 0); + render_target(render_manager &manager, render_container *ui, const internal_layout *layoutfile, u32 flags); + render_target(render_manager &manager, render_container *ui, util::xml::data_node const &layout, u32 flags); ~render_target(); public: // getters render_target *next() const { return m_next; } render_manager &manager() const { return m_manager; } + render_container *ui_container() const { return m_ui_container; } u32 width() const { return m_width; } u32 height() const { return m_height; } float pixel_aspect() const { return m_pixel_aspect; } @@ -525,6 +528,13 @@ class render_target void set_keepaspect(bool keepaspect) { m_keepaspect = keepaspect; } void set_scale_mode(int scale_mode) { m_scale_mode = scale_mode; } + // pointer input handling + void pointer_updated(osd::ui_event_handler::pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 buttons, u32 pressed, u32 released, s16 clicks); + void pointer_left(osd::ui_event_handler::pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 released, s16 clicks); + void pointer_aborted(osd::ui_event_handler::pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 released, s16 clicks); + void forget_pointers(); + void update_pointer_fields(); + // layer config getters bool screen_overlay_enabled() const { return m_layerconfig.screen_overlay_enabled(); } bool zoom_to_screen() const { return m_layerconfig.zoom_to_screen(); } @@ -550,7 +560,6 @@ class render_target // hit testing bool map_point_container(s32 target_x, s32 target_y, render_container &container, float &container_x, float &container_y); - bool map_point_input(s32 target_x, s32 target_y, ioport_port *&input_port, ioport_value &input_mask, float &input_x, float &input_y); // reference tracking void invalidate_all(void *refptr); @@ -559,15 +568,24 @@ class render_target void resolve_tags(); private: + // constants + static inline constexpr int NUM_PRIMLISTS = 3; + static inline constexpr int MAX_CLEAR_EXTENTS = 1000; + using view_mask_pair = std::pair; using view_mask_vector = std::vector; // private classes declared in render.cpp struct object_transform; + struct pointer_info; + struct hit_test; + + using pointer_info_vector = std::vector; + using hit_test_vector = std::vector; // internal helpers enum constructor_impl_t { CONSTRUCTOR_IMPL }; - template render_target(render_manager &manager, T&& layout, u32 flags, constructor_impl_t); + template render_target(render_manager &manager, render_container *ui, T&& layout, u32 flags, constructor_impl_t); void update_layer_config(); void load_layout_files(const internal_layout *layoutfile, bool singlefile); void load_layout_files(util::xml::data_node const &rootnode, bool singlefile); @@ -578,6 +596,7 @@ class render_target void add_container_primitives(render_primitive_list &list, const object_transform &root_xform, const object_transform &xform, render_container &container, int blendmode); void add_element_primitives(render_primitive_list &list, const object_transform &xform, layout_view_item &item); std::pair map_point_internal(s32 target_x, s32 target_y); + std::pair map_point_layout(s32 target_x, s32 target_y); // config callbacks void config_load(util::xml::data_node const *targetnode); @@ -593,13 +612,10 @@ class render_target void add_clear_extents(render_primitive_list &list); void add_clear_and_optimize_primitive_list(render_primitive_list &list); - // constants - static constexpr int NUM_PRIMLISTS = 3; - static constexpr int MAX_CLEAR_EXTENTS = 1000; - // internal state render_target * m_next; // link to next target render_manager & m_manager; // reference to our owning manager + render_container *const m_ui_container; // container for drawing UI elements std::list m_filelist; // list of layout files view_mask_vector m_views; // views we consider unsigned m_curview; // current view index @@ -618,7 +634,8 @@ class render_target float m_max_refresh; // maximum refresh rate, 0 or if none int m_orientation; // orientation render_layer_config m_layerconfig; // layer configuration - std::vector m_hit_test; // used when mapping points to inputs + pointer_info_vector m_pointers; // state of pointers over this target + hit_test_vector m_clickable_items; // for tracking clicked elements layout_view * m_base_view; // the view at the time of first frame int m_base_orientation; // the orientation at the time of first frame render_layer_config m_base_layerconfig; // the layer configuration at the time of first frame @@ -665,7 +682,7 @@ class render_manager float ui_aspect(render_container *rc = nullptr); // UI containers - render_container &ui_container() const { assert(m_ui_container != nullptr); return *m_ui_container; } + render_container &ui_container() const { assert(ui_target().ui_container()); return *ui_target().ui_container(); } // textures render_texture *texture_alloc(texture_scaler_func scaler = nullptr, void *param = nullptr); @@ -686,20 +703,20 @@ class render_manager void config_save(config_type cfg_type, util::xml::data_node *parentnode); // internal state - running_machine & m_machine; // reference back to the machine + running_machine & m_machine; // reference back to the machine // array of live targets - simple_list m_targetlist; // list of targets - render_target * m_ui_target; // current UI target + simple_list m_targetlist; // list of targets + render_target * m_ui_target; // current UI target // texture lists - u32 m_live_textures; // number of live textures - u64 m_texture_id; // rolling texture ID counter - fixed_allocator m_texture_allocator;// texture allocator + u32 m_live_textures; // number of live textures + u64 m_texture_id; // rolling texture ID counter + fixed_allocator m_texture_allocator; // texture allocator - // containers for the UI and for screens - std::unique_ptr m_ui_container; // UI container - std::list m_screen_container_list; // list of containers for the screen + // containers for UI elements and for screens + std::list m_ui_containers; // containers for drawing UI elements + std::list m_screen_container_list; // list of containers for the screen }; #endif // MAME_EMU_RENDER_H diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index c6e053fc7135d..de17b5dae6f65 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -4251,6 +4251,7 @@ void layout_view::recompute(u32 visibility_mask, bool zoom_to_screen) // sort edges of interactive items LOGMASKED(LOG_INTERACTIVE_ITEMS, "Recalculated view '%s' with %u interactive items\n", name(), m_interactive_items.size()); + //std::reverse(m_interactive_items.begin(), m_interactive_items.end()); TODO: flip hit test order to match visual order m_interactive_edges_x.reserve(m_interactive_items.size() * 2); m_interactive_edges_y.reserve(m_interactive_items.size() * 2); for (unsigned i = 0; m_interactive_items.size() > i; ++i) @@ -4314,6 +4315,50 @@ void layout_view::set_recomputed_callback(recomputed_delegate &&handler) } +//------------------------------------------------- +// set_pointer_updated_callback - set handler +// called for pointer input +//------------------------------------------------- + +void layout_view::set_pointer_updated_callback(pointer_updated_delegate &&handler) +{ + m_pointer_updated = std::move(handler); +} + + +//------------------------------------------------- +// set_pointer_left_callback - set handler for +// pointer leaving normally +//------------------------------------------------- + +void layout_view::set_pointer_left_callback(pointer_left_delegate &&handler) +{ + m_pointer_left = std::move(handler); +} + + +//------------------------------------------------- +// set_pointer_aborted_callback - set handler for +// pointer leaving abnormally +//------------------------------------------------- + +void layout_view::set_pointer_aborted_callback(pointer_left_delegate &&handler) +{ + m_pointer_aborted = std::move(handler); +} + + +//------------------------------------------------- +// set_forget_pointers_callback - set handler for +// abandoning pointer input +//------------------------------------------------- + +void layout_view::set_forget_pointers_callback(forget_pointers_delegate &&handler) +{ + m_forget_pointers = std::move(handler); +} + + //------------------------------------------------- // preload - perform expensive loading upfront // for visible elements diff --git a/src/emu/rendlay.h b/src/emu/rendlay.h index 0391bc6e96182..7edeb4b40c5ce 100644 --- a/src/emu/rendlay.h +++ b/src/emu/rendlay.h @@ -16,6 +16,8 @@ #include "rendertypes.h" #include "screen.h" +#include "interface/uievents.h" + #include #include #include @@ -436,6 +438,9 @@ class layout_view using prepare_items_delegate = delegate; using preload_delegate = delegate; using recomputed_delegate = delegate; + using pointer_updated_delegate = delegate; + using pointer_left_delegate = delegate; + using forget_pointers_delegate = delegate; using item = layout_view_item; using item_list = std::list; @@ -524,9 +529,13 @@ class layout_view bool has_art() const { return m_has_art; } // set handlers - void set_prepare_items_callback(prepare_items_delegate &&handler); - void set_preload_callback(preload_delegate &&handler); - void set_recomputed_callback(recomputed_delegate &&handler); + void set_prepare_items_callback(prepare_items_delegate &&handler) ATTR_COLD; + void set_preload_callback(preload_delegate &&handler) ATTR_COLD; + void set_recomputed_callback(recomputed_delegate &&handler) ATTR_COLD; + void set_pointer_updated_callback(pointer_updated_delegate &&handler) ATTR_COLD; + void set_pointer_left_callback(pointer_left_delegate &&handler) ATTR_COLD; + void set_pointer_aborted_callback(pointer_left_delegate &&handler) ATTR_COLD; + void set_forget_pointers_callback(forget_pointers_delegate &&handler) ATTR_COLD; // operations void prepare_items(); @@ -536,6 +545,28 @@ class layout_view // resolve tags, if any void resolve_tags(); + // pointer input + void pointer_updated(osd::ui_event_handler::pointer type, u16 ptrid, u16 device, float x, float y, u32 buttons, u32 pressed, u32 released, s16 clicks) + { + if (!m_pointer_updated.isnull()) + m_pointer_updated(type, ptrid, device, x, y, buttons, pressed, released, clicks); + } + void pointer_left(osd::ui_event_handler::pointer type, u16 ptrid, u16 device, float x, float y, u32 released, s16 clicks) + { + if (!m_pointer_left.isnull()) + m_pointer_left(type, ptrid, device, x, y, released, clicks); + } + void pointer_aborted(osd::ui_event_handler::pointer type, u16 ptrid, u16 device, float x, float y, u32 released, s16 clicks) + { + if (!m_pointer_aborted.isnull()) + m_pointer_aborted(type, ptrid, device, x, y, released, clicks); + } + void forget_pointers() + { + if (!m_forget_pointers.isnull()) + m_forget_pointers(); + } + private: struct layer_lists; @@ -576,6 +607,10 @@ class layout_view prepare_items_delegate m_prepare_items; // prepare items for adding to render container preload_delegate m_preload; // additional actions when visible items change recomputed_delegate m_recomputed; // additional actions on resizing/visibility change + pointer_updated_delegate m_pointer_updated; // pointer state updated + pointer_left_delegate m_pointer_left; // pointer left normally + pointer_left_delegate m_pointer_aborted; // pointer left abnormally + forget_pointers_delegate m_forget_pointers; // stop processing pointer input // cold items std::string m_name; // display name for the view diff --git a/src/emu/ui/uimain.h b/src/emu/ui/uimain.h index bf10957d74396..e45c71f9468ae 100644 --- a/src/emu/ui/uimain.h +++ b/src/emu/ui/uimain.h @@ -13,6 +13,8 @@ #pragma once +#include + /*************************************************************************** TYPE DEFINITIONS @@ -35,6 +37,8 @@ class ui_manager virtual void menu_reset() { } + virtual bool set_ui_event_handler(std::function &&handler) { return false; } + template void popup_time(int seconds, Format &&fmt, Params &&... args); protected: diff --git a/src/emu/uiinput.cpp b/src/emu/uiinput.cpp index 138bf67055de7..12ba8a08bb0a0 100644 --- a/src/emu/uiinput.cpp +++ b/src/emu/uiinput.cpp @@ -36,19 +36,11 @@ enum ui_input_manager::ui_input_manager(running_machine &machine) : m_machine(machine) , m_presses_enabled(true) - , m_current_mouse_target(nullptr) - , m_current_mouse_x(-1) - , m_current_mouse_y(-1) - , m_current_mouse_down(false) - , m_current_mouse_field(nullptr) , m_events_start(0) , m_events_end(0) { std::fill(std::begin(m_next_repeat), std::end(m_next_repeat), 0); std::fill(std::begin(m_seqpressed), std::end(m_seqpressed), 0); - - // add a frame callback to poll inputs - machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(&ui_input_manager::frame_update, this)); } @@ -58,12 +50,12 @@ ui_input_manager::ui_input_manager(running_machine &machine) ***************************************************************************/ /*------------------------------------------------- - frame_update - looks through pressed - input as per events pushed our way and posts + check_ui_inputs - looks through pressed input + as per events pushed our way and posts corresponding IPT_UI_* events -------------------------------------------------*/ -void ui_input_manager::frame_update() +void ui_input_manager::check_ui_inputs() { // update the state of all the UI keys for (ioport_type code = ioport_type(IPT_UI_FIRST + 1); code < IPT_UI_LAST; ++code) @@ -80,22 +72,6 @@ void ui_input_manager::frame_update() m_seqpressed[code] = false; } } - - // perform mouse hit testing - ioport_field *mouse_field = m_current_mouse_down ? find_mouse_field() : nullptr; - if (m_current_mouse_field != mouse_field) - { - // clear the old field if there was one - if (m_current_mouse_field != nullptr) - m_current_mouse_field->set_value(0); - - // set the new field if it exists and isn't already being pressed - if (mouse_field != nullptr && !mouse_field->digital_value()) - mouse_field->set_value(1); - - // update internal state - m_current_mouse_field = mouse_field; - } } @@ -106,37 +82,6 @@ void ui_input_manager::frame_update() bool ui_input_manager::push_event(ui_event evt) { - // some pre-processing (this is an icky place to do this stuff!) - switch (evt.event_type) - { - case ui_event::type::MOUSE_MOVE: - m_current_mouse_target = evt.target; - m_current_mouse_x = evt.mouse_x; - m_current_mouse_y = evt.mouse_y; - break; - - case ui_event::type::MOUSE_LEAVE: - if (m_current_mouse_target == evt.target) - { - m_current_mouse_target = nullptr; - m_current_mouse_x = -1; - m_current_mouse_y = -1; - } - break; - - case ui_event::type::MOUSE_DOWN: - m_current_mouse_down = true; - break; - - case ui_event::type::MOUSE_UP: - m_current_mouse_down = false; - break; - - default: - /* do nothing */ - break; - } - // is the queue filled up? if ((m_events_end + 1) % std::size(m_events) == m_events_start) return false; @@ -186,63 +131,11 @@ void ui_input_manager::reset() } -/*------------------------------------------------- - find_mouse - retrieves the current - location of the mouse --------------------------------------------------*/ - -render_target *ui_input_manager::find_mouse(s32 *x, s32 *y, bool *button) const -{ - if (x != nullptr) - *x = m_current_mouse_x; - if (y != nullptr) - *y = m_current_mouse_y; - if (button != nullptr) - *button = m_current_mouse_down; - return m_current_mouse_target; -} - - -/*------------------------------------------------- - find_mouse_field - retrieves the input field - the mouse is currently pointing at --------------------------------------------------*/ - -ioport_field *ui_input_manager::find_mouse_field() const -{ - // map the point and determine what was hit - if (m_current_mouse_target != nullptr) - { - ioport_port *port = nullptr; - ioport_value mask; - float x, y; - if (m_current_mouse_target->map_point_input(m_current_mouse_x, m_current_mouse_y, port, mask, x, y)) - { - if (port != nullptr) - return port->field(mask); - } - } - return nullptr; -} - - /*************************************************************************** USER INTERFACE SEQUENCE READING ***************************************************************************/ -/*------------------------------------------------- - pressed - return true if a key down - for the given user interface sequence is - detected --------------------------------------------------*/ - -bool ui_input_manager::pressed(int code) -{ - return pressed_repeat(code, 0); -} - - /*------------------------------------------------- pressed_repeat - return true if a key down for the given user interface sequence is @@ -272,7 +165,7 @@ bool ui_input_manager::pressed_repeat(int code, int speed) /* if this is an autorepeat case, set a 1x delay and leave pressed = 1 */ else if (speed > 0 && (osd_ticks() + tps - m_next_repeat[code]) >= tps) { - // In the autorepeatcase, we need to double check the key is still pressed + // In the autorepeat case, we need to double-check the key is still pressed // as there can be a delay between the key polling and our processing of the event m_seqpressed[code] = machine().ioport().type_pressed(ioport_type(code)); pressed = (m_seqpressed[code] == SEQ_PRESSED_TRUE); @@ -319,105 +212,84 @@ void ui_input_manager::push_window_defocus_event(render_target *target) } /*------------------------------------------------- - push_mouse_move_event - pushes a mouse - move event to the specified render_target --------------------------------------------------*/ - -void ui_input_manager::push_mouse_move_event(render_target *target, s32 x, s32 y) -{ - ui_event event = { ui_event::type::NONE }; - event.event_type = ui_event::type::MOUSE_MOVE; - event.target = target; - event.mouse_x = x; - event.mouse_y = y; - push_event(event); -} - -/*------------------------------------------------- - push_mouse_leave_event - pushes a - mouse leave event to the specified render_target --------------------------------------------------*/ - -void ui_input_manager::push_mouse_leave_event(render_target *target) -{ - ui_event event = { ui_event::type::NONE }; - event.event_type = ui_event::type::MOUSE_LEAVE; - event.target = target; - push_event(event); -} - -/*------------------------------------------------- - push_mouse_down_event - pushes a mouse - down event to the specified render_target --------------------------------------------------*/ - -void ui_input_manager::push_mouse_down_event(render_target *target, s32 x, s32 y) -{ - ui_event event = { ui_event::type::NONE }; - event.event_type = ui_event::type::MOUSE_DOWN; - event.target = target; - event.mouse_x = x; - event.mouse_y = y; - push_event(event); -} - -/*------------------------------------------------- - push_mouse_down_event - pushes a mouse - down event to the specified render_target --------------------------------------------------*/ - -void ui_input_manager::push_mouse_up_event(render_target *target, s32 x, s32 y) -{ - ui_event event = { ui_event::type::NONE }; - event.event_type = ui_event::type::MOUSE_UP; - event.target = target; - event.mouse_x = x; - event.mouse_y = y; - push_event(event); -} - -/*------------------------------------------------- -push_mouse_down_event - pushes a mouse -down event to the specified render_target + push_pointer_update - pushes a pointer update + event to the specified render_target -------------------------------------------------*/ -void ui_input_manager::push_mouse_rdown_event(render_target *target, s32 x, s32 y) +void ui_input_manager::push_pointer_update( + render_target *target, + pointer type, + u16 ptrid, + u16 device, + s32 x, + s32 y, + u32 buttons, + u32 pressed, + u32 released, + s16 clicks) { ui_event event = { ui_event::type::NONE }; - event.event_type = ui_event::type::MOUSE_RDOWN; + event.event_type = ui_event::type::POINTER_UPDATE; event.target = target; - event.mouse_x = x; - event.mouse_y = y; + event.pointer_type = type; + event.pointer_id = ptrid; + event.pointer_device = device; + event.pointer_x = x; + event.pointer_y = y; + event.pointer_buttons = buttons; + event.pointer_pressed = pressed; + event.pointer_released = released; + event.pointer_clicks = clicks; push_event(event); } -/*------------------------------------------------- -push_mouse_down_event - pushes a mouse -down event to the specified render_target --------------------------------------------------*/ - -void ui_input_manager::push_mouse_rup_event(render_target *target, s32 x, s32 y) +void ui_input_manager::push_pointer_leave( + render_target *target, + pointer type, + u16 ptrid, + u16 device, + s32 x, + s32 y, + u32 released, + s16 clicks) { ui_event event = { ui_event::type::NONE }; - event.event_type = ui_event::type::MOUSE_RUP; + event.event_type = ui_event::type::POINTER_LEAVE; event.target = target; - event.mouse_x = x; - event.mouse_y = y; + event.pointer_type = type; + event.pointer_id = ptrid; + event.pointer_device = device; + event.pointer_x = x; + event.pointer_y = y; + event.pointer_buttons = 0U; + event.pointer_pressed = 0U; + event.pointer_released = released; + event.pointer_clicks = clicks; push_event(event); } -/*------------------------------------------------- - push_mouse_double_click_event - pushes - a mouse double-click event to the specified - render_target --------------------------------------------------*/ -void ui_input_manager::push_mouse_double_click_event(render_target *target, s32 x, s32 y) +void ui_input_manager::push_pointer_abort( + render_target *target, + pointer type, + u16 ptrid, + u16 device, + s32 x, + s32 y, + u32 released, + s16 clicks) { ui_event event = { ui_event::type::NONE }; - event.event_type = ui_event::type::MOUSE_DOUBLE_CLICK; + event.event_type = ui_event::type::POINTER_ABORT; event.target = target; - event.mouse_x = x; - event.mouse_y = y; + event.pointer_type = type; + event.pointer_id = ptrid; + event.pointer_device = device; + event.pointer_x = x; + event.pointer_y = y; + event.pointer_buttons = 0U; + event.pointer_pressed = 0U; + event.pointer_released = released; + event.pointer_clicks = clicks; push_event(event); } @@ -439,7 +311,7 @@ void ui_input_manager::push_char_event(render_target *target, char32_t ch) wheel event to the specified render_target -------------------------------------------------*/ -void ui_input_manager::push_mouse_wheel_event(render_target *target, s32 x, s32 y, short delta, int ucNumLines) +void ui_input_manager::push_mouse_wheel_event(render_target *target, s32 x, s32 y, short delta, int lines) { ui_event event = { ui_event::type::NONE }; event.event_type = ui_event::type::MOUSE_WHEEL; @@ -447,7 +319,7 @@ void ui_input_manager::push_mouse_wheel_event(render_target *target, s32 x, s32 event.mouse_x = x; event.mouse_y = y; event.zdelta = delta; - event.num_lines = ucNumLines; + event.num_lines = lines; push_event(event); } diff --git a/src/emu/uiinput.h b/src/emu/uiinput.h index 3fc89d7a4ffbc..54170bad7ec4f 100644 --- a/src/emu/uiinput.h +++ b/src/emu/uiinput.h @@ -13,6 +13,8 @@ #pragma once +#include "interface/uievents.h" + /*************************************************************************** TYPE DEFINITIONS @@ -25,17 +27,15 @@ struct ui_event NONE, WINDOW_FOCUS, WINDOW_DEFOCUS, - MOUSE_MOVE, - MOUSE_LEAVE, - MOUSE_DOWN, - MOUSE_UP, - MOUSE_RDOWN, - MOUSE_RUP, - MOUSE_DOUBLE_CLICK, MOUSE_WHEEL, + POINTER_UPDATE, + POINTER_LEAVE, + POINTER_ABORT, IME_CHAR }; + using pointer = osd::ui_event_handler::pointer; + type event_type; render_target * target; s32 mouse_x; @@ -44,17 +44,27 @@ struct ui_event char32_t ch; short zdelta; int num_lines; + + pointer pointer_type; // type of input controlling this pointer + u16 pointer_id; // pointer ID - will be recycled aggressively + u16 pointer_device; // for grouping pointers for multi-touch gesture recognition + s32 pointer_x; // pointer X coordinate + s32 pointer_y; // pointer Y coordinate + u32 pointer_buttons; // currently depressed buttons + u32 pointer_pressed; // buttons pressed since last update (primary action in LSB) + u32 pointer_released; // buttons released since last update (primary action in LSB) + s16 pointer_clicks; // positive for multi-click, negative on release if turned into hold or drag }; // ======================> ui_input_manager -class ui_input_manager +class ui_input_manager final : public osd::ui_event_handler { public: // construction/destruction ui_input_manager(running_machine &machine); - void frame_update(); + void check_ui_inputs(); // pushes a single event onto the queue bool push_event(ui_event event); @@ -68,17 +78,13 @@ class ui_input_manager // clears all outstanding events void reset(); - // retrieves the current location of the mouse - render_target *find_mouse(s32 *x, s32 *y, bool *button) const; - ioport_field *find_mouse_field() const; - - // return true if a key down for the given user interface sequence is detected - bool pressed(int code); - // enable/disable UI key presses bool presses_enabled() const { return m_presses_enabled; } void set_presses_enabled(bool enabled) { m_presses_enabled = enabled; } + // return true if a key down for the given user interface sequence is detected + bool pressed(int code) { return pressed_repeat(code, 0); } + // return true if a key down for the given user interface sequence is detected, or if autorepeat at the given speed is triggered bool pressed_repeat(int code, int speed); @@ -86,44 +92,32 @@ class ui_input_manager running_machine &machine() const { return m_machine; } // queueing events - void push_window_focus_event(render_target *target); - void push_window_defocus_event(render_target *target); - void push_mouse_move_event(render_target *target, s32 x, s32 y); - void push_mouse_leave_event(render_target *target); - void push_mouse_down_event(render_target *target, s32 x, s32 y); - void push_mouse_up_event(render_target *target, s32 x, s32 y); - void push_mouse_rdown_event(render_target *target, s32 x, s32 y); - void push_mouse_rup_event(render_target *target, s32 x, s32 y); - void push_mouse_double_click_event(render_target *target, s32 x, s32 y); - void push_char_event(render_target *target, char32_t ch); - void push_mouse_wheel_event(render_target *target, s32 x, s32 y, short delta, int ucNumLines); + virtual void push_window_focus_event(render_target *target) override; + virtual void push_window_defocus_event(render_target *target) override; + virtual void push_mouse_wheel_event(render_target *target, s32 x, s32 y, short delta, int lines) override; + virtual void push_pointer_update(render_target *target, pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 buttons, u32 pressed, u32 released, s16 clicks) override; + virtual void push_pointer_leave(render_target *target, pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 released, s16 clicks) override; + virtual void push_pointer_abort(render_target *target, pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 released, s16 clicks) override; + virtual void push_char_event(render_target *target, char32_t ch) override; void mark_all_as_pressed(); private: - // constants - static constexpr unsigned EVENT_QUEUE_SIZE = 128; + static constexpr unsigned EVENT_QUEUE_SIZE = 256; // internal state - running_machine & m_machine; // reference to our machine - - // pressed states; retrieved with ui_input_pressed() - bool m_presses_enabled; - osd_ticks_t m_next_repeat[IPT_COUNT]; - u8 m_seqpressed[IPT_COUNT]; - - // mouse position/info - render_target * m_current_mouse_target; - s32 m_current_mouse_x; - s32 m_current_mouse_y; - bool m_current_mouse_down; - ioport_field * m_current_mouse_field; - - // popped states; ring buffer of ui_events - ui_event m_events[EVENT_QUEUE_SIZE]; - int m_events_start; - int m_events_end; + running_machine & m_machine; + + // pressed states; retrieved with pressed() or pressed_repeat() + bool m_presses_enabled; + osd_ticks_t m_next_repeat[IPT_COUNT]; + u8 m_seqpressed[IPT_COUNT]; + + // ring buffer of ui_events + ui_event m_events[EVENT_QUEUE_SIZE]; + int m_events_start; + int m_events_end; }; #endif // MAME_EMU_UIINPUT_H diff --git a/src/frontend/mame/luaengine_input.cpp b/src/frontend/mame/luaengine_input.cpp index 42fe2d49d78e1..04db2a13e84a5 100644 --- a/src/frontend/mame/luaengine_input.cpp +++ b/src/frontend/mame/luaengine_input.cpp @@ -513,15 +513,6 @@ void lua_engine::initialize_input(sol::table &emu) auto uiinput_type = sol().registry().new_usertype("uiinput", sol::no_constructor); uiinput_type.set_function("reset", &ui_input_manager::reset); - uiinput_type.set_function( - "find_mouse", - [] (ui_input_manager &ui) - { - int32_t x, y; - bool button; - render_target *rt = ui.find_mouse(&x, &y, &button); - return std::make_tuple(x, y, button, rt); - }); uiinput_type.set_function("pressed", &ui_input_manager::pressed); uiinput_type.set_function("pressed_repeat", &ui_input_manager::pressed_repeat); uiinput_type["presses_enabled"] = sol::property(&ui_input_manager::presses_enabled, &ui_input_manager::set_presses_enabled); diff --git a/src/frontend/mame/luaengine_mem.cpp b/src/frontend/mame/luaengine_mem.cpp index 4e5fac3341fd0..ff2f406828b96 100644 --- a/src/frontend/mame/luaengine_mem.cpp +++ b/src/frontend/mame/luaengine_mem.cpp @@ -132,7 +132,7 @@ void share_write(memory_share &share, offs_t address, T val) int sol_lua_push(sol::types, lua_State *L, map_handler_type &&value) { const char *typestr; - switch(value) + switch (value) { case AMH_NONE: typestr = "none"; diff --git a/src/frontend/mame/luaengine_render.cpp b/src/frontend/mame/luaengine_render.cpp index 2568f72f95d5b..3fd0bfdba109e 100644 --- a/src/frontend/mame/luaengine_render.cpp +++ b/src/frontend/mame/luaengine_render.cpp @@ -18,6 +18,7 @@ #include "rendlay.h" #include "rendutil.h" +#include "interface/uievents.h" #include "ioprocs.h" #include @@ -449,6 +450,33 @@ struct usertype_container : lua_engine::immutable_cont } // namespace sol +//------------------------------------------------- +// sol_lua_push - automatically convert +// osd::ui_event_handler::pointer to a string +//------------------------------------------------- + +int sol_lua_push(sol::types, lua_State *L, osd::ui_event_handler::pointer &&value) +{ + const char *typestr = "invalid"; + switch (value) + { + case osd::ui_event_handler::pointer::UNKNOWN: + typestr = "unknown"; + break; + case osd::ui_event_handler::pointer::MOUSE: + typestr = "mouse"; + break; + case osd::ui_event_handler::pointer::PEN: + typestr = "pen"; + break; + case osd::ui_event_handler::pointer::TOUCH: + typestr = "touch"; + break; + } + return sol::stack::push(L, typestr); +} + + template class lua_engine::bitmap_helper : public T { @@ -931,6 +959,34 @@ void lua_engine::initialize_render(sol::table &emu) nullptr, "set_recomputed_callback", "recomputed")); + layout_view_type.set_function( + "set_pointer_updated_callback", + make_simple_callback_setter( + &layout_view::set_pointer_updated_callback, + nullptr, + "set_pointer_updated_callback", + "pointer updated")); + layout_view_type.set_function( + "set_pointer_left_callback", + make_simple_callback_setter( + &layout_view::set_pointer_left_callback, + nullptr, + "set_pointer_left_callback", + "pointer left")); + layout_view_type.set_function( + "set_pointer_aborted_callback", + make_simple_callback_setter( + &layout_view::set_pointer_aborted_callback, + nullptr, + "set_pointer_aborted_callback", + "pointer aborted")); + layout_view_type.set_function( + "set_forget_pointers_callback", + make_simple_callback_setter( + &layout_view::set_forget_pointers_callback, + nullptr, + "set_forget_pointers_callback", + "forget pointers")); layout_view_type["items"] = sol::property([] (layout_view &v) { return layout_view_items(v); }); layout_view_type["name"] = sol::property(&layout_view::name); layout_view_type["unqualified_name"] = sol::property(&layout_view::unqualified_name); diff --git a/src/frontend/mame/ui/about.cpp b/src/frontend/mame/ui/about.cpp index afb2b73d5d321..7b737273c3aeb 100644 --- a/src/frontend/mame/ui/about.cpp +++ b/src/frontend/mame/ui/about.cpp @@ -80,7 +80,7 @@ void menu_about::recompute_metrics(uint32_t width, uint32_t height, float aspect // perform our special rendering //------------------------------------------------- -void menu_about::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_about::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { // draw the title draw_text_box( @@ -120,17 +120,4 @@ void menu_about::populate() { } - -//------------------------------------------------- -// handle - manages inputs in the about modal -//------------------------------------------------- - -bool menu_about::handle(event const *ev) -{ - if (ev) - return handle_key(ev->iptkey); - else - return false; -} - } // namespace ui diff --git a/src/frontend/mame/ui/about.h b/src/frontend/mame/ui/about.h index 3e84aff7a5e26..90e9d738fa3fc 100644 --- a/src/frontend/mame/ui/about.h +++ b/src/frontend/mame/ui/about.h @@ -30,13 +30,12 @@ class menu_about : public menu_textbox protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual void populate_text(std::optional &layout, float &width, int &lines) override; private: virtual void populate() override; - virtual bool handle(event const *ev) override; std::vector const m_header; }; diff --git a/src/frontend/mame/ui/analogipt.cpp b/src/frontend/mame/ui/analogipt.cpp index f8767ad3c5830..aa6ffa5a07f92 100644 --- a/src/frontend/mame/ui/analogipt.cpp +++ b/src/frontend/mame/ui/analogipt.cpp @@ -13,6 +13,8 @@ #include "ui/textbox.h" +#include "uiinput.h" + #include #include #include @@ -74,9 +76,20 @@ menu_analog::menu_analog(mame_ui_manager &mui, render_container &container) , m_item_data() , m_field_data() , m_prompt() - , m_visible_fields(0U) + , m_bottom_fields(0U) + , m_visible_fields(0) , m_top_field(0) , m_hide_menu(false) + , m_box_left(1.0F) + , m_box_top(1.0F) + , m_box_right(0.0F) + , m_box_bottom(0.0F) + , m_pointer_action(pointer_action::NONE) + , m_scroll_repeat(std::chrono::steady_clock::time_point::min()) + , m_base_pointer(0.0F, 0.0F) + , m_last_pointer(0.0F, 0.0F) + , m_scroll_base(0) + , m_arrow_clicked_first(false) { set_process_flags(PROCESS_LR_REPEAT); set_heading(_("menu-analoginput", "Analog Input Adjustments")); @@ -92,51 +105,50 @@ void menu_analog::recompute_metrics(uint32_t width, uint32_t height, float aspec { menu::recompute_metrics(width, height, aspect); + m_box_left = m_box_top = 1.0F; + m_box_right = m_box_bottom = 0.0F; + // space for live display - set_custom_space(0.0f, (line_height() * m_visible_fields) + (tb_border() * 3.0f)); + set_custom_space(0.0F, (line_height() * m_bottom_fields) + (tb_border() * 3.0F)); } -void menu_analog::custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) +void menu_analog::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) { // work out how much space to use for field names - float const aspect(machine().render().ui_aspect(&container())); - float const extrawidth(0.4f + (((ui().box_lr_border() * 2.0f) + ui().get_line_height()) * aspect)); - float const nameavail(1.0f - (lr_border() * 2.0f) - extrawidth); - float namewidth(0.0f); + float const extrawidth(0.4F + (((ui().box_lr_border() * 2.0F) + ui().get_line_height()) * x_aspect())); + float const nameavail(1.0F - (lr_border() * 2.0F) - extrawidth); + float namewidth(0.0F); for (field_data &data : m_field_data) namewidth = (std::min)((std::max)(get_string_width(data.field.get().name()), namewidth), nameavail); // make a box or two rgb_t const fgcolor(ui().colors().text_color()); - float const boxleft((1.0f - namewidth - extrawidth) / 2.0f); - float const boxright(boxleft + namewidth + extrawidth); - float boxtop; - float boxbottom; + m_box_left = (1.0F - namewidth - extrawidth) * 0.5F; + m_box_right = m_box_left + namewidth + extrawidth; float firstliney; - int visible_fields; if (m_hide_menu) { if (m_prompt.empty()) m_prompt = util::string_format(_("menu-analoginput", "Press %s to show settings"), ui().get_general_input_setting(IPT_UI_ON_SCREEN_DISPLAY)); draw_text_box( &m_prompt, &m_prompt + 1, - boxleft, boxright, y - top, y - top + line_height() + (tb_border() * 2.0f), + m_box_left, m_box_right, y - top, y - top + line_height() + (tb_border() * 2.0F), text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE, false, fgcolor, ui().colors().background_color()); - boxtop = y - top + line_height() + (tb_border() * 3.0f); - firstliney = y - top + line_height() + (tb_border() * 4.0f); - visible_fields = std::min(m_field_data.size(), int((y2 + bottom - tb_border() - firstliney) / line_height())); - boxbottom = firstliney + (line_height() * visible_fields) + tb_border(); + m_box_top = y - top + line_height() + (tb_border() * 3.0F); + firstliney = y - top + line_height() + (tb_border() * 4.0F); + m_visible_fields = std::min(m_field_data.size(), int((y2 + bottom - tb_border() - firstliney) / line_height())); + m_box_bottom = firstliney + (line_height() * m_visible_fields) + tb_border(); } else { - boxtop = y2 + tb_border(); - boxbottom = y2 + bottom; - firstliney = y2 + (tb_border() * 2.0f); - visible_fields = m_visible_fields; + m_box_top = y2 + tb_border(); + m_box_bottom = y2 + bottom; + firstliney = y2 + (tb_border() * 2.0F); + m_visible_fields = m_bottom_fields; } - ui().draw_outlined_box(container(), boxleft, boxtop, boxright, boxbottom, ui().colors().background_color()); + ui().draw_outlined_box(container(), m_box_left, m_box_top, m_box_right, m_box_bottom, ui().colors().background_color()); // force the field being configured to be visible ioport_field *const selfield(selectedref ? &reinterpret_cast(selectedref)->field.get() : nullptr); @@ -152,35 +164,44 @@ void menu_analog::custom_render(void *selectedref, float top, float bottom, floa auto const i(std::distance(m_field_data.begin(), found)); if (m_top_field > i) m_top_field = i; - if ((m_top_field + visible_fields) <= i) - m_top_field = i - m_visible_fields + 1; + if ((m_top_field + m_visible_fields) <= i) + m_top_field = i - m_bottom_fields + 1; } } if (0 > m_top_field) m_top_field = 0; - if ((m_top_field + visible_fields) > m_field_data.size()) - m_top_field = m_field_data.size() - visible_fields; + if ((m_top_field + m_visible_fields) > m_field_data.size()) + m_top_field = m_field_data.size() - m_visible_fields; // show live fields - namewidth += line_height() * aspect; - float const nameleft(boxleft + lr_border()); + namewidth += line_height() * x_aspect(); + float const nameleft(m_box_left + lr_border()); float const indleft(nameleft + namewidth); - float const indright(indleft + 0.4f); - for (unsigned line = 0; visible_fields > line; ++line) + float const indright(indleft + 0.4F); + for (unsigned line = 0; m_visible_fields > line; ++line) { // draw arrows if scrolling is possible and menu is hidden - float const liney(firstliney + (line_height() * line)); + float const liney(firstliney + (line_height() * float(line))); if (m_hide_menu) { bool const uparrow(!line && m_top_field); - bool const downarrow(((visible_fields - 1) == line) && ((m_field_data.size() - 1) > (line + m_top_field))); + bool const downarrow(((m_visible_fields - 1) == line) && ((m_field_data.size() - 1) > (line + m_top_field))); if (uparrow || downarrow) { - float const arrowwidth = line_height() * aspect; + bool const active((uparrow && (pointer_action::SCROLL_UP == m_pointer_action)) || (downarrow && (pointer_action::SCROLL_DOWN == m_pointer_action))); + bool const hovered((active || pointer_idle()) && pointer_in_rect(nameleft, liney, indright, liney + line_height())); + float const arrowwidth(line_height() * x_aspect()); + rgb_t const arrowcolor(!(active || hovered) ? fgcolor : (active && hovered) ? ui().colors().selected_color() : ui().colors().mouseover_color()); + if (active || hovered) + { + highlight( + nameleft, liney, indright, liney + line_height(), + (active && hovered) ? ui().colors().selected_bg_color() : ui().colors().mouseover_bg_color()); + } draw_arrow( - 0.5f * (nameleft + indright - arrowwidth), liney + (0.25f * line_height()), - 0.5f * (nameleft + indright + arrowwidth), liney + (0.75f * line_height()), - fgcolor, line ? (ROT0 ^ ORIENTATION_FLIP_Y) : ROT0); + 0.5F * (nameleft + indright - arrowwidth), liney + (0.25F * line_height()), + 0.5F * (nameleft + indright + arrowwidth), liney + (0.75F * line_height()), + arrowcolor, line ? (ROT0 ^ ORIENTATION_FLIP_Y) : ROT0); continue; } } @@ -200,42 +221,201 @@ void menu_analog::custom_render(void *selectedref, float top, float bottom, floa cur = ((cur >> data.shift) - data.field.get().minval()) & (data.field.get().mask() >> data.shift); float fill(float(cur) / data.range); if (data.field.get().analog_reverse()) - fill = 1.0f - fill; + fill = 1.0F - fill; - float const indtop(liney + (line_height() * 0.2f)); - float const indbottom(liney + (line_height() * 0.8f)); + float const indtop(liney + (line_height() * 0.2F)); + float const indbottom(liney + (line_height() * 0.8F)); if (data.origin > fill) - container().add_rect(indleft + (fill * 0.4f), indtop, indleft + (data.origin * 0.4f), indbottom, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + container().add_rect(indleft + (fill * 0.4F), indtop, indleft + (data.origin * 0.4F), indbottom, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); else - container().add_rect(indleft + (data.origin * 0.4f), indtop, indleft + (fill * 0.4f), indbottom, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + container().add_rect(indleft + (data.origin * 0.4F), indtop, indleft + (fill * 0.4F), indbottom, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); container().add_line(indleft, indtop, indright, indtop, UI_LINE_WIDTH, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); container().add_line(indright, indtop, indright, indbottom, UI_LINE_WIDTH, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); container().add_line(indright, indbottom, indleft, indbottom, UI_LINE_WIDTH, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); container().add_line(indleft, indbottom, indleft, indtop, UI_LINE_WIDTH, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); if (data.show_neutral) - container().add_line(indleft + (data.neutral * 0.4f), indtop, indleft + (data.neutral * 0.4f), indbottom, UI_LINE_WIDTH, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + container().add_line(indleft + (data.neutral * 0.4F), indtop, indleft + (data.neutral * 0.4F), indbottom, UI_LINE_WIDTH, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } } +std::tuple menu_analog::custom_pointer_updated(bool changed, ui_event const &uievt) +{ + // no pointer input if we don't have up-to-date content on-screen + if ((m_box_left > m_box_right) || (ui_event::type::POINTER_ABORT == uievt.event_type)) + { + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, false, false); + } + + // if nothing's happening, check for clicks + if (pointer_idle()) + { + if ((uievt.pointer_pressed & 0x01) && !(uievt.pointer_buttons & ~u32(0x01))) + { + if (1 == uievt.pointer_clicks) + m_arrow_clicked_first = false; + + float const firstliney(m_box_top + tb_border()); + float const fieldleft(m_box_left + lr_border()); + float const fieldright(m_box_right - lr_border()); + auto const [x, y] = pointer_location(); + bool const inwidth((x >= fieldleft) && (x < fieldright)); + if (m_hide_menu && m_top_field && inwidth && (y >= firstliney) && (y < (firstliney + line_height()))) + { + // scroll up arrow + if (1 == uievt.pointer_clicks) + m_arrow_clicked_first = true; + + --m_top_field; + m_pointer_action = pointer_action::SCROLL_UP; + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + m_last_pointer = std::make_pair(x, y); + return std::make_tuple(IPT_INVALID, true, true); + } + else if (m_hide_menu && ((m_top_field + m_visible_fields) < m_field_data.size()) && inwidth && (y >= (firstliney + (float(m_visible_fields - 1) * line_height()))) && (y < (firstliney + (float(m_visible_fields) * line_height())))) + { + // scroll down arrow + if (1 == uievt.pointer_clicks) + m_arrow_clicked_first = true; + + ++m_top_field; + m_pointer_action = pointer_action::SCROLL_DOWN; + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + m_last_pointer = std::make_pair(x, y); + return std::make_tuple(IPT_INVALID, true, true); + } + else if ((x >= m_box_left) && (x < m_box_right) && (y >= m_box_top) && (y < m_box_bottom)) + { + if (!m_arrow_clicked_first && (2 == uievt.pointer_clicks)) + { + // toggle menu display + // FIXME: this should really use the start point of the multi-click action + m_pointer_action = pointer_action::CHECK_TOGGLE_MENU; + m_base_pointer = std::make_pair(x, y); + return std::make_tuple(IPT_INVALID, true, false); + } + else if (ui_event::pointer::TOUCH == uievt.pointer_type) + { + m_pointer_action = pointer_action::SCROLL_DRAG; + m_base_pointer = std::make_pair(x, y); + m_last_pointer = m_base_pointer; + m_scroll_base = m_top_field; + return std::make_tuple(IPT_INVALID, true, false); + } + } + } + return std::make_tuple(IPT_INVALID, false, false); + } + + // handle in-progress actions + switch (m_pointer_action) + { + case pointer_action::NONE: + break; + + case pointer_action::SCROLL_UP: + case pointer_action::SCROLL_DOWN: + { + // check for re-entry + bool redraw(false); + float const linetop(m_box_top + tb_border() + ((pointer_action::SCROLL_DOWN == m_pointer_action) ? (float(m_visible_fields - 1) * line_height()) : 0.0F)); + float const linebottom(linetop + line_height()); + auto const [x, y] = pointer_location(); + bool const reentered(reentered_rect(m_last_pointer.first, m_last_pointer.second, x, y, m_box_left + lr_border(), linetop, m_box_right - lr_border(), linebottom)); + if (reentered) + { + auto const now(std::chrono::steady_clock::now()); + if (scroll_if_expired(now)) + { + redraw = true; + m_scroll_repeat = now + std::chrono::milliseconds(100); + } + } + m_last_pointer = std::make_pair(x, y); + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, redraw); + } + break; + + case pointer_action::SCROLL_DRAG: + { + bool const scrolled(update_scroll_drag(uievt)); + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, scrolled); + } + + case pointer_action::CHECK_TOGGLE_MENU: + if ((ui_event::pointer::TOUCH == uievt.pointer_type) && (0 > uievt.pointer_clicks)) + { + // converted to hold/drag - treat as scroll if it's touch + m_pointer_action = pointer_action::SCROLL_DRAG; + m_last_pointer = m_base_pointer; + m_scroll_base = m_top_field; + bool const scrolled(update_scroll_drag(uievt)); + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, scrolled); + } + else if (uievt.pointer_released & 0x01) + { + // primary button released - simulate the on-screen display key if it wasn't converted to a hold/drag + return std::make_tuple((2 == uievt.pointer_clicks) ? IPT_UI_ON_SCREEN_DISPLAY : IPT_INVALID, false, false); + } + else if ((2 != uievt.pointer_clicks) || (uievt.pointer_buttons & ~u32(0x01))) + { + // treat converting to a hold/drag or pressing another button as cancelling the action + return std::make_tuple(IPT_INVALID, false, false); + } + return std::make_tuple(IPT_INVALID, true, false); + } + return std::make_tuple(IPT_INVALID, false, false); +} + + void menu_analog::menu_activated() { // scripts could have changed something in the mean time m_item_data.clear(); m_field_data.clear(); reset(reset_options::REMEMBER_POSITION); + + m_box_left = m_box_top = 1.0F; + m_box_right = m_box_bottom = 0.0F; + m_pointer_action = pointer_action::NONE; + m_arrow_clicked_first = false; } bool menu_analog::handle(event const *ev) { + // deal with repeating scroll arrows + bool scrolled(false); + if ((pointer_action::SCROLL_UP == m_pointer_action) || (pointer_action::SCROLL_DOWN == m_pointer_action)) + { + float const linetop(m_box_top + tb_border() + ((pointer_action::SCROLL_DOWN == m_pointer_action) ? (float(m_visible_fields - 1) * line_height()) : 0.0F)); + float const linebottom(linetop + line_height()); + if (pointer_in_rect(m_box_left + lr_border(), linetop, m_box_right - lr_border(), linebottom)) + { + while (scroll_if_expired(std::chrono::steady_clock::now())) + { + scrolled = true; + m_scroll_repeat += std::chrono::milliseconds(100); + } + } + } + if (!ev) { - return false; + return scrolled; } else if (IPT_UI_ON_SCREEN_DISPLAY == ev->iptkey) { m_hide_menu = !m_hide_menu; + + m_box_left = m_box_top = 1.0F; + m_box_right = m_box_bottom = 0.0F; + m_pointer_action = pointer_action::NONE; + m_arrow_clicked_first = false; + set_process_flags(PROCESS_LR_REPEAT | (m_hide_menu ? (PROCESS_CUSTOM_NAV | PROCESS_CUSTOM_ONLY) : 0)); return true; } @@ -254,26 +434,53 @@ bool menu_analog::handle(event const *ev) ui().get_general_input_setting(IPT_UI_PREV_GROUP), ui().get_general_input_setting(IPT_UI_NEXT_GROUP), ui().get_general_input_setting(IPT_UI_BACK))); - return false; } else if (m_hide_menu) { switch (ev->iptkey) { case IPT_UI_UP: - --m_top_field; - return true; + if (m_top_field) + { + --m_top_field; + return true; + } + break; case IPT_UI_DOWN: - ++m_top_field; - return true; + if ((m_top_field + m_visible_fields) < m_field_data.size()) + { + ++m_top_field; + return true; + } + break; + case IPT_UI_PAGE_UP: + if (m_visible_fields) + { + m_top_field -= std::min(m_visible_fields - 3, m_top_field); + return true; + } + break; + case IPT_UI_PAGE_DOWN: + if ((m_top_field + m_visible_fields) < m_field_data.size()) + { + m_top_field = std::min(m_top_field + m_visible_fields - 3, m_field_data.size() - m_visible_fields); + return true; + } + break; case IPT_UI_HOME: - m_top_field = 0; - return true; + if (m_top_field) + { + m_top_field = 0; + return true; + } + break; case IPT_UI_END: - m_top_field = m_field_data.size(); - return true; - default: - return false; + if ((m_top_field + m_visible_fields) < m_field_data.size()) + { + m_top_field = m_field_data.size() - m_visible_fields; + return true; + } + break; } } else if (ev->itemref) @@ -384,15 +591,9 @@ bool menu_analog::handle(event const *ev) ev->item->set_flags((data.cur <= data.min) ? FLAG_RIGHT_ARROW : (data.cur >= data.max) ? FLAG_LEFT_ARROW : FLAG_LEFT_ARROW | FLAG_RIGHT_ARROW); return true; } - else - { - return false; - } - } - else - { - return false; } + + return scrolled; } @@ -466,7 +667,7 @@ void menu_analog::populate() item_append(menu_item_type::SEPARATOR); // space for live display - set_custom_space(0.0f, (line_height() * m_visible_fields) + (tb_border() * 3.0f)); + set_custom_space(0.0F, (line_height() * m_bottom_fields) + (tb_border() * 3.0F)); } @@ -518,10 +719,72 @@ void menu_analog::find_fields() } // restrict live display to 40% height plus borders - if ((line_height() * m_field_data.size()) > 0.4f) - m_visible_fields = unsigned(0.4f / line_height()); + if ((line_height() * m_field_data.size()) > 0.4F) + m_bottom_fields = unsigned(0.4F / line_height()); + else + m_bottom_fields = m_field_data.size(); +} + + +bool menu_analog::scroll_if_expired(std::chrono::steady_clock::time_point now) +{ + if (now < m_scroll_repeat) + return false; + + if (pointer_action::SCROLL_DOWN == m_pointer_action) + { + if ((m_top_field + m_visible_fields) < m_field_data.size()) + ++m_top_field; + if ((m_top_field + m_visible_fields) == m_field_data.size()) + m_pointer_action = pointer_action::NONE; + } else - m_visible_fields = m_field_data.size(); + { + if (0 < m_top_field) + --m_top_field; + if (!m_top_field) + m_pointer_action = pointer_action::NONE; + } + return true; +} + + +bool menu_analog::update_scroll_drag(ui_event const &uievt) +{ + // set thresholds depending on the direction for hysteresis + float const y(pointer_location().second); + float const base(m_base_pointer.second + (line_height() * ((y > m_last_pointer.second) ? -0.3F : 0.3F))); + auto const target(int((base - y) / line_height())); + m_last_pointer.second = base + (float(target) * line_height()); + + // scroll if it moved + int newtop(std::clamp(m_scroll_base + target, 0, m_field_data.size() - m_visible_fields)); + if (!m_hide_menu && (newtop != m_top_field)) + { + // if the menu is visible, keep the highlighted field on-screen + void *const selectedref(get_selection_ref()); + ioport_field *const selfield(selectedref ? &reinterpret_cast(selectedref)->field.get() : nullptr); + if (selfield) + { + auto const found( + std::find_if( + m_field_data.begin(), + m_field_data.end(), + [selfield] (field_data const &d) { return &d.field.get() == selfield; })); + if (m_field_data.end() != found) + { + auto const i(std::distance(m_field_data.begin(), found)); + newtop = std::clamp(newtop, i + 1 - m_visible_fields, i); + } + } + } + bool const scrolled(newtop != m_top_field); + m_top_field = newtop; + + // catch the end of the gesture + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + return scrolled; } diff --git a/src/frontend/mame/ui/analogipt.h b/src/frontend/mame/ui/analogipt.h index d60aafd6cc47c..ee59954911c5b 100644 --- a/src/frontend/mame/ui/analogipt.h +++ b/src/frontend/mame/ui/analogipt.h @@ -14,7 +14,10 @@ #include "ui/menu.h" +#include #include +#include +#include #include @@ -28,10 +31,20 @@ class menu_analog : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual std::tuple custom_pointer_updated(bool changed, ui_event const &uievt) override; virtual void menu_activated() override; private: + enum class pointer_action + { + NONE, + SCROLL_UP, + SCROLL_DOWN, + SCROLL_DRAG, + CHECK_TOGGLE_MENU + }; + enum { ANALOG_ITEM_KEYSPEED = 0, @@ -71,15 +84,30 @@ class menu_analog : public menu virtual bool handle(event const *ev) override; void find_fields(); + bool scroll_if_expired(std::chrono::steady_clock::time_point now); + bool update_scroll_drag(ui_event const &uievt); static std::string item_text(int type, int value); item_data_vector m_item_data; field_data_vector m_field_data; std::string m_prompt; - unsigned m_visible_fields; + unsigned m_bottom_fields; + int m_visible_fields; int m_top_field; bool m_hide_menu; + + float m_box_left; + float m_box_top; + float m_box_right; + float m_box_bottom; + + pointer_action m_pointer_action; + std::chrono::steady_clock::time_point m_scroll_repeat; + std::pair m_base_pointer; + std::pair m_last_pointer; + int m_scroll_base; + bool m_arrow_clicked_first; }; } // namespace ui diff --git a/src/frontend/mame/ui/auditmenu.cpp b/src/frontend/mame/ui/auditmenu.cpp index d225535c4e770..180c3005b73b8 100644 --- a/src/frontend/mame/ui/auditmenu.cpp +++ b/src/frontend/mame/ui/auditmenu.cpp @@ -83,7 +83,7 @@ void menu_audit::recompute_metrics(uint32_t width, uint32_t height, float aspect } -void menu_audit::custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) +void menu_audit::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) { switch (m_phase) { diff --git a/src/frontend/mame/ui/auditmenu.h b/src/frontend/mame/ui/auditmenu.h index 5d71b63fd2fb3..3a1c236549dbd 100644 --- a/src/frontend/mame/ui/auditmenu.h +++ b/src/frontend/mame/ui/auditmenu.h @@ -30,7 +30,7 @@ class menu_audit : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual bool custom_ui_back() override; private: diff --git a/src/frontend/mame/ui/confswitch.cpp b/src/frontend/mame/ui/confswitch.cpp index 946062b9a1de5..f2f8a241d9860 100644 --- a/src/frontend/mame/ui/confswitch.cpp +++ b/src/frontend/mame/ui/confswitch.cpp @@ -11,6 +11,8 @@ #include "emu.h" #include "ui/confswitch.h" +#include "uiinput.h" + #include #include @@ -176,6 +178,13 @@ bool menu_confswitch::handle(event const *ev) if (!ev || !ev->itemref) return false; + if (IPT_CUSTOM == ev->iptkey) + { + // clicked a switch + reset(reset_options::REMEMBER_REF); + return true; + } + if (uintptr_t(ev->itemref) == 1U) { // reset @@ -339,16 +348,15 @@ void menu_settings_dip_switches::recompute_metrics(uint32_t width, uint32_t heig } -void menu_settings_dip_switches::custom_render(void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) +void menu_settings_dip_switches::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) { // catch if no DIP locations have to be drawn if (!m_visible_switch_groups) return; // calculate optimal width - float const aspect(machine().render().ui_aspect(&container())); float const maxwidth(1.0f - (lr_border() * 2.0f)); - m_single_width = (line_height() * SINGLE_TOGGLE_SWITCH_FIELD_WIDTH * aspect); + m_single_width = (line_height() * SINGLE_TOGGLE_SWITCH_FIELD_WIDTH * x_aspect()); float width(0.0f); unsigned maxswitches(0U); for (switch_group_descriptor const &group : switch_groups()) @@ -358,7 +366,7 @@ void menu_settings_dip_switches::custom_render(void *selectedref, float top, flo maxswitches = (std::max)(group.switch_count(), maxswitches); float const namewidth(get_string_width(group.name)); float const switchwidth(m_single_width * maxswitches); - width = (std::min)((std::max)(namewidth + switchwidth + (line_height() * aspect), width), maxwidth); + width = (std::min)((std::max)(namewidth + switchwidth + (line_height() * x_aspect()), width), maxwidth); } } @@ -370,12 +378,12 @@ void menu_settings_dip_switches::custom_render(void *selectedref, float top, flo // calculate centred layout float const nameleft((1.0f - width) * 0.5f); float const switchleft(nameleft + width - (m_single_width * maxswitches)); - float const namewidth(width - (m_single_width * maxswitches) - (line_height() * aspect)); + float const namewidth(width - (m_single_width * maxswitches) - (line_height() * x_aspect())); // iterate over switch groups ioport_field *const field((uintptr_t(selectedref) != 1U) ? reinterpret_cast(selectedref) : nullptr); float const nubheight(line_height() * SINGLE_TOGGLE_SWITCH_HEIGHT); - m_nub_width = line_height() * SINGLE_TOGGLE_SWITCH_WIDTH * aspect; + m_nub_width = line_height() * SINGLE_TOGGLE_SWITCH_WIDTH * x_aspect(); float const ygap(line_height() * ((DIP_SWITCH_HEIGHT * 0.5f) - SINGLE_TOGGLE_SWITCH_HEIGHT) * 0.5f); float const xgap((m_single_width + (UI_LINE_WIDTH * 0.5f) - m_nub_width) * 0.5f); m_first_nub = switchleft + xgap; @@ -449,13 +457,16 @@ void menu_settings_dip_switches::custom_render(void *selectedref, float top, flo } -bool menu_settings_dip_switches::custom_mouse_down() +std::tuple menu_settings_dip_switches::custom_pointer_updated(bool changed, ui_event const &uievt) { - if (!m_visible_switch_groups || (get_mouse_x() < m_first_nub)) - return false; + if (!m_visible_switch_groups || !(uievt.pointer_pressed & 0x01) || (uievt.pointer_buttons & ~u32(0x01))) + return std::make_tuple(IPT_INVALID, false, false); + + auto const [cx, y] = pointer_location(); + if (cx < m_first_nub) + return std::make_tuple(IPT_INVALID, false, false); - float const x(get_mouse_x() - m_first_nub); - float const y(get_mouse_y()); + float const x(cx - m_first_nub); for (unsigned n = 0U, line = 0U; (switch_groups().size() > n) && (m_visible_switch_groups > line); ++n) { switch_group_descriptor const &group(switch_groups()[n]); @@ -476,8 +487,7 @@ bool menu_settings_dip_switches::custom_mouse_down() group.toggles[i].field->get_user_settings(settings); settings.value ^= group.toggles[i].mask; group.toggles[i].field->set_user_settings(settings); - reset(reset_options::REMEMBER_REF); - return true; + return std::make_tuple(IPT_CUSTOM, true, true); } } } @@ -485,7 +495,7 @@ bool menu_settings_dip_switches::custom_mouse_down() } } - return false; + return std::make_tuple(IPT_INVALID, false, false); } diff --git a/src/frontend/mame/ui/confswitch.h b/src/frontend/mame/ui/confswitch.h index 2d025f7dfc83b..7f00783b0f176 100644 --- a/src/frontend/mame/ui/confswitch.h +++ b/src/frontend/mame/ui/confswitch.h @@ -83,8 +83,8 @@ class menu_settings_dip_switches : public menu_confswitch protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; - virtual bool custom_mouse_down() override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual std::tuple custom_pointer_updated(bool changed, ui_event const &uievt) override; private: virtual void populate() override; diff --git a/src/frontend/mame/ui/custui.cpp b/src/frontend/mame/ui/custui.cpp index 1db4a64ba1328..9cfd7284d9bdc 100644 --- a/src/frontend/mame/ui/custui.cpp +++ b/src/frontend/mame/ui/custui.cpp @@ -548,7 +548,7 @@ void menu_font_ui::recompute_metrics(uint32_t width, uint32_t height, float aspe // perform our special rendering //------------------------------------------------- -void menu_font_ui::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_font_ui::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { if (uintptr_t(selectedref) == INFOS_SIZE) { @@ -670,7 +670,7 @@ void menu_colors_ui::recompute_metrics(uint32_t width, uint32_t height, float as // perform our special rendering //------------------------------------------------- -void menu_colors_ui::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_colors_ui::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { // get the text for 'UI Select' std::string const bottomtext[] = { util::string_format(_("Double-click or press %1$s to change color"), ui().get_general_input_setting(IPT_UI_SELECT)) }; @@ -963,7 +963,7 @@ void menu_rgb_ui::recompute_metrics(uint32_t width, uint32_t height, float aspec // perform our special rendering //------------------------------------------------- -void menu_rgb_ui::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_rgb_ui::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { float maxwidth = origx2 - origx1; diff --git a/src/frontend/mame/ui/custui.h b/src/frontend/mame/ui/custui.h index 981546c64e34d..be9df136f7e27 100644 --- a/src/frontend/mame/ui/custui.h +++ b/src/frontend/mame/ui/custui.h @@ -60,7 +60,7 @@ class menu_font_ui : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual void menu_dismissed() override; private: @@ -96,7 +96,7 @@ class menu_colors_ui : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual void menu_dismissed() override; private: @@ -145,7 +145,7 @@ class menu_rgb_ui : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; private: enum diff --git a/src/frontend/mame/ui/datmenu.cpp b/src/frontend/mame/ui/datmenu.cpp index a4f919a7f624e..492bdd38e4190 100644 --- a/src/frontend/mame/ui/datmenu.cpp +++ b/src/frontend/mame/ui/datmenu.cpp @@ -13,7 +13,6 @@ #include "ui/systemlist.h" #include "ui/ui.h" -#include "ui/utils.h" #include "luaengine.h" #include "mame.h" @@ -31,7 +30,8 @@ namespace ui { //------------------------------------------------- -// ctor / dtor +// construct for currently running or specified +// system //------------------------------------------------- menu_dats_view::menu_dats_view(mame_ui_manager &mui, render_container &container, const ui_system_info *system) @@ -39,8 +39,9 @@ menu_dats_view::menu_dats_view(mame_ui_manager &mui, render_container &container , m_system(!system ? &system_list::instance().systems()[driver_list::find(mui.machine().system().name)] : system) , m_swinfo(nullptr) , m_issoft(false) - , m_actual(0) - + , m_current_tab(0) + , m_tab_line(1.0F, 0.0F) + , m_clicked_tab(-1) { set_process_flags(PROCESS_LR_ALWAYS | PROCESS_CUSTOM_NAV); for (device_image_interface& image : image_interface_enumerator(mui.machine().root_device())) @@ -54,15 +55,17 @@ menu_dats_view::menu_dats_view(mame_ui_manager &mui, render_container &container break; } } + std::vector lua_list; if (mame_machine_manager::instance()->lua()->call_plugin("data_list", system ? system->driver->name : "", lua_list)) { int count = 0; + m_items_list.reserve(lua_list.size()); for (std::string& item : lua_list) { std::string version; mame_machine_manager::instance()->lua()->call_plugin("data_version", count, version); - m_items_list.emplace_back(item.c_str(), count, std::move(version)); + m_items_list.emplace_back(std::move(item), count, std::move(version)); count++; } } @@ -77,25 +80,33 @@ menu_dats_view::menu_dats_view(mame_ui_manager &mui, render_container &container , m_system(nullptr) , m_swinfo(&swinfo) , m_issoft(true) - , m_actual(0) + , m_current_tab(0) , m_list(swinfo.listname) , m_short(swinfo.shortname) , m_long(swinfo.longname) , m_parent(swinfo.parentname) - + , m_tab_line(1.0F, 0.0F) + , m_clicked_tab(-1) { set_process_flags(PROCESS_LR_ALWAYS | PROCESS_CUSTOM_NAV); - if (!swinfo.infotext.empty()) - m_items_list.emplace_back(_("Software List Info"), 0, ""); + std::vector lua_list; - if (mame_machine_manager::instance()->lua()->call_plugin("data_list", std::string(m_short).append(1, ',').append(m_list).c_str(), lua_list)) + bool const retrieved(mame_machine_manager::instance()->lua()->call_plugin("data_list", std::string(m_short).append(1, ',').append(m_list).c_str(), lua_list)); + + if (!swinfo.infotext.empty() || retrieved) + m_items_list.reserve((!swinfo.infotext.empty() ? 1 : 0) + (retrieved ? lua_list.size() : 0)); + + if (!swinfo.infotext.empty()) + m_items_list.emplace_back(_("Software List Info"), -1, ""); + + if (retrieved) { - int count = 1; + int count = 0; for (std::string &item : lua_list) { std::string version; - mame_machine_manager::instance()->lua()->call_plugin("data_version", count - 1, version); - m_items_list.emplace_back(item.c_str(), count, std::move(version)); + mame_machine_manager::instance()->lua()->call_plugin("data_version", count, version); + m_items_list.emplace_back(std::move(item), count, std::move(version)); count++; } } @@ -169,34 +180,36 @@ void menu_dats_view::add_info_text(text_layout &layout, std::string_view text, r bool menu_dats_view::handle(event const *ev) { - if (!ev) - return false; - - switch (ev->iptkey) + if (ev) { - case IPT_UI_LEFT: - if (m_actual > 0) + // don't bother with parent event handling if we need to redraw anyway + switch (ev->iptkey) { - m_actual--; - reset_layout(); - return true; - } - break; + case IPT_UI_LEFT: + if (m_current_tab > 0) + { + m_current_tab--; + m_tab_line = std::make_pair(1.0F, 0.0F); + m_clicked_tab = -1; + reset_layout(); + return true; + } + break; - case IPT_UI_RIGHT: - if ((m_actual + 1) < m_items_list.size()) - { - m_actual++; - reset_layout(); - return true; + case IPT_UI_RIGHT: + if ((m_current_tab + 1) < m_items_list.size()) + { + m_current_tab++; + m_tab_line = std::make_pair(1.0F, 0.0F); + m_clicked_tab = -1; + reset_layout(); + return true; + } + break; } - break; - - default: - return handle_key(ev->iptkey); } - return false; + return menu_textbox::handle(ev); } //------------------------------------------------- @@ -215,6 +228,9 @@ void menu_dats_view::recompute_metrics(uint32_t width, uint32_t height, float as { menu_textbox::recompute_metrics(width, height, aspect); + m_tab_line = std::make_pair(1.0F, 0.0F); + m_clicked_tab = -1; + set_custom_space(2.0F * line_height() + 4.0F * tb_border(), line_height() + 3.0F * tb_border()); } @@ -222,103 +238,112 @@ void menu_dats_view::recompute_metrics(uint32_t width, uint32_t height, float as // perform our special rendering //------------------------------------------------- -void menu_dats_view::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_dats_view::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { - float maxwidth = origx2 - origx1; - float width; + float maxwidth; std::string_view const driver = m_issoft ? m_swinfo->longname : m_system->description; - width = get_string_width(driver); - width += 2 * lr_border(); - maxwidth = std::max(maxwidth, width); + maxwidth = std::max(origx2 - origx1, get_string_width(driver) + (2.0F * lr_border())); // compute our bounds - float x1 = 0.5F - 0.5F * maxwidth; + float x1 = 0.5F - (0.5F * maxwidth); float x2 = x1 + maxwidth; float y1 = origy1 - top; - float y2 = origy1 - 2.0F * tb_border() - line_height(); + float y2 = y1 + (2.0F * tb_border()) + line_height(); // draw a box ui().draw_outlined_box(container(), x1, y1, x2, y2, UI_GREEN_COLOR); - // take off the borders - x1 += lr_border(); - x2 -= lr_border(); - y1 += tb_border(); - draw_text_normal( driver, - x1, y1, x2 - x1, + x1 + lr_border(), y1 + tb_border(), x2 - x1 - (2.0F * lr_border()), text_layout::text_justify::CENTER, ui::text_layout::word_wrapping::NEVER, ui().colors().text_color()); - maxwidth = 0; - for (auto const &elem : m_items_list) - { - width = get_string_width(elem.label); - maxwidth += width; - } - - float space = (1.0F - maxwidth) / (m_items_list.size() * 2); + // draw a box + ui().draw_outlined_box(container(), x1, origy1 - line_height() - tb_border(), x2, origy1, ui().colors().background_color()); - // compute our bounds - x1 -= lr_border(); - x2 += lr_border(); - y1 = y2 + tb_border(); - y2 += line_height() + 2.0F * tb_border(); + // calculate geometry of tab line + if (m_tab_line.first >= m_tab_line.second) + { + m_tab_line = std::make_pair(origy1 - line_height(), origy1); - // draw a box - ui().draw_outlined_box(container(), x1, y1, x2, y2, ui().colors().background_color()); + // FIXME: deal with overflow when there are a lot of tabs + float total(0.0F); + for (auto const &elem : m_items_list) + total += get_string_width(elem.label); + float const space((1.0F - total) / (m_items_list.size() * 2.0F)); - // take off the borders - y1 += tb_border(); + float left(x1 + (space * 0.5F)); + for (auto &elem : m_items_list) + { + float const width(get_string_width(elem.label)); + elem.bounds = std::make_pair(left, left + width + space); + left += width + (space * 2.0F); + } + } // draw the text within it - int x = 0; - for (auto const &elem : m_items_list) + for (int i = 0; m_items_list.size() > i; ++i) { - x1 += space; - if (mouse_in_rect(x1 - (space / 2), y1, x1 + width + (space / 2), y2)) - set_hover(HOVER_INFO_TEXT + 1 + x); + auto &elem(m_items_list[i]); - rgb_t const fcolor = (m_actual == x) ? rgb_t(0xff, 0xff, 0xff, 0x00) : ui().colors().text_color(); - rgb_t const bcolor = (m_actual == x) ? rgb_t(0xff, 0xff, 0xff, 0xff) : ui().colors().text_bg_color(); - width = get_string_width(elem.label); - - if (bcolor != ui().colors().text_bg_color()) + rgb_t fgcolor; + rgb_t bgcolor; + if (i == m_current_tab) { + fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); + bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); ui().draw_textured_box( container(), - x1 - (space / 2), y1, x1 + width + (space / 2), y2, - bcolor, rgb_t(255, 43, 43, 43), + elem.bounds.first, m_tab_line.first, elem.bounds.second, m_tab_line.second, + bgcolor, rgb_t(255, 43, 43, 43), hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); } + else + { + bool const hovered(pointer_in_rect(elem.bounds.first, m_tab_line.first, elem.bounds.second, m_tab_line.second)); + if ((i == m_clicked_tab) && hovered) + { + fgcolor = ui().colors().selected_color(); + bgcolor = ui().colors().selected_bg_color(); + highlight(elem.bounds.first, m_tab_line.first, elem.bounds.second, m_tab_line.second, bgcolor); + } + else if ((i == m_clicked_tab) || (hovered && pointer_idle())) + { + fgcolor = ui().colors().mouseover_color(); + bgcolor = ui().colors().mouseover_bg_color(); + highlight(elem.bounds.first, m_tab_line.first, elem.bounds.second, m_tab_line.second, bgcolor); + } + else + { + fgcolor = ui().colors().text_color(); + bgcolor = ui().colors().text_bg_color(); + } + } ui().draw_text_full( container(), elem.label, - x1, y1, 1.0F, - text_layout::text_justify::LEFT, text_layout::word_wrapping::NEVER, - mame_ui_manager::NORMAL, fcolor, bcolor, - &width, nullptr, + elem.bounds.first, m_tab_line.first, elem.bounds.second - elem.bounds.first, + text_layout::text_justify::CENTER, text_layout::word_wrapping::NEVER, + mame_ui_manager::NORMAL, fgcolor, bgcolor, + nullptr, nullptr, line_height()); - x1 += width + space; - ++x; } // bottom if (!m_items_list.empty()) { - std::string const revision(util::string_format(_("Revision: %1$s"), m_items_list[m_actual].revision)); - width = get_text_width( + std::string const revision(util::string_format(_("Revision: %1$s"), m_items_list[m_current_tab].revision)); + float const width(get_text_width( revision, 0.0F, 0.0F, 1.0F, - text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE); - width += 2 * lr_border(); - maxwidth = std::max(origx2 - origx1, width); + text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE)); + maxwidth = std::max(origx2 - origx1, width + (2.0F * lr_border())); // compute our bounds - x1 = 0.5F - 0.5F * maxwidth; + x1 = 0.5F - (0.5F * maxwidth); x2 = x1 + maxwidth; y1 = origy2 + tb_border(); y2 = origy2 + bottom; @@ -326,39 +351,65 @@ void menu_dats_view::custom_render(void *selectedref, float top, float bottom, f // draw a box ui().draw_outlined_box(container(), x1, y1, x2, y2, UI_GREEN_COLOR); - // take off the borders - x1 += lr_border(); - x2 -= lr_border(); - y1 += tb_border(); - // draw the text within it draw_text_normal( revision, - x1, y1, x2 - x1, + x1 + lr_border(), y1 + tb_border(), x2 - x1 - (2.0F * lr_border()), text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE, ui().colors().text_color()); } } //------------------------------------------------- -// custom mouse click handling +// custom pointer handling //------------------------------------------------- -bool menu_dats_view::custom_mouse_down() +std::tuple menu_dats_view::custom_pointer_updated(bool changed, ui_event const &uievt) { - if ((hover() > HOVER_INFO_TEXT) && ((hover() - HOVER_INFO_TEXT) <= m_items_list.size())) + if (0 <= m_clicked_tab) { - if ((hover() - HOVER_INFO_TEXT - 1) != m_actual) + if ((ui_event::type::POINTER_ABORT != uievt.event_type) && uievt.pointer_released & 0x01) + { + // primary button released - take action if still on the tab + bool const hit(pointer_in_rect( + m_items_list[m_clicked_tab].bounds.first, m_tab_line.first, + m_items_list[m_clicked_tab].bounds.second, m_tab_line.second)); + if (hit && (m_current_tab != m_clicked_tab)) + { + m_current_tab = m_clicked_tab; + m_tab_line = std::make_pair(1.0F, 0.0F); + reset_layout(); + } + m_clicked_tab = -1; + return std::make_tuple(hit ? IPT_CUSTOM : IPT_INVALID, false, true); + } + else if ((ui_event::type::POINTER_ABORT == uievt.event_type) || (uievt.pointer_buttons & ~u32(0x01))) { - m_actual = hover() - HOVER_INFO_TEXT - 1; - reset_layout(); + // treat pressing another button as cancellation + m_clicked_tab = -1; + return std::make_tuple(IPT_INVALID, false, true); } - return true; + return std::make_tuple(IPT_INVALID, true, false); } - else + else if (pointer_idle() && (uievt.pointer_pressed & 0x01) && !(uievt.pointer_buttons & ~u32(0x01))) { - return false; + // primary click - see if it's over a tab + auto const [x, y] = pointer_location(); + if ((y >= m_tab_line.first) && (y < m_tab_line.second)) + { + for (int i = 0; m_items_list.size() > i; ++i) + { + if ((x >= m_items_list[i].bounds.first) && (x < m_items_list[i].bounds.second)) + { + m_clicked_tab = i; + return std::make_tuple(IPT_INVALID, true, true); + } + } + } } + + // let the base class have a look + return menu_textbox::custom_pointer_updated(changed, uievt); } //------------------------------------------------- @@ -369,13 +420,16 @@ void menu_dats_view::populate_text(std::optional &layout, float &wi { if (!layout || (layout->width() != width)) { + m_tab_line = std::make_pair(1.0F, 0.0F); + m_clicked_tab = -1; + std::string buffer; if (!m_items_list.empty()) { - if (m_issoft) - get_data_sw(buffer); + if (0 > m_items_list[m_current_tab].option) + buffer = m_swinfo->infotext; else - get_data(buffer); + mame_machine_manager::instance()->lua()->call_plugin("data", m_items_list[m_current_tab].option, buffer); } layout.emplace(create_layout(width)); add_info_text(*layout, buffer, ui().colors().text_color()); @@ -383,21 +437,4 @@ void menu_dats_view::populate_text(std::optional &layout, float &wi } } -//------------------------------------------------- -// load data from DATs -//------------------------------------------------- - -void menu_dats_view::get_data(std::string &buffer) -{ - mame_machine_manager::instance()->lua()->call_plugin("data", m_items_list[m_actual].option, buffer); -} - -void menu_dats_view::get_data_sw(std::string &buffer) -{ - if (m_items_list[m_actual].option == 0) - buffer = m_swinfo->infotext; - else - mame_machine_manager::instance()->lua()->call_plugin("data", m_items_list[m_actual].option - 1, buffer); -} - } // namespace ui diff --git a/src/frontend/mame/ui/datmenu.h b/src/frontend/mame/ui/datmenu.h index 5c255c5fbff8c..e8e7cea2887e9 100644 --- a/src/frontend/mame/ui/datmenu.h +++ b/src/frontend/mame/ui/datmenu.h @@ -44,33 +44,35 @@ class menu_dats_view : public menu_textbox protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; - virtual bool custom_mouse_down() override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual std::tuple custom_pointer_updated(bool changed, ui_event const &uievt) override; virtual void populate_text(std::optional &layout, float &width, int &lines) override; private: struct list_items { - list_items(std::string &&l, int i, std::string &&rev) : label(std::move(l)), option(i), revision(std::move(rev)) { } + list_items(std::string &&l, int i, std::string &&rev) : label(std::move(l)), revision(std::move(rev)), option(i), bounds(1.0F, 0.0F) { } std::string label; - int option; std::string revision; + int option; + + std::pair bounds; }; virtual void populate() override; virtual bool handle(event const *ev) override; - void get_data(std::string &buffer); - void get_data_sw(std::string &buffer); - ui_system_info const *const m_system; ui_software_info const *const m_swinfo; bool const m_issoft; - int m_actual; + int m_current_tab; std::string m_list, m_short, m_long, m_parent; std::vector m_items_list; + + std::pair m_tab_line; + int m_clicked_tab; }; } // namespace ui diff --git a/src/frontend/mame/ui/devopt.cpp b/src/frontend/mame/ui/devopt.cpp index 2dd7a758a0f7e..8d841c7d131a4 100644 --- a/src/frontend/mame/ui/devopt.cpp +++ b/src/frontend/mame/ui/devopt.cpp @@ -368,12 +368,4 @@ void menu_device_config::populate() { } -bool menu_device_config::handle(event const *ev) -{ - if (ev) - return handle_key(ev->iptkey); - else - return false; -} - } // namespace ui diff --git a/src/frontend/mame/ui/devopt.h b/src/frontend/mame/ui/devopt.h index 67500c81a41d2..2e67cd4524f04 100644 --- a/src/frontend/mame/ui/devopt.h +++ b/src/frontend/mame/ui/devopt.h @@ -29,7 +29,6 @@ class menu_device_config : public menu_textbox private: virtual void populate() override; - virtual bool handle(event const *ev) override; device_slot_interface::slot_option const *const m_option; bool const m_mounted; diff --git a/src/frontend/mame/ui/dirmenu.cpp b/src/frontend/mame/ui/dirmenu.cpp index bd4ddb0cfddca..083dfbeba79cc 100644 --- a/src/frontend/mame/ui/dirmenu.cpp +++ b/src/frontend/mame/ui/dirmenu.cpp @@ -165,7 +165,7 @@ class menu_add_change_folder : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual bool custom_ui_back() override { return !m_search.empty(); } @@ -356,7 +356,7 @@ void menu_add_change_folder::recompute_metrics(uint32_t width, uint32_t height, // perform our special rendering //------------------------------------------------- -void menu_add_change_folder::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_add_change_folder::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { std::string const toptext[] = { util::string_format( @@ -447,7 +447,7 @@ class menu_display_actual : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; private: enum @@ -557,7 +557,7 @@ void menu_display_actual::recompute_metrics(uint32_t width, uint32_t height, flo // perform our special rendering //------------------------------------------------- -void menu_display_actual::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_display_actual::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { float const maxwidth(draw_text_box( std::begin(m_folders), std::end(m_folders), diff --git a/src/frontend/mame/ui/filecreate.cpp b/src/frontend/mame/ui/filecreate.cpp index 75e7870256747..828e59cbb74f7 100644 --- a/src/frontend/mame/ui/filecreate.cpp +++ b/src/frontend/mame/ui/filecreate.cpp @@ -153,7 +153,7 @@ void menu_file_create::recompute_metrics(uint32_t width, uint32_t height, float // custom_render - perform our special rendering //------------------------------------------------- -void menu_file_create::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_file_create::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { extra_text_render(top, bottom, origx1, origy1, origx2, origy2, m_current_directory, diff --git a/src/frontend/mame/ui/filecreate.h b/src/frontend/mame/ui/filecreate.h index 9537003a6f7d4..a5f1ab92857b1 100644 --- a/src/frontend/mame/ui/filecreate.h +++ b/src/frontend/mame/ui/filecreate.h @@ -48,7 +48,7 @@ class menu_file_create : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual bool custom_ui_back() override; private: diff --git a/src/frontend/mame/ui/filemngr.cpp b/src/frontend/mame/ui/filemngr.cpp index 92b68ccee1db2..f9a99474a1572 100644 --- a/src/frontend/mame/ui/filemngr.cpp +++ b/src/frontend/mame/ui/filemngr.cpp @@ -74,7 +74,7 @@ void menu_file_manager::recompute_metrics(uint32_t width, uint32_t height, float // custom_render - perform our special rendering //------------------------------------------------- -void menu_file_manager::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_file_manager::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { // access the path std::string_view path = m_selected_device && m_selected_device->exists() ? m_selected_device->filename() : std::string_view(); diff --git a/src/frontend/mame/ui/filemngr.h b/src/frontend/mame/ui/filemngr.h index bae4546201e2c..a8c68ceb21114 100644 --- a/src/frontend/mame/ui/filemngr.h +++ b/src/frontend/mame/ui/filemngr.h @@ -32,7 +32,7 @@ class menu_file_manager : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; private: virtual void populate() override; diff --git a/src/frontend/mame/ui/filesel.cpp b/src/frontend/mame/ui/filesel.cpp index 14d62c206b359..5f4dddc65fc60 100644 --- a/src/frontend/mame/ui/filesel.cpp +++ b/src/frontend/mame/ui/filesel.cpp @@ -19,6 +19,8 @@ #include "imagedev/floppy.h" +#include "uiinput.h" + #include "util/corestr.h" #include "util/zippath.h" @@ -48,15 +50,26 @@ namespace ui { // ctor //------------------------------------------------- -menu_file_selector::menu_file_selector(mame_ui_manager &mui, render_container &container, device_image_interface *image, std::string ¤t_directory, std::string ¤t_file, bool has_empty, bool has_softlist, bool has_create, menu_file_selector::result &result) +menu_file_selector::menu_file_selector( + mame_ui_manager &mui, + render_container &container, + device_image_interface *image, + std::string_view directory, + std::string_view file, + bool has_empty, + bool has_softlist, + bool has_create, + handler_function &&handler) : menu(mui, container) + , m_handler(std::move(handler)) , m_image(image) - , m_current_directory(current_directory) - , m_current_file(current_file) + , m_current_directory(directory) + , m_current_file(file) + , m_result(result::INVALID) , m_has_empty(has_empty) , m_has_softlist(has_softlist) , m_has_create(has_create) - , m_result(result) + , m_clicked_directory(std::string::npos, std::string::npos) { (void)m_image; set_process_flags(PROCESS_IGNOREPAUSE); @@ -69,6 +82,8 @@ menu_file_selector::menu_file_selector(mame_ui_manager &mui, render_container &c menu_file_selector::~menu_file_selector() { + if (m_handler) + m_handler(m_result, std::move(m_current_directory), std::move(m_current_file)); } @@ -80,7 +95,9 @@ void menu_file_selector::recompute_metrics(uint32_t width, uint32_t height, floa { menu::recompute_metrics(width, height, aspect); - // set up custom render proc + m_path_layout.reset(); + m_clicked_directory = std::make_pair(std::string::npos, std::string::npos); + set_custom_space(line_height() + 3.0F * tb_border(), 0.0F); } @@ -89,63 +106,131 @@ void menu_file_selector::recompute_metrics(uint32_t width, uint32_t height, floa // custom_render - perform our special rendering //------------------------------------------------- -void menu_file_selector::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_file_selector::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { // lay out extra text - auto layout = create_layout(); - layout.add_text(m_current_directory); + if (!m_path_layout) + { + m_path_layout.emplace(create_layout()); + m_path_layout->add_text(m_current_directory); + } + else + { + rgb_t const fgcolor = ui().colors().text_color(); + rgb_t const bgcolor = rgb_t::transparent(); + m_path_layout->restyle(0, m_current_directory.length(), &fgcolor, &bgcolor); + } // position this extra text - float x1, y1, x2, y2; - extra_text_position(origx1, origx2, origy1, top, layout, -1, x1, y1, x2, y2); + float x2, y2; + extra_text_position(origx1, origx2, origy1, top, *m_path_layout, -1, m_path_position.first, m_path_position.second, x2, y2); // draw a box - ui().draw_outlined_box(container(), x1, y1, x2, y2, ui().colors().background_color()); + ui().draw_outlined_box(container(), m_path_position.first, m_path_position.second, x2, y2, ui().colors().background_color()); // take off the borders - x1 += lr_border(); - y1 += tb_border(); + m_path_position.first += lr_border(); + m_path_position.second += tb_border(); - size_t hit_start = 0, hit_span = 0; - if (is_mouse_hit() - && layout.hit_test(get_mouse_x() - x1, get_mouse_y() - y1, hit_start, hit_span) - && m_current_directory.substr(hit_start, hit_span) != PATH_SEPARATOR) + if (m_clicked_directory.second > m_clicked_directory.first) { - // we're hovering over a directory! highlight it - auto target_dir_start = m_current_directory.rfind(PATH_SEPARATOR, hit_start) + 1; - auto target_dir_end = m_current_directory.find(PATH_SEPARATOR, hit_start + hit_span); - m_hover_directory = m_current_directory.substr(0, target_dir_end + strlen(PATH_SEPARATOR)); - - // highlight the text in question - rgb_t fgcolor = ui().colors().mouseover_color(); - rgb_t bgcolor = ui().colors().mouseover_bg_color(); - layout.restyle(target_dir_start, target_dir_end - target_dir_start, &fgcolor, &bgcolor); + // see if it's still over the clicked path component + auto const [x, y] = pointer_location(); + size_t start = 0, span = 0; + if (m_path_layout->hit_test(x - m_path_position.first, y - m_path_position.second, start, span)) + { + if ((start >= m_clicked_directory.first) && ((start + span) <= m_clicked_directory.second)) + { + rgb_t const fgcolor = ui().colors().selected_color(); + rgb_t const bgcolor = ui().colors().selected_bg_color(); + m_path_layout->restyle(m_clicked_directory.first, m_clicked_directory.second - m_clicked_directory.first, &fgcolor, &bgcolor); + } + } } - else + else if (pointer_idle()) { - // we are not hovering over anything - m_hover_directory.clear(); + // see if it's hovering over a path component + auto const [x, y] = pointer_location(); + auto const [target_dir_start, target_dir_end] = get_directory_range(x, y); + if (target_dir_end > target_dir_start) + { + rgb_t const fgcolor = ui().colors().mouseover_color(); + rgb_t const bgcolor = ui().colors().mouseover_bg_color(); + m_path_layout->restyle(target_dir_start, target_dir_end - target_dir_start, &fgcolor, &bgcolor); + } } // draw the text within it - layout.emit(container(), x1, y1); + m_path_layout->emit(container(), m_path_position.first, m_path_position.second); } //------------------------------------------------- -// custom_mouse_down - perform our special mouse down +// custom_pointer_updated - perform our special +// pointer handling //------------------------------------------------- -bool menu_file_selector::custom_mouse_down() +std::tuple menu_file_selector::custom_pointer_updated(bool changed, ui_event const &uievt) { - if (m_hover_directory.length() > 0) + // track pointer after clicking a path component + if (m_clicked_directory.second > m_clicked_directory.first) { - m_current_directory = m_hover_directory; - reset(reset_options::SELECT_FIRST); - return true; + if (ui_event::type::POINTER_ABORT == uievt.event_type) + { + // abort always cancels + m_clicked_directory = std::make_pair(std::string::npos, std::string::npos); + return std::make_tuple(IPT_INVALID, false, true); + } + else if (uievt.pointer_released & 0x01) + { + // releasing the primary button - check for dragging out + auto const [x, y] = pointer_location(); + size_t start = 0, span = 0; + if (m_path_layout->hit_test(x - m_path_position.first, y - m_path_position.second, start, span)) + { + // abuse IPT_CUSTOM to change to the clicked directory + if ((start >= m_clicked_directory.first) && ((start + span) <= m_clicked_directory.second)) + return std::make_tuple(IPT_CUSTOM, false, true); + } + m_clicked_directory = std::make_pair(std::string::npos, std::string::npos); + return std::make_tuple(IPT_INVALID, false, true); + } + else if (uievt.pointer_buttons & ~u32(1)) + { + // pressing more buttons cancels + m_clicked_directory = std::make_pair(std::string::npos, std::string::npos); + return std::make_tuple(IPT_INVALID, false, true); + } + else + { + // keep tracking the pointer + return std::make_tuple(IPT_INVALID, true, false); + } } - return false; + // check for clicks if we have up-to-date content on-screen + if (m_path_layout && pointer_idle() && (uievt.pointer_buttons & 0x01) && !(uievt.pointer_buttons & ~u32(0x01))) + { + auto const [x, y] = pointer_location(); + auto const [target_dir_start, target_dir_end] = get_directory_range(x, y); + if (target_dir_end > target_dir_start) + { + m_clicked_directory = std::make_pair(target_dir_start, target_dir_end); + return std::make_tuple(IPT_INVALID, true, true); + } + } + + return std::make_tuple(IPT_INVALID, false, false); +} + + +//------------------------------------------------- +// menu_activated - menu has gained focus +//------------------------------------------------- + +void menu_file_selector::menu_activated() +{ + m_clicked_directory = std::make_pair(std::string::npos, std::string::npos); } @@ -299,7 +384,9 @@ void menu_file_selector::select_item(const file_selector_entry &entry) break; } } - m_current_directory.assign(entry.fullpath); + m_current_directory = entry.fullpath; + m_path_layout.reset(); + m_clicked_directory = std::make_pair(std::string::npos, std::string::npos); reset(reset_options::SELECT_FIRST); break; @@ -314,7 +401,7 @@ void menu_file_selector::select_item(const file_selector_entry &entry) //------------------------------------------------- -// type_search_char +// update_search //------------------------------------------------- void menu_file_selector::update_search() @@ -356,6 +443,35 @@ void menu_file_selector::update_search() } +//------------------------------------------------- +// get_directory_range +//------------------------------------------------- + +std::pair menu_file_selector::get_directory_range(float x, float y) +{ + size_t start = 0, span = 0; + if (m_path_layout->hit_test(x - m_path_position.first, y - m_path_position.second, start, span)) + { + if (std::string_view(m_current_directory).substr(start, span) != PATH_SEPARATOR) + { + auto target_start = m_current_directory.rfind(PATH_SEPARATOR, start); + if (std::string::npos == target_start) + target_start = 0; + else + target_start += 1; + + auto target_end = m_current_directory.find(PATH_SEPARATOR, start + span); + if (std::string::npos == target_end) + target_end = m_current_directory.length(); + + return std::make_pair(target_start, target_end); + } + } + + return std::make_pair(std::string::npos, std::string::npos); +} + + //------------------------------------------------- // populate //------------------------------------------------- @@ -479,6 +595,18 @@ bool menu_file_selector::handle(event const *ev) return true; } } + else if (ev->iptkey == IPT_CUSTOM) + { + // clicked a path component + if (m_clicked_directory.second > m_clicked_directory.first) + { + m_current_directory.resize(m_clicked_directory.second + strlen(PATH_SEPARATOR)); + m_path_layout.reset(); + m_clicked_directory = std::make_pair(std::string::npos, std::string::npos); + reset(reset_options::SELECT_FIRST); + return true; + } + } else if (ev->itemref && (ev->iptkey == IPT_UI_SELECT)) { // handle selections @@ -502,11 +630,15 @@ bool menu_file_selector::handle(event const *ev) // ctor //------------------------------------------------- -menu_select_rw::menu_select_rw(mame_ui_manager &mui, render_container &container, - bool can_in_place, result &result) - : menu(mui, container), - m_can_in_place(can_in_place), - m_result(result) +menu_select_rw::menu_select_rw( + mame_ui_manager &mui, + render_container &container, + bool can_in_place, + handler_function &&handler) + : menu(mui, container) + , m_handler(std::move(handler)) + , m_can_in_place(can_in_place) + , m_result(result::INVALID) { } @@ -517,6 +649,8 @@ menu_select_rw::menu_select_rw(mame_ui_manager &mui, render_container &container menu_select_rw::~menu_select_rw() { + if (m_handler) + m_handler(m_result); } @@ -526,7 +660,8 @@ menu_select_rw::~menu_select_rw() void menu_select_rw::populate() { - item_append(_("Select access mode"), FLAG_DISABLE, nullptr); + set_heading(_("Select access mode")); + item_append(_("Read-only"), 0, itemref_from_result(result::READONLY)); if (m_can_in_place) item_append(_("Read-write"), 0, itemref_from_result(result::READWRITE)); diff --git a/src/frontend/mame/ui/filesel.h b/src/frontend/mame/ui/filesel.h index 8bef06e53ca8c..6ca9cafbe687d 100644 --- a/src/frontend/mame/ui/filesel.h +++ b/src/frontend/mame/ui/filesel.h @@ -15,6 +15,15 @@ #include "ui/menu.h" +#include +#include +#include +#include +#include +#include +#include + + namespace ui { // ======================> menu_file_selector @@ -31,23 +40,26 @@ class menu_file_selector : public menu FILE }; + using handler_function = std::function; + menu_file_selector( mame_ui_manager &mui, render_container &container, device_image_interface *image, - std::string ¤t_directory, - std::string ¤t_file, + std::string_view directory, + std::string_view file, bool has_empty, bool has_softlist, bool has_create, - result &result); + handler_function &&handler); virtual ~menu_file_selector() override; protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual bool custom_ui_back() override { return !m_filename.empty(); } - virtual bool custom_mouse_down() override; + virtual std::tuple custom_pointer_updated(bool changed, ui_event const &uievt) override; + virtual void menu_activated() override; private: enum file_selector_entry_type @@ -72,16 +84,19 @@ class menu_file_selector : public menu }; // internal state - device_image_interface *const m_image; - std::string & m_current_directory; - std::string & m_current_file; - bool const m_has_empty; - bool const m_has_softlist; - bool const m_has_create; - result & m_result; + handler_function const m_handler; + device_image_interface *const m_image; + std::string m_current_directory; + std::string m_current_file; + std::optional m_path_layout; + std::pair m_path_position; + result m_result; + bool const m_has_empty; + bool const m_has_softlist; + bool const m_has_create; std::vector m_entrylist; - std::string m_hover_directory; - std::string m_filename; + std::string m_filename; + std::pair m_clicked_directory; virtual void populate() override; virtual bool handle(event const *ev) override; @@ -93,6 +108,7 @@ class menu_file_selector : public menu void append_entry_menu_item(const file_selector_entry *entry); void select_item(const file_selector_entry &entry); void update_search(); + std::pair get_directory_range(float x, float y); }; @@ -109,23 +125,27 @@ class menu_select_rw : public menu WRITE_OTHER, WRITE_DIFF }; + + using handler_function = std::function; + menu_select_rw( mame_ui_manager &mui, render_container &container, bool can_in_place, - result &result); + handler_function &&handler); virtual ~menu_select_rw() override; - static void *itemref_from_result(result result); - static result result_from_itemref(void *itemref); - private: virtual void populate() override; virtual bool handle(event const *ev) override; + static void *itemref_from_result(result result); + static result result_from_itemref(void *itemref); + // internal state - bool m_can_in_place; - result & m_result; + handler_function const m_handler; + bool const m_can_in_place; + result m_result; }; } // namespace ui diff --git a/src/frontend/mame/ui/floppycntrl.cpp b/src/frontend/mame/ui/floppycntrl.cpp index 83317129ca83a..3f6f9bdfb619e 100644 --- a/src/frontend/mame/ui/floppycntrl.cpp +++ b/src/frontend/mame/ui/floppycntrl.cpp @@ -86,7 +86,8 @@ void menu_control_floppy_image::hook_load(const std::string &filename) else { bool can_in_place = input_format->supports_save(); - if(can_in_place) { + if (can_in_place) + { std::string tmp_path; util::core_file::ptr tmp_file; // attempt to open the file for writing but *without* create @@ -96,9 +97,41 @@ void menu_control_floppy_image::hook_load(const std::string &filename) else can_in_place = false; } - m_submenu_result.rw = menu_select_rw::result::INVALID; - menu::stack_push(ui(), container(), can_in_place, m_submenu_result.rw); - m_state = SELECT_RW; + menu::stack_push( + ui(), + container(), + can_in_place, + [this] (menu_select_rw::result result) + { + switch (result) + { + case menu_select_rw::result::READONLY: + do_load_create(); + fd.setup_write(nullptr); + stack_pop(); + break; + + case menu_select_rw::result::READWRITE: + output_format = input_format; + do_load_create(); + stack_pop(); + break; + + case menu_select_rw::result::WRITE_DIFF: + machine().popmessage("Sorry, diffs are not supported yet\n"); + stack_pop(); + break; + + case menu_select_rw::result::WRITE_OTHER: + menu::stack_push(ui(), container(), &m_image, m_current_directory, m_current_file, m_create_ok); + m_state = CHECK_CREATE; + break; + + case menu_select_rw::result::INVALID: + m_state = START_FILE; + break; + } + }); } } @@ -182,37 +215,6 @@ void menu_control_floppy_image::menu_activated() } break; - case SELECT_RW: - switch(m_submenu_result.rw) { - case menu_select_rw::result::READONLY: - do_load_create(); - fd.setup_write(nullptr); - stack_pop(); - break; - - case menu_select_rw::result::READWRITE: - output_format = input_format; - do_load_create(); - stack_pop(); - break; - - case menu_select_rw::result::WRITE_DIFF: - machine().popmessage("Sorry, diffs are not supported yet\n"); - stack_pop(); - break; - - case menu_select_rw::result::WRITE_OTHER: - menu::stack_push(ui(), container(), &m_image, m_current_directory, m_current_file, m_create_ok); - m_state = CHECK_CREATE; - break; - - case menu_select_rw::result::INVALID: - m_state = START_FILE; - menu_activated(); - break; - } - break; - default: menu_control_device_image::menu_activated(); } diff --git a/src/frontend/mame/ui/floppycntrl.h b/src/frontend/mame/ui/floppycntrl.h index 8be8e7ca02aeb..8bcb02d15b558 100644 --- a/src/frontend/mame/ui/floppycntrl.h +++ b/src/frontend/mame/ui/floppycntrl.h @@ -29,7 +29,7 @@ class menu_control_floppy_image : public menu_control_device_image virtual void menu_activated() override; private: - enum { SELECT_FORMAT = LAST_ID, SELECT_MEDIA, SELECT_INIT, SELECT_RW }; + enum { SELECT_FORMAT = LAST_ID, SELECT_MEDIA, SELECT_INIT }; floppy_image_device &fd; const floppy_image_format_t *input_format, *output_format; diff --git a/src/frontend/mame/ui/imgcntrl.cpp b/src/frontend/mame/ui/imgcntrl.cpp index 8f8aaffd3bbb0..6dd909f711c19 100644 --- a/src/frontend/mame/ui/imgcntrl.cpp +++ b/src/frontend/mame/ui/imgcntrl.cpp @@ -9,7 +9,6 @@ ***************************************************************************/ #include "emu.h" - #include "ui/imgcntrl.h" #include "ui/filecreate.h" @@ -243,7 +242,6 @@ void menu_control_device_image::menu_activated() switch(m_state) { case START_FILE: - m_submenu_result.filesel = menu_file_selector::result::INVALID; menu::stack_push( ui(), container(), &m_image, @@ -252,8 +250,35 @@ void menu_control_device_image::menu_activated() true, m_image.image_interface() != nullptr, m_image.is_creatable(), - m_submenu_result.filesel); - m_state = SELECT_FILE; + [this] (menu_file_selector::result result, std::string &&directory, std::string &&file) + { + m_current_directory = std::move(directory); + m_current_file = std::move(file); + switch (result) + { + case menu_file_selector::result::EMPTY: + m_image.unload(); + stack_pop(); + break; + + case menu_file_selector::result::FILE: + hook_load(m_current_file); + break; + + case menu_file_selector::result::CREATE: + menu::stack_push(ui(), container(), &m_image, m_current_directory, m_current_file, m_create_ok); + m_state = CHECK_CREATE; + break; + + case menu_file_selector::result::SOFTLIST: + m_state = START_SOFTLIST; + break; + + default: // return to system + stack_pop(); + break; + } + }); break; case START_SOFTLIST: @@ -344,34 +369,6 @@ void menu_control_device_image::menu_activated() } break; - case SELECT_FILE: - switch (m_submenu_result.filesel) - { - case menu_file_selector::result::EMPTY: - m_image.unload(); - stack_pop(); - break; - - case menu_file_selector::result::FILE: - hook_load(m_current_file); - break; - - case menu_file_selector::result::CREATE: - menu::stack_push(ui(), container(), &m_image, m_current_directory, m_current_file, m_create_ok); - m_state = CHECK_CREATE; - break; - - case menu_file_selector::result::SOFTLIST: - m_state = START_SOFTLIST; - menu_activated(); - break; - - default: // return to system - stack_pop(); - break; - } - break; - case CREATE_FILE: { bool can_create, need_confirm; diff --git a/src/frontend/mame/ui/imgcntrl.h b/src/frontend/mame/ui/imgcntrl.h index 22911f701411f..c081291f2e1d0 100644 --- a/src/frontend/mame/ui/imgcntrl.h +++ b/src/frontend/mame/ui/imgcntrl.h @@ -4,7 +4,7 @@ ui/imgcntrl.h - MESS's clunky built-in file manager + MAME's clunky built-in file manager ***************************************************************************/ @@ -13,7 +13,6 @@ #pragma once -#include "ui/filesel.h" #include "ui/menu.h" #include "ui/swlist.h" @@ -33,7 +32,7 @@ class menu_control_device_image : public menu { START_FILE, START_OTHER_PART, START_SOFTLIST, SELECT_PARTLIST, SELECT_ONE_PART, SELECT_OTHER_PART, - SELECT_FILE, CREATE_FILE, CREATE_CONFIRM, CHECK_CREATE, DO_CREATE, SELECT_SOFTLIST, + CREATE_FILE, CREATE_CONFIRM, CHECK_CREATE, DO_CREATE, SELECT_SOFTLIST, LAST_ID }; @@ -41,9 +40,7 @@ class menu_control_device_image : public menu // results we could get from child menus union { - menu_file_selector::result filesel; menu_software_parts::result swparts; - menu_select_rw::result rw; int i; } m_submenu_result; diff --git a/src/frontend/mame/ui/info.cpp b/src/frontend/mame/ui/info.cpp index 813bbd4b8c8cc..945c18d32a2b1 100644 --- a/src/frontend/mame/ui/info.cpp +++ b/src/frontend/mame/ui/info.cpp @@ -576,11 +576,6 @@ void menu_game_info::populate() { } -bool menu_game_info::handle(event const *ev) -{ - return ev && handle_key(ev->iptkey); -} - /*------------------------------------------------- menu_warn_info - handle the emulation warnings menu @@ -640,11 +635,6 @@ void menu_warn_info::populate() { } -bool menu_warn_info::handle(event const *ev) -{ - return ev && handle_key(ev->iptkey); -} - /*------------------------------------------------- menu_image_info - handle the image information menu diff --git a/src/frontend/mame/ui/info.h b/src/frontend/mame/ui/info.h index 12eebc769c7a5..c1b5d318a69e0 100644 --- a/src/frontend/mame/ui/info.h +++ b/src/frontend/mame/ui/info.h @@ -104,7 +104,6 @@ class menu_game_info : public menu_textbox private: virtual void populate() override; - virtual bool handle(event const *ev) override; }; @@ -119,7 +118,6 @@ class menu_warn_info : public menu_textbox private: virtual void populate() override; - virtual bool handle(event const *ev) override; }; diff --git a/src/frontend/mame/ui/inputdevices.cpp b/src/frontend/mame/ui/inputdevices.cpp index 0fe8de2a1c0bb..1ee03ad5c8136 100644 --- a/src/frontend/mame/ui/inputdevices.cpp +++ b/src/frontend/mame/ui/inputdevices.cpp @@ -44,7 +44,7 @@ class menu_input_device : public menu set_custom_space(0.0F, (line_height() * (m_have_analog ? 2.0F : 1.0F)) + (tb_border() * 3.0F)); } - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override { if (selectedref) { diff --git a/src/frontend/mame/ui/inputmap.cpp b/src/frontend/mame/ui/inputmap.cpp index b5b56b6e1fb6b..d8a4d9656f47a 100644 --- a/src/frontend/mame/ui/inputmap.cpp +++ b/src/frontend/mame/ui/inputmap.cpp @@ -322,7 +322,7 @@ void menu_input::recompute_metrics(uint32_t width, uint32_t height, float aspect } -void menu_input::custom_render(void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) +void menu_input::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) { if (pollingitem) { diff --git a/src/frontend/mame/ui/inputmap.h b/src/frontend/mame/ui/inputmap.h index e5947a9b6494e..585d8002a8c4e 100644 --- a/src/frontend/mame/ui/inputmap.h +++ b/src/frontend/mame/ui/inputmap.h @@ -65,7 +65,7 @@ class menu_input : public menu menu_input(mame_ui_manager &mui, render_container &container); virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) override; void populate_sorted(); void toggle_none_default(input_seq &selected_seq, input_seq &original_seq, const input_seq &selected_defseq); diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp index 71e15631879bf..a5c82aa90c227 100644 --- a/src/frontend/mame/ui/menu.cpp +++ b/src/frontend/mame/ui/menu.cpp @@ -13,7 +13,6 @@ #include "ui/ui.h" #include "ui/mainmenu.h" -#include "ui/utils.h" #include "ui/miscmenu.h" #include "cheat.h" @@ -27,9 +26,9 @@ #include "osdepend.h" -#include #include -#include +#include +#include #include @@ -77,6 +76,12 @@ menu::global_state::global_state(mame_ui_manager &ui) , m_stack() , m_free() , m_hide(false) + , m_current_pointer(-1) + , m_pointer_type(ui_event::pointer::UNKNOWN) + , m_pointer_buttons(0U) + , m_pointer_x(-1.0F) + , m_pointer_y(-1.0F) + , m_pointer_hit(false) { render_manager &render(ui.machine().render()); @@ -122,6 +127,21 @@ void menu::global_state::stack_push(std::unique_ptr &&menu) } menu->m_parent = std::move(m_stack); m_stack = std::move(menu); + + ui_event uievt; + while (m_stack->machine().ui_input().pop_event(&uievt)) + { + switch (uievt.event_type) + { + case ui_event::type::POINTER_UPDATE: + case ui_event::type::POINTER_LEAVE: + case ui_event::type::POINTER_ABORT: + use_pointer(m_stack->machine().render().ui_target(), m_stack->container(), uievt); + break; + default: + break; + } + } m_stack->machine().ui_input().reset(); } @@ -142,7 +162,22 @@ void menu::global_state::stack_pop() m_stack = std::move(menu->m_parent); menu->m_parent = std::move(m_free); m_free = std::move(menu); - m_ui.machine().ui_input().reset(); + + ui_event uievt; + while (m_free->machine().ui_input().pop_event(&uievt)) + { + switch (uievt.event_type) + { + case ui_event::type::POINTER_UPDATE: + case ui_event::type::POINTER_LEAVE: + case ui_event::type::POINTER_ABORT: + use_pointer(m_free->machine().render().ui_target(), m_free->container(), uievt); + break; + default: + break; + } + } + m_free->machine().ui_input().reset(); } } @@ -187,39 +222,155 @@ uint32_t menu::global_state::ui_handler(render_container &container) if (!m_stack) stack_push(std::make_unique(m_ui, container)); - // ensure topmost menu is active - need a loop because it could push another menu - while (m_stack && !m_stack->is_active()) + while (true) { - m_stack->m_active = true; - m_stack->menu_activated(); - } + // ensure topmost menu is active - need a loop because it could push another menu + while (m_stack && !m_stack->is_active()) + { + m_stack->m_items_drawn = false; + m_stack->m_pointer_state = track_pointer::IDLE; + m_stack->m_active = true; + m_stack->menu_activated(); + if (m_stack && m_stack->is_active()) + { + // menu activated - draw it to ensure it's on-screen before it can process input + m_stack->check_metrics(); + m_stack->do_rebuild(); + m_stack->validate_selection(1); + m_stack->do_draw_menu(); + assert(m_stack); + assert(m_stack->is_active()); + + // display pointer if appropriate + mame_ui_manager::display_pointer pointers[1]{ { m_stack->machine().render().ui_target(), m_pointer_type, m_pointer_x, m_pointer_y } }; + if ((0 <= m_current_pointer) && (ui_event::pointer::TOUCH != m_pointer_type)) + m_ui.set_pointers(std::begin(pointers), std::end(pointers)); + else + m_ui.set_pointers(std::begin(pointers), std::begin(pointers)); + + return mame_ui_manager::HANDLER_UPDATE; + } + } - // update the menu state - m_hide = false; - bool need_update = m_stack && m_stack->do_handle(); + // update the menu state + m_hide = false; + bool need_update(m_stack && m_stack->do_handle()); - // clear up anything pending being released - clear_free_list(); + // clear up anything pending being released + clear_free_list(); - // if the menus are to be hidden, return a cancel here - if (m_ui.is_menu_active() && (m_hide || !m_stack)) - { - if (m_stack) + // if the menus are to be hidden, return a cancel here + if (m_ui.is_menu_active() && (m_hide || !m_stack)) { - if (m_stack->is_one_shot()) + if (m_stack) { - stack_pop(); + if (m_stack->is_one_shot()) + { + stack_pop(); + } + else if (m_stack->is_active()) + { + m_stack->m_active = false; + m_stack->menu_deactivated(); + } } - else if (m_stack->is_active()) + + // forget about pointers while menus aren't handling events + m_current_pointer = -1; + m_pointer_type = ui_event::pointer::UNKNOWN; + m_pointer_buttons = 0U; + m_pointer_x = -1.0F; + m_pointer_y = -1.0F; + m_pointer_hit = false; + + return mame_ui_manager::HANDLER_CANCEL; + } + + // if the menu is still active, draw it, otherwise try again + if (m_stack->is_active()) + { + m_stack->do_draw_menu(); + + // display pointer if appropriate + mame_ui_manager::display_pointer pointers[1]{ { m_stack->machine().render().ui_target(), m_pointer_type, m_pointer_x, m_pointer_y } }; + if ((0 <= m_current_pointer) && (ui_event::pointer::TOUCH != m_pointer_type)) + m_ui.set_pointers(std::begin(pointers), std::end(pointers)); + else + m_ui.set_pointers(std::begin(pointers), std::begin(pointers)); + + return need_update ? mame_ui_manager::HANDLER_UPDATE : 0; + } + } +} + + +std::pair menu::global_state::use_pointer(render_target &target, render_container &container, ui_event const &uievt) +{ + if (&target != uievt.target) + return std::make_pair(false, false); + + switch (uievt.event_type) + { + case ui_event::type::POINTER_UPDATE: + // if it's our current pointer, just update it + if (uievt.pointer_id == m_current_pointer) + { + assert(uievt.pointer_type == m_pointer_type); + assert(uievt.pointer_buttons == ((m_pointer_buttons & ~uievt.pointer_released) | uievt.pointer_pressed)); + + m_pointer_buttons = uievt.pointer_buttons; + m_pointer_hit = target.map_point_container( + uievt.pointer_x, + uievt.pointer_y, + container, + m_pointer_x, + m_pointer_y); + return std::make_pair(true, false); + } + + // don't change if the current pointer has buttons pressed and this one doesn't + if ((0 > m_current_pointer) || (!m_pointer_buttons && (!m_pointer_hit || uievt.pointer_pressed))) + { + float x, y; + bool const hit(target.map_point_container(uievt.pointer_x, uievt.pointer_y, container, x, y)); + if ((0 > m_current_pointer) || uievt.pointer_pressed || (!m_pointer_hit && hit)) { - m_stack->m_active = false; - m_stack->menu_deactivated(); + m_current_pointer = uievt.pointer_id; + m_pointer_type = uievt.pointer_type; + m_pointer_buttons = uievt.pointer_buttons; + m_pointer_x = x; + m_pointer_y = y; + m_pointer_hit = hit; + return std::make_pair(true, true); } } - return mame_ui_manager::HANDLER_CANCEL; - } - return need_update ? mame_ui_manager::HANDLER_UPDATE : 0; + // keep current pointer + return std::make_pair(false, false); + + case ui_event::type::POINTER_LEAVE: + case ui_event::type::POINTER_ABORT: + // irrelevant if it isn't our current pointer + if (uievt.pointer_id != m_current_pointer) + return std::make_pair(false, false); + + assert(uievt.pointer_type == m_pointer_type); + assert(uievt.pointer_released == m_pointer_buttons); + + // keep the coordinates where we lost the pointer + m_current_pointer = -1; + m_pointer_buttons = 0U; + m_pointer_hit = target.map_point_container( + uievt.pointer_x, + uievt.pointer_y, + container, + m_pointer_x, + m_pointer_y); + return std::make_pair(true, false); + + default: + std::abort(); + } } @@ -248,22 +399,31 @@ menu::menu(mame_ui_manager &mui, render_container &container) , m_lr_border(0.0F) , m_lr_arrow_width(0.0F) , m_ud_arrow_width(0.0F) + , m_items_left(0.0F) + , m_items_right(0.0F) + , m_items_top(0.0F) + , m_adjust_top(0.0F) + , m_adjust_bottom(0.0F) + , m_decrease_left(0.0F) + , m_increase_left(0.0F) + , m_show_up_arrow(false) + , m_show_down_arrow(false) + , m_items_drawn(false) + , m_pointer_state(track_pointer::IDLE) + , m_pointer_down(0.0F, 0.0F) + , m_pointer_updated(0.0F, 0.0F) + , m_pointer_line(0) + , m_pointer_repeat(std::chrono::steady_clock::time_point::min()) , m_process_flags(0) , m_selected(0) - , m_hover(1) , m_special_main_menu(false) , m_one_shot(false) , m_needs_prev_menu_item(true) , m_active(false) - , m_event() , m_customtop(0.0F) , m_custombottom(0.0F) , m_resetpos(0) , m_resetref(nullptr) - , m_mouse_hit(false) - , m_mouse_button(false) - , m_mouse_x(-1.0F) - , m_mouse_y(-1.0F) { reset(reset_options::SELECT_FIRST); @@ -288,6 +448,10 @@ menu::~menu() void menu::reset(reset_options options) { + // don't accept pointer input until the menu has been redrawn + m_items_drawn = false; + m_pointer_state = track_pointer::IDLE; + // based on the reset option, set the reset info m_resetpos = 0; m_resetref = nullptr; @@ -392,62 +556,6 @@ void menu::set_custom_space(float top, float bottom) } -//------------------------------------------------- -// process - process a menu, drawing it -// and returning any interesting events -//------------------------------------------------- - -std::pair menu::process() -{ - // reset the event - m_event.iptkey = IPT_INVALID; - - // first make sure our selection is valid - validate_selection(1); - - // if we're not running the emulation, draw parent menus in the background - auto const draw_parent = - [] (auto &self, menu *parent) -> bool - { - if (!parent || !(parent->is_special_main_menu() || self(self, parent->m_parent.get()))) - return false; - else - parent->draw(PROCESS_NOINPUT); - return true; - }; - if (draw_parent(draw_parent, m_parent.get())) - container().add_rect(0.0F, 0.0F, 1.0F, 1.0F, rgb_t(114, 0, 0, 0), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - - // draw the menu proper - // FIXME: this should happen after processing events to fix the egregious latency - // The main thing preventing this is that mouse handling is mixed up with drawing - draw(m_process_flags); - - // process input - if (!(m_process_flags & (PROCESS_NOKEYS | PROCESS_NOINPUT))) - { - // read events - handle_events(m_process_flags, m_event); - - // handle the keys if we don't already have an event - if (m_event.iptkey == IPT_INVALID) - handle_keys(m_process_flags, m_event.iptkey); - } - - // update the selected item in the event - if ((m_event.iptkey != IPT_INVALID) && selection_valid()) - { - m_event.itemref = get_selection_ref(); - m_event.item = &m_items[m_selected]; - return std::make_pair(&m_event, false); - } - else - { - return std::make_pair(nullptr, false); - } -} - - //------------------------------------------------- // set_selection - changes the index // of the currently selected menu item @@ -473,27 +581,37 @@ void menu::set_selection(void *selected_itemref) ***************************************************************************/ //------------------------------------------------- -// draw - draw a menu +// do_draw_menu - draw a menu //------------------------------------------------- -void menu::draw(uint32_t flags) +void menu::do_draw_menu() { - // first draw the FPS counter - // FIXME: provide a way to do this in the UI manager itself while menus are on-screen - if (ui().show_fps_counter()) - { - ui().draw_text_full( - container(), - machine().video().speed_text(), - 0.0F, 0.0F, 1.0F, - text_layout::text_justify::RIGHT, text_layout::word_wrapping::WORD, - mame_ui_manager::OPAQUE_, rgb_t::white(), rgb_t::black(), - nullptr, nullptr); - } + // if we're not running the emulation, draw parent menus in the background + auto const draw_parent = + [] (auto &self, menu *parent) -> bool + { + if (!parent || !(parent->is_special_main_menu() || self(self, parent->m_parent.get()))) + return false; + else + parent->draw(PROCESS_NOINPUT); + return true; + }; + if (draw_parent(draw_parent, m_parent.get())) + container().add_rect(0.0F, 0.0F, 1.0F, 1.0F, rgb_t(114, 0, 0, 0), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + + // draw the menu proper + draw(m_process_flags); +} + + +//------------------------------------------------- +// draw - draw the menu itself +//------------------------------------------------- +void menu::draw(uint32_t flags) +{ bool const customonly = (flags & PROCESS_CUSTOM_ONLY); - bool const noinput = (flags & PROCESS_NOINPUT); - float const max_width = 1.0F - ((lr_border() + (machine().render().ui_aspect(&container()) * UI_LINE_WIDTH)) * 2.0F); + float const max_width = 1.0F - ((lr_border() + (x_aspect() * UI_LINE_WIDTH)) * 2.0F); if (is_special_main_menu()) draw_background(); @@ -550,13 +668,13 @@ void menu::draw(uint32_t flags) // compute top/left of inner menu area by centering float const visible_left = (1.0F - visible_width) * 0.5F; - float const visible_top = std::round((((1.0F - visible_main_menu_height - visible_extra_menu_height) * 0.5F) + top_extra_menu_height) * float(m_last_size.second)) / float(m_last_size.second); + m_items_top = std::round((((1.0F - visible_main_menu_height - visible_extra_menu_height) * 0.5F) + top_extra_menu_height) * float(m_last_size.second)) / float(m_last_size.second); // first add us a box float const x1 = visible_left - lr_border(); - float const y1 = visible_top - tb_border(); + float const y1 = m_items_top - tb_border(); float const x2 = visible_left + visible_width + lr_border(); - float const y2 = visible_top + visible_main_menu_height + tb_border(); + float const y2 = m_items_top + visible_main_menu_height + tb_border(); if (!customonly) { if (heading_layout) @@ -586,29 +704,43 @@ void menu::draw(uint32_t flags) top_line = m_selected - m_visible_lines + ((m_selected == (m_items.size() - 1)) ? 1: 2); // if scrolling, show arrows - bool const show_top_arrow((m_items.size() > m_visible_lines) && !first_item_visible()); - bool const show_bottom_arrow((m_items.size() > m_visible_lines) && !last_item_visible()); + m_show_up_arrow = (m_items.size() > m_visible_lines) && !first_item_visible(); + m_show_down_arrow = (m_items.size() > m_visible_lines) && !last_item_visible(); // set the number of visible lines, minus 1 for top arrow and 1 for bottom arrow - m_visible_items = m_visible_lines - (show_top_arrow ? 1 : 0) - (show_bottom_arrow ? 1 : 0); + m_visible_items = m_visible_lines - (m_show_up_arrow ? 1 : 0) - (m_show_down_arrow ? 1 : 0); // determine effective positions taking into account the hilighting arrows float const effective_width = visible_width - 2.0F * gutter_width(); float const effective_left = visible_left + gutter_width(); - // locate mouse - if (!customonly && !noinput) - map_mouse(); - else - ignore_mouse(); - // loop over visible lines - m_hover = m_items.size() + 1; bool selected_subitem_too_big = false; - float const line_x0 = x1 + 0.5F * UI_LINE_WIDTH; - float const line_x1 = x2 - 0.5F * UI_LINE_WIDTH; - if (!customonly) + m_items_left = x1 + 0.5F * UI_LINE_WIDTH; + m_items_right = x2 - 0.5F * UI_LINE_WIDTH; + if (customonly) + { + m_items_drawn = false; + switch (m_pointer_state) + { + case track_pointer::IDLE: + case track_pointer::IGNORED: + case track_pointer::COMPLETED: + case track_pointer::CUSTOM: + break; + case track_pointer::TRACK_LINE: + case track_pointer::SCROLL: + case track_pointer::ADJUST: + m_pointer_state = track_pointer::COMPLETED; + } + } + else { + m_adjust_top = 1.0F; + m_adjust_bottom = 0.0F; + m_decrease_left = -1.0F; + m_increase_left = -1.0F; + m_items_drawn = true; for (int linenum = 0; linenum < m_visible_lines; linenum++) { auto const itemnum = top_line + linenum; @@ -618,63 +750,66 @@ void menu::draw(uint32_t flags) rgb_t bgcolor = ui().colors().text_bg_color(); rgb_t fgcolor2 = ui().colors().subitem_color(); rgb_t fgcolor3 = ui().colors().clone_color(); - float const line_y0 = visible_top + (float)linenum * line_height(); + float const line_y0 = m_items_top + (float(linenum) * line_height()); float const line_y1 = line_y0 + line_height(); // work out what we're dealing with - bool const uparrow = !linenum && show_top_arrow; - bool const downarrow = (linenum == (m_visible_lines - 1)) && show_bottom_arrow; - - // set the hover if this is our item - bool const hovered = mouse_in_rect(line_x0, line_y0, line_x1, line_y1); - if (hovered) - { - if (uparrow) - m_hover = HOVER_ARROW_UP; - else if (downarrow) - m_hover = HOVER_ARROW_DOWN; - else if (is_selectable(pitem)) - m_hover = itemnum; - } + bool const uparrow = !linenum && m_show_up_arrow; + bool const downarrow = (linenum == (m_visible_lines - 1)) && m_show_down_arrow; + // highlight if necessary if (is_selected(itemnum)) { // if we're selected, draw with a different background fgcolor = fgcolor2 = fgcolor3 = ui().colors().selected_color(); bgcolor = ui().colors().selected_bg_color(); } - else if (hovered && (uparrow || downarrow || is_selectable(pitem))) + else if (uparrow || downarrow || is_selectable(pitem)) { - // else if the mouse is over this item, draw with a different background - fgcolor = fgcolor2 = fgcolor3 = ui().colors().mouseover_color(); - bgcolor = ui().colors().mouseover_bg_color(); + bool pointerline(linenum == m_pointer_line); + if ((track_pointer::ADJUST == m_pointer_state) && pointerline) + { + // use the hover background if an adjust gesture is attempted on an item that isn't selected + fgcolor = fgcolor2 = fgcolor3 = ui().colors().mouseover_color(); + bgcolor = ui().colors().mouseover_bg_color(); + } + else if (have_pointer() && pointer_in_rect(m_items_left, line_y0, m_items_right, line_y1)) + { + if ((track_pointer::TRACK_LINE == m_pointer_state) && pointerline) + { + // use the selected background for an item being selected + fgcolor = fgcolor2 = fgcolor3 = ui().colors().selected_color(); + bgcolor = ui().colors().selected_bg_color(); + } + else if (track_pointer::IDLE == m_pointer_state) + { + // else if the pointer is over this item, draw with a different background + fgcolor = fgcolor2 = fgcolor3 = ui().colors().mouseover_color(); + bgcolor = ui().colors().mouseover_bg_color(); + } + } + else if ((track_pointer::TRACK_LINE == m_pointer_state) && pointerline) + { + // use the hover background if the pointer moved out of the tracked item + fgcolor = fgcolor2 = fgcolor3 = ui().colors().mouseover_color(); + bgcolor = ui().colors().mouseover_bg_color(); + } } // if we have some background hilighting to do, add a quad behind everything else if (bgcolor != ui().colors().text_bg_color()) - highlight(line_x0, line_y0, line_x1, line_y1, bgcolor); + highlight(m_items_left, line_y0, m_items_right, line_y1, bgcolor); - if (uparrow) - { - // if we're on the top line, display the up arrow - draw_arrow( - 0.5F * (x1 + x2) - 0.5F * ud_arrow_width(), - line_y0 + 0.25F * line_height(), - 0.5F * (x1 + x2) + 0.5F * ud_arrow_width(), - line_y0 + 0.75F * line_height(), - fgcolor, - ROT0); - } - else if (downarrow) + if (uparrow || downarrow) { - // if we're on the bottom line, display the down arrow + // if we're on the top or bottom line, display the up or down arrow draw_arrow( - 0.5F * (x1 + x2) - 0.5F * ud_arrow_width(), - line_y0 + 0.25F * line_height(), - 0.5F * (x1 + x2) + 0.5F * ud_arrow_width(), - line_y0 + 0.75F * line_height(), + 0.5F * (x1 + x2 - ud_arrow_width()), + line_y0 + (0.25F * line_height()), + 0.5F * (x1 + x2 + ud_arrow_width()), + line_y0 + (0.75F * line_height()), fgcolor, - ROT0 ^ ORIENTATION_FLIP_Y); + downarrow ? (ROT0 ^ ORIENTATION_FLIP_Y) : ROT0); } else if (pitem.type() == menu_item_type::SEPARATOR) { @@ -765,27 +900,22 @@ void menu::draw(uint32_t flags) } // apply arrows - if (is_selected(itemnum) && (pitem.flags() & FLAG_LEFT_ARROW)) - { - float const l = effective_left + effective_width - subitem_width - gutter_width(); - float const r = l + lr_arrow_width(); - draw_arrow( - l, line_y0 + 0.1F * line_height(), r, line_y0 + 0.9F * line_height(), - fgcolor, - ROT90 ^ ORIENTATION_FLIP_X); - if (mouse_in_rect(l, line_y0 + 0.1F * line_height(), r, line_y0 + 0.9F * line_height())) - m_hover = HOVER_UI_LEFT; - } - if (is_selected(itemnum) && (pitem.flags() & FLAG_RIGHT_ARROW)) + if (is_selected(itemnum) && (pitem.flags() & (FLAG_LEFT_ARROW | FLAG_RIGHT_ARROW))) { - float const r = effective_left + effective_width + gutter_width(); - float const l = r - lr_arrow_width(); - draw_arrow( - l, line_y0 + 0.1F * line_height(), r, line_y0 + 0.9F * line_height(), - fgcolor, - ROT90); - if (mouse_in_rect(l, line_y0 + 0.1F * line_height(), r, line_y0 + 0.9F * line_height())) - m_hover = HOVER_UI_RIGHT; + m_adjust_top = line_y0 + (0.1F * line_height()); + m_adjust_bottom = line_y0 + (0.9F * line_height()); + if (pitem.flags() & FLAG_LEFT_ARROW) + { + m_decrease_left = effective_left + effective_width - subitem_width - gutter_width(); + float const r = m_decrease_left + lr_arrow_width(); + draw_arrow(m_decrease_left, m_adjust_top, r, m_adjust_bottom, fgcolor, ROT90 ^ ORIENTATION_FLIP_X); + } + if (pitem.flags() & FLAG_RIGHT_ARROW) + { + float const r = effective_left + effective_width + gutter_width(); + m_increase_left = r - lr_arrow_width(); + draw_arrow(m_increase_left, m_adjust_top, r, m_adjust_bottom, fgcolor, ROT90); + } } } } @@ -797,7 +927,7 @@ void menu::draw(uint32_t flags) menu_item const &pitem = selected_item(); bool const subitem_invert(pitem.flags() & FLAG_INVERT); auto const linenum = m_selected - top_line; - float const line_y = visible_top + float(linenum) * line_height(); + float const line_y = m_items_top + float(linenum) * line_height(); // compute the multi-line target width/height auto const [target_width, target_height] = get_text_dimensions( @@ -828,7 +958,7 @@ void menu::draw(uint32_t flags) } // if there is something special to add, do it by calling the virtual method - custom_render(get_selection_ref(), m_customtop, m_custombottom, x1, y1, x2, y2); + custom_render(flags, get_selection_ref(), m_customtop, m_custombottom, x1, y1, x2, y2); } void menu::recompute_metrics(uint32_t width, uint32_t height, float aspect) @@ -843,42 +973,15 @@ void menu::recompute_metrics(uint32_t width, uint32_t height, float aspect) m_lr_arrow_width = 0.4F * m_line_height * aspect; m_ud_arrow_width = m_line_height * aspect; -} - -void menu::custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) -{ -} + // don't accept pointer input until the menu has been redrawn + m_items_drawn = false; + m_pointer_state = track_pointer::IDLE; -//------------------------------------------------- -// map_mouse - map mouse pointer location to menu -// coordinates -//------------------------------------------------- - -void menu::map_mouse() -{ - ignore_mouse(); - int32_t mouse_target_x, mouse_target_y; - render_target *const mouse_target = machine().ui_input().find_mouse(&mouse_target_x, &mouse_target_y, &m_mouse_button); - if (mouse_target) - { - if (mouse_target->map_point_container(mouse_target_x, mouse_target_y, container(), m_mouse_x, m_mouse_y)) - m_mouse_hit = true; - } } - -//------------------------------------------------- -// ignore_mouse - set members to ignore mouse -// input -//------------------------------------------------- - -void menu::ignore_mouse() +void menu::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) { - m_mouse_hit = false; - m_mouse_button = false; - m_mouse_x = -1.0F; - m_mouse_y = -1.0F; } @@ -887,8 +990,9 @@ void menu::ignore_mouse() // input events for a menu //------------------------------------------------- -void menu::handle_events(uint32_t flags, event &ev) +bool menu::handle_events(uint32_t flags, event &ev) { + bool need_update = false; bool stop = false; ui_event local_menu_event; @@ -897,119 +1001,93 @@ void menu::handle_events(uint32_t flags, event &ev) { switch (local_menu_event.event_type) { - // if we are hovering over a valid item, select it with a single click - case ui_event::type::MOUSE_DOWN: - if (custom_mouse_down()) - return; - - if (!(flags & PROCESS_ONLYCHAR)) + // deal with pointer-like input (mouse, pen, touch, etc.) + case ui_event::type::POINTER_UPDATE: { - if (m_hover >= 0 && m_hover < m_items.size()) - { - m_selected = m_hover; - } - else if (m_hover == HOVER_ARROW_UP) - { - if (flags & PROCESS_CUSTOM_NAV) - { - ev.iptkey = IPT_UI_PAGE_UP; - stop = true; - } - else - { - m_selected -= m_visible_items; - if (m_selected < 0) - m_selected = 0; - top_line -= m_visible_items - (last_item_visible() ? 1 : 0); - } - } - else if (m_hover == HOVER_ARROW_DOWN) - { - if (flags & PROCESS_CUSTOM_NAV) - { - ev.iptkey = IPT_UI_PAGE_DOWN; - stop = true; - } - else - { - m_selected += m_visible_lines - 2 + is_first_selected(); - if (m_selected > m_items.size() - 1) - m_selected = m_items.size() - 1; - top_line += m_visible_lines - 2; - } - } - else if (m_hover == HOVER_UI_LEFT) + auto const [key, redraw] = handle_pointer_update(flags, local_menu_event); + need_update = need_update || redraw; + if (IPT_INVALID != key) { - ev.iptkey = IPT_UI_LEFT; + ev.iptkey = key; stop = true; } - else if (m_hover == HOVER_UI_RIGHT) + } + break; + + // pointer left the normal way, possibly releasing buttons + case ui_event::type::POINTER_LEAVE: + { + auto const [key, redraw] = handle_pointer_leave(flags, local_menu_event); + need_update = need_update || redraw; + if (IPT_INVALID != key) { - ev.iptkey = IPT_UI_RIGHT; + ev.iptkey = key; stop = true; } } break; - // if we are hovering over a valid item, fake a UI_SELECT with a double-click - case ui_event::type::MOUSE_DOUBLE_CLICK: - if (!(flags & PROCESS_ONLYCHAR) && m_hover >= 0 && m_hover < m_items.size()) + // pointer left in some abnormal way - cancel any associated actions + case ui_event::type::POINTER_ABORT: { - m_selected = m_hover; - ev.iptkey = IPT_UI_SELECT; - if (is_last_selected() && m_needs_prev_menu_item) + auto const [key, redraw] = handle_pointer_abort(flags, local_menu_event); + need_update = need_update || redraw; + if (IPT_INVALID != key) { - ev.iptkey = IPT_UI_BACK; - stack_pop(); - if (is_special_main_menu()) - machine().schedule_exit(); + ev.iptkey = key; + stop = true; } - stop = true; } break; // caught scroll event case ui_event::type::MOUSE_WHEEL: - if (!custom_mouse_scroll((0 < local_menu_event.zdelta) ? -local_menu_event.num_lines : local_menu_event.num_lines) && !(flags & (PROCESS_ONLYCHAR | PROCESS_CUSTOM_NAV))) + if ((track_pointer::IDLE == m_pointer_state) || (track_pointer::IGNORED == m_pointer_state)) { - if (local_menu_event.zdelta > 0) - { - if (is_first_selected()) - { - select_last_item(); - } - else - { - m_selected -= local_menu_event.num_lines; - validate_selection(-1); - } - top_line -= (m_selected <= top_line && top_line != 0); - if (m_selected <= top_line && m_visible_items != m_visible_lines) - top_line -= local_menu_event.num_lines; - } - else + if (!custom_mouse_scroll((0 < local_menu_event.zdelta) ? -local_menu_event.num_lines : local_menu_event.num_lines) && !(flags & (PROCESS_ONLYCHAR | PROCESS_CUSTOM_NAV))) { - if (is_last_selected()) + if (local_menu_event.zdelta > 0) { - select_first_item(); + if (is_first_selected()) + { + select_last_item(); + } + else + { + m_selected -= local_menu_event.num_lines; + validate_selection(-1); + } + top_line -= (m_selected <= top_line && top_line != 0); + if (m_selected <= top_line && m_visible_items != m_visible_lines) + top_line -= local_menu_event.num_lines; } else { - m_selected += local_menu_event.num_lines; - validate_selection(1); + if (is_last_selected()) + { + select_first_item(); + } + else + { + m_selected += local_menu_event.num_lines; + validate_selection(1); + } + top_line += (m_selected >= top_line + m_visible_items + (top_line != 0)); + if (m_selected >= (top_line + m_visible_items + (top_line != 0))) + top_line += local_menu_event.num_lines; } - top_line += (m_selected >= top_line + m_visible_items + (top_line != 0)); - if (m_selected >= (top_line + m_visible_items + (top_line != 0))) - top_line += local_menu_event.num_lines; } } break; // translate CHAR events into specials case ui_event::type::IME_CHAR: - ev.iptkey = IPT_SPECIAL; - ev.unichar = local_menu_event.ch; - stop = true; + if ((track_pointer::IDLE == m_pointer_state) || (track_pointer::IGNORED == m_pointer_state)) + { + ev.iptkey = IPT_SPECIAL; + ev.unichar = local_menu_event.ch; + stop = true; + } break; // ignore everything else @@ -1017,81 +1095,614 @@ void menu::handle_events(uint32_t flags, event &ev) break; } } + + // deal with repeating scroll arrows + if ((track_pointer::TRACK_LINE == m_pointer_state) && ((!m_pointer_line && m_show_up_arrow) || ((m_pointer_line == (m_visible_lines - 1)) && m_show_down_arrow))) + { + float const linetop(m_items_top + (float(m_pointer_line) * line_height())); + float const linebottom(m_items_top + (float(m_pointer_line + 1) * line_height())); + if (pointer_in_rect(m_items_left, linetop, m_items_right, linebottom)) + { + if (std::chrono::steady_clock::now() >= m_pointer_repeat) + { + if (!m_pointer_line) + { + // scroll up + assert(0 < top_line); + --top_line; + if (!top_line) + m_pointer_state = track_pointer::COMPLETED; + } + else + { + // scroll down + assert(m_items.size() > (top_line + m_visible_lines)); + ++top_line; + if (m_items.size() == (top_line + m_visible_lines)) + m_pointer_state = track_pointer::COMPLETED; + } + force_visible_selection(); + need_update = true; + m_pointer_repeat += std::chrono::milliseconds(100); + } + } + } + + return need_update; } //------------------------------------------------- -// handle_keys - generically handle -// keys for a menu +// handle_pointer_update - handle a regular +// pointer update //------------------------------------------------- -void menu::handle_keys(uint32_t flags, int &iptkey) +std::pair menu::handle_pointer_update(uint32_t flags, ui_event const &uievt) { - bool const ignorepause = (flags & PROCESS_IGNOREPAUSE) || stack_has_special_main_menu(); - - // bail if no items - if (m_items.empty()) - return; - - // if we hit select, return true or pop the stack, depending on the item - if (exclusive_input_pressed(iptkey, IPT_UI_SELECT, 0)) + // decide whether to make this our current pointer + render_target &target(machine().render().ui_target()); + auto const [ours, changed] = m_global_state.use_pointer(target, container(), uievt); + if (!ours) { - if (is_last_selected() && m_needs_prev_menu_item) + return std::make_pair(IPT_INVALID, false); + } + else if (changed) + { + // if the active pointer changed, ignore if any buttons were already down + if (uievt.pointer_buttons != uievt.pointer_pressed) { - iptkey = IPT_INVALID; - stack_pop(); - if (is_special_main_menu()) - machine().schedule_exit(); + m_pointer_state = track_pointer::IGNORED; + return std::make_pair(IPT_INVALID, false); + } + else + { + m_pointer_state = track_pointer::IDLE; } - return; } - - // UI configure hides the menus - if (!(flags & PROCESS_NOKEYS) && exclusive_input_pressed(iptkey, IPT_UI_MENU, 0) && !m_global_state.stack_has_special_main_menu()) + else if ((track_pointer::IGNORED == m_pointer_state) || (track_pointer::COMPLETED == m_pointer_state)) { - if (is_one_shot()) - stack_pop(); + // stop ignoring the pointer if all buttons were released + if (uievt.pointer_buttons == uievt.pointer_pressed) + m_pointer_state = track_pointer::IDLE; else - m_global_state.hide_menu(); - return; + return std::make_pair(IPT_INVALID, false); } - // bail out - if (flags & PROCESS_ONLYCHAR) - return; - - // hitting back also pops the stack - if (exclusive_input_pressed(iptkey, IPT_UI_BACK, 0)) + // give derived class a chance to handle it + if ((track_pointer::IDLE == m_pointer_state) || (track_pointer::CUSTOM == m_pointer_state)) { - if (!custom_ui_back()) + auto const [key, take, redraw] = custom_pointer_updated(changed, uievt); + if (take) { - iptkey = IPT_INVALID; - stack_pop(); - if (is_special_main_menu()) - machine().schedule_exit(); + m_pointer_state = track_pointer::CUSTOM; + return std::make_pair(key, redraw); } - return; - } - - // validate the current selection - validate_selection(1); - - // swallow left/right keys if they are not appropriate + else if (track_pointer::CUSTOM == m_pointer_state) + { + if (uievt.pointer_buttons) + { + m_pointer_state = track_pointer::COMPLETED; + return std::make_pair(key, redraw); + } + else + { + m_pointer_state = track_pointer::IDLE; + } + } + + if (IPT_INVALID != key) + return std::make_pair(key, redraw); + } + + // ignore altogether if menu hasn't been drawn or flags say so + if (!m_items_drawn || (flags & (PROCESS_CUSTOM_ONLY | PROCESS_ONLYCHAR))) + { + if (uievt.pointer_pressed) + { + if (track_pointer::IDLE == m_pointer_state) + m_pointer_state = track_pointer::IGNORED; + } + else if (!uievt.pointer_buttons) + { + if ((track_pointer::IGNORED == m_pointer_state) || (track_pointer::COMPLETED == m_pointer_state)) + m_pointer_state = track_pointer::IDLE; + } + return std::make_pair(IPT_INVALID, false); + } + + switch (m_pointer_state) + { + case track_pointer::IDLE: + // ignore anything other than left click for now + if ((uievt.pointer_pressed & 0x01) && !(uievt.pointer_buttons & ~u32(0x1))) + return handle_primary_down(flags, uievt); + else if (uievt.pointer_pressed) + m_pointer_state = track_pointer::IGNORED; + break; + + case track_pointer::IGNORED: + case track_pointer::COMPLETED: + case track_pointer::CUSTOM: + std::abort(); // won't get here - handled earlier + + case track_pointer::TRACK_LINE: + { + auto const result(update_line_click(uievt)); + + // treat anything else being pressed as cancelling the click sequence + if (uievt.pointer_buttons & ~u32(0x01)) + m_pointer_state = track_pointer::COMPLETED; + else if (!uievt.pointer_buttons) + m_pointer_state = track_pointer::IDLE; + + return result; + } + + case track_pointer::SCROLL: + { + bool const redraw(update_drag_scroll(uievt)); + + // treat anything else being pressed as cancelling the drag + if (uievt.pointer_buttons & ~u32(0x01)) + m_pointer_state = track_pointer::COMPLETED; + else if (!uievt.pointer_buttons) + m_pointer_state = track_pointer::IDLE; + + return std::make_pair(IPT_INVALID, redraw); + } + + case track_pointer::ADJUST: + { + auto const result(update_drag_adjust(uievt)); + + // treat anything else being pressed as cancelling the drag + if (uievt.pointer_buttons & ~u32(0x01)) + m_pointer_state = track_pointer::COMPLETED; + else if (!uievt.pointer_buttons) + m_pointer_state = track_pointer::IDLE; + + return result; + } + } + + return std::make_pair(IPT_INVALID, false); +} + + +//------------------------------------------------- +// handle_pointer_leave - handle a pointer +// leaving the window +//------------------------------------------------- + +std::pair menu::handle_pointer_leave(uint32_t flags, ui_event const &uievt) +{ + // ignore pointer input in windows other than the one that displays the UI + render_target &target(machine().render().ui_target()); + auto const [ours, changed] = m_global_state.use_pointer(target, container(), uievt); + assert(!changed); + if (!ours) + return std::make_pair(IPT_INVALID, false); + + int key(IPT_INVALID); + bool redraw(false); + switch (m_pointer_state) + { + case track_pointer::IDLE: + case track_pointer::CUSTOM: + std::tie(key, std::ignore, redraw) = custom_pointer_updated(changed, uievt); + break; + + case track_pointer::IGNORED: + case track_pointer::COMPLETED: + break; // nothing to do + + case track_pointer::TRACK_LINE: + std::tie(key, redraw) = update_line_click(uievt); + break; + + case track_pointer::SCROLL: + redraw = update_drag_scroll(uievt); + break; + + case track_pointer::ADJUST: + std::tie(key, redraw) = update_drag_adjust(uievt); + break; + } + + m_pointer_state = track_pointer::IDLE; + return std::make_pair(key, redraw); +} + + +//------------------------------------------------- +// handle_pointer_abort - handle a pointer +// leaving in an abnormal way +//------------------------------------------------- + +std::pair menu::handle_pointer_abort(uint32_t flags, ui_event const &uievt) +{ + // ignore pointer input in windows other than the one that displays the UI + render_target &target(machine().render().ui_target()); + auto const [ours, changed] = m_global_state.use_pointer(target, container(), uievt); + assert(!changed); + if (!ours) + return std::make_pair(IPT_INVALID, false); + + int key(IPT_INVALID); + bool redraw(false); + if (track_pointer::CUSTOM == m_pointer_state) + std::tie(key, std::ignore, redraw) = custom_pointer_updated(false, uievt); + else if (track_pointer::TRACK_LINE == m_pointer_state) + redraw = true; + m_pointer_state = track_pointer::IDLE; + return std::make_pair(key, redraw); +} + + +//------------------------------------------------- +// handle_primary_down - handle the primary +// action for a pointer device +//------------------------------------------------- + +std::pair menu::handle_primary_down(uint32_t flags, ui_event const &uievt) +{ + // we handle touch differently to mouse or pen + bool const is_touch(ui_event::pointer::TOUCH == uievt.pointer_type); + auto const [x, y] = pointer_location(); // FIXME: need starting location for multi-click actions + + // check increase/decrease arrows first + // FIXME: should repeat if appropriate + if (!is_touch && (y >= m_adjust_top) && (y < m_adjust_bottom)) + { + if ((x >= m_decrease_left) && (x < (m_decrease_left + lr_arrow_width()))) + { + m_pointer_state = track_pointer::COMPLETED; + return std::make_pair(IPT_UI_LEFT, false); + } + else if ((x >= m_increase_left) && (x < (m_increase_left + lr_arrow_width()))) + { + m_pointer_state = track_pointer::COMPLETED; + return std::make_pair(IPT_UI_RIGHT, false); + } + } + + // work out if we’re pointing at an item + if ((x < m_items_left) || (x >= m_items_right) || (y < m_items_top) || (y >= (m_items_top + (float(m_visible_lines) * line_height())))) + { + m_pointer_state = track_pointer::IGNORED; + return std::make_pair(IPT_INVALID, false); + } + auto const lineno(int((y - m_items_top) / line_height())); + assert(lineno >= 0); + assert(lineno < m_visible_lines); + + // map to an action + if (!lineno && m_show_up_arrow) + { + // scroll up + assert(0 < top_line); + --top_line; + force_visible_selection(); + if (top_line) + { + m_pointer_state = track_pointer::TRACK_LINE; + m_pointer_down = std::make_pair(x, y); + m_pointer_updated = m_pointer_down; + m_pointer_line = lineno; + m_pointer_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + } + else + { + m_pointer_state = track_pointer::COMPLETED; + } + return std::make_pair(IPT_INVALID, true); + } + else if ((lineno == (m_visible_lines - 1)) && m_show_down_arrow) + { + // scroll down + assert(m_items.size() > (top_line + m_visible_lines)); + ++top_line; + force_visible_selection(); + if (m_items.size() > (top_line + m_visible_lines)) + { + m_pointer_state = track_pointer::TRACK_LINE; + m_pointer_down = std::make_pair(x, y); + m_pointer_updated = m_pointer_down; + m_pointer_line = lineno; + m_pointer_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + } + else + { + m_pointer_state = track_pointer::COMPLETED; + } + return std::make_pair(IPT_INVALID, true); + } + else + { + m_pointer_state = track_pointer::TRACK_LINE; + m_pointer_down = std::make_pair(x, y); + m_pointer_updated = m_pointer_down; + m_pointer_line = lineno; + + int const itemno(lineno + top_line); + assert(itemno >= 0); + assert(itemno < m_items.size()); + return std::make_pair(IPT_INVALID, is_selectable(m_items[itemno])); + } + + // nothing to do + m_pointer_state = track_pointer::IGNORED; + return std::make_pair(IPT_INVALID, false); +} + + +//------------------------------------------------- +// update_line_click - track pointer after +// clicking a menu line +//------------------------------------------------- + +std::pair menu::update_line_click(ui_event const &uievt) +{ + assert(track_pointer::TRACK_LINE == m_pointer_state); + assert((uievt.pointer_buttons | uievt.pointer_released) & 0x01); + + // arrows should scroll while held + if ((!m_pointer_line && m_show_up_arrow) || ((m_pointer_line == (m_visible_lines - 1)) && m_show_down_arrow)) + { + // check for re-entry + bool redraw(false); + auto const [x, y] = pointer_location(); + float const linetop(m_items_top + (float(m_pointer_line) * line_height())); + float const linebottom(m_items_top + (float(m_pointer_line + 1) * line_height())); + bool const reentered(reentered_rect(m_pointer_updated.first, m_pointer_updated.second, x, y, m_items_left, linetop, m_items_right, linebottom)); + if (reentered) + { + auto const now(std::chrono::steady_clock::now()); + if (now >= m_pointer_repeat) + { + if (!m_pointer_line) + { + // scroll up + assert(0 < top_line); + --top_line; + if (!top_line) + m_pointer_state = track_pointer::COMPLETED; + } + else + { + // scroll down + assert(m_items.size() > (top_line + m_visible_lines)); + ++top_line; + if (m_items.size() == (top_line + m_visible_lines)) + m_pointer_state = track_pointer::COMPLETED; + } + force_visible_selection(); + redraw = true; + m_pointer_repeat = now + std::chrono::milliseconds(100); + } + } + + // keep the pointer location where we updated + m_pointer_updated = std::make_pair(x, y); + return std::make_pair(IPT_INVALID, redraw); + } + + // check for conversion of a tap to a finger drag + auto const drag_result(check_touch_drag(uievt)); + if (track_pointer::TRACK_LINE != m_pointer_state) + return drag_result; + + // only take action if the primary button was released + if (!(uievt.pointer_released & 0x01)) + return std::make_pair(IPT_INVALID, false); + + // nothing to do if the item isn't selectable + int const itemno = m_pointer_line + top_line; + assert(itemno >= 0); + assert(itemno < m_items.size()); + if (!is_selectable(m_items[itemno])) + return std::make_pair(IPT_INVALID, false); + + // treat multi-click actions as not moving, otherwise check that pointer is still over the line + if (0 >= uievt.pointer_clicks) + { + auto const [x, y] = pointer_location(); + if ((x < m_items_left) || (x >= m_items_right) || (int((y - m_items_top) / line_height()) != m_pointer_line)) + return std::make_pair(IPT_INVALID, true); + } + + // anything other than a double-click just selects the item + m_selected = itemno; + if (2 != uievt.pointer_clicks) + return std::make_pair(IPT_INVALID, true); + + // activate regular items by simulating UI Select + if (!is_last_selected() || !m_needs_prev_menu_item) + return std::make_pair(IPT_UI_SELECT, true); + + // handle the magic final item that dismisses the menu + stack_pop(); + if (is_special_main_menu()) + machine().schedule_exit(); + return std::make_pair(IPT_UI_BACK, true); +} + + +//------------------------------------------------- +// update_drag_scroll - update menu position in +// response to a touch drag +//------------------------------------------------- + +bool menu::update_drag_scroll(ui_event const &uievt) +{ + assert(track_pointer::SCROLL == m_pointer_state); + assert((uievt.pointer_buttons | uievt.pointer_released) & 0x01); + + // get target location + int const newtop(drag_scroll( + pointer_location().second, m_pointer_down.second, m_pointer_updated.second, -line_height(), + m_pointer_line, 0, int(m_items.size() - m_visible_lines))); + if (newtop == top_line) + return false; + + // scroll and move the selection if necessary to keep it in the visible range + top_line = newtop; + force_visible_selection(); + return true; +} + + +//------------------------------------------------- +// update_drag_adjust - adjust value on +// horizontal drag +//------------------------------------------------- + +std::pair menu::update_drag_adjust(ui_event const &uievt) +{ + assert(track_pointer::ADJUST == m_pointer_state); + assert((uievt.pointer_buttons | uievt.pointer_released) & 0x01); + + // this is ugly because adjustment is implemented by faking keystrokes - can't give a count/distance + + // set thresholds depending on the direction for hysteresis + int const target(drag_scroll( + pointer_location().first, m_pointer_updated.first, m_pointer_updated.first, line_height() * x_aspect(), + 0, std::numeric_limits::min(), std::numeric_limits::max())); + + // ensure the item under the pointer is selected and adjustable + if ((top_line + m_pointer_line) == m_selected) + { + if (0 < target) + { + if (m_items[m_selected].flags() & FLAG_RIGHT_ARROW) + return std::make_pair(IPT_UI_RIGHT, true); + } + else if (0 > target) + { + if (m_items[m_selected].flags() & FLAG_LEFT_ARROW) + return std::make_pair(IPT_UI_LEFT, true); + } + } + + // looks like it wasn't to be + return std::make_pair(IPT_INVALID, false); +} + + +//------------------------------------------------- +// check_touch_drag - check for conversion of a +// touch to a scroll or adjust slide +//------------------------------------------------- + +std::pair menu::check_touch_drag(ui_event const &uievt) +{ + // we handle touch differently to mouse or pen + if (ui_event::pointer::TOUCH != uievt.pointer_type) + return std::make_pair(IPT_INVALID, false); + + // check distances + auto const [x, y] = pointer_location(); + auto const [h, v] = check_drag_conversion(x, y, m_pointer_down.first, m_pointer_down.second, line_height()); + if (h) + { + // only the selected line can be adjusted + if ((top_line + m_pointer_line) == m_selected) + { + m_pointer_state = track_pointer::ADJUST; + return update_drag_adjust(uievt); + } + else + { + m_pointer_state = track_pointer::COMPLETED; + } + } + else if (v) + { + m_pointer_state = track_pointer::SCROLL; + m_pointer_line = top_line; + return std::make_pair(IPT_INVALID, update_drag_scroll(uievt)); + } + + // no update needed + return std::make_pair(IPT_INVALID, false); +} + + +//------------------------------------------------- +// handle_keys - generically handle +// keys for a menu +//------------------------------------------------- + +bool menu::handle_keys(uint32_t flags, int &iptkey) +{ + // bail if no items (happens if event handling triggered an item reset) + if (m_items.empty()) + return false; + + bool const ignorepause = (flags & PROCESS_IGNOREPAUSE) || stack_has_special_main_menu(); + + // if we hit select, return true or pop the stack, depending on the item + if (exclusive_input_pressed(iptkey, IPT_UI_SELECT, 0)) + { + if (is_last_selected() && m_needs_prev_menu_item) + { + iptkey = IPT_INVALID; + stack_pop(); + if (is_special_main_menu()) + machine().schedule_exit(); + } + return false; + } + + // UI configure hides the menus + if (!(flags & PROCESS_NOKEYS) && exclusive_input_pressed(iptkey, IPT_UI_MENU, 0) && !m_global_state.stack_has_special_main_menu()) + { + if (is_one_shot()) + stack_pop(); + else + m_global_state.hide_menu(); + return true; + } + + // bail out + if (flags & PROCESS_ONLYCHAR) + return false; + + // hitting back also pops the stack + if (exclusive_input_pressed(iptkey, IPT_UI_BACK, 0)) + { + if (!custom_ui_back()) + { + iptkey = IPT_INVALID; + stack_pop(); + if (is_special_main_menu()) + machine().schedule_exit(); + } + return false; + } + + // validate the current selection + validate_selection(1); + + // swallow left/right keys if they are not appropriate bool const ignoreleft = !(flags & PROCESS_LR_ALWAYS) && !(selected_item().flags() & FLAG_LEFT_ARROW); bool const ignoreright = !(flags & PROCESS_LR_ALWAYS) && !(selected_item().flags() & FLAG_RIGHT_ARROW); // accept left/right/prev/next keys as-is with repeat if appropriate if (!ignoreleft && exclusive_input_pressed(iptkey, IPT_UI_LEFT, (flags & PROCESS_LR_REPEAT) ? 6 : 0)) - return; + return false; if (!ignoreright && exclusive_input_pressed(iptkey, IPT_UI_RIGHT, (flags & PROCESS_LR_REPEAT) ? 6 : 0)) - return; + return false; + + // keep track of whether we changed anything + bool updated(false); // up backs up by one item if (exclusive_input_pressed(iptkey, IPT_UI_UP, 6)) { if (flags & PROCESS_CUSTOM_NAV) { - return; + return updated; } else if (is_first_selected()) { @@ -1105,6 +1716,7 @@ void menu::handle_keys(uint32_t flags, int &iptkey) top_line -= (m_selected <= top_line && top_line != 0); if (m_selected <= top_line && m_visible_items != m_visible_lines) top_line--; + updated = true; } // down advances by one item @@ -1112,7 +1724,7 @@ void menu::handle_keys(uint32_t flags, int &iptkey) { if (flags & PROCESS_CUSTOM_NAV) { - return; + return updated; } else if (is_last_selected()) { @@ -1126,47 +1738,52 @@ void menu::handle_keys(uint32_t flags, int &iptkey) top_line += (m_selected >= top_line + m_visible_items + (top_line != 0)); if (m_selected >= (top_line + m_visible_items + (top_line != 0))) top_line++; + updated = true; } // page up backs up by m_visible_items if (exclusive_input_pressed(iptkey, IPT_UI_PAGE_UP, 6)) { if (flags & PROCESS_CUSTOM_NAV) - return; + return updated; m_selected -= m_visible_items; top_line -= m_visible_items - (last_item_visible() ? 1 : 0); if (m_selected < 0) m_selected = 0; validate_selection(1); + updated = true; } // page down advances by m_visible_items if (exclusive_input_pressed(iptkey, IPT_UI_PAGE_DOWN, 6)) { if (flags & PROCESS_CUSTOM_NAV) - return; + return updated; m_selected += m_visible_lines - 2 + is_first_selected(); top_line += m_visible_lines - 2; if (m_selected > m_items.size() - 1) m_selected = m_items.size() - 1; validate_selection(-1); + updated = true; } // home goes to the start if (exclusive_input_pressed(iptkey, IPT_UI_HOME, 0)) { if (flags & PROCESS_CUSTOM_NAV) - return; + return updated; select_first_item(); + updated = true; } // end goes to the last if (exclusive_input_pressed(iptkey, IPT_UI_END, 0)) { if (flags & PROCESS_CUSTOM_NAV) - return; + return updated; select_last_item(); + updated = true; } // pause enables/disables pause @@ -1202,6 +1819,39 @@ void menu::handle_keys(uint32_t flags, int &iptkey) break; } } + return updated; +} + + +//------------------------------------------------- +// default handler implementations +//------------------------------------------------- + +bool menu::custom_ui_back() +{ + return false; +} + +std::tuple menu::custom_pointer_updated(bool changed, ui_event const &uievt) +{ + return std::make_tuple(IPT_INVALID, false, false); +} + +bool menu::custom_mouse_scroll(int lines) +{ + return false; +} + +void menu::menu_activated() +{ +} + +void menu::menu_deactivated() +{ +} + +void menu::menu_dismissed() +{ } @@ -1249,6 +1899,85 @@ void menu::validate_selection(int scandir) } +//------------------------------------------------- +// check_metrics - recompute metrics if target +// geometry has changed +//------------------------------------------------- + +bool menu::check_metrics() +{ + render_manager &render(machine().render()); + render_target &target(render.ui_target()); + std::pair const uisize(target.width(), target.height()); + float const aspect = render.ui_aspect(&container()); + if ((uisize == m_last_size) && (aspect == m_last_aspect)) + return false; + + m_last_size = uisize; + m_last_aspect = aspect; + recompute_metrics(uisize.first, uisize.second, aspect); + return true; +} + + +//------------------------------------------------- +// do_rebuild - get the subclass to populate +// the menu items +//------------------------------------------------- + +bool menu::do_rebuild() +{ + if (!m_items.empty()) + return false; + + m_rebuilding = true; + try + { + // add an item to return - this is a really hacky way of doing this + if (m_needs_prev_menu_item) + item_append(_("Return to Previous Menu"), 0, nullptr); + + // let implementation add other items + populate(); + } + catch (...) + { + m_items.clear(); + m_rebuilding = false; + throw; + } + m_rebuilding = false; + return true; +} + + +//------------------------------------------------- +// force_visible_selection - if the selected item +// is not visible, move the selection it it's +// within the visible portion of the menu +//------------------------------------------------- + +void menu::force_visible_selection() +{ + int const first(top_line ? (top_line + 1) : 0); + int const last(top_line + m_visible_lines - ((m_items.size() > (top_line + m_visible_lines)) ? 1 : 0)); + if (first > m_selected) + { + m_selected = first; + while (!is_selectable(m_items[m_selected])) + ++m_selected; + assert(last > m_selected); + } + else if (last <= m_selected) + { + m_selected = last - 1; + while (!is_selectable(m_items[m_selected])) + --m_selected; + assert(first <= m_selected); + } +} + + /*************************************************************************** MENU STACK MANAGEMENT @@ -1262,43 +1991,74 @@ bool menu::do_handle() machine().osd().check_osd_inputs(); // recompute metrics if necessary - render_manager &render(machine().render()); - render_target &target(render.ui_target()); - std::pair const uisize(target.width(), target.height()); - float const aspect = render.ui_aspect(&container()); - if ((uisize != m_last_size) || (aspect != m_last_aspect)) - { - m_last_size = uisize; - m_last_aspect = aspect; - recompute_metrics(uisize.first, uisize.second, aspect); + if (check_metrics()) need_update = true; - } - if (m_items.empty()) - { - m_rebuilding = true; - try - { - // add an item to return - this is a really hacky way of doing this - if (m_needs_prev_menu_item) - item_append(_("Return to Previous Menu"), 0, nullptr); + // get the implementation to rebuild the list of items if necessary + if (do_rebuild()) + need_update = true; + validate_selection(1); - // let implementation add other items - populate(); + // reset the event + std::optional result; + result.emplace(); + result->itemref = nullptr; + result->item = nullptr; + result->iptkey = IPT_INVALID; + + // process input + uint32_t flags(m_process_flags); + if (!(flags & (PROCESS_NOKEYS | PROCESS_NOINPUT))) + { + // read events + if (handle_events(flags, *result)) need_update = true; - } - catch (...) + + switch (m_pointer_state) { - m_items.clear(); - m_rebuilding = false; - throw; + case track_pointer::IDLE: + case track_pointer::IGNORED: + // handle keys if we don't already have an event and we aren't tracking a pointer action + if ((IPT_INVALID == result->iptkey) && handle_keys(flags, result->iptkey)) + need_update = true; + break; + default: + // ignore keys pressed while tracking a pointer action + for (int code = IPT_UI_FIRST + 1; IPT_UI_LAST > code; ++code) + machine().ui_input().pressed(code); + break; } - m_rebuilding = false; } - auto [eventptr, changed] = process(); - need_update = need_update || changed; - need_update = handle(eventptr) || need_update; + // deal with stack push/pop and rebuild + if (!is_active()) + return false; + if (do_rebuild()) + { + validate_selection(1); + need_update = true; + } + + // update the selected item in the event and let the implementation handle it + if ((result->iptkey != IPT_INVALID) && selection_valid()) + { + result->itemref = get_selection_ref(); + result->item = &m_items[m_selected]; + } + else + { + result.reset(); + } + need_update = handle(result ? &*result : nullptr) || need_update; + + // the implementation had another chance to push/pop or rebuild + if (!is_active()) + return false; + if (do_rebuild()) + { + validate_selection(1); + return true; + } return need_update; } @@ -1328,7 +2088,7 @@ delegate menu::get_ui_handler(mame_ui_manager &mu text_layout menu::create_layout(float width, text_layout::text_justify justify, text_layout::word_wrapping wrap) { - return text_layout(*ui().get_font(), line_height() * m_last_aspect, line_height(), width, justify, wrap); + return text_layout(*ui().get_font(), line_height() * x_aspect(), line_height(), width, justify, wrap); } diff --git a/src/frontend/mame/ui/menu.h b/src/frontend/mame/ui/menu.h index d383e31ab52fc..791432482b5d6 100644 --- a/src/frontend/mame/ui/menu.h +++ b/src/frontend/mame/ui/menu.h @@ -19,16 +19,29 @@ #include "language.h" #include "render.h" +#include "interface/uievents.h" + +#include +#include +#include #include #include #include #include #include #include +#include #include #include +/*************************************************************************** + FORWARD DECLARATIONS +***************************************************************************/ + +struct ui_event; + + namespace ui { /*************************************************************************** @@ -132,11 +145,10 @@ class menu // menu-related events struct event { - void *itemref; // reference for the selected item or nullptr - menu_item *item; // selected item or nullptr - int iptkey; // one of the IPT_* values from inptport.h - char32_t unichar; // unicode character if iptkey == IPT_SPECIAL - render_bounds mouse; // mouse position if iptkey == IPT_CUSTOM + void *itemref; // reference for the selected item or nullptr + menu_item *item; // selected item or nullptr + int iptkey; // one of the IPT_* values from inpttype.h + char32_t unichar; // unicode character if iptkey == IPT_SPECIAL }; menu(mame_ui_manager &mui, render_container &container); @@ -181,10 +193,6 @@ class menu void select_first_item(); void select_last_item(); - int hover() const { return m_hover; } - void set_hover(int index) { m_hover = index; } - void clear_hover() { m_hover = m_items.size() + 1; } - // scroll position control void set_top_line(int index) { top_line = (0 < index) ? (index - 1) : index; } void centre_selection() { top_line = m_selected - (m_visible_lines / 2); } @@ -196,6 +204,8 @@ class menu float get_customtop() const { return m_customtop; } float get_custombottom() const { return m_custombottom; } + std::pair target_size() const { return m_last_size; } + float x_aspect() const { return m_last_aspect; } float line_height() const { return m_line_height; } float gutter_width() const { return m_gutter_width; } float tb_border() const { return m_tb_border; } @@ -281,7 +291,7 @@ class menu std::string_view const &line(*it); if (!line.empty()) { - text_layout layout(*ui().get_font(), text_size * m_last_aspect, text_size, 1.0, justify, wrap); + text_layout layout(*ui().get_font(), text_size * x_aspect(), text_size, 1.0, justify, wrap); layout.add_text(line, rgb_t::white(), rgb_t::black()); maxwidth = (std::max)(layout.actual_width(), maxwidth); } @@ -328,36 +338,32 @@ class menu // draw additional menu content virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect); - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2); - - // map mouse to menu coordinates - void map_mouse(); + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2); - // clear the mouse position - void ignore_mouse(); + // access to pointer state + bool have_pointer() const noexcept { return m_global_state.have_pointer(); } + bool pointer_idle() const noexcept { return (track_pointer::IDLE == m_pointer_state) && have_pointer(); } + bool pointer_in_rect(float x0, float y0, float x1, float y1) const noexcept { return m_global_state.pointer_in_rect(x0, y0, x1, y1); } + std::pair pointer_location() const noexcept { return m_global_state.pointer_location(); } + osd::ui_event_handler::pointer pointer_type() const noexcept { return m_global_state.pointer_type(); } - bool is_mouse_hit() const { return m_mouse_hit; } // is mouse pointer inside menu's render container? - float get_mouse_x() const { return m_mouse_x; } // mouse x location in menu coordinates - float get_mouse_y() const { return m_mouse_y; } // mouse y location in menu coordinates - - // mouse hit test - checks whether mouse_x is in [x0, x1) and mouse_y is in [y0, y1) - bool mouse_in_rect(float x0, float y0, float x1, float y1) const - { - return m_mouse_hit && (m_mouse_x >= x0) && (m_mouse_x < x1) && (m_mouse_y >= y0) && (m_mouse_y < y1); - } + // derived classes that override handle_events need to call these for pointer events + std::pair handle_pointer_update(uint32_t flags, ui_event const &uievt); + std::pair handle_pointer_leave(uint32_t flags, ui_event const &uievt); + std::pair handle_pointer_abort(uint32_t flags, ui_event const &uievt); // overridable event handling void set_process_flags(uint32_t flags) { m_process_flags = flags; } - virtual void handle_events(uint32_t flags, event &ev); - virtual void handle_keys(uint32_t flags, int &iptkey); - virtual bool custom_ui_back() { return false; } - virtual bool custom_mouse_down() { return false; } - virtual bool custom_mouse_scroll(int lines) { return false; } + virtual bool handle_events(uint32_t flags, event &ev); + virtual bool handle_keys(uint32_t flags, int &iptkey); + virtual bool custom_ui_back(); + virtual std::tuple custom_pointer_updated(bool changed, ui_event const &uievt); + virtual bool custom_mouse_scroll(int lines); // event notifications - virtual void menu_activated() { } - virtual void menu_deactivated() { } - virtual void menu_dismissed() { } + virtual void menu_activated(); + virtual void menu_deactivated(); + virtual void menu_dismissed(); static bool is_selectable(menu_item const &item) { @@ -371,7 +377,47 @@ class menu return ((actual > min) ? FLAG_LEFT_ARROW : 0) | ((actual < max) ? FLAG_RIGHT_ARROW : 0); } + static bool reentered_rect(float x0, float y0, float x1, float y1, float l, float t, float r, float b) + { + return + ((x0 < l) || (x0 >= r) || (y0 < t) || (y0 >= b)) && + ((x1 >= l) && (x1 < r) && (y1 >= t) && (y1 < b)); + } + + std::pair check_drag_conversion(float x, float y, float x_base, float y_base, float threshold) const + { + float const dx(std::abs((x - x_base) / x_aspect())); + float const dy(std::abs(y - y_base)); + if ((dx > dy) && (dx >= threshold)) + return std::make_pair(true, false); + else if ((dy >= dx) && (dy > threshold)) + return std::make_pair(false, true); + else + return std::make_pair(false, false); + } + + template + static T drag_scroll(float location, float base, float &last, float unit, T start, T min, T max) + { + // set thresholds depending on the direction for hysteresis and clamp to valid range + T const target((location - (std::abs(unit) * ((location > last) ? 0.3F : -0.3F)) - base) / unit); + last = base + (float(target) * unit); + return std::clamp(start + target, min, max); + } + private: + // pointer tracking state + enum class track_pointer + { + IDLE, + IGNORED, + COMPLETED, + CUSTOM, + TRACK_LINE, + SCROLL, + ADJUST + }; + class global_state : public widgets_manager { public: @@ -396,17 +442,43 @@ class menu uint32_t ui_handler(render_container &container); + bool have_pointer() const noexcept + { + return 0 <= m_current_pointer; + } + bool pointer_in_rect(float x0, float y0, float x1, float y1) const noexcept + { + return (m_pointer_x >= x0) && (m_pointer_x < x1) && (m_pointer_y >= y0) && (m_pointer_y < y1); + } + std::pair pointer_location() const noexcept + { + return std::make_pair(m_pointer_x, m_pointer_y); + } + osd::ui_event_handler::pointer pointer_type() const noexcept + { + return m_pointer_type; + } + + std::pair use_pointer(render_target &target, render_container &container, ui_event const &event); + protected: - mame_ui_manager &m_ui; + mame_ui_manager &m_ui; private: - bitmap_ptr m_bgrnd_bitmap; - texture_ptr m_bgrnd_texture; + bitmap_ptr m_bgrnd_bitmap; + texture_ptr m_bgrnd_texture; - std::unique_ptr m_stack; - std::unique_ptr m_free; + std::unique_ptr m_stack; + std::unique_ptr m_free; - bool m_hide; + bool m_hide; + + s32 m_current_pointer; // current active pointer ID or -1 if none + osd::ui_event_handler::pointer m_pointer_type; // current pointer type + u32 m_pointer_buttons; // depressed buttons for current pointer + float m_pointer_x; + float m_pointer_y; + bool m_pointer_hit; }; // this is to satisfy the std::any requirement that objects be copyable @@ -417,8 +489,15 @@ class menu global_state_wrapper(global_state_wrapper const &that) : global_state(that.m_ui) { } }; - // process a menu, drawing it and returning any interesting events - std::pair process(); + // process a menu, returning any interesting events + std::pair handle_primary_down(uint32_t flags, ui_event const &uievt); + std::pair update_line_click(ui_event const &uievt); + bool update_drag_scroll(ui_event const &uievt); + std::pair update_drag_adjust(ui_event const &uievt); + std::pair check_touch_drag(ui_event const &uievt); + + // drawing the menu + void do_draw_menu(); virtual void draw(uint32_t flags); // request the specific handling of the game selection main menu @@ -432,8 +511,11 @@ class menu void extra_text_draw_box(float origx1, float origx2, float origy, float yspan, std::string_view text, int direction); + bool check_metrics(); + bool do_rebuild(); bool first_item_visible() const { return top_line <= 0; } bool last_item_visible() const { return (top_line + m_visible_lines) >= m_items.size(); } + void force_visible_selection(); // push a new menu onto the stack static void stack_push(std::unique_ptr &&menu) { menu->m_global_state.stack_push(std::move(menu)); } @@ -464,26 +546,35 @@ class menu float m_lr_arrow_width; float m_ud_arrow_width; + float m_items_left; // left of the area where the items are drawn + float m_items_right; // right of the area where the items are drawn + float m_items_top; // top of the area where the items are drawn + float m_adjust_top; // top of the "increase"/"decrease" arrows + float m_adjust_bottom; // bottom of the "increase"/"decrease" arrows + float m_decrease_left; // left of the "decrease" arrow + float m_increase_left; // left of the "increase" arrow + bool m_show_up_arrow; // are we showing the "scroll up" arrow? + bool m_show_down_arrow; // are we showing the "scroll down" arrow? + bool m_items_drawn; // have we drawn the items at least once? + + track_pointer m_pointer_state; // tracking state for currently active pointer + std::pair m_pointer_down; // start location of tracked pointer action + std::pair m_pointer_updated; // location where pointer tracking was updated + int m_pointer_line; // the line we're tracking pointer motion in + std::chrono::steady_clock::time_point m_pointer_repeat; + uint32_t m_process_flags; // event processing options int m_selected; // which item is selected - int m_hover; // which item is being hovered over bool m_special_main_menu; // true if no real emulation running under the menu bool m_one_shot; // true for menus outside the normal stack bool m_needs_prev_menu_item; // true to automatically create item to dismiss menu bool m_active; // whether the menu is currently visible and topmost - event m_event; // the UI event that occurred - float m_customtop; // amount of extra height to add at the top float m_custombottom; // amount of extra height to add at the bottom int m_resetpos; // item index to select after repopulating void *m_resetref; // item reference value to select after repopulating - - bool m_mouse_hit; - bool m_mouse_button; - float m_mouse_x; - float m_mouse_y; }; diff --git a/src/frontend/mame/ui/miscmenu.cpp b/src/frontend/mame/ui/miscmenu.cpp index 8ed4e64fac3d8..df5754a380e73 100644 --- a/src/frontend/mame/ui/miscmenu.cpp +++ b/src/frontend/mame/ui/miscmenu.cpp @@ -311,7 +311,7 @@ bool menu_bookkeeping::handle(event const *ev) } else { - return ev && handle_key(ev->iptkey); + return menu_textbox::handle(ev); } } diff --git a/src/frontend/mame/ui/selector.cpp b/src/frontend/mame/ui/selector.cpp index e21026f6d44f2..53f68006c048a 100644 --- a/src/frontend/mame/ui/selector.cpp +++ b/src/frontend/mame/ui/selector.cpp @@ -143,7 +143,7 @@ void menu_selector::recompute_metrics(uint32_t width, uint32_t height, float asp // perform our special rendering //------------------------------------------------- -void menu_selector::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_selector::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { // get the text for 'UI Select' std::string const tempbuf[] = { util::string_format(_("menu-selector", "Double-click or press %1$s to select"), ui().get_general_input_setting(IPT_UI_SELECT)) }; diff --git a/src/frontend/mame/ui/selector.h b/src/frontend/mame/ui/selector.h index 4b8043a990a07..58b93c5185a45 100644 --- a/src/frontend/mame/ui/selector.h +++ b/src/frontend/mame/ui/selector.h @@ -39,7 +39,7 @@ class menu_selector : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual bool custom_ui_back() override { return !m_search.empty(); } private: diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp index f9b2c7025039f..e9cc85e9a43a4 100644 --- a/src/frontend/mame/ui/selgame.cpp +++ b/src/frontend/mame/ui/selgame.cpp @@ -223,38 +223,6 @@ bool menu_select_game::handle(event const *ev) } else switch (ev->iptkey) { - case IPT_UI_UP: - if ((get_focus() == focused_menu::LEFT) && (machine_filter::FIRST < m_filter_highlight)) - { - --m_filter_highlight; - changed = true; - } - break; - - case IPT_UI_DOWN: - if ((get_focus() == focused_menu::LEFT) && (machine_filter::LAST > m_filter_highlight)) - { - m_filter_highlight++; - changed = true; - } - break; - - case IPT_UI_HOME: - if (get_focus() == focused_menu::LEFT) - { - m_filter_highlight = machine_filter::FIRST; - changed = true; - } - break; - - case IPT_UI_END: - if (get_focus() == focused_menu::LEFT) - { - m_filter_highlight = machine_filter::LAST; - changed = true; - } - break; - case IPT_UI_EXPORT: inkey_export(); break; @@ -278,46 +246,6 @@ bool menu_select_game::handle(event const *ev) } break; - case IPT_CUSTOM: - // handle IPT_CUSTOM (mouse right click) - if (!m_populated_favorites) - { - menu::stack_push( - ui(), - container(), - *reinterpret_cast(m_prev_selected), - nullptr); - } - else - { - ui_software_info *sw = reinterpret_cast(m_prev_selected); - ui_system_info const &sys = m_persistent_data.systems()[driver_list::find(sw->driver->name)]; - menu::stack_push( - ui(), - container(), - sys, - [this, empty = sw->startempty] (bool fav, bool changed) - { - if (changed) - reset(empty ? reset_options::SELECT_FIRST : reset_options::REMEMBER_REF); - }); - } - break; - - case IPT_UI_LEFT: - if (right_panel() == RP_IMAGES) - changed = previous_image_view(); // Images - else if (right_panel() == RP_INFOS) - changed = change_info_pane(-1); // Infos - break; - - case IPT_UI_RIGHT: - if (right_panel() == RP_IMAGES) - changed = next_image_view(); // Images - else if (right_panel() == RP_INFOS) - changed = change_info_pane(1); // Infos - break; - case IPT_UI_FAVORITES: if (uintptr_t(ev->itemref) > m_skip_main_items) { @@ -356,8 +284,6 @@ bool menu_select_game::handle(event const *ev) } } - // if we're in an error state, overlay an error message - draw_error_text(); return changed; } @@ -800,53 +726,6 @@ bool menu_select_game::isfavorite() const } -//------------------------------------------------- -// change what's displayed in the info box -//------------------------------------------------- - -bool menu_select_game::change_info_pane(int delta) -{ - auto const cap_delta = - [this, &delta] (uint8_t ¤t, uint8_t &total) -> bool - { - if ((0 > delta) && (-delta > current)) - delta = -int(unsigned(current)); - else if ((0 < delta) && ((current + unsigned(delta)) >= total)) - delta = int(unsigned(total - current - 1)); - if (delta) - { - current += delta; - m_topline_datsview = 0; - return true; - } - else - { - return false; - } - }; - ui_system_info const *sys; - ui_software_info const *soft; - get_selection(soft, sys); - if (!m_populated_favorites) - { - if (uintptr_t(sys) > m_skip_main_items) - return cap_delta(ui_globals::curdats_view, ui_globals::curdats_total); - else - return false; - } - else if (uintptr_t(soft) > m_skip_main_items) - { - if (soft->startempty) - return cap_delta(ui_globals::curdats_view, ui_globals::curdats_total); - else - return cap_delta(ui_globals::cur_sw_dats_view, ui_globals::cur_sw_dats_total); - } - else - { - return false; - } -} - //------------------------------------------------- // populate search list //------------------------------------------------- @@ -1083,10 +962,10 @@ void menu_select_game::load_custom_filters() // draw left box //------------------------------------------------- -float menu_select_game::draw_left_panel(float x1, float y1, float x2, float y2) +void menu_select_game::draw_left_panel(u32 flags) { machine_filter_data &filter_data(m_persistent_data.filter_data()); - return menu_select_launch::draw_left_panel(filter_data.get_current_filter_type(), filter_data.get_filters(), x1, y1, x2, y2); + menu_select_launch::draw_left_panel(flags, filter_data.get_current_filter_type(), filter_data.get_filters()); } @@ -1108,6 +987,32 @@ void menu_select_game::get_selection(ui_software_info const *&software, ui_syste } } +void menu_select_game::show_config_menu(int index) +{ + if (!m_populated_favorites) + { + menu::stack_push( + ui(), + container(), + *reinterpret_cast(item(index).ref()), + nullptr); + } + else + { + ui_software_info *sw = reinterpret_cast(item(index).ref()); + ui_system_info const &sys = m_persistent_data.systems()[driver_list::find(sw->driver->name)]; + menu::stack_push( + ui(), + container(), + sys, + [this, empty = sw->startempty] (bool fav, bool changed) + { + if (changed) + reset(empty ? reset_options::SELECT_FIRST : reset_options::REMEMBER_REF); + }); + } +} + void menu_select_game::make_topbox_text(std::string &line0, std::string &line1, std::string &line2) const { line0 = string_format(_("%1$s %2$s ( %3$d / %4$d systems (%5$d BIOS) )"), @@ -1142,30 +1047,29 @@ std::string menu_select_game::make_software_description(ui_software_info const & } -void menu_select_game::filter_selected() +void menu_select_game::filter_selected(int index) { - if ((machine_filter::FIRST <= m_filter_highlight) && (machine_filter::LAST >= m_filter_highlight)) - { - m_persistent_data.filter_data().get_filter(machine_filter::type(m_filter_highlight)).show_ui( - ui(), - container(), - [this] (machine_filter &filter) + assert((machine_filter::FIRST <= index) && (machine_filter::LAST >= index)); + + m_persistent_data.filter_data().get_filter(machine_filter::type(index)).show_ui( + ui(), + container(), + [this] (machine_filter &filter) + { + set_switch_image(); + machine_filter::type const new_type(filter.get_type()); + if (machine_filter::CUSTOM == new_type) { - set_switch_image(); - machine_filter::type const new_type(filter.get_type()); - if (machine_filter::CUSTOM == new_type) + emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); + if (!file.open(util::string_format("custom_%s_filter.ini", emulator_info::get_configname()))) { - emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); - if (!file.open(util::string_format("custom_%s_filter.ini", emulator_info::get_configname()))) - { - filter.save_ini(file, 0); - file.close(); - } + filter.save_ini(file, 0); + file.close(); } - m_persistent_data.filter_data().set_current_filter_type(new_type); - reset(reset_options::REMEMBER_REF); - }); - } + } + m_persistent_data.filter_data().set_current_filter_type(new_type); + reset(reset_options::REMEMBER_REF); + }); } } // namespace ui diff --git a/src/frontend/mame/ui/selgame.h b/src/frontend/mame/ui/selgame.h index 4aae7261687ef..8a9037a886423 100644 --- a/src/frontend/mame/ui/selgame.h +++ b/src/frontend/mame/ui/selgame.h @@ -62,11 +62,12 @@ class menu_select_game : public menu_select_launch virtual bool handle(event const *ev) override; // drawing - virtual float draw_left_panel(float x1, float y1, float x2, float y2) override; + virtual void draw_left_panel(u32 flags) override; virtual render_texture *get_icon_texture(int linenum, void *selectedref) override; // get selected software and/or driver virtual void get_selection(ui_software_info const *&software, ui_system_info const *&system) const override; + virtual void show_config_menu(int index) override; virtual bool accept_search() const override { return !isfavorite(); } // text for main top/bottom panels @@ -74,14 +75,11 @@ class menu_select_game : public menu_select_launch virtual std::string make_software_description(ui_software_info const &software, ui_system_info const *system) const override; // filter navigation - virtual void filter_selected() override; + virtual void filter_selected(int index) override; // toolbar virtual void inkey_export() override; - // internal methods - bool change_info_pane(int delta); - void build_available_list(); bool isfavorite() const; diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp index 23176a0168c29..7791aaff8d1f6 100644 --- a/src/frontend/mame/ui/selmenu.cpp +++ b/src/frontend/mame/ui/selmenu.cpp @@ -39,8 +39,6 @@ #include #include #include -#include -#include // these hold static bitmap images @@ -107,6 +105,18 @@ char const *const hover_msg[] = { N_("Show DATs view"), }; +std::tuple SYS_TOOLBAR_BITMAPS[] = { + { TOOLBAR_BITMAP_FAVORITE, IPT_UI_FAVORITES, true }, + { TOOLBAR_BITMAP_SAVE, IPT_UI_EXPORT, false }, + { TOOLBAR_BITMAP_AUDIT, IPT_UI_AUDIT, false }, + { TOOLBAR_BITMAP_INFO, IPT_UI_DATS, true } +}; + +std::tuple SW_TOOLBAR_BITMAPS[] = { + { TOOLBAR_BITMAP_FAVORITE, IPT_UI_FAVORITES, true }, + { TOOLBAR_BITMAP_INFO, IPT_UI_DATS, true } +}; + void load_image(bitmap_argb32 &bitmap, emu_file &file, std::string const &base) { @@ -206,8 +216,8 @@ bool menu_select_launch::reselect_last::s_reselect = false; // instantiate possible variants of these so derived classes don't get link errors template bool menu_select_launch::select_bios(game_driver const &, bool); template bool menu_select_launch::select_bios(ui_software_info const &, bool); -template float menu_select_launch::draw_left_panel(machine_filter::type current, std::map const &filters, float x1, float y1, float x2, float y2); -template float menu_select_launch::draw_left_panel(software_filter::type current, std::map const &filters, float x1, float y1, float x2, float y2); +template void menu_select_launch::draw_left_panel(u32 flags, machine_filter::type current, std::map const &filters); +template void menu_select_launch::draw_left_panel(u32 flags, software_filter::type current, std::map const &filters); menu_select_launch::system_flags::system_flags(machine_static_info const &info) @@ -253,10 +263,6 @@ void menu_select_launch::reselect_last::set_software(game_driver const &driver, } -inline bool menu_select_launch::show_left_panel() const { return !(m_panels_status & HIDE_LEFT_PANEL); } -inline bool menu_select_launch::show_right_panel() const { return !(m_panels_status & HIDE_RIGHT_PANEL); } - - //------------------------------------------------- // ctor //------------------------------------------------- @@ -424,8 +430,8 @@ menu_select_launch::cache::cache(running_machine &machine) std::memcpy(&m_no_avail_bitmap.pix(0), no_avail_bmp, 256 * 256 * sizeof(u32)); - m_toolbar_bitmaps.resize(UI_TOOLBAR_BUTTONS); - m_toolbar_textures.reserve(UI_TOOLBAR_BUTTONS); + m_toolbar_bitmaps.resize(UI_TOOLBAR_BUTTONS * 2); + m_toolbar_textures.reserve(UI_TOOLBAR_BUTTONS * 2); } @@ -455,7 +461,7 @@ void menu_select_launch::cache::cache_toolbar(running_machine &machine, float wi float const drawscale((std::max)(xscale, yscale)); // rasterise the SVG and clear it out of memory - bitmap_argb32 &bitmap(m_toolbar_bitmaps[i]); + bitmap_argb32 &bitmap(m_toolbar_bitmaps[2 * i]); bitmap.resize(pix_size, pix_size); nsvgRasterize( rasterizer.get(), @@ -467,20 +473,28 @@ void menu_select_launch::cache::cache_toolbar(running_machine &machine, float wi svg.reset(); // correct colour format + bitmap_argb32 &disabled_bitmap(m_toolbar_bitmaps[(2 * i) + 1]); + disabled_bitmap.resize(pix_size, pix_size); for (s32 y = 0; bitmap.height() > y; ++y) { - u32 *dst(&bitmap.pix(y)); - for (s32 x = 0; bitmap.width() > x; ++x, ++dst) + u32 *cdst(&bitmap.pix(y)); + u32 *mdst(&disabled_bitmap.pix(y)); + for (s32 x = 0; bitmap.width() > x; ++x, ++cdst, ++mdst) { - u8 const *const src(reinterpret_cast(dst)); - rgb_t const d(src[3], src[0], src[1], src[2]); - *dst = d; + u8 const *const src(reinterpret_cast(cdst)); + rgb_t const c(src[3], src[0], src[1], src[2]); + u8 const l(std::clamp(std::lround((0.2126 * src[0]) + (0.7152 * src[1]) + (0.0722 * src[2])), 0L, 255L)); + rgb_t const m(src[3], l, l, l); + *cdst = c; + *mdst = m; } } - // make a texture + // make textures render_texture &texture(*m_toolbar_textures.emplace_back(render.texture_alloc(), render)); + render_texture &disabled_texture(*m_toolbar_textures.emplace_back(render.texture_alloc(), render)); texture.set_bitmap(bitmap, bitmap.cliprect(), TEXFORMAT_ARGB32); + disabled_texture.set_bitmap(disabled_bitmap, disabled_bitmap.cliprect(), TEXFORMAT_ARGB32); } } } @@ -514,9 +528,32 @@ menu_select_launch::menu_select_launch(mame_ui_manager &mui, render_container &c , m_cache(mui.get_session_data(machine())) , m_is_swlist(is_swlist) , m_focus(focused_menu::MAIN) - , m_pressed(false) - , m_repeat(0) + , m_pointer_action(pointer_action::NONE) + , m_scroll_repeat(std::chrono::steady_clock::time_point::min()) + , m_base_pointer(0.0F, 0.0F) + , m_last_pointer(0.0F, 0.0F) + , m_clicked_line(0) + , m_primary_vbounds(0.0F, -1.0F) + , m_primary_items_top(-1.0F) + , m_primary_items_hbounds(0.0F, -1.0F) + , m_primary_lines(0) + , m_left_panel_width(-1.0F) + , m_left_items_hbounds(0.0F, -1.0F) + , m_left_items_top(1.0F) + , m_left_item_count(0) + , m_left_visible_lines(0) + , m_left_visible_top(0) + , m_right_panel_width(-1.0F) + , m_right_tabs_bottom(-1.0F) + , m_right_heading_top(-1.0F) + , m_right_content_vbounds(0.0F, -1.0F) + , m_right_content_hbounds(0.0F, -1.0F) , m_right_visible_lines(0) + , m_toolbar_button_vbounds(0.0F, -1.0F) + , m_toolbar_button_width(-1.0) + , m_toolbar_button_spacing(-1.0) + , m_toolbar_backtrack_left(-1.0) + , m_toolbar_main_left(-1.0) , m_panels_status(SHOW_PANELS) , m_right_panel(RP_FIRST) , m_has_icons(false) @@ -529,33 +566,109 @@ menu_select_launch::menu_select_launch(mame_ui_manager &mui, render_container &c } -bool menu_select_launch::next_image_view() +std::pair menu_select_launch::next_right_panel_view() +{ + if (right_panel() == RP_IMAGES) + return next_image_view(); + else if (right_panel() == RP_INFOS) + return next_info_view(); + else + return std::make_pair(false, false); +} + + +std::pair menu_select_launch::previous_right_panel_view() +{ + if (right_panel() == RP_IMAGES) + return previous_image_view(); + else if (right_panel() == RP_INFOS) + return previous_info_view(); + else + return std::make_pair(false, false); +} + + +std::pair menu_select_launch::next_image_view() { if (LAST_VIEW > m_image_view) { ++m_image_view; set_switch_image(); - return true; + return std::make_pair(true, (LAST_VIEW > m_image_view)); } else { - return false; + return std::make_pair(false, false); } } -bool menu_select_launch::previous_image_view() +std::pair menu_select_launch::previous_image_view() { if (FIRST_VIEW < m_image_view) { --m_image_view; set_switch_image(); - return true; + return std::make_pair(true, (FIRST_VIEW < m_image_view)); } else { - return false; + return std::make_pair(false, false); + } +} + + +std::pair menu_select_launch::next_info_view() +{ + ui_software_info const *software; + ui_system_info const *system; + get_selection(software, system); + if (software && !software->startempty) + { + if ((ui_globals::cur_sw_dats_total - 1) > ui_globals::cur_sw_dats_view) + { + ++ui_globals::cur_sw_dats_view; + m_topline_datsview = 0; + return std::make_pair(true, (ui_globals::cur_sw_dats_total - 1) > ui_globals::cur_sw_dats_view); + } + } + else if (system || (software && software->driver)) + { + if ((ui_globals::curdats_total - 1) > ui_globals::curdats_view) + { + ++ui_globals::curdats_view; + m_topline_datsview = 0; + return std::make_pair(true, (ui_globals::curdats_total - 1) > ui_globals::curdats_view); + } + } + return std::make_pair(false, false); +} + + +std::pair menu_select_launch::previous_info_view() +{ + ui_software_info const *software; + ui_system_info const *system; + get_selection(software, system); + if (software && !software->startempty) + { + if (0 < ui_globals::cur_sw_dats_view) + { + --ui_globals::cur_sw_dats_view; + m_topline_datsview = 0; + return std::make_pair(true, 0 < ui_globals::cur_sw_dats_view); + } + } + else if (system || (software && software->driver)) + { + if (0 < ui_globals::curdats_view) + { + --ui_globals::curdats_view; + m_topline_datsview = 0; + return std::make_pair(true, 0 < ui_globals::curdats_view); + } } + return std::make_pair(false, false); } @@ -651,13 +764,27 @@ void menu_select_launch::recompute_metrics(uint32_t width, uint32_t height, floa m_info_layout = std::nullopt; // calculate size of dividers between panes - m_divider_width = 2.0F * lr_border(); - m_divider_arrow_width = 0.4F * m_divider_width; - m_divider_arrow_height = 2.0F * tb_border(); + m_divider_width = 0.8F * line_height() * x_aspect(); + m_divider_arrow_width = 0.32F * line_height() * x_aspect(); + m_divider_arrow_height = 0.64F * line_height(); // calculate info text size m_info_line_height = ui().get_line_height(ui().options().infos_size()); + // invalidate panel metrics + m_primary_vbounds = std::make_pair(0.0F, -1.0F); + m_primary_items_hbounds = std::make_pair(0.0F, -1.0F); + m_left_panel_width = -1.0F; + m_left_items_hbounds = std::make_pair(0.0F, -1.0F); + m_right_panel_width = -1.0F; + m_right_heading_top = -1.0F; + m_right_content_vbounds = std::make_pair(0.0F, -1.0F); + m_right_content_hbounds = std::make_pair(0.0F, -1.0F); + m_toolbar_button_vbounds = std::make_pair(0.0F, -1.0F); + + // abandon pointer input + m_pointer_action = pointer_action::NONE; + // force right panel images to be redrawn m_cache.set_snapx_driver(nullptr); m_cache.set_snapx_software(nullptr); @@ -668,7 +795,7 @@ void menu_select_launch::recompute_metrics(uint32_t width, uint32_t height, floa // perform our special rendering //------------------------------------------------- -void menu_select_launch::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_select_launch::custom_render(u32 flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { std::string tempbuf[4]; @@ -682,7 +809,7 @@ void menu_select_launch::custom_render(void *selectedref, float top, float botto ui().colors().text_color(), ui().colors().background_color()); // draw toolbar - draw_toolbar(origx1, y1, origx2, origy1 - tb_border()); + draw_toolbar(flags, origx1, y1, origx2, origy1 - tb_border()); // determine the text to render below ui_software_info const *swinfo; @@ -772,14 +899,27 @@ void menu_select_launch::custom_render(void *selectedref, float top, float botto } else { - std::string copyright(emulator_info::get_copyright()); - size_t found1 = copyright.find_first_of('\n'); - size_t found2 = copyright.find_last_of('\n'); + std::string_view copyright(emulator_info::get_copyright()); + unsigned line(0); - tempbuf[0] = string_format(_("%1$s %2$s"), emulator_info::get_appname(), build_version); - tempbuf[1] = copyright.substr(0, found1); - tempbuf[2] = copyright.substr(found1 + 1, found2 - (found1 + 1)); - tempbuf[3] = copyright.substr(found2 + 1); + // first line is version string + tempbuf[line++] = string_format("%s %s", emulator_info::get_appname(), build_version); + + // output message + while (line < std::size(tempbuf)) + { + auto const found = copyright.find('\n'); + if (std::string::npos != found) + { + tempbuf[line++] = copyright.substr(0, found); + copyright.remove_prefix(found + 1); + } + else + { + tempbuf[line++] = copyright; + copyright = std::string_view(); + } + } } // draw the footer @@ -812,7 +952,7 @@ void menu_select_launch::rotate_focus(int dir) switch (get_focus()) { case focused_menu::MAIN: - if (selected_index() > m_available_items) + if (selected_index() >= m_available_items) { if ((0 > dir) || (m_panels_status == HIDE_BOTH)) select_prev(); @@ -915,204 +1055,211 @@ void menu_select_launch::inkey_dats() //------------------------------------------------- -// draw common arrows +// draw info arrow //------------------------------------------------- -void menu_select_launch::draw_common_arrow(float origx1, float origy1, float origx2, float origy2, int current, int dmin, int dmax, float title_size) +void menu_select_launch::draw_info_arrow(u32 flags, int line) { - // set left-right arrows dimension - float const ar_x0 = 0.5f * (origx2 + origx1) + 0.5f * title_size + gutter_width() - lr_arrow_width(); - float const ar_y0 = origy1 + 0.1f * line_height(); - float const ar_x1 = 0.5f * (origx2 + origx1) + 0.5f * title_size + gutter_width(); - float const ar_y1 = origy1 + 0.9f * line_height(); - - float const al_x0 = 0.5f * (origx2 + origx1) - 0.5f * title_size - gutter_width(); - float const al_y0 = origy1 + 0.1f * line_height(); - float const al_x1 = 0.5f * (origx2 + origx1) - 0.5f * title_size - gutter_width() + lr_arrow_width(); - float const al_y1 = origy1 + 0.9f * line_height(); + float const linetop(m_right_content_vbounds.first + (float(line) * m_info_line_height)); + float const linebottom(m_right_content_vbounds.first + (float(line + 1) * m_info_line_height)); + bool const hovered(pointer_in_rect(m_right_content_hbounds.first, linetop, m_right_content_hbounds.second, linebottom)); + bool const clicked((pointer_action::RIGHT_TRACK_LINE == m_pointer_action) && (line == m_clicked_line)); - rgb_t fgcolor_right, fgcolor_left; - fgcolor_right = fgcolor_left = ui().colors().text_color(); - - // set hover - if (mouse_in_rect(ar_x0, ar_y0, ar_x1, ar_y1) && current != dmax) + rgb_t bgcolor = ui().colors().text_bg_color(); + rgb_t fgcolor = ui().colors().text_color(); + if (clicked && hovered) { - ui().draw_textured_box(container(), ar_x0 + 0.01f, ar_y0, ar_x1 - 0.01f, ar_y1, ui().colors().mouseover_bg_color(), rgb_t(43, 43, 43), - hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); - set_hover(HOVER_UI_RIGHT); - fgcolor_right = ui().colors().mouseover_color(); + // draw selected highlight for tracked item + bgcolor = ui().colors().selected_bg_color(); + fgcolor = ui().colors().selected_color(); + highlight(m_right_content_hbounds.first, linetop, m_right_content_hbounds.second, linebottom, bgcolor); } - else if (mouse_in_rect(al_x0, al_y0, al_x1, al_y1) && current != dmin) + else if (clicked || (!m_ui_error && !(flags & PROCESS_NOINPUT) && hovered && pointer_idle())) { - ui().draw_textured_box(container(), al_x0 + 0.01f, al_y0, al_x1 - 0.01f, al_y1, ui().colors().mouseover_bg_color(), rgb_t(43, 43, 43), - hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); - set_hover(HOVER_UI_LEFT); - fgcolor_left = ui().colors().mouseover_color(); + // draw hover highlight when hovered over or dragged off + bgcolor = ui().colors().mouseover_bg_color(); + fgcolor = ui().colors().mouseover_color(); + highlight(m_right_content_hbounds.first, linetop, m_right_content_hbounds.second, linebottom, bgcolor); } - // apply arrow - if (dmax == dmin) - return; - else if (current == dmin) - draw_arrow(ar_x0, ar_y0, ar_x1, ar_y1, fgcolor_right, ROT90); - else if (current == dmax) - draw_arrow(al_x0, al_y0, al_x1, al_y1, fgcolor_left, ROT90 ^ ORIENTATION_FLIP_X); - else - { - draw_arrow(ar_x0, ar_y0, ar_x1, ar_y1, fgcolor_right, ROT90); - draw_arrow(al_x0, al_y0, al_x1, al_y1, fgcolor_left, ROT90 ^ ORIENTATION_FLIP_X); - } + draw_arrow( + 0.5F * (m_right_content_hbounds.first + m_right_content_hbounds.second - (x_aspect() * m_info_line_height)), + linetop + (0.25F * m_info_line_height), + 0.5F * (m_right_content_hbounds.first + m_right_content_hbounds.second + (x_aspect() * m_info_line_height)), + linetop + (0.75F * m_info_line_height), + fgcolor, + line ? (ROT0 ^ ORIENTATION_FLIP_Y) : ROT0); } //------------------------------------------------- -// draw info arrow +// draw vertical divider //------------------------------------------------- -void menu_select_launch::draw_info_arrow(int ub, float origx1, float origx2, float oy1, float line_height, float ud_arrow_width) +void menu_select_launch::draw_divider(u32 flags, float x1, bool right) { + // work out colours rgb_t fgcolor = ui().colors().text_color(); - - if (mouse_in_rect(origx1, oy1, origx2, oy1 + line_height)) + rgb_t bgcolor(0xef, 0x12, 0x47, 0x7b); // FIXME: magic numbers in colour? + bool const hovered(pointer_in_rect(x1, m_primary_vbounds.first, x1 + m_divider_width, m_primary_vbounds.second)); + bool const clicked((pointer_action::DIVIDER_TRACK == m_pointer_action) && ((right ? 1 : 0) == m_clicked_line)); + if (hovered && clicked) + { + fgcolor = ui().colors().selected_color(); + bgcolor = ui().colors().selected_bg_color(); + } + else if (clicked || (!m_ui_error && !(flags & PROCESS_NOINPUT) && hovered)) { - ui().draw_textured_box( - container(), - origx1 + 0.01f, oy1, origx2 - 0.01f, oy1 + line_height, - ui().colors().mouseover_bg_color(), rgb_t(43, 43, 43), - hilight_main_texture(), - PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); - set_hover(!ub ? HOVER_DAT_UP : HOVER_DAT_DOWN); fgcolor = ui().colors().mouseover_color(); } - u32 const orientation = !ub ? ROT0 : (ROT0 ^ ORIENTATION_FLIP_Y); - draw_arrow( - 0.5f * (origx1 + origx2) - 0.5f * ud_arrow_width, oy1 + 0.25f * line_height, - 0.5f * (origx1 + origx2) + 0.5f * ud_arrow_width, oy1 + 0.75f * line_height, - fgcolor, - orientation); + // draw the divider pane + ui().draw_outlined_box(container(), x1, m_primary_vbounds.first, x1 + m_divider_width, m_primary_vbounds.second, bgcolor); + + // draw the arrow + uint32_t orientation(ROT90); + if (right ? !show_right_panel() : show_left_panel()) + orientation ^= ORIENTATION_FLIP_X; + float const ar_x0 = x1 + (0.5F * (m_divider_width - m_divider_arrow_width)); + float const ar_y0 = 0.5F * (m_primary_vbounds.first + m_primary_vbounds.second - m_divider_arrow_height); + draw_arrow(ar_x0, ar_y0, ar_x0 + m_divider_arrow_width, ar_y0 + m_divider_arrow_height, fgcolor, orientation); } -bool menu_select_launch::draw_error_text() -{ - if (m_ui_error) - ui().draw_text_box(container(), m_error_text, text_layout::text_justify::CENTER, 0.5f, 0.5f, UI_RED_COLOR); - return m_ui_error; -} +//------------------------------------------------- +// draw left panel (filter list) +//------------------------------------------------- template -float menu_select_launch::draw_left_panel( - typename Filter::type current, - std::map const &filters, - float x1, float y1, float x2, float y2) +void menu_select_launch::draw_left_panel(u32 flags, typename Filter::type current, std::map const &filters) { if (!show_left_panel()) - return draw_collapsed_left_panel(x1, y1, x2, y2); - - // calculate line height - float const sc(y2 - y1 - (2.0F * tb_border())); - float line_height_max(m_info_line_height); - if ((Filter::COUNT * line_height_max) > sc) { - float const lm(sc / Filter::COUNT); - line_height_max = line_height() * (lm / line_height()); + // left panel hidden, but no need to recompute metrics if target isn't resized + m_left_panel_width = 0.0F; + + draw_divider(flags, lr_border(), false); + return; } - // calculate horizontal offset for unadorned names - std::string tmp(convert_command_glyph("_# ")); - float const text_sign = ui().get_string_width(tmp, m_info_line_height); + // get the width of the selection indicator glyphs + float const checkmark_width = ui().get_string_width(convert_command_glyph("_# "), m_info_line_height); + + if (m_left_items_hbounds.first >= m_left_items_hbounds.second) + { + // calculate number of lines that will fit - centre vertically if we need scroll arrows + float const height(m_primary_vbounds.second - m_primary_vbounds.first); + int const lines((height - (tb_border() * 2.0F)) / m_info_line_height); + if (Filter::COUNT <= lines) + m_left_items_top = m_primary_vbounds.first + tb_border(); + else + m_left_items_top = m_primary_vbounds.first + ((height - (float(lines) * m_info_line_height)) * 0.5F); + float const pixelheight(target_size().second); + m_left_items_top = std::round(m_left_items_top * pixelheight) / pixelheight; + m_left_item_count = Filter::COUNT; + m_left_visible_lines = std::min(Filter::COUNT, lines); + + // get the maximum filter name width, restricted to a quarter of the target width + float line_width(0.0F); + for (typename Filter::type x = Filter::FIRST; Filter::COUNT > x; ++x) + line_width = std::max(ui().get_string_width(Filter::display_name(x), m_info_line_height) + checkmark_width, line_width); + line_width = std::min(line_width + (lr_border() * 2.0F), 0.25F); + m_left_items_hbounds = std::make_pair(2.0F * lr_border(), (2.0F * lr_border()) + line_width); + + // make sure the scroll position makes sense + m_left_visible_top = (std::min)(m_left_visible_top, m_left_item_count - m_left_visible_lines); + } + m_left_panel_width = (m_left_items_hbounds.second - m_left_items_hbounds.first) + (lr_border() * 2.0F); - // get the maximum width of a filter name - float left_width(0.0F); - for (typename Filter::type x = Filter::FIRST; Filter::COUNT > x; ++x) - left_width = std::max(ui().get_string_width(Filter::display_name(x), m_info_line_height) + text_sign, left_width); - left_width = std::min(left_width, 0.25F); + // ensure the highlighted item is visible + if ((m_filter_highlight - Filter::FIRST) < (m_left_visible_top + 1)) + m_left_visible_top = (Filter::FIRST == m_filter_highlight) ? 0 : (m_filter_highlight - 1); + else if ((m_filter_highlight - Filter::FIRST) > (m_left_visible_top + m_left_visible_lines - 2)) + m_left_visible_top = (std::min)(m_filter_highlight - Filter::FIRST + 2 - m_left_visible_lines, m_left_item_count - m_left_visible_lines); // outline the box and inset by the border width - float const origy1(y1); - float const origy2(y2); - x2 = x1 + left_width + 2.0F * lr_border(); - ui().draw_outlined_box(container(), x1, y1, x2, y2, ui().colors().background_color()); - x1 += lr_border(); - x2 -= lr_border(); - y1 += tb_border(); - y2 -= tb_border(); + ui().draw_outlined_box( + container(), + lr_border(), m_primary_vbounds.first, lr_border() + m_left_panel_width, m_primary_vbounds.second, + ui().colors().background_color()); // now draw the rows + typename Filter::type filter(Filter::FIRST); + for (int i = 0; i < m_left_visible_top; ++i) + ++filter; auto const active_filter(filters.find(current)); - for (typename Filter::type filter = Filter::FIRST; Filter::COUNT > filter; ++filter) + std::string str; + bool const atbottom((m_left_visible_top + m_left_visible_lines) == m_left_item_count); + for (int line = 0; line < m_left_visible_lines; ++line, ++filter) { - std::string str; - if (filters.end() != active_filter) - { - str = active_filter->second->adorned_display_name(filter); - } - else - { - if (current == filter) - str = convert_command_glyph("_> "); - str.append(Filter::display_name(filter)); - } + float const line_top(m_left_items_top + (float(line) * m_info_line_height)); + bool const uparrow(!line && m_left_visible_top); + bool const downarrow(!atbottom && ((m_left_visible_lines - 1) == line)); - // handle mouse hover in passing + // work out the colours for this item rgb_t bgcolor = ui().colors().text_bg_color(); rgb_t fgcolor = ui().colors().text_color(); - if (mouse_in_rect(x1, y1, x2, y1 + line_height_max)) + bool const hovered(pointer_in_rect(m_left_items_hbounds.first, line_top, m_left_items_hbounds.second, line_top + m_info_line_height)); + bool const pointerline((pointer_action::LEFT_TRACK_LINE == m_pointer_action) && (line == m_clicked_line)); + if (pointerline && hovered) { - bgcolor = ui().colors().mouseover_bg_color(); - fgcolor = ui().colors().mouseover_color(); - set_hover(HOVER_FILTER_FIRST + filter); - highlight(x1, y1, x2, y1 + line_height_max, bgcolor); + // draw selected highlight for tracked item + bgcolor = ui().colors().selected_bg_color(); + fgcolor = ui().colors().selected_color(); + highlight(m_left_items_hbounds.first, line_top, m_left_items_hbounds.second, line_top + m_info_line_height, bgcolor); } - - // draw primary highlight if keyboard focus is here - if ((m_filter_highlight == filter) && (get_focus() == focused_menu::LEFT)) + else if ((m_filter_highlight == filter) && (get_focus() == focused_menu::LEFT)) { + // draw primary highlight if keyboard focus is here fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); ui().draw_textured_box( container(), - x1, y1, x2, y1 + line_height_max, + m_left_items_hbounds.first, line_top, m_left_items_hbounds.second, line_top + m_info_line_height, bgcolor, rgb_t(255, 43, 43, 43), hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); } + else if (pointerline || (!m_ui_error && !(flags & PROCESS_NOINPUT) && hovered && pointer_idle())) + { + // draw hover highlight when hovered over or dragged off + bgcolor = ui().colors().mouseover_bg_color(); + fgcolor = ui().colors().mouseover_color(); + highlight(m_left_items_hbounds.first, line_top, m_left_items_hbounds.second, line_top + m_info_line_height, bgcolor); + } - // finally draw the text itself and move to the next line - float const x1t = x1 + ((str == Filter::display_name(filter)) ? text_sign : 0.0F); - ui().draw_text_full( - container(), str, - x1t, y1, x2 - x1t, - text_layout::text_justify::LEFT, text_layout::word_wrapping::TRUNCATE, - mame_ui_manager::NORMAL, fgcolor, bgcolor, - nullptr, nullptr, - m_info_line_height); - y1 += line_height_max; - } - - x1 = x2 + lr_border(); - x2 = x1 + m_divider_width; - y1 = origy1; - y2 = origy2; - - // set left-right arrows dimension - float const ar_x0 = 0.5F * (x2 + x1 - m_divider_arrow_width); - float const ar_y0 = 0.5F * (y2 + y1 - m_divider_arrow_height); - float const ar_x1 = ar_x0 + m_divider_arrow_width; - float const ar_y1 = ar_y0 + m_divider_arrow_height; - - ui().draw_outlined_box(container(), x1, y1, x2, y2, rgb_t(0xef, 0x12, 0x47, 0x7b)); - - rgb_t fgcolor = ui().colors().text_color(); - if (mouse_in_rect(x1, y1, x2, y2)) - { - fgcolor = ui().colors().mouseover_color(); - set_hover(HOVER_LPANEL_ARROW); + // finally draw the text itself + if (uparrow || downarrow) + { + draw_arrow( + 0.5F * (m_left_items_hbounds.first + m_left_items_hbounds.second + (x_aspect() * m_info_line_height)), + line_top + (0.25F * m_info_line_height), + 0.5F * (m_left_items_hbounds.first + m_left_items_hbounds.second - (x_aspect() * m_info_line_height)), + line_top + (0.75F * m_info_line_height), + fgcolor, + downarrow ? (ROT0 ^ ORIENTATION_FLIP_Y) : ROT0); + } + else + { + if (filters.end() != active_filter) + str = active_filter->second->adorned_display_name(filter); + else if (current == filter) + (str = convert_command_glyph("_> ")).append(Filter::display_name(filter)); + else + str = Filter::display_name(filter); + float const x1t = m_left_items_hbounds.first + lr_border() + ((str == Filter::display_name(filter)) ? checkmark_width : 0.0F); + ui().draw_text_full( + container(), str, + x1t, line_top, m_left_items_hbounds.second - x1t - lr_border() + (1.0F / float(target_size().second)), + text_layout::text_justify::LEFT, text_layout::word_wrapping::TRUNCATE, + mame_ui_manager::NORMAL, fgcolor, bgcolor, + nullptr, nullptr, + m_info_line_height); + } } - draw_arrow(ar_x0, ar_y0, ar_x1, ar_y1, fgcolor, ROT90 ^ ORIENTATION_FLIP_X); - return x2 + lr_border(); + // draw the divider + draw_divider(flags, lr_border() + m_left_panel_width, false); } @@ -1282,77 +1429,86 @@ bool menu_select_launch::select_part(mame_ui_manager &mui, render_container &con // draw toolbar //------------------------------------------------- -void menu_select_launch::draw_toolbar(float x1, float y1, float x2, float y2) +void menu_select_launch::draw_toolbar(u32 flags, float x1, float y1, float x2, float y2) { + // work out which buttons we're going to draw + bool const have_parent(m_is_swlist || !stack_has_special_main_menu()); + auto const *const toolbar_bitmaps(m_is_swlist ? SW_TOOLBAR_BITMAPS : SYS_TOOLBAR_BITMAPS); + unsigned const toolbar_count(m_is_swlist ? std::size(SW_TOOLBAR_BITMAPS) : std::size(SYS_TOOLBAR_BITMAPS)); + // draw a box ui().draw_outlined_box(container(), x1, y1, x2, y2, rgb_t(0xef, 0x12, 0x47, 0x7b)); - // take off the borders - float const aspect(machine().render().ui_aspect(&container())); - x1 += lr_border(); - x2 -= lr_border(); - y1 += tb_border(); - y2 -= tb_border(); + // cache metrics and bitmaps if necessary + if (m_toolbar_button_vbounds.first >= m_toolbar_button_vbounds.second) + { + m_toolbar_button_vbounds.first = y1 + tb_border(); + m_toolbar_button_vbounds.second = y2 - tb_border(); + float const button_height(m_toolbar_button_vbounds.second - m_toolbar_button_vbounds.first); + m_toolbar_button_width = button_height * float(x_aspect()); + m_toolbar_button_spacing = m_toolbar_button_width * 1.5F; + float const total_width((float(toolbar_count) + (float(toolbar_count - 1) * 0.5F)) * m_toolbar_button_width); + m_toolbar_backtrack_left = x2 - lr_border() - m_toolbar_button_width; + m_toolbar_main_left = (std::min)(m_toolbar_backtrack_left - (float(toolbar_count) * m_toolbar_button_spacing), (x1 + x2 - total_width) * 0.5F); + m_cache.cache_toolbar(machine(), m_toolbar_button_width, button_height); + } - // work out which buttons we're going to draw - constexpr unsigned SYS_TOOLBAR_BITMAPS[] = { TOOLBAR_BITMAP_FAVORITE, TOOLBAR_BITMAP_SAVE, TOOLBAR_BITMAP_AUDIT, TOOLBAR_BITMAP_INFO }; - constexpr unsigned SW_TOOLBAR_BITMAPS[] = { TOOLBAR_BITMAP_FAVORITE, TOOLBAR_BITMAP_INFO }; - bool const have_parent = m_is_swlist || !stack_has_special_main_menu(); - unsigned const *const toolbar_bitmaps = m_is_swlist ? SW_TOOLBAR_BITMAPS : SYS_TOOLBAR_BITMAPS; - unsigned const toolbar_count = m_is_swlist ? std::size(SW_TOOLBAR_BITMAPS) : std::size(SYS_TOOLBAR_BITMAPS); - - // calculate metrics - float const x_size = (y2 - y1) * aspect; - float const x_spacing = x_size * 1.5f; - float const backtrack_pos = x2 - x_size; - float const total_width = (float(toolbar_count) + (float(toolbar_count - 1) * 0.5f)) * x_size; - m_cache.cache_toolbar(machine(), x_size, y2 - y1); - - // add backtrack button - rgb_t color(0xffcccccc); - if (mouse_in_rect(backtrack_pos, y1, x2, y2)) - { - set_hover(HOVER_BACKTRACK); - color = rgb_t::white(); - float const ypos = y2 + line_height() + 2.0f * tb_border(); - ui().draw_text_box( - container(), - have_parent ? _("Return to Previous Menu") : _("Exit"), - text_layout::text_justify::RIGHT, 1.0f - lr_border(), ypos, - ui().colors().background_color()); + // tooltip needs to be above for pen/touch to avoid being obscured + float tooltip_pos; + switch (pointer_type()) + { + case ui_event::pointer::PEN: + case ui_event::pointer::TOUCH: + tooltip_pos = m_toolbar_button_vbounds.first - line_height() - (2.0F * tb_border()); + break; + default: + tooltip_pos = m_toolbar_button_vbounds.second + line_height() + tb_border(); + break; + } + + + { + // add backtrack button + bool const hovered(pointer_in_rect(m_toolbar_backtrack_left, m_toolbar_button_vbounds.first, m_toolbar_backtrack_left + m_toolbar_button_width, m_toolbar_button_vbounds.second)); + bool const tracked((pointer_action::TOOLBAR_TRACK == m_pointer_action) && (0 > m_clicked_line)); + rgb_t const color((hovered && tracked) ? rgb_t::white() : rgb_t(0xffcccccc)); + if (tracked || (hovered && !(flags & PROCESS_NOINPUT) && pointer_idle())) + { + ui().draw_text_box( + container(), + have_parent ? _("Return to Previous Menu") : _("Exit"), + text_layout::text_justify::RIGHT, 1.0F - lr_border(), tooltip_pos, + ui().colors().background_color()); + } + container().add_quad( + m_toolbar_backtrack_left, m_toolbar_button_vbounds.first, m_toolbar_backtrack_left + m_toolbar_button_width, m_toolbar_button_vbounds.second, + color, + m_cache.toolbar_textures()[2 * (have_parent ? TOOLBAR_BITMAP_PREVMENU : TOOLBAR_BITMAP_EXIT)].get(), + PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } - container().add_quad( - backtrack_pos, y1, x2, y2, - color, - m_cache.toolbar_textures()[have_parent ? TOOLBAR_BITMAP_PREVMENU : TOOLBAR_BITMAP_EXIT].get(), - PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); // now add the other buttons - x1 = (std::min)(backtrack_pos - (float(toolbar_count) * x_spacing), x1 + ((x2 - x1 - total_width) * 0.5f)); - for (int z = 0; toolbar_count > z; ++z, x1 += x_spacing) + for (int z = 0; toolbar_count > z; ++z) { - auto const bitmap = toolbar_bitmaps[z]; - x2 = x1 + x_size; - color = rgb_t (0xffcccccc); - if (mouse_in_rect(x1, y1, x2, y2)) + auto const [bitmap, action, need_selection] = toolbar_bitmaps[z]; + float const button_left(m_toolbar_main_left + (float(z) * m_toolbar_button_spacing)); + float const button_right(button_left + m_toolbar_button_width); + bool const enabled(!need_selection || get_selection_ptr()); + bool const hovered(pointer_in_rect(button_left, m_toolbar_button_vbounds.first, button_right, m_toolbar_button_vbounds.second)); + bool const tracked((pointer_action::TOOLBAR_TRACK == m_pointer_action) && (z == m_clicked_line)); + rgb_t color((hovered && tracked && enabled) ? rgb_t::white() : rgb_t(0xffcccccc)); + if (tracked || (hovered && !(flags & PROCESS_NOINPUT) && pointer_idle())) { - bool const need_selection = (TOOLBAR_BITMAP_FAVORITE == bitmap) || (TOOLBAR_BITMAP_INFO == bitmap); - if (!need_selection || get_selection_ptr()) - { - set_hover(HOVER_B_FAV + bitmap); - color = rgb_t::white(); - } - float ypos = y2 + line_height() + 2.0f * tb_border(); ui().draw_text_box( container(), _(hover_msg[bitmap]), - text_layout::text_justify::CENTER, (x1 + x2) * 0.5f, ypos, + text_layout::text_justify::CENTER, (button_left + button_right) * 0.5F, tooltip_pos, ui().colors().background_color()); } container().add_quad( - x1, y1, x2, y2, + button_left, m_toolbar_button_vbounds.first, button_right, m_toolbar_button_vbounds.second, color, - m_cache.toolbar_textures()[bitmap].get(), + m_cache.toolbar_textures()[(2 * bitmap) + (enabled ? 0 : 1)].get(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } } @@ -1377,13 +1533,6 @@ void menu_select_launch::draw_star(float x0, float y0) } -void menu_select_launch::set_pressed() -{ - (m_repeat == 0) ? m_repeat = osd_ticks() + osd_ticks_per_second() / 2 : m_repeat = osd_ticks() + osd_ticks_per_second() / 4; - m_pressed = true; -} - - //------------------------------------------------- // draw icons //------------------------------------------------- @@ -1404,10 +1553,9 @@ void menu_select_launch::draw_icon(int linenum, void *selectedref, float x0, flo // get title and search path for right panel //------------------------------------------------- -void menu_select_launch::get_title_search(std::string &snaptext, std::string &searchstr) +std::string menu_select_launch::get_arts_searchpath() { - // get arts title text - snaptext.assign(_("selmenu-artwork", std::get<1>(ARTS_INFO[m_image_view]))); + std::string searchstr; // get search path std::string addpath; @@ -1436,45 +1584,290 @@ void menu_select_launch::get_title_search(std::string &snaptext, std::string &se while (path_iter.next(c_path)) searchstr.append(";").append(curpath).append(PATH_SEPARATOR).append(c_path); } + + return searchstr; } //------------------------------------------------- -// handle keys for main menu +// handle UI input events for main menu //------------------------------------------------- -void menu_select_launch::handle_keys(u32 flags, int &iptkey) +bool menu_select_launch::handle_events(u32 flags, event &ev) { - // bail if no items - if (item_count() == 0) - return; - - // if we hit select, return true or pop the stack, depending on the item - if (exclusive_input_pressed(iptkey, IPT_UI_SELECT, 0)) + // loop while we have interesting events + bool stop(false), need_update(false), search_changed(false); + ui_event local_menu_event; + while (!stop && machine().ui_input().pop_event(&local_menu_event)) { - if (m_ui_error) + switch (local_menu_event.event_type) { - // dismiss error + // deal with pointer-like input (mouse, pen, touch, etc.) + case ui_event::type::POINTER_UPDATE: + { + auto const [key, redraw] = handle_pointer_update(flags, local_menu_event); + need_update = need_update || redraw; + if (IPT_INVALID != key) + { + ev.iptkey = key; + stop = true; + } + } + break; + + // pointer left the normal way, possibly releasing buttons + case ui_event::type::POINTER_LEAVE: + { + auto const [key, redraw] = handle_pointer_leave(flags, local_menu_event); + need_update = need_update || redraw; + if (IPT_INVALID != key) + { + ev.iptkey = key; + stop = true; + } + } + break; + + // pointer left in some abnormal way - cancel any associated actions + case ui_event::type::POINTER_ABORT: + { + auto const [key, redraw] = handle_pointer_abort(flags, local_menu_event); + need_update = need_update || redraw; + if (IPT_INVALID != key) + { + ev.iptkey = key; + stop = true; + } + } + break; + + // caught scroll event + case ui_event::type::MOUSE_WHEEL: + if ((&machine().render().ui_target() == local_menu_event.target) && pointer_idle() && !m_ui_error) + { + float x, y; + bool const hit(local_menu_event.target->map_point_container(local_menu_event.mouse_x, local_menu_event.mouse_y, container(), x, y)); + if (!hit) + break; + + if ((x >= m_primary_items_hbounds.first) && (x < m_primary_items_hbounds.second) && (y >= m_primary_items_top) && (y < (m_primary_items_top + (float(m_primary_lines) * line_height())))) + { + if (local_menu_event.zdelta > 0) + { + if ((selected_index() >= m_available_items) || is_first_selected()) + break; + stop = true; + ev.iptkey = IPT_CUSTOM; // stop processing events so info can be rebuilt + set_selected_index(selected_index() - local_menu_event.num_lines); + if (selected_index() < top_line + (top_line != 0)) + top_line -= local_menu_event.num_lines; + } + else + { + if (selected_index() >= (m_available_items - 1)) + break; + stop = true; + ev.iptkey = IPT_CUSTOM; // stop processing events so info can be rebuilt + set_selected_index(std::min(selected_index() + local_menu_event.num_lines, m_available_items - 1)); + if (selected_index() >= top_line + m_visible_items + (top_line != 0)) + top_line += local_menu_event.num_lines; + } + } + else if ((x >= m_right_content_hbounds.first) && (x < m_right_content_hbounds.second) && (y >= m_right_content_vbounds.first) && (y < m_right_content_vbounds.second)) + { + if (show_right_panel() && (RP_INFOS == m_right_panel)) + { + if (local_menu_event.zdelta > 0) + m_topline_datsview -= local_menu_event.num_lines; + else + m_topline_datsview += local_menu_event.num_lines; + } + } + } + break; + + // text input goes to the search field unless there's an error message displayed + case ui_event::type::IME_CHAR: + if (!pointer_idle()) + break; + + if (exclusive_input_pressed(ev.iptkey, IPT_UI_FOCUS_NEXT, 0) || exclusive_input_pressed(ev.iptkey, IPT_UI_FOCUS_PREV, 0)) + { + stop = true; + } + else if (m_ui_error) + { + ev.iptkey = IPT_CUSTOM; + stop = true; + } + else if (accept_search()) + { + if (input_character(m_search, local_menu_event.ch, uchar_is_printable)) + search_changed = true; + } + break; + + // ignore everything else + default: + break; } - else if (m_focus == focused_menu::LEFT) + + // need to update search before processing certain kinds of events, but others don't matter + if (search_changed) { - filter_selected(); + switch (machine().ui_input().peek_event_type()) + { + case ui_event::type::MOUSE_WHEEL: + case ui_event::type::POINTER_UPDATE: + case ui_event::type::POINTER_LEAVE: + case ui_event::type::POINTER_ABORT: + stop = true; + break; + case ui_event::type::NONE: + case ui_event::type::WINDOW_FOCUS: + case ui_event::type::WINDOW_DEFOCUS: + case ui_event::type::IME_CHAR: + break; + } } - return; } - if (exclusive_input_pressed(iptkey, IPT_UI_BACK, 0)) + // deal with repeating main scroll arrows + if ((pointer_action::MAIN_TRACK_LINE == m_pointer_action) && (is_main_up_arrow(m_clicked_line) || (is_main_down_arrow(m_clicked_line)))) { - if (m_ui_error) + if (check_scroll_repeat(m_primary_items_top, m_primary_items_hbounds, line_height())) + { + if (!m_clicked_line) + { + // scroll up + --top_line; + if (main_at_top()) + m_pointer_action = pointer_action::NONE; + } + else + { + // scroll down + ++top_line; + if (main_at_bottom()) + m_pointer_action = pointer_action::NONE; + } + if (main_force_visible_selection()) + { + if (IPT_INVALID == ev.iptkey) + ev.iptkey = IPT_CUSTOM; // stop processing events so the info pane can be rebuilt + } + need_update = true; + } + } + + // deal with repeating info view arrows + if (pointer_action::RIGHT_TRACK_ARROW == m_pointer_action) + { + float const left(m_clicked_line ? (m_right_content_hbounds.second - lr_border() - lr_arrow_width()) : (m_right_content_hbounds.first + lr_border())); + float const right(m_clicked_line ? (m_right_content_hbounds.second - lr_border()) : (m_right_content_hbounds.first + lr_border() + lr_arrow_width())); + if (pointer_in_rect(left, right_arrows_top(), right, right_arrows_bottom())) + { + if (std::chrono::steady_clock::now() >= m_scroll_repeat) + { + m_scroll_repeat += std::chrono::milliseconds(200); + if (!(m_clicked_line ? next_right_panel_view() : previous_right_panel_view()).second) + m_pointer_action = pointer_action::NONE; + need_update = true; + } + } + } + + // deal with repeating filter scroll arrows + if ((pointer_action::LEFT_TRACK_LINE == m_pointer_action) && (is_left_up_arrow(m_clicked_line) || (is_left_down_arrow(m_clicked_line)))) + { + if (check_scroll_repeat(m_left_items_top, m_left_items_hbounds, m_info_line_height)) + { + if (!m_clicked_line) + { + // scroll up + --m_left_visible_top; + m_filter_highlight = std::min(m_left_visible_top + m_left_visible_lines - 2, m_filter_highlight); + if (left_at_top()) + m_pointer_action = pointer_action::NONE; + } + else + { + // scroll down + ++m_left_visible_top; + m_filter_highlight = std::max(m_left_visible_top + 1, m_filter_highlight); + if (left_at_bottom()) + m_pointer_action = pointer_action::NONE; + } + need_update = true; + } + } + + // deal with repeating filter scroll arrows + if (pointer_action::RIGHT_TRACK_LINE == m_pointer_action) + { + if (check_scroll_repeat(m_right_content_vbounds.first, m_right_content_hbounds, m_info_line_height)) + { + if (!m_clicked_line) + { + // scroll up + --m_topline_datsview; + if (info_at_top()) + m_pointer_action = pointer_action::NONE; + } + else + { + // scroll down + ++m_topline_datsview; + if (info_at_bottom()) + m_pointer_action = pointer_action::NONE; + } + need_update = true; + } + } + + if (search_changed) + reset(reset_options::SELECT_FIRST); + + return need_update; +} + + +//------------------------------------------------- +// handle keys for main menu +//------------------------------------------------- + +bool menu_select_launch::handle_keys(u32 flags, int &iptkey) +{ + // bail if no items + if (item_count() == 0) + return false; + + // if we hit select, return true or pop the stack, depending on the item + if (exclusive_input_pressed(iptkey, IPT_UI_SELECT, 0)) + { + if (m_ui_error) + { + // dismiss error + } + else if (m_focus == focused_menu::LEFT) + { + filter_selected(m_filter_highlight); + } + return false; + } + + if (exclusive_input_pressed(iptkey, IPT_UI_BACK, 0)) + { + if (m_ui_error) { // dismiss error - return; + return false; } else if (!is_special_main_menu() && m_search.empty()) { // pop the stack if this isn't the root session menu stack_pop(); - return; + return false; } } @@ -1492,11 +1885,12 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey) stack_pop(); machine().schedule_exit(); } - return; + return false; } // validate the current selection validate_selection(1); + bool updated(false); // accept left/right keys as-is with repeat if (exclusive_input_pressed(iptkey, IPT_UI_LEFT, (flags & PROCESS_LR_REPEAT) ? 6 : 0)) @@ -1504,12 +1898,28 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey) if (m_focus == focused_menu::RIGHTTOP) { // Swap the right panel and swallow it - m_right_panel = RP_IMAGES; iptkey = IPT_INVALID; + if (right_panel() != RP_IMAGES) + { + m_right_panel = RP_IMAGES; + updated = true; + } } - else + else if (show_right_panel()) { - return; + // Swap the right panel page and swallow it + if (right_panel() == RP_IMAGES) + { + iptkey = IPT_INVALID; + if (previous_image_view().first) + updated = true; + } + else if (right_panel() == RP_INFOS) + { + iptkey = IPT_INVALID; + if (previous_info_view().first) + updated = true; + } } } @@ -1519,71 +1929,120 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey) if (m_focus == focused_menu::RIGHTTOP) { // Swap the right panel and swallow it - m_right_panel = RP_INFOS; iptkey = IPT_INVALID; + if (right_panel() != RP_INFOS) + { + m_right_panel = RP_INFOS; + updated = true; + } } - else + else if (show_right_panel()) { - return; + // Swap the right panel page and swallow it + if (right_panel() == RP_IMAGES) + { + iptkey = IPT_INVALID; + if (next_image_view().first) + updated = true; + } + else if (right_panel() == RP_INFOS) + { + iptkey = IPT_INVALID; + if (next_info_view().first) + updated = true; + } } } // up backs up by one item if (exclusive_input_pressed(iptkey, IPT_UI_UP, 6)) { - if (show_left_panel() && m_focus == focused_menu::LEFT) + if (m_focus == focused_menu::LEFT) { - return; + // swallow it + iptkey = IPT_INVALID; + if (m_filter_highlight) + { + --m_filter_highlight; + updated = true; + } } - else if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM))) + else if ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)) { - m_topline_datsview--; - return; + // swallow it + iptkey = IPT_INVALID; + if (m_topline_datsview) + { + m_topline_datsview--; + updated = true; + } } else if (selected_index() == m_available_items + 1 || is_first_selected() || m_ui_error) { - return; + return updated; + } + else + { + set_selected_index(selected_index() - 1); + if (selected_index() == top_line && top_line != 0) + top_line--; } - - set_selected_index(selected_index() - 1); - - if (selected_index() == top_line && top_line != 0) - top_line--; } // down advances by one item if (exclusive_input_pressed(iptkey, IPT_UI_DOWN, 6)) { - if (show_left_panel() && m_focus == focused_menu::LEFT) + if (m_focus == focused_menu::LEFT) { - return; + // swallow it + iptkey = IPT_INVALID; + if ((m_left_item_count - 1) > m_filter_highlight) + { + ++m_filter_highlight; + updated = true; + } } - else if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM))) + else if ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)) { + // swallow it + iptkey = IPT_INVALID; + updated = true; m_topline_datsview++; - return; } else if (is_last_selected() || selected_index() == m_available_items - 1 || m_ui_error) { - return; + return updated; + } + else + { + set_selected_index(selected_index() + 1); + if (selected_index() == top_line + m_visible_items + (top_line != 0)) + top_line++; } - - set_selected_index(selected_index() + 1); - if (selected_index() == top_line + m_visible_items + (top_line != 0)) - top_line++; } // page up backs up by m_visible_items if (exclusive_input_pressed(iptkey, IPT_UI_PAGE_UP, 6)) { - // Infos - if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM))) + if (m_focus == focused_menu::LEFT) + { + // Filters - swallow it + iptkey = IPT_INVALID; + if (!left_at_top()) + { + updated = true; + m_left_visible_top -= std::min(std::max(m_left_visible_lines - 3, 1), m_left_visible_top); + m_filter_highlight = std::min(m_left_visible_top + m_left_visible_lines - 2, m_filter_highlight); + } + } + else if ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)) { + // Infos - swallow it + iptkey = IPT_INVALID; + updated = true; m_topline_datsview -= m_right_visible_lines - 3; - return; } - - if (selected_index() < m_available_items && !m_ui_error) + else if (selected_index() < m_available_items && !m_ui_error) { set_selected_index(std::max(selected_index() - m_visible_items, 0)); @@ -1594,14 +2053,25 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey) // page down advances by m_visible_items if (exclusive_input_pressed(iptkey, IPT_UI_PAGE_DOWN, 6)) { - // Infos - if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM))) + if (m_focus == focused_menu::LEFT) { + // Filters - swallow it + iptkey = IPT_INVALID; + if (!left_at_bottom()) + { + updated = true; + m_left_visible_top += std::min(std::max(m_left_visible_lines - 3, 1), m_left_item_count - m_left_visible_lines - m_left_visible_top); + m_filter_highlight = std::max(m_left_visible_top + 1, m_filter_highlight); + } + } + else if ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)) + { + // Infos - swallow it + iptkey = IPT_INVALID; + updated = true; m_topline_datsview += m_right_visible_lines - 3; - return; } - - if (selected_index() < m_available_items && !m_ui_error) + else if (selected_index() < m_available_items && !m_ui_error) { set_selected_index(std::min(selected_index() + m_visible_lines - 2 + (selected_index() == 0), m_available_items - 1)); @@ -1612,49 +2082,77 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey) // home goes to the start if (exclusive_input_pressed(iptkey, IPT_UI_HOME, 0)) { - if (show_left_panel() && m_focus == focused_menu::LEFT) + if (m_focus == focused_menu::LEFT) { - return; + // Filters - swallow it + iptkey = IPT_INVALID; + if (m_filter_highlight) + { + updated = true; + m_left_visible_top = 0; + m_filter_highlight = 0; + } } - else if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM))) + else if ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)) { + // Infos - swallow it + iptkey = IPT_INVALID; + if (m_topline_datsview) + updated = true; m_topline_datsview = 0; - return; } - - if (selected_index() < m_available_items && !m_ui_error) + else if (selected_index() < m_available_items && !m_ui_error) + { select_first_item(); + } } // end goes to the last if (exclusive_input_pressed(iptkey, IPT_UI_END, 0)) { - if (show_left_panel() && m_focus == focused_menu::LEFT) + if (m_focus == focused_menu::LEFT) { - return; + // Filters - swallow it + iptkey = IPT_INVALID; + if ((m_left_item_count - 1) != m_filter_highlight) + { + updated = true; + if (!left_at_bottom()) + m_left_visible_top = m_left_item_count - m_left_visible_lines; + m_filter_highlight = m_left_item_count - 1; + } } - else if (show_right_panel() && ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM))) + else if ((m_focus == focused_menu::RIGHTTOP) || (m_focus == focused_menu::RIGHTBOTTOM)) { + // Infos - swallow it + iptkey = IPT_INVALID; + updated = true; m_topline_datsview = m_total_lines; - return; } - - if (selected_index() < m_available_items && !m_ui_error) + else if (selected_index() < m_available_items && !m_ui_error) + { set_selected_index(top_line = m_available_items - 1); + } } // focus next rotates throw targets forward if (exclusive_input_pressed(iptkey, IPT_UI_FOCUS_NEXT, 12)) { if (!m_ui_error) + { rotate_focus(1); + updated = true; + } } // focus next rotates throw targets forward if (exclusive_input_pressed(iptkey, IPT_UI_FOCUS_PREV, 12)) { if (!m_ui_error) + { rotate_focus(-1); + updated = true; + } } // handle a toggle cheats request @@ -1691,238 +2189,942 @@ void menu_select_launch::handle_keys(u32 flags, int &iptkey) break; } } + return updated; } //------------------------------------------------- -// handle input events for main menu +// handle pointer input for main menu //------------------------------------------------- -void menu_select_launch::handle_events(u32 flags, event &ev) +std::tuple menu_select_launch::custom_pointer_updated(bool changed, ui_event const &uievt) { - if (m_pressed) + if (ui_event::type::POINTER_ABORT == uievt.event_type) + return std::make_tuple(IPT_INVALID, false, false); + + // if nothing's happening, check for clicks + if (pointer_idle()) { - bool const pressed = mouse_pressed(); - s32 target_x, target_y; - bool button; - render_target *const mouse_target = machine().ui_input().find_mouse(&target_x, &target_y, &button); - if (mouse_target && button && (hover() == HOVER_ARROW_DOWN || hover() == HOVER_ARROW_UP)) - { - if (pressed) - machine().ui_input().push_mouse_down_event(mouse_target, target_x, target_y); - } + if ((uievt.pointer_pressed & 0x01) && !(uievt.pointer_buttons & ~u32(0x01))) + return handle_primary_down(changed, uievt); + else if ((uievt.pointer_pressed & 0x02) && !(uievt.pointer_buttons & ~u32(0x02))) + return handle_right_down(changed, uievt); + else if ((uievt.pointer_pressed & 0x04) && !(uievt.pointer_buttons & ~u32(0x04))) + return handle_middle_down(changed, uievt); else + return std::make_tuple(IPT_INVALID, false, false); + } + + // handle in-progress actions + switch (m_pointer_action) + { + case pointer_action::NONE: + break; + case pointer_action::MAIN_TRACK_LINE: + return update_main_track_line(changed, uievt); + case pointer_action::MAIN_TRACK_RBUTTON: + return update_main_track_rbutton(changed, uievt); + case pointer_action::MAIN_DRAG: + return update_main_drag(changed, uievt); + case pointer_action::LEFT_TRACK_LINE: + return update_left_track_line(changed, uievt); + case pointer_action::LEFT_DRAG: + return update_left_drag(changed, uievt); + case pointer_action::RIGHT_TRACK_TAB: + return update_right_track_tab(changed, uievt); + case pointer_action::RIGHT_TRACK_ARROW: + return update_right_track_arrow(changed, uievt); + case pointer_action::RIGHT_TRACK_LINE: + return update_right_track_line(changed, uievt); + case pointer_action::RIGHT_SWITCH: + return update_right_switch(changed, uievt); + case pointer_action::RIGHT_DRAG: + return update_right_drag(changed, uievt); + case pointer_action::TOOLBAR_TRACK: + return update_toolbar_track(changed, uievt); + case pointer_action::DIVIDER_TRACK: + return update_divider_track(changed, uievt); + } + return std::make_tuple(IPT_INVALID, false, false); +} + + +//------------------------------------------------- +// handle primary click +//------------------------------------------------- + +std::tuple menu_select_launch::handle_primary_down(bool changed, ui_event const &uievt) +{ + if (m_ui_error) + { + m_ui_error = false; + m_error_text.clear(); + return std::make_tuple(IPT_INVALID, true, true); + } + + auto const [x, y] = pointer_location(); + + // check main item list + if ((x >= m_primary_items_hbounds.first) && (x < m_primary_items_hbounds.second) && (y > m_primary_items_top)) + { + int const line((y - m_primary_items_top) / line_height()); + if (line < (m_primary_lines + m_skip_main_items)) { - reset_pressed(); + int key(IPT_INVALID); + m_pointer_action = pointer_action::MAIN_TRACK_LINE; + m_base_pointer = m_last_pointer = std::make_pair(x, y); + m_clicked_line = line; + if (is_main_up_arrow(line)) + { + // top line is a scroll arrow + --top_line; + if (main_force_visible_selection()) + key = IPT_CUSTOM; // stop processing events so the info pane can be rebuilt + if (!main_at_top()) + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + else + m_pointer_action = pointer_action::NONE; + } + else if (is_main_down_arrow(line)) + { + // bottom line is a scroll arrow + ++top_line; + if (main_force_visible_selection()) + key = IPT_CUSTOM; // stop processing events so the info pane can be rebuilt + if (!main_at_bottom()) + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + else + m_pointer_action = pointer_action::NONE; + } + return std::make_tuple(key, true, true); } } - // loop while we have interesting events - bool stop(false), search_changed(false); - ui_event local_menu_event; - while (!stop && machine().ui_input().pop_event(&local_menu_event)) + // check filter list + if (show_left_panel() && (x >= m_left_items_hbounds.first) && (x < m_left_items_hbounds.second) && (y >= m_left_items_top)) { - switch (local_menu_event.event_type) + int const line((y - m_left_items_top) / m_info_line_height); + if (line < m_left_visible_lines) { - // if we are hovering over a valid item, select it with a single click - case ui_event::type::MOUSE_DOWN: - if (m_ui_error) + m_pointer_action = pointer_action::LEFT_TRACK_LINE; + m_base_pointer = m_last_pointer = std::make_pair(x, y); + m_clicked_line = line; + if (is_left_up_arrow(line)) { - ev.iptkey = IPT_OTHER; - stop = true; + // top line is a scroll arrow + --m_left_visible_top; + m_filter_highlight = std::min(m_left_visible_top + m_left_visible_lines - 2, m_filter_highlight); + if (!left_at_top()) + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + else + m_pointer_action = pointer_action::NONE; + } + else if (is_left_down_arrow(line)) + { + // bottom line is a scroll arrow + ++m_left_visible_top; + m_filter_highlight = std::max(m_left_visible_top + 1, m_filter_highlight); + if (!left_at_bottom()) + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + else + m_pointer_action = pointer_action::NONE; } else { - if (hover() >= 0 && hover() < item_count()) - { - if (hover() >= m_available_items - 1 && selected_index() < m_available_items) - m_prev_selected = get_selection_ref(); - set_selected_index(hover()); - m_focus = focused_menu::MAIN; - } - else if (hover() == HOVER_ARROW_UP) - { - set_selected_index(std::max(selected_index() - m_visible_items, 0)); - top_line -= m_visible_items - (top_line + m_visible_lines == m_available_items); - set_pressed(); - } - else if (hover() == HOVER_ARROW_DOWN) - { - set_selected_index(std::min(selected_index() + m_visible_lines - 2 + (selected_index() == 0), m_available_items - 1)); - top_line += m_visible_lines - 2; - set_pressed(); - } - else if (hover() == HOVER_UI_RIGHT) - ev.iptkey = IPT_UI_RIGHT; - else if (hover() == HOVER_UI_LEFT) - ev.iptkey = IPT_UI_LEFT; - else if (hover() == HOVER_DAT_DOWN) - m_topline_datsview += m_right_visible_lines - 3; - else if (hover() == HOVER_DAT_UP) - m_topline_datsview -= m_right_visible_lines - 3; - else if (hover() == HOVER_LPANEL_ARROW) + // ignore multi-click actions - someone hammered on the scroll arrow and hit the end + if (1 < uievt.pointer_clicks) + m_pointer_action = pointer_action::NONE; + } + return std::make_tuple(IPT_INVALID, true, true); + } + } + + // check right panel content + if (show_right_panel()) + { + // check right tabs + if ((x >= right_panel_left()) && (x < right_panel_right()) && (y >= m_primary_vbounds.first) && (y < m_right_tabs_bottom)) + { + int const tab((x - right_panel_left()) / right_tab_width()); + if (tab != m_right_panel) + { + m_pointer_action = pointer_action::RIGHT_TRACK_TAB; + m_clicked_line = tab; + } + return std::make_tuple(IPT_INVALID, true, pointer_action::NONE != m_pointer_action); + } + + if ((x >= m_right_content_hbounds.first) && (x < m_right_content_hbounds.second)) + { + // check right panel heading arrows + if ((ui_event::pointer::TOUCH != uievt.pointer_type) && (y >= right_arrows_top()) && (y < right_arrows_bottom())) + { + if ((x >= (m_right_content_hbounds.first + lr_border())) && (x < (m_right_content_hbounds.first + lr_border() + lr_arrow_width()))) { - if (get_focus() == focused_menu::LEFT) + auto const [updated, notend] = previous_right_panel_view(); + if (notend) { - set_focus(focused_menu::MAIN); - select_prev(); + m_pointer_action = pointer_action::RIGHT_TRACK_ARROW; + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(600); + m_base_pointer = m_last_pointer = std::make_pair(x, y); + m_clicked_line = 0; } - - m_panels_status ^= HIDE_LEFT_PANEL; + return std::make_tuple(IPT_INVALID, true, updated); } - else if (hover() == HOVER_RPANEL_ARROW) + else if ((x >= (m_right_content_hbounds.second - lr_border() - lr_arrow_width())) && (x < (m_right_content_hbounds.second - lr_border()))) { - if ((get_focus() == focused_menu::RIGHTTOP) || (get_focus() == focused_menu::RIGHTBOTTOM)) + auto const [updated, notend] = next_right_panel_view(); + if (notend) { - set_focus(focused_menu::MAIN); - select_prev(); + m_pointer_action = pointer_action::RIGHT_TRACK_ARROW; + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(600); + m_base_pointer = m_last_pointer = std::make_pair(x, y); + m_clicked_line = 1; } + return std::make_tuple(IPT_INVALID, true, updated); + } + } - m_panels_status ^= HIDE_RIGHT_PANEL; + // check right panel heading touch swipe + if ((ui_event::pointer::TOUCH == uievt.pointer_type) && (y >= m_right_heading_top) && (y < (m_right_heading_top + line_height()))) + { + m_pointer_action = pointer_action::RIGHT_SWITCH; + m_base_pointer = m_last_pointer = std::make_pair(x, y); + m_clicked_line = 0; + if (right_panel() == RP_IMAGES) + { + m_clicked_line = m_image_view; } - else if (hover() == HOVER_B_FAV) + else if (right_panel() == RP_INFOS) { - ev.iptkey = IPT_UI_FAVORITES; - stop = true; + ui_software_info const *software; + ui_system_info const *system; + get_selection(software, system); + if (software && !software->startempty) + m_clicked_line = ui_globals::cur_sw_dats_view; + else if (system || (software && software->driver)) + m_clicked_line = ui_globals::curdats_view; } - else if (hover() == HOVER_B_EXPORT) + return std::make_tuple(IPT_INVALID, true, true); + } + + // check info scroll + if ((RP_INFOS == m_right_panel) && (y >= m_right_content_vbounds.first) && (y < (m_right_content_vbounds.first + (float(m_right_visible_lines) * m_info_line_height)))) + { + int const line((y - m_right_content_vbounds.first) / m_info_line_height); + if (line < m_right_visible_lines) { - inkey_export(); - stop = true; + bool redraw(false); + m_base_pointer = m_last_pointer = std::make_pair(x, y); + m_clicked_line = line; + if (!line && !info_at_top()) + { + redraw = true; + --m_topline_datsview; + if (!info_at_top()) + { + m_pointer_action = pointer_action::RIGHT_TRACK_LINE; + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + } + } + else if ((line == (m_right_visible_lines - 1)) && !info_at_bottom()) + { + redraw = true; + ++m_topline_datsview; + if (!info_at_bottom()) + { + m_pointer_action = pointer_action::RIGHT_TRACK_LINE; + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + } + } + else if (ui_event::pointer::TOUCH == uievt.pointer_type) + { + m_pointer_action = pointer_action::RIGHT_DRAG; + m_clicked_line = m_topline_datsview; + } + return std::make_tuple(IPT_INVALID, true, redraw); } - else if (hover() == HOVER_B_AUDIT) + } + } + } + + // check toolbar + if ((y >= m_toolbar_button_vbounds.first) && (y < m_toolbar_button_vbounds.second)) + { + if ((x >= m_toolbar_backtrack_left) && (x < (m_toolbar_backtrack_left + m_toolbar_button_width))) + { + m_pointer_action = pointer_action::TOOLBAR_TRACK; + m_clicked_line = -1; + return std::make_tuple(IPT_INVALID, true, true); + } + else + { + unsigned const toolbar_count(m_is_swlist ? std::size(SW_TOOLBAR_BITMAPS) : std::size(SYS_TOOLBAR_BITMAPS)); + float const button(std::floor((x - m_toolbar_main_left) / m_toolbar_button_spacing)); + int const n(button); + if ((n >= 0) && (n < toolbar_count) && (x < (m_toolbar_main_left + (button * m_toolbar_button_spacing) + m_toolbar_button_width))) + { + m_pointer_action = pointer_action::TOOLBAR_TRACK; + m_clicked_line = n; + return std::make_tuple(IPT_INVALID, true, true); + } + } + } + + // check dividers + if ((y >= m_primary_vbounds.first) && (y < m_primary_vbounds.second)) + { + if ((x >= left_divider_left()) && (x < left_divider_right())) + { + m_pointer_action = pointer_action::DIVIDER_TRACK; + m_clicked_line = 0; + return std::make_tuple(IPT_INVALID, true, true); + } + else if ((x >= right_divider_left()) && (x < right_divider_right())) + { + m_pointer_action = pointer_action::DIVIDER_TRACK; + m_clicked_line = 1; + return std::make_tuple(IPT_INVALID, true, true); + } + } + + return std::make_tuple(IPT_INVALID, false, false); +} + + +//------------------------------------------------- +// handle right click +//------------------------------------------------- + +std::tuple menu_select_launch::handle_right_down(bool changed, ui_event const &uievt) +{ + if (m_ui_error) + return std::make_tuple(IPT_INVALID, false, false); + + // check main item list + auto const [x, y] = pointer_location(); + if ((x >= m_primary_items_hbounds.first) && (x < m_primary_items_hbounds.second) && (y > m_primary_items_top)) + { + int const line((y - m_primary_items_top) / line_height()); + if ((line < m_primary_lines) && !is_main_up_arrow(line) && (!is_main_down_arrow(line))) + { + m_pointer_action = pointer_action::MAIN_TRACK_RBUTTON; + m_base_pointer = m_last_pointer = std::make_pair(x, y); + m_clicked_line = line; + return std::make_tuple(IPT_INVALID, true, true); + } + } + + return std::make_tuple(IPT_INVALID, false, false); +} + + +//------------------------------------------------- +// handle middle click +//------------------------------------------------- + +std::tuple menu_select_launch::handle_middle_down(bool changed, ui_event const &uievt) +{ + if (m_ui_error) + return std::make_tuple(IPT_INVALID, false, false); + + auto const [x, y] = pointer_location(); + if ((y >= m_primary_vbounds.first) && (y < m_primary_vbounds.second)) + { + if ((x >= left_divider_right()) && (x < right_divider_left())) + { + // main list + if (m_skip_main_items && (y >= (m_primary_items_top + ((float(m_primary_lines) + ((item(m_available_items).type() == menu_item_type::SEPARATOR) ? 0.5F : 0.0F)) * line_height())))) + { + if (selected_index() < m_available_items) { - ev.iptkey = IPT_UI_AUDIT; - stop = true; + m_prev_selected = get_selection_ref(); + set_selected_index(m_available_items + 1); } - else if (hover() == HOVER_B_DATS) + } + else + { + if ((get_focus() != focused_menu::MAIN) || (selected_index() > m_available_items)) + select_prev(); + } + set_focus(focused_menu::MAIN); + } + else if ((x >= left_panel_left()) && (x < left_panel_right())) + { + // left panel + assert(show_left_panel()); + if ((get_focus() == focused_menu::MAIN) && (selected_index() <= m_available_items)) + m_prev_selected = get_selection_ref(); + set_focus(focused_menu::LEFT); + return std::make_tuple(IPT_INVALID, true, true); + } + else if ((x >= right_panel_left()) && (x < right_panel_right())) + { + // right panel + assert(show_right_panel()); + if ((get_focus() == focused_menu::MAIN) && (selected_index() <= m_available_items)) + m_prev_selected = get_selection_ref(); + set_focus((y < m_right_tabs_bottom) ? focused_menu::RIGHTTOP : focused_menu::RIGHTBOTTOM); + return std::make_tuple(IPT_INVALID, true, true); + } + } + + return std::make_tuple(IPT_INVALID, false, false); +} + + +//------------------------------------------------- +// track click on main item +//------------------------------------------------- + +std::tuple menu_select_launch::update_main_track_line(bool changed, ui_event const &uievt) +{ + auto const [x, y] = pointer_location(); + float const itemtop(m_primary_items_top + (float(m_clicked_line) * line_height())); + float const itembottom(m_primary_items_top + (float(m_clicked_line + 1) * line_height())); + int key(IPT_INVALID); + bool redraw(false); + + if (is_main_up_arrow(m_clicked_line) || is_main_down_arrow(m_clicked_line)) + { + // top or bottom line is a scroll arrow + bool const reentered(reentered_rect(m_last_pointer.first, m_last_pointer.second, x, y, m_primary_items_hbounds.first, itemtop, m_primary_items_hbounds.second, itembottom)); + if (reentered) + { + auto const now(std::chrono::steady_clock::now()); + if (now >= m_scroll_repeat) + { + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(100); + if (!m_clicked_line) { - inkey_dats(); - stop = true; + --top_line; + if (main_at_top()) + m_pointer_action = pointer_action::NONE; } - else if (hover() == HOVER_BACKTRACK) + else { - ev.iptkey = IPT_UI_BACK; - stack_pop(); - if (is_special_main_menu()) - machine().schedule_exit(); - stop = true; + ++top_line; + if (main_at_bottom()) + m_pointer_action = pointer_action::NONE; } - else if (hover() >= HOVER_RP_FIRST && hover() <= HOVER_RP_LAST) + if (main_force_visible_selection()) + key = IPT_CUSTOM; // stop processing events so the info pane can be rebuilt + redraw = true; + } + } + } + else + { + // check for conversion to touch scroll + if (ui_event::pointer::TOUCH == uievt.pointer_type) + { + auto const [h, v] = check_drag_conversion(x, y, m_base_pointer.first, m_base_pointer.second, line_height()); + if (h || (v && (m_clicked_line >= m_primary_lines))) + { + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, false, true); + } + else if (v) + { + m_pointer_action = pointer_action::MAIN_DRAG; + m_last_pointer = m_base_pointer; + m_clicked_line = top_line; + return update_main_drag(changed, uievt); + } + } + + // check to see if they released over the item + if (uievt.pointer_released & 0x01) + { + m_pointer_action = pointer_action::NONE; + if ((0 < uievt.pointer_clicks) || ((x >= m_primary_items_hbounds.first) && (x < m_primary_items_hbounds.second) && (y >= itemtop) && (y < itembottom))) + { + if (m_clicked_line < m_visible_lines) { - m_right_panel = (HOVER_RP_FIRST - hover()) * (-1); - stop = true; + // systems or software items are always selectable + if (2 == uievt.pointer_clicks) + key = IPT_UI_SELECT; + else if (selected_index() != (m_clicked_line + top_line)) + key = IPT_CUSTOM; // stop processing events so the info pane can be rebuilt + set_selected_index(m_clicked_line + top_line); + set_focus(focused_menu::MAIN); } - else if (hover() >= HOVER_FILTER_FIRST && hover() <= HOVER_FILTER_LAST) + else if ((m_clicked_line >= m_primary_lines) && (m_clicked_line < (m_primary_lines + m_skip_main_items))) { - m_filter_highlight = hover() - HOVER_FILTER_FIRST; - filter_selected(); - stop = true; + // need to ensure this is a selectable item + int const itemnum(m_available_items + m_clicked_line - m_primary_lines); + if (is_selectable(item(itemnum))) + { + if (selected_index() < m_available_items) + m_prev_selected = get_selection_ref(); + set_selected_index(itemnum); + set_focus(focused_menu::MAIN); + if (2 == uievt.pointer_clicks) + key = IPT_UI_SELECT; + } } } - break; + return std::make_tuple(key, false, true); + } + } - // if we are hovering over a valid item, fake a UI_SELECT with a double-click - case ui_event::type::MOUSE_DOUBLE_CLICK: - if (hover() >= 0 && hover() < item_count()) - { - set_selected_index(hover()); - ev.iptkey = IPT_UI_SELECT; - } - stop = true; - break; + // stop tracking if the primary button is released or another button is pressed + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + if (pointer_action::NONE != m_pointer_action) + m_last_pointer = std::make_pair(x, y); + return std::make_tuple(key, pointer_action::NONE != m_pointer_action, redraw); +} - // caught scroll event - case ui_event::type::MOUSE_WHEEL: - if (hover() >= 0 && hover() < item_count() - m_skip_main_items) + +//------------------------------------------------- +// track right click +//------------------------------------------------- + +std::tuple menu_select_launch::update_main_track_rbutton(bool changed, ui_event const &uievt) +{ + // see if it was released inside the line + if (uievt.pointer_released & 0x02) + { + m_pointer_action = pointer_action::NONE; + auto const [x, y] = pointer_location(); + float const linetop(m_primary_items_top + (float(m_clicked_line) * line_height())); + float const linebottom(m_primary_items_top + (float(m_clicked_line + 1) * line_height())); + if ((x >= m_primary_items_hbounds.first) && (x < m_primary_items_hbounds.second) && (y >= linetop) && (y < linebottom)) + { + show_config_menu(m_clicked_line + top_line); + return std::make_tuple(IPT_CUSTOM, false, false); // return IPT_CUSTOM to stop processing events + } + } + + // stop tracking if another button is pressed + if (uievt.pointer_pressed & ~u32(0x02)) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, pointer_action::DIVIDER_TRACK != m_pointer_action); +} + + +//------------------------------------------------- +// track main touch drag scroll +//------------------------------------------------- + +std::tuple menu_select_launch::update_main_drag(bool changed, ui_event const &uievt) +{ + auto const newtop(drag_scroll( + pointer_location().second, m_base_pointer.second, m_last_pointer.second, -line_height(), + m_clicked_line, 0, m_available_items - m_primary_lines)); + bool const moved(newtop != top_line); + int key(IPT_INVALID); + if (moved) + { + // scroll and move the selection if necessary to keep it in the visible range + top_line = newtop; + if (main_force_visible_selection()) + key = IPT_CUSTOM; // stop processing events so the info pane can be rebuilt + } + + // stop tracking if the primary button is released or another button is pressed + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(key, pointer_action::NONE != m_pointer_action, moved); +} + + +//------------------------------------------------- +// track click on left panel item +//------------------------------------------------- + +std::tuple menu_select_launch::update_left_track_line(bool changed, ui_event const &uievt) +{ + auto const [x, y] = pointer_location(); + float const itemtop(m_left_items_top + (float(m_clicked_line) * m_info_line_height)); + float const itembottom(m_left_items_top + (float(m_clicked_line + 1) * m_info_line_height)); + bool redraw(false); + + if (is_left_up_arrow(m_clicked_line) || is_left_down_arrow(m_clicked_line)) + { + // top or bottom line is a scroll arrow + bool const reentered(reentered_rect(m_last_pointer.first, m_last_pointer.second, x, y, m_left_items_hbounds.first, itemtop, m_left_items_hbounds.second, itembottom)); + if (reentered) + { + auto const now(std::chrono::steady_clock::now()); + if (now >= m_scroll_repeat) { - if (local_menu_event.zdelta > 0) + m_scroll_repeat = now + std::chrono::milliseconds(100); + if (!m_clicked_line) { - if (selected_index() >= m_available_items || is_first_selected() || m_ui_error) - break; - set_selected_index(selected_index() - local_menu_event.num_lines); - if (selected_index() < top_line + (top_line != 0)) - top_line -= local_menu_event.num_lines; + --m_left_visible_top; + m_filter_highlight = std::min(m_left_visible_top + m_left_visible_lines - 2, m_filter_highlight); + if (left_at_top()) + m_pointer_action = pointer_action::NONE; } else { - if (selected_index() >= m_available_items - 1 || m_ui_error) - break; - set_selected_index(std::min(selected_index() + local_menu_event.num_lines, m_available_items - 1)); - if (selected_index() >= top_line + m_visible_items + (top_line != 0)) - top_line += local_menu_event.num_lines; + ++m_left_visible_top; + m_filter_highlight = std::max(m_left_visible_top + 1, m_filter_highlight); + if (left_at_bottom()) + m_pointer_action = pointer_action::NONE; } + redraw = true; } - else if (hover() == HOVER_INFO_TEXT) + } + } + else + { + // check for conversion to touch scroll + if (ui_event::pointer::TOUCH == uievt.pointer_type) + { + auto const [h, v] = check_drag_conversion(x, y, m_base_pointer.first, m_base_pointer.second, m_info_line_height); + if (h) { - if (local_menu_event.zdelta > 0) - m_topline_datsview -= local_menu_event.num_lines; - else - m_topline_datsview += local_menu_event.num_lines; + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, false, true); } - break; - - // translate CHAR events into specials - case ui_event::type::IME_CHAR: - if (exclusive_input_pressed(ev.iptkey, IPT_UI_FOCUS_NEXT, 0) || exclusive_input_pressed(ev.iptkey, IPT_UI_FOCUS_PREV, 0)) + else if (v) { - stop = true; + m_pointer_action = pointer_action::LEFT_DRAG; + m_last_pointer = m_base_pointer; + m_clicked_line = m_left_visible_top; + return update_left_drag(changed, uievt); } - else if (m_ui_error) + } + + // this is a filter - check to see if they released over the item + if ((uievt.pointer_released & 0x01) && (x >= m_left_items_hbounds.first) && (x < m_left_items_hbounds.second) && (y >= itemtop) && (y < itembottom)) + { + m_pointer_action = pointer_action::NONE; + filter_selected(m_left_visible_top + m_clicked_line); + return std::make_tuple(IPT_CUSTOM, false, true); // return IPT_CUSTOM to stop processing events + } + } + + // stop tracking if the primary button is released or another button is pressed + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + if (pointer_action::NONE != m_pointer_action) + m_last_pointer = std::make_pair(x, y); + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, redraw); +} + + +//------------------------------------------------- +// track left panel touch drag scroll +//------------------------------------------------- + +std::tuple menu_select_launch::update_left_drag(bool changed, ui_event const &uievt) +{ + auto const newtop(drag_scroll( + pointer_location().second, m_base_pointer.second, m_last_pointer.second, -m_info_line_height, + m_clicked_line, 0, m_left_item_count - m_left_visible_lines)); + bool const moved(newtop != m_left_visible_top); + if (moved) + { + // scroll and move the selection if necessary to keep it in the visible range + m_left_visible_top = newtop; + int const first(left_at_top() ? 0 : (newtop + 1)); + int const last(newtop + m_left_visible_lines - (left_at_bottom() ? 1 : 2)); + m_filter_highlight = std::clamp(m_filter_highlight, first, last); + } + + // stop tracking if the primary button is released or another button is pressed + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, moved); +} + + +//------------------------------------------------- +// track click on right panel tab +//------------------------------------------------- + +std::tuple menu_select_launch::update_right_track_tab(bool changed, ui_event const &uievt) +{ + // see if it was released inside the divider + if (uievt.pointer_released & 0x01) + { + m_pointer_action = pointer_action::NONE; + auto const [x, y] = pointer_location(); + float const left(right_panel_left() + (float(m_clicked_line) * right_tab_width())); + float const right(right_panel_left() + (float(m_clicked_line + 1) * right_tab_width())); + if ((x >= left) && (x < right) && (y >= m_primary_vbounds.first) && (y < m_right_tabs_bottom)) + { + m_right_panel = m_clicked_line; + return std::make_tuple(IPT_CUSTOM, false, true); // return IPT_CUSTOM to stop processing events + } + } + + // stop tracking if another button is pressed + if (uievt.pointer_pressed & ~u32(0x01)) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, pointer_action::DIVIDER_TRACK != m_pointer_action); +} + + +//------------------------------------------------- +// track right panel heading left/right arrows +//------------------------------------------------- + +std::tuple menu_select_launch::update_right_track_arrow(bool changed, ui_event const &uievt) +{ + auto const [x, y] = pointer_location(); + float const left(m_clicked_line ? (m_right_content_hbounds.second - lr_border() - lr_arrow_width()) : (m_right_content_hbounds.first + lr_border())); + float const right(m_clicked_line ? (m_right_content_hbounds.second - lr_border()) : (m_right_content_hbounds.first + lr_border() + lr_arrow_width())); + + // check for reentry + bool redraw(false); + bool const reentered(reentered_rect(m_last_pointer.first, m_last_pointer.second, x, y, left, right_arrows_top(), right, right_arrows_bottom())); + if (reentered) + { + auto const now(std::chrono::steady_clock::now()); + if (now >= m_scroll_repeat) + { + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(200); + bool notend; + std::tie(redraw, notend) = m_clicked_line ? next_right_panel_view() : previous_right_panel_view(); + if (!notend) + m_pointer_action = pointer_action::NONE; + } + } + + // stop tracking if the primary button is released or another button is pressed + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + if (pointer_action::NONE != m_pointer_action) + m_last_pointer = std::make_pair(x, y); + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, redraw); +} + + +//------------------------------------------------- +// track right scroll arrows +//------------------------------------------------- + +std::tuple menu_select_launch::update_right_track_line(bool changed, ui_event const &uievt) +{ + auto const [x, y] = pointer_location(); + float const itemtop(m_right_content_vbounds.first + (float(m_clicked_line) * m_info_line_height)); + float const itembottom(m_right_content_vbounds.first + (float(m_clicked_line + 1) * m_info_line_height)); + bool redraw(false); + + bool const reentered(reentered_rect(m_last_pointer.first, m_last_pointer.second, x, y, m_right_content_hbounds.first, itemtop, m_right_content_hbounds.second, itembottom)); + if (reentered) + { + auto const now(std::chrono::steady_clock::now()); + if (now >= m_scroll_repeat) + { + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(100); + if (!m_clicked_line) { - ev.iptkey = IPT_SPECIAL; - stop = true; + --m_topline_datsview; + if (info_at_top()) + m_pointer_action = pointer_action::NONE; } - else if (accept_search()) + else { - if (input_character(m_search, local_menu_event.ch, uchar_is_printable)) - search_changed = true; + ++m_topline_datsview; + if (info_at_bottom()) + m_pointer_action = pointer_action::NONE; } - break; + redraw = true; + } + } + + // stop tracking if the primary button is released or another button is pressed + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + if (pointer_action::NONE != m_pointer_action) + m_last_pointer = std::make_pair(x, y); + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, redraw); +} + - case ui_event::type::MOUSE_RDOWN: - if (hover() >= 0 && hover() < item_count() - m_skip_main_items) +//------------------------------------------------- +// track panel heading touch drag switch +//------------------------------------------------- + +std::tuple menu_select_launch::update_right_switch(bool changed, ui_event const &uievt) +{ + // get new page + ui_software_info const *software; + ui_system_info const *system; + get_selection(software, system); + int const min((RP_IMAGES == m_right_panel) ? FIRST_VIEW : 0); + int const max( + (RP_IMAGES == m_right_panel) ? LAST_VIEW : + (software && !software->startempty) ? (ui_globals::cur_sw_dats_total - 1) : + (system || (software && software->driver)) ? (ui_globals::curdats_total - 1) : + 0); + auto const newpage(drag_scroll( + pointer_location().first, m_base_pointer.first, m_last_pointer.first, 0.125F * (m_right_content_hbounds.first - m_right_content_hbounds.second), + m_clicked_line, min, max)); + + // switch page + u8 dummy(newpage); + u8 ¤t( + (RP_IMAGES == m_right_panel) ? m_image_view : + (software && !software->startempty) ? ui_globals::cur_sw_dats_view : + (system || (software && software->driver)) ? ui_globals::curdats_view : + dummy); + bool const redraw(newpage != current); + if (redraw) + { + current = newpage; + if (RP_IMAGES == m_right_panel) + set_switch_image(); + else + m_topline_datsview = 0; + } + + // stop tracking if the primary button is released or another button is pressed + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, redraw); +} + + +//------------------------------------------------- +// track right panel touch drag scroll +//------------------------------------------------- + +std::tuple menu_select_launch::update_right_drag(bool changed, ui_event const &uievt) +{ + auto const newtop(drag_scroll( + pointer_location().second, m_base_pointer.second, m_last_pointer.second, -m_info_line_height, + m_clicked_line, 0, m_total_lines - m_right_visible_lines)); + bool const moved(newtop != m_topline_datsview); + m_topline_datsview = newtop; + + // stop tracking if the primary button is released or another button is pressed + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, moved); +} + + +//------------------------------------------------- +// track click on toolbar button +//------------------------------------------------- + +std::tuple menu_select_launch::update_toolbar_track(bool changed, ui_event const &uievt) +{ + // see if it was released inside the button + if (uievt.pointer_released & 0x01) + { + m_pointer_action = pointer_action::NONE; + auto const [x, y] = pointer_location(); + float const left((0 > m_clicked_line) ? m_toolbar_backtrack_left : (m_toolbar_main_left + (float(m_clicked_line) * m_toolbar_button_spacing))); + if ((x >= left) && (x < (left + m_toolbar_button_width)) && (y >= m_toolbar_button_vbounds.first) && (y < m_toolbar_button_vbounds.second)) + { + if (0 > m_clicked_line) { - set_selected_index(hover()); - m_prev_selected = get_selection_ref(); - m_focus = focused_menu::MAIN; - ev.iptkey = IPT_CUSTOM; - ev.mouse.x0 = local_menu_event.mouse_x; - ev.mouse.y0 = local_menu_event.mouse_y; - stop = true; + // backtrack button + stack_pop(); + if (is_special_main_menu()) + machine().schedule_exit(); + return std::make_tuple(IPT_UI_BACK, false, true); } - break; + else + { + // main buttons + auto const *const toolbar_bitmaps(m_is_swlist ? SW_TOOLBAR_BITMAPS : SYS_TOOLBAR_BITMAPS); + auto const [bitmap, action, need_selection] = toolbar_bitmaps[m_clicked_line]; + switch (action) + { + case IPT_UI_EXPORT: + inkey_export(); + break; + case IPT_UI_DATS: + inkey_dats(); + break; + default: + return std::make_tuple(action, false, true); + } + return std::make_tuple(IPT_CUSTOM, false, true); // return IPT_CUSTOM to stop processing events + } + } + } - // ignore everything else - default: - break; + // stop tracking if another button is pressed + if (uievt.pointer_pressed & ~u32(0x01)) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, pointer_action::TOOLBAR_TRACK != m_pointer_action); +} + + +//------------------------------------------------- +// track click on divider +//------------------------------------------------- + +std::tuple menu_select_launch::update_divider_track(bool changed, ui_event const &uievt) +{ + // see if it was released inside the divider + if (uievt.pointer_released & 0x01) + { + m_pointer_action = pointer_action::NONE; + auto const [x, y] = pointer_location(); + float const left(m_clicked_line ? right_divider_left() : left_divider_left()); + float const right(m_clicked_line ? right_divider_right() : left_divider_right()); + if ((x >= left) && (x < right) && (y >= m_primary_vbounds.first) && (y < m_primary_vbounds.second)) + { + if (m_clicked_line) + { + if ((get_focus() == focused_menu::RIGHTTOP) || (get_focus() == focused_menu::RIGHTBOTTOM)) + { + set_focus(focused_menu::MAIN); + select_prev(); + } + m_panels_status ^= HIDE_RIGHT_PANEL; + } + else + { + if (get_focus() == focused_menu::LEFT) + { + set_focus(focused_menu::MAIN); + select_prev(); + } + m_panels_status ^= HIDE_LEFT_PANEL; + } + return std::make_tuple(IPT_CUSTOM, false, true); // return IPT_CUSTOM to stop processing events } + } - // need to update search before processing certain kinds of events, but others don't matter - if (search_changed) + // stop tracking if another button is pressed + if (uievt.pointer_pressed & ~u32(0x01)) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, pointer_action::DIVIDER_TRACK != m_pointer_action); +} + + +//------------------------------------------------- +// move selection to visible range +//------------------------------------------------- + +bool menu_select_launch::main_force_visible_selection() +{ + int const first(main_at_top() ? 0 : (top_line + 1)); + int const last(top_line + m_primary_lines - (main_at_bottom() ? 1 : 2)); + if (selected_index() < m_available_items) + { + int const restricted(std::clamp(selected_index(), first, last)); + if (selected_index() != restricted) + { + set_selected_index(restricted); + return true; + } + } + else + { + int selection(0); + while ((m_available_items > selection) && (item(selection).ref() != m_prev_selected)) + ++selection; + auto const ref(item(std::clamp(selection, first, last)).ref()); + if (ref != m_prev_selected) { - switch (machine().ui_input().peek_event_type()) - { - case ui_event::type::MOUSE_DOWN: - case ui_event::type::MOUSE_RDOWN: - case ui_event::type::MOUSE_DOUBLE_CLICK: - case ui_event::type::MOUSE_WHEEL: - stop = true; - break; - case ui_event::type::NONE: - case ui_event::type::WINDOW_FOCUS: - case ui_event::type::WINDOW_DEFOCUS: - case ui_event::type::MOUSE_MOVE: - case ui_event::type::MOUSE_LEAVE: - case ui_event::type::MOUSE_UP: - case ui_event::type::MOUSE_RUP: - case ui_event::type::IME_CHAR: - break; - } + m_prev_selected = ref; + return true; } } - if (search_changed) - reset(reset_options::SELECT_FIRST); + return false; } @@ -1932,57 +3134,22 @@ void menu_select_launch::handle_events(u32 flags, event &ev) void menu_select_launch::draw(u32 flags) { - bool noinput = (flags & PROCESS_NOINPUT); - float const icon_offset = m_has_icons ? (1.5f * ud_arrow_width()) : 0.0f; - float right_panel_size = show_right_panel() ? 0.3f : m_divider_width; - float visible_width = 1.0f - 4.0f * lr_border(); - float primary_left = (1.0f - visible_width) * 0.5f; - float primary_width = visible_width; - draw_background(); + // recompute height of primary menu area if necessary + if (m_primary_vbounds.first >= m_primary_vbounds.second) + { + float const pixelheight(target_size().second); + float const lines(std::floor((1.0F - (4.0F * tb_border()) - get_customtop() - get_custombottom()) / line_height())); + float const itemsheight(line_height() * lines); + float const space(1.0F - itemsheight - get_customtop() - get_custombottom()); + m_primary_items_top = std::round((get_customtop() + (0.5F * space)) * pixelheight) / pixelheight; + m_primary_vbounds = std::make_pair(m_primary_items_top - tb_border(), m_primary_items_top + itemsheight + tb_border()); + m_primary_lines = int(lines) - m_skip_main_items; + } - clear_hover(); + // ensure the selection is visible m_available_items = item_count() - m_skip_main_items; - float extra_height = m_skip_main_items * line_height(); - float visible_extra_menu_height = get_customtop() + get_custombottom() + extra_height; - - // locate mouse - if (noinput) - ignore_mouse(); - else - map_mouse(); - - // account for extra space at the top and bottom - float visible_main_menu_height = 1.0f - 2.0f * tb_border() - visible_extra_menu_height; - m_visible_lines = int(std::trunc(visible_main_menu_height / line_height())); - visible_main_menu_height = float(m_visible_lines) * line_height(); - - // compute top/left of inner menu area by centering - float visible_left = primary_left; - float visible_top = (1.0f - (visible_main_menu_height + visible_extra_menu_height)) * 0.5f; - - // if the menu is at the bottom of the extra, adjust - visible_top += get_customtop(); - - // compute left box size - float x1 = visible_left - lr_border(); - float y1 = visible_top - tb_border(); - float x2 = x1 + 2.0f * lr_border(); - float y2 = visible_top + visible_main_menu_height + tb_border() + extra_height; - - // add left box - visible_left = draw_left_panel(x1, y1, x2, y2); - visible_width -= right_panel_size + visible_left - 2.0f * lr_border(); - - // compute and add main box - x1 = visible_left - lr_border(); - x2 = visible_left + visible_width + lr_border(); - float line = visible_top + (float(m_visible_lines) * line_height()); - ui().draw_outlined_box(container(), x1, y1, x2, y2, ui().colors().background_color()); - - // make sure the selection - if (m_available_items < m_visible_lines) - m_visible_lines = m_available_items; + m_visible_lines = (std::min)(m_primary_lines, m_available_items); int selection; if (selected_index() < m_available_items) { @@ -2007,35 +3174,41 @@ void menu_select_launch::draw(u32 flags) else if (selection >= (top_line + m_visible_lines - 2)) top_line = selection - m_visible_lines + ((selection == (m_available_items - 1)) ? 1: 2); } - - // determine effective positions taking into account the hilighting arrows - float effective_width = visible_width - 2.0f * gutter_width(); - float effective_left = visible_left + gutter_width(); - if ((m_focus == focused_menu::MAIN) && (selected_index() < m_available_items)) m_prev_selected = nullptr; - int const n_loop = (std::min)(m_visible_lines, m_available_items); - float const pixelheight = machine().render().ui_target().height(); - for (int linenum = 0; linenum < n_loop; linenum++) + // draw background, left and right panels, and outline of main box + draw_background(); + draw_left_panel(flags); + draw_right_panel(flags); + ui().draw_outlined_box( + container(), + left_divider_right(), m_primary_vbounds.first, right_divider_left(), m_primary_vbounds.second, + ui().colors().background_color()); + + // calculate horizontal geometry of main item list + m_primary_items_hbounds = std::make_pair(left_divider_right() + lr_border(), right_divider_left() - lr_border()); + float const item_text_left(m_primary_items_hbounds.first + gutter_width()); + float const item_text_width(m_primary_items_hbounds.second - m_primary_items_hbounds.first - (2.0F * gutter_width())); + float const icon_offset(m_has_icons ? (1.5F * ud_arrow_width()) : 0.0F); + + // draw main scrolling items + for (int linenum = 0; linenum < m_visible_lines; linenum++) { - float line_y = (std::round(visible_top * pixelheight) / pixelheight) + (float(linenum) * line_height()); - int itemnum = top_line + linenum; - const menu_item &pitem = item(itemnum); - const std::string_view itemtext = pitem.text(); + int const itemnum(top_line + linenum); + menu_item const &pitem(item(itemnum)); + std::string_view const itemtext(pitem.text()); + float const linetop(m_primary_items_top + (float(linenum) * line_height())); + float const linebottom(linetop + line_height()); + + // work out colours rgb_t fgcolor = ui().colors().text_color(); rgb_t bgcolor = ui().colors().text_bg_color(); rgb_t fgcolor3 = ui().colors().clone_color(); - float line_x0 = x1 + 0.5f * UI_LINE_WIDTH; - float line_y0 = line_y; - float line_x1 = x2 - 0.5f * UI_LINE_WIDTH; - float line_y1 = line_y + line_height(); - - // set the hover if this is our item - if (mouse_in_rect(line_x0, line_y0, line_x1, line_y1) && is_selectable(pitem)) - set_hover(itemnum); - - if (is_selected(itemnum) && m_focus == focused_menu::MAIN) + bool const hovered(is_selectable(pitem) && pointer_in_rect(m_primary_items_hbounds.first, linetop, m_primary_items_hbounds.second, linebottom)); + bool const pointerline((pointer_action::MAIN_TRACK_LINE == m_pointer_action) && (linenum == m_clicked_line)); + bool const rclickline((pointer_action::MAIN_TRACK_RBUTTON == m_pointer_action) && (linenum == m_clicked_line)); + if (!rclickline && is_selected(itemnum) && (get_focus() == focused_menu::MAIN)) { // if we're selected, draw with a different background fgcolor = rgb_t(0xff, 0xff, 0x00); @@ -2043,173 +3216,177 @@ void menu_select_launch::draw(u32 flags) fgcolor3 = rgb_t(0xcc, 0xcc, 0x00); ui().draw_textured_box( container(), - line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, + m_primary_items_hbounds.first, linetop, m_primary_items_hbounds.second, linebottom, bgcolor, rgb_t(43, 43, 43), hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); } - else if (itemnum == hover()) + else if ((pointerline || rclickline) && hovered) { - // else if the mouse is over this item, draw with a different background - fgcolor = fgcolor3 = ui().options().mouseover_color(); + // draw selected highlight for tracked item + fgcolor = fgcolor3 = ui().colors().selected_color(); + bgcolor = ui().colors().selected_bg_color(); + highlight(m_primary_items_hbounds.first, linetop, m_primary_items_hbounds.second, linebottom, bgcolor); + } + else if (pointerline || rclickline || (!m_ui_error && !(flags & PROCESS_NOINPUT) && hovered && pointer_idle())) + { + // draw hover highlight when hovered over or dragged off + fgcolor = fgcolor3 = ui().colors().mouseover_color(); bgcolor = ui().colors().mouseover_bg_color(); - highlight(line_x0, line_y0, line_x1, line_y1, bgcolor); + highlight(m_primary_items_hbounds.first, linetop, m_primary_items_hbounds.second, linebottom, bgcolor); } else if (pitem.ref() == m_prev_selected) { - fgcolor = fgcolor3 = ui().options().mouseover_color(); + fgcolor = fgcolor3 = ui().colors().mouseover_color(); bgcolor = ui().colors().mouseover_bg_color(); - ui().draw_textured_box(container(), line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, bgcolor, rgb_t(43, 43, 43), + ui().draw_textured_box( + container(), + m_primary_items_hbounds.first, linetop, m_primary_items_hbounds.second, linebottom, + bgcolor, rgb_t(43, 43, 43), hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); } - if (linenum == 0 && top_line != 0) - { - // if we're on the top line, display the up arrow - draw_arrow(0.5f * (x1 + x2) - 0.5f * ud_arrow_width(), line_y + 0.25f * line_height(), - 0.5f * (x1 + x2) + 0.5f * ud_arrow_width(), line_y + 0.75f * line_height(), fgcolor, ROT0); - - if (hover() == itemnum) - set_hover(HOVER_ARROW_UP); - } - else if (linenum == m_visible_lines - 1 && itemnum != m_available_items - 1) + if ((!linenum && top_line) || ((linenum == (m_visible_lines - 1)) && (itemnum != m_available_items - 1))) { - // if we're on the bottom line, display the down arrow - draw_arrow(0.5f * (x1 + x2) - 0.5f * ud_arrow_width(), line_y + 0.25f * line_height(), - 0.5f * (x1 + x2) + 0.5f * ud_arrow_width(), line_y + 0.75f * line_height(), fgcolor, ROT0 ^ ORIENTATION_FLIP_Y); - - if (hover() == itemnum) - set_hover(HOVER_ARROW_DOWN); + // if we're on the top or bottom line, display the up or down arrow + draw_arrow( + 0.5F * (m_primary_items_hbounds.first + m_primary_items_hbounds.second - ud_arrow_width()), linetop + (0.25F * line_height()), + 0.5F * (m_primary_items_hbounds.first + m_primary_items_hbounds.second + ud_arrow_width()), linetop + (0.75F * line_height()), + fgcolor, + linenum ? (ROT0 ^ ORIENTATION_FLIP_Y) : ROT0); } else if (pitem.type() == menu_item_type::SEPARATOR) { // if we're just a divider, draw a line - container().add_line(visible_left, line_y + 0.5f * line_height(), visible_left + visible_width, line_y + 0.5f * line_height(), + container().add_line( + m_primary_items_hbounds.first, linetop + (0.5F * line_height()), + m_primary_items_hbounds.second, linetop + (0.5F * line_height()), UI_LINE_WIDTH, ui().colors().text_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } - else if (pitem.subtext().empty()) - { - // draw the item centered - int const item_invert = pitem.flags() & FLAG_INVERT; - if (m_has_icons) - draw_icon(linenum, item(itemnum).ref(), effective_left, line_y); - ui().draw_text_full( - container(), - itemtext, - effective_left + icon_offset, line_y, effective_width - icon_offset, - text_layout::text_justify::LEFT, text_layout::word_wrapping::TRUNCATE, - mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, - nullptr, nullptr, - line_height()); - } else { - int const item_invert = pitem.flags() & FLAG_INVERT; - std::string_view const subitem_text = pitem.subtext(); - float item_width, subitem_width; - - // compute right space for subitem - subitem_width = get_string_width(subitem_text); - subitem_width += gutter_width(); - - // draw the item left-justified + bool const item_invert(pitem.flags() & FLAG_INVERT); if (m_has_icons) - draw_icon(linenum, item(itemnum).ref(), effective_left, line_y); - ui().draw_text_full( - container(), - itemtext, - effective_left + icon_offset, line_y, effective_width - icon_offset - subitem_width, - text_layout::text_justify::LEFT, text_layout::word_wrapping::TRUNCATE, - mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, - &item_width, nullptr, - line_height()); - - // draw the subitem right-justified - ui().draw_text_full( - container(), - subitem_text, - effective_left + icon_offset + item_width, line_y, effective_width - icon_offset - item_width, - text_layout::text_justify::RIGHT, text_layout::word_wrapping::NEVER, - mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, - nullptr, nullptr, - line_height()); + draw_icon(linenum, pitem.ref(), item_text_left, linetop); + if (pitem.subtext().empty()) + { + // draw the item left-aligned + ui().draw_text_full( + container(), + itemtext, + item_text_left + icon_offset, linetop, item_text_width - icon_offset, + text_layout::text_justify::LEFT, text_layout::word_wrapping::TRUNCATE, + mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, + nullptr, nullptr, + line_height()); + } + else + { + // compute right space for subitem + std::string_view const subitem_text(pitem.subtext()); + float const subitem_width(get_string_width(subitem_text) + gutter_width()); + + // draw the item left-aligned + float item_width; + ui().draw_text_full( + container(), + itemtext, + item_text_left + icon_offset, linetop, item_text_width - icon_offset - subitem_width, + text_layout::text_justify::LEFT, text_layout::word_wrapping::TRUNCATE, + mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, + &item_width, nullptr, + line_height()); + + // draw the subitem right-aligned + ui().draw_text_full( + container(), + subitem_text, + item_text_left + icon_offset + item_width, linetop, item_text_width - icon_offset - item_width, + text_layout::text_justify::RIGHT, text_layout::word_wrapping::NEVER, + mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, + nullptr, nullptr, + line_height()); + } } } - for (size_t count = m_available_items; count < item_count(); count++) + // draw extra fixed items + for (size_t linenum = 0; linenum < m_skip_main_items; linenum++) { - const menu_item &pitem = item(count); - const std::string_view itemtext = pitem.text(); - float line_x0 = x1 + 0.5f * UI_LINE_WIDTH; - float line_y0 = line; - float line_x1 = x2 - 0.5f * UI_LINE_WIDTH; - float line_y1 = line + line_height(); + int const itemnum(m_available_items + linenum); + menu_item const &pitem(item(itemnum)); + std::string_view const itemtext(pitem.text()); + float const linetop(m_primary_items_top + (float(m_primary_lines + linenum) * line_height())); + float const linebottom(linetop + line_height()); + + // work out colours rgb_t fgcolor = ui().colors().text_color(); rgb_t bgcolor = ui().colors().text_bg_color(); - - if (mouse_in_rect(line_x0, line_y0, line_x1, line_y1) && is_selectable(pitem)) - set_hover(count); - - // if we're selected, draw with a different background - if (is_selected(count) && m_focus == focused_menu::MAIN) + bool const hovered(is_selectable(pitem) && pointer_in_rect(m_primary_items_hbounds.first, linetop, m_primary_items_hbounds.second, linebottom)); + bool const pointerline((pointer_action::MAIN_TRACK_LINE == m_pointer_action) && ((m_primary_lines + linenum) == m_clicked_line)); + if (is_selected(itemnum) && (get_focus() == focused_menu::MAIN)) { + // if we're selected, draw with a different background fgcolor = rgb_t(0xff, 0xff, 0x00); bgcolor = rgb_t(0xff, 0xff, 0xff); - ui().draw_textured_box(container(), line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, bgcolor, rgb_t(43, 43, 43), + ui().draw_textured_box( + container(), + m_primary_items_hbounds.first, linetop, m_primary_items_hbounds.second, linebottom, + bgcolor, rgb_t(43, 43, 43), hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); } - // else if the mouse is over this item, draw with a different background - else if (count == hover()) + else if (pointerline && hovered) + { + // draw selected highlight for tracked item + fgcolor = ui().colors().selected_color(); + bgcolor = ui().colors().selected_bg_color(); + highlight(m_primary_items_hbounds.first, linetop, m_primary_items_hbounds.second, linebottom, bgcolor); + } + else if (pointerline || (!m_ui_error && !(flags & PROCESS_NOINPUT) && hovered && pointer_idle())) { - fgcolor = ui().options().mouseover_color(); + // draw hover highlight when hovered over or dragged off + fgcolor = ui().colors().mouseover_color(); bgcolor = ui().colors().mouseover_bg_color(); - highlight(line_x0, line_y0, line_x1, line_y1, bgcolor); + highlight(m_primary_items_hbounds.first, linetop, m_primary_items_hbounds.second, linebottom, bgcolor); } if (pitem.type() == menu_item_type::SEPARATOR) { + // if we're just a divider, draw a line container().add_line( - visible_left, line + 0.5f * line_height(), - visible_left + visible_width, line + 0.5f * line_height(), - UI_LINE_WIDTH, - ui().colors().text_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + m_primary_items_hbounds.first, linetop + (0.5F * line_height()), + m_primary_items_hbounds.second, linetop + (0.5F * line_height()), + UI_LINE_WIDTH, ui().colors().text_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } else { + // draw the item centred ui().draw_text_full( container(), itemtext, - effective_left, line, effective_width, + item_text_left, linetop, item_text_width, text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE, mame_ui_manager::NORMAL, fgcolor, bgcolor, nullptr, nullptr, line_height()); } - line += line_height(); } - x1 = x2; - x2 += right_panel_size; - - draw_right_panel(x1, y1, x2, y2); - - x1 = primary_left - lr_border(); - x2 = primary_left + primary_width + lr_border(); - // if there is something special to add, do it by calling the virtual method - custom_render(get_selection_ref(), get_customtop(), get_custombottom(), x1, y1, x2, y2); - - // return the number of visible lines, minus 1 for top arrow and 1 for bottom arrow - m_visible_items = m_visible_lines - (top_line != 0) - (top_line + m_visible_lines != m_available_items); + custom_render( + flags, + get_selection_ref(), + get_customtop(), get_custombottom(), + lr_border(), m_primary_vbounds.first, 1.0F - lr_border(), m_primary_vbounds.second); - // noinput - if (noinput) + // show error text if necessary + if (m_ui_error) { - int alpha = (1.0f - machine().options().pause_brightness()) * 255.0f; - if (alpha > 255) - alpha = 255; - if (alpha >= 0) - container().add_rect(0.0f, 0.0f, 1.0f, 1.0f, rgb_t(alpha, 0x00, 0x00, 0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + container().add_rect(0.0F, 0.0F, 1.0F, 1.0F, rgb_t(114, 0, 0, 0), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + ui().draw_text_box(container(), m_error_text, text_layout::text_justify::CENTER, 0.5f, 0.5f, UI_RED_COLOR); } + + // return the number of visible lines, minus 1 for top arrow and 1 for bottom arrow + m_visible_items = m_visible_lines - (top_line != 0) - (top_line + m_visible_lines != m_available_items); } @@ -2217,116 +3394,197 @@ void menu_select_launch::draw(u32 flags) // draw right panel //------------------------------------------------- -void menu_select_launch::draw_right_panel(float origx1, float origy1, float origx2, float origy2) +void menu_select_launch::draw_right_panel(u32 flags) { - float const x2(!show_right_panel() ? origx2 : (origx1 + m_divider_width)); - - // set left-right arrows dimension - float const ar_x0(0.5F * (x2 + origx1 - m_divider_arrow_width)); - float const ar_y0(0.5F * (origy2 + origy1 - m_divider_arrow_height)); - float const ar_x1(ar_x0 + m_divider_arrow_width); - float const ar_y1(ar_y0 + m_divider_arrow_height); + if (show_right_panel()) + { + m_right_panel_width = 0.3F - m_divider_width; - ui().draw_outlined_box(container(), origx1, origy1, origx2, origy2, rgb_t(0xef, 0x12, 0x47, 0x7b)); + ui().draw_outlined_box( + container(), right_panel_left(), m_primary_vbounds.first, right_panel_right(), m_primary_vbounds.second, + ui().colors().background_color()); + draw_right_box_tabs(flags); - rgb_t fgcolor(ui().colors().text_color()); - if (mouse_in_rect(origx1, origy1, x2, origy2)) - { - fgcolor = ui().options().mouseover_color(); - set_hover(HOVER_RPANEL_ARROW); - } + if (0.0F >= m_right_heading_top) + { + float const pixelheight(target_size().second); + m_right_heading_top = std::round((m_right_tabs_bottom + UI_LINE_WIDTH + tb_border()) * pixelheight) / pixelheight; + m_right_content_vbounds = std::make_pair( + std::round((m_right_heading_top + line_height() + tb_border()) * pixelheight) / pixelheight, + m_primary_vbounds.second - tb_border()); + m_right_content_hbounds = std::make_pair(right_panel_left() + lr_border(), right_panel_right() - lr_border()); + } - if (!show_right_panel()) - { - draw_arrow(ar_x0, ar_y0, ar_x1, ar_y1, fgcolor, ROT90 ^ ORIENTATION_FLIP_X); + if (m_right_panel == RP_IMAGES) + arts_render(flags); + else + infos_render(flags); } else { - draw_arrow(ar_x0, ar_y0, ar_x1, ar_y1, fgcolor, ROT90); - origy1 = draw_right_box_title(x2, origy1, origx2, origy2); - - if (m_right_panel == RP_IMAGES) - arts_render(x2, origy1, origx2, origy2); - else - infos_render(x2, origy1, origx2, origy2); + m_right_panel_width = 0.0F; } + + draw_divider(flags, 1.0F - lr_border() - m_right_panel_width - m_divider_width, true); } //------------------------------------------------- -// draw right box title +// draw right box tabs //------------------------------------------------- -float menu_select_launch::draw_right_box_title(float x1, float y1, float x2, float y2) +void menu_select_launch::draw_right_box_tabs(u32 flags) { - float const midl = (x2 - x1) * 0.5f; + m_right_tabs_bottom = m_primary_vbounds.first + line_height(); - // add outlined box for options - ui().draw_outlined_box(container(), x1, y1, x2, y2, ui().colors().background_color()); + float const x1(1.0F - lr_border() - m_right_panel_width); + float const x2(1.0F - lr_border()); + float const tabwidth = right_tab_width(); - // add separator line - container().add_line(x1 + midl, y1, x1 + midl, y1 + line_height(), UI_LINE_WIDTH, ui().colors().border_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - - std::string buffer[RP_LAST + 1] = { _(RIGHT_PANEL_NAMES[0].second), _(RIGHT_PANEL_NAMES[1].second) }; + std::string const buffer[RP_LAST + 1] = { _(RIGHT_PANEL_NAMES[0].second), _(RIGHT_PANEL_NAMES[1].second) }; // check size float text_size = 1.0f; for (auto & elem : buffer) { auto textlen = get_string_width(elem) + 0.01f; - float tmp_size = (textlen > midl) ? (midl / textlen) : 1.0f; + float tmp_size = (textlen > tabwidth) ? (tabwidth / textlen) : 1.0f; text_size = std::min(text_size, tmp_size); } for (int cells = RP_FIRST; cells <= RP_LAST; ++cells) { - rgb_t bgcolor = ui().colors().text_bg_color(); - rgb_t fgcolor = ui().colors().text_color(); - - if (mouse_in_rect(x1, y1, x1 + midl, y1 + line_height())) - { - if (m_right_panel != cells) - { - bgcolor = ui().colors().mouseover_bg_color(); - fgcolor = ui().options().mouseover_color(); - set_hover(HOVER_RP_FIRST + cells); - } - } - - if (m_right_panel != cells) - { - container().add_line(x1, y1 + line_height(), x1 + midl, y1 + line_height(), UI_LINE_WIDTH, - ui().colors().border_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - if (fgcolor != ui().colors().mouseover_color()) - fgcolor = ui().colors().clone_color(); - } + float const tableft(x1 + (float(cells - RP_FIRST) * tabwidth)); - if (m_focus == focused_menu::RIGHTTOP && m_right_panel == cells) + rgb_t fgcolor = ui().colors().text_color(); + rgb_t bgcolor = ui().colors().text_bg_color(); + if ((focused_menu::RIGHTTOP == m_focus) && (cells == m_right_panel)) { + // draw primary highlight if keyboard focus is here fgcolor = rgb_t(0xff, 0xff, 0x00); bgcolor = rgb_t(0xff, 0xff, 0xff); ui().draw_textured_box( container(), - x1 + UI_LINE_WIDTH, y1 + UI_LINE_WIDTH, x1 + midl - UI_LINE_WIDTH, y1 + line_height(), + tableft + UI_LINE_WIDTH, m_primary_vbounds.first + UI_LINE_WIDTH, tableft + tabwidth - UI_LINE_WIDTH, m_right_tabs_bottom, bgcolor, rgb_t(43, 43, 43), hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); } - else if (bgcolor == ui().colors().mouseover_bg_color()) + else if (cells != m_right_panel) { - container().add_rect(x1 + UI_LINE_WIDTH, y1 + UI_LINE_WIDTH, x1 + midl - UI_LINE_WIDTH, y1 + line_height(), - bgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); + bool const hovered(pointer_in_rect(tableft, m_primary_vbounds.first, tableft + tabwidth, m_right_tabs_bottom)); + bool const pointertab((pointer_action::RIGHT_TRACK_TAB == m_pointer_action) && (cells == m_clicked_line)); + if (pointertab && hovered) + { + // draw selected highlight for tracked item + fgcolor = ui().colors().selected_color(); + bgcolor = ui().colors().selected_bg_color(); + highlight(tableft + UI_LINE_WIDTH, m_primary_vbounds.first + UI_LINE_WIDTH, tableft + tabwidth - UI_LINE_WIDTH, m_right_tabs_bottom, bgcolor); + } + else if (pointertab || (!m_ui_error && !(flags & PROCESS_NOINPUT) && hovered && pointer_idle())) + { + // draw hover highlight when hovered over or dragged off + fgcolor = ui().colors().mouseover_color(); + bgcolor = ui().colors().mouseover_bg_color(); + highlight(tableft + UI_LINE_WIDTH, m_primary_vbounds.first + UI_LINE_WIDTH, tableft + tabwidth - UI_LINE_WIDTH, m_right_tabs_bottom, bgcolor); + } + else + { + // dim unselected tab title + fgcolor = ui().colors().clone_color(); + } } ui().draw_text_full( container(), buffer[cells], - x1 + UI_LINE_WIDTH, y1, midl - UI_LINE_WIDTH, + tableft + UI_LINE_WIDTH, m_primary_vbounds.first, tabwidth - UI_LINE_WIDTH, text_layout::text_justify::CENTER, text_layout::word_wrapping::NEVER, mame_ui_manager::NORMAL, fgcolor, bgcolor, nullptr, nullptr, line_height() * text_size); - x1 += midl; + + // add lines when appropriate + if (RP_FIRST < cells) + { + container().add_line( + tableft, m_primary_vbounds.first, tableft, m_right_tabs_bottom, + UI_LINE_WIDTH, ui().colors().border_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + if (m_right_panel == cells) + { + container().add_line( + x1, m_primary_vbounds.first + line_height(), tableft, m_right_tabs_bottom, + UI_LINE_WIDTH, ui().colors().border_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + } + } + } + if (RP_LAST != m_right_panel) + { + container().add_line( + x1 + (float(m_right_panel + 1) * tabwidth), m_right_tabs_bottom, x2, m_right_tabs_bottom, + UI_LINE_WIDTH, ui().colors().border_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + } +} + + +//------------------------------------------------- +// draw right box heading +//------------------------------------------------- + +void menu_select_launch::draw_right_box_heading(u32 flags, bool larrow, bool rarrow, std::string_view text) +{ + float const text_left(m_right_content_hbounds.first + (2.0F * lr_border()) + lr_arrow_width()); + float const text_width(m_right_content_hbounds.second - m_right_content_hbounds.first - (4.0F * lr_border()) - (2.0F * lr_arrow_width())); + + rgb_t fgcolor(ui().colors().text_color()); + rgb_t bgcolor(ui().colors().text_bg_color()); + if (pointer_action::RIGHT_SWITCH == m_pointer_action) + { + // touch swipe to switch + fgcolor = ui().colors().selected_color(); + bgcolor = ui().colors().selected_bg_color(); + highlight(m_right_content_hbounds.first, m_right_heading_top, m_right_content_hbounds.second, m_right_heading_top + line_height(), bgcolor); + } + else if (focused_menu::RIGHTBOTTOM == m_focus) + { + // keyboard focus + fgcolor = rgb_t(0xff, 0xff, 0x00); + bgcolor = rgb_t(0xff, 0xff, 0xff); + ui().draw_textured_box( + container(), + m_right_content_hbounds.first, m_right_heading_top, m_right_content_hbounds.second, m_right_heading_top + line_height(), + bgcolor, rgb_t(43, 43, 43), + hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); + } + + ui().draw_text_full(container(), + text, text_left, m_right_heading_top, text_width, + text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE, mame_ui_manager::NORMAL, fgcolor, bgcolor, + nullptr, nullptr, + line_height()); + + if (larrow) + { + // not using the selected colour here because the background isn't changed + float const left(m_right_content_hbounds.first + lr_border()); + float const right(m_right_content_hbounds.first + lr_border() + lr_arrow_width()); + bool const hovered(pointer_in_rect(left, right_arrows_top(), right, right_arrows_bottom())); + bool const tracked((pointer_action::RIGHT_TRACK_ARROW == m_pointer_action) && !m_clicked_line); + rgb_t fg(fgcolor); + if ((focused_menu::RIGHTBOTTOM != m_focus) && (tracked || (!m_ui_error && !(flags & PROCESS_NOINPUT) && pointer_idle() && hovered))) + fg = ui().colors().mouseover_color(); + draw_arrow(left, right_arrows_top(), right, right_arrows_bottom(), fg, ROT90 ^ ORIENTATION_FLIP_X); } - return (y1 + line_height() + UI_LINE_WIDTH); + if (rarrow) + { + // not using the selected colour here because the background isn't changed + float const left(m_right_content_hbounds.second - lr_border() - lr_arrow_width()); + float const right(m_right_content_hbounds.second - lr_border()); + bool const hovered(pointer_in_rect(left, right_arrows_top(), right, right_arrows_bottom())); + bool const tracked((pointer_action::RIGHT_TRACK_ARROW == m_pointer_action) && m_clicked_line); + rgb_t fg(fgcolor); + if ((focused_menu::RIGHTBOTTOM != m_focus) && (tracked || (!m_ui_error && !(flags & PROCESS_NOINPUT) && pointer_idle() && hovered))) + fg = ui().colors().mouseover_color(); + draw_arrow(left, right_arrows_top(), right, right_arrows_bottom(), fg, ROT90); + } } @@ -2334,8 +3592,11 @@ float menu_select_launch::draw_right_box_title(float x1, float y1, float x2, flo // perform our special rendering //------------------------------------------------- -void menu_select_launch::arts_render(float origx1, float origy1, float origx2, float origy2) +void menu_select_launch::arts_render(u32 flags) { + // draw the heading + draw_right_box_heading(flags, FIRST_VIEW < m_image_view, LAST_VIEW > m_image_view, _("selmenu-artwork", std::get<1>(ARTS_INFO[m_image_view]))); + ui_software_info const *software; ui_system_info const *system; get_selection(software, system); @@ -2344,13 +3605,10 @@ void menu_select_launch::arts_render(float origx1, float origy1, float origx2, f { m_cache.set_snapx_driver(nullptr); - // arts title and searchpath - std::string const searchstr = arts_render_common(origx1, origy1, origx2, origy2); - // loads the image if necessary if (!m_cache.snapx_software_is(software) || !snapx_valid() || m_switch_image) { - emu_file snapfile(searchstr.c_str(), OPEN_FLAG_READ); + emu_file snapfile(get_arts_searchpath(), OPEN_FLAG_READ); bitmap_argb32 tmp_bitmap; if (software->startempty == 1) @@ -2370,84 +3628,31 @@ void menu_select_launch::arts_render(float origx1, float origy1, float origx2, f m_cache.set_snapx_software(software); m_switch_image = false; - arts_render_images(std::move(tmp_bitmap), origx1, origy1, origx2, origy2); + arts_render_images(std::move(tmp_bitmap)); } // if the image is available, loaded and valid, display it - draw_snapx(origx1, origy1, origx2, origy2); + draw_snapx(); } else if (system) { m_cache.set_snapx_software(nullptr); - std::string const searchstr = arts_render_common(origx1, origy1, origx2, origy2); - // loads the image if necessary if (!m_cache.snapx_driver_is(system->driver) || !snapx_valid() || m_switch_image) { - emu_file snapfile(searchstr, OPEN_FLAG_READ); + emu_file snapfile(get_arts_searchpath(), OPEN_FLAG_READ); bitmap_argb32 tmp_bitmap; load_driver_image(tmp_bitmap, snapfile, *system->driver); m_cache.set_snapx_driver(system->driver); m_switch_image = false; - arts_render_images(std::move(tmp_bitmap), origx1, origy1, origx2, origy2); + arts_render_images(std::move(tmp_bitmap)); } // if the image is available, loaded and valid, display it - draw_snapx(origx1, origy1, origx2, origy2); - } -} - - -//------------------------------------------------- -// common function for images render -//------------------------------------------------- - -std::string menu_select_launch::arts_render_common(float origx1, float origy1, float origx2, float origy2) -{ - std::string snaptext, searchstr; - get_title_search(snaptext, searchstr); - - // apply title to right panel - float title_size = 0.0f; - for (int x = FIRST_VIEW; x < LAST_VIEW; x++) - { - float const text_length = get_text_width( - _("selmenu-artwork", std::get<1>(ARTS_INFO[m_image_view])), - origx1, origy1, origx2 - origx1, - text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE); - title_size = (std::max)(text_length + 0.01f, title_size); - } - - rgb_t const fgcolor = (m_focus == focused_menu::RIGHTBOTTOM) ? rgb_t(0xff, 0xff, 0x00) : ui().colors().text_color(); - rgb_t const bgcolor = (m_focus == focused_menu::RIGHTBOTTOM) ? rgb_t(0xff, 0xff, 0xff) : ui().colors().text_bg_color(); - float const middle = origx2 - origx1; - - // check size - float const sc = title_size + 2.0f * gutter_width(); - float const tmp_size = (sc > middle) ? ((middle - 2.0f * gutter_width()) / sc) : 1.0f; - title_size *= tmp_size; - - if (bgcolor != ui().colors().text_bg_color()) - { - ui().draw_textured_box( - container(), - origx1 + ((middle - title_size) * 0.5f), origy1 + tb_border(), - origx1 + ((middle + title_size) * 0.5f), origy1 + tb_border() + line_height(), - bgcolor, rgb_t(43, 43, 43), - hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); + draw_snapx(); } - - ui().draw_text_full(container(), - snaptext, origx1, origy1 + tb_border(), origx2 - origx1, - text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE, mame_ui_manager::NORMAL, fgcolor, bgcolor, - nullptr, nullptr, - line_height() * tmp_size); - - draw_common_arrow(origx1, origy1 + tb_border(), origx2, origy2, m_image_view, FIRST_VIEW, LAST_VIEW, title_size); - - return searchstr; } @@ -2455,12 +3660,11 @@ std::string menu_select_launch::arts_render_common(float origx1, float origy1, f // perform rendering of image //------------------------------------------------- -void menu_select_launch::arts_render_images(bitmap_argb32 &&tmp_bitmap, float origx1, float origy1, float origx2, float origy2) +void menu_select_launch::arts_render_images(bitmap_argb32 &&tmp_bitmap) { - bool no_available = false; - // if it fails, use the default image - if (!tmp_bitmap.valid()) + bool no_available(!tmp_bitmap.valid()); + if (no_available) { tmp_bitmap.allocate(256, 256); const bitmap_argb32 &src(m_cache.no_avail_bitmap()); @@ -2469,76 +3673,74 @@ void menu_select_launch::arts_render_images(bitmap_argb32 &&tmp_bitmap, float or for (int y = 0; y < 256; y++) tmp_bitmap.pix(y, x) = src.pix(y, x); } - no_available = true; } bitmap_argb32 &snapx_bitmap(m_cache.snapx_bitmap()); - if (tmp_bitmap.valid()) + if (!tmp_bitmap.valid()) { - float panel_width = origx2 - origx1 - 0.02f; - float panel_height = origy2 - origy1 - 0.02f - (3.0f * tb_border()) - (2.0f * line_height()); - int screen_width = machine().render().ui_target().width(); - int screen_height = machine().render().ui_target().height(); + snapx_bitmap.reset(); + return; + } - if (machine().render().ui_target().orientation() & ORIENTATION_SWAP_XY) - std::swap(screen_height, screen_width); + float const panel_width(m_right_content_hbounds.second - m_right_content_hbounds.first); + float const panel_height(m_right_content_vbounds.second - m_right_content_vbounds.first); - int panel_width_pixel = panel_width * screen_width; - int panel_height_pixel = panel_height * screen_height; + auto [screen_width, screen_height] = target_size(); + if (machine().render().ui_target().orientation() & ORIENTATION_SWAP_XY) + { + using std::swap; + swap(screen_height, screen_width); + } - // Calculate resize ratios for resizing - auto ratioW = (float)panel_width_pixel / tmp_bitmap.width(); - auto ratioH = (float)panel_height_pixel / tmp_bitmap.height(); - auto ratioI = (float)tmp_bitmap.height() / tmp_bitmap.width(); - auto dest_xPixel = tmp_bitmap.width(); - auto dest_yPixel = tmp_bitmap.height(); + int const panel_width_pixel(panel_width * screen_width); + int const panel_height_pixel(panel_height * screen_height); + // Calculate resize ratios for resizing + auto const ratioW(float(panel_width_pixel) / float(tmp_bitmap.width())); + auto const ratioH(float(panel_height_pixel) / float(tmp_bitmap.height())); + auto const ratioI(float(tmp_bitmap.height()) / float(tmp_bitmap.width())); + + auto dest_xPixel(tmp_bitmap.width()); + auto dest_yPixel(tmp_bitmap.height()); + if (ui().options().forced_4x3_snapshot() && (ratioI < 0.75F) && (m_image_view == SNAPSHOT_VIEW)) + { // force 4:3 ratio min - if (ui().options().forced_4x3_snapshot() && ratioI < 0.75f && m_image_view == SNAPSHOT_VIEW) - { - // smaller ratio will ensure that the image fits in the view - dest_yPixel = tmp_bitmap.width() * 0.75f; - ratioH = (float)panel_height_pixel / dest_yPixel; - float ratio = std::min(ratioW, ratioH); - dest_xPixel = tmp_bitmap.width() * ratio; - dest_yPixel *= ratio; - } + dest_yPixel = tmp_bitmap.width() * 0.75F; + float const ratio = std::min(ratioW, float(panel_height_pixel) / float(dest_yPixel)); + dest_xPixel = tmp_bitmap.width() * ratio; + dest_yPixel *= ratio; + } + else if ((ratioW < 1.0F) || (ratioH < 1.0F) || (ui().options().enlarge_snaps() && !no_available)) + { // resize the bitmap if necessary - else if (ratioW < 1 || ratioH < 1 || (ui().options().enlarge_snaps() && !no_available)) - { - // smaller ratio will ensure that the image fits in the view - float ratio = std::min(ratioW, ratioH); - dest_xPixel = tmp_bitmap.width() * ratio; - dest_yPixel = tmp_bitmap.height() * ratio; - } - - bitmap_argb32 dest_bitmap; - - // resample if necessary - if (dest_xPixel != tmp_bitmap.width() || dest_yPixel != tmp_bitmap.height()) - { - dest_bitmap.allocate(dest_xPixel, dest_yPixel); - render_color color = { 1.0f, 1.0f, 1.0f, 1.0f }; - render_resample_argb_bitmap_hq(dest_bitmap, tmp_bitmap, color, true); - } - else - dest_bitmap = std::move(tmp_bitmap); - - snapx_bitmap.allocate(panel_width_pixel, panel_height_pixel); - int x1 = (0.5f * panel_width_pixel) - (0.5f * dest_xPixel); - int y1 = (0.5f * panel_height_pixel) - (0.5f * dest_yPixel); + float const ratio(std::min(ratioW, ratioH)); + dest_xPixel = tmp_bitmap.width() * ratio; + dest_yPixel = tmp_bitmap.height() * ratio; + } - for (int x = 0; x < dest_xPixel; x++) - for (int y = 0; y < dest_yPixel; y++) - snapx_bitmap.pix(y + y1, x + x1) = dest_bitmap.pix(y, x); - // apply bitmap - m_cache.snapx_texture()->set_bitmap(snapx_bitmap, snapx_bitmap.cliprect(), TEXFORMAT_ARGB32); + // resample if necessary + bitmap_argb32 dest_bitmap; + if ((dest_xPixel != tmp_bitmap.width()) || (dest_yPixel != tmp_bitmap.height())) + { + dest_bitmap.allocate(dest_xPixel, dest_yPixel); + render_resample_argb_bitmap_hq(dest_bitmap, tmp_bitmap, render_color{ 1.0F, 1.0F, 1.0F, 1.0F }, true); } else { - snapx_bitmap.reset(); + dest_bitmap = std::move(tmp_bitmap); } + + snapx_bitmap.allocate(panel_width_pixel, panel_height_pixel); + int x1(0.5F * (float(panel_width_pixel) - float(dest_xPixel))); + int y1(0.5F * (float(panel_height_pixel) - float(dest_yPixel))); + + for (int x = 0; x < dest_xPixel; x++) + for (int y = 0; y < dest_yPixel; y++) + snapx_bitmap.pix(y + y1, x + x1) = dest_bitmap.pix(y, x); + + // apply bitmap + m_cache.snapx_texture()->set_bitmap(snapx_bitmap, snapx_bitmap.cliprect(), TEXFORMAT_ARGB32); } @@ -2546,18 +3748,14 @@ void menu_select_launch::arts_render_images(bitmap_argb32 &&tmp_bitmap, float or // draw snapshot //------------------------------------------------- -void menu_select_launch::draw_snapx(float origx1, float origy1, float origx2, float origy2) +void menu_select_launch::draw_snapx() { // if the image is available, loaded and valid, display it if (snapx_valid()) { - float const x1 = origx1 + 0.01f; - float const x2 = origx2 - 0.01f; - float const y1 = origy1 + (2.0f * tb_border()) + line_height(); - float const y2 = origy2 - tb_border() - line_height(); - - // apply texture - container().add_quad(x1, y1, x2, y2, rgb_t::white(), m_cache.snapx_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + container().add_quad( + m_right_content_hbounds.first, m_right_content_vbounds.first, m_right_content_hbounds.second, m_right_content_vbounds.second, + rgb_t::white(), m_cache.snapx_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } } @@ -2720,38 +3918,11 @@ bool menu_select_launch::has_multiple_bios(game_driver const &driver, s_bios &bi } -//------------------------------------------------- -// draw collapsed left panel -//------------------------------------------------- - -float menu_select_launch::draw_collapsed_left_panel(float x1, float y1, float x2, float y2) -{ - // set left-right arrows dimension - float const ar_x0 = 0.5F * (x2 + x1 - m_divider_arrow_width); - float const ar_y0 = 0.5F * (y2 + y1 - m_divider_arrow_height); - float const ar_x1 = ar_x0 + m_divider_arrow_width; - float const ar_y1 = ar_y0 + m_divider_arrow_height; - - ui().draw_outlined_box(container(), x1, y1, x2, y2, rgb_t(0xef, 0x12, 0x47, 0x7b)); // FIXME: magic numbers in colour? - - rgb_t fgcolor = ui().colors().text_color(); - if (mouse_in_rect(x1, y1, x2, y2)) - { - fgcolor = ui().options().mouseover_color(); - set_hover(HOVER_LPANEL_ARROW); - } - - draw_arrow(ar_x0, ar_y0, ar_x1, ar_y1, fgcolor, ROT90); - - return x2 + lr_border(); -} - - //------------------------------------------------- // draw infos //------------------------------------------------- -void menu_select_launch::infos_render(float origx1, float origy1, float origx2, float origy2) +void menu_select_launch::infos_render(u32 flags) { std::string_view first; ui_software_info const *software; @@ -2837,70 +4008,23 @@ void menu_select_launch::infos_render(float origx1, float origy1, float origx2, return; } - origy1 += tb_border(); - float const aspect(machine().render().ui_aspect(&container())); - float const gutter_width = 0.4f * line_height() * aspect * 1.3f; - float oy1 = origy1 + line_height(); - + // draw the heading std::string_view const snaptext(m_info_view ? std::string_view(m_items_list[m_info_view - 1]) : first); + draw_right_box_heading(flags, 0 < m_info_view, (total - 1) > m_info_view, snaptext); - // get width of widest title - float title_size(0.0f); - for (std::size_t x = 0; total > x; ++x) - { - std::string_view const name(x ? std::string_view(m_items_list[x - 1]) : first); - float txt_length = get_string_width(name); - txt_length += 0.01f; - title_size = (std::max)(txt_length, title_size); - } - - rgb_t fgcolor = ui().colors().text_color(); - rgb_t bgcolor = ui().colors().text_bg_color(); - if (get_focus() == focused_menu::RIGHTBOTTOM) - { - fgcolor = rgb_t(0xff, 0xff, 0xff, 0x00); - bgcolor = rgb_t(0xff, 0xff, 0xff, 0xff); - } - - float middle = origx2 - origx1; - - // check size - float sc = title_size + 2.0f * gutter_width; - float tmp_size = (sc > middle) ? ((middle - 2.0f * gutter_width) / sc) : 1.0f; - title_size *= tmp_size; - - if (bgcolor != ui().colors().text_bg_color()) - { - ui().draw_textured_box( - container(), - origx1 + ((middle - title_size) * 0.5f), origy1, origx1 + ((middle + title_size) * 0.5f), - origy1 + line_height(), bgcolor, rgb_t(255, 43, 43, 43), - hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1)); - } - - ui().draw_text_full( - container(), - snaptext, - origx1, origy1, origx2 - origx1, - text_layout::text_justify::CENTER, text_layout::word_wrapping::NEVER, - mame_ui_manager::NORMAL, fgcolor, bgcolor, nullptr, nullptr, - line_height() * tmp_size); - - sc = origx2 - origx1 - (2.0f * gutter_width); + float const sc(m_right_panel_width - (2.0F * gutter_width())); if (!m_info_layout || (m_info_layout->width() != sc)) { m_info_layout.emplace( *ui().get_font(), - machine().render().ui_aspect(&container()) * m_info_line_height, m_info_line_height, + x_aspect() * m_info_line_height, m_info_line_height, sc, text_layout::text_justify::LEFT, text_layout::word_wrapping::WORD); menu_dats_view::add_info_text(*m_info_layout, m_info_buffer, ui().colors().text_color()); m_total_lines = m_info_layout->lines(); } - draw_common_arrow(origx1, origy1, origx2, origy2, m_info_view, 0, total - 1, title_size); - - m_right_visible_lines = floor((origy2 - oy1) / m_info_line_height); + m_right_visible_lines = floor((m_right_content_vbounds.second - m_right_content_vbounds.first) / m_info_line_height); if (m_total_lines < m_right_visible_lines) m_right_visible_lines = m_total_lines; if (m_topline_datsview < 0) @@ -2909,22 +4033,19 @@ void menu_select_launch::infos_render(float origx1, float origy1, float origx2, m_topline_datsview = m_total_lines - m_right_visible_lines; // get the number of visible lines, minus 1 for top arrow and 1 for bottom arrow - bool const up_arrow = m_topline_datsview > 0; - bool const down_arrow = (m_topline_datsview + m_right_visible_lines) < m_total_lines; - int const r_visible_lines = m_right_visible_lines - (up_arrow ? 1 : 0) - (down_arrow ? 1 : 0); - - if (mouse_in_rect(origx1 + gutter_width, oy1, origx2 - gutter_width, origy2)) - set_hover(HOVER_INFO_TEXT); + bool const up_arrow(!info_at_top()); + bool const down_arrow(!info_at_bottom()); + int const r_visible_lines(m_right_visible_lines - (up_arrow ? 1 : 0) - (down_arrow ? 1 : 0)); if (up_arrow) - draw_info_arrow(0, origx1, origx2, oy1, m_info_line_height, m_info_line_height * aspect); + draw_info_arrow(flags, 0); if (down_arrow) - draw_info_arrow(1, origx1, origx2, oy1 + (float(m_right_visible_lines - 1) * m_info_line_height), m_info_line_height, m_info_line_height * aspect); + draw_info_arrow(flags, m_right_visible_lines - 1); m_info_layout->emit( container(), m_topline_datsview ? (m_topline_datsview + 1) : 0, r_visible_lines, - origx1 + gutter_width, oy1 + (m_topline_datsview ? m_info_line_height : 0.0f)); + right_panel_left() + gutter_width(), m_right_content_vbounds.first + (m_topline_datsview ? m_info_line_height : 0.0f)); } diff --git a/src/frontend/mame/ui/selmenu.h b/src/frontend/mame/ui/selmenu.h index 872901ff9b68d..b6793994a1f54 100644 --- a/src/frontend/mame/ui/selmenu.h +++ b/src/frontend/mame/ui/selmenu.h @@ -13,14 +13,19 @@ #pragma once #include "ui/menu.h" +#include "ui/utils.h" #include "audit.h" #include "lrucache.h" +#include #include #include #include +#include +#include +#include #include @@ -30,6 +35,14 @@ struct ui_software_info; namespace ui { +enum +{ + RP_FIRST = 0, + RP_IMAGES = RP_FIRST, + RP_INFOS, + RP_LAST = RP_INFOS +}; + class machine_static_info; class menu_select_launch : public menu @@ -113,9 +126,6 @@ class menu_select_launch : public menu menu_select_launch(mame_ui_manager &mui, render_container &container, bool is_swlist); focused_menu get_focus() const { return m_focus; } - void set_focus(focused_menu focus) { m_focus = focus; } - bool next_image_view(); - bool previous_image_view(); bool dismiss_error(); void set_error(reset_options ropt, std::string &&message); @@ -127,7 +137,7 @@ class menu_select_launch : public menu void launch_system(game_driver const &driver, ui_software_info const &swinfo, std::string const &part) { launch_system(ui(), driver, &swinfo, &part, nullptr); } virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(u32 flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual void menu_activated() override; virtual void menu_deactivated() override; @@ -137,15 +147,10 @@ class menu_select_launch : public menu // draw arrow void draw_common_arrow(float origx1, float origy1, float origx2, float origy2, int current, int dmin, int dmax, float title); - void draw_info_arrow(int ub, float origx1, float origx2, float oy1, float line_height, float ud_arrow_width); - - bool draw_error_text(); + void draw_info_arrow(u32 flags, int line); template - float draw_left_panel( - typename Filter::type current, - std::map const &filters, - float x1, float y1, float x2, float y2); + void draw_left_panel(u32 flags, typename Filter::type current, std::map const &filters); // icon helpers void check_for_icons(char const *listname); @@ -164,8 +169,11 @@ class menu_select_launch : public menu return (uintptr_t(selected_ref) > m_skip_main_items) ? selected_ref : m_prev_selected; } + bool show_left_panel() const { return !(m_panels_status & HIDE_LEFT_PANEL); } + bool show_right_panel() const { return !(m_panels_status & HIDE_RIGHT_PANEL); } u8 right_panel() const { return m_right_panel; } u8 right_image() const { return m_image_view; } + char const *right_panel_config_string() const; char const *right_image_config_string() const; void set_right_panel(u8 index); @@ -189,11 +197,28 @@ class menu_select_launch : public menu std::string m_search; private: + enum class pointer_action + { + NONE, + MAIN_TRACK_LINE, + MAIN_TRACK_RBUTTON, + MAIN_DRAG, + LEFT_TRACK_LINE, + LEFT_DRAG, + RIGHT_TRACK_TAB, + RIGHT_TRACK_ARROW, + RIGHT_TRACK_LINE, + RIGHT_SWITCH, + RIGHT_DRAG, + TOOLBAR_TRACK, + DIVIDER_TRACK + }; + using bitmap_vector = std::vector; using texture_ptr_vector = std::vector; using s_parts = std::unordered_map; - using s_bios = std::vector>; + using s_bios = std::vector >; class software_parts; class bios_selection; @@ -242,22 +267,48 @@ class menu_select_launch : public menu using flags_cache = util::lru_cache_map; - void reset_pressed() { m_pressed = false; m_repeat = 0; } - bool mouse_pressed() const { return (osd_ticks() >= m_repeat); } - void set_pressed(); + // various helpers for common calculations + bool main_at_top() const noexcept { return !top_line; } + bool main_at_bottom() const noexcept { return (top_line + m_primary_lines) >= m_available_items; } + bool is_main_up_arrow(int index) const noexcept { return !index && !main_at_top(); } + bool is_main_down_arrow(int index) const noexcept { return ((m_primary_lines - 1) == index) && !main_at_bottom(); } + bool left_at_top() const noexcept { return !m_left_visible_top; } + bool left_at_bottom() const noexcept { return (m_left_visible_top + m_left_visible_lines) >= m_left_item_count; } + bool is_left_up_arrow(int index) const noexcept { return !index && !left_at_top(); } + bool is_left_down_arrow(int index) const noexcept { return ((m_left_visible_lines - 1) == index) && !left_at_bottom(); } + bool info_at_top() const noexcept { return !m_topline_datsview; } + bool info_at_bottom() const noexcept { return (m_topline_datsview + m_right_visible_lines) >= m_total_lines; } + + // getting precalculated geometry + float left_panel_left() const noexcept { return lr_border(); } + float left_panel_right() const noexcept { return lr_border() + m_left_panel_width; } + float right_panel_left() const noexcept { return 1.0F - lr_border() - m_right_panel_width; } + float right_panel_right() const noexcept { return 1.0F - lr_border(); } + float right_tab_width() const noexcept { return m_right_panel_width / float(RP_LAST - RP_FIRST + 1); } + float right_arrows_top() const noexcept { return m_right_heading_top + (0.1F * line_height()); } + float right_arrows_bottom() const noexcept { return m_right_heading_top + (0.9F * line_height()); } + float left_divider_left() const noexcept { return lr_border() + m_left_panel_width; } + float left_divider_right() const noexcept { return lr_border() + m_left_panel_width + m_divider_width; } + float right_divider_left() const noexcept { return 1.0F - lr_border() - m_right_panel_width - m_divider_width; } + float right_divider_right() const noexcept { return 1.0F - lr_border() - m_right_panel_width; } bool snapx_valid() const { return m_cache.snapx_bitmap().valid(); } + void draw_divider(u32 flags, float x1, bool right); + // draw left panel - virtual float draw_left_panel(float x1, float y1, float x2, float y2) = 0; - float draw_collapsed_left_panel(float x1, float y1, float x2, float y2); + virtual void draw_left_panel(u32 flags) = 0; // draw infos - void infos_render(float x1, float y1, float x2, float y2); + void infos_render(u32 flags); void general_info(ui_system_info const *system, game_driver const &driver, std::string &buffer); // get selected software and/or driver virtual void get_selection(ui_software_info const *&software, ui_system_info const *&system) const = 0; + + // show configuration menu + virtual void show_config_menu(int index) = 0; + virtual bool accept_search() const { return true; } void select_prev() { @@ -277,38 +328,65 @@ class menu_select_launch : public menu } } } + void set_focus(focused_menu focus) { m_focus = focus; } void rotate_focus(int dir); - - void draw_toolbar(float x1, float y1, float x2, float y2); + std::pair next_right_panel_view(); + std::pair previous_right_panel_view(); + std::pair next_image_view(); + std::pair previous_image_view(); + std::pair next_info_view(); + std::pair previous_info_view(); + + void draw_toolbar(u32 flags, float x1, float y1, float x2, float y2); void draw_star(float x0, float y0); void draw_icon(int linenum, void *selectedref, float x1, float y1); virtual render_texture *get_icon_texture(int linenum, void *selectedref) = 0; - void get_title_search(std::string &title, std::string &search); + std::string get_arts_searchpath(); // event handling - virtual void handle_keys(u32 flags, int &iptkey) override; - virtual void handle_events(u32 flags, event &ev) override; + virtual bool handle_events(u32 flags, event &ev) override; + virtual bool handle_keys(u32 flags, int &iptkey) override; + virtual std::tuple custom_pointer_updated(bool changed, ui_event const &uievt) override; + + // pointer handling helpers + std::tuple handle_primary_down(bool changed, ui_event const &uievt); + std::tuple handle_right_down(bool changed, ui_event const &uievt); + std::tuple handle_middle_down(bool changed, ui_event const &uievt); + std::tuple update_main_track_line(bool changed, ui_event const &uievt); + std::tuple update_main_track_rbutton(bool changed, ui_event const &uievt); + std::tuple update_main_drag(bool changed, ui_event const &uievt); + std::tuple update_left_track_line(bool changed, ui_event const &uievt); + std::tuple update_left_drag(bool changed, ui_event const &uievt); + std::tuple update_right_track_tab(bool changed, ui_event const &uievt); + std::tuple update_right_track_arrow(bool changed, ui_event const &uievt); + std::tuple update_right_track_line(bool changed, ui_event const &uievt); + std::tuple update_right_switch(bool changed, ui_event const &uievt); + std::tuple update_right_drag(bool changed, ui_event const &uievt); + std::tuple update_toolbar_track(bool changed, ui_event const &uievt); + std::tuple update_divider_track(bool changed, ui_event const &uievt); + + bool main_force_visible_selection(); // draw game list virtual void draw(u32 flags) override; // draw right panel - void draw_right_panel(float origx1, float origy1, float origx2, float origy2); - float draw_right_box_title(float x1, float y1, float x2, float y2); + void draw_right_panel(u32 flags); + void draw_right_box_tabs(u32 flags); + void draw_right_box_heading(u32 flags, bool larrow, bool rarrow, std::string_view text); // images render - void arts_render(float origx1, float origy1, float origx2, float origy2); - std::string arts_render_common(float origx1, float origy1, float origx2, float origy2); - void arts_render_images(bitmap_argb32 &&bitmap, float origx1, float origy1, float origx2, float origy2); - void draw_snapx(float origx1, float origy1, float origx2, float origy2); + void arts_render(u32 flags); + void arts_render_images(bitmap_argb32 &&bitmap); + void draw_snapx(); // text for main top/bottom panels virtual void make_topbox_text(std::string &line0, std::string &line1, std::string &line2) const = 0; virtual std::string make_software_description(ui_software_info const &software, ui_system_info const *system) const = 0; // filter navigation - virtual void filter_selected() = 0; + virtual void filter_selected(int index) = 0; static void make_audit_fail_text(std::ostream &str, media_auditor const &auditor, media_auditor::summary summary); static void launch_system(mame_ui_manager &mui, game_driver const &driver, ui_software_info const *swinfo, std::string const *part, int const *bios); @@ -316,8 +394,20 @@ class menu_select_launch : public menu static bool has_multiple_bios(ui_software_info const &swinfo, s_bios &biosname); static bool has_multiple_bios(game_driver const &driver, s_bios &biosname); - bool show_left_panel() const; - bool show_right_panel() const; + bool check_scroll_repeat(float top, std::pair hbounds, float height) + { + float const linetop(top + (float(m_clicked_line) * height)); + float const linebottom(top + (float(m_clicked_line + 1) * height)); + if (pointer_in_rect(hbounds.first, linetop, hbounds.second, linebottom)) + { + if (std::chrono::steady_clock::now() >= m_scroll_repeat) + { + m_scroll_repeat += std::chrono::milliseconds(100); + return true; + } + } + return false; + } bool m_ui_error; std::string m_error_text; @@ -339,11 +429,38 @@ class menu_select_launch : public menu cache &m_cache; bool m_is_swlist; focused_menu m_focus; - bool m_pressed; // mouse button held down - osd_ticks_t m_repeat; + pointer_action m_pointer_action; + std::chrono::steady_clock::time_point m_scroll_repeat; + std::pair m_base_pointer; + std::pair m_last_pointer; + int m_clicked_line; + + std::pair m_primary_vbounds; + float m_primary_items_top; + std::pair m_primary_items_hbounds; + int m_primary_lines; + + float m_left_panel_width; + std::pair m_left_items_hbounds; + float m_left_items_top; + int m_left_item_count; + int m_left_visible_lines; + int m_left_visible_top; + + float m_right_panel_width; + float m_right_tabs_bottom; + float m_right_heading_top; + std::pair m_right_content_vbounds; + std::pair m_right_content_hbounds; int m_right_visible_lines; // right box lines + std::pair m_toolbar_button_vbounds; + float m_toolbar_button_width; + float m_toolbar_button_spacing; + float m_toolbar_backtrack_left; + float m_toolbar_main_left; + u8 m_panels_status; u8 m_right_panel; bool m_has_icons; diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp index bc8d3267585e5..5a0a4f1eb87d0 100644 --- a/src/frontend/mame/ui/selsoft.cpp +++ b/src/frontend/mame/ui/selsoft.cpp @@ -14,6 +14,7 @@ #include "ui/ui.h" #include "ui/icorender.h" #include "ui/inifile.h" +#include "ui/miscmenu.h" #include "ui/selector.h" #include "drivenum.h" @@ -444,68 +445,6 @@ bool menu_select_software::handle(event const *ev) changed = inkey_select(ev); break; - case IPT_UI_LEFT: - if (right_panel() == RP_IMAGES) - { - // Images - changed = previous_image_view(); - } - else if (right_panel() == RP_INFOS && ui_globals::cur_sw_dats_view > 0) - { - // Infos - ui_globals::cur_sw_dats_view--; - m_topline_datsview = 0; - changed = true; - } - break; - - case IPT_UI_RIGHT: - if (right_panel() == RP_IMAGES) - { - // Images - changed = next_image_view(); - } - else if (right_panel() == RP_INFOS && ui_globals::cur_sw_dats_view < (ui_globals::cur_sw_dats_total - 1)) - { - // Infos - ui_globals::cur_sw_dats_view++; - m_topline_datsview = 0; - changed = true; - } - break; - - case IPT_UI_UP: - if ((get_focus() == focused_menu::LEFT) && (software_filter::FIRST < m_filter_highlight)) - { - --m_filter_highlight; - changed = true; - } - break; - - case IPT_UI_DOWN: - if ((get_focus() == focused_menu::LEFT) && (software_filter::LAST > m_filter_highlight)) - { - ++m_filter_highlight; - changed = true; - } - break; - - case IPT_UI_HOME: - if (get_focus() == focused_menu::LEFT) - { - m_filter_highlight = software_filter::FIRST; - changed = true; - } - break; - - case IPT_UI_END: - if (get_focus() == focused_menu::LEFT) - { - m_filter_highlight = software_filter::LAST; - changed = true; - } - break; - case IPT_UI_DATS: inkey_dats(); break; @@ -538,8 +477,6 @@ bool menu_select_software::handle(event const *ev) } } - // if we're in an error state, overlay an error message - draw_error_text(); return changed; } @@ -552,7 +489,7 @@ void menu_select_software::recompute_metrics(uint32_t width, uint32_t height, fl menu_select_launch::recompute_metrics(width, height, aspect); // configure the custom rendering - set_custom_space(4.0F * line_height() + 5.0F * tb_border(), 4.0F * line_height() + 4.0F * tb_border()); + set_custom_space(4.0F * line_height() + 5.0F * tb_border(), 4.0F * line_height() + 3.0F * tb_border()); } //------------------------------------------------- @@ -704,9 +641,9 @@ bool menu_select_software::inkey_select(const event *menu_event) // draw left box //------------------------------------------------- -float menu_select_software::draw_left_panel(float x1, float y1, float x2, float y2) +void menu_select_software::draw_left_panel(u32 flags) { - return menu_select_launch::draw_left_panel(m_data->filter_type(), m_data->filters(), x1, y1, x2, y2); + return menu_select_launch::draw_left_panel(flags, m_data->filter_type(), m_data->filters()); } @@ -771,6 +708,12 @@ void menu_select_software::get_selection(ui_software_info const *&software, ui_s } +void menu_select_software::show_config_menu(int index) +{ + menu::stack_push(ui(), container(), m_system, nullptr); +} + + void menu_select_software::make_topbox_text(std::string &line0, std::string &line1, std::string &line2) const { // determine the text for the header @@ -794,29 +737,28 @@ std::string menu_select_software::make_software_description(ui_software_info con } -void menu_select_software::filter_selected() +void menu_select_software::filter_selected(int index) { - if ((software_filter::FIRST <= m_filter_highlight) && (software_filter::LAST >= m_filter_highlight)) - { - m_data->get_filter(software_filter::type(m_filter_highlight)).show_ui( - ui(), - container(), - [this] (software_filter &filter) + assert((software_filter::FIRST <= index) && (software_filter::LAST >= index)); + + m_data->get_filter(software_filter::type(index)).show_ui( + ui(), + container(), + [this] (software_filter &filter) + { + software_filter::type const new_type(filter.get_type()); + if (software_filter::CUSTOM == new_type) { - software_filter::type const new_type(filter.get_type()); - if (software_filter::CUSTOM == new_type) + emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); + if (!file.open(util::string_format("custom_%s_filter.ini", m_system.driver->name))) { - emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); - if (!file.open(util::string_format("custom_%s_filter.ini", m_system.driver->name))) - { - filter.save_ini(file, 0); - file.close(); - } + filter.save_ini(file, 0); + file.close(); } - m_data->set_filter_type(new_type); - reset(reset_options::REMEMBER_REF); - }); - } + } + m_data->set_filter_type(new_type); + reset(reset_options::REMEMBER_REF); + }); } } // namespace ui diff --git a/src/frontend/mame/ui/selsoft.h b/src/frontend/mame/ui/selsoft.h index 3b3074ddcdf79..e250a608c084d 100644 --- a/src/frontend/mame/ui/selsoft.h +++ b/src/frontend/mame/ui/selsoft.h @@ -48,18 +48,19 @@ class menu_select_software : public menu_select_launch virtual bool handle(event const *ev) override; // drawing - virtual float draw_left_panel(float x1, float y1, float x2, float y2) override; + virtual void draw_left_panel(u32 flags) override; virtual render_texture *get_icon_texture(int linenum, void *selectedref) override; // get selected software and/or driver virtual void get_selection(ui_software_info const *&software, ui_system_info const *&system) const override; + virtual void show_config_menu(int index) override; // text for main top/bottom panels virtual void make_topbox_text(std::string &line0, std::string &line1, std::string &line2) const override; virtual std::string make_software_description(ui_software_info const &software, ui_system_info const *system) const override; // filter navigation - virtual void filter_selected() override; + virtual void filter_selected(int index) override; // toolbar virtual void inkey_export() override { throw false; } diff --git a/src/frontend/mame/ui/simpleselgame.cpp b/src/frontend/mame/ui/simpleselgame.cpp index 569aeed400df3..354a8ad2c878c 100644 --- a/src/frontend/mame/ui/simpleselgame.cpp +++ b/src/frontend/mame/ui/simpleselgame.cpp @@ -27,6 +27,7 @@ #include "uiinput.h" #include +#include namespace ui { @@ -143,16 +144,6 @@ bool simple_menu_select_game::handle(event const *ev) inkey_special(*ev); break; } - - // if we're in an error state, overlay an error message - if (m_error) - { - ui().draw_text_box( - container(), - _("The selected game is missing one or more required ROM or CHD images. " - "Please select a different game.\n\nPress any key to continue."), - text_layout::text_justify::CENTER, 0.5f, 0.5f, UI_RED_COLOR); - } return changed; } @@ -300,7 +291,7 @@ void simple_menu_select_game::recompute_metrics(uint32_t width, uint32_t height, menu::recompute_metrics(width, height, aspect); // configure the custom rendering - set_custom_space(line_height() + 3.0f * tb_border(), 4.0f * line_height() + 3.0f * tb_border()); + set_custom_space(line_height() + 3.0f * tb_border(), 5.0f * line_height() + 3.0f * tb_border()); } @@ -308,11 +299,11 @@ void simple_menu_select_game::recompute_metrics(uint32_t width, uint32_t height, // custom_render - perform our special rendering //------------------------------------------------- -void simple_menu_select_game::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void simple_menu_select_game::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { - // if no matches, display the error message if (m_nomatch) { + // if no matches, display the error message ui().draw_text_box( container(), string_format( @@ -326,104 +317,133 @@ void simple_menu_select_game::custom_render(void *selectedref, float top, float UI_RED_COLOR); return; } - - const game_driver *driver; - std::string tempbuf[5]; - - // display the current typeahead - if (!m_search.empty()) - tempbuf[0] = string_format(_("Type name or select: %1$s_"), m_search); else - tempbuf[0] = _("Type name or select: (random)"); - - // draw the top box - draw_text_box( - tempbuf, tempbuf + 1, - origx1, origx2, origy1 - top, origy1 - tb_border(), - text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE, false, - ui().colors().text_color(), ui().colors().background_color()); - - // determine the text to render below - driver = ((uintptr_t)selectedref > 1) ? (const game_driver *)selectedref : nullptr; - if (driver) { - // first line is game name - tempbuf[0] = string_format(_("%1$-.100s"), driver->type.fullname()); - - // next line is year, manufacturer - tempbuf[1] = string_format(_("%1$s, %2$-.100s"), driver->year, driver->manufacturer); - - // next line source path - tempbuf[2] = string_format(_("Source file: %1$s"), info_xml_creator::format_sourcefile(driver->type.source())); + std::string tempbuf[5]; - // update cached values if selection changed - if (driver != m_cached_driver) + // display the current typeahead + if (!m_search.empty()) + tempbuf[0] = string_format(_("Type name or select: %1$s_"), m_search); + else + tempbuf[0] = _("Type name or select: (random)"); + + // draw the top box + draw_text_box( + tempbuf, tempbuf + 1, + origx1, origx2, origy1 - top, origy1 - tb_border(), + text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE, false, + ui().colors().text_color(), ui().colors().background_color()); + + // determine the text to render below + game_driver const *const driver = (uintptr_t(selectedref) > 1) ? (const game_driver *)selectedref : nullptr; + if (driver) { - emu_options clean_options; - machine_static_info const info(ui().options(), machine_config(*driver, clean_options)); - m_cached_driver = driver; - m_cached_flags = info.machine_flags(); - m_cached_unemulated = info.unemulated_features(); - m_cached_imperfect = info.imperfect_features(); - m_cached_color = info.status_color(); - } + // first line is game name + tempbuf[0] = string_format(_("%1$-.100s"), driver->type.fullname()); - // next line is overall driver status - if (m_cached_flags & machine_flags::NOT_WORKING) - tempbuf[3] = _("Overall: NOT WORKING"); - else if ((m_cached_unemulated | m_cached_imperfect) & device_t::feature::PROTECTION) - tempbuf[3] = _("Overall: Unemulated Protection"); - else - tempbuf[3] = _("Overall: Working"); + // next line is year, manufacturer + tempbuf[1] = string_format(_("%1$s, %2$-.100s"), driver->year, driver->manufacturer); - // next line is graphics, sound status - if (m_cached_unemulated & device_t::feature::GRAPHICS) - tempbuf[4] = _("Graphics: Unimplemented, "); - else if ((m_cached_unemulated | m_cached_imperfect) & (device_t::feature::GRAPHICS | device_t::feature::PALETTE)) - tempbuf[4] = _("Graphics: Imperfect, "); - else - tempbuf[4] = _("Graphics: OK, "); - - if (m_cached_flags & machine_flags::NO_SOUND_HW) - tempbuf[4].append(_("Sound: None")); - else if (m_cached_unemulated & device_t::feature::SOUND) - tempbuf[4].append(_("Sound: Unimplemented")); - else if (m_cached_imperfect & device_t::feature::SOUND) - tempbuf[4].append(_("Sound: Imperfect")); - else - tempbuf[4].append(_("Sound: OK")); - } - else - { - const char *s = emulator_info::get_copyright(); - unsigned line = 0; + // next line source path + tempbuf[2] = string_format(_("Source file: %1$s"), info_xml_creator::format_sourcefile(driver->type.source())); + + // update cached values if selection changed + if (driver != m_cached_driver) + { + emu_options clean_options; + machine_static_info const info(ui().options(), machine_config(*driver, clean_options)); + m_cached_driver = driver; + m_cached_flags = info.machine_flags(); + m_cached_unemulated = info.unemulated_features(); + m_cached_imperfect = info.imperfect_features(); + m_cached_color = info.status_color(); + } - // first line is version string - tempbuf[line++] = string_format("%s %s", emulator_info::get_appname(), build_version); + // next line is overall driver status + if (m_cached_flags & machine_flags::NOT_WORKING) + tempbuf[3] = _("Overall: NOT WORKING"); + else if ((m_cached_unemulated | m_cached_imperfect) & device_t::feature::PROTECTION) + tempbuf[3] = _("Overall: Unemulated Protection"); + else + tempbuf[3] = _("Overall: Working"); - // output message - while (line < std::size(tempbuf)) + // next line is graphics, sound status + if (m_cached_unemulated & device_t::feature::GRAPHICS) + tempbuf[4] = _("Graphics: Unimplemented, "); + else if ((m_cached_unemulated | m_cached_imperfect) & (device_t::feature::GRAPHICS | device_t::feature::PALETTE)) + tempbuf[4] = _("Graphics: Imperfect, "); + else + tempbuf[4] = _("Graphics: OK, "); + + if (m_cached_flags & machine_flags::NO_SOUND_HW) + tempbuf[4].append(_("Sound: None")); + else if (m_cached_unemulated & device_t::feature::SOUND) + tempbuf[4].append(_("Sound: Unimplemented")); + else if (m_cached_imperfect & device_t::feature::SOUND) + tempbuf[4].append(_("Sound: Imperfect")); + else + tempbuf[4].append(_("Sound: OK")); + } + else { - if (!(*s == 0 || *s == '\n')) - tempbuf[line].push_back(*s); + std::string_view s = emulator_info::get_copyright(); + unsigned line = 0; + + // first line is version string + tempbuf[line++] = string_format("%s %s", emulator_info::get_appname(), build_version); - if (*s == '\n') + // output message + while (line < std::size(tempbuf)) { - line++; - s++; - } else if (*s != 0) - s++; - else - line++; + auto const found = s.find('\n'); + if (std::string::npos != found) + { + tempbuf[line++] = s.substr(0, found); + s.remove_prefix(found + 1); + } + else + { + tempbuf[line++] = s; + s = std::string_view(); + } + } } + + // draw the bottom box + draw_text_box( + std::begin(tempbuf), std::end(tempbuf), + origx1, origx2, origy2 + tb_border(), origy2 + bottom, + text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE, true, + ui().colors().text_color(), driver ? m_cached_color : ui().colors().background_color()); + } + + // if we're in an error state, overlay an error message + if (m_error) + { + ui().draw_text_box( + container(), + _("The selected system is missing one or more required ROMs/disk images. " + "Please select a different system.\n\nPress any key to continue."), + text_layout::text_justify::CENTER, 0.5f, 0.5f, UI_RED_COLOR); } +} + - // draw the bottom box - draw_text_box( - tempbuf, tempbuf + 4, - origx1, origx2, origy2 + tb_border(), origy2 + bottom, - text_layout::text_justify::CENTER, text_layout::word_wrapping::TRUNCATE, true, - ui().colors().text_color(), driver ? m_cached_color : ui().colors().background_color()); +//------------------------------------------------- +// custom_pointer_updated - override pointer +// handling +//------------------------------------------------- + +std::tuple simple_menu_select_game::custom_pointer_updated(bool changed, ui_event const &uievt) +{ + // only override mouse handling when error message is visible + if (!m_error || !uievt.pointer_buttons) + return std::make_tuple(IPT_INVALID, false, false); + + // primary click dismisses the message + if ((uievt.pointer_pressed & 0x01) && !(uievt.pointer_buttons & ~u32(0x01))) + m_error = false; + return std::make_tuple(IPT_INVALID, true, !m_error); } diff --git a/src/frontend/mame/ui/simpleselgame.h b/src/frontend/mame/ui/simpleselgame.h index f010bf14e8ef8..fcfe94e610997 100644 --- a/src/frontend/mame/ui/simpleselgame.h +++ b/src/frontend/mame/ui/simpleselgame.h @@ -15,8 +15,10 @@ #include "menu.h" + class driver_enumerator; + namespace ui { class simple_menu_select_game : public menu @@ -30,8 +32,9 @@ class simple_menu_select_game : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual bool custom_ui_back() override { return !m_search.empty(); } + virtual std::tuple custom_pointer_updated(bool changed, ui_event const &uievt) override; private: enum { VISIBLE_GAMES_IN_LIST = 15 }; diff --git a/src/frontend/mame/ui/sliders.cpp b/src/frontend/mame/ui/sliders.cpp index b708b6af56a86..1cbec4e352837 100644 --- a/src/frontend/mame/ui/sliders.cpp +++ b/src/frontend/mame/ui/sliders.cpp @@ -255,11 +255,10 @@ void menu_sliders::recompute_metrics(uint32_t width, uint32_t height, float aspe //------------------------------------------------- -// menu_sliders_custom_render - perform our special -// rendering +// custom_render - perform our special rendering //------------------------------------------------- -void menu_sliders::custom_render(void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) +void menu_sliders::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) { const slider_state *curslider = (const slider_state *)selectedref; if (curslider != nullptr) diff --git a/src/frontend/mame/ui/sliders.h b/src/frontend/mame/ui/sliders.h index f9c0c69a1768b..b3c8ae3aca7be 100644 --- a/src/frontend/mame/ui/sliders.h +++ b/src/frontend/mame/ui/sliders.h @@ -26,7 +26,7 @@ class menu_sliders : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual void menu_activated() override; virtual void menu_deactivated() override; diff --git a/src/frontend/mame/ui/slotopt.cpp b/src/frontend/mame/ui/slotopt.cpp index bd92a2f9c9b58..10fbeed03c6ec 100644 --- a/src/frontend/mame/ui/slotopt.cpp +++ b/src/frontend/mame/ui/slotopt.cpp @@ -222,7 +222,7 @@ void menu_slot_devices::recompute_metrics(uint32_t width, uint32_t height, float // custom_render - draw extra menu content //------------------------------------------------- -void menu_slot_devices::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_slot_devices::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { if (selectedref && (ITEMREF_RESET != selectedref)) { diff --git a/src/frontend/mame/ui/slotopt.h b/src/frontend/mame/ui/slotopt.h index af272dde8ed7a..91c78de7d1e45 100644 --- a/src/frontend/mame/ui/slotopt.h +++ b/src/frontend/mame/ui/slotopt.h @@ -27,7 +27,7 @@ class menu_slot_devices : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) override; private: enum class step_t diff --git a/src/frontend/mame/ui/state.cpp b/src/frontend/mame/ui/state.cpp index 0c39c89d9e67d..efbc9e67e98cd 100644 --- a/src/frontend/mame/ui/state.cpp +++ b/src/frontend/mame/ui/state.cpp @@ -13,6 +13,7 @@ #include "emuopts.h" #include "inputdev.h" +#include "uiinput.h" #include "path.h" @@ -376,10 +377,11 @@ void menu_load_save_state_base::slot_selected(std::string &&name) // handle_keys - override key handling //------------------------------------------------- -void menu_load_save_state_base::handle_keys(uint32_t flags, int &iptkey) +bool menu_load_save_state_base::handle_keys(uint32_t flags, int &iptkey) { if (m_confirm_delete) { + bool updated(false); if (exclusive_input_pressed(iptkey, IPT_UI_SELECT, 0)) { // try to remove the file @@ -415,20 +417,39 @@ void menu_load_save_state_base::handle_keys(uint32_t flags, int &iptkey) m_confirm_prompt.clear(); m_confirm_delete = nullptr; m_keys_released = false; + updated = true; } iptkey = IPT_INVALID; + return updated; } else if (INPUT_CODE_INVALID != m_slot_selected) { iptkey = IPT_INVALID; + return false; } else { - menu::handle_keys(flags, iptkey); + return autopause_menu<>::handle_keys(flags, iptkey); } } +//------------------------------------------------- +// custom_pointer_updated - override pointer +// handling +//------------------------------------------------- + +std::tuple menu_load_save_state_base::custom_pointer_updated(bool changed, ui_event const &uievt) +{ + // suppress clicks on the menu while the delete prompt is visible + if (m_confirm_delete && uievt.pointer_buttons) + return std::make_tuple(IPT_INVALID, true, false); + else + return autopause_menu<>::custom_pointer_updated(changed, uievt); + +} + + //------------------------------------------------- // recompute_metrics - recompute metrics //------------------------------------------------- @@ -446,7 +467,7 @@ void menu_load_save_state_base::recompute_metrics(uint32_t width, uint32_t heigh // custom_render - perform our special rendering //------------------------------------------------- -void menu_load_save_state_base::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void menu_load_save_state_base::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { std::string_view text[2]; unsigned count(0U); diff --git a/src/frontend/mame/ui/state.h b/src/frontend/mame/ui/state.h index 8d02ab0888142..1bbdd1396aecf 100644 --- a/src/frontend/mame/ui/state.h +++ b/src/frontend/mame/ui/state.h @@ -17,6 +17,7 @@ #include "iptseqpoll.h" #include +#include #include @@ -37,8 +38,9 @@ class menu_load_save_state_base : public autopause_menu<> bool one_shot); virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; - virtual void handle_keys(uint32_t flags, int &iptkey) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual bool handle_keys(uint32_t flags, int &iptkey) override; + virtual std::tuple custom_pointer_updated(bool changed, ui_event const &uievt) override; virtual void populate() override; virtual bool handle(event const *ev) override; diff --git a/src/frontend/mame/ui/submenu.cpp b/src/frontend/mame/ui/submenu.cpp index 188f6622c71a9..cce1f28eeb2a7 100644 --- a/src/frontend/mame/ui/submenu.cpp +++ b/src/frontend/mame/ui/submenu.cpp @@ -465,7 +465,7 @@ void submenu::recompute_metrics(uint32_t width, uint32_t height, float aspect) // perform our special rendering //------------------------------------------------- -void submenu::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void submenu::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { if (selectedref) { diff --git a/src/frontend/mame/ui/submenu.h b/src/frontend/mame/ui/submenu.h index 87e92cc3d9d7a..80c836e67e846 100644 --- a/src/frontend/mame/ui/submenu.h +++ b/src/frontend/mame/ui/submenu.h @@ -61,7 +61,7 @@ class submenu : public menu protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; private: virtual void populate() override; diff --git a/src/frontend/mame/ui/text.cpp b/src/frontend/mame/ui/text.cpp index be7105c1938ef..ffbddad418f59 100644 --- a/src/frontend/mame/ui/text.cpp +++ b/src/frontend/mame/ui/text.cpp @@ -605,18 +605,22 @@ bool text_layout::hit_test(float x, float y, size_t &start, size_t &span) // restyle //------------------------------------------------- -void text_layout::restyle(size_t start, size_t span, rgb_t *fgcolor, rgb_t *bgcolor) +void text_layout::restyle(size_t start, size_t span, rgb_t const *fgcolor, rgb_t const *bgcolor) { for (const auto &line : m_lines) { for (size_t i = 0; i < line->character_count(); i++) { auto &ch = line->character(i); - if (ch.source.start >= start && ch.source.start + ch.source.span <= start + span) + if ((ch.source.start + ch.source.span) > (start + span)) { - if (fgcolor != nullptr) + return; + } + else if (ch.source.start >= start) + { + if (fgcolor) ch.style.fgcolor = *fgcolor; - if (bgcolor != nullptr) + if (bgcolor) ch.style.bgcolor = *bgcolor; } } diff --git a/src/frontend/mame/ui/text.h b/src/frontend/mame/ui/text.h index 0e19970c3b001..a9169faa18636 100644 --- a/src/frontend/mame/ui/text.h +++ b/src/frontend/mame/ui/text.h @@ -66,7 +66,7 @@ class text_layout bool empty() const { return m_lines.empty(); } size_t lines() const { return m_lines.size(); } bool hit_test(float x, float y, size_t &start, size_t &span); - void restyle(size_t start, size_t span, rgb_t *fgcolor, rgb_t *bgcolor); + void restyle(size_t start, size_t span, rgb_t const *fgcolor, rgb_t const *bgcolor); void emit(render_container &container, float x, float y); void emit(render_container &container, size_t start, size_t lines, float x, float y); void add_text(std::string_view text, rgb_t fgcolor = rgb_t::white(), rgb_t bgcolor = rgb_t::transparent(), float size = 1.0) diff --git a/src/frontend/mame/ui/textbox.cpp b/src/frontend/mame/ui/textbox.cpp index 065fca7910125..33319047bd83d 100644 --- a/src/frontend/mame/ui/textbox.cpp +++ b/src/frontend/mame/ui/textbox.cpp @@ -12,7 +12,8 @@ #include "textbox.h" #include "ui/ui.h" -#include "ui/utils.h" + +#include "uiinput.h" #include #include @@ -80,11 +81,18 @@ void populate_three_column_layout(std::string_view text, T &&l, U &&c, V &&r) menu_textbox::menu_textbox(mame_ui_manager &mui, render_container &container) : menu(mui, container) , m_layout() + , m_line_bounds(0.0F, 0.0F) + , m_visible_top(0.0F) , m_layout_width(-1.0F) , m_desired_width(-1.0F) , m_desired_lines(-1) , m_window_lines(0) , m_top_line(0) + , m_pointer_action(pointer_action::NONE) + , m_scroll_repeat(std::chrono::steady_clock::time_point::min()) + , m_base_pointer(0.0F, 0.0F) + , m_last_pointer(0.0F, 0.0F) + , m_scroll_base(0) { } @@ -97,50 +105,129 @@ menu_textbox::~menu_textbox() void menu_textbox::reset_layout() { // force recompute and scroll to top - m_layout = std::nullopt; + m_layout.reset(); m_top_line = 0; + m_pointer_action = pointer_action::NONE; } -bool menu_textbox::handle_key(int key) +void menu_textbox::recompute_metrics(uint32_t width, uint32_t height, float aspect) { - switch (key) - { - case IPT_UI_UP: - --m_top_line; - return true; - - case IPT_UI_DOWN: - ++m_top_line; - return true; - - case IPT_UI_PAGE_UP: - m_top_line -= m_window_lines - 3; - return true; + menu::recompute_metrics(width, height, aspect); - case IPT_UI_PAGE_DOWN: - m_top_line += m_window_lines - 3; - return true; + m_layout.reset(); + m_pointer_action = pointer_action::NONE; +} - case IPT_UI_HOME: - m_top_line = 0; - return true; - case IPT_UI_END: - m_top_line = m_layout->lines() - m_window_lines; - return true; +std::tuple menu_textbox::custom_pointer_updated(bool changed, ui_event const &uievt) +{ + // no pointer input if we don't have up-to-date content on-screen + if (!m_layout || (ui_event::type::POINTER_ABORT == uievt.event_type)) + { + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, false, false); + } - default: - return false; + // if nothing's happening, check for clicks + if (pointer_idle()) + { + if ((uievt.pointer_pressed & 0x01) && !(uievt.pointer_buttons & ~u32(0x01))) + { + auto const [x, y] = pointer_location(); + if ((x >= m_line_bounds.first) && (x < m_line_bounds.second)) + { + if (m_top_line && pointer_in_line(y, 0)) + { + // scroll up arrow + --m_top_line; + m_pointer_action = pointer_action::SCROLL_UP; + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + m_last_pointer = std::make_pair(x, y); + return std::make_tuple(IPT_INVALID, true, true); + } + else if (((m_top_line + m_window_lines) < m_layout->lines()) && pointer_in_line(y, m_window_lines - 1)) + { + // scroll down arrow + ++m_top_line; + m_pointer_action = pointer_action::SCROLL_DOWN; + m_scroll_repeat = std::chrono::steady_clock::now() + std::chrono::milliseconds(300); + m_last_pointer = std::make_pair(x, y); + return std::make_tuple(IPT_INVALID, true, true); + } + else if ((2 == uievt.pointer_clicks) && pointer_in_line(y, m_window_lines + 1)) + { + // return to previous menu item + // FIXME: this should really use the start point of the multi-click action + m_pointer_action = pointer_action::CHECK_EXIT; + return std::make_tuple(IPT_INVALID, true, false); + } + else if ((ui_event::pointer::TOUCH == uievt.pointer_type) && (y >= m_visible_top) && (y < (m_visible_top + (float(m_window_lines) * line_height())))) + { + m_pointer_action = pointer_action::SCROLL_DRAG; + m_base_pointer = std::make_pair(x, y); + m_last_pointer = m_base_pointer; + m_scroll_base = m_top_line; + return std::make_tuple(IPT_INVALID, true, false); + } + } + } + return std::make_tuple(IPT_INVALID, false, false); } -} + // handle in-progress actions + switch (m_pointer_action) + { + case pointer_action::NONE: + break; -void menu_textbox::recompute_metrics(uint32_t width, uint32_t height, float aspect) -{ - menu::recompute_metrics(width, height, aspect); + case pointer_action::SCROLL_UP: + case pointer_action::SCROLL_DOWN: + { + // check for re-entry + bool redraw(false); + float const linetop(m_visible_top + ((pointer_action::SCROLL_DOWN == m_pointer_action) ? (float(m_window_lines - 1) * line_height()) : 0.0F)); + float const linebottom(linetop + line_height()); + auto const [x, y] = pointer_location(); + bool const reentered(reentered_rect(m_last_pointer.first, m_last_pointer.second, x, y, m_line_bounds.first, linetop, m_line_bounds.second, linebottom)); + if (reentered) + { + auto const now(std::chrono::steady_clock::now()); + if (scroll_if_expired(now)) + { + redraw = true; + m_scroll_repeat = now + std::chrono::milliseconds(100); + } + } + m_last_pointer = std::make_pair(x, y); + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, redraw); + } - m_layout = std::nullopt; + case pointer_action::SCROLL_DRAG: + { + // scroll if it moved + auto const newtop(drag_scroll( + pointer_location().second, m_base_pointer.second, m_last_pointer.second, -line_height(), + m_scroll_base, 0, int(m_layout->lines() - m_window_lines))); + bool const scrolled(newtop != m_top_line); + m_top_line = newtop; + + // catch the end of the gesture + if ((uievt.pointer_released & 0x01) || (uievt.pointer_pressed & ~u32(0x01))) + m_pointer_action = pointer_action::NONE; + return std::make_tuple(IPT_INVALID, pointer_action::NONE != m_pointer_action, scrolled); + } + + case pointer_action::CHECK_EXIT: + if (uievt.pointer_released & 0x01) + return std::make_tuple((2 == uievt.pointer_clicks) ? IPT_UI_SELECT : IPT_INVALID, false, false); + else if (uievt.pointer_buttons & ~u32(0x01)) + return std::make_tuple(IPT_INVALID, false, false); + return std::make_tuple(IPT_INVALID, true, false); + } + return std::make_tuple(IPT_INVALID, false, false); } @@ -151,6 +238,62 @@ bool menu_textbox::custom_mouse_scroll(int lines) } +bool menu_textbox::handle(event const *ev) +{ + // deal with repeating scroll arrows + bool scrolled(false); + if ((pointer_action::SCROLL_UP == m_pointer_action) || (pointer_action::SCROLL_DOWN == m_pointer_action)) + { + float const linetop(m_visible_top + ((pointer_action::SCROLL_DOWN == m_pointer_action) ? (float(m_window_lines - 1) * line_height()) : 0.0F)); + float const linebottom(linetop + line_height()); + if (pointer_in_rect(m_line_bounds.first, linetop, m_line_bounds.second, linebottom)) + { + while (scroll_if_expired(std::chrono::steady_clock::now())) + { + scrolled = true; + m_scroll_repeat += std::chrono::milliseconds(100); + } + } + } + + if (ev) + { + switch (ev->iptkey) + { + case IPT_UI_SELECT: + stack_pop(); + return true; + + case IPT_UI_UP: + --m_top_line; + return true; + + case IPT_UI_DOWN: + ++m_top_line; + return true; + + case IPT_UI_PAGE_UP: + m_top_line -= m_window_lines - 3; + return true; + + case IPT_UI_PAGE_DOWN: + m_top_line += m_window_lines - 3; + return true; + + case IPT_UI_HOME: + m_top_line = 0; + return true; + + case IPT_UI_END: + m_top_line = m_layout->lines() - m_window_lines; + return true; + } + } + + return scrolled; +} + + void menu_textbox::draw(uint32_t flags) { float const visible_width = 1.0F - (2.0F * lr_border()); @@ -162,10 +305,9 @@ void menu_textbox::draw(uint32_t flags) float const maximum_width = visible_width - (2.0F * gutter_width()); draw_background(); - map_mouse(); // account for extra space at the top and bottom and the separator/item for closing - float visible_main_menu_height = 1.0F - 2.0F * tb_border() - visible_extra_menu_height; + float visible_main_menu_height = 1.0F - (2.0F * tb_border()) - visible_extra_menu_height; m_window_lines = int(std::trunc(visible_main_menu_height / line_height())); // lay out the text if necessary @@ -179,7 +321,7 @@ void menu_textbox::draw(uint32_t flags) visible_main_menu_height = float(m_window_lines) * line_height(); // compute top/left of inner menu area by centering, if the menu is at the bottom of the extra, adjust - float const visible_top = ((1.0F - (visible_main_menu_height + visible_extra_menu_height)) * 0.5F) + get_customtop(); + m_visible_top = ((1.0F - (visible_main_menu_height + visible_extra_menu_height)) * 0.5F) + get_customtop(); // get width required to draw the sole menu item menu_item const &pitem = item(0); @@ -189,54 +331,68 @@ void menu_textbox::draw(uint32_t flags) // compute text box size float const x1 = visible_left + ((maximum_width - draw_width) * 0.5F); - float const y1 = visible_top - tb_border(); + float const y1 = m_visible_top - tb_border(); float const x2 = visible_left + visible_width - ((maximum_width - draw_width) * 0.5F); - float const y2 = visible_top + visible_main_menu_height + tb_border() + extra_height; + float const y2 = m_visible_top + visible_main_menu_height + tb_border() + extra_height; float const effective_left = x1 + gutter_width(); - float const line_x0 = x1 + 0.5F * UI_LINE_WIDTH; - float const line_x1 = x2 - 0.5F * UI_LINE_WIDTH; - float const separator = visible_top + float(m_window_lines) * line_height(); + m_line_bounds = std::make_pair(x1 + (0.5F * UI_LINE_WIDTH), x2 - (0.5F * UI_LINE_WIDTH)); + float const separator = m_visible_top + float(m_window_lines) * line_height(); ui().draw_outlined_box(container(), x1, y1, x2, y2, ui().colors().background_color()); - int const visible_items = m_layout->lines(); - m_window_lines = (std::min)(visible_items, m_window_lines); + int const desired_lines = m_layout->lines(); + int const drawn_lines = (std::min)(desired_lines, m_window_lines); m_top_line = (std::max)(0, m_top_line); - if (m_top_line + m_window_lines >= visible_items) - m_top_line = visible_items - m_window_lines; + if ((m_top_line + drawn_lines) >= desired_lines) + m_top_line = desired_lines - drawn_lines; - clear_hover(); if (m_top_line) { - // if we're on the top line, display the up arrow - rgb_t fgcolor = ui().colors().text_color(); - if (mouse_in_rect(line_x0, visible_top, line_x1, visible_top + line_height())) + // if we're not showing the top line, display the up arrow + rgb_t fgcolor(ui().colors().text_color()); + bool const hovered(pointer_in_rect(m_line_bounds.first, m_visible_top, m_line_bounds.second, m_visible_top + line_height())); + if (hovered && (pointer_action::SCROLL_UP == m_pointer_action)) + { + fgcolor = ui().colors().selected_color(); + highlight( + m_line_bounds.first, m_visible_top, + m_line_bounds.second, m_visible_top + line_height(), + ui().colors().selected_bg_color()); + } + else if ((hovered && pointer_idle()) || (pointer_action::SCROLL_UP == m_pointer_action)) { fgcolor = ui().colors().mouseover_color(); highlight( - line_x0, visible_top, - line_x1, visible_top + line_height(), + m_line_bounds.first, m_visible_top, + m_line_bounds.second, m_visible_top + line_height(), ui().colors().mouseover_bg_color()); - set_hover(HOVER_ARROW_UP); } draw_arrow( - 0.5F * (x1 + x2 - ud_arrow_width()), visible_top + (0.25F * line_height()), - 0.5F * (x1 + x2 + ud_arrow_width()), visible_top + (0.75F * line_height()), + 0.5F * (x1 + x2 - ud_arrow_width()), m_visible_top + (0.25F * line_height()), + 0.5F * (x1 + x2 + ud_arrow_width()), m_visible_top + (0.75F * line_height()), fgcolor, ROT0); } - if ((m_top_line + m_window_lines) < visible_items) + if ((m_top_line + m_window_lines) < desired_lines) { - // if we're on the bottom line, display the down arrow - float const line_y = visible_top + float(m_window_lines - 1) * line_height(); - rgb_t fgcolor = ui().colors().text_color(); - if (mouse_in_rect(line_x0, line_y, line_x1, line_y + line_height())) + // if we're not showing the bottom line, display the down arrow + float const line_y(m_visible_top + float(m_window_lines - 1) * line_height()); + rgb_t fgcolor(ui().colors().text_color()); + bool const hovered(pointer_in_rect(m_line_bounds.first, line_y, m_line_bounds.second, line_y + line_height())); + if (hovered && (pointer_action::SCROLL_DOWN == m_pointer_action)) + { + fgcolor = ui().colors().selected_color(); + highlight( + m_line_bounds.first, line_y, + m_line_bounds.second, line_y + line_height(), + ui().colors().selected_bg_color()); + } + else if ((hovered && pointer_idle()) || (pointer_action::SCROLL_DOWN == m_pointer_action)) { fgcolor = ui().colors().mouseover_color(); highlight( - line_x0, line_y, - line_x1, line_y + line_height(), + m_line_bounds.first, line_y, + m_line_bounds.second, line_y + line_height(), ui().colors().mouseover_bg_color()); - set_hover(HOVER_ARROW_DOWN); } draw_arrow( 0.5F * (x1 + x2 - ud_arrow_width()), line_y + (0.25F * line_height()), @@ -245,11 +401,11 @@ void menu_textbox::draw(uint32_t flags) } // draw visible lines, minus 1 for top arrow and 1 for bottom arrow - auto const text_lines = m_window_lines - (m_top_line ? 1 : 0) - (m_top_line + m_window_lines != visible_items); + auto const text_lines = drawn_lines - (m_top_line ? 1 : 0) - ((m_top_line + drawn_lines) != desired_lines); m_layout->emit( container(), m_top_line ? (m_top_line + 1) : 0, text_lines, - effective_left, visible_top + (m_top_line ? line_height() : 0.0F)); + effective_left, m_visible_top + (m_top_line ? line_height() : 0.0F)); // add visual separator before the "return to prevous menu" item container().add_line( @@ -257,13 +413,10 @@ void menu_textbox::draw(uint32_t flags) x2, separator + (0.5F * line_height()), UI_LINE_WIDTH, ui().colors().text_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - float const line_y0 = separator + line_height(); + float const line_y0 = m_visible_top + float(m_window_lines + 1) * line_height(); float const line_y1 = line_y0 + line_height(); - if (mouse_in_rect(line_x0, line_y0, line_x1, line_y1) && is_selectable(pitem)) - set_hover(0); - - highlight(line_x0, line_y0, line_x1, line_y1, ui().colors().selected_bg_color()); + highlight(m_line_bounds.first, line_y0, m_line_bounds.second, line_y1, ui().colors().selected_bg_color()); ui().draw_text_full( container(), itemtext, effective_left, line_y0, draw_width, @@ -274,7 +427,37 @@ void menu_textbox::draw(uint32_t flags) line_height()); // if there is something special to add, do it by calling the virtual method - custom_render(get_selection_ref(), get_customtop(), get_custombottom(), x1, y1, x2, y2); + custom_render(flags, get_selection_ref(), get_customtop(), get_custombottom(), x1, y1, x2, y2); +} + + +bool menu_textbox::scroll_if_expired(std::chrono::steady_clock::time_point now) +{ + if (now < m_scroll_repeat) + return false; + + if (pointer_action::SCROLL_DOWN == m_pointer_action) + { + if ((m_top_line + m_window_lines) < m_layout->lines()) + ++m_top_line; + if ((m_top_line + m_window_lines) == m_layout->lines()) + m_pointer_action = pointer_action::NONE; + } + else + { + if (0 < m_top_line) + --m_top_line; + if (!m_top_line) + m_pointer_action = pointer_action::NONE; + } + return true; +} + + +inline bool menu_textbox::pointer_in_line(float y, int line) const +{ + float const top(m_visible_top + (float(line) * line_height())); + return (top <= y) && ((top + line_height()) > y); } @@ -309,7 +492,7 @@ void menu_fixed_textbox::recompute_metrics(uint32_t width, uint32_t height, floa } -void menu_fixed_textbox::custom_render(void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) +void menu_fixed_textbox::custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) { std::string_view const toptext[] = { m_heading }; draw_text_box( @@ -367,10 +550,4 @@ void menu_fixed_textbox::populate() { } - -bool menu_fixed_textbox::handle(event const *ev) -{ - return ev && handle_key(ev->iptkey); -} - } // namespace ui diff --git a/src/frontend/mame/ui/textbox.h b/src/frontend/mame/ui/textbox.h index af755761d4b6b..3a123980c8301 100644 --- a/src/frontend/mame/ui/textbox.h +++ b/src/frontend/mame/ui/textbox.h @@ -13,8 +13,11 @@ #include "ui/menu.h" #include "ui/text.h" +#include #include #include +#include +#include namespace ui { @@ -28,22 +31,44 @@ class menu_textbox : public menu menu_textbox(mame_ui_manager &mui, render_container &container); void reset_layout(); - bool handle_key(int key); virtual void populate_text(std::optional &layout, float &width, int &lines) = 0; virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; + virtual std::tuple custom_pointer_updated(bool changed, ui_event const &uievt) override; virtual bool custom_mouse_scroll(int lines) override; + virtual bool handle(event const *ev) override; + private: + enum class pointer_action + { + NONE, + SCROLL_UP, + SCROLL_DOWN, + SCROLL_DRAG, + CHECK_EXIT + }; + virtual void draw(uint32_t flags) override; + bool scroll_if_expired(std::chrono::steady_clock::time_point now); + bool pointer_in_line(float y, int line) const; + std::optional m_layout; + std::pair m_line_bounds; + float m_visible_top; float m_layout_width; float m_desired_width; int m_desired_lines; int m_window_lines; int m_top_line; + + pointer_action m_pointer_action; + std::chrono::steady_clock::time_point m_scroll_repeat; + std::pair m_base_pointer; + std::pair m_last_pointer; + int m_scroll_base; }; @@ -59,13 +84,12 @@ class menu_fixed_textbox : public menu_textbox protected: virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override; - virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; + virtual void custom_render(uint32_t flags, void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; virtual void populate_text(std::optional &layout, float &width, int &lines) override; private: virtual void populate() override; - virtual bool handle(event const *ev) override; std::string const m_heading; std::string const m_content; diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index 09a8d24bdd1b2..a9a4fd5ceedca 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -153,6 +153,34 @@ static uint32_t const mouse_bitmap[32*32] = }; +enum class mame_ui_manager::ui_callback_type : int +{ + NOINPUT, + GENERAL, + MODAL, + MENU, + CUSTOM +}; + + +struct mame_ui_manager::active_pointer +{ + active_pointer(ui_event const &event) : target(event.target), type(event.pointer_type), ptrid(event.pointer_id), x(-1.0F), y(-1.0F) + { + } + + bool operator<(std::pair const &val) const noexcept + { + return std::make_pair(target, ptrid) < val; + } + + render_target *target; + osd::ui_event_handler::pointer type; + u16 ptrid; + float x, y; +}; + + //------------------------------------------------- // ctor - set up the user interface //------------------------------------------------- @@ -161,7 +189,7 @@ mame_ui_manager::mame_ui_manager(running_machine &machine) : ui_manager(machine) , m_font() , m_handler_callback() - , m_handler_callback_type(ui_callback_type::GENERAL) + , m_handler_callback_type(ui_callback_type::NOINPUT) , m_ui_active(true) , m_single_step(false) , m_showfps(false) @@ -171,8 +199,8 @@ mame_ui_manager::mame_ui_manager(running_machine &machine) , m_mouse_bitmap(32, 32) , m_mouse_arrow_texture(nullptr) , m_mouse_show(false) - , m_mouse_target(-1) - , m_mouse_position(0, 0) + , m_update_pointers(false) + , m_pointers_changed(false) , m_target_font_height(0) , m_has_warnings(false) , m_unthrottle_mute(false) @@ -182,7 +210,8 @@ mame_ui_manager::mame_ui_manager(running_machine &machine) , m_imperfect_features() , m_last_launch_time(std::time_t(-1)) , m_last_warning_time(std::time_t(-1)) -{ } +{ +} mame_ui_manager::~mame_ui_manager() { @@ -203,7 +232,7 @@ void mame_ui_manager::init() // more initialization set_handler( - ui_callback_type::GENERAL, + ui_callback_type::NOINPUT, handler_callback_func( [this] (render_container &container) -> uint32_t { @@ -214,6 +243,7 @@ void mame_ui_manager::init() m_mouse_show = machine().system().flags & machine_flags::CLICKABLE_ARTWORK ? true : false; // request notification callbacks + machine().add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(&mame_ui_manager::frame_update, this)); machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&mame_ui_manager::exit, this)); machine().configuration().config_register( "ui_warnings", @@ -238,6 +268,25 @@ void mame_ui_manager::update_target_font_height() } +//------------------------------------------------- +// exit - called for each emulated frame +//------------------------------------------------- + +void mame_ui_manager::frame_update() +{ + // this hackery is needed to ensure natural keyboard and clickable artwork input is in sync with I/O ports + if (ui_callback_type::GENERAL == m_handler_callback_type) + { + process_ui_events(); + for (auto *target = machine().render().first_target(); target; target = target->next()) + { + if (!target->hidden()) + target->update_pointer_fields(); + } + } +} + + //------------------------------------------------- // exit - clean up ourselves on exit //------------------------------------------------- @@ -366,6 +415,12 @@ void mame_ui_manager::initialize(running_machine &machine) void mame_ui_manager::set_handler(ui_callback_type callback_type, handler_callback_func &&callback) { + m_active_pointers.clear(); + if (!m_display_pointers.empty()) + { + m_display_pointers.clear(); + m_pointers_changed = true; + } m_handler_callback = std::move(callback); m_handler_callback_type = callback_type; } @@ -625,7 +680,11 @@ void mame_ui_manager::set_startup_text(const char *text, bool force) bool mame_ui_manager::update_and_render(render_container &container) { // always start clean - container.empty(); + for (auto &target : machine().render().targets()) + { + if (target.ui_container()) + target.ui_container()->empty(); + } // if we're paused, dim the whole screen if (machine().phase() >= machine_phase::RESET && (single_step() || machine().paused())) @@ -657,7 +716,12 @@ bool mame_ui_manager::update_and_render(render_container &container) if (machine().phase() >= machine_phase::RESET) mame_machine_manager::instance()->cheat().render_text(*this, container); + // draw the FPS counter if it should be visible + if (show_fps_counter()) + draw_fps_counter(container); + // call the current UI handler + machine().ui_input().check_ui_inputs(); uint32_t const handler_result = m_handler_callback(container); // display any popup messages @@ -666,43 +730,34 @@ bool mame_ui_manager::update_and_render(render_container &container) else m_popup_text_end = 0; - // display the internal mouse cursor - bool mouse_moved = false; + // display the internal pointers + bool const pointer_update = m_pointers_changed; + m_pointers_changed = false; if (m_mouse_show || (is_menu_active() && machine().options().ui_mouse())) { - int32_t mouse_target_x, mouse_target_y; - bool mouse_button; - render_target *const mouse_target = machine().ui_input().find_mouse(&mouse_target_x, &mouse_target_y, &mouse_button); - - float mouse_y = -1, mouse_x = -1; - if (mouse_target && mouse_target->map_point_container(mouse_target_x, mouse_target_y, container, mouse_x, mouse_y)) + const float cursor_size = 0.6 * get_line_height(); + for (auto const &pointer : m_display_pointers) { - const float cursor_size = 0.6 * get_line_height(); - container.add_quad(mouse_x, mouse_y, mouse_x + cursor_size * container.manager().ui_aspect(&container), mouse_y + cursor_size, colors().text_color(), m_mouse_arrow_texture, PRIMFLAG_ANTIALIAS(1) | PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - if ((m_mouse_target != mouse_target->index()) || (std::make_pair(mouse_x, mouse_y) != m_mouse_position)) - { - m_mouse_target = mouse_target->index(); - m_mouse_position = std::make_pair(mouse_x, mouse_y); - mouse_moved = true; - } + render_container &container = *pointer.target.get().ui_container(); + container.add_quad( + pointer.x, + pointer.y, + pointer.x + cursor_size * container.manager().ui_aspect(&container), + pointer.y + cursor_size, + rgb_t::white(), + m_mouse_arrow_texture, + PRIMFLAG_ANTIALIAS(1) | PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } - else if (0 <= m_mouse_target) - { - m_mouse_target = -1; - mouse_moved = true; - } - } - else if (0 <= m_mouse_target) - { - m_mouse_target = -1; - mouse_moved = true; } // cancel takes us back to the in-game handler if (handler_result & HANDLER_CANCEL) + { + machine().ui_input().reset(); set_handler(ui_callback_type::GENERAL, handler_callback_func(&mame_ui_manager::handler_ingame, this)); + } - return mouse_moved || (handler_result & HANDLER_UPDATE); + return pointer_update || (handler_result & HANDLER_UPDATE); } @@ -954,7 +1009,7 @@ void mame_ui_manager::draw_message_window(render_container &container, std::stri void mame_ui_manager::show_fps_temp(double seconds) { if (!m_showfps) - m_showfps_end = osd_ticks() + seconds * osd_ticks_per_second(); + m_showfps_end = std::max(osd_ticks() + seconds * osd_ticks_per_second(), m_showfps_end); } @@ -966,10 +1021,7 @@ void mame_ui_manager::set_show_fps(bool show) { m_showfps = show; if (!show) - { - m_showfps = 0; m_showfps_end = 0; - } } @@ -990,7 +1042,7 @@ bool mame_ui_manager::show_fps() const bool mame_ui_manager::show_fps_counter() { - bool result = m_showfps || osd_ticks() < m_showfps_end; + bool const result = m_showfps || (osd_ticks() < m_showfps_end); if (!result) m_showfps_end = 0; return result; @@ -1025,17 +1077,13 @@ bool mame_ui_manager::show_profiler() const void mame_ui_manager::show_menu() { - set_handler(ui_callback_type::MENU, ui::menu::get_ui_handler(*this)); -} - - -//------------------------------------------------- -// show_mouse - change mouse status -//------------------------------------------------- + for (auto *target = machine().render().first_target(); target; target = target->next()) + { + if (!target->hidden()) + target->forget_pointers(); + } -void mame_ui_manager::show_mouse(bool status) -{ - m_mouse_show = status; + set_handler(ui_callback_type::MENU, ui::menu::get_ui_handler(*this)); } @@ -1044,10 +1092,9 @@ void mame_ui_manager::show_mouse(bool status) // UI handler is active //------------------------------------------------- -bool mame_ui_manager::is_menu_active(void) +bool mame_ui_manager::is_menu_active() { - return m_handler_callback_type == ui_callback_type::MENU - || m_handler_callback_type == ui_callback_type::VIEWER; + return m_handler_callback_type == ui_callback_type::MENU; } @@ -1057,48 +1104,119 @@ bool mame_ui_manager::is_menu_active(void) ***************************************************************************/ //------------------------------------------------- -// process_natural_keyboard - processes any -// natural keyboard input +// process_ui_events - processes queued UI input +// events //------------------------------------------------- -void mame_ui_manager::process_natural_keyboard() +void mame_ui_manager::process_ui_events() { + // process UI events + bool const use_natkbd(machine().natkeyboard().in_use() && (machine().phase() == machine_phase::RUNNING)); ui_event event; - - // loop while we have interesting events while (machine().ui_input().pop_event(&event)) { - // if this was a UI_EVENT_CHAR event, post it - if (event.event_type == ui_event::type::IME_CHAR) - machine().natkeyboard().post_char(event.ch); - } + switch (event.event_type) + { + case ui_event::type::NONE: + case ui_event::type::WINDOW_FOCUS: + case ui_event::type::WINDOW_DEFOCUS: + case ui_event::type::MOUSE_WHEEL: + break; - // process natural keyboard keys that don't get UI_EVENT_CHARs - for (int i = 0; i < std::size(non_char_keys); i++) - { - // identify this keycode - input_item_id itemid = non_char_keys[i]; - input_code code = machine().input().code_from_itemid(itemid); + case ui_event::type::POINTER_UPDATE: + if (event.target) + { + if (osd::ui_event_handler::pointer::TOUCH != event.pointer_type) + { + m_update_pointers = true; + auto pos(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), std::make_pair(event.target, event.pointer_id))); + if ((m_active_pointers.end() == pos) || (pos->target != event.target) || (pos->ptrid != event.pointer_id)) + pos = m_active_pointers.emplace(pos, event); + else + assert(pos->type == event.pointer_type); + event.target->map_point_container(event.pointer_x, event.pointer_y, *event.target->ui_container(), pos->x, pos->y); + } - // ...and determine if it is pressed - bool pressed = machine().input().code_pressed(code); + event.target->pointer_updated( + event.pointer_type, event.pointer_id, event.pointer_device, + event.pointer_x, event.pointer_y, + event.pointer_buttons, event.pointer_pressed, event.pointer_released, + event.pointer_clicks); + } + break; - // figure out whey we are in the key_down map - uint8_t *key_down_ptr = &m_non_char_keys_down[i / 8]; - uint8_t key_down_mask = 1 << (i % 8); + case ui_event::type::POINTER_LEAVE: + if (event.target) + { + auto const pos(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), std::make_pair(event.target, event.pointer_id))); + if (m_active_pointers.end() != pos) + { + m_update_pointers = true; + m_active_pointers.erase(pos); + } - if (pressed && !(*key_down_ptr & key_down_mask)) - { - // this key is now down - *key_down_ptr |= key_down_mask; + event.target->pointer_left( + event.pointer_type, event.pointer_id, event.pointer_device, + event.pointer_x, event.pointer_y, + event.pointer_released, + event.pointer_clicks); + } + break; + + case ui_event::type::POINTER_ABORT: + if (event.target) + { + auto const pos(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), std::make_pair(event.target, event.pointer_id))); + if (m_active_pointers.end() != pos) + { + m_update_pointers = true; + m_active_pointers.erase(pos); + } - // post the key - machine().natkeyboard().post_char(UCHAR_MAMEKEY_BEGIN + code.item_id()); + event.target->pointer_aborted( + event.pointer_type, event.pointer_id, event.pointer_device, + event.pointer_x, event.pointer_y, + event.pointer_released, + event.pointer_clicks); + } + break; + + case ui_event::type::IME_CHAR: + if (use_natkbd) + machine().natkeyboard().post_char(event.ch); + break; } - else if (!pressed && (*key_down_ptr & key_down_mask)) + } + + // process natural keyboard keys that don't get IME text input events + if (use_natkbd) + { + for (int i = 0; i < std::size(non_char_keys); i++) { - // this key is now up - *key_down_ptr &= ~key_down_mask; + // identify this keycode + input_item_id itemid = non_char_keys[i]; + input_code code = machine().input().code_from_itemid(itemid); + + // ...and determine if it is pressed + bool pressed = machine().input().code_pressed(code); + + // figure out whey we are in the key_down map + uint8_t *key_down_ptr = &m_non_char_keys_down[i / 8]; + uint8_t key_down_mask = 1 << (i % 8); + + if (pressed && !(*key_down_ptr & key_down_mask)) + { + // this key is now down + *key_down_ptr |= key_down_mask; + + // post the key + machine().natkeyboard().post_char(UCHAR_MAMEKEY_BEGIN + code.item_id()); + } + else if (!pressed && (*key_down_ptr & key_down_mask)) + { + // this key is now up + *key_down_ptr &= ~key_down_mask; + } } } } @@ -1226,10 +1344,6 @@ uint32_t mame_ui_manager::handler_ingame(render_container &container) bool is_paused = machine().paused(); - // first draw the FPS counter - if (show_fps_counter()) - draw_fps_counter(container); - // draw the profiler if visible if (show_profiler()) draw_profiler(container); @@ -1263,9 +1377,17 @@ uint32_t mame_ui_manager::handler_ingame(render_container &container) } } - // is the natural keyboard enabled? - if (machine().natkeyboard().in_use() && (machine().phase() == machine_phase::RUNNING)) - process_natural_keyboard(); + // process UI events and update pointers if necessary + process_ui_events(); + if (m_update_pointers) + { + display_pointer_vector pointers; + pointers.reserve(m_active_pointers.size()); + for (auto const &pointer : m_active_pointers) + pointers.emplace_back(display_pointer{ *pointer.target, pointer.type, pointer.x, pointer.y }); + set_pointers(pointers.begin(), pointers.end()); + m_update_pointers = false; + } if (!ui_disabled) { @@ -1309,11 +1431,17 @@ uint32_t mame_ui_manager::handler_ingame(render_container &container) // handle a request to display graphics/palette if (machine().ui_input().pressed(IPT_UI_SHOW_GFX)) { + for (auto *target = machine().render().first_target(); target; target = target->next()) + { + if (!target->hidden()) + target->forget_pointers(); + } + if (!is_paused) machine().pause(); using namespace std::placeholders; set_handler( - ui_callback_type::VIEWER, + ui_callback_type::MENU, handler_callback_func( [this, is_paused] (render_container &container) -> uint32_t { @@ -2266,6 +2394,23 @@ void mame_ui_manager::menu_reset() } +bool mame_ui_manager::set_ui_event_handler(std::function &&handler) +{ + // only allow takeover if there's nothing else happening + if (ui_callback_type::GENERAL != m_handler_callback_type) + return false; + + set_handler( + ui_callback_type::CUSTOM, + handler_callback_func( + [cb = std::move(handler)] (render_container &container) -> uint32_t + { + return !cb() ? HANDLER_CANCEL : 0; + })); + return true; +} + + //------------------------------------------------- // get_general_input_setting - get the current // default setting for an input type (useful for diff --git a/src/frontend/mame/ui/ui.h b/src/frontend/mame/ui/ui.h index 662d8d06fc1c7..231a6de15cb0a 100644 --- a/src/frontend/mame/ui/ui.h +++ b/src/frontend/mame/ui/ui.h @@ -13,18 +13,23 @@ #pragma once -#include "render.h" -#include "moptions.h" #include "language.h" #include "ui/uimain.h" #include "ui/menuitem.h" +#include "ui/moptions.h" #include "ui/slider.h" #include "ui/text.h" +#include "render.h" + +#include "interface/uievents.h" + #include #include #include +#include #include +#include #include #include #include @@ -63,14 +68,6 @@ class laserdisc_device; class mame_ui_manager; -enum class ui_callback_type -{ - GENERAL, - MODAL, - MENU, - VIEWER -}; - // ======================> ui_colors class ui_colors @@ -132,6 +129,18 @@ class mame_ui_manager : public ui_manager OPAQUE_ }; + struct display_pointer + { + std::reference_wrapper target; + osd::ui_event_handler::pointer type; + float x, y; + + bool operator!=(display_pointer const &that) const noexcept + { + return (&target.get() != &that.target.get()) || (type != that.type) || (x != that.x) || (y != that.y); + } + }; + // construction/destruction mame_ui_manager(running_machine &machine); ~mame_ui_manager(); @@ -184,7 +193,6 @@ class mame_ui_manager : public ui_manager void set_show_profiler(bool show); bool show_profiler() const; void show_menu(); - void show_mouse(bool status); virtual bool is_menu_active() override; bool can_paste(); bool found_machine_warnings() const { return m_has_warnings; } @@ -195,8 +203,39 @@ class mame_ui_manager : public ui_manager void draw_fps_counter(render_container &container); void draw_profiler(render_container &container); + // pointer display + template + void set_pointers(T first, T last) + { + auto dest = m_display_pointers.begin(); + while ((m_display_pointers.end() != dest) && (first != last)) + { + if (*first != *dest) + { + *dest = *first; + m_pointers_changed = true; + } + ++dest; + ++first; + } + if (m_display_pointers.end() != dest) + { + m_display_pointers.erase(dest, m_display_pointers.end()); + m_pointers_changed = true; + } + else + { + while (first != last) + { + m_display_pointers.emplace_back(*first); + m_pointers_changed = true; + ++first; + } + } + } + // slider controls - std::vector& get_slider_list(); + std::vector &get_slider_list(); // metrics float target_font_height() const { return m_target_font_height; } @@ -205,7 +244,7 @@ class mame_ui_manager : public ui_manager void update_target_font_height(); // other - void process_natural_keyboard(); + void process_ui_events(); ui::text_layout create_layout(render_container &container, float width = 1.0, ui::text_layout::text_justify justify = ui::text_layout::text_justify::LEFT, ui::text_layout::word_wrapping wrap = ui::text_layout::word_wrapping::WORD); void set_image_display_enabled(bool image_display_enabled) { m_image_display_enabled = image_display_enabled; } bool image_display_enabled() const { return m_image_display_enabled; } @@ -215,6 +254,7 @@ class mame_ui_manager : public ui_manager virtual void popup_time_string(int seconds, std::string message) override; virtual void menu_reset() override; + virtual bool set_ui_event_handler(std::function &&handler) override; template Data &get_session_data(Param &&... args) @@ -232,9 +272,15 @@ class mame_ui_manager : public ui_manager std::string get_general_input_setting(ioport_type type, int player = 0, input_seq_type seqtype = SEQ_TYPE_STANDARD); private: + enum class ui_callback_type : int; + + struct active_pointer; + using handler_callback_func = delegate; using device_feature_set = std::set >; using session_data_map = std::unordered_map; + using active_pointer_vector = std::vector; + using display_pointer_vector = std::vector; // instance variables std::unique_ptr m_font; @@ -248,11 +294,13 @@ class mame_ui_manager : public ui_manager osd_ticks_t m_popup_text_end; std::unique_ptr m_non_char_keys_down; + active_pointer_vector m_active_pointers; + display_pointer_vector m_display_pointers; bitmap_argb32 m_mouse_bitmap; render_texture * m_mouse_arrow_texture; bool m_mouse_show; - int m_mouse_target; - std::pair m_mouse_position; + bool m_update_pointers; + bool m_pointers_changed; ui_options m_ui_options; ui_colors m_ui_colors; @@ -280,6 +328,7 @@ class mame_ui_manager : public ui_manager // private methods void set_handler(ui_callback_type callback_type, handler_callback_func &&callback); + void frame_update(); void exit(); void config_load(config_type cfg_type, config_level cfg_level, util::xml::data_node const *parentnode); void config_save(config_type cfg_type, util::xml::data_node *parentnode); diff --git a/src/frontend/mame/ui/utils.cpp b/src/frontend/mame/ui/utils.cpp index b83abc5c277bc..b0107589e04f2 100644 --- a/src/frontend/mame/ui/utils.cpp +++ b/src/frontend/mame/ui/utils.cpp @@ -204,23 +204,16 @@ class choice_filter_impl_base : public simple_filter_impl_base virtual void show_ui(mame_ui_manager &mui, render_container &container, std::function &&handler) override { - if (m_choices.empty()) - { - handler(*this); - } - else - { - menu::stack_push( - mui, container, - _("Filter"), // TODO: get localised name of filter in here somehow - std::vector(m_choices), // ouch, a vector copy! - m_selection, - [this, cb = std::move(handler)] (int selection) - { - m_selection = selection; - cb(*this); - }); - } + menu::stack_push( + mui, container, + _("Filter"), // TODO: get localised name of filter in here somehow + std::vector(m_choices), // ouch, a vector copy! + m_selection, + [this, cb = std::move(handler)] (int selection) + { + m_selection = selection; + cb(*this); + }); } virtual bool wants_adjuster() const override { return have_choices(); } diff --git a/src/frontend/mame/ui/utils.h b/src/frontend/mame/ui/utils.h index c0a4e1d30ca88..04cb25a840c8e 100644 --- a/src/frontend/mame/ui/utils.h +++ b/src/frontend/mame/ui/utils.h @@ -360,14 +360,6 @@ class software_filter_data #define MAX_CHAR_INFO 256 -enum -{ - RP_FIRST = 0, - RP_IMAGES = RP_FIRST, - RP_INFOS, - RP_LAST = RP_INFOS -}; - enum { SHOW_PANELS = 0, @@ -376,28 +368,6 @@ enum HIDE_BOTH }; -enum -{ - HOVER_DAT_UP = -1000, - HOVER_DAT_DOWN, - HOVER_UI_LEFT, - HOVER_UI_RIGHT, - HOVER_ARROW_UP, - HOVER_ARROW_DOWN, - HOVER_B_FAV, - HOVER_B_EXPORT, - HOVER_B_AUDIT, - HOVER_B_DATS, - HOVER_BACKTRACK, - HOVER_RPANEL_ARROW, - HOVER_LPANEL_ARROW, - HOVER_FILTER_FIRST, - HOVER_FILTER_LAST = HOVER_FILTER_FIRST + std::max(ui::machine_filter::COUNT, ui::software_filter::COUNT), - HOVER_RP_FIRST, - HOVER_RP_LAST = HOVER_RP_FIRST + 1 + RP_LAST, - HOVER_INFO_TEXT -}; - // FIXME: this stuff shouldn't all be globals // GLOBAL CLASS diff --git a/src/frontend/mame/ui/viewgfx.cpp b/src/frontend/mame/ui/viewgfx.cpp index c4a6ecdbf6886..cbb104d546023 100644 --- a/src/frontend/mame/ui/viewgfx.cpp +++ b/src/frontend/mame/ui/viewgfx.cpp @@ -65,6 +65,81 @@ class gfx_viewer if (!m_machine.paused()) m_bitmap_dirty = true; + // handle pointer events to show hover info + ui_event event; + while (m_machine.ui_input().pop_event(&event)) + { + switch (event.event_type) + { + case ui_event::type::POINTER_UPDATE: + { + // ignore pointer input in windows other than the one that displays the UI + render_target &target(m_machine.render().ui_target()); + if (&target != event.target) + break; + + // don't change if the current pointer has buttons pressed and this one doesn't + if (event.pointer_id == m_current_pointer) + { + assert(m_pointer_type == event.pointer_type); + m_pointer_buttons = event.pointer_buttons; + m_pointer_inside = target.map_point_container( + event.pointer_x, + event.pointer_y, + container, + m_pointer_x, + m_pointer_y); + } + else if ((0 > m_current_pointer) || (!m_pointer_buttons && (!m_pointer_inside || event.pointer_buttons))) + { + float x, y; + bool const inside(target.map_point_container(event.pointer_x, event.pointer_y, container, x, y)); + if ((0 > m_current_pointer) || event.pointer_buttons || (!m_pointer_inside && inside)) + { + m_current_pointer = event.pointer_id; + m_pointer_type = event.pointer_type; + m_pointer_buttons = event.pointer_buttons; + m_pointer_x = x; + m_pointer_y = y; + m_pointer_inside = inside; + } + } + } + break; + + case ui_event::type::POINTER_LEAVE: + case ui_event::type::POINTER_ABORT: + { + // if this was our pointer, we've lost it + render_target &target(m_machine.render().ui_target()); + if ((&target == event.target) && (event.pointer_id == m_current_pointer)) + { + // keep the pointer position and type so we can show touch locations after release + m_current_pointer = -1; + m_pointer_buttons = 0U; + m_pointer_inside = target.map_point_container( + event.pointer_x, + event.pointer_y, + container, + m_pointer_x, + m_pointer_y); + } + } + break; + + // ignore anything that isn't pointer-related + default: + break; + } + } + + // always draw non-touch pointer + mame_ui_manager::display_pointer pointers[1]{ { m_machine.render().ui_target(), m_pointer_type, m_pointer_x, m_pointer_y } }; + if (m_pointer_inside && (0 <= m_current_pointer) && (ui_event::pointer::TOUCH != m_pointer_type)) + mui.set_pointers(std::begin(pointers), std::end(pointers)); + else + mui.set_pointers(std::begin(pointers), std::begin(pointers)); + // try to display the selected view while (true) { @@ -519,6 +594,13 @@ class gfx_viewer if (input.pressed(IPT_UI_SELECT)) { m_mode = view((int(m_mode) + 1) % 3); + if (0 > m_current_pointer) + { + m_pointer_type = ui_event::pointer::UNKNOWN; + m_pointer_x = -1.0F; + m_pointer_x = -1.0F; + m_pointer_inside = false; + } m_bitmap_dirty = true; } @@ -543,6 +625,12 @@ class gfx_viewer if (!uistate) m_machine.resume(); m_machine.ui_input().reset(); + m_current_pointer = -1; + m_pointer_type = ui_event::pointer::UNKNOWN; + m_pointer_buttons = 0U; + m_pointer_x = -1.0F; + m_pointer_y = -1.0F; + m_pointer_inside = false; m_bitmap_dirty = true; return mame_ui_manager::HANDLER_CANCEL; } @@ -595,20 +683,24 @@ class gfx_viewer bool map_mouse(render_container &container, render_bounds const &clip, float &x, float &y) const { - int32_t target_x, target_y; - bool button; - render_target *const target = m_machine.ui_input().find_mouse(&target_x, &target_y, &button); - if (!target) - return false; - else if (!target->map_point_container(target_x, target_y, container, x, y)) + if (((0 > m_current_pointer) && (m_pointer_type != ui_event::pointer::TOUCH)) || !m_pointer_inside) return false; - else - return clip.includes(x, y); + + x = m_pointer_x; + y = m_pointer_y; + return clip.includes(x, y); } running_machine &m_machine; view m_mode = view::PALETTE; + s32 m_current_pointer = -1; + ui_event::pointer m_pointer_type = ui_event::pointer::UNKNOWN; + u32 m_pointer_buttons = 0U; + float m_pointer_x = -1.0F; + float m_pointer_y = -1.0F; + bool m_pointer_inside = false; + bitmap_rgb32 m_bitmap; render_texture *m_texture = nullptr; bool m_bitmap_dirty = false; @@ -961,6 +1053,11 @@ uint32_t gfx_viewer::handle_palette(mame_ui_manager &mui, render_container &cont index, col.a(), col.r(), col.g(), col.b()); } + + // keep touch pointer displayed after release so they know what it's pointing at + mame_ui_manager::display_pointer pointers[1]{ { m_machine.render().ui_target(), m_pointer_type, m_pointer_x, m_pointer_y } }; + if (ui_event::pointer::TOUCH == m_pointer_type) + mui.set_pointers(std::begin(pointers), std::end(pointers)); } } @@ -1163,6 +1260,11 @@ uint32_t gfx_viewer::handle_gfxset(mame_ui_manager &mui, render_container &conta code, set.m_color, xpixel, ypixel, gfx.colorbase() + (set.m_color * gfx.granularity()) + pixdata); + + // keep touch pointer displayed after release so they know what it's pointing at + mame_ui_manager::display_pointer pointers[1]{ { m_machine.render().ui_target(), m_pointer_type, m_pointer_x, m_pointer_y } }; + if (ui_event::pointer::TOUCH == m_pointer_type) + mui.set_pointers(std::begin(pointers), std::end(pointers)); } } if (!found_pixel) @@ -1331,6 +1433,11 @@ uint32_t gfx_viewer::handle_tilemap(mame_ui_manager &mui, render_container &cont _("gfxview", " (%1$u %2$u) = GFX%3$u #%4$X:%5$X"), col * tilemap.tilewidth(), row * tilemap.tileheight(), gfxnum, code, color); + + // keep touch pointer displayed after release so they know what it's pointing at + mame_ui_manager::display_pointer pointers[1]{ { m_machine.render().ui_target(), m_pointer_type, m_pointer_x, m_pointer_y } }; + if (ui_event::pointer::TOUCH == m_pointer_type) + mui.set_pointers(std::begin(pointers), std::end(pointers)); } else { diff --git a/src/mame/layout/alphie.lay b/src/mame/layout/alphie.lay index 614ba89329ddb..3d3b591c31a27 100644 --- a/src/mame/layout/alphie.lay +++ b/src/mame/layout/alphie.lay @@ -66,7 +66,7 @@ authors:hap - + diff --git a/src/mame/layout/autorace.lay b/src/mame/layout/autorace.lay index 61652a4acf2d5..8a4b215cb3500 100644 --- a/src/mame/layout/autorace.lay +++ b/src/mame/layout/autorace.lay @@ -61,7 +61,7 @@ authors:hap - + diff --git a/src/mame/layout/bcheetah.lay b/src/mame/layout/bcheetah.lay index 2f0fffa705e6a..b77a30dcb06eb 100644 --- a/src/mame/layout/bcheetah.lay +++ b/src/mame/layout/bcheetah.lay @@ -67,7 +67,7 @@ authors:hap - + diff --git a/src/mame/layout/compperf.lay b/src/mame/layout/compperf.lay index fde3964b50b5d..4ecbf9d543969 100644 --- a/src/mame/layout/compperf.lay +++ b/src/mame/layout/compperf.lay @@ -158,9 +158,9 @@ authors:hap - - - + + + diff --git a/src/mame/layout/copycat.lay b/src/mame/layout/copycat.lay index dfb9a65349d8c..61e7fe258e43f 100644 --- a/src/mame/layout/copycat.lay +++ b/src/mame/layout/copycat.lay @@ -120,13 +120,13 @@ authors:hap - + - + diff --git a/src/mame/layout/matchme.lay b/src/mame/layout/matchme.lay index e361585def406..c3ba6c269fd2c 100644 --- a/src/mame/layout/matchme.lay +++ b/src/mame/layout/matchme.lay @@ -115,7 +115,7 @@ authors:hap - + diff --git a/src/mame/layout/mdndclab.lay b/src/mame/layout/mdndclab.lay index bd2c4fbeb8d18..8627e852475f4 100644 --- a/src/mame/layout/mdndclab.lay +++ b/src/mame/layout/mdndclab.lay @@ -5,101 +5,76 @@ authors:hap, Carl --> - - - + @@ -155,6 +130,10 @@ authors:hap, Carl + + + + diff --git a/src/mame/layout/microvision.lay b/src/mame/layout/microvision.lay index 6210d8ade7273..445e50c06c88e 100644 --- a/src/mame/layout/microvision.lay +++ b/src/mame/layout/microvision.lay @@ -54,7 +54,7 @@ authors:hap - + diff --git a/src/mame/layout/novag_savant.lay b/src/mame/layout/novag_savant.lay index 7959df33a1453..fed461850144a 100644 --- a/src/mame/layout/novag_savant.lay +++ b/src/mame/layout/novag_savant.lay @@ -155,7 +155,7 @@ authors:hap - + diff --git a/src/mame/layout/novag_supercon.lay b/src/mame/layout/novag_supercon.lay index 834b2c9b88c39..b03b4ae317457 100644 --- a/src/mame/layout/novag_supercon.lay +++ b/src/mame/layout/novag_supercon.lay @@ -572,15 +572,15 @@ authors:hap - - - - - - - - - + + + + + + + + + diff --git a/src/mame/layout/saitek_mark5.lay b/src/mame/layout/saitek_mark5.lay index 503638b77272d..ed1878dcda49e 100644 --- a/src/mame/layout/saitek_mark5.lay +++ b/src/mame/layout/saitek_mark5.lay @@ -219,7 +219,7 @@ authors:hap - + @@ -405,7 +405,7 @@ authors:hap - + diff --git a/src/mame/layout/saitek_mark6.lay b/src/mame/layout/saitek_mark6.lay index 260f5b3421bab..d7fe6d5f1ee06 100644 --- a/src/mame/layout/saitek_mark6.lay +++ b/src/mame/layout/saitek_mark6.lay @@ -513,7 +513,7 @@ authors:hap - + @@ -699,7 +699,7 @@ authors:hap - + diff --git a/src/mame/layout/saitek_ssystem3.lay b/src/mame/layout/saitek_ssystem3.lay index 0e45199ed6bbe..694194e344266 100644 --- a/src/mame/layout/saitek_ssystem3.lay +++ b/src/mame/layout/saitek_ssystem3.lay @@ -146,7 +146,7 @@ authors:hap - + @@ -206,7 +206,7 @@ authors:hap - + diff --git a/src/mame/layout/saitek_ssystem4.lay b/src/mame/layout/saitek_ssystem4.lay index cd72b1d0edc4c..5ff273b0e01f5 100644 --- a/src/mame/layout/saitek_ssystem4.lay +++ b/src/mame/layout/saitek_ssystem4.lay @@ -91,7 +91,7 @@ authors:hap - + diff --git a/src/mame/layout/simon.lay b/src/mame/layout/simon.lay index ef56c8eef3f9b..25993d3cb2c3d 100644 --- a/src/mame/layout/simon.lay +++ b/src/mame/layout/simon.lay @@ -130,7 +130,7 @@ authors:hap - + @@ -138,7 +138,7 @@ authors:hap - + diff --git a/src/mame/layout/ssimon.lay b/src/mame/layout/ssimon.lay index a725bf4d05337..2f48a49146697 100644 --- a/src/mame/layout/ssimon.lay +++ b/src/mame/layout/ssimon.lay @@ -174,7 +174,7 @@ authors:hap - + @@ -207,7 +207,7 @@ authors:hap - + @@ -215,7 +215,7 @@ authors:hap - + diff --git a/src/mame/layout/strobe.lay b/src/mame/layout/strobe.lay index 7947e1c3bc538..6d44a11acb168 100644 --- a/src/mame/layout/strobe.lay +++ b/src/mame/layout/strobe.lay @@ -134,7 +134,7 @@ authors:hap - + diff --git a/src/mame/layout/tmbaskb.lay b/src/mame/layout/tmbaskb.lay index e1c509fddebfe..6b24e829b8899 100644 --- a/src/mame/layout/tmbaskb.lay +++ b/src/mame/layout/tmbaskb.lay @@ -245,7 +245,7 @@ authors:hap - + diff --git a/src/mame/layout/tmvolleyb.lay b/src/mame/layout/tmvolleyb.lay index ea09bf021ef8b..c5aacfb9e6f62 100644 --- a/src/mame/layout/tmvolleyb.lay +++ b/src/mame/layout/tmvolleyb.lay @@ -178,7 +178,7 @@ authors:hap - + diff --git a/src/mame/layout/vclock3.lay b/src/mame/layout/vclock3.lay index 8e0c0bd9cd863..cc02e133a327c 100644 --- a/src/mame/layout/vclock3.lay +++ b/src/mame/layout/vclock3.lay @@ -41,7 +41,7 @@ authors:hap - + diff --git a/src/mame/layout/videoart.lay b/src/mame/layout/videoart.lay index f8504dd9fa4d1..590a1bd99ea08 100644 --- a/src/mame/layout/videoart.lay +++ b/src/mame/layout/videoart.lay @@ -64,7 +64,7 @@ authors:hap - + diff --git a/src/osd/interface/uievents.h b/src/osd/interface/uievents.h new file mode 100644 index 0000000000000..199d612713af4 --- /dev/null +++ b/src/osd/interface/uievents.h @@ -0,0 +1,61 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles, Vas Crabb +/*************************************************************************** + + uievents.h + + OSD UI event interfaces + +***************************************************************************/ +#ifndef MAME_OSD_INTERFACE_UIEVENTS_H +#define MAME_OSD_INTERFACE_UIEVENTS_H + + +//************************************************************************** +// FORWARD DECLARATIONS +//************************************************************************** + +class render_target; + + +namespace osd { + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// UI event handler interface + +class ui_event_handler +{ +protected: + ~ui_event_handler() = default; + +public: + enum class pointer + { + UNKNOWN, + MOUSE, + PEN, + TOUCH + }; + + // window events + virtual void push_window_focus_event(render_target *target) = 0; + virtual void push_window_defocus_event(render_target *target) = 0; + + // legacy mouse events + virtual void push_mouse_wheel_event(render_target *target, s32 x, s32 y, short delta, int lines) = 0; + + // pointer events + virtual void push_pointer_update(render_target *target, pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 buttons, u32 pressed, u32 released, s16 clicks) = 0; + virtual void push_pointer_leave(render_target *target, pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 released, s16 clicks) = 0; + virtual void push_pointer_abort(render_target *target, pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 released, s16 clicks) = 0; + + // text input events + virtual void push_char_event(render_target *target, char32_t ch) = 0; +}; + +} // namespace osd + +#endif // MAME_OSD_INTERFACE_UIEVENTS_H diff --git a/src/osd/modules/debugger/debugimgui.cpp b/src/osd/modules/debugger/debugimgui.cpp index 4ae514f857fa1..e2d4eba363ace 100644 --- a/src/osd/modules/debugger/debugimgui.cpp +++ b/src/osd/modules/debugger/debugimgui.cpp @@ -18,6 +18,7 @@ #include "debug/debugcpu.h" #include "debugger.h" #include "render.h" +#include "ui/uimain.h" #include "uiinput.h" #include "formats/flopimg.h" @@ -36,16 +37,16 @@ class debug_area DISABLE_COPYING(debug_area); public: - debug_area(running_machine &machine, debug_view_type type) - : next(nullptr), - type(0), - ofs_x(0), - ofs_y(0), - is_collapsed(false), - exec_cmd(false), - scroll_end(false), - scroll_follow(false) - { + debug_area(running_machine &machine, debug_view_type type) : + next(nullptr), + type(0), + ofs_x(0), + ofs_y(0), + is_collapsed(false), + exec_cmd(false), + scroll_end(false), + scroll_follow(false) + { this->view = machine.debug_view().alloc_view(type, nullptr, this); this->type = type; this->m_machine = &machine; @@ -63,7 +64,7 @@ class debug_area default: break; } - } + } ~debug_area() { //this->target->debug_free(*this->container); @@ -72,7 +73,7 @@ class debug_area running_machine &machine() const { assert(m_machine != nullptr); return *m_machine; } - debug_area * next; + debug_area * next; int type; debug_view * view; @@ -99,9 +100,11 @@ class debug_area class debug_imgui : public osd_module, public debug_module { public: - debug_imgui() - : osd_module(OSD_DEBUG_PROVIDER, "imgui"), debug_module(), + debug_imgui() : + osd_module(OSD_DEBUG_PROVIDER, "imgui"), debug_module(), m_machine(nullptr), + m_take_ui(false), + m_current_pointer(-1), m_mouse_x(0), m_mouse_y(0), m_mouse_button(false), @@ -155,9 +158,8 @@ class debug_imgui : public osd_module, public debug_module std::string longname; }; - void handle_mouse(); + void handle_events(); void handle_mouse_views(); - void handle_keys(); void handle_keys_views(); void handle_console(running_machine* machine); void update(); @@ -184,15 +186,17 @@ class debug_imgui : public osd_module, public debug_module static int history_set(ImGuiInputTextCallbackData* data); running_machine* m_machine; - int32_t m_mouse_x; - int32_t m_mouse_y; + bool m_take_ui; + int32_t m_current_pointer; + int32_t m_mouse_x; + int32_t m_mouse_y; bool m_mouse_button; bool m_prev_mouse_button; bool m_running; const char* font_name; float font_size; ImVec2 m_text_size; // size of character (assumes monospaced font is in use) - uint8_t m_key_char; + uint8_t m_key_char; bool m_hide; int m_win_count; // number of active windows, does not decrease, used to ID individual windows bool m_has_images; // true if current system has any image devices @@ -271,72 +275,18 @@ bool debug_imgui::get_view_source(void* data, int idx, const char** out_text) return true; } -void debug_imgui::handle_mouse() +void debug_imgui::handle_events() { - m_prev_mouse_button = m_mouse_button; - m_machine->ui_input().find_mouse(&m_mouse_x, &m_mouse_y, &m_mouse_button); ImGuiIO& io = ImGui::GetIO(); - io.MousePos = ImVec2(m_mouse_x,m_mouse_y); - io.MouseDown[0] = m_mouse_button; -} - -void debug_imgui::handle_mouse_views() -{ - rectangle rect; - bool clicked = false; - if(m_mouse_button == true && m_prev_mouse_button == false) - clicked = true; - - // check all views, and pass mouse clicks to them - if(!m_mouse_button) - return; - rect.min_x = view_main_disasm->ofs_x; - rect.min_y = view_main_disasm->ofs_y; - rect.max_x = view_main_disasm->ofs_x + view_main_disasm->view_width; - rect.max_y = view_main_disasm->ofs_y + view_main_disasm->view_height; - if(rect.contains(m_mouse_x,m_mouse_y) && clicked && view_main_disasm->has_focus) - { - debug_view_xy topleft = view_main_disasm->view->visible_position(); - debug_view_xy newpos; - newpos.x = topleft.x + (m_mouse_x-view_main_disasm->ofs_x) / m_text_size.x; - newpos.y = topleft.y + (m_mouse_y-view_main_disasm->ofs_y) / m_text_size.y; - view_main_disasm->view->set_cursor_position(newpos); - view_main_disasm->view->set_cursor_visible(true); - } - for(auto it = view_list.begin();it != view_list.end();++it) - { - rect.min_x = (*it)->ofs_x; - rect.min_y = (*it)->ofs_y; - rect.max_x = (*it)->ofs_x + (*it)->view_width; - rect.max_y = (*it)->ofs_y + (*it)->view_height; - if(rect.contains(m_mouse_x,m_mouse_y) && clicked && (*it)->has_focus) - { - if((*it)->view->cursor_supported()) - { - debug_view_xy topleft = (*it)->view->visible_position(); - debug_view_xy newpos; - newpos.x = topleft.x + (m_mouse_x-(*it)->ofs_x) / m_text_size.x; - newpos.y = topleft.y + (m_mouse_y-(*it)->ofs_y) / m_text_size.y; - (*it)->view->set_cursor_position(newpos); - (*it)->view->set_cursor_visible(true); - } - } - } -} - -void debug_imgui::handle_keys() -{ - ImGuiIO& io = ImGui::GetIO(); - ui_event event; - debug_area* focus_view = nullptr; // find view that has focus (should only be one at a time) - for(auto view_ptr = view_list.begin();view_ptr != view_list.end();++view_ptr) + debug_area* focus_view = nullptr; + for(auto view_ptr = view_list.begin();view_ptr != view_list.end(); ++view_ptr) if((*view_ptr)->has_focus) focus_view = *view_ptr; // check views in main views also (only the disassembler view accepts inputs) - if(view_main_disasm != nullptr) + if(view_main_disasm) if(view_main_disasm->has_focus) focus_view = view_main_disasm; @@ -355,21 +305,65 @@ void debug_imgui::handle_keys() for(input_item_id id = ITEM_ID_A; id <= ITEM_ID_CANCEL; ++id) { - if(m_machine->input().code_pressed(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) { - if (m_mapping.count(id)) io.AddKeyEvent(m_mapping[id], true); - } else { - if (m_mapping.count(id)) io.AddKeyEvent(m_mapping[id], false); + if(m_machine->input().code_pressed(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) + { + if(m_mapping.count(id)) + io.AddKeyEvent(m_mapping[id], true); + } + else + { + if(m_mapping.count(id)) + io.AddKeyEvent(m_mapping[id], false); } } + m_prev_mouse_button = m_mouse_button; m_key_char = 0; - while (m_machine->ui_input().pop_event(&event)) + ui_event event; + while(m_machine->ui_input().pop_event(&event)) { switch (event.event_type) { + case ui_event::type::POINTER_UPDATE: + if(&m_machine->render().ui_target() != event.target) + break; + if(event.pointer_id != m_current_pointer) + { + if((0 > m_current_pointer) || ((event.pointer_pressed & 1) && !m_mouse_button)) + m_current_pointer = event.pointer_id; + } + if(event.pointer_id == m_current_pointer) + { + bool changed = (m_mouse_x != event.pointer_x) || (m_mouse_y != event.pointer_y) || (m_mouse_button != bool(event.pointer_buttons & 1)); + m_mouse_x = event.pointer_x; + m_mouse_y = event.pointer_y; + m_mouse_button = bool(event.pointer_buttons & 1); + if(changed) + { + io.MousePos = ImVec2(m_mouse_x,m_mouse_y); + io.MouseDown[0] = m_mouse_button; + } + } + break; + case ui_event::type::POINTER_LEAVE: + case ui_event::type::POINTER_ABORT: + if((&m_machine->render().ui_target() == event.target) && (event.pointer_id == m_current_pointer)) + { + m_current_pointer = -1; + bool changed = (m_mouse_x != event.pointer_x) || (m_mouse_y != event.pointer_y) || m_mouse_button; + m_mouse_x = event.pointer_x; + m_mouse_y = event.pointer_y; + m_mouse_button = false; + if(changed) + { + io.MousePos = ImVec2(m_mouse_x,m_mouse_y); + io.MouseDown[0] = m_mouse_button; + } + } + break; case ui_event::type::IME_CHAR: - m_key_char = event.ch; - if(focus_view != nullptr) + m_key_char = event.ch; // FIXME: assigning 4-byte UCS4 character to 8-bit variable + if(focus_view) focus_view->view->process_char(m_key_char); return; default: @@ -431,6 +425,50 @@ void debug_imgui::handle_keys() } +void debug_imgui::handle_mouse_views() +{ + rectangle rect; + bool clicked = false; + if(m_mouse_button == true && m_prev_mouse_button == false) + clicked = true; + + // check all views, and pass mouse clicks to them + if(!m_mouse_button) + return; + rect.min_x = view_main_disasm->ofs_x; + rect.min_y = view_main_disasm->ofs_y; + rect.max_x = view_main_disasm->ofs_x + view_main_disasm->view_width; + rect.max_y = view_main_disasm->ofs_y + view_main_disasm->view_height; + if(rect.contains(m_mouse_x,m_mouse_y) && clicked && view_main_disasm->has_focus) + { + debug_view_xy topleft = view_main_disasm->view->visible_position(); + debug_view_xy newpos; + newpos.x = topleft.x + (m_mouse_x-view_main_disasm->ofs_x) / m_text_size.x; + newpos.y = topleft.y + (m_mouse_y-view_main_disasm->ofs_y) / m_text_size.y; + view_main_disasm->view->set_cursor_position(newpos); + view_main_disasm->view->set_cursor_visible(true); + } + for(auto it = view_list.begin();it != view_list.end();++it) + { + rect.min_x = (*it)->ofs_x; + rect.min_y = (*it)->ofs_y; + rect.max_x = (*it)->ofs_x + (*it)->view_width; + rect.max_y = (*it)->ofs_y + (*it)->view_height; + if(rect.contains(m_mouse_x,m_mouse_y) && clicked && (*it)->has_focus) + { + if((*it)->view->cursor_supported()) + { + debug_view_xy topleft = (*it)->view->visible_position(); + debug_view_xy newpos; + newpos.x = topleft.x + (m_mouse_x-(*it)->ofs_x) / m_text_size.x; + newpos.y = topleft.y + (m_mouse_y-(*it)->ofs_y) / m_text_size.y; + (*it)->view->set_cursor_position(newpos); + (*it)->view->set_cursor_visible(true); + } + } + } +} + void debug_imgui::handle_keys_views() { debug_area* focus_view = nullptr; @@ -1557,10 +1595,15 @@ void debug_imgui::wait_for_debugger(device_t &device, bool firststop) device.machine().ui_input().reset(); m_running = false; } + if(!m_take_ui) + { + m_take_ui = m_machine->ui().set_ui_event_handler([this] () { return m_take_ui; }); + if(m_take_ui) + m_machine->ui_input().reset(); + } m_hide = false; m_machine->osd().input_update(true); - handle_mouse(); - handle_keys(); + handle_events(); handle_console(m_machine); update_cpu_view(&device); imguiBeginFrame(m_mouse_x,m_mouse_y,m_mouse_button ? IMGUI_MBUT_LEFT : 0, 0, width, height,m_key_char); @@ -1576,19 +1619,31 @@ void debug_imgui::wait_for_debugger(device_t &device, bool firststop) void debug_imgui::debugger_update() { - if(view_main_disasm == nullptr || view_main_regs == nullptr || view_main_console == nullptr) + if(!view_main_disasm || !view_main_regs || !view_main_console || !m_machine || (m_machine->phase() != machine_phase::RUNNING)) return; - if (m_machine && (m_machine->phase() == machine_phase::RUNNING) && !m_machine->debugger().cpu().is_stopped() && !m_hide) + if(!m_machine->debugger().cpu().is_stopped()) { - uint32_t width = m_machine->render().ui_target().width(); - uint32_t height = m_machine->render().ui_target().height(); - m_machine->osd().input_update(true); - handle_mouse(); - handle_keys(); - imguiBeginFrame(m_mouse_x,m_mouse_y,m_mouse_button ? IMGUI_MBUT_LEFT : 0, 0, width, height, m_key_char); - update(); - imguiEndFrame(); + if(m_take_ui) + { + m_take_ui = false; + m_current_pointer = -1; + m_prev_mouse_button = m_mouse_button; + if(m_mouse_button) + { + m_mouse_button = false; + ImGuiIO& io = ImGui::GetIO(); + io.MouseDown[0] = false; + } + } + if(!m_hide) + { + uint32_t width = m_machine->render().ui_target().width(); + uint32_t height = m_machine->render().ui_target().height(); + imguiBeginFrame(m_mouse_x, m_mouse_y, 0, 0, width, height, m_key_char); + update(); + imguiEndFrame(); + } } } diff --git a/src/osd/modules/input/input_dinput.cpp b/src/osd/modules/input/input_dinput.cpp index 7732d610bbae6..6f539c2f7fcc0 100644 --- a/src/osd/modules/input/input_dinput.cpp +++ b/src/osd/modules/input/input_dinput.cpp @@ -232,7 +232,7 @@ class dinput_mouse_device : public dinput_device virtual void configure(input_device &device) override; private: - mouse_state m_mouse; + DIMOUSESTATE2 m_mouse; }; dinput_mouse_device::dinput_mouse_device( diff --git a/src/osd/modules/input/input_rawinput.cpp b/src/osd/modules/input/input_rawinput.cpp index d6b99649c4ae9..437abf598a485 100644 --- a/src/osd/modules/input/input_rawinput.cpp +++ b/src/osd/modules/input/input_rawinput.cpp @@ -433,7 +433,8 @@ class rawinput_mouse_device : public rawinput_device m_mouse({0}), m_x(0), m_y(0), - m_z(0) + m_v(0), + m_h(0) { } @@ -444,28 +445,44 @@ class rawinput_mouse_device : public rawinput_device { m_mouse.lX = std::exchange(m_x, 0); m_mouse.lY = std::exchange(m_y, 0); - m_mouse.lZ = std::exchange(m_z, 0); + m_mouse.lV = std::exchange(m_v, 0); + m_mouse.lH = std::exchange(m_h, 0); } } virtual void reset() override { memset(&m_mouse, 0, sizeof(m_mouse)); - m_x = m_y = m_z = 0; + m_x = m_y = m_v = m_h = 0; } virtual void configure(input_device &device) override { // populate the axes - for (int axisnum = 0; axisnum < 3; axisnum++) - { - device.add_item( - default_axis_name[axisnum], - std::string_view(), - input_item_id(ITEM_ID_XAXIS + axisnum), - generic_axis_get_state, - &m_mouse.lX + axisnum); - } + device.add_item( + "X", + std::string_view(), + ITEM_ID_XAXIS, + generic_axis_get_state, + &m_mouse.lX); + device.add_item( + "Y", + std::string_view(), + ITEM_ID_YAXIS, + generic_axis_get_state, + &m_mouse.lY); + device.add_item( + "Scroll V", + std::string_view(), + ITEM_ID_ZAXIS, + generic_axis_get_state, + &m_mouse.lV); + device.add_item( + "Scroll H", + std::string_view(), + ITEM_ID_RZAXIS, + generic_axis_get_state, + &m_mouse.lH); // populate the buttons for (int butnum = 0; butnum < 5; butnum++) @@ -489,9 +506,11 @@ class rawinput_mouse_device : public rawinput_device m_x += rawinput.data.mouse.lLastX * input_device::RELATIVE_PER_PIXEL; m_y += rawinput.data.mouse.lLastY * input_device::RELATIVE_PER_PIXEL; - // update Z axis (vertical scroll) + // update Z/Rz axes (vertical/horizontal scroll) if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL) - m_z += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; + m_v += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_HWHEEL) + m_h += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; // update the button states; always update the corresponding mouse buttons if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) m_mouse.rgbButtons[0] = 0x80; @@ -509,7 +528,7 @@ class rawinput_mouse_device : public rawinput_device private: mouse_state m_mouse; - LONG m_x, m_y, m_z; + LONG m_x, m_y, m_v, m_h; }; @@ -523,7 +542,8 @@ class rawinput_lightgun_device : public rawinput_device rawinput_lightgun_device(std::string &&name, std::string &&id, input_module &module, HANDLE handle) : rawinput_device(std::move(name), std::move(id), module, handle), m_lightgun({0}), - m_z(0) + m_v(0), + m_h(0) { } @@ -531,13 +551,17 @@ class rawinput_lightgun_device : public rawinput_device { rawinput_device::poll(relative_reset); if (relative_reset) - m_lightgun.lZ = std::exchange(m_z, 0); + { + m_lightgun.lV = std::exchange(m_v, 0); + m_lightgun.lH = std::exchange(m_h, 0); + } } virtual void reset() override { memset(&m_lightgun, 0, sizeof(m_lightgun)); - m_z = 0; + m_v = 0; + m_h = 0; } virtual void configure(input_device &device) override @@ -553,13 +577,19 @@ class rawinput_lightgun_device : public rawinput_device &m_lightgun.lX + axisnum); } - // scroll wheel is always relative if present + // scroll wheels are always relative if present device.add_item( - default_axis_name[2], + "Scroll V", std::string_view(), ITEM_ID_ADD_RELATIVE1, generic_axis_get_state, - &m_lightgun.lZ); + &m_lightgun.lV); + device.add_item( + "Scroll H", + std::string_view(), + ITEM_ID_ADD_RELATIVE2, + generic_axis_get_state, + &m_lightgun.lH); // populate the buttons for (int butnum = 0; butnum < 5; butnum++) @@ -583,9 +613,11 @@ class rawinput_lightgun_device : public rawinput_device m_lightgun.lX = normalize_absolute_axis(rawinput.data.mouse.lLastX, 0, input_device::ABSOLUTE_MAX); m_lightgun.lY = normalize_absolute_axis(rawinput.data.mouse.lLastY, 0, input_device::ABSOLUTE_MAX); - // update zaxis + // update Z/Rz axes if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL) - m_z += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; + m_v += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; + if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_HWHEEL) + m_h += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL; // update the button states; always update the corresponding mouse buttons if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) m_lightgun.rgbButtons[0] = 0x80; @@ -603,7 +635,7 @@ class rawinput_lightgun_device : public rawinput_device private: mouse_state m_lightgun; - LONG m_z; + LONG m_v, m_h; }; diff --git a/src/osd/modules/input/input_sdl.cpp b/src/osd/modules/input/input_sdl.cpp index cc7cb2f145160..62e13cbf9603d 100644 --- a/src/osd/modules/input/input_sdl.cpp +++ b/src/osd/modules/input/input_sdl.cpp @@ -736,12 +736,13 @@ class sdl_mouse_device : public sdl_device break; case SDL_MOUSEWHEEL: + // adjust SDL 1-per-click to match Win32 120-per-click #if SDL_VERSION_ATLEAST(2, 0, 18) - m_v += event.wheel.preciseY * input_device::RELATIVE_PER_PIXEL; - m_h += event.wheel.preciseX * input_device::RELATIVE_PER_PIXEL; + m_v += std::lround(event.wheel.preciseY * 120 * input_device::RELATIVE_PER_PIXEL); + m_h += std::lround(event.wheel.preciseX * 120 * input_device::RELATIVE_PER_PIXEL); #else - m_v += event.wheel.y * input_device::RELATIVE_PER_PIXEL; - m_h += event.wheel.x * input_device::RELATIVE_PER_PIXEL; + m_v += event.wheel.y * 120 * input_device::RELATIVE_PER_PIXEL; + m_h += event.wheel.x * 120 * input_device::RELATIVE_PER_PIXEL; #endif break; } diff --git a/src/osd/modules/input/input_win32.cpp b/src/osd/modules/input/input_win32.cpp index 3803bc2a180dd..49c211740c0da 100644 --- a/src/osd/modules/input/input_win32.cpp +++ b/src/osd/modules/input/input_win32.cpp @@ -129,13 +129,15 @@ class keyboard_input_win32 : public wininput_module // win32_mouse_device //============================================================ -class win32_mouse_device : public event_based_device +class win32_mouse_device : public event_based_device { public: win32_mouse_device(std::string &&name, std::string &&id, input_module &module) : event_based_device(std::move(name), std::move(id), module), m_mouse({0}), - m_win32_mouse({{0}}) + m_win32_mouse({{0}}), + m_vscroll(0), + m_hscroll(0) { } @@ -146,7 +148,7 @@ class win32_mouse_device : public event_based_device if (!relative_reset) return; - CURSORINFO cursor_info = {0}; + CURSORINFO cursor_info = { 0 }; cursor_info.cbSize = sizeof(CURSORINFO); GetCursorInfo(&cursor_info); @@ -169,23 +171,42 @@ class win32_mouse_device : public event_based_device SetCursorPos(m_win32_mouse.last_point.x, m_win32_mouse.last_point.y); } + + // update scroll axes + m_mouse.lV = std::exchange(m_vscroll, 0) * input_device::RELATIVE_PER_PIXEL; + m_mouse.lH = std::exchange(m_hscroll, 0) * input_device::RELATIVE_PER_PIXEL; } virtual void configure(input_device &device) override { // populate the axes - for (int axisnum = 0; axisnum < 2; axisnum++) - { - device.add_item( - default_axis_name[axisnum], - std::string_view(), - input_item_id(ITEM_ID_XAXIS + axisnum), - generic_axis_get_state, - &m_mouse.lX + axisnum); - } + device.add_item( + "X", + std::string_view(), + ITEM_ID_XAXIS, + generic_axis_get_state, + &m_mouse.lX); + device.add_item( + "Y", + std::string_view(), + ITEM_ID_YAXIS, + generic_axis_get_state, + &m_mouse.lY); + device.add_item( + "Scroll V", + std::string_view(), + ITEM_ID_ZAXIS, + generic_axis_get_state, + &m_mouse.lV); + device.add_item( + "Scroll H", + std::string_view(), + ITEM_ID_RZAXIS, + generic_axis_get_state, + &m_mouse.lH); // populate the buttons - for (int butnum = 0; butnum < 2; butnum++) + for (int butnum = 0; butnum < 5; butnum++) { device.add_item( default_button_name(butnum), @@ -200,13 +221,25 @@ class win32_mouse_device : public event_based_device { memset(&m_mouse, 0, sizeof(m_mouse)); memset(&m_win32_mouse, 0, sizeof(m_win32_mouse)); + m_vscroll = m_hscroll = 0; } protected: - virtual void process_event(MouseButtonEventArgs const &args) override + virtual void process_event(MouseUpdateEventArgs const &args) override { // set the button state - m_mouse.rgbButtons[args.button] = args.keydown ? 0x80 : 0x00; + assert(!(args.pressed & args.released)); + for (unsigned i = 0; 5 > i; ++i) + { + if (BIT(args.pressed, i)) + m_mouse.rgbButtons[i] = 0x80; + else if (BIT(args.released, i)) + m_mouse.rgbButtons[i] = 0x00; + } + + // accumulate scroll delta + m_vscroll += args.vdelta; + m_hscroll += args.hdelta; } private: @@ -217,6 +250,7 @@ class win32_mouse_device : public event_based_device mouse_state m_mouse; win32_mouse_state m_win32_mouse; + long m_vscroll, m_hscroll; }; @@ -244,14 +278,18 @@ class mouse_input_win32 : public wininput_module virtual bool handle_input_event(input_event eventid, void *eventdata) override { - if (!manager().class_enabled(DEVICE_CLASS_MOUSE) || eventid != INPUT_EVENT_MOUSE_BUTTON) - return false; - - auto const *const args = static_cast(eventdata); - devicelist().for_each_device( - [args] (auto &device) { device.queue_events(args, 1); }); + if (manager().class_enabled(DEVICE_CLASS_MOUSE)) + { + if ((eventid == INPUT_EVENT_MOUSE_BUTTON) || (eventid == INPUT_EVENT_MOUSE_WHEEL)) + { + auto const *const args = reinterpret_cast(eventdata); + devicelist().for_each_device( + [args] (auto &device) { device.queue_events(args, 1); }); + return true; + } + } - return true; + return false; } }; @@ -260,7 +298,7 @@ class mouse_input_win32 : public wininput_module // win32_lightgun_device_base //============================================================ -class win32_lightgun_device_base : public event_based_device +class win32_lightgun_device_base : public event_based_device { public: virtual void reset() override @@ -268,7 +306,17 @@ class win32_lightgun_device_base : public event_based_device, + &m_mouse.lV); + device.add_item( + "Scroll H", + std::string_view(), + ITEM_ID_ADD_RELATIVE2, + generic_axis_get_state, + &m_mouse.lH); + } + + virtual void reset() override + { + win32_lightgun_device_base::reset(); + m_vscroll = m_hscroll = 0; } protected: - virtual void process_event(MouseButtonEventArgs const &args) override + virtual void process_event(MouseUpdateEventArgs const &args) override { // In non-shared axis mode, just update the button state - m_mouse.rgbButtons[args.button] = args.keydown ? 0x80 : 0x00; + assert(!(args.pressed & args.released)); + for (unsigned i = 0; 5 > i; ++i) + { + if (BIT(args.pressed, i)) + m_mouse.rgbButtons[i] = 0x80; + else if (BIT(args.released, i)) + m_mouse.rgbButtons[i] = 0x00; + } + + // accumulate scroll delta + m_vscroll += args.vdelta; + m_hscroll += args.hdelta; } + +private: + long m_vscroll, m_hscroll; }; @@ -376,38 +462,42 @@ class win32_dual_lightgun_device : public win32_lightgun_device_base { } -protected: - virtual void process_event(MouseButtonEventArgs const &args) override + virtual void configure(input_device &device) override { - int const button = args.button; - - if (button > 3) - return; // We only handle the first four buttons in shared axis mode - else if (button >= 2 && m_gun_index == 0) - return; // First gun doesn't handle buttons 2 and 3 - else if (button < 2 && m_gun_index == 1) - return; // Second gun doesn't handle buttons 0 and 1 - - // Adjust the button if we're the second lightgun - int const logical_button = (m_gun_index == 1) ? (button - 2) : button; + do_configure(device, 2); + } - // set the button state - m_mouse.rgbButtons[logical_button] = args.keydown ? 0x80 : 0x00; - if (args.keydown) +protected: + virtual void process_event(MouseUpdateEventArgs const &args) override + { + // We only handle the first four buttons in shared axis mode + assert(!(args.pressed & args.released)); + for (unsigned i = 0; 2 > i; ++i) { - // get the position relative to the window - HWND const hwnd = dynamic_cast(*osd_common_t::window_list().front()).platform_window(); - RECT client_rect; - GetClientRect(hwnd, &client_rect); - - POINT mousepos; - mousepos.x = args.xpos; - mousepos.y = args.ypos; - ScreenToClient(hwnd, &mousepos); - - // convert to absolute coordinates - m_mouse.lX = normalize_absolute_axis(mousepos.x, client_rect.left, client_rect.right); - m_mouse.lY = normalize_absolute_axis(mousepos.y, client_rect.top, client_rect.bottom); + // Adjust the button if we're the second lightgun + unsigned const bit = i + ((1 == m_gun_index) ? 2 : 0); + if (BIT(args.pressed, bit)) + { + m_mouse.rgbButtons[i] = 0x80; + + // get the position relative to the window + HWND const hwnd = dynamic_cast(*osd_common_t::window_list().front()).platform_window(); + RECT client_rect; + GetClientRect(hwnd, &client_rect); + + POINT mousepos; + mousepos.x = args.xpos; + mousepos.y = args.ypos; + ScreenToClient(hwnd, &mousepos); + + // convert to absolute coordinates + m_mouse.lX = normalize_absolute_axis(mousepos.x, client_rect.left, client_rect.right); + m_mouse.lY = normalize_absolute_axis(mousepos.y, client_rect.top, client_rect.bottom); + } + else if (BIT(args.released, bit)) + { + m_mouse.rgbButtons[i] = 0x00; + } } } @@ -449,14 +539,18 @@ class lightgun_input_win32 : public wininput_module virtual bool handle_input_event(input_event eventid, void *eventdata) override { - if (!manager().class_enabled(DEVICE_CLASS_LIGHTGUN) || eventid != INPUT_EVENT_MOUSE_BUTTON) - return false; - - auto const *const args = static_cast(eventdata); - devicelist().for_each_device( - [args] (auto &device) { device.queue_events(args, 1); }); + if (manager().class_enabled(DEVICE_CLASS_LIGHTGUN)) + { + if ((eventid == INPUT_EVENT_MOUSE_BUTTON) || (eventid == INPUT_EVENT_MOUSE_WHEEL)) + { + auto const *const args = reinterpret_cast(eventdata); + devicelist().for_each_device( + [args] (auto &device) { device.queue_events(args, 1); }); + return true; + } + } - return true; + return false; } }; diff --git a/src/osd/modules/input/input_wincommon.h b/src/osd/modules/input/input_wincommon.h index d77ab8dce9a67..6b34d60abca9d 100644 --- a/src/osd/modules/input/input_wincommon.h +++ b/src/osd/modules/input/input_wincommon.h @@ -25,12 +25,13 @@ struct keyboard_state int8_t currkey[MAX_KEYS]; }; -// state information for a mouse (matches DIMOUSESTATE exactly) +// state information for a mouse struct mouse_state { LONG lX; LONG lY; - LONG lZ; + LONG lV; + LONG lH; BYTE rgbButtons[8]; }; diff --git a/src/osd/modules/osdwindow.h b/src/osd/modules/osdwindow.h index f3d39878b5ecb..9167a77568244 100644 --- a/src/osd/modules/osdwindow.h +++ b/src/osd/modules/osdwindow.h @@ -15,6 +15,8 @@ #include "osdhelper.h" #include "../frontend/mame/ui/menuitem.h" +#include +#include #include #include #include @@ -94,6 +96,65 @@ class osd_window virtual void complete_destroy() = 0; protected: + static inline constexpr int CLICK_DISTANCE = 16; // in pointer units squared + static inline constexpr int TAP_DISTANCE = 49; // taps are less repeatable than clicks + + struct prev_touch + { + prev_touch() = default; + prev_touch(prev_touch const &) = default; + prev_touch(prev_touch &&) = default; + prev_touch &operator=(prev_touch const &) = default; + prev_touch &operator=(prev_touch &&) = default; + + std::chrono::steady_clock::time_point when = std::chrono::steady_clock::time_point::min(); + int x = 0, y = 0, cnt = 0; + }; + + struct pointer_dev_info + { + pointer_dev_info() = default; + pointer_dev_info(pointer_dev_info const &) = default; + pointer_dev_info(pointer_dev_info &&) = default; + pointer_dev_info &operator=(pointer_dev_info const &) = default; + pointer_dev_info &operator=(pointer_dev_info &&) = default; + + unsigned clear_expired_touches(std::chrono::steady_clock::time_point const &now, std::chrono::steady_clock::duration const &time); + unsigned consume_touch(unsigned i); + + prev_touch touches[8]; + }; + + struct pointer_info + { + pointer_info(pointer_info const &) = default; + pointer_info(pointer_info &&) = default; + pointer_info &operator=(pointer_info const &) = default; + pointer_info &operator=(pointer_info &&) = default; + + pointer_info(unsigned i, unsigned d); + + void primary_down( + int cx, + int cy, + std::chrono::steady_clock::duration const &time, + int tolerance, + bool checkprev, + std::vector &devices); + void check_primary_hold_drag( + int cx, + int cy, + std::chrono::steady_clock::duration const &time, + int tolerance); + + std::chrono::steady_clock::time_point pressed; + unsigned index, device; + int x, y; + unsigned buttons; + int pressedx, pressedy; + int clickcnt; + }; + osd_window( running_machine &machine, render_module &renderprovider, @@ -127,6 +188,140 @@ class osd_window const std::string m_title; }; + +inline unsigned osd_window::pointer_dev_info::clear_expired_touches( + std::chrono::steady_clock::time_point const &now, + std::chrono::steady_clock::duration const &time) +{ + // find first non-expired touch (if any) + unsigned end(0); + while ((std::size(touches) > end) && touches[end].cnt && ((touches[end].when + time) < now)) + touches[end++].cnt = 0; + + // shift non-expired touches back if necessary + if (end) + { + unsigned pos(0); + while ((std::size(touches) > end) && touches[end].cnt) + { + touches[pos++] = std::move(touches[end]); + touches[end++].cnt = 0; + } + return pos; + } + else + { + while ((std::size(touches) > end) && touches[end].cnt) + ++end; + return end; + } +} + +inline unsigned osd_window::pointer_dev_info::consume_touch(unsigned i) +{ + assert(std::size(touches) > i); + touches[i].cnt = 0; + unsigned pos(i + 1); + while ((std::size(touches) > pos) && touches[pos].cnt) + { + touches[i++] = std::move(touches[pos]); + touches[pos++].cnt = 0; + } + return i; +} + +inline osd_window::pointer_info::pointer_info(unsigned i, unsigned d) : + pressed(std::chrono::steady_clock::time_point::min()), + index(i), + device(d), + x(-1), + y(-1), + buttons(0), + pressedx(0), + pressedy(0), + clickcnt(0) +{ +} + +inline void osd_window::pointer_info::primary_down( + int cx, + int cy, + std::chrono::steady_clock::duration const &time, + int tolerance, + bool checkprev, + std::vector &devices) +{ + auto const now(std::chrono::steady_clock::now()); + auto const exp(time + pressed); + if (0 > clickcnt) + { + // previous click turned into a hold/drag + clickcnt = 1; + } + else if (clickcnt) + { + // potential multi-click action + int const dx(cx - pressedx); + int const dy(cy - pressedy); + int const distance((dx * dx) + (dy * dy)); + if ((exp < now) || (tolerance < distance)) + clickcnt = 1; + else + ++clickcnt; + } + else + { + // first click for this pointer, but may need to check previous touches + clickcnt = 1; + if (checkprev) + { + if (devices.size() > device) + { + auto &devinfo(devices[device]); + unsigned const end(devinfo.clear_expired_touches(now, time)); + for (int i = 0; end > i; ++i) + { + int const dx(cx - devinfo.touches[i].x); + int const dy(cy - devinfo.touches[i].y); + int const distance((dx * dx) + (dy * dy)); + if (tolerance >= distance) + { + // close match - consume it + clickcnt = devinfo.touches[i].cnt + 1; + devinfo.consume_touch(i); + break; + } + } + } + } + } + + // record the time/location where the pointer was pressed + pressed = now; + pressedx = cx; + pressedy = cy; +} + +inline void osd_window::pointer_info::check_primary_hold_drag( + int cx, + int cy, + std::chrono::steady_clock::duration const &time, + int tolerance) +{ + // check for conversion to a (multi-)click-and-hold/drag + if (0 < clickcnt) + { + auto const now(std::chrono::steady_clock::now()); + auto const exp(time + pressed); + int const dx(cx - pressedx); + int const dy(cy - pressedy); + int const distance((dx * dx) + (dy * dy)); + if ((exp < now) || (tolerance < distance)) + clickcnt = -clickcnt; + } +} + + template class osd_window_t : public osd_window { diff --git a/src/osd/sdl/osdsdl.cpp b/src/osd/sdl/osdsdl.cpp index 2d3e5e4f02c40..87af652733e42 100644 --- a/src/osd/sdl/osdsdl.cpp +++ b/src/osd/sdl/osdsdl.cpp @@ -17,8 +17,8 @@ #include "ui/uimain.h" -#include - +#include +#include #include #include @@ -168,7 +168,9 @@ sdl_osd_interface::sdl_osd_interface(sdl_options &options) : m_modifier_keys(0), m_last_click_time(std::chrono::steady_clock::time_point::min()), m_last_click_x(0), - m_last_click_y(0) + m_last_click_y(0), + m_enable_touch(false), + m_next_ptrdev(0) { } @@ -260,6 +262,34 @@ void sdl_osd_interface::init(running_machine &machine) } } + /* do we want touch support or will we use mouse emulation? */ + m_enable_touch = options().enable_touch(); + try + { + if (m_enable_touch) + { + int const count(SDL_GetNumTouchDevices()); + m_ptrdev_map.reserve(std::max(count + 1, 8)); + map_pointer_device(SDL_MOUSE_TOUCHID); + for (int i = 0; count > i; ++i) + { + SDL_TouchID const device(SDL_GetTouchDevice(i)); + if (device) + map_pointer_device(device); + } + } + else + { + m_ptrdev_map.reserve(1); + map_pointer_device(SDL_MOUSE_TOUCHID); + } + } + catch (std::bad_alloc const &) + { + osd_printf_error("sdl_osd_interface: error allocating pointer data\n"); + // survivable - it will still attempt to allocate mappings when it first sees devices + } + #if defined(SDLMAME_ANDROID) SDL_SetHint(SDL_HINT_VIDEO_EXTERNAL_CONTEXT, "1"); #endif @@ -502,74 +532,126 @@ void sdl_osd_interface::process_events() break; case SDL_MOUSEMOTION: + if (!m_enable_touch || (SDL_TOUCH_MOUSEID != event.motion.which)) { - int cx, cy; - auto const window = focus_window(event.motion); - if (window && window->xy_to_render_target(event.motion.x, event.motion.y, &cx, &cy)) - machine().ui_input().push_mouse_move_event(window->target(), cx, cy); + auto const window = window_from_id(event.motion.windowID); + if (!window) + break; + + unsigned device; + try + { + device = map_pointer_device(SDL_MOUSE_TOUCHID); + } + catch (std::bad_alloc const &) + { + osd_printf_error("sdl_osd_interface: error allocating pointer data\n"); + break; + } + + int x, y; + window->xy_to_render_target(event.motion.x, event.motion.y, &x, &y); + window->mouse_moved(device, x, y); } break; case SDL_MOUSEBUTTONDOWN: - //printf("But down %d %d %d %d %s\n", event.button.which, event.button.button, event.button.x, event.button.y, devinfo->name.c_str()); - if (event.button.button == 1) + case SDL_MOUSEBUTTONUP: + if (!m_enable_touch || (SDL_TOUCH_MOUSEID != event.button.which)) + { + auto const window = window_from_id(event.button.windowID); + if (!window) + break; + + unsigned device; + try + { + device = map_pointer_device(SDL_MOUSE_TOUCHID); + } + catch (std::bad_alloc const &) + { + osd_printf_error("sdl_osd_interface: error allocating pointer data\n"); + break; + } + + int x, y; + window->xy_to_render_target(event.button.x, event.button.y, &x, &y); + unsigned button(event.button.button - 1); + if ((1 == button) || (2 == button)) + button ^= 3; + if (SDL_PRESSED == event.button.state) + window->mouse_down(device, x, y, button); + else + window->mouse_up(device, x, y, button); + } + break; + + case SDL_MOUSEWHEEL: { - int cx, cy; - auto const window = focus_window(event.button); - if (window && window->xy_to_render_target(event.button.x, event.button.y, &cx, &cy)) + auto const window = window_from_id(event.wheel.windowID); + if (window) { - auto const double_click_speed = std::chrono::milliseconds(250); - auto const click = std::chrono::steady_clock::now(); - machine().ui_input().push_mouse_down_event(window->target(), cx, cy); - - // avoid overflow with std::chrono::time_point::min() by adding rather than subtracting - if (click < (m_last_click_time + double_click_speed) - && (cx >= (m_last_click_x - 4) && cx <= (m_last_click_x + 4)) - && (cy >= (m_last_click_y - 4) && cy <= (m_last_click_y + 4))) + unsigned device; + try { - m_last_click_time = std::chrono::time_point::min(); - machine().ui_input().push_mouse_double_click_event(window->target(), cx, cy); + device = map_pointer_device(SDL_MOUSE_TOUCHID); } - else + catch (std::bad_alloc const &) { - m_last_click_time = click; - m_last_click_x = cx; - m_last_click_y = cy; + osd_printf_error("sdl_osd_interface: error allocating pointer data\n"); + break; } +#if SDL_VERSION_ATLEAST(2, 0, 18) + window->mouse_wheel(device, std::lround(event.wheel.preciseY * 120)); +#else + window->mouse_wheel(device, event.wheel.y); +#endif } } - else if (event.button.button == 3) - { - int cx, cy; - auto const window = focus_window(event.button); - if (window != nullptr && window->xy_to_render_target(event.button.x, event.button.y, &cx, &cy)) - machine().ui_input().push_mouse_rdown_event(window->target(), cx, cy); - } break; - case SDL_MOUSEBUTTONUP: - //printf("But up %d %d %d %d\n", event.button.which, event.button.button, event.button.x, event.button.y); - if (event.button.button == 1) + case SDL_FINGERMOTION: + case SDL_FINGERDOWN: + case SDL_FINGERUP: + if (m_enable_touch && (SDL_MOUSE_TOUCHID != event.tfinger.touchId)) { - int cx, cy; - auto const window = focus_window(event.button); - if (window && window->xy_to_render_target(event.button.x, event.button.y, &cx, &cy)) - machine().ui_input().push_mouse_up_event(window->target(), cx, cy); - } - else if (event.button.button == 3) - { - int cx, cy; - auto window = focus_window(event.button); - if (window && window->xy_to_render_target(event.button.x, event.button.y, &cx, &cy)) - machine().ui_input().push_mouse_rup_event(window->target(), cx, cy); - } - break; + // ignore if it doesn't map to a window we own + auto const window = window_from_id(event.tfinger.windowID); + if (!window) + break; + + // map SDL touch device ID to a zero-based device number + unsigned device; + try + { + device = map_pointer_device(event.tfinger.touchId); + } + catch (std::bad_alloc const &) + { + osd_printf_error("sdl_osd_interface: error allocating pointer data\n"); + break; + } - case SDL_MOUSEWHEEL: - { - auto const window = focus_window(event.wheel); - if (window) - machine().ui_input().push_mouse_wheel_event(window->target(), 0, 0, event.wheel.y, 3); + // convert normalised coordinates to what MAME wants + auto const size = window->get_size(); + int const winx = std::lround(event.tfinger.x * size.width()); + int const winy = std::lround(event.tfinger.y * size.height()); + int x, y; + window->xy_to_render_target(winx, winy, &x, &y); + + // call appropriate window method + switch (event.type) + { + case SDL_FINGERMOTION: + window->finger_moved(event.tfinger.fingerId, device, x, y); + break; + case SDL_FINGERDOWN: + window->finger_down(event.tfinger.fingerId, device, x, y); + break; + case SDL_FINGERUP: + window->finger_up(event.tfinger.fingerId, device, x, y); + break; + } } break; } @@ -626,12 +708,37 @@ void sdl_osd_interface::process_window_event(SDL_Event const &event) break; case SDL_WINDOWEVENT_ENTER: - m_mouse_over_window = 1; + { + m_mouse_over_window = 1; + unsigned device; + try + { + device = map_pointer_device(SDL_MOUSE_TOUCHID); + } + catch (std::bad_alloc const &) + { + osd_printf_error("sdl_osd_interface: error allocating pointer data\n"); + break; + } + window->mouse_entered(device); + } break; case SDL_WINDOWEVENT_LEAVE: - machine().ui_input().push_mouse_leave_event(window->target()); - m_mouse_over_window = 0; + { + m_mouse_over_window = 0; + unsigned device; + try + { + device = map_pointer_device(SDL_MOUSE_TOUCHID); + } + catch (std::bad_alloc const &) + { + osd_printf_error("sdl_osd_interface: error allocating pointer data\n"); + break; + } + window->mouse_left(device); + } break; case SDL_WINDOWEVENT_FOCUS_GAINED: @@ -717,9 +824,28 @@ void sdl_osd_interface::check_osd_inputs() template sdl_window_info *sdl_osd_interface::focus_window(T const &event) const { - // FIXME: SDL does not properly report the window for certain OS. - if (false) + // FIXME: SDL does not properly report the window for certain versions of Ubuntu - is this still relevant? + if (m_enable_touch) return window_from_id(event.windowID); else return m_focus_window; } + + +unsigned sdl_osd_interface::map_pointer_device(SDL_TouchID device) +{ + auto devpos(std::lower_bound( + m_ptrdev_map.begin(), + m_ptrdev_map.end(), + device, + [] (std::pair const &mapping, SDL_TouchID id) + { + return mapping.first < id; + })); + if ((m_ptrdev_map.end() == devpos) || (device != devpos->first)) + { + devpos = m_ptrdev_map.emplace(devpos, device, m_next_ptrdev); + ++m_next_ptrdev; + } + return devpos->second; +} diff --git a/src/osd/sdl/osdsdl.h b/src/osd/sdl/osdsdl.h index c8ce167d69975..e1d472d9e4582 100644 --- a/src/osd/sdl/osdsdl.h +++ b/src/osd/sdl/osdsdl.h @@ -10,11 +10,14 @@ #include "modules/lib/osdobj_common.h" #include "modules/osdmodule.h" +#include + #include #include #include #include #include +#include #include #include @@ -128,8 +131,6 @@ class event_subscription_manager }; -union SDL_Event; - using sdl_event_manager = event_subscription_manager; @@ -194,6 +195,8 @@ class sdl_osd_interface : public osd_common_t, public sdl_event_manager bool mouse_over_window() const { return m_mouse_over_window > 0; } template sdl_window_info *focus_window(T const &event) const; + unsigned map_pointer_device(SDL_TouchID device); + sdl_options &m_options; sdl_window_info *m_focus_window; int m_mouse_over_window; @@ -202,6 +205,10 @@ class sdl_osd_interface : public osd_common_t, public sdl_event_manager std::chrono::steady_clock::time_point m_last_click_time; int m_last_click_x; int m_last_click_y; + + bool m_enable_touch; + unsigned m_next_ptrdev; + std::vector > m_ptrdev_map; }; //============================================================ diff --git a/src/osd/sdl/sdlopts.cpp b/src/osd/sdl/sdlopts.cpp index 8e922cb7a4e8b..f08dc41f963bb 100644 --- a/src/osd/sdl/sdlopts.cpp +++ b/src/osd/sdl/sdlopts.cpp @@ -66,7 +66,8 @@ const options_entry f_sdl_option_entries[] = { SDLOPTION_KEYMAP_FILE, "keymap.dat", core_options::option_type::PATH, "keymap filename" }, // joystick mapping - { nullptr, nullptr, core_options::option_type::HEADER, "SDL JOYSTICK MAPPING" }, + { nullptr, nullptr, core_options::option_type::HEADER, "SDL INPUT OPTIONS" }, + { SDLOPTION_ENABLE_TOUCH, "0", core_options::option_type::BOOLEAN, "enable touch input support" }, { SDLOPTION_SIXAXIS, "0", core_options::option_type::BOOLEAN, "use special handling for PS3 Sixaxis controllers" }, #if (USE_XINPUT) diff --git a/src/osd/sdl/sdlopts.h b/src/osd/sdl/sdlopts.h index d754a0e8619b4..fe75e0974075d 100644 --- a/src/osd/sdl/sdlopts.h +++ b/src/osd/sdl/sdlopts.h @@ -26,6 +26,7 @@ #define SDLOPTION_KEYMAP "keymap" #define SDLOPTION_KEYMAP_FILE "keymap_file" +#define SDLOPTION_ENABLE_TOUCH "enable_touch" #define SDLOPTION_SIXAXIS "sixaxis" #if defined(USE_XINPUT) && USE_XINPUT #define SDLOPTION_LIGHTGUNINDEX "lightgun_index" @@ -82,7 +83,8 @@ class sdl_options : public osd_options bool keymap() const { return bool_value(SDLOPTION_KEYMAP); } const char *keymap_file() const { return value(SDLOPTION_KEYMAP_FILE); } - // joystick mapping + // input options + bool enable_touch() const { return bool_value(SDLOPTION_ENABLE_TOUCH); } bool sixaxis() const { return bool_value(SDLOPTION_SIXAXIS); } const char *video_driver() const { return value(SDLOPTION_VIDEODRIVER); } diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp index 4bb8531df2aa0..1e6318f57a969 100644 --- a/src/osd/sdl/window.cpp +++ b/src/osd/sdl/window.cpp @@ -13,24 +13,27 @@ #include "emuopts.h" #include "render.h" #include "screen.h" +#include "uiinput.h" #include "ui/uimain.h" // OSD headers -#include "window.h" -#include "osdsdl.h" #include "modules/monitor/monitor_common.h" +#include "osdsdl.h" +#include "window.h" // standard SDL headers -#include #include // standard C headers +#include +#include #include +#include +#include + #ifndef _MSC_VER #include #endif -#include -#include #ifdef SDLMAME_WIN32 #include @@ -61,11 +64,6 @@ #define SDL_VERSION_EQUALS(v1, vnum2) (SDL_VERSIONNUM(v1.major, v1.minor, v1.patch) == vnum2) -class SDL_DM_Wrapper -{ -public: - SDL_DisplayMode mode; -}; //============================================================ @@ -248,9 +246,9 @@ void sdl_window_info::toggle_full_screen() #endif if (fullscreen() && (video_config.switchres || is_osx)) { - SDL_SetWindowFullscreen(platform_window(), 0); // Try to set mode - SDL_SetWindowDisplayMode(platform_window(), &m_original_mode->mode); // Try to set mode - SDL_SetWindowFullscreen(platform_window(), SDL_WINDOW_FULLSCREEN); // Try to set mode + SDL_SetWindowFullscreen(platform_window(), 0); + SDL_SetWindowDisplayMode(platform_window(), &m_original_mode); + SDL_SetWindowFullscreen(platform_window(), SDL_WINDOW_FULLSCREEN); } SDL_DestroyWindow(platform_window()); set_platform_window(nullptr); @@ -334,6 +332,293 @@ int sdl_window_info::xy_to_render_target(int x, int y, int *xt, int *yt) return renderer().xy_to_render_target(x, y, xt, yt); } +void sdl_window_info::mouse_entered(unsigned device) +{ + m_mouse_inside = true; +} + +void sdl_window_info::mouse_left(unsigned device) +{ + m_mouse_inside = false; + + auto info(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), SDL_FingerID(-1), &sdl_pointer_info::compare)); + if ((m_active_pointers.end() == info) || (info->finger != SDL_FingerID(-1))) + return; + + // leaving implicitly releases buttons, so check hold/drag if necessary + if (BIT(info->buttons, 0)) + { + assert(0 <= info->clickcnt); + + auto const now(std::chrono::steady_clock::now()); + auto const exp(std::chrono::milliseconds(250) + info->pressed); + int const dx(info->x - info->pressedx); + int const dy(info->y - info->pressedy); + int const distance((dx * dx) + (dy * dy)); + if ((exp < now) || (CLICK_DISTANCE < distance)) + info->clickcnt = -info->clickcnt; + } + + // push to UI manager + machine().ui_input().push_pointer_leave( + target(), + osd::ui_event_handler::pointer::MOUSE, + info->index, + device, + info->x, info->y, + info->buttons, info->clickcnt); + + // dump pointer data + m_pointer_mask &= ~(decltype(m_pointer_mask)(1) << info->index); + if (info->index < m_next_pointer) + m_next_pointer = info->index; + m_active_pointers.erase(info); +} + +void sdl_window_info::mouse_down(unsigned device, int x, int y, unsigned button) +{ + if (!m_mouse_inside) + return; + + auto const info(map_pointer(SDL_FingerID(-1), device)); + if (m_active_pointers.end() == info) + return; + + if ((x == info->x) && (y == info->y) && BIT(info->buttons, button)) + return; + + // detect multi-click actions + if (0 == button) + { + info->primary_down( + x, + y, + std::chrono::milliseconds(250), + CLICK_DISTANCE, + false, + m_ptrdev_info); + } + + // update info and push to UI manager + auto const pressed(decltype(info->buttons)(1) << button); + info->x = x; + info->y = y; + info->buttons |= pressed; + machine().ui_input().push_pointer_update( + target(), + osd::ui_event_handler::pointer::MOUSE, + info->index, + device, + x, y, + info->buttons, pressed, 0, info->clickcnt); +} + +void sdl_window_info::mouse_up(unsigned device, int x, int y, unsigned button) +{ + if (!m_mouse_inside) + return; + + auto const info(map_pointer(SDL_FingerID(-1), device)); + if (m_active_pointers.end() == info) + return; + + if ((x == info->x) && (y == info->y) && !BIT(info->buttons, button)) + return; + + // detect multi-click actions + if (0 == button) + { + info->check_primary_hold_drag( + x, + y, + std::chrono::milliseconds(250), + CLICK_DISTANCE); + } + + // update info and push to UI manager + auto const released(decltype(info->buttons)(1) << button); + info->x = x; + info->y = y; + info->buttons &= ~released; + machine().ui_input().push_pointer_update( + target(), + osd::ui_event_handler::pointer::MOUSE, + info->index, + device, + x, y, + info->buttons, 0, released, info->clickcnt); +} + +void sdl_window_info::mouse_moved(unsigned device, int x, int y) +{ + if (!m_mouse_inside) + return; + + auto const info(map_pointer(SDL_FingerID(-1), device)); + if (m_active_pointers.end() == info) + return; + + // detect multi-click actions + if (BIT(info->buttons, 0)) + { + info->check_primary_hold_drag( + x, + y, + std::chrono::milliseconds(250), + CLICK_DISTANCE); + } + + // update info and push to UI manager + info->x = x; + info->y = y; + machine().ui_input().push_pointer_update( + target(), + osd::ui_event_handler::pointer::MOUSE, + info->index, + device, + x, y, + info->buttons, 0, 0, info->clickcnt); +} + +void sdl_window_info::mouse_wheel(unsigned device, int y) +{ + if (!m_mouse_inside) + return; + + auto const info(map_pointer(SDL_FingerID(-1), device)); + if (m_active_pointers.end() == info) + return; + + // push to UI manager + machine().ui_input().push_mouse_wheel_event(target(), info->x, info->y, y, 3); +} + +void sdl_window_info::finger_down(SDL_FingerID finger, unsigned device, int x, int y) +{ + auto const info(map_pointer(finger, device)); + if (m_active_pointers.end() == info) + return; + + assert(!info->buttons); + + // detect multi-click actions + info->primary_down( + x, + y, + std::chrono::milliseconds(250), + TAP_DISTANCE, + true, + m_ptrdev_info); + + // update info and push to UI manager + info->x = x; + info->y = y; + info->buttons = 1; + machine().ui_input().push_pointer_update( + target(), + osd::ui_event_handler::pointer::TOUCH, + info->index, + device, + x, y, + 1, 1, 0, info->clickcnt); +} + +void sdl_window_info::finger_up(SDL_FingerID finger, unsigned device, int x, int y) +{ + auto info(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), finger, &sdl_pointer_info::compare)); + if ((m_active_pointers.end() == info) || (info->finger != finger)) + return; + + assert(1 == info->buttons); + + // check for conversion to a (multi-)click-and-hold/drag + info->check_primary_hold_drag( + x, + y, + std::chrono::milliseconds(250), + TAP_DISTANCE); + + // need to remember touches to recognise multi-tap gestures + if (0 < info->clickcnt) + { + auto const now(std::chrono::steady_clock::now()); + auto const time = std::chrono::milliseconds(250); + if ((time + info->pressed) >= now) + { + try + { + unsigned i(0); + if (m_ptrdev_info.size() > device) + i = m_ptrdev_info[device].clear_expired_touches(now, time); + else + m_ptrdev_info.resize(device + 1); + + if (std::size(m_ptrdev_info[device].touches) > i) + { + m_ptrdev_info[device].touches[i].when = info->pressed; + m_ptrdev_info[device].touches[i].x = info->pressedx; + m_ptrdev_info[device].touches[i].y = info->pressedy; + m_ptrdev_info[device].touches[i].cnt = info->clickcnt; + } + } + catch (std::bad_alloc const &) + { + osd_printf_error("win_window_info: error allocating pointer data\n"); + } + } + } + + // push to UI manager + machine().ui_input().push_pointer_update( + target(), + osd::ui_event_handler::pointer::TOUCH, + info->index, + device, + x, y, + 0, 0, 1, info->clickcnt); + machine().ui_input().push_pointer_leave( + target(), + osd::ui_event_handler::pointer::TOUCH, + info->index, + device, + x, y, + 0, info->clickcnt); + + // dump pointer data + m_pointer_mask &= ~(decltype(m_pointer_mask)(1) << info->index); + if (info->index < m_next_pointer) + m_next_pointer = info->index; + m_active_pointers.erase(info); +} + +void sdl_window_info::finger_moved(SDL_FingerID finger, unsigned device, int x, int y) +{ + auto info(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), finger, &sdl_pointer_info::compare)); + if ((m_active_pointers.end() == info) || (info->finger != finger)) + + assert(1 == info->buttons); + + if ((x != info->x) || (y != info->y)) + { + info->check_primary_hold_drag( + x, + y, + std::chrono::milliseconds(250), + TAP_DISTANCE); + + // update info and push to UI manager + info->x = x; + info->y = y; + machine().ui_input().push_pointer_update( + target(), + osd::ui_event_handler::pointer::TOUCH, + info->index, + device, + x, y, + 1, 0, 0, info->clickcnt); + } +} + //============================================================ // sdlwindow_video_window_create // (main thread) @@ -373,9 +658,9 @@ void sdl_window_info::complete_destroy() if (fullscreen() && video_config.switchres) { - SDL_SetWindowFullscreen(platform_window(), 0); // Try to set mode - SDL_SetWindowDisplayMode(platform_window(), &m_original_mode->mode); // Try to set mode - SDL_SetWindowFullscreen(platform_window(), SDL_WINDOW_FULLSCREEN); // Try to set mode + SDL_SetWindowFullscreen(platform_window(), 0); + SDL_SetWindowDisplayMode(platform_window(), &m_original_mode); + SDL_SetWindowFullscreen(platform_window(), SDL_WINDOW_FULLSCREEN); } renderer_reset(); @@ -684,7 +969,7 @@ int sdl_window_info::complete_create() SDL_DisplayMode mode; //SDL_GetCurrentDisplayMode(window().monitor()->handle, &mode); SDL_GetWindowDisplayMode(platform_window(), &mode); - m_original_mode->mode = mode; + m_original_mode = mode; mode.w = temp.width(); mode.h = temp.height(); if (m_win_config.refresh) @@ -1021,6 +1306,52 @@ osd_dim sdl_window_info::get_max_bounds(int constrain) return maximum.dim(); } + +std::vector::iterator sdl_window_info::map_pointer(SDL_FingerID finger, unsigned device) +{ + auto found(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), finger, &sdl_pointer_info::compare)); + if ((m_active_pointers.end() != found) && (found->finger == finger)) + return found; + + if ((sizeof(m_next_pointer) * 8) <= m_next_pointer) + { + assert(~decltype(m_pointer_mask)(0) == m_pointer_mask); + osd_printf_warning("sdl_window_info: exceeded maximum number of active pointers\n"); + return m_active_pointers.end(); + } + assert(!BIT(m_pointer_mask, m_next_pointer)); + + try + { + found = m_active_pointers.emplace( + found, + sdl_pointer_info(finger, m_next_pointer, device)); + m_pointer_mask |= decltype(m_pointer_mask)(1) << m_next_pointer; + do + { + ++m_next_pointer; + } + while (((sizeof(m_next_pointer) * 8) > m_next_pointer) && BIT(m_pointer_mask, m_next_pointer)); + + return found; + } + catch (std::bad_alloc const &) + { + osd_printf_error("sdl_window_info: error allocating pointer data\n"); + return m_active_pointers.end(); + } +} + + +inline sdl_window_info::sdl_pointer_info::sdl_pointer_info(SDL_FingerID f, unsigned i, unsigned d) + : pointer_info(i, d) + , finger(f) +{ +} + + + + //============================================================ // construction and destruction //============================================================ @@ -1040,13 +1371,18 @@ sdl_window_info::sdl_window_info( , m_extra_flags(0) , m_mouse_captured(false) , m_mouse_hidden(false) + , m_pointer_mask(0) + , m_next_pointer(0) + , m_mouse_inside(false) { //FIXME: these should be per_window in config-> or even better a bit set m_fullscreen = !video_config.windowed; m_prescale = video_config.prescale; m_windowed_dim = osd_dim(config->width, config->height); - m_original_mode = std::make_unique(); + + m_ptrdev_info.reserve(1); + m_active_pointers.reserve(16); } sdl_window_info::~sdl_window_info() diff --git a/src/osd/sdl/window.h b/src/osd/sdl/window.h index 77477176b51ac..49fe452192fb6 100644 --- a/src/osd/sdl/window.h +++ b/src/osd/sdl/window.h @@ -14,22 +14,20 @@ #include "modules/osdwindow.h" #include "osdsync.h" +#include + +#include #include #include +#include //============================================================ // TYPE DEFINITIONS //============================================================ -struct SDL_Window; - class render_target; -// forward of SDL_DisplayMode not possible (typedef struct) - define wrapper - -class SDL_DM_Wrapper; - typedef uintptr_t HashT; #define OSDWORK_CALLBACK(name) void *name(void *param, int threadid) @@ -65,26 +63,34 @@ class sdl_window_info : public osd_window_t int xy_to_render_target(int x, int y, int *xt, int *yt); -private: - // window handle and info - int m_startmaximized; + void mouse_entered(unsigned device); + void mouse_left(unsigned device); + void mouse_down(unsigned device, int x, int y, unsigned button); + void mouse_up(unsigned device, int x, int y, unsigned button); + void mouse_moved(unsigned device, int x, int y); + void mouse_wheel(unsigned device, int y); + void finger_down(SDL_FingerID finger, unsigned device, int x, int y); + void finger_up(SDL_FingerID finger, unsigned device, int x, int y); + void finger_moved(SDL_FingerID finger, unsigned device, int x, int y); - // dimensions - osd_dim m_minimum_dim; - osd_dim m_windowed_dim; +private: + struct sdl_pointer_info : public pointer_info + { + static constexpr bool compare(sdl_pointer_info const &info, SDL_FingerID finger) { return info.finger < finger; } - // rendering info - osd_event m_rendered_event; + sdl_pointer_info(sdl_pointer_info const &) = default; + sdl_pointer_info(sdl_pointer_info &&) = default; + sdl_pointer_info &operator=(sdl_pointer_info const &) = default; + sdl_pointer_info &operator=(sdl_pointer_info &&) = default; - // Original display_mode - std::unique_ptr m_original_mode; + sdl_pointer_info(SDL_FingerID, unsigned i, unsigned d); - int m_extra_flags; + SDL_FingerID finger; + }; // returns 0 on success, else 1 int complete_create(); -private: int wnd_extra_width(); int wnd_extra_height(); osd_rect constrain_to_aspect_ratio(const osd_rect &rect, int adjustment); @@ -94,12 +100,35 @@ class sdl_window_info : public osd_window_t osd_dim pick_best_mode(); void set_fullscreen(int afullscreen) { m_fullscreen = afullscreen; } - // monitor info - bool m_mouse_captured; - bool m_mouse_hidden; - void measure_fps(int update); + std::vector::iterator map_pointer(SDL_FingerID finger, unsigned device); + + // window handle and info + int m_startmaximized; + + // dimensions + osd_dim m_minimum_dim; + osd_dim m_windowed_dim; + + // rendering info + osd_event m_rendered_event; + + // Original display_mode + SDL_DisplayMode m_original_mode; + + int m_extra_flags; + + // monitor info + bool m_mouse_captured; + bool m_mouse_hidden; + + // info on currently active pointers - 64 pointers ought to be enough for anyone + uint64_t m_pointer_mask; + unsigned m_next_pointer; + bool m_mouse_inside; + std::vector m_ptrdev_info; + std::vector m_active_pointers; }; #endif // MAME_OSD_SDL_WINDOW_H diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp index 87467a7e06f28..690cc90658c5c 100644 --- a/src/osd/windows/window.cpp +++ b/src/osd/windows/window.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Aaron Giles +// copyright-holders:Aaron Giles, Vas Crabb //============================================================ // // window.cpp - Win32 window handling @@ -64,6 +64,29 @@ #define WM_USER_SET_MINSIZE (WM_USER + 5) +namespace { + +constexpr unsigned get_pointer_buttons(WPARAM wparam) +{ + return + (IS_POINTER_FIRSTBUTTON_WPARAM(wparam) ? 0x01 : 0x00) | + (IS_POINTER_SECONDBUTTON_WPARAM(wparam) ? 0x02 : 0x00) | + (IS_POINTER_THIRDBUTTON_WPARAM(wparam) ? 0x04 : 0x00) | + (IS_POINTER_FOURTHBUTTON_WPARAM(wparam) ? 0x08 : 0x00) | + (IS_POINTER_FIFTHBUTTON_WPARAM(wparam) ? 0x10 : 0x00); +} + +constexpr osd::ui_event_handler::pointer convert_pointer_type(POINTER_INPUT_TYPE type) +{ + // PT_POINTER isn't a real type, and we'll leave PT_TOUCHPAD as unknown for now + return + (PT_TOUCH == type) ? osd::ui_event_handler::pointer::TOUCH : + (PT_PEN == type) ? osd::ui_event_handler::pointer::PEN : + (PT_MOUSE == type) ? osd::ui_event_handler::pointer::MOUSE : + osd::ui_event_handler::pointer::UNKNOWN; +} + +} // anonymous namespace //============================================================ // GLOBAL VARIABLES @@ -190,6 +213,14 @@ void windows_osd_interface::window_exit() } +inline win_window_info::win_pointer_info::win_pointer_info(WORD p, POINTER_INPUT_TYPE t, unsigned i, unsigned d) + : pointer_info(i, d) + , ptrid(p) + , type(t) +{ +} + + win_window_info::win_window_info( running_machine &machine, render_module &renderprovider, @@ -216,6 +247,10 @@ win_window_info::win_window_info( , m_resize_state(RESIZE_STATE_NORMAL) , m_main(nullptr) , m_attached_mode(false) + , m_pointer_mask(0) + , m_next_pointer(0) + , m_next_ptrdev(0) + , m_tracking_mouse(false) { m_non_fullscreen_bounds.left = 0; m_non_fullscreen_bounds.top = 0; @@ -224,6 +259,10 @@ win_window_info::win_window_info( m_fullscreen = !video_config.windowed; m_prescale = video_config.prescale; + + m_ptrdev_map.reserve(8); + m_ptrdev_info.reserve(1); + m_active_pointers.reserve(16); } POINT win_window_info::s_saved_cursor_pos = { -1, -1 }; @@ -314,9 +353,11 @@ static bool is_mame_window(HWND hwnd) inline static BOOL handle_mouse_button(windows_osd_interface *osd, int button, int down, int x, int y) { - MouseButtonEventArgs args; - args.button = button; - args.keydown = down; + MouseUpdateEventArgs args; + args.pressed = (down ? 1 : 0) << button; + args.released = (down ? 0 : 1) << button; + args.vdelta = 0; + args.hdelta = 0; args.xpos = x; args.ypos = y; @@ -328,6 +369,24 @@ inline static BOOL handle_mouse_button(windows_osd_interface *osd, int button, i return handled && !osd->options().lightgun() && !osd->options().mouse(); } +inline static BOOL handle_mouse_wheel(windows_osd_interface *osd, int v, int h, int x, int y) +{ + MouseUpdateEventArgs args; + args.pressed = 0; + args.released = 0; + args.vdelta = v; + args.hdelta = h; + args.xpos = x; + args.ypos = y; + + bool handled = osd->handle_input_event(INPUT_EVENT_MOUSE_WHEEL, &args); + + // When in lightgun mode or mouse mode, the mouse wheel may be routed to the input system + // because the mouse interactions in the UI are routed from the video_window_proc below + // we need to make sure they aren't suppressed in these cases. + return handled && !osd->options().lightgun() && !osd->options().mouse(); +} + inline static BOOL handle_keypress(windows_osd_interface *osd, int vkey, int down, int scancode, BOOL extended_key) { KeyPressEventArgs args; @@ -408,6 +467,15 @@ void windows_osd_interface::process_events(bool ingame, bool nodispatch) dispatch = !handle_mouse_button(this, 3, FALSE, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); break; + // forward mouse wheel movement to the input system + case WM_MOUSEWHEEL: + dispatch = !handle_mouse_wheel(this, GET_WHEEL_DELTA_WPARAM(message.wParam), 0, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); + break; + + case WM_MOUSEHWHEEL: + dispatch = !handle_mouse_wheel(this, 0, GET_WHEEL_DELTA_WPARAM(message.wParam), GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); + break; + case WM_KEYDOWN: if (NOT_ALREADY_DOWN(message.lParam)) dispatch = !handle_keypress(this, message.wParam, TRUE, SCAN_CODE(message.lParam), IS_EXTENDED(message.lParam)); @@ -1066,49 +1134,7 @@ LRESULT CALLBACK win_window_info::video_window_proc(HWND wnd, UINT message, WPAR case WM_SYSKEYDOWN: break; - // input events - case WM_MOUSEMOVE: - window->machine().ui_input().push_mouse_move_event(window->target(), GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); - break; - - case WM_MOUSELEAVE: - window->machine().ui_input().push_mouse_leave_event(window->target()); - break; - - case WM_LBUTTONDOWN: - { - auto const ticks = std::chrono::steady_clock::now(); - window->machine().ui_input().push_mouse_down_event(window->target(), GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); - - // check for a double-click - avoid overflow by adding times rather than subtracting - if (ticks < (window->m_lastclicktime + std::chrono::milliseconds(GetDoubleClickTime())) && - GET_X_LPARAM(lparam) >= window->m_lastclickx - 4 && GET_X_LPARAM(lparam) <= window->m_lastclickx + 4 && - GET_Y_LPARAM(lparam) >= window->m_lastclicky - 4 && GET_Y_LPARAM(lparam) <= window->m_lastclicky + 4) - { - window->m_lastclicktime = std::chrono::steady_clock::time_point::min(); - window->machine().ui_input().push_mouse_double_click_event(window->target(), GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); - } - else - { - window->m_lastclicktime = ticks; - window->m_lastclickx = GET_X_LPARAM(lparam); - window->m_lastclicky = GET_Y_LPARAM(lparam); - } - } - break; - - case WM_LBUTTONUP: - window->machine().ui_input().push_mouse_up_event(window->target(), GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); - break; - - case WM_RBUTTONDOWN: - window->machine().ui_input().push_mouse_rdown_event(window->target(), GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); - break; - - case WM_RBUTTONUP: - window->machine().ui_input().push_mouse_rup_event(window->target(), GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); - break; - + // text input events case WM_CHAR: { char16_t const ch = char16_t(wparam); @@ -1140,14 +1166,61 @@ LRESULT CALLBACK win_window_info::video_window_proc(HWND wnd, UINT message, WPAR window->machine().ui_input().push_char_event(window->target(), char32_t(wparam)); break; + // legacy mouse events + case WM_MOUSEMOVE: + window->mouse_updated(wparam, lparam); + break; + + case WM_MOUSELEAVE: + window->mouse_left(wparam, lparam); + break; + + case WM_LBUTTONDOWN: + window->mouse_updated(wparam, lparam); + break; + + case WM_LBUTTONUP: + window->mouse_updated(wparam, lparam); + break; + + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + window->mouse_updated(wparam, lparam); + break; + + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + window->mouse_updated(wparam, lparam); + return TRUE; + case WM_MOUSEWHEEL: { + POINT where{ GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam) }; + ScreenToClient(wnd, &where); UINT ucNumLines = 3; // default SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &ucNumLines, 0); - window->machine().ui_input().push_mouse_wheel_event(window->target(), GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam), GET_WHEEL_DELTA_WPARAM(wparam), ucNumLines); + window->machine().ui_input().push_mouse_wheel_event(window->target(), where.x, where.y, GET_WHEEL_DELTA_WPARAM(wparam), ucNumLines); } break; + // new-style pointer handling (mouse/pen/touch) + case WM_POINTERENTER: + window->pointer_entered(wparam, lparam); + break; + case WM_POINTERLEAVE: + window->pointer_left(wparam, lparam); + break; + case WM_POINTERDOWN: + case WM_POINTERUP: + case WM_POINTERUPDATE: + window->pointer_updated(wparam, lparam); + break; + case WM_POINTERCAPTURECHANGED: + window->pointer_capture_changed(wparam, lparam); + break; + // pause the system when we start a menu or resize case WM_ENTERSIZEMOVE: window->m_resize_state = RESIZE_STATE_RESIZING; @@ -1834,11 +1907,405 @@ win_window_focus win_window_info::focus() const } +void win_window_info::pointer_entered(WPARAM wparam, LPARAM lparam) +{ + assert(!IS_POINTER_CANCELED_WPARAM(wparam)); + auto const info(map_pointer(wparam)); + if (m_active_pointers.end() != info) + { + POINT where{ GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam) }; + ScreenToClient(platform_window(), &where); + info->x = where.x; + info->y = where.y; + machine().ui_input().push_pointer_update( + target(), + convert_pointer_type(info->type), + info->index, + info->device, + where.x, where.y, + 0U, 0U, 0U, 0U); + } +} + +void win_window_info::pointer_left(WPARAM wparam, LPARAM lparam) +{ + auto const info(find_pointer(wparam)); + if (m_active_pointers.end() != info) + { + bool const canceled(IS_POINTER_CANCELED_WPARAM(wparam)); + POINT where{ GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam) }; + ScreenToClient(platform_window(), &where); + expire_pointer(info, where, canceled); + } +} + +void win_window_info::pointer_updated(WPARAM wparam, LPARAM lparam) +{ + bool const canceled(IS_POINTER_CANCELED_WPARAM(wparam)); + auto const info(canceled ? find_pointer(wparam) : map_pointer(wparam)); + if (m_active_pointers.end() != info) + { + POINT where{ GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam) }; + ScreenToClient(platform_window(), &where); + unsigned const buttons(canceled ? 0 : get_pointer_buttons(wparam)); + update_pointer(*info, where, buttons, canceled); + } +} + +void win_window_info::pointer_capture_changed(WPARAM wparam, LPARAM lparam) +{ + auto const info(find_pointer(wparam)); + if (m_active_pointers.end() != info) + { + // treat this as the pointer being stolen - fail any gestures + if (BIT(info->buttons, 0)) + { + assert(0 <= info->clickcnt); + info->clickcnt = -info->clickcnt; + } + + // push to UI manager and dump pointer data + machine().ui_input().push_pointer_abort( + target(), + convert_pointer_type(info->type), + info->index, + info->device, + info->x, info->y, + info->buttons, info->clickcnt); + m_pointer_mask &= ~(decltype(m_pointer_mask)(1) << info->index); + if (info->index < m_next_pointer) + m_next_pointer = info->index; + m_active_pointers.erase(info); + } +} + +void win_window_info::mouse_left(WPARAM wparam, LPARAM lparam) +{ + m_tracking_mouse = false; + auto const info(find_mouse_pointer()); + if (m_active_pointers.end() != info) + { + POINT where{ GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam) }; + expire_pointer(info, where, false); + } +} + +void win_window_info::mouse_updated(WPARAM wparam, LPARAM lparam) +{ + auto const info(map_mouse_pointer()); + if (m_active_pointers.end() == info) + return; + + POINT const where{ GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam) }; + unsigned const buttons( + ((MK_LBUTTON & wparam) ? 0x01 : 0x00) | + ((MK_RBUTTON & wparam) ? 0x02 : 0x00) | + ((MK_MBUTTON & wparam) ? 0x04 : 0x00) | + ((MK_XBUTTON1 & wparam) ? 0x08 : 0x00) | + ((MK_XBUTTON2 & wparam) ? 0x10 : 0x00)); + + // continue to track the mouse outside the window if buttons are down + if (buttons && !info->buttons) + { + SetCapture(platform_window()); + + TRACKMOUSEEVENT tm; + std::memset(&tm, 0, sizeof(tm)); + tm.cbSize = sizeof(tm); + tm.dwFlags = TME_CANCEL | TME_LEAVE; + tm.hwndTrack = platform_window(); + TrackMouseEvent(&tm); + m_tracking_mouse = false; + } + else + { + if (!buttons && info->buttons) + { + if (GetCapture() == platform_window()) + ReleaseCapture(); + } + + if (!m_tracking_mouse) + { + TRACKMOUSEEVENT tm; + std::memset(&tm, 0, sizeof(tm)); + tm.cbSize = sizeof(tm); + tm.dwFlags = TME_LEAVE; + tm.hwndTrack = platform_window(); + TrackMouseEvent(&tm); + m_tracking_mouse = true; + } + } + + update_pointer(*info, where, buttons, false); +} + +void win_window_info::expire_pointer(std::vector::iterator info, POINT const &where, bool canceled) +{ + // leaving implicitly releases buttons, so check hold/drag if necessary + if (BIT(info->buttons, 0)) + { + assert(0 <= info->clickcnt); + if (!canceled) + { + auto const now(std::chrono::steady_clock::now()); + auto const exp(std::chrono::milliseconds(GetDoubleClickTime()) + info->pressed); + int const dx(where.x - info->pressedx); + int const dy(where.y - info->pressedy); + int const distance((dx * dx) + (dy * dy)); + int const tolerance((PT_TOUCH == info->type) ? TAP_DISTANCE : CLICK_DISTANCE); + if ((exp < now) || (tolerance < distance)) + info->clickcnt = -info->clickcnt; + } + else + { + info->clickcnt = -info->clickcnt; + } + } + + // need to remember touches to recognise multi-tap gestures + if (!canceled && (PT_TOUCH == info->type) && (0 < info->clickcnt)) + { + auto const now(std::chrono::steady_clock::now()); + auto const time = std::chrono::milliseconds(GetDoubleClickTime()); + if ((time + info->pressed) >= now) + { + try + { + unsigned i(0); + if (m_ptrdev_info.size() > info->device) + i = m_ptrdev_info[info->device].clear_expired_touches(now, time); + else + m_ptrdev_info.resize(info->device + 1); + + if (std::size(m_ptrdev_info[info->device].touches) > i) + { + m_ptrdev_info[info->device].touches[i].when = info->pressed; + m_ptrdev_info[info->device].touches[i].x = info->pressedx; + m_ptrdev_info[info->device].touches[i].y = info->pressedy; + m_ptrdev_info[info->device].touches[i].cnt = info->clickcnt; + } + } + catch (std::bad_alloc const &) + { + osd_printf_error("win_window_info: error allocating pointer data\n"); + } + } + } + + // push to UI manager and dump pointer data + if (!canceled) + { + machine().ui_input().push_pointer_leave( + target(), + convert_pointer_type(info->type), + info->index, + info->device, + where.x, where.y, + info->buttons, info->clickcnt); + } + else + { + machine().ui_input().push_pointer_abort( + target(), + convert_pointer_type(info->type), + info->index, + info->device, + where.x, where.y, + info->buttons, info->clickcnt); + } + m_pointer_mask &= ~(decltype(m_pointer_mask)(1) << info->index); + if (info->index < m_next_pointer) + m_next_pointer = info->index; + m_active_pointers.erase(info); +} + +void win_window_info::update_pointer(win_pointer_info &info, POINT const &where, unsigned buttons, bool canceled) +{ + if (!canceled && (where.x == info.x) && (where.y == info.y) && (buttons == info.buttons)) + return; + + // detect multi-click actions + unsigned const pressed(canceled ? 0 : (buttons & ~info.buttons)); + unsigned const released(canceled ? ~info.buttons : (~buttons & info.buttons)); + if (BIT(pressed, 0)) + { + info.primary_down( + where.x, where.y, + std::chrono::milliseconds(GetDoubleClickTime()), + (PT_TOUCH == info.type) ? TAP_DISTANCE : CLICK_DISTANCE, + PT_TOUCH == info.type, + m_ptrdev_info); + } + else if (BIT(info.buttons, 0)) + { + info.check_primary_hold_drag( + where.x, where.y, + std::chrono::milliseconds(GetDoubleClickTime()), + (PT_TOUCH == info.type) ? TAP_DISTANCE : CLICK_DISTANCE); + } + + // update info and push to UI manager + info.x = where.x; + info.y = where.y; + info.buttons = buttons; + if (!canceled) + { + machine().ui_input().push_pointer_update( + target(), + convert_pointer_type(info.type), + info.index, + info.device, + where.x, where.y, + buttons, pressed, released, info.clickcnt); + } + else + { + machine().ui_input().push_pointer_abort( + target(), + convert_pointer_type(info.type), + info.index, + info.device, + where.x, where.y, + released, info.clickcnt); + } +} + +std::vector::iterator win_window_info::map_pointer(WPARAM wparam) +{ + WORD const ptrid(GET_POINTERID_WPARAM(wparam)); + auto found(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), ptrid, &win_pointer_info::compare)); + if ((m_active_pointers.end() != found) && (found->ptrid == ptrid)) + return found; + + if ((sizeof(m_next_pointer) * 8) <= m_next_pointer) + { + assert(~decltype(m_pointer_mask)(0) == m_pointer_mask); + osd_printf_warning("win_window_info: exceeded maximum number of active pointers\n"); + return m_active_pointers.end(); + } + assert(!BIT(m_pointer_mask, m_next_pointer)); + + POINTER_INFO info = { 0 }; + if (!OSD_DYNAMIC_CALL(GetPointerInfo, ptrid, &info)) + { + osd_printf_error("win_window_info: failed to get info for pointer ID %u\n", ptrid); + return m_active_pointers.end(); + } + + auto devpos(std::lower_bound( + m_ptrdev_map.begin(), + m_ptrdev_map.end(), + info.sourceDevice, + [] (std::pair const &mapping, HANDLE device) + { + return mapping.first < device; + })); + + try + { + if ((m_ptrdev_map.end() == devpos) || (devpos->first != info.sourceDevice)) + { + devpos = m_ptrdev_map.emplace(devpos, info.sourceDevice, m_next_ptrdev); + ++m_next_ptrdev; + } + + found = m_active_pointers.emplace( + found, + win_pointer_info(ptrid, info.pointerType, m_next_pointer, devpos->second)); + m_pointer_mask |= decltype(m_pointer_mask)(1) << m_next_pointer; + do + { + ++m_next_pointer; + } + while (((sizeof(m_next_pointer) * 8) > m_next_pointer) && BIT(m_pointer_mask, m_next_pointer)); + + return found; + } + catch (std::bad_alloc const &) + { + osd_printf_error("win_window_info: error allocating pointer data\n"); + return m_active_pointers.end(); + } +} + +std::vector::iterator win_window_info::find_pointer(WPARAM wparam) +{ + WORD const ptrid(GET_POINTERID_WPARAM(wparam)); + auto const found(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), ptrid, &win_pointer_info::compare)); + if ((m_active_pointers.end() != found) && (found->ptrid == ptrid)) + return found; + else + return m_active_pointers.end(); +} + +std::vector::iterator win_window_info::map_mouse_pointer() +{ + WORD const ptrid(~WORD(0)); + auto found(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), ptrid, &win_pointer_info::compare)); + if ((m_active_pointers.end() != found) && (found->ptrid == ptrid)) + return found; + + if ((sizeof(m_next_pointer) * 8) <= m_next_pointer) + { + assert(~decltype(m_pointer_mask)(0) == m_pointer_mask); + osd_printf_warning("win_window_info: exceeded maximum number of active pointers\n"); + return m_active_pointers.end(); + } + assert(!BIT(m_pointer_mask, m_next_pointer)); + + auto devpos(std::lower_bound( + m_ptrdev_map.begin(), + m_ptrdev_map.end(), + INVALID_HANDLE_VALUE, + [] (std::pair const &mapping, HANDLE device) + { + return mapping.first < device; + })); + + try + { + if ((m_ptrdev_map.end() == devpos) || (devpos->first != INVALID_HANDLE_VALUE)) + { + devpos = m_ptrdev_map.emplace(devpos, INVALID_HANDLE_VALUE, m_next_ptrdev); + ++m_next_ptrdev; + } + + found = m_active_pointers.emplace( + found, + win_pointer_info(ptrid, PT_MOUSE, m_next_pointer, devpos->second)); + m_pointer_mask |= decltype(m_pointer_mask)(1) << m_next_pointer; + do + { + ++m_next_pointer; + } + while (((sizeof(m_next_pointer) * 8) > m_next_pointer) && BIT(m_pointer_mask, m_next_pointer)); + + return found; + } + catch (std::bad_alloc const &) + { + osd_printf_error("win_window_info: error allocating pointer data\n"); + return m_active_pointers.end(); + } +} + +std::vector::iterator win_window_info::find_mouse_pointer() +{ + WORD const ptrid(~WORD(0)); + auto const found(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), ptrid, &win_pointer_info::compare)); + if ((m_active_pointers.end() != found) && (found->ptrid == ptrid)) + return found; + else + return m_active_pointers.end(); +} + + +#if (USE_QTDEBUG) //============================================================ // winwindow_qt_filter //============================================================ -#if (USE_QTDEBUG) bool winwindow_qt_filter(void *message) { MSG *msg = (MSG *)message; diff --git a/src/osd/windows/window.h b/src/osd/windows/window.h index 53021e43a78f1..bdfd8a79b61ce 100644 --- a/src/osd/windows/window.h +++ b/src/osd/windows/window.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Aaron Giles +// copyright-holders:Aaron Giles, Vas Crabb //============================================================ // // window.h - Win32 window handling @@ -128,6 +128,21 @@ class win_window_info : public osd_window_t int m_resize_state; private: + struct win_pointer_info : public pointer_info + { + static constexpr bool compare(win_pointer_info const &info, WORD ptrid) { return info.ptrid < ptrid; } + + win_pointer_info(win_pointer_info const &) = default; + win_pointer_info(win_pointer_info &&) = default; + win_pointer_info &operator=(win_pointer_info const &) = default; + win_pointer_info &operator=(win_pointer_info &&) = default; + + win_pointer_info(WORD p, POINTER_INPUT_TYPE t, unsigned i, unsigned d); + + WORD ptrid; + POINTER_INPUT_TYPE type; + }; + void draw_video_contents(HDC dc, bool update); int complete_create(); int wnd_extra_width(); @@ -141,9 +156,38 @@ class win_window_info : public osd_window_t void adjust_window_position_after_major_change(); void set_fullscreen(int fullscreen); + // pointer handling helpers + void pointer_entered(WPARAM wparam, LPARAM lparam); + void pointer_left(WPARAM wparam, LPARAM lparam); + void pointer_updated(WPARAM wparam, LPARAM lparam); + void pointer_capture_changed(WPARAM wparam, LPARAM lparam); + void mouse_left(WPARAM wparam, LPARAM lparam); + void mouse_updated(WPARAM wparam, LPARAM lparam); + void expire_pointer(std::vector::iterator info, POINT const &where, bool canceled); + void update_pointer(win_pointer_info &info, POINT const &where, unsigned buttons, bool canceled); + std::vector::iterator map_pointer(WPARAM wparam); + std::vector::iterator find_pointer(WPARAM wparam); + std::vector::iterator map_mouse_pointer(); + std::vector::iterator find_mouse_pointer(); + win_window_info * m_main; bool m_attached_mode; + // these functions first appear in Windows 8/Server 2012 + OSD_DYNAMIC_API(user32, "User32.dll", "User32.dll"); + OSD_DYNAMIC_API_FN(user32, BOOL, WINAPI, GetPointerType, UINT32, POINTER_INPUT_TYPE *); + OSD_DYNAMIC_API_FN(user32, BOOL, WINAPI, GetPointerInfo, UINT32, POINTER_INFO *); + OSD_DYNAMIC_API_FN(user32, BOOL, WINAPI, GetPointerPenInfo, UINT32, POINTER_PEN_INFO *); + OSD_DYNAMIC_API_FN(user32, BOOL, WINAPI, GetPointerTouchInfo, UINT32, POINTER_TOUCH_INFO *); + + // info on currently active pointers - 64 pointers ought to be enough for anyone + uint64_t m_pointer_mask; + unsigned m_next_pointer, m_next_ptrdev; + bool m_tracking_mouse; + std::vector > m_ptrdev_map; + std::vector m_ptrdev_info; + std::vector m_active_pointers; + static POINT s_saved_cursor_pos; }; diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h index bb96ec2a3e44e..2ba8335c175b0 100644 --- a/src/osd/windows/winmain.h +++ b/src/osd/windows/winmain.h @@ -30,7 +30,8 @@ enum input_event INPUT_EVENT_RAWINPUT, INPUT_EVENT_ARRIVAL, INPUT_EVENT_REMOVAL, - INPUT_EVENT_MOUSE_BUTTON + INPUT_EVENT_MOUSE_BUTTON, + INPUT_EVENT_MOUSE_WHEEL }; struct KeyPressEventArgs @@ -40,10 +41,12 @@ struct KeyPressEventArgs uint8_t scancode; }; -struct MouseButtonEventArgs +struct MouseUpdateEventArgs { - int button; - int keydown; + unsigned pressed; + unsigned released; + int vdelta; + int hdelta; int xpos; int ypos; }; From ea9888f321610716f340d488369e23b5725ba8a3 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 11 Apr 2024 20:18:54 +0200 Subject: [PATCH 061/109] d3dhlsl: fix possible array overflow with system name string --- src/osd/modules/render/d3d/d3dhlsl.cpp | 2 +- src/osd/modules/render/d3d/d3dhlsl.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index 52bec85f06fac..c0753f314f789 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -2022,7 +2022,7 @@ int32_t slider::update(std::string *str, int32_t newval) return 0; } -char shaders::last_system_name[16]; +char shaders::last_system_name[MAX_DRIVER_NAME_CHARS + 1]; hlsl_options shaders::last_options = { false }; diff --git a/src/osd/modules/render/d3d/d3dhlsl.h b/src/osd/modules/render/d3d/d3dhlsl.h index f06deca2a57b9..6820f3dd31679 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.h +++ b/src/osd/modules/render/d3d/d3dhlsl.h @@ -2,7 +2,7 @@ // copyright-holders:Aaron Giles //============================================================ // -// drawd3d.c - Win32 Direct3D HLSL-specific header +// drawd3d.h - Win32 Direct3D HLSL-specific header // //============================================================ @@ -457,7 +457,7 @@ class shaders static slider_desc s_sliders[]; static hlsl_options last_options; // last used options - static char last_system_name[16]; // last used system + static char last_system_name[MAX_DRIVER_NAME_CHARS + 1]; // last used system osd::dynamic_module::ptr d3dx9_dll; d3dx_create_effect_from_file_fn d3dx_create_effect_from_file_ptr; From e45ebde551422d9b21cc05db52d4630375050865 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 12 Apr 2024 04:23:28 +1000 Subject: [PATCH 062/109] debugger/debugimgui.cpp: Refuse to break if unable to take over UI input. --- src/osd/modules/debugger/debugimgui.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/osd/modules/debugger/debugimgui.cpp b/src/osd/modules/debugger/debugimgui.cpp index e2d4eba363ace..3aee9845f2f2e 100644 --- a/src/osd/modules/debugger/debugimgui.cpp +++ b/src/osd/modules/debugger/debugimgui.cpp @@ -1591,27 +1591,31 @@ void debug_imgui::wait_for_debugger(device_t &device, bool firststop) } if(firststop) { -// debug_show_all(); - device.machine().ui_input().reset(); + //debug_show_all(); m_running = false; } if(!m_take_ui) { - m_take_ui = m_machine->ui().set_ui_event_handler([this] () { return m_take_ui; }); - if(m_take_ui) - m_machine->ui_input().reset(); + if (!m_machine->ui().set_ui_event_handler([this] () { return m_take_ui; })) + { + // can't break if we can't take over UI input + m_machine->debugger().console().get_visible_cpu()->debug()->go(); + m_running = true; + return; + } + m_take_ui = true; + } m_hide = false; - m_machine->osd().input_update(true); + m_machine->osd().input_update(false); handle_events(); handle_console(m_machine); update_cpu_view(&device); - imguiBeginFrame(m_mouse_x,m_mouse_y,m_mouse_button ? IMGUI_MBUT_LEFT : 0, 0, width, height,m_key_char); + imguiBeginFrame(m_mouse_x, m_mouse_y, m_mouse_button ? IMGUI_MBUT_LEFT : 0, 0, width, height,m_key_char); handle_mouse_views(); handle_keys_views(); update(); imguiEndFrame(); - m_machine->ui_input().reset(); // clear remaining inputs, so they don't fall through to the UI device.machine().osd().update(false); osd_sleep(osd_ticks_per_second() / 1000 * 50); } From 40c0fc799d0b9ac54a4e563fa40c7b81b9ee0496 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 11 Apr 2024 21:02:13 +0200 Subject: [PATCH 063/109] misc internal artwork: add clickthrough attribute --- src/mame/chess/ave_arb.cpp | 3 --- src/mame/ddr/chessmst.cpp | 3 --- src/mame/ddr/chessmstdm.cpp | 3 --- src/mame/hegenerglaser/academy.cpp | 3 --- src/mame/hegenerglaser/amsterdam.cpp | 3 --- src/mame/hegenerglaser/berlin.cpp | 3 --- src/mame/hegenerglaser/milano.cpp | 3 --- src/mame/hegenerglaser/mm2.cpp | 3 --- src/mame/hegenerglaser/modena.cpp | 3 --- src/mame/hegenerglaser/mondial68k.cpp | 3 --- src/mame/hegenerglaser/polgar.cpp | 3 --- src/mame/hegenerglaser/risc.cpp | 3 --- src/mame/hegenerglaser/roma2.cpp | 3 --- src/mame/layout/ave_arb.lay | 21 +-------------------- src/mame/layout/chessmst.lay | 21 +-------------------- src/mame/layout/chessmstdm.lay | 22 ++-------------------- src/mame/layout/mephisto_academy.lay | 22 ++-------------------- src/mame/layout/mephisto_amsterdam.lay | 24 +++--------------------- src/mame/layout/mephisto_berlin.lay | 24 +++--------------------- src/mame/layout/mephisto_bup.lay | 24 +++--------------------- src/mame/layout/mephisto_milano.lay | 22 ++-------------------- src/mame/layout/mephisto_mm2.lay | 24 +++--------------------- src/mame/layout/mephisto_mm5.lay | 24 +++--------------------- src/mame/layout/mephisto_modena.lay | 22 ++-------------------- src/mame/layout/mephisto_mondial68k.lay | 22 ++-------------------- src/mame/layout/mephisto_montreal.lay | 22 ++-------------------- src/mame/layout/mephisto_polgar.lay | 24 ++---------------------- src/mame/layout/mephisto_risc.lay | 24 ++---------------------- src/mame/layout/mephisto_roma2.lay | 24 +++--------------------- src/mame/layout/mephisto_schachak.lay | 23 +++-------------------- src/mame/layout/saitek_chessac.lay | 23 +++-------------------- src/mame/saitek/chessac.cpp | 3 --- 32 files changed, 42 insertions(+), 412 deletions(-) diff --git a/src/mame/chess/ave_arb.cpp b/src/mame/chess/ave_arb.cpp index dfc0229b1043b..26671921a7896 100644 --- a/src/mame/chess/ave_arb.cpp +++ b/src/mame/chess/ave_arb.cpp @@ -270,9 +270,6 @@ static INPUT_PORTS_START( arb ) PORT_START("IN.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_F1) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, reset_button, 0) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_F1) PORT_NAME("Halt") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, halt_button, 0) - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/ddr/chessmst.cpp b/src/mame/ddr/chessmst.cpp index 035f38b7a0d6c..8205599a7aeba 100644 --- a/src/mame/ddr/chessmst.cpp +++ b/src/mame/ddr/chessmst.cpp @@ -206,9 +206,6 @@ static INPUT_PORTS_START( chessmst ) PORT_START("IN.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Halt") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, chessmst_state, halt_button, 0) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, chessmst_state, reset_button, 0) - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/ddr/chessmstdm.cpp b/src/mame/ddr/chessmstdm.cpp index be9650a92d159..a6fb1462fe6f1 100644 --- a/src/mame/ddr/chessmstdm.cpp +++ b/src/mame/ddr/chessmstdm.cpp @@ -272,9 +272,6 @@ static INPUT_PORTS_START( chessmstdm ) PORT_START("IN.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Monitor") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, chessmstdm_state, monitor_button, 0) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("View") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, chessmstdm_state, view_button, 0) - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/academy.cpp b/src/mame/hegenerglaser/academy.cpp index d58965d7aba77..31a74040934d8 100644 --- a/src/mame/hegenerglaser/academy.cpp +++ b/src/mame/hegenerglaser/academy.cpp @@ -119,9 +119,6 @@ static INPUT_PORTS_START( academy ) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FCT") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_F1) // " - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/amsterdam.cpp b/src/mame/hegenerglaser/amsterdam.cpp index e446f055a0f27..1f189ff3e3f29 100644 --- a/src/mame/hegenerglaser/amsterdam.cpp +++ b/src/mame/hegenerglaser/amsterdam.cpp @@ -168,9 +168,6 @@ static INPUT_PORTS_START( amsterdam ) PORT_START("RESET") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RES 1") PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, amsterdam_state, reset_button, 0) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RES 2") PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, amsterdam_state, reset_button, 0) - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/berlin.cpp b/src/mame/hegenerglaser/berlin.cpp index 5fa281f489edf..0bc07fe8755a0 100644 --- a/src/mame/hegenerglaser/berlin.cpp +++ b/src/mame/hegenerglaser/berlin.cpp @@ -121,9 +121,6 @@ static INPUT_PORTS_START( berlin ) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("New Game (1/2)") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_F1) // combine for NEW GAME PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("New Game (2/2)") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_F1) // " - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/milano.cpp b/src/mame/hegenerglaser/milano.cpp index d804b7bbfa3bb..d2d890683119d 100644 --- a/src/mame/hegenerglaser/milano.cpp +++ b/src/mame/hegenerglaser/milano.cpp @@ -152,9 +152,6 @@ static INPUT_PORTS_START( milano ) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Function / King") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Enter / New Game") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Clear / New Game") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_F1) // " - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/mm2.cpp b/src/mame/hegenerglaser/mm2.cpp index 0a8e626743ee7..183238732be9d 100644 --- a/src/mame/hegenerglaser/mm2.cpp +++ b/src/mame/hegenerglaser/mm2.cpp @@ -288,9 +288,6 @@ static INPUT_PORTS_START( mm2 ) PORT_START("RESET") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RES 1") PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, mm2_state, reset_button, 0) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RES 2") PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, mm2_state, reset_button, 0) - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END static INPUT_PORTS_START( bup ) diff --git a/src/mame/hegenerglaser/modena.cpp b/src/mame/hegenerglaser/modena.cpp index df5079cff7970..686ad8a30955c 100644 --- a/src/mame/hegenerglaser/modena.cpp +++ b/src/mame/hegenerglaser/modena.cpp @@ -159,9 +159,6 @@ static INPUT_PORTS_START( modena ) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Function / King") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Enter / New Game") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Clear / New Game") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_F1) // " - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/mondial68k.cpp b/src/mame/hegenerglaser/mondial68k.cpp index f517ab9db1e07..9fc3fbe680b01 100644 --- a/src/mame/hegenerglaser/mondial68k.cpp +++ b/src/mame/hegenerglaser/mondial68k.cpp @@ -180,9 +180,6 @@ static INPUT_PORTS_START( mondial68k ) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H / 8") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine ENT/CL for NEW GAME - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/polgar.cpp b/src/mame/hegenerglaser/polgar.cpp index a0a9b74c874fa..bd72b9aaff942 100644 --- a/src/mame/hegenerglaser/polgar.cpp +++ b/src/mame/hegenerglaser/polgar.cpp @@ -97,9 +97,6 @@ static INPUT_PORTS_START( polgar ) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FCT / King") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT / New Game") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL / New Game") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_F1) // " - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/risc.cpp b/src/mame/hegenerglaser/risc.cpp index 08873d1792c83..143b942b61952 100644 --- a/src/mame/hegenerglaser/risc.cpp +++ b/src/mame/hegenerglaser/risc.cpp @@ -133,9 +133,6 @@ static INPUT_PORTS_START( mrisc ) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FCT / King") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT / New Game") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL / New Game") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_F1) // " - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/roma2.cpp b/src/mame/hegenerglaser/roma2.cpp index e8c7f2699d3c6..5c904a5219b7c 100644 --- a/src/mame/hegenerglaser/roma2.cpp +++ b/src/mame/hegenerglaser/roma2.cpp @@ -151,9 +151,6 @@ static INPUT_PORTS_START( montreal ) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H / 8") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Left / Black / 9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_LEFT) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Right / White / 0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RIGHT) - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END static INPUT_PORTS_START( roma2 ) diff --git a/src/mame/layout/ave_arb.lay b/src/mame/layout/ave_arb.lay index 16f35942c9772..e9fac163c0950 100644 --- a/src/mame/layout/ave_arb.lay +++ b/src/mame/layout/ave_arb.lay @@ -5,25 +5,6 @@ authors:hap --> - - - - - @@ -502,7 +483,7 @@ authors:hap - + diff --git a/src/mame/layout/chessmst.lay b/src/mame/layout/chessmst.lay index 39dc5938d8c0d..7a59df0cfcc8e 100644 --- a/src/mame/layout/chessmst.lay +++ b/src/mame/layout/chessmst.lay @@ -5,25 +5,6 @@ authors:Sandro Ronco, hap --> - - - - - @@ -477,7 +458,7 @@ authors:Sandro Ronco, hap - + diff --git a/src/mame/layout/chessmstdm.lay b/src/mame/layout/chessmstdm.lay index a1a24197ca671..aa3ddc34c9ad4 100644 --- a/src/mame/layout/chessmstdm.lay +++ b/src/mame/layout/chessmstdm.lay @@ -5,25 +5,6 @@ authors:Sandro Ronco, hap --> - - - - - @@ -428,7 +409,8 @@ authors:Sandro Ronco, hap - + + diff --git a/src/mame/layout/mephisto_academy.lay b/src/mame/layout/mephisto_academy.lay index 734f88b601333..dd0129c67229c 100644 --- a/src/mame/layout/mephisto_academy.lay +++ b/src/mame/layout/mephisto_academy.lay @@ -5,25 +5,6 @@ authors:Sandro Ronco, hap --> - - - - - @@ -456,7 +437,8 @@ authors:Sandro Ronco, hap - + + diff --git a/src/mame/layout/mephisto_amsterdam.lay b/src/mame/layout/mephisto_amsterdam.lay index 0f18d4d59dedc..db02bb4f541c3 100644 --- a/src/mame/layout/mephisto_amsterdam.lay +++ b/src/mame/layout/mephisto_amsterdam.lay @@ -6,25 +6,6 @@ thanks-to:Franz Huber --> - - - - - @@ -512,9 +493,10 @@ thanks-to:Franz Huber - - + + + diff --git a/src/mame/layout/mephisto_berlin.lay b/src/mame/layout/mephisto_berlin.lay index 4a59bb0cc547d..b1d00da3de040 100644 --- a/src/mame/layout/mephisto_berlin.lay +++ b/src/mame/layout/mephisto_berlin.lay @@ -5,25 +5,6 @@ authors:Sandro Ronco, hap --> - - - - - @@ -396,9 +377,10 @@ authors:Sandro Ronco, hap - - + + + diff --git a/src/mame/layout/mephisto_bup.lay b/src/mame/layout/mephisto_bup.lay index 1f5112fb63376..8cd28fcaf7cda 100644 --- a/src/mame/layout/mephisto_bup.lay +++ b/src/mame/layout/mephisto_bup.lay @@ -6,25 +6,6 @@ thanks-to:Franz Huber --> - - - - - @@ -530,9 +511,10 @@ thanks-to:Franz Huber - - + + + diff --git a/src/mame/layout/mephisto_milano.lay b/src/mame/layout/mephisto_milano.lay index d7a3b383e7f09..20b75c74e4a41 100644 --- a/src/mame/layout/mephisto_milano.lay +++ b/src/mame/layout/mephisto_milano.lay @@ -5,25 +5,6 @@ authors:Sandro Ronco, hap --> - - - - - @@ -395,7 +376,8 @@ authors:Sandro Ronco, hap - + + diff --git a/src/mame/layout/mephisto_mm2.lay b/src/mame/layout/mephisto_mm2.lay index 7c4e6dd8aa399..ab744519f2e51 100644 --- a/src/mame/layout/mephisto_mm2.lay +++ b/src/mame/layout/mephisto_mm2.lay @@ -6,25 +6,6 @@ thanks-to:Franz Huber --> - - - - - @@ -539,9 +520,10 @@ thanks-to:Franz Huber - - + + + diff --git a/src/mame/layout/mephisto_mm5.lay b/src/mame/layout/mephisto_mm5.lay index 6eeb09d9991d6..4d5c28178cbd7 100644 --- a/src/mame/layout/mephisto_mm5.lay +++ b/src/mame/layout/mephisto_mm5.lay @@ -8,25 +8,6 @@ thanks-to:Franz Huber - - - - - @@ -535,9 +516,10 @@ thanks-to:Franz Huber - - + + + diff --git a/src/mame/layout/mephisto_modena.lay b/src/mame/layout/mephisto_modena.lay index 88e6fa6b8d502..84729455b7f77 100644 --- a/src/mame/layout/mephisto_modena.lay +++ b/src/mame/layout/mephisto_modena.lay @@ -5,25 +5,6 @@ authors:Sandro Ronco, hap --> - - - - - @@ -421,7 +402,8 @@ authors:Sandro Ronco, hap - + + diff --git a/src/mame/layout/mephisto_mondial68k.lay b/src/mame/layout/mephisto_mondial68k.lay index 087ddb5cca1f7..8e353cd16d1f0 100644 --- a/src/mame/layout/mephisto_mondial68k.lay +++ b/src/mame/layout/mephisto_mondial68k.lay @@ -5,25 +5,6 @@ authors:Sandro Ronco, hap --> - - - - - @@ -423,7 +404,8 @@ authors:Sandro Ronco, hap - + + diff --git a/src/mame/layout/mephisto_montreal.lay b/src/mame/layout/mephisto_montreal.lay index 53ed84ed53396..01cc73fdad00c 100644 --- a/src/mame/layout/mephisto_montreal.lay +++ b/src/mame/layout/mephisto_montreal.lay @@ -6,25 +6,6 @@ thanks-to:Franz Huber --> - - - - - @@ -513,7 +494,8 @@ thanks-to:Franz Huber - + + diff --git a/src/mame/layout/mephisto_polgar.lay b/src/mame/layout/mephisto_polgar.lay index 042a313901150..a504c89703187 100644 --- a/src/mame/layout/mephisto_polgar.lay +++ b/src/mame/layout/mephisto_polgar.lay @@ -5,27 +5,6 @@ authors:Sandro Ronco, hap --> - - - - - - - @@ -426,7 +405,8 @@ authors:Sandro Ronco, hap - + + diff --git a/src/mame/layout/mephisto_risc.lay b/src/mame/layout/mephisto_risc.lay index 6dc4d60a7e8a7..32c8ed8503ff0 100644 --- a/src/mame/layout/mephisto_risc.lay +++ b/src/mame/layout/mephisto_risc.lay @@ -5,27 +5,6 @@ authors:Sandro Ronco, hap --> - - - - - - - @@ -426,7 +405,8 @@ authors:Sandro Ronco, hap - + + diff --git a/src/mame/layout/mephisto_roma2.lay b/src/mame/layout/mephisto_roma2.lay index 03df135b1d83c..2c0877246ccf3 100644 --- a/src/mame/layout/mephisto_roma2.lay +++ b/src/mame/layout/mephisto_roma2.lay @@ -6,25 +6,6 @@ thanks-to:Franz Huber --> - - - - - @@ -512,9 +493,10 @@ thanks-to:Franz Huber - - + + + diff --git a/src/mame/layout/mephisto_schachak.lay b/src/mame/layout/mephisto_schachak.lay index ebae19c21104f..b6782b5c89a62 100644 --- a/src/mame/layout/mephisto_schachak.lay +++ b/src/mame/layout/mephisto_schachak.lay @@ -5,25 +5,6 @@ authors:hap --> - - - - - @@ -413,7 +394,9 @@ authors:hap - + + + diff --git a/src/mame/layout/saitek_chessac.lay b/src/mame/layout/saitek_chessac.lay index 86e4b2591112d..54fa4c979e741 100644 --- a/src/mame/layout/saitek_chessac.lay +++ b/src/mame/layout/saitek_chessac.lay @@ -5,25 +5,6 @@ authors:hap --> - - - - - @@ -426,7 +407,9 @@ authors:hap - + + + diff --git a/src/mame/saitek/chessac.cpp b/src/mame/saitek/chessac.cpp index 6f36e434dc629..f13082e43f64f 100644 --- a/src/mame/saitek/chessac.cpp +++ b/src/mame/saitek/chessac.cpp @@ -316,9 +316,6 @@ static INPUT_PORTS_START( chessac ) PORT_START("IN.2") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CHANGED_MEMBER(DEVICE_SELF, chessac_state, go_button, 0) PORT_NAME("Go / Stop") PORT_BIT(0xef, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("CLICKABLE") // helper for clickable artwork - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) INPUT_PORTS_END From cb8b90cd389ca928ffade1d8384893fdde87d4d1 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 12 Apr 2024 05:14:23 +1000 Subject: [PATCH 064/109] konami/twinkle.cpp: Migrated to "new SCSI". Also removed legacy am53cf96.cpp SCSI bus host controller device. --- scripts/src/machine.lua | 12 -- src/devices/machine/am53cf96.cpp | 191 --------------------------- src/devices/machine/am53cf96.h | 71 ---------- src/mame/konami/twinkle.cpp | 214 +++++++++++++++---------------- 4 files changed, 105 insertions(+), 383 deletions(-) delete mode 100644 src/devices/machine/am53cf96.cpp delete mode 100644 src/devices/machine/am53cf96.h diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index eaa6cf4f097a2..e302cd20d1ae4 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -774,18 +774,6 @@ if (MACHINES["AM2910"]~=null) then } end ---------------------------------------------------- --- ---@src/devices/machine/am53cf96.h,MACHINES["AM53CF96"] = true ---------------------------------------------------- - -if (MACHINES["AM53CF96"]~=null) then - files { - MAME_DIR .. "src/devices/machine/am53cf96.cpp", - MAME_DIR .. "src/devices/machine/am53cf96.h", - } -end - --------------------------------------------------- -- --@src/devices/machine/am79c30.h,MACHINES["AM79C30"] = true diff --git a/src/devices/machine/am53cf96.cpp b/src/devices/machine/am53cf96.cpp deleted file mode 100644 index 4e36f028b527f..0000000000000 --- a/src/devices/machine/am53cf96.cpp +++ /dev/null @@ -1,191 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:smf -/* - * am53cf96.c - * - * AMD/NCR/Symbios 53CF96 SCSI-2 controller. - * Qlogic FAS-236 and Emulex ESP-236 are equivalents - * - * References: - * AMD Am53CF96 manual - * - */ - -#include "emu.h" -#include "am53cf96.h" -#include "bus/scsi/scsihle.h" - -uint8_t am53cf96_device::read(offs_t offset) -{ - static constexpr int states[] = { 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 0 }; - - if (offset == REG_STATUS) - { - scsi_regs[REG_STATUS] &= ~0x7; - scsi_regs[REG_STATUS] |= states[xfer_state]; - if (xfer_state < 10) - { - xfer_state++; - } - } - - int rv = scsi_regs[offset]; - - if (offset == REG_FIFO) - { -// logerror("53cf96: read FIFO %s\n", machine().describe_context()); - return 0; - } - -// logerror("53cf96: read reg %d = %x %s\n", reg, rv>>shift, machine().describe_context()); - - if (offset == REG_IRQSTATE) - { - scsi_regs[REG_STATUS] &= ~0x80; // clear IRQ flag - } - - return rv; -} - -TIMER_CALLBACK_MEMBER(am53cf96_device::irq_timer_tick) -{ - scsi_regs[REG_IRQSTATE] = 8; // indicate success - scsi_regs[REG_STATUS] |= 0x80; // indicate IRQ - m_irq_handler(1); -} - -void am53cf96_device::write(offs_t offset, uint8_t data) -{ -// logerror("53cf96: w %x to reg %d %s\n", data, offset, machine().describe_context()); - - // if writing to the target ID, cache it off for later - if (offset == REG_STATUS) - { - last_id = data; - } - - if (offset == REG_XFERCNTLOW || offset == REG_XFERCNTMID || offset == REG_XFERCNTHI) - { - scsi_regs[REG_STATUS] &= ~0x10; // clear CTZ bit - } - - // FIFO - if (offset == REG_FIFO) - { -// osd_printf_debug("%02x to FIFO @ %02d\n", data, fptr); - fifo[fptr++] = data; - if (fptr > 15) - { - fptr = 15; - } - } - - // command - if (offset == REG_COMMAND) - { - //dma = (data & 0x80) ? 1 : 0; - fptr = 0; - switch (data & 0x7f) - { - case 0: // NOP - scsi_regs[REG_IRQSTATE] = 8; // indicate success - xfer_state = 0; - break; - case 2: // reset am53cf96 - scsi_regs[REG_IRQSTATE] = 8; // indicate success - - logerror("53cf96: reset target ID = %d %s\n", last_id, machine().describe_context()); - - xfer_state = 0; - break; - case 3: // reset SCSI bus - scsi_regs[REG_INTSTATE] = 4; // command sent OK - - reset_bus(); - - xfer_state = 0; - m_transfer_timer->adjust( attotime::from_hz( 16384 ) ); - break; - case 0x42: // select with ATN steps - m_transfer_timer->adjust( attotime::from_hz( 16384 ) ); - if ((fifo[1] == 0) || (fifo[1] == 0x48) || (fifo[1] == 0x4b)) - { - scsi_regs[REG_INTSTATE] = 6; - } - else - { - scsi_regs[REG_INTSTATE] = 4; - } - - logerror("53cf96: command %x exec. target ID = %d %s\n", fifo[1], last_id, machine().describe_context()); - - select(last_id); - send_command(&fifo[1], 12); - xfer_state = 0; - break; - case 0x44: // enable selection/reselection - xfer_state = 0; - break; - case 0x10: // information transfer (must not change xfer_state) - case 0x11: // second phase of information transfer - case 0x12: // message accepted - m_transfer_timer->adjust( attotime::from_hz( 16384 ) ); - scsi_regs[REG_INTSTATE] = 6; // command sent OK - break; - default: - printf( "unsupported command %02x\n", data ); - break; - } - } - - // only update the register mirror if it's not a write-only reg - if (offset != REG_STATUS && offset != REG_INTSTATE && offset != REG_IRQSTATE && offset != REG_FIFOSTATE) - { - scsi_regs[offset] = data; - } -} - -am53cf96_device::am53cf96_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - legacy_scsi_host_adapter(mconfig, AM53CF96, tag, owner, clock), - m_irq_handler(*this) -{ -} - -void am53cf96_device::device_start() -{ - legacy_scsi_host_adapter::device_start(); - - memset(scsi_regs, 0, sizeof(scsi_regs)); - - fptr = 0; - xfer_state = 0; - last_id = -1; - - save_item(NAME(scsi_regs)); - save_item(NAME(fifo)); - save_item(NAME(fptr)); - save_item(NAME(xfer_state)); - save_item(NAME(last_id)); - - m_transfer_timer = timer_alloc(FUNC(am53cf96_device::irq_timer_tick), this); -} - -// retrieve data from the SCSI controller -void am53cf96_device::dma_read_data(int bytes, uint8_t *pData) -{ - scsi_regs[REG_STATUS] |= 0x10; // indicate DMA finished - - read_data(pData, bytes); -} - -// write data to the SCSI controller -void am53cf96_device::dma_write_data(int bytes, uint8_t *pData) -{ -// int i; - - scsi_regs[REG_STATUS] |= 0x10; // indicate DMA finished - - write_data(pData, bytes); -} - -DEFINE_DEVICE_TYPE(AM53CF96, am53cf96_device, "am53cf96", "AMD 53CF96 SCSI") diff --git a/src/devices/machine/am53cf96.h b/src/devices/machine/am53cf96.h deleted file mode 100644 index 6fdd801f6df46..0000000000000 --- a/src/devices/machine/am53cf96.h +++ /dev/null @@ -1,71 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:smf -/* - * am53cf96.h - * - */ - -#ifndef MAME_MACHINE_AM53CF96_H -#define MAME_MACHINE_AM53CF96_H - -#pragma once - -#include "legscsi.h" - -class am53cf96_device : public legacy_scsi_host_adapter -{ -public: - // construction/destruction - am53cf96_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - auto irq_handler() { return m_irq_handler.bind(); } - - uint8_t read(offs_t offset); - void write(offs_t offset, uint8_t data); - - void dma_read_data(int bytes, uint8_t *pData); - void dma_write_data(int bytes, uint8_t *pData); - -protected: - // 53CF96 register set - enum - { - REG_XFERCNTLOW = 0, // read = current xfer count lo byte, write = set xfer count lo byte - REG_XFERCNTMID, // read = current xfer count mid byte, write = set xfer count mid byte - REG_FIFO, // read/write = FIFO - REG_COMMAND, // read/write = command - - REG_STATUS, // read = status, write = destination SCSI ID (4) - REG_IRQSTATE, // read = IRQ status, write = timeout (5) - REG_INTSTATE, // read = internal state, write = sync xfer period (6) - REG_FIFOSTATE, // read = FIFO status, write = sync offset - REG_CTRL1, // read/write = control 1 - REG_CLOCKFCTR, // clock factor (write only) - REG_TESTMODE, // test mode (write only) - REG_CTRL2, // read/write = control 2 - REG_CTRL3, // read/write = control 3 - REG_CTRL4, // read/write = control 4 - REG_XFERCNTHI, // read = current xfer count hi byte, write = set xfer count hi byte - REG_DATAALIGN // data alignment (write only) - }; - - // device-level overrides - virtual void device_start() override; - - TIMER_CALLBACK_MEMBER(irq_timer_tick); - -private: - uint8_t scsi_regs[32]; - uint8_t fifo[16]; - uint8_t fptr; - uint8_t xfer_state; - uint8_t last_id; - - emu_timer* m_transfer_timer; - devcb_write_line m_irq_handler; -}; - -// device type definition -DECLARE_DEVICE_TYPE(AM53CF96, am53cf96_device) - -#endif // MAME_MACHINE_AM53CF96_H diff --git a/src/mame/konami/twinkle.cpp b/src/mame/konami/twinkle.cpp index 0a876feeab2a3..cf91266a77f71 100644 --- a/src/mame/konami/twinkle.cpp +++ b/src/mame/konami/twinkle.cpp @@ -259,27 +259,30 @@ GQ863 PWB(A2)0000057606 */ #include "emu.h" -#include "cpu/psx/psx.h" -#include "cpu/m68000/m68000.h" -#include "video/psx.h" + #include "bus/ata/ataintf.h" -#include "bus/scsi/scsi.h" -#include "bus/scsi/scsicd.h" +#include "bus/nscsi/cd.h" #include "bus/rs232/xvd701.h" -#include "machine/am53cf96.h" +#include "cpu/m68000/m68000.h" +#include "cpu/psx/psx.h" #include "machine/fdc37c665gt.h" #include "machine/i2cmem.h" #include "machine/mb8421.h" +#include "machine/ncr53c90.h" #include "machine/ram.h" #include "machine/rtc65271.h" #include "machine/watchdog.h" #include "machine/x76f041.h" -#include "sound/spu.h" #include "sound/cdda.h" #include "sound/rf5c400.h" +#include "sound/spu.h" +#include "video/psx.h" + #include "screen.h" #include "speaker.h" +#include "endianness.h" + #include "bmiidx.lh" @@ -292,7 +295,7 @@ class twinkle_state : public driver_device driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_am53cf96(*this, "am53cf96"), + m_ncr53cf96(*this, "scsi:7:ncr53cf96"), m_ata(*this, "ata"), m_dpram(*this, "dpram"), m_waveram(*this, "rfsnd"), @@ -323,6 +326,7 @@ class twinkle_state : public driver_device private: virtual void machine_start() override; + virtual void machine_reset() override; void twinkle_io_w(offs_t offset, uint8_t data); uint8_t twinkle_io_r(offs_t offset); @@ -341,14 +345,17 @@ class twinkle_state : public driver_device void spu_ata_dmarq(int state); void scsi_dma_read(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size); void scsi_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size); + void scsi_drq(int state); void main_map(address_map &map); void rf5c400_map(address_map &map); void sound_map(address_map &map); + TIMER_CALLBACK_MEMBER(scsi_dma_transfer); + required_device m_maincpu; required_device m_audiocpu; - required_device m_am53cf96; + required_device m_ncr53cf96; required_device m_ata; required_device m_dpram; required_shared_ptr m_waveram; @@ -367,14 +374,21 @@ class twinkle_state : public driver_device output_finder<> m_neon_lamp; output_finder<4> m_unknown_outputs; + emu_timer *m_dma_timer = nullptr; + uint16_t m_spu_ctrl = 0; // SPU board control register uint32_t m_spu_ata_dma = 0; int m_spu_ata_dmarq = 0; uint32_t m_wave_bank = 0; + uint32_t *m_dma_data_ptr = nullptr; + uint32_t m_dma_offset = 0; + int32_t m_dma_size = 0; + bool m_dma_is_write = false; + bool m_dma_requested = false; + int m_io_offset = 0; int m_output_last[ 0x100 ]{}; - uint8_t m_sector_buffer[ 4096 ]{}; int m_serial_shift = 0; int m_serial_bits = 0; @@ -385,8 +399,6 @@ class twinkle_state : public driver_device int m_output_bits = 0; int m_output_cs = 0; int m_output_clock = 0; - - static void cdrom_config(device_t *device); }; #define LED_A1 0x0001 @@ -555,6 +567,8 @@ static const uint16_t asciicharset[]= void twinkle_state::machine_start() { + m_dma_timer = timer_alloc(FUNC(twinkle_state::scsi_dma_transfer), this); + m_led_displays.resolve(); m_spotlights.resolve(); m_main_leds.resolve(); @@ -572,9 +586,13 @@ void twinkle_state::machine_start() save_item(NAME(m_spu_ata_dmarq)); save_item(NAME(m_wave_bank)); + save_item(NAME(m_dma_offset)); + save_item(NAME(m_dma_size)); + save_item(NAME(m_dma_is_write)); + save_item(NAME(m_dma_requested)); + save_item(NAME(m_io_offset)); save_item(NAME(m_output_last)); - save_item(NAME(m_sector_buffer)); save_item(NAME(m_serial_shift)); save_item(NAME(m_serial_bits)); @@ -587,6 +605,16 @@ void twinkle_state::machine_start() save_item(NAME(m_output_clock)); } +void twinkle_state::machine_reset() +{ + m_dma_timer->adjust(attotime::never); + m_dma_data_ptr = nullptr; + m_dma_offset = 0; + m_dma_size = 0; + m_dma_requested = m_dma_is_write = false; +} + + void twinkle_state::twinkle_io_w(offs_t offset, uint8_t data) { switch( offset ) @@ -898,7 +926,7 @@ void twinkle_state::serial_w(uint16_t data) void twinkle_state::main_map(address_map &map) { map(0x1f000000, 0x1f0007ff).rw(m_dpram, FUNC(cy7c131_device::right_r), FUNC(cy7c131_device::right_w)).umask32(0x00ff00ff); - map(0x1f200000, 0x1f20001f).rw(m_am53cf96, FUNC(am53cf96_device::read), FUNC(am53cf96_device::write)).umask32(0x00ff00ff); + map(0x1f200000, 0x1f20001f).m(m_ncr53cf96, FUNC(ncr53cf96_device::map)).umask16(0x00ff); map(0x1f20a01c, 0x1f20a01f).nopw(); /* scsi? */ map(0x1f210000, 0x1f2107ff).rw("fdc37c665gt", FUNC(fdc37c665gt_device::read), FUNC(fdc37c665gt_device::write)).umask32(0x00ff00ff); map(0x1f218000, 0x1f218000).w("watchdog", FUNC(watchdog_timer_device::reset_w)); /* LTC1232 */ @@ -1052,91 +1080,52 @@ void twinkle_state::rf5c400_map(address_map &map) map(0x0000000, 0x1ffffff).ram().share("rfsnd"); } -/* SCSI */ +// SCSI -void twinkle_state::scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ) +void twinkle_state::scsi_dma_read(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size) { - int i; - int n_this; - - while( n_size > 0 ) - { - if( n_size > sizeof( m_sector_buffer ) / 4 ) - { - n_this = sizeof( m_sector_buffer ) / 4; - } - else - { - n_this = n_size; - } - if( n_this < 2048 / 4 ) - { - /* non-READ commands */ - m_am53cf96->dma_read_data( n_this * 4, m_sector_buffer ); - } - else - { - /* assume normal 2048 byte data for now */ - m_am53cf96->dma_read_data( 2048, m_sector_buffer ); - n_this = 2048 / 4; - } - n_size -= n_this; - - i = 0; - while( n_this > 0 ) - { - p_n_psxram[ n_address / 4 ] = - ( m_sector_buffer[ i + 0 ] << 0 ) | - ( m_sector_buffer[ i + 1 ] << 8 ) | - ( m_sector_buffer[ i + 2 ] << 16 ) | - ( m_sector_buffer[ i + 3 ] << 24 ); - n_address += 4; - i += 4; - n_this--; - } - } + m_dma_data_ptr = p_n_psxram; + m_dma_offset = n_address; + m_dma_size = n_size * 4; + m_dma_is_write = false; + m_dma_timer->adjust(attotime::from_usec(10)); } -void twinkle_state::scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size ) +void twinkle_state::scsi_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size) { - int i; - int n_this; + m_dma_data_ptr = p_n_psxram; + m_dma_offset = n_address; + m_dma_size = n_size * 4; + m_dma_is_write = true; + m_dma_timer->adjust(attotime::from_usec(10)); +} - while( n_size > 0 ) +TIMER_CALLBACK_MEMBER(twinkle_state::scsi_dma_transfer) +{ + if (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0) { - if( n_size > sizeof( m_sector_buffer ) / 4 ) - { - n_this = sizeof( m_sector_buffer ) / 4; - } + if (m_dma_is_write) + m_ncr53cf96->dma_w(util::little_endian_cast(m_dma_data_ptr)[m_dma_offset]); else - { - n_this = n_size; - } - n_size -= n_this; + util::little_endian_cast(m_dma_data_ptr)[m_dma_offset] = m_ncr53cf96->dma_r(); - i = 0; - while( n_this > 0 ) - { - m_sector_buffer[ i + 0 ] = ( p_n_psxram[ n_address / 4 ] >> 0 ) & 0xff; - m_sector_buffer[ i + 1 ] = ( p_n_psxram[ n_address / 4 ] >> 8 ) & 0xff; - m_sector_buffer[ i + 2 ] = ( p_n_psxram[ n_address / 4 ] >> 16 ) & 0xff; - m_sector_buffer[ i + 3 ] = ( p_n_psxram[ n_address / 4 ] >> 24 ) & 0xff; - n_address += 4; - i += 4; - n_this--; - } - - m_am53cf96->dma_write_data( n_this * 4, m_sector_buffer ); + m_dma_offset++; + m_dma_size--; } -} + if (m_dma_requested && m_dma_size > 0) + m_dma_timer->adjust(attotime::from_usec(10)); +} -void twinkle_state::cdrom_config(device_t *device) +void twinkle_state::scsi_drq(int state) { - device->subdevice("cdda")->add_route(0, "^^speakerleft", 1.0); - device->subdevice("cdda")->add_route(1, "^^speakerright", 1.0); + if (!m_dma_requested && state) + m_dma_timer->adjust(attotime::from_usec(10)); + + m_dma_requested = state; } + void twinkle_state::twinkle(machine_config &config) { /* basic machine hardware */ @@ -1155,13 +1144,20 @@ void twinkle_state::twinkle(machine_config &config) CY7C131(config, m_dpram); // or IDT7130 at some PCBs m_dpram->intl_callback().set_inputline(m_audiocpu, M68K_IRQ_4); - scsi_port_device &scsi(SCSI_PORT(config, "scsi", 0)); - scsi.set_slot_device(1, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4)); - scsi.slot(1).set_option_machine_config("cdrom", cdrom_config); - - AM53CF96(config, m_am53cf96, 0); - m_am53cf96->set_scsi_port("scsi"); - m_am53cf96->irq_handler().set("maincpu:irq", FUNC(psxirq_device::intin10)); + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:4").option_set("cdrom", NSCSI_XM5401).machine_config( + [](device_t *device) + { + device->subdevice("cdda")->add_route(0, "^^speakerleft", 1.0); + device->subdevice("cdda")->add_route(1, "^^speakerright", 1.0); + }); + NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr53cf96", NCR53CF96).clock(32_MHz_XTAL/2).machine_config( + [this](device_t *device) + { + ncr53cf96_device &adapter = downcast(*device); + adapter.irq_handler_cb().set(":maincpu:irq", FUNC(psxirq_device::intin10)); + adapter.drq_handler_cb().set(*this, FUNC(twinkle_state::scsi_drq)); + }); ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, true); m_ata->irq_handler().set(FUNC(twinkle_state::spu_ata_irq)); @@ -1371,7 +1367,7 @@ ROM_START( bmiidx ) ROM_REGION( 0x224, "security", 0 ) ROM_LOAD( "863a02", 0x000000, 0x000224, BAD_DUMP CRC(078be99f) SHA1(7def88d18a9250a8e4b54a51bf663161676cd9be) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) // program + DISK_REGION( "scsi:4:cdrom" ) // program DISK_IMAGE_READONLY( "gq863-jab01", 0, SHA1(331f80b40ed560c7e017621b7daeeb8275d92b9a) ) DISK_REGION( "cdrom1" ) // video CD @@ -1387,7 +1383,7 @@ ROM_START( bmiidxa ) ROM_REGION( 0x224, "security", 0 ) ROM_LOAD( "863a02", 0x000000, 0x000224, BAD_DUMP CRC(078be99f) SHA1(7def88d18a9250a8e4b54a51bf663161676cd9be) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) // program + DISK_REGION( "scsi:4:cdrom" ) // program DISK_IMAGE_READONLY( "gq863a01", 0, SHA1(07fc467f6500504729becbaf77dabc093a134e65) ) DISK_REGION( "cdrom1" ) // video CD @@ -1403,7 +1399,7 @@ ROM_START( bmiidx2 ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "985a02", 0x000000, 0x000100, CRC(059c1f99) SHA1(f094a12c9a56d351667746a765804c94cb3f96bb) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "gc985a01", 0, SHA1(0b783f11317f64552ebf3323459139529e7f315f) ) DISK_REGION( "cdrom1" ) // video CD @@ -1419,7 +1415,7 @@ ROM_START( bmiidx3 ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "992a02", 0x000000, 0x000100, CRC(92520992) SHA1(c4a47dd0e805807df0f086fd9602c000fe2baa61) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "gc992-jac01", 0, SHA1(c02d6e58439be678ec0d7171eae2dfd53a21acc7) ) DISK_REGION( "cdrom1" ) // video CD @@ -1435,7 +1431,7 @@ ROM_START( bmiidx3b ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "992a02", 0x000000, 0x000100, CRC(92520992) SHA1(c4a47dd0e805807df0f086fd9602c000fe2baa61) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "gc992-jab01", 0, SHA1(7a5bc08e5723c2705fb7954a8bb727f96514ec2e) ) DISK_REGION( "cdrom1" ) // video CD @@ -1451,7 +1447,7 @@ ROM_START( bmiidx3a ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "992a02", 0x000000, 0x000100, CRC(92520992) SHA1(c4a47dd0e805807df0f086fd9602c000fe2baa61) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "gc992-jaa01", 0, SHA1(d86dab5c8130859e73a3e2936b7fd6231e1c025d) ) DISK_REGION( "cdrom1" ) // video CD @@ -1467,7 +1463,7 @@ ROM_START( bmiidx4 ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "a03", 0x000000, 0x000100, CRC(9ccf71f9) SHA1(01c4060ac6e2cdc156c034797ea2e305cbbc31ef) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "a03jaa01", 0, SHA1(f54fc778c2187ccd950402a159babef956b71492) ) DISK_REGION( "cdrom1" ) // video CD @@ -1483,7 +1479,7 @@ ROM_START( bmiidx5 ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "a17", 0x000000, 0x000100, CRC(70ae9983) SHA1(de0b9ce8ca09e794a35722737958fa7ee6eef6ce) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "a17jaa01", 0, SHA1(5ac46973b42b2c66ae63297d1a7fd69b33ef4d1d) ) DISK_REGION( "cdrom1" ) // video CD @@ -1499,7 +1495,7 @@ ROM_START( bmiidx6 ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "b4u", 0x000000, 0x000100, CRC(5c134715) SHA1(2bc40388c5e2d54e99e9fdfd63216820b5c939c0) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "b4ujab01", 0, SHA1(aaae77f473c4a44ce6838da3ef6dab27e4afa0e4) ) DISK_REGION( "cdrom1" ) // DVD @@ -1515,7 +1511,7 @@ ROM_START( bmiidx6a ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "b4u", 0x000000, 0x000100, CRC(5c134715) SHA1(2bc40388c5e2d54e99e9fdfd63216820b5c939c0) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "b4ujaa01", 0, SHA1(22589f2a2b421e910d8dc3d98b375d7939a94921) ) DISK_REGION( "cdrom1" ) // DVD @@ -1531,7 +1527,7 @@ ROM_START( bmiidx7 ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "b44", 0x000000, 0x000100, CRC(fb6aaa40) SHA1(7a93a8b69d71c2e448d176a6a9d175a01bd8a5f1) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "b44jab01", 0, SHA1(f04411b2c7a671dc9544635b187db7a5f3eae6aa) ) DISK_REGION( "cdrom1" ) // DVD @@ -1547,7 +1543,7 @@ ROM_START( bmiidx7a ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "b44", 0x000000, 0x000100, CRC(fb6aaa40) SHA1(7a93a8b69d71c2e448d176a6a9d175a01bd8a5f1) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "b44jaa01", 0, SHA1(57fb0312d8102e959658e48a97e46aa16e592b60) ) DISK_REGION( "cdrom1" ) // DVD @@ -1563,7 +1559,7 @@ ROM_START( bmiidx8 ) ROM_REGION( 0x100, "security", 0 ) ROM_LOAD( "c44", 0x000000, 0x000100, CRC(3afc8048) SHA1(36cf01288a5ca4f03060de44a89472650e9f8dcc) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "c44jaa01", 0, SHA1(dd2aeb925182ed75ade510ca3a0f913d667a2be2) ) DISK_REGION( "cdrom1" ) // DVD @@ -1579,7 +1575,7 @@ ROM_START( bmiidxc ) ROM_REGION( 0x224, "security", 0 ) ROM_LOAD( "863a02", 0x000000, 0x000224, BAD_DUMP CRC(078be99f) SHA1(7def88d18a9250a8e4b54a51bf663161676cd9be) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "896jabbm", 0, SHA1(09fb638bc5b3e64af13ae3df66ba25e490440946) ) DISK_REGION( "cdrom1" ) // video CD, same as bmiidx @@ -1595,7 +1591,7 @@ ROM_START( bmiidxca ) ROM_REGION( 0x224, "security", 0 ) ROM_LOAD( "863a02", 0x000000, 0x000224, BAD_DUMP CRC(078be99f) SHA1(7def88d18a9250a8e4b54a51bf663161676cd9be) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "896jaabm", 0, SHA1(ea7205f86543d9273efcc226666ab530c32b23c1) ) DISK_REGION( "cdrom1" ) // video CD, same as bmiidx @@ -1611,7 +1607,7 @@ ROM_START( bmiidxs ) ROM_REGION( 0x224, "security", 0 ) ROM_LOAD( "983a02", 0x000000, 0x000224, BAD_DUMP CRC(6a6ace82) SHA1(1e1373f40c469c117316c03db414d9984567dd42) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "gc983a01", 0, SHA1(7a80380f9c18c7da9643e0b9954ad8367eda5948) ) DISK_REGION( "cdrom1" ) // video CD @@ -1627,7 +1623,7 @@ ROM_START( bmiidxsa ) ROM_REGION( 0x224, "security", 0 ) ROM_LOAD( "983aa02", 0x000000, 0x000224, BAD_DUMP CRC(bcc8965c) SHA1(e152d19a92544212e321a332c6e6678d623dab21) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "gc983aa,a01", 0, SHA1(9ef5725fc79a7f4f524ef93849af42b2758102cd) ) DISK_REGION( "cdrom1" ) // video CD @@ -1643,7 +1639,7 @@ ROM_START( bmiidxc2 ) ROM_REGION( 0x224, "security", 0 ) ROM_LOAD( "984a02", 0x000000, 0x000224, BAD_DUMP CRC(786db814) SHA1(722c709d95d54cd519856ddea64b9176ef191b0d) ) - DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "scsi:4:cdrom" ) DISK_IMAGE_READONLY( "ge984a01,bm", 0, SHA1(03b083ba09652dfab6f328000c3c9de2a7a4e618) ) DISK_REGION( "cdrom1" ) // video CD, same as bmiidxs From 202c33d5e4c3a99f4c1950e2f62f2d81bd44e5aa Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 11 Apr 2024 22:30:50 +0200 Subject: [PATCH 065/109] ds8874: move to video folder (led driver chip), misc: remove folder from self #include --- scripts/src/machine.lua | 12 ------------ scripts/src/video.lua | 12 ++++++++++++ src/devices/machine/7200fifo.cpp | 2 +- src/devices/machine/74123.cpp | 3 ++- src/devices/machine/74148.cpp | 2 +- src/devices/machine/8042kbdc.cpp | 2 +- src/devices/machine/aicartc.cpp | 2 +- src/devices/machine/am9513.cpp | 2 +- src/devices/machine/am9519.cpp | 2 +- src/devices/machine/at.cpp | 4 +++- src/devices/machine/at28c16.cpp | 2 +- src/devices/machine/at28c64b.cpp | 2 +- src/devices/machine/bl_handhelds_menucontrol.cpp | 2 +- src/devices/machine/ch376.cpp | 2 +- src/devices/machine/chessmachine.cpp | 2 +- src/devices/machine/corvushd.cpp | 2 +- src/devices/machine/cs4031.cpp | 2 +- src/devices/machine/cs8221.cpp | 3 ++- src/devices/machine/cs8900a.cpp | 3 +-- src/devices/machine/cxd1095.cpp | 2 +- src/devices/machine/dp8573a.cpp | 2 +- src/devices/machine/ds1994.cpp | 2 +- src/devices/machine/ds2401.cpp | 2 +- src/devices/machine/eeprom.cpp | 2 +- src/devices/machine/eeprompar.cpp | 2 +- src/devices/machine/eepromser.cpp | 2 +- src/devices/machine/er1400.cpp | 2 +- src/devices/machine/er2055.cpp | 2 +- src/devices/machine/exorterm.cpp | 3 ++- src/devices/machine/f4702.cpp | 2 +- src/devices/machine/fdc37c665gt.cpp | 2 +- src/devices/machine/fdc37c93x.cpp | 2 +- src/devices/machine/genpc.cpp | 3 +-- src/devices/machine/i2cmem.cpp | 2 +- src/devices/machine/ie15.cpp | 2 +- src/devices/machine/ie15_kbd.cpp | 2 +- src/devices/machine/ins8250.cpp | 2 +- src/devices/machine/it8705f.cpp | 2 +- src/devices/machine/ldp1000.cpp | 2 +- src/devices/machine/ldp1450.cpp | 2 +- src/devices/machine/lpci.cpp | 4 ++-- src/devices/machine/m6m80011ap.cpp | 3 +-- src/devices/machine/mb14241.cpp | 2 +- src/devices/machine/mb8421.cpp | 2 +- src/devices/machine/mb87078.cpp | 2 +- src/devices/machine/mb89363b.cpp | 2 +- src/devices/machine/mc146818.cpp | 2 +- src/devices/machine/mc68328.cpp | 2 +- src/devices/machine/mm58174.cpp | 2 +- src/devices/machine/mm58274c.cpp | 2 +- src/devices/machine/mpu401.cpp | 3 ++- src/devices/machine/msm5001n.cpp | 2 +- src/devices/machine/msm6242.cpp | 2 +- src/devices/machine/msm6253.cpp | 2 +- src/devices/machine/nvram.cpp | 2 +- src/devices/machine/pc87306.cpp | 4 ++-- src/devices/machine/pc_fdc.cpp | 3 ++- src/devices/machine/pic8259.cpp | 2 +- src/devices/machine/pit8253.cpp | 2 +- src/devices/machine/r10696.cpp | 2 +- src/devices/machine/r10788.cpp | 2 +- src/devices/machine/ra17xx.cpp | 2 +- src/devices/machine/ripple_counter.cpp | 2 +- src/devices/machine/rp5h01.cpp | 2 +- src/devices/machine/rstbuf.cpp | 2 +- src/devices/machine/rtc9701.cpp | 2 +- src/devices/machine/s2636.cpp | 2 +- src/devices/machine/s3520cf.cpp | 3 +-- src/devices/machine/s3c2400.cpp | 2 +- src/devices/machine/s3c2410.cpp | 2 +- src/devices/machine/s3c2440.cpp | 2 +- src/devices/machine/s3c44b0.cpp | 2 +- src/devices/machine/scc66470.cpp | 1 + src/devices/machine/scc68070.cpp | 2 +- src/devices/machine/sda2006.cpp | 2 +- src/devices/machine/sensorboard.cpp | 2 +- src/devices/machine/smpc.cpp | 2 +- src/devices/machine/stvcd.cpp | 2 +- src/devices/machine/swtpc8212.cpp | 4 +++- src/devices/machine/tc009xlvc.cpp | 2 +- src/devices/machine/te7750.cpp | 2 +- src/devices/machine/terminal.cpp | 3 ++- src/devices/machine/ticket.cpp | 4 ++-- src/devices/machine/timekpr.cpp | 3 ++- src/devices/machine/timer.cpp | 2 +- src/devices/machine/tmc0999.cpp | 2 +- src/devices/machine/tms1024.cpp | 5 ++--- src/devices/machine/tube.cpp | 2 +- src/devices/machine/upc82c710.cpp | 2 +- src/devices/machine/upc82c711.cpp | 2 +- src/devices/machine/upd4991a.cpp | 2 +- src/devices/machine/upd4992.cpp | 3 +-- src/devices/machine/upd71071.cpp | 2 +- src/devices/machine/v3021.cpp | 2 +- src/devices/machine/vic_pl192.cpp | 2 +- src/devices/machine/w83787f.cpp | 3 +-- src/devices/machine/w83977tf.cpp | 2 +- src/devices/machine/wd1000.cpp | 2 +- src/devices/machine/wd11c00_17.cpp | 2 +- src/devices/machine/wd2010.cpp | 2 +- src/devices/machine/wd7600.cpp | 2 +- src/devices/machine/x2201.cpp | 2 +- src/devices/machine/x2212.cpp | 2 +- src/devices/machine/x76f041.cpp | 2 +- src/devices/machine/x76f100.cpp | 2 +- src/devices/sound/ad1848.cpp | 2 +- src/devices/sound/beep.cpp | 2 +- src/devices/sound/esqpump.cpp | 2 +- src/devices/sound/k056800.cpp | 4 +--- src/devices/sound/mos6560.cpp | 2 +- src/devices/sound/nes_apu_vt.cpp | 2 +- src/devices/sound/spkrdev.cpp | 2 +- src/devices/sound/uda1344.cpp | 2 +- src/devices/sound/upd7752.cpp | 3 +-- src/devices/sound/vgm_visualizer.cpp | 2 +- src/devices/video/315_5124.cpp | 2 +- src/devices/video/315_5313.cpp | 2 +- src/devices/video/am8052.cpp | 2 +- src/devices/video/ati_mach32.cpp | 2 +- src/devices/video/cgapal.cpp | 2 +- src/devices/video/crt9028.cpp | 3 ++- src/devices/video/dp8350.cpp | 3 ++- src/devices/{machine => video}/ds8874.cpp | 2 +- src/devices/{machine => video}/ds8874.h | 6 +++--- src/devices/video/gb_lcd.cpp | 2 +- src/devices/video/gf4500.cpp | 2 +- src/devices/video/hd44352.cpp | 2 +- src/devices/video/hd44780.cpp | 2 +- src/devices/video/hlcd0438.cpp | 2 +- src/devices/video/hlcd0488.cpp | 2 +- src/devices/video/hlcd0538.cpp | 2 +- src/devices/video/huc6272.cpp | 2 +- src/devices/video/lc7580.cpp | 2 +- src/devices/video/m50458.cpp | 2 +- src/devices/video/mb90082.cpp | 3 +-- src/devices/video/mb_vcu.cpp | 3 ++- src/devices/video/mc6847.cpp | 2 +- src/devices/video/md4330b.cpp | 2 +- src/devices/video/mm5445.cpp | 2 +- src/devices/video/nt7534.cpp | 2 +- src/devices/video/pcd8544.cpp | 2 +- src/devices/video/pcf2100.cpp | 2 +- src/devices/video/ppu2c0x.cpp | 2 +- src/devices/video/ppu2c0x_sh6578.cpp | 2 +- src/devices/video/ppu2c0x_vt.cpp | 2 +- src/devices/video/psx.cpp | 3 ++- src/devices/video/pwm.cpp | 2 +- src/devices/video/ramdac.cpp | 2 +- src/devices/video/sed1500.cpp | 2 +- src/devices/video/sed1520.cpp | 2 +- src/devices/video/snes_ppu.cpp | 2 +- src/devices/video/t6a04.cpp | 2 +- src/devices/video/tms9927.cpp | 2 +- src/devices/video/vic4567.cpp | 2 +- src/mame/handheld/hh_cops1.cpp | 2 +- src/mame/handheld/hh_tms1k.cpp | 2 +- 156 files changed, 187 insertions(+), 182 deletions(-) rename src/devices/{machine => video}/ds8874.cpp (98%) rename src/devices/{machine => video}/ds8874.h (91%) diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index e302cd20d1ae4..5ca9f9d977d67 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -1337,18 +1337,6 @@ if (MACHINES["DS75161A"]~=null) then } end ---------------------------------------------------- --- ---@src/devices/machine/ds8874.h,MACHINES["DS8874"] = true ---------------------------------------------------- - -if (MACHINES["DS8874"]~=null) then - files { - MAME_DIR .. "src/devices/machine/ds8874.cpp", - MAME_DIR .. "src/devices/machine/ds8874.h", - } -end - --------------------------------------------------- -- --@src/devices/machine/e0516.h,MACHINES["E0516"] = true diff --git a/scripts/src/video.lua b/scripts/src/video.lua index b002af9c818ed..7205f84dd46f1 100644 --- a/scripts/src/video.lua +++ b/scripts/src/video.lua @@ -199,6 +199,18 @@ if (VIDEOS["DP8350"]~=null) then } end +--------------------------------------------------- +-- +--@src/devices/video/ds8874.h,VIDEOS["DS8874"] = true +--------------------------------------------------- + +if (VIDEOS["DS8874"]~=null) then + files { + MAME_DIR .. "src/devices/video/ds8874.cpp", + MAME_DIR .. "src/devices/video/ds8874.h", + } +end + -------------------------------------------------- -- --@src/devices/video/ef9340_1.h,VIDEOS["EF9340_1"] = true diff --git a/src/devices/machine/7200fifo.cpp b/src/devices/machine/7200fifo.cpp index d40d7c71c4fb0..d411d7ededa34 100644 --- a/src/devices/machine/7200fifo.cpp +++ b/src/devices/machine/7200fifo.cpp @@ -11,7 +11,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/7200fifo.h" +#include "7200fifo.h" DEFINE_DEVICE_TYPE(IDT7200, idt7200_device, "idt7200", "IDT7200 FIFO (256x9)") diff --git a/src/devices/machine/74123.cpp b/src/devices/machine/74123.cpp index 895d49a4a9e30..9e57a805664d8 100644 --- a/src/devices/machine/74123.cpp +++ b/src/devices/machine/74123.cpp @@ -9,7 +9,8 @@ *****************************************************************************/ #include "emu.h" -#include "machine/74123.h" +#include "74123.h" + #include "machine/rescap.h" //#define VERBOSE 1 diff --git a/src/devices/machine/74148.cpp b/src/devices/machine/74148.cpp index 44b62d95bc9a9..216d98a05d13e 100644 --- a/src/devices/machine/74148.cpp +++ b/src/devices/machine/74148.cpp @@ -41,7 +41,7 @@ *****************************************************************************/ #include "emu.h" -#include "machine/74148.h" +#include "74148.h" DEFINE_DEVICE_TYPE(TTL74148, ttl74148_device, "74148", "74148 TTL") diff --git a/src/devices/machine/8042kbdc.cpp b/src/devices/machine/8042kbdc.cpp index c9dbcbdcffda2..8f6918767e566 100644 --- a/src/devices/machine/8042kbdc.cpp +++ b/src/devices/machine/8042kbdc.cpp @@ -10,7 +10,7 @@ #include "emu.h" -#include "machine/8042kbdc.h" +#include "8042kbdc.h" /*************************************************************************** diff --git a/src/devices/machine/aicartc.cpp b/src/devices/machine/aicartc.cpp index 8e58ec0bb33a6..f68ca2e3bca86 100644 --- a/src/devices/machine/aicartc.cpp +++ b/src/devices/machine/aicartc.cpp @@ -10,7 +10,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/aicartc.h" +#include "aicartc.h" diff --git a/src/devices/machine/am9513.cpp b/src/devices/machine/am9513.cpp index 1960bac555d64..34c5c5ec98137 100644 --- a/src/devices/machine/am9513.cpp +++ b/src/devices/machine/am9513.cpp @@ -27,7 +27,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/am9513.h" +#include "am9513.h" #define LOG_MODE (1U << 1) #define LOG_INPUT (1U << 2) diff --git a/src/devices/machine/am9519.cpp b/src/devices/machine/am9519.cpp index ed0b87f263794..9a5eb1007733d 100644 --- a/src/devices/machine/am9519.cpp +++ b/src/devices/machine/am9519.cpp @@ -4,7 +4,7 @@ //TODO: rotating priority, cascade #include "emu.h" -#include "machine/am9519.h" +#include "am9519.h" //#define VERBOSE (LOG_GENERAL) #include "logmacro.h" diff --git a/src/devices/machine/at.cpp b/src/devices/machine/at.cpp index 8decc967081cb..e77c72af59930 100644 --- a/src/devices/machine/at.cpp +++ b/src/devices/machine/at.cpp @@ -7,9 +7,11 @@ ***************************************************************************/ #include "emu.h" -#include "machine/at.h" +#include "at.h" + #include "cpu/i86/i286.h" #include "cpu/i386/i386.h" + #include "softlist_dev.h" #include "speaker.h" diff --git a/src/devices/machine/at28c16.cpp b/src/devices/machine/at28c16.cpp index d092d7f6d34a1..079649e0e95b9 100644 --- a/src/devices/machine/at28c16.cpp +++ b/src/devices/machine/at28c16.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/at28c16.h" +#include "at28c16.h" #define AT28C16_DATA_BYTES ( 0x800 ) #define AT28C16_ID_BYTES ( 0x20 ) diff --git a/src/devices/machine/at28c64b.cpp b/src/devices/machine/at28c64b.cpp index 85bf3cb52fb42..3fdc23a1c865e 100644 --- a/src/devices/machine/at28c64b.cpp +++ b/src/devices/machine/at28c64b.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/at28c64b.h" +#include "at28c64b.h" static constexpr int AT28C64B_DATA_BYTES = 0x10000; static constexpr int AT28C64B_ID_BYTES = 0x40; diff --git a/src/devices/machine/bl_handhelds_menucontrol.cpp b/src/devices/machine/bl_handhelds_menucontrol.cpp index f4495b004e415..703ce99632466 100644 --- a/src/devices/machine/bl_handhelds_menucontrol.cpp +++ b/src/devices/machine/bl_handhelds_menucontrol.cpp @@ -4,7 +4,7 @@ // Menu controller, stores / increments menu position etc. used on handhelds that typically have BL on the boot screen (BaoBaoLong?) #include "emu.h" -#include "machine/bl_handhelds_menucontrol.h" +#include "bl_handhelds_menucontrol.h" DEFINE_DEVICE_TYPE(BL_HANDHELDS_MENUCONTROL, bl_handhelds_menucontrol_device, "blhandheldmenu", "BaoBaoLong Handhelds Menu Controller") diff --git a/src/devices/machine/ch376.cpp b/src/devices/machine/ch376.cpp index dfd6d7eca8b5b..6f971de718610 100644 --- a/src/devices/machine/ch376.cpp +++ b/src/devices/machine/ch376.cpp @@ -26,7 +26,7 @@ #include "emu.h" #include "emuopts.h" -#include "machine/ch376.h" +#include "ch376.h" #include "multibyte.h" diff --git a/src/devices/machine/chessmachine.cpp b/src/devices/machine/chessmachine.cpp index b833ccc6108d8..a7db23f99fd18 100644 --- a/src/devices/machine/chessmachine.cpp +++ b/src/devices/machine/chessmachine.cpp @@ -32,7 +32,7 @@ probably went for this solution to get optimum possible speed for each module. */ #include "emu.h" -#include "machine/chessmachine.h" +#include "chessmachine.h" DEFINE_DEVICE_TYPE(CHESSMACHINE, chessmachine_device, "chessmachine", "Tasc ChessMachine") diff --git a/src/devices/machine/corvushd.cpp b/src/devices/machine/corvushd.cpp index 6b4a2c15c99e3..62c376249e31d 100644 --- a/src/devices/machine/corvushd.cpp +++ b/src/devices/machine/corvushd.cpp @@ -65,7 +65,7 @@ // #include "emu.h" -#include "machine/corvushd.h" +#include "corvushd.h" #define LOG_RESPONSES (1U << 1) diff --git a/src/devices/machine/cs4031.cpp b/src/devices/machine/cs4031.cpp index c885c30b0565d..30712c02059e3 100644 --- a/src/devices/machine/cs4031.cpp +++ b/src/devices/machine/cs4031.cpp @@ -26,7 +26,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/cs4031.h" +#include "cs4031.h" #define LOG_REGISTER (1U << 1) #define LOG_MEMORY (1U << 2) diff --git a/src/devices/machine/cs8221.cpp b/src/devices/machine/cs8221.cpp index 96b3ea6928d61..64887cafc6b47 100644 --- a/src/devices/machine/cs8221.cpp +++ b/src/devices/machine/cs8221.cpp @@ -16,7 +16,8 @@ ***************************************************************************/ #include "emu.h" -#include "machine/cs8221.h" +#include "cs8221.h" + #include "machine/ram.h" #define LOG_REGISTER (1U << 1) diff --git a/src/devices/machine/cs8900a.cpp b/src/devices/machine/cs8900a.cpp index b91957c29b27d..5efab09a5add8 100644 --- a/src/devices/machine/cs8900a.cpp +++ b/src/devices/machine/cs8900a.cpp @@ -1,5 +1,4 @@ // license:GPL-2.0+ - // copyright-holders:Spiro Trikaliotis, Rhett Aultman /************************************************************************* @@ -13,7 +12,7 @@ **************************************************************************/ #include "emu.h" -#include "machine/cs8900a.h" +#include "cs8900a.h" #include diff --git a/src/devices/machine/cxd1095.cpp b/src/devices/machine/cxd1095.cpp index e4998ea7cd141..7819751e573ad 100644 --- a/src/devices/machine/cxd1095.cpp +++ b/src/devices/machine/cxd1095.cpp @@ -17,7 +17,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/cxd1095.h" +#include "cxd1095.h" //************************************************************************** // GLOBAL VARIABLES diff --git a/src/devices/machine/dp8573a.cpp b/src/devices/machine/dp8573a.cpp index e6c461fb6881a..c0af28637ab17 100644 --- a/src/devices/machine/dp8573a.cpp +++ b/src/devices/machine/dp8573a.cpp @@ -15,7 +15,7 @@ */ #include "emu.h" -#include "machine/dp8573a.h" +#include "dp8573a.h" #include "machine/timehelp.h" diff --git a/src/devices/machine/ds1994.cpp b/src/devices/machine/ds1994.cpp index ab041984348c5..544bc20d05007 100644 --- a/src/devices/machine/ds1994.cpp +++ b/src/devices/machine/ds1994.cpp @@ -12,7 +12,7 @@ // FIXME: convert to device_rtc_interface and remove #include "emu.h" -#include "machine/ds1994.h" +#include "ds1994.h" #include #include diff --git a/src/devices/machine/ds2401.cpp b/src/devices/machine/ds2401.cpp index d3a6abc3f5409..758d4405013ed 100644 --- a/src/devices/machine/ds2401.cpp +++ b/src/devices/machine/ds2401.cpp @@ -9,7 +9,7 @@ */ #include "emu.h" -#include "machine/ds2401.h" +#include "ds2401.h" #include diff --git a/src/devices/machine/eeprom.cpp b/src/devices/machine/eeprom.cpp index a15b8b8bcf3b6..50be30e913149 100644 --- a/src/devices/machine/eeprom.cpp +++ b/src/devices/machine/eeprom.cpp @@ -9,7 +9,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/eeprom.h" +#include "eeprom.h" #include "multibyte.h" diff --git a/src/devices/machine/eeprompar.cpp b/src/devices/machine/eeprompar.cpp index be99c35953251..787093f919421 100644 --- a/src/devices/machine/eeprompar.cpp +++ b/src/devices/machine/eeprompar.cpp @@ -47,7 +47,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/eeprompar.h" +#include "eeprompar.h" //#define VERBOSE 1 #include "logmacro.h" diff --git a/src/devices/machine/eepromser.cpp b/src/devices/machine/eepromser.cpp index 2ba5fcc59be47..e060eaed79a6e 100644 --- a/src/devices/machine/eepromser.cpp +++ b/src/devices/machine/eepromser.cpp @@ -112,7 +112,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/eepromser.h" +#include "eepromser.h" diff --git a/src/devices/machine/er1400.cpp b/src/devices/machine/er1400.cpp index de4ae9c8d2850..03b1df5036c6b 100644 --- a/src/devices/machine/er1400.cpp +++ b/src/devices/machine/er1400.cpp @@ -22,7 +22,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/er1400.h" +#include "er1400.h" #define VERBOSE 0 #include "logmacro.h" diff --git a/src/devices/machine/er2055.cpp b/src/devices/machine/er2055.cpp index aa80957b12d51..f6c74bb3d6cc9 100644 --- a/src/devices/machine/er2055.cpp +++ b/src/devices/machine/er2055.cpp @@ -12,7 +12,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/er2055.h" +#include "er2055.h" #include "logmacro.h" diff --git a/src/devices/machine/exorterm.cpp b/src/devices/machine/exorterm.cpp index f6166bc22b0aa..977b84ec93738 100644 --- a/src/devices/machine/exorterm.cpp +++ b/src/devices/machine/exorterm.cpp @@ -17,7 +17,8 @@ TODO ****************************************************************************/ #include "emu.h" -#include "machine/exorterm.h" +#include "exorterm.h" + #include "speaker.h" #include "exorterm155.lh" diff --git a/src/devices/machine/f4702.cpp b/src/devices/machine/f4702.cpp index db756c650d310..499f1a6793ad1 100644 --- a/src/devices/machine/f4702.cpp +++ b/src/devices/machine/f4702.cpp @@ -56,7 +56,7 @@ ****************************************************************************/ #include "emu.h" -#include "machine/f4702.h" +#include "f4702.h" //************************************************************************** diff --git a/src/devices/machine/fdc37c665gt.cpp b/src/devices/machine/fdc37c665gt.cpp index 05a2c2eb4469a..feeec63a201ad 100644 --- a/src/devices/machine/fdc37c665gt.cpp +++ b/src/devices/machine/fdc37c665gt.cpp @@ -9,7 +9,7 @@ SMSC FDC37C665GT High Performance Multi-Mode Parallel Port Super I/O Floppy Disk ***************************************************************************/ #include "emu.h" -#include "machine/fdc37c665gt.h" +#include "fdc37c665gt.h" #define LOG_CONFIG (1U << 1) // Show global configuration changes diff --git a/src/devices/machine/fdc37c93x.cpp b/src/devices/machine/fdc37c93x.cpp index 48a50681ccd1c..e613cc5940008 100644 --- a/src/devices/machine/fdc37c93x.cpp +++ b/src/devices/machine/fdc37c93x.cpp @@ -9,7 +9,7 @@ SMSC FDC37C93x Plug and Play Compatible Ultra I/O Controller ***************************************************************************/ #include "emu.h" -#include "machine/fdc37c93x.h" +#include "fdc37c93x.h" #include "machine/pckeybrd.h" diff --git a/src/devices/machine/genpc.cpp b/src/devices/machine/genpc.cpp index 3dcfc3dc192e0..b0e577899323c 100644 --- a/src/devices/machine/genpc.cpp +++ b/src/devices/machine/genpc.cpp @@ -4,11 +4,10 @@ machine/genpc.cpp - ***************************************************************************/ #include "emu.h" -#include "machine/genpc.h" +#include "genpc.h" #include "imagedev/cassette.h" #include "machine/i8255.h" diff --git a/src/devices/machine/i2cmem.cpp b/src/devices/machine/i2cmem.cpp index c8c49dc5fb396..625ecb1cabe9c 100644 --- a/src/devices/machine/i2cmem.cpp +++ b/src/devices/machine/i2cmem.cpp @@ -23,7 +23,7 @@ there are two standard values. ***************************************************************************/ #include "emu.h" -#include "machine/i2cmem.h" +#include "i2cmem.h" #include diff --git a/src/devices/machine/ie15.cpp b/src/devices/machine/ie15.cpp index 9f977fcaa4014..ee0278801e346 100644 --- a/src/devices/machine/ie15.cpp +++ b/src/devices/machine/ie15.cpp @@ -12,7 +12,7 @@ ****************************************************************************/ #include "emu.h" -#include "machine/ie15.h" +#include "ie15.h" #include "emupal.h" diff --git a/src/devices/machine/ie15_kbd.cpp b/src/devices/machine/ie15_kbd.cpp index 27a203b46d93c..8052b862ad743 100644 --- a/src/devices/machine/ie15_kbd.cpp +++ b/src/devices/machine/ie15_kbd.cpp @@ -8,7 +8,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/ie15_kbd.h" +#include "ie15_kbd.h" #include "machine/keyboard.ipp" diff --git a/src/devices/machine/ins8250.cpp b/src/devices/machine/ins8250.cpp index 6b676b774ac6b..cfbe099beed12 100644 --- a/src/devices/machine/ins8250.cpp +++ b/src/devices/machine/ins8250.cpp @@ -95,7 +95,7 @@ Known issues: **********************************************************************/ #include "emu.h" -#include "machine/ins8250.h" +#include "ins8250.h" #include diff --git a/src/devices/machine/it8705f.cpp b/src/devices/machine/it8705f.cpp index 002d7eede6628..5a001cb9af05d 100644 --- a/src/devices/machine/it8705f.cpp +++ b/src/devices/machine/it8705f.cpp @@ -11,7 +11,7 @@ Winbond IT8705F LPC Super I/O **************************************************************************************************/ #include "emu.h" -#include "machine/it8705f.h" +#include "it8705f.h" #include "formats/naslite_dsk.h" diff --git a/src/devices/machine/ldp1000.cpp b/src/devices/machine/ldp1000.cpp index 42f8cb796fe4b..64a2ec48faab6 100644 --- a/src/devices/machine/ldp1000.cpp +++ b/src/devices/machine/ldp1000.cpp @@ -12,7 +12,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/ldp1000.h" +#include "ldp1000.h" #define DUMP_BCD 1 #define FIFO_MAX 0x10 diff --git a/src/devices/machine/ldp1450.cpp b/src/devices/machine/ldp1450.cpp index 2b4d037cab418..a0cf8e11e9eb1 100644 --- a/src/devices/machine/ldp1450.cpp +++ b/src/devices/machine/ldp1450.cpp @@ -11,7 +11,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/ldp1450.h" +#include "ldp1450.h" #define DUMP_BCD 1 #define FIFO_MAX 0x10 diff --git a/src/devices/machine/lpci.cpp b/src/devices/machine/lpci.cpp index 44b8b84bf3d18..5f37810802082 100644 --- a/src/devices/machine/lpci.cpp +++ b/src/devices/machine/lpci.cpp @@ -2,7 +2,7 @@ // copyright-holders:Olivier Galibert /*************************************************************************** - machine/lpci.c + machine/lpci.cpp Legacy PCI bus @@ -72,7 +72,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/lpci.h" +#include "lpci.h" //#define VERBOSE 1 #include "logmacro.h" diff --git a/src/devices/machine/m6m80011ap.cpp b/src/devices/machine/m6m80011ap.cpp index 7fd3e3ce5c516..92d13fe5de5d8 100644 --- a/src/devices/machine/m6m80011ap.cpp +++ b/src/devices/machine/m6m80011ap.cpp @@ -2,8 +2,7 @@ // copyright-holders:Angelo Salese #include "emu.h" -#include "machine/m6m80011ap.h" - +#include "m6m80011ap.h" //************************************************************************** diff --git a/src/devices/machine/mb14241.cpp b/src/devices/machine/mb14241.cpp index c9d08eb503e71..4e087ade8a32e 100644 --- a/src/devices/machine/mb14241.cpp +++ b/src/devices/machine/mb14241.cpp @@ -7,7 +7,7 @@ ****************************************************************************/ #include "emu.h" -#include "machine/mb14241.h" +#include "mb14241.h" //------------------------------------------------- diff --git a/src/devices/machine/mb8421.cpp b/src/devices/machine/mb8421.cpp index 53a19a70be884..62eb69c035d8a 100644 --- a/src/devices/machine/mb8421.cpp +++ b/src/devices/machine/mb8421.cpp @@ -18,7 +18,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/mb8421.h" +#include "mb8421.h" template class dual_port_mailbox_ram_base; template class dual_port_mailbox_ram_base; diff --git a/src/devices/machine/mb87078.cpp b/src/devices/machine/mb87078.cpp index 5e952c5eab396..b32207ccd5181 100644 --- a/src/devices/machine/mb87078.cpp +++ b/src/devices/machine/mb87078.cpp @@ -70,7 +70,7 @@ *****************************************************************************/ #include "emu.h" -#include "machine/mb87078.h" +#include "mb87078.h" /***************************************************************************** diff --git a/src/devices/machine/mb89363b.cpp b/src/devices/machine/mb89363b.cpp index 74c43a1960c38..56d1bf83350d3 100644 --- a/src/devices/machine/mb89363b.cpp +++ b/src/devices/machine/mb89363b.cpp @@ -77,7 +77,7 @@ */ #include "emu.h" -#include "machine/mb89363b.h" +#include "mb89363b.h" DEFINE_DEVICE_TYPE(MB89363B, mb89363b_device, "mb89363b", "Fujitsu MB89363B I/O") diff --git a/src/devices/machine/mc146818.cpp b/src/devices/machine/mc146818.cpp index ffa14fa4b55d7..ae03165b81987 100644 --- a/src/devices/machine/mc146818.cpp +++ b/src/devices/machine/mc146818.cpp @@ -12,7 +12,7 @@ *********************************************************************/ #include "emu.h" -#include "machine/mc146818.h" +#include "mc146818.h" #include "coreutil.h" diff --git a/src/devices/machine/mc68328.cpp b/src/devices/machine/mc68328.cpp index 8c7bebd9dd80f..2429130654d39 100644 --- a/src/devices/machine/mc68328.cpp +++ b/src/devices/machine/mc68328.cpp @@ -9,7 +9,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/mc68328.h" +#include "mc68328.h" #define LOG_SCR (1U << 1) #define LOG_CS_GRP (1U << 2) diff --git a/src/devices/machine/mm58174.cpp b/src/devices/machine/mm58174.cpp index 3d15060666a1c..0223a70accf49 100644 --- a/src/devices/machine/mm58174.cpp +++ b/src/devices/machine/mm58174.cpp @@ -18,7 +18,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/mm58174.h" +#include "mm58174.h" enum { diff --git a/src/devices/machine/mm58274c.cpp b/src/devices/machine/mm58274c.cpp index cc054767a7324..214e6b2ea082a 100644 --- a/src/devices/machine/mm58274c.cpp +++ b/src/devices/machine/mm58274c.cpp @@ -21,7 +21,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/mm58274c.h" +#include "mm58274c.h" enum { diff --git a/src/devices/machine/mpu401.cpp b/src/devices/machine/mpu401.cpp index d4e80eb4bd56d..2bf71c51fbf9c 100644 --- a/src/devices/machine/mpu401.cpp +++ b/src/devices/machine/mpu401.cpp @@ -39,7 +39,8 @@ ***************************************************************************/ #include "emu.h" -#include "machine/mpu401.h" +#include "mpu401.h" + #include "bus/midi/midi.h" #define M6801_TAG "mpu6801" diff --git a/src/devices/machine/msm5001n.cpp b/src/devices/machine/msm5001n.cpp index 8a3ab9f9ef74d..4fd30735314e5 100644 --- a/src/devices/machine/msm5001n.cpp +++ b/src/devices/machine/msm5001n.cpp @@ -17,7 +17,7 @@ These kind of chips were used a lot for cheap 2-button digital wristwatches. */ #include "emu.h" -#include "machine/msm5001n.h" +#include "msm5001n.h" DEFINE_DEVICE_TYPE(MSM5001N, msm5001n_device, "msm5001n", "OKI MSM5001N LCD Watch") diff --git a/src/devices/machine/msm6242.cpp b/src/devices/machine/msm6242.cpp index f4c808db9a6b7..59abd5313bcff 100644 --- a/src/devices/machine/msm6242.cpp +++ b/src/devices/machine/msm6242.cpp @@ -14,7 +14,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/msm6242.h" +#include "msm6242.h" #define LOG_UNMAPPED (1U << 1) #define LOG_IRQ (1U << 2) diff --git a/src/devices/machine/msm6253.cpp b/src/devices/machine/msm6253.cpp index 53a47b2152e76..5f6bd1a8a12bf 100644 --- a/src/devices/machine/msm6253.cpp +++ b/src/devices/machine/msm6253.cpp @@ -7,7 +7,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/msm6253.h" +#include "msm6253.h" //************************************************************************** // GLOBAL VARIABLES diff --git a/src/devices/machine/nvram.cpp b/src/devices/machine/nvram.cpp index 039b0360db0a9..3a6f24c593cbc 100644 --- a/src/devices/machine/nvram.cpp +++ b/src/devices/machine/nvram.cpp @@ -9,7 +9,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/nvram.h" +#include "nvram.h" //************************************************************************** // LIVE DEVICE diff --git a/src/devices/machine/pc87306.cpp b/src/devices/machine/pc87306.cpp index 8512e44d084c2..8bc2deb00b058 100644 --- a/src/devices/machine/pc87306.cpp +++ b/src/devices/machine/pc87306.cpp @@ -11,9 +11,9 @@ National Semiconductor PC87306 Super I/O **************************************************************************************************/ #include "emu.h" -#include "bus/isa/isa.h" +#include "pc87306.h" + //#include "machine/ds128x.h" -#include "machine/pc87306.h" #include "machine/pckeybrd.h" #define LOG_WARN (1U << 1) // Show warnings diff --git a/src/devices/machine/pc_fdc.cpp b/src/devices/machine/pc_fdc.cpp index 03ce46ee86687..6c737f03364bd 100644 --- a/src/devices/machine/pc_fdc.cpp +++ b/src/devices/machine/pc_fdc.cpp @@ -14,7 +14,8 @@ **********************************************************************/ #include "emu.h" -#include "machine/pc_fdc.h" +#include "pc_fdc.h" + #include "imagedev/floppy.h" //#define VERBOSE (LOG_GENERAL) diff --git a/src/devices/machine/pic8259.cpp b/src/devices/machine/pic8259.cpp index c9eaecdaf9200..b641abe3c9748 100644 --- a/src/devices/machine/pic8259.cpp +++ b/src/devices/machine/pic8259.cpp @@ -14,7 +14,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/pic8259.h" +#include "pic8259.h" #define LOG_ICW (1U << 1) #define LOG_OCW (1U << 2) diff --git a/src/devices/machine/pit8253.cpp b/src/devices/machine/pit8253.cpp index 93c39670e3082..c75c8b6a9cc03 100644 --- a/src/devices/machine/pit8253.cpp +++ b/src/devices/machine/pit8253.cpp @@ -21,7 +21,7 @@ *****************************************************************************/ #include "emu.h" -#include "machine/pit8253.h" +#include "pit8253.h" /*************************************************************************** diff --git a/src/devices/machine/r10696.cpp b/src/devices/machine/r10696.cpp index bee69b5f993a8..2172c9d1b86e2 100644 --- a/src/devices/machine/r10696.cpp +++ b/src/devices/machine/r10696.cpp @@ -30,7 +30,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/r10696.h" +#include "r10696.h" //#define VERBOSE 1 #include "logmacro.h" diff --git a/src/devices/machine/r10788.cpp b/src/devices/machine/r10788.cpp index c3d72d2aa167b..fd8e69c9b3c66 100644 --- a/src/devices/machine/r10788.cpp +++ b/src/devices/machine/r10788.cpp @@ -40,7 +40,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/r10788.h" +#include "r10788.h" //#define VERBOSE 1 #include "logmacro.h" diff --git a/src/devices/machine/ra17xx.cpp b/src/devices/machine/ra17xx.cpp index 7a3b930f0adb6..a49205695a0d9 100644 --- a/src/devices/machine/ra17xx.cpp +++ b/src/devices/machine/ra17xx.cpp @@ -38,7 +38,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/ra17xx.h" +#include "ra17xx.h" //#define VERBOSE 1 #include "logmacro.h" diff --git a/src/devices/machine/ripple_counter.cpp b/src/devices/machine/ripple_counter.cpp index dc4c931719982..6c60d7238a5c4 100644 --- a/src/devices/machine/ripple_counter.cpp +++ b/src/devices/machine/ripple_counter.cpp @@ -15,7 +15,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/ripple_counter.h" +#include "ripple_counter.h" //************************************************************************** // GLOBAL VARIABLES diff --git a/src/devices/machine/rp5h01.cpp b/src/devices/machine/rp5h01.cpp index 348a4d8a780a3..bdd3f7b1c97fe 100644 --- a/src/devices/machine/rp5h01.cpp +++ b/src/devices/machine/rp5h01.cpp @@ -17,7 +17,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/rp5h01.h" +#include "rp5h01.h" // this is the contents of an unprogrammed PROM uint8_t const rp5h01_device::s_initial_data[0x10] = diff --git a/src/devices/machine/rstbuf.cpp b/src/devices/machine/rstbuf.cpp index 42a241bd3088e..ad6324a184ea6 100644 --- a/src/devices/machine/rstbuf.cpp +++ b/src/devices/machine/rstbuf.cpp @@ -56,7 +56,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/rstbuf.h" +#include "rstbuf.h" // device type definition DEFINE_DEVICE_TYPE(RST_POS_BUFFER, rst_pos_buffer_device, "rst_pos_buffer", "RST Interrupt Buffer (positive modification)") diff --git a/src/devices/machine/rtc9701.cpp b/src/devices/machine/rtc9701.cpp index fd615ed898fc7..7f521d4306336 100644 --- a/src/devices/machine/rtc9701.cpp +++ b/src/devices/machine/rtc9701.cpp @@ -12,7 +12,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/rtc9701.h" +#include "rtc9701.h" ALLOW_SAVE_TYPE(rtc9701_device::state_t); diff --git a/src/devices/machine/s2636.cpp b/src/devices/machine/s2636.cpp index c5663d2ccb1ee..c8e9025179964 100644 --- a/src/devices/machine/s2636.cpp +++ b/src/devices/machine/s2636.cpp @@ -119,7 +119,7 @@ *************************************************************/ #include "emu.h" -#include "machine/s2636.h" +#include "s2636.h" #include "screen.h" diff --git a/src/devices/machine/s3520cf.cpp b/src/devices/machine/s3520cf.cpp index 402dc909e12d0..567e9792b66a9 100644 --- a/src/devices/machine/s3520cf.cpp +++ b/src/devices/machine/s3520cf.cpp @@ -15,8 +15,7 @@ preliminary device by Angelo Salese ***************************************************************************/ #include "emu.h" -#include "machine/s3520cf.h" - +#include "s3520cf.h" //************************************************************************** diff --git a/src/devices/machine/s3c2400.cpp b/src/devices/machine/s3c2400.cpp index 0fa124fdebd0f..437612a83319e 100644 --- a/src/devices/machine/s3c2400.cpp +++ b/src/devices/machine/s3c2400.cpp @@ -9,7 +9,7 @@ *******************************************************************************/ #include "emu.h" -#include "machine/s3c2400.h" +#include "s3c2400.h" #include "cpu/arm7/arm7.h" #include "cpu/arm7/arm7core.h" diff --git a/src/devices/machine/s3c2410.cpp b/src/devices/machine/s3c2410.cpp index c631911991455..e5017ddaed4cb 100644 --- a/src/devices/machine/s3c2410.cpp +++ b/src/devices/machine/s3c2410.cpp @@ -9,7 +9,7 @@ *******************************************************************************/ #include "emu.h" -#include "machine/s3c2410.h" +#include "s3c2410.h" #include "cpu/arm7/arm7.h" #include "cpu/arm7/arm7core.h" diff --git a/src/devices/machine/s3c2440.cpp b/src/devices/machine/s3c2440.cpp index 562067879b118..3bec1249b1164 100644 --- a/src/devices/machine/s3c2440.cpp +++ b/src/devices/machine/s3c2440.cpp @@ -9,7 +9,7 @@ *******************************************************************************/ #include "emu.h" -#include "machine/s3c2440.h" +#include "s3c2440.h" #include "cpu/arm7/arm7.h" #include "cpu/arm7/arm7core.h" diff --git a/src/devices/machine/s3c44b0.cpp b/src/devices/machine/s3c44b0.cpp index 6d6255579333f..a67be48455cb0 100644 --- a/src/devices/machine/s3c44b0.cpp +++ b/src/devices/machine/s3c44b0.cpp @@ -9,7 +9,7 @@ *******************************************************************************/ #include "emu.h" -#include "machine/s3c44b0.h" +#include "s3c44b0.h" #include "cpu/arm7/arm7.h" #include "cpu/arm7/arm7core.h" diff --git a/src/devices/machine/scc66470.cpp b/src/devices/machine/scc66470.cpp index b723ed2acd44f..7538cf88e3ad3 100644 --- a/src/devices/machine/scc66470.cpp +++ b/src/devices/machine/scc66470.cpp @@ -20,6 +20,7 @@ #include "emu.h" #include "scc66470.h" + #include "screen.h" #define CSR_REG (m_csr) diff --git a/src/devices/machine/scc68070.cpp b/src/devices/machine/scc68070.cpp index 070d82f82d174..57238532f41c4 100644 --- a/src/devices/machine/scc68070.cpp +++ b/src/devices/machine/scc68070.cpp @@ -23,7 +23,7 @@ *******************************************************************************/ #include "emu.h" -#include "machine/scc68070.h" +#include "scc68070.h" #define LOG_I2C (1U << 1) #define LOG_UART (1U << 2) diff --git a/src/devices/machine/sda2006.cpp b/src/devices/machine/sda2006.cpp index 3de3e276a7a02..99b4a41d9f74a 100644 --- a/src/devices/machine/sda2006.cpp +++ b/src/devices/machine/sda2006.cpp @@ -2,7 +2,7 @@ // copyright-holders:Tomasz Slanina #include "emu.h" -#include "machine/sda2006.h" +#include "sda2006.h" //------------------------------------------------- // diff --git a/src/devices/machine/sensorboard.cpp b/src/devices/machine/sensorboard.cpp index 356b81cad5cf1..5fa63885f1fb8 100644 --- a/src/devices/machine/sensorboard.cpp +++ b/src/devices/machine/sensorboard.cpp @@ -57,7 +57,7 @@ sensor state instead. */ #include "emu.h" -#include "machine/sensorboard.h" +#include "sensorboard.h" DEFINE_DEVICE_TYPE(SENSORBOARD, sensorboard_device, "sensorboard", "Sensorboard") diff --git a/src/devices/machine/smpc.cpp b/src/devices/machine/smpc.cpp index d8a83a6bfd5fa..e70ab757dc7e3 100644 --- a/src/devices/machine/smpc.cpp +++ b/src/devices/machine/smpc.cpp @@ -160,7 +160,7 @@ SMPC NVRAM contents: */ #include "emu.h" -#include "machine/smpc.h" +#include "smpc.h" #include "screen.h" #include "coreutil.h" diff --git a/src/devices/machine/stvcd.cpp b/src/devices/machine/stvcd.cpp index 6b46750d4ac54..0cb67d62cc807 100644 --- a/src/devices/machine/stvcd.cpp +++ b/src/devices/machine/stvcd.cpp @@ -41,7 +41,7 @@ DASM notes: ***************************************************************************/ #include "emu.h" -#include "machine/stvcd.h" +#include "stvcd.h" #include "coreutil.h" #include "multibyte.h" diff --git a/src/devices/machine/swtpc8212.cpp b/src/devices/machine/swtpc8212.cpp index a37518cf7c5c7..e7e739b4373cc 100644 --- a/src/devices/machine/swtpc8212.cpp +++ b/src/devices/machine/swtpc8212.cpp @@ -136,8 +136,10 @@ swtp|ct8212|southwest technical products ct8212, ****************************************************************************/ #include "emu.h" -#include "machine/swtpc8212.h" +#include "swtpc8212.h" + #include "machine/input_merger.h" + #include "screen.h" #include "speaker.h" diff --git a/src/devices/machine/tc009xlvc.cpp b/src/devices/machine/tc009xlvc.cpp index 1226097682220..c0c5e41fed428 100644 --- a/src/devices/machine/tc009xlvc.cpp +++ b/src/devices/machine/tc009xlvc.cpp @@ -13,7 +13,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/tc009xlvc.h" +#include "tc009xlvc.h" #include "emupal.h" #include "screen.h" diff --git a/src/devices/machine/te7750.cpp b/src/devices/machine/te7750.cpp index 51577759477a8..94376c6dafbf9 100644 --- a/src/devices/machine/te7750.cpp +++ b/src/devices/machine/te7750.cpp @@ -170,7 +170,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/te7750.h" +#include "te7750.h" //************************************************************************** // GLOBAL VARIABLES diff --git a/src/devices/machine/terminal.cpp b/src/devices/machine/terminal.cpp index 31ec127a31f14..b367a12857b03 100644 --- a/src/devices/machine/terminal.cpp +++ b/src/devices/machine/terminal.cpp @@ -1,7 +1,8 @@ // license:BSD-3-Clause // copyright-holders:Miodrag Milanovic #include "emu.h" -#include "machine/terminal.h" +#include "terminal.h" + #include "screen.h" #include "speaker.h" diff --git a/src/devices/machine/ticket.cpp b/src/devices/machine/ticket.cpp index eac0bf0a18af1..92e5f31681985 100644 --- a/src/devices/machine/ticket.cpp +++ b/src/devices/machine/ticket.cpp @@ -2,14 +2,14 @@ // copyright-holders:Aaron Giles /*************************************************************************** - ticket.c + ticket.cpp Generic ticket dispensing device. ***************************************************************************/ #include "emu.h" -#include "machine/ticket.h" +#include "ticket.h" //************************************************************************** diff --git a/src/devices/machine/timekpr.cpp b/src/devices/machine/timekpr.cpp index 5acf210afd02a..c5ed19a33305e 100644 --- a/src/devices/machine/timekpr.cpp +++ b/src/devices/machine/timekpr.cpp @@ -15,7 +15,8 @@ ***************************************************************************/ #include "emu.h" -#include "machine/timekpr.h" +#include "timekpr.h" + #include "machine/timehelp.h" #define LOG_TICKS (1U << 1) diff --git a/src/devices/machine/timer.cpp b/src/devices/machine/timer.cpp index 538329c998ec8..f2dc84645780a 100644 --- a/src/devices/machine/timer.cpp +++ b/src/devices/machine/timer.cpp @@ -9,7 +9,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/timer.h" +#include "timer.h" /*************************************************************************** diff --git a/src/devices/machine/tmc0999.cpp b/src/devices/machine/tmc0999.cpp index e270e87152448..e40426e61d8d3 100644 --- a/src/devices/machine/tmc0999.cpp +++ b/src/devices/machine/tmc0999.cpp @@ -14,7 +14,7 @@ and an internal address latch. */ #include "emu.h" -#include "machine/tmc0999.h" +#include "tmc0999.h" DEFINE_DEVICE_TYPE(TMC0999, tmc0999_device, "tmc0999", "TI TMC0999 RAM") diff --git a/src/devices/machine/tms1024.cpp b/src/devices/machine/tms1024.cpp index b283c20893c3e..63de6583e3a5a 100644 --- a/src/devices/machine/tms1024.cpp +++ b/src/devices/machine/tms1024.cpp @@ -11,7 +11,7 @@ */ #include "emu.h" -#include "machine/tms1024.h" +#include "tms1024.h" #define VERBOSE 0 #include "logmacro.h" @@ -19,6 +19,7 @@ DEFINE_DEVICE_TYPE(TMS1024, tms1024_device, "tms1024", "TMS1024 I/O Expander") DEFINE_DEVICE_TYPE(TMS1025, tms1025_device, "tms1025", "TMS1025 I/O Expander") + //------------------------------------------------- // constructor //------------------------------------------------- @@ -42,7 +43,6 @@ tms1025_device::tms1025_device(const machine_config &mconfig, const char *tag, d } - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -57,7 +57,6 @@ void tms1024_device::device_start() } - //------------------------------------------------- // handlers //------------------------------------------------- diff --git a/src/devices/machine/tube.cpp b/src/devices/machine/tube.cpp index 328a5fafbb70a..74093398c3310 100644 --- a/src/devices/machine/tube.cpp +++ b/src/devices/machine/tube.cpp @@ -13,7 +13,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/tube.h" +#include "tube.h" diff --git a/src/devices/machine/upc82c710.cpp b/src/devices/machine/upc82c710.cpp index d64b9008b076d..9fb2ea89ac2f1 100644 --- a/src/devices/machine/upc82c710.cpp +++ b/src/devices/machine/upc82c710.cpp @@ -7,7 +7,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/upc82c710.h" +#include "upc82c710.h" #define LOG_CFG (1U << 1) #define LOG_FDC (1U << 2) diff --git a/src/devices/machine/upc82c711.cpp b/src/devices/machine/upc82c711.cpp index 7c021d30b2c2f..7e9e88d992b29 100644 --- a/src/devices/machine/upc82c711.cpp +++ b/src/devices/machine/upc82c711.cpp @@ -7,7 +7,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/upc82c711.h" +#include "upc82c711.h" #define LOG_CFG (1U << 1) #define LOG_FDC (1U << 2) diff --git a/src/devices/machine/upd4991a.cpp b/src/devices/machine/upd4991a.cpp index 0f1419d72703d..c58fcfef159b9 100644 --- a/src/devices/machine/upd4991a.cpp +++ b/src/devices/machine/upd4991a.cpp @@ -18,7 +18,7 @@ **************************************************************************************************/ #include "emu.h" -#include "machine/upd4991a.h" +#include "upd4991a.h" //************************************************************************************************* diff --git a/src/devices/machine/upd4992.cpp b/src/devices/machine/upd4992.cpp index 52e3f8d9f100a..79f23784c82cc 100644 --- a/src/devices/machine/upd4992.cpp +++ b/src/devices/machine/upd4992.cpp @@ -13,8 +13,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/upd4992.h" - +#include "upd4992.h" //************************************************************************** diff --git a/src/devices/machine/upd71071.cpp b/src/devices/machine/upd71071.cpp index 61b830d592030..a23b859e3c7e2 100644 --- a/src/devices/machine/upd71071.cpp +++ b/src/devices/machine/upd71071.cpp @@ -88,7 +88,7 @@ */ #include "emu.h" -#include "machine/upd71071.h" +#include "upd71071.h" DEFINE_DEVICE_TYPE(UPD71071, upd71071_device, "upd71071", "NEC uPD71071 DMA Controller") diff --git a/src/devices/machine/v3021.cpp b/src/devices/machine/v3021.cpp index 88a49e891087e..82386e216f7c3 100644 --- a/src/devices/machine/v3021.cpp +++ b/src/devices/machine/v3021.cpp @@ -95,7 +95,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/v3021.h" +#include "v3021.h" //************************************************************************** diff --git a/src/devices/machine/vic_pl192.cpp b/src/devices/machine/vic_pl192.cpp index c4ab633145d08..c2c475495568c 100644 --- a/src/devices/machine/vic_pl192.cpp +++ b/src/devices/machine/vic_pl192.cpp @@ -4,7 +4,7 @@ // ARM PrimeCell PL190/PL192 VIC emulation #include "emu.h" -#include "machine/vic_pl192.h" +#include "vic_pl192.h" #define VERBOSE (LOG_GENERAL) #include "logmacro.h" diff --git a/src/devices/machine/w83787f.cpp b/src/devices/machine/w83787f.cpp index 994ef2af8e456..751766294a0bc 100644 --- a/src/devices/machine/w83787f.cpp +++ b/src/devices/machine/w83787f.cpp @@ -10,8 +10,7 @@ Looks similar in design to National PC87306 (including similar reg names) **************************************************************************************************/ #include "emu.h" -#include "bus/isa/isa.h" -#include "machine/w83787f.h" +#include "w83787f.h" #define LOG_WARN (1U << 1) diff --git a/src/devices/machine/w83977tf.cpp b/src/devices/machine/w83977tf.cpp index 5308d65b1e8c8..2a5131210e53a 100644 --- a/src/devices/machine/w83977tf.cpp +++ b/src/devices/machine/w83977tf.cpp @@ -15,7 +15,7 @@ Winbond W83977TF **************************************************************************************************/ #include "emu.h" -#include "machine/w83977tf.h" +#include "w83977tf.h" //#include "machine/ds128x.h" #include "machine/pckeybrd.h" diff --git a/src/devices/machine/wd1000.cpp b/src/devices/machine/wd1000.cpp index b9a475cc74f57..109a3776df4fc 100644 --- a/src/devices/machine/wd1000.cpp +++ b/src/devices/machine/wd1000.cpp @@ -7,7 +7,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/wd1000.h" +#include "wd1000.h" //************************************************************************** // DEVICE DEFINITIONS diff --git a/src/devices/machine/wd11c00_17.cpp b/src/devices/machine/wd11c00_17.cpp index d05db87f6ccf5..79cbd4f4ef25c 100644 --- a/src/devices/machine/wd11c00_17.cpp +++ b/src/devices/machine/wd11c00_17.cpp @@ -7,7 +7,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/wd11c00_17.h" +#include "wd11c00_17.h" #define VERBOSE 1 #include "logmacro.h" diff --git a/src/devices/machine/wd2010.cpp b/src/devices/machine/wd2010.cpp index f86f6645a70e3..28f7b8ebbc390 100644 --- a/src/devices/machine/wd2010.cpp +++ b/src/devices/machine/wd2010.cpp @@ -36,7 +36,7 @@ UNIMPLEMENTED FEATURES : **********************************************************************/ #include "emu.h" -#include "machine/wd2010.h" +#include "wd2010.h" #define VERBOSE 1 #include "logmacro.h" diff --git a/src/devices/machine/wd7600.cpp b/src/devices/machine/wd7600.cpp index e75fc06755226..226520e1dc7b9 100644 --- a/src/devices/machine/wd7600.cpp +++ b/src/devices/machine/wd7600.cpp @@ -13,7 +13,7 @@ */ #include "emu.h" -#include "machine/wd7600.h" +#include "wd7600.h" #define VERBOSE 1 #include "logmacro.h" diff --git a/src/devices/machine/x2201.cpp b/src/devices/machine/x2201.cpp index 28a404963d586..cc35e7c805132 100644 --- a/src/devices/machine/x2201.cpp +++ b/src/devices/machine/x2201.cpp @@ -23,7 +23,7 @@ **********************************************************************/ #include "emu.h" -#include "machine/x2201.h" +#include "x2201.h" #include diff --git a/src/devices/machine/x2212.cpp b/src/devices/machine/x2212.cpp index b549fc7658356..ddd31ab5af88f 100644 --- a/src/devices/machine/x2212.cpp +++ b/src/devices/machine/x2212.cpp @@ -9,7 +9,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/x2212.h" +#include "x2212.h" #include diff --git a/src/devices/machine/x76f041.cpp b/src/devices/machine/x76f041.cpp index deaa79d0a69a1..aa96ad9018033 100644 --- a/src/devices/machine/x76f041.cpp +++ b/src/devices/machine/x76f041.cpp @@ -14,7 +14,7 @@ */ #include "emu.h" -#include "machine/x76f041.h" +#include "x76f041.h" #include #include diff --git a/src/devices/machine/x76f100.cpp b/src/devices/machine/x76f100.cpp index d4213a532003d..b64bbdf32c275 100644 --- a/src/devices/machine/x76f100.cpp +++ b/src/devices/machine/x76f100.cpp @@ -12,7 +12,7 @@ */ #include "emu.h" -#include "machine/x76f100.h" +#include "x76f100.h" #include #include diff --git a/src/devices/sound/ad1848.cpp b/src/devices/sound/ad1848.cpp index 081b4172d4746..b47e3c4a683e5 100644 --- a/src/devices/sound/ad1848.cpp +++ b/src/devices/sound/ad1848.cpp @@ -5,7 +5,7 @@ // TODO: Emulate pin-compatible Crystal Semiconductor CS4231 and its extra Mode 2 features #include "emu.h" -#include "sound/ad1848.h" +#include "ad1848.h" #include "speaker.h" diff --git a/src/devices/sound/beep.cpp b/src/devices/sound/beep.cpp index 14fadcf6b7d70..d2358d4cc936e 100644 --- a/src/devices/sound/beep.cpp +++ b/src/devices/sound/beep.cpp @@ -12,7 +12,7 @@ ****************************************************************************/ #include "emu.h" -#include "sound/beep.h" +#include "beep.h" #define BEEP_RATE (384000) diff --git a/src/devices/sound/esqpump.cpp b/src/devices/sound/esqpump.cpp index 38b95a15bedca..af1a59db799e9 100644 --- a/src/devices/sound/esqpump.cpp +++ b/src/devices/sound/esqpump.cpp @@ -9,7 +9,7 @@ ***************************************************************************/ #include "emu.h" -#include "sound/esqpump.h" +#include "esqpump.h" DEFINE_DEVICE_TYPE(ESQ_5505_5510_PUMP, esq_5505_5510_pump_device, "esq_5505_5510_pump", "Ensoniq 5505/5506 to 5510 interface") diff --git a/src/devices/sound/k056800.cpp b/src/devices/sound/k056800.cpp index 00a7f7235b6bd..690165d838d0a 100644 --- a/src/devices/sound/k056800.cpp +++ b/src/devices/sound/k056800.cpp @@ -8,14 +8,12 @@ ***********************************************************************/ #include "emu.h" -#include "sound/k056800.h" - +#include "k056800.h" DEFINE_DEVICE_TYPE(K056800, k056800_device, "k056800", "K056800 MIRAC") - //------------------------------------------------- // k056800_device - constructor //------------------------------------------------- diff --git a/src/devices/sound/mos6560.cpp b/src/devices/sound/mos6560.cpp index c1224ee1f6135..6434621f13ddd 100644 --- a/src/devices/sound/mos6560.cpp +++ b/src/devices/sound/mos6560.cpp @@ -59,7 +59,7 @@ #include "emu.h" -#include "sound/mos6560.h" +#include "mos6560.h" /***************************************************************************** diff --git a/src/devices/sound/nes_apu_vt.cpp b/src/devices/sound/nes_apu_vt.cpp index f93c3203bac87..8216cd3c8f2f5 100644 --- a/src/devices/sound/nes_apu_vt.cpp +++ b/src/devices/sound/nes_apu_vt.cpp @@ -8,7 +8,7 @@ // TODO: everything #include "emu.h" -#include "sound/nes_apu_vt.h" +#include "nes_apu_vt.h" DEFINE_DEVICE_TYPE(NES_APU_VT, nes_apu_vt_device, "nes_apu_vt", "XOP APU") diff --git a/src/devices/sound/spkrdev.cpp b/src/devices/sound/spkrdev.cpp index 7d9333d02cb59..19d1f1813d67f 100644 --- a/src/devices/sound/spkrdev.cpp +++ b/src/devices/sound/spkrdev.cpp @@ -72,7 +72,7 @@ */ #include "emu.h" -#include "sound/spkrdev.h" +#include "spkrdev.h" // The default is 1-bit, but can be customized with set_levels. static constexpr double default_levels[2] = { 0.0, 1.0 }; diff --git a/src/devices/sound/uda1344.cpp b/src/devices/sound/uda1344.cpp index f3123371d82a8..b8d445ef3b870 100644 --- a/src/devices/sound/uda1344.cpp +++ b/src/devices/sound/uda1344.cpp @@ -7,7 +7,7 @@ ****************************************************************************/ #include "emu.h" -#include "sound/uda1344.h" +#include "uda1344.h" #define LOG_ADDR (1U << 1) #define LOG_STATUS_REG (1U << 2) diff --git a/src/devices/sound/upd7752.cpp b/src/devices/sound/upd7752.cpp index 7c063fbee953b..8f8a3a6f9a3be 100644 --- a/src/devices/sound/upd7752.cpp +++ b/src/devices/sound/upd7752.cpp @@ -9,8 +9,7 @@ skeleton device ***************************************************************************/ #include "emu.h" -#include "sound/upd7752.h" - +#include "upd7752.h" /* status flags */ diff --git a/src/devices/sound/vgm_visualizer.cpp b/src/devices/sound/vgm_visualizer.cpp index 6dc37c4e87bf5..e62ffe07785ff 100644 --- a/src/devices/sound/vgm_visualizer.cpp +++ b/src/devices/sound/vgm_visualizer.cpp @@ -11,7 +11,7 @@ ***************************************************************************/ #include "emu.h" -#include "sound/vgm_visualizer.h" +#include "vgm_visualizer.h" #include "wdlfft/fft.h" diff --git a/src/devices/video/315_5124.cpp b/src/devices/video/315_5124.cpp index bc35a956babca..8bfef88e45163 100644 --- a/src/devices/video/315_5124.cpp +++ b/src/devices/video/315_5124.cpp @@ -65,7 +65,7 @@ PAL frame timing */ #include "emu.h" -#include "video/315_5124.h" +#include "315_5124.h" /**************************************************************************** diff --git a/src/devices/video/315_5313.cpp b/src/devices/video/315_5313.cpp index 57b32a642a98b..f48468963bedd 100644 --- a/src/devices/video/315_5313.cpp +++ b/src/devices/video/315_5313.cpp @@ -12,7 +12,7 @@ */ #include "emu.h" -#include "video/315_5313.h" +#include "315_5313.h" /* The VDP occupies addresses C00000h to C0001Fh. diff --git a/src/devices/video/am8052.cpp b/src/devices/video/am8052.cpp index e97e2488b9fb6..628e9c701e83d 100644 --- a/src/devices/video/am8052.cpp +++ b/src/devices/video/am8052.cpp @@ -9,7 +9,7 @@ **********************************************************************/ #include "emu.h" -#include "video/am8052.h" +#include "am8052.h" //#include "screen.h" //************************************************************************** diff --git a/src/devices/video/ati_mach32.cpp b/src/devices/video/ati_mach32.cpp index 343a5f87db511..ab474389f973f 100644 --- a/src/devices/video/ati_mach32.cpp +++ b/src/devices/video/ati_mach32.cpp @@ -10,7 +10,7 @@ */ #include "emu.h" -#include "video/ati_mach32.h" +#include "ati_mach32.h" #include "screen.h" diff --git a/src/devices/video/cgapal.cpp b/src/devices/video/cgapal.cpp index b726db233351d..5d0ef5611038b 100644 --- a/src/devices/video/cgapal.cpp +++ b/src/devices/video/cgapal.cpp @@ -12,7 +12,7 @@ */ #include "emu.h" -#include "video/cgapal.h" +#include "cgapal.h" const unsigned char cga_palette[16 * CGA_PALETTE_SETS][3] = { diff --git a/src/devices/video/crt9028.cpp b/src/devices/video/crt9028.cpp index 7ed0c398c2f85..a3840b2df3acd 100644 --- a/src/devices/video/crt9028.cpp +++ b/src/devices/video/crt9028.cpp @@ -24,7 +24,8 @@ **********************************************************************/ #include "emu.h" -#include "video/crt9028.h" +#include "crt9028.h" + #include "screen.h" //************************************************************************** diff --git a/src/devices/video/dp8350.cpp b/src/devices/video/dp8350.cpp index c14a93b895840..19789ac4222c2 100644 --- a/src/devices/video/dp8350.cpp +++ b/src/devices/video/dp8350.cpp @@ -44,7 +44,8 @@ **********************************************************************/ #include "emu.h" -#include "video/dp8350.h" +#include "dp8350.h" + #include "screen.h" //#define VERBOSE 1 diff --git a/src/devices/machine/ds8874.cpp b/src/devices/video/ds8874.cpp similarity index 98% rename from src/devices/machine/ds8874.cpp rename to src/devices/video/ds8874.cpp index 2b978d15403e3..681c0f84cd127 100644 --- a/src/devices/machine/ds8874.cpp +++ b/src/devices/video/ds8874.cpp @@ -15,7 +15,7 @@ Only one output is active at a time. */ #include "emu.h" -#include "machine/ds8874.h" +#include "ds8874.h" DEFINE_DEVICE_TYPE(DS8874, ds8874_device, "ds8874", "DS8874 LED Driver") diff --git a/src/devices/machine/ds8874.h b/src/devices/video/ds8874.h similarity index 91% rename from src/devices/machine/ds8874.h rename to src/devices/video/ds8874.h index c7f0355f33de4..e7408d0a4650b 100644 --- a/src/devices/machine/ds8874.h +++ b/src/devices/video/ds8874.h @@ -6,8 +6,8 @@ */ -#ifndef MAME_MACHINE_DS8874_H -#define MAME_MACHINE_DS8874_H +#ifndef MAME_VIDEO_DS8874_H +#define MAME_VIDEO_DS8874_H #pragma once @@ -58,4 +58,4 @@ class ds8874_device : public device_t DECLARE_DEVICE_TYPE(DS8874, ds8874_device) -#endif // MAME_MACHINE_DS8874_H +#endif // MAME_VIDEO_DS8874_H diff --git a/src/devices/video/gb_lcd.cpp b/src/devices/video/gb_lcd.cpp index f9070ad4ec7da..76066883adedf 100644 --- a/src/devices/video/gb_lcd.cpp +++ b/src/devices/video/gb_lcd.cpp @@ -156,7 +156,7 @@ applied but only in the form of wait cycles before the window is started. ***************************************************************************/ #include "emu.h" -#include "video/gb_lcd.h" +#include "gb_lcd.h" #include "screen.h" diff --git a/src/devices/video/gf4500.cpp b/src/devices/video/gf4500.cpp index 63d7ea4ec0fb5..43e232544fb8a 100644 --- a/src/devices/video/gf4500.cpp +++ b/src/devices/video/gf4500.cpp @@ -9,7 +9,7 @@ */ #include "emu.h" -#include "video/gf4500.h" +#include "gf4500.h" #define VERBOSE (0) #include "logmacro.h" diff --git a/src/devices/video/hd44352.cpp b/src/devices/video/hd44352.cpp index c5da136331e05..af781e17e41bd 100644 --- a/src/devices/video/hd44352.cpp +++ b/src/devices/video/hd44352.cpp @@ -7,7 +7,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/hd44352.h" +#include "hd44352.h" #define LCD_BYTE_INPUT 0x01 #define LCD_BYTE_OUTPUT 0x02 diff --git a/src/devices/video/hd44780.cpp b/src/devices/video/hd44780.cpp index ade4187a02761..0c78d01da310f 100644 --- a/src/devices/video/hd44780.cpp +++ b/src/devices/video/hd44780.cpp @@ -119,7 +119,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/hd44780.h" +#include "hd44780.h" //#define VERBOSE 1 #include "logmacro.h" diff --git a/src/devices/video/hlcd0438.cpp b/src/devices/video/hlcd0438.cpp index f92683f79eef5..01b30dbd34382 100644 --- a/src/devices/video/hlcd0438.cpp +++ b/src/devices/video/hlcd0438.cpp @@ -10,7 +10,7 @@ LCD pin can be driven manually, or oscillating. */ #include "emu.h" -#include "video/hlcd0438.h" +#include "hlcd0438.h" DEFINE_DEVICE_TYPE(HLCD0438, hlcd0438_device, "hlcd0438", "Hughes HLCD 0438 LCD Driver") diff --git a/src/devices/video/hlcd0488.cpp b/src/devices/video/hlcd0488.cpp index 016bad5f73d10..293f9e96a0787 100644 --- a/src/devices/video/hlcd0488.cpp +++ b/src/devices/video/hlcd0488.cpp @@ -12,7 +12,7 @@ Hughes HLCD 0488 LCD Driver */ #include "emu.h" -#include "video/hlcd0488.h" +#include "hlcd0488.h" DEFINE_DEVICE_TYPE(HLCD0488, hlcd0488_device, "hlcd0488", "Hughes HLCD 0488 LCD Driver") diff --git a/src/devices/video/hlcd0538.cpp b/src/devices/video/hlcd0538.cpp index 8ec3ed2be625a..dec7d04278cd8 100644 --- a/src/devices/video/hlcd0538.cpp +++ b/src/devices/video/hlcd0538.cpp @@ -16,7 +16,7 @@ In latter case, output frequency is approximately 1/RC. */ #include "emu.h" -#include "video/hlcd0538.h" +#include "hlcd0538.h" DEFINE_DEVICE_TYPE(HLCD0538, hlcd0538_device, "hlcd0538", "Hughes HLCD 0538 LCD Driver") diff --git a/src/devices/video/huc6272.cpp b/src/devices/video/huc6272.cpp index 11a06429fcae0..256e14013f79e 100644 --- a/src/devices/video/huc6272.cpp +++ b/src/devices/video/huc6272.cpp @@ -31,7 +31,7 @@ **************************************************************************************************/ #include "emu.h" -#include "video/huc6272.h" +#include "huc6272.h" #define VERBOSE (LOG_GENERAL) diff --git a/src/devices/video/lc7580.cpp b/src/devices/video/lc7580.cpp index 42b2a6783d7b9..19868db4409a8 100644 --- a/src/devices/video/lc7580.cpp +++ b/src/devices/video/lc7580.cpp @@ -14,7 +14,7 @@ Sanyo LC7580 LCD Driver */ #include "emu.h" -#include "video/lc7580.h" +#include "lc7580.h" #include diff --git a/src/devices/video/m50458.cpp b/src/devices/video/m50458.cpp index 0ccbec7eebe04..93cdf3c801109 100644 --- a/src/devices/video/m50458.cpp +++ b/src/devices/video/m50458.cpp @@ -17,7 +17,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/m50458.h" +#include "m50458.h" #include "screen.h" diff --git a/src/devices/video/mb90082.cpp b/src/devices/video/mb90082.cpp index 27ef9238ec61b..d3bddcd591554 100644 --- a/src/devices/video/mb90082.cpp +++ b/src/devices/video/mb90082.cpp @@ -12,8 +12,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/mb90082.h" - +#include "mb90082.h" //************************************************************************** diff --git a/src/devices/video/mb_vcu.cpp b/src/devices/video/mb_vcu.cpp index 09ac807f13a29..de84566fc6473 100644 --- a/src/devices/video/mb_vcu.cpp +++ b/src/devices/video/mb_vcu.cpp @@ -24,7 +24,8 @@ Written by Angelo Salese, based off old implementation by Jarek Burczynski ***************************************************************************/ #include "emu.h" -#include "video/mb_vcu.h" +#include "mb_vcu.h" + #include "video/resnet.h" diff --git a/src/devices/video/mc6847.cpp b/src/devices/video/mc6847.cpp index 3a1d0457b614c..89e833798f69a 100644 --- a/src/devices/video/mc6847.cpp +++ b/src/devices/video/mc6847.cpp @@ -91,7 +91,7 @@ #include "emu.h" -#include "video/mc6847.h" +#include "mc6847.h" #define LOG_SCANLINE (1U << 1) #define LOG_HSYNC (1U << 2) diff --git a/src/devices/video/md4330b.cpp b/src/devices/video/md4330b.cpp index b44313d8bac29..418fcc40ef822 100644 --- a/src/devices/video/md4330b.cpp +++ b/src/devices/video/md4330b.cpp @@ -13,7 +13,7 @@ It's a simple shift register CMOS LCD driver. */ #include "emu.h" -#include "video/md4330b.h" +#include "md4330b.h" DEFINE_DEVICE_TYPE(MD4330B, md4330b_device, "md4330b", "Mitel MD4330B LCD Driver") diff --git a/src/devices/video/mm5445.cpp b/src/devices/video/mm5445.cpp index 30d5e8b03bcb6..cecd0674495fb 100644 --- a/src/devices/video/mm5445.cpp +++ b/src/devices/video/mm5445.cpp @@ -10,7 +10,7 @@ */ #include "emu.h" -#include "video/mm5445.h" +#include "mm5445.h" DEFINE_DEVICE_TYPE(MM5445, mm5445_device, "mm5445", "MM5445 VFD Driver") diff --git a/src/devices/video/nt7534.cpp b/src/devices/video/nt7534.cpp index e106537686075..44c21b6cb0b33 100644 --- a/src/devices/video/nt7534.cpp +++ b/src/devices/video/nt7534.cpp @@ -10,7 +10,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/nt7534.h" +#include "nt7534.h" #define VERBOSE 0 #include "logmacro.h" diff --git a/src/devices/video/pcd8544.cpp b/src/devices/video/pcd8544.cpp index bb64d5612815c..04f177e873dd6 100644 --- a/src/devices/video/pcd8544.cpp +++ b/src/devices/video/pcd8544.cpp @@ -7,7 +7,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/pcd8544.h" +#include "pcd8544.h" #include "screen.h" diff --git a/src/devices/video/pcf2100.cpp b/src/devices/video/pcf2100.cpp index dcffabfe797f5..1d21947c90d69 100644 --- a/src/devices/video/pcf2100.cpp +++ b/src/devices/video/pcf2100.cpp @@ -15,7 +15,7 @@ Actual segment output frequency is divided by number of LCD commons. */ #include "emu.h" -#include "video/pcf2100.h" +#include "pcf2100.h" DEFINE_DEVICE_TYPE(PCF2100, pcf2100_device, "pcf2100", "Philips PCF2100 LCD Driver") diff --git a/src/devices/video/ppu2c0x.cpp b/src/devices/video/ppu2c0x.cpp index 8078424fa566c..9ec7f66e2de54 100644 --- a/src/devices/video/ppu2c0x.cpp +++ b/src/devices/video/ppu2c0x.cpp @@ -26,7 +26,7 @@ ******************************************************************************/ #include "emu.h" -#include "video/ppu2c0x.h" +#include "ppu2c0x.h" #include "screen.h" diff --git a/src/devices/video/ppu2c0x_sh6578.cpp b/src/devices/video/ppu2c0x_sh6578.cpp index a63fa2a51624e..b2bbc6d995b38 100644 --- a/src/devices/video/ppu2c0x_sh6578.cpp +++ b/src/devices/video/ppu2c0x_sh6578.cpp @@ -5,7 +5,7 @@ ******************************************************************************/ #include "emu.h" -#include "video/ppu2c0x_sh6578.h" +#include "ppu2c0x_sh6578.h" #define LOG_PPU_EXTRA (1U << 1) diff --git a/src/devices/video/ppu2c0x_vt.cpp b/src/devices/video/ppu2c0x_vt.cpp index 3287ccbd6ccde..a4754b421d765 100644 --- a/src/devices/video/ppu2c0x_vt.cpp +++ b/src/devices/video/ppu2c0x_vt.cpp @@ -10,7 +10,7 @@ ******************************************************************************/ #include "emu.h" -#include "video/ppu2c0x_vt.h" +#include "ppu2c0x_vt.h" /* constant definitions */ diff --git a/src/devices/video/psx.cpp b/src/devices/video/psx.cpp index c891830257be2..6ffefd3c981ae 100644 --- a/src/devices/video/psx.cpp +++ b/src/devices/video/psx.cpp @@ -8,8 +8,9 @@ */ #include "emu.h" +#include "psx.h" + #include "cpu/psx/psx.h" -#include "video/psx.h" #include "screen.h" diff --git a/src/devices/video/pwm.cpp b/src/devices/video/pwm.cpp index d1d5064be8734..7d1ae67c10e4f 100644 --- a/src/devices/video/pwm.cpp +++ b/src/devices/video/pwm.cpp @@ -36,7 +36,7 @@ levels of brightness by strobing elements longer. */ #include "emu.h" -#include "video/pwm.h" +#include "pwm.h" #include diff --git a/src/devices/video/ramdac.cpp b/src/devices/video/ramdac.cpp index 4504d7f0debfd..bd674d679c171 100644 --- a/src/devices/video/ramdac.cpp +++ b/src/devices/video/ramdac.cpp @@ -14,7 +14,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/ramdac.h" +#include "ramdac.h" // default address map void ramdac_device::ramdac_palram(address_map &map) diff --git a/src/devices/video/sed1500.cpp b/src/devices/video/sed1500.cpp index 04c3c07bf3509..ac79d30f7341c 100644 --- a/src/devices/video/sed1500.cpp +++ b/src/devices/video/sed1500.cpp @@ -22,7 +22,7 @@ divided by 64 and by number of commons, eg. 64Hz on a SED1500. */ #include "emu.h" -#include "video/sed1500.h" +#include "sed1500.h" DEFINE_DEVICE_TYPE(SED1500, sed1500_device, "sed1500", "Epson SED1500 LCD Driver") diff --git a/src/devices/video/sed1520.cpp b/src/devices/video/sed1520.cpp index 9dd8017155d68..de559af4f9a85 100644 --- a/src/devices/video/sed1520.cpp +++ b/src/devices/video/sed1520.cpp @@ -12,7 +12,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/sed1520.h" +#include "sed1520.h" #include "screen.h" diff --git a/src/devices/video/snes_ppu.cpp b/src/devices/video/snes_ppu.cpp index d83f16a6cae9b..40feb73e53fc4 100644 --- a/src/devices/video/snes_ppu.cpp +++ b/src/devices/video/snes_ppu.cpp @@ -73,7 +73,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/snes_ppu.h" +#include "snes_ppu.h" #define SNES_MAINSCREEN 0 #define SNES_SUBSCREEN 1 diff --git a/src/devices/video/t6a04.cpp b/src/devices/video/t6a04.cpp index a5dc8bfa9284d..989711eb2f3eb 100644 --- a/src/devices/video/t6a04.cpp +++ b/src/devices/video/t6a04.cpp @@ -12,7 +12,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/t6a04.h" +#include "t6a04.h" // devices DEFINE_DEVICE_TYPE(T6A04, t6a04_device, "t6a04", "Toshiba T6A04 LCD Controller") diff --git a/src/devices/video/tms9927.cpp b/src/devices/video/tms9927.cpp index caa7230ad0cc9..12b17acac9951 100644 --- a/src/devices/video/tms9927.cpp +++ b/src/devices/video/tms9927.cpp @@ -7,7 +7,7 @@ **********************************************************************/ #include "emu.h" -#include "video/tms9927.h" +#include "tms9927.h" #include "screen.h" diff --git a/src/devices/video/vic4567.cpp b/src/devices/video/vic4567.cpp index 1208bd243f977..a599f56f88507 100644 --- a/src/devices/video/vic4567.cpp +++ b/src/devices/video/vic4567.cpp @@ -16,7 +16,7 @@ ***************************************************************************/ #include "emu.h" -#include "video/vic4567.h" +#include "vic4567.h" #include "screen.h" diff --git a/src/mame/handheld/hh_cops1.cpp b/src/mame/handheld/hh_cops1.cpp index f3db97b1b3c23..573b2a8bb7117 100644 --- a/src/mame/handheld/hh_cops1.cpp +++ b/src/mame/handheld/hh_cops1.cpp @@ -19,8 +19,8 @@ ROM source notes when dumped from another title, but confident it's the same: #include "emu.h" #include "cpu/cops1/mm5799.h" -#include "machine/ds8874.h" #include "sound/spkrdev.h" +#include "video/ds8874.h" #include "video/pwm.h" #include "speaker.h" diff --git a/src/mame/handheld/hh_tms1k.cpp b/src/mame/handheld/hh_tms1k.cpp index b95e2f0deee88..52df8479da05f 100644 --- a/src/mame/handheld/hh_tms1k.cpp +++ b/src/mame/handheld/hh_tms1k.cpp @@ -232,7 +232,6 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm #include "cpu/tms1000/tms0970.h" #include "cpu/tms1000/tms0980.h" #include "machine/clock.h" -#include "machine/ds8874.h" #include "machine/netlist.h" #include "machine/nvram.h" #include "machine/timer.h" @@ -245,6 +244,7 @@ on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm #include "sound/sn76477.h" #include "sound/spkrdev.h" #include "sound/tms5110.h" +#include "video/ds8874.h" #include "video/hlcd0515.h" #include "video/pwm.h" From e0dc8854200a3e5ad6a0203138b7d037f8451d3e Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 11 Apr 2024 22:36:43 +0200 Subject: [PATCH 066/109] ssimon: fix clickable artwork crash --- src/mame/handheld/hh_tms1k.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/handheld/hh_tms1k.cpp b/src/mame/handheld/hh_tms1k.cpp index 52df8479da05f..dba95bc6e22f8 100644 --- a/src/mame/handheld/hh_tms1k.cpp +++ b/src/mame/handheld/hh_tms1k.cpp @@ -9528,7 +9528,7 @@ static INPUT_PORTS_START( ssimon ) PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.4", 0x0f, EQUALS, 0x00) PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("CPU") // fake + PORT_START("IN.6") // fake PORT_CONFNAME( 0x03, 0x01, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ssimon_state, speed_switch, 0) PORT_CONFSETTING( 0x00, "Simple" ) PORT_CONFSETTING( 0x01, "Normal" ) From 5b50e61af36aeb93b7e2a8c987c61d68bca2ed56 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Fri, 12 Apr 2024 09:51:00 +0700 Subject: [PATCH 067/109] drcbex64,drcbex86: avoid deprecated functions --- src/devices/cpu/drcbex64.cpp | 4 ++-- src/devices/cpu/drcbex86.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index a8abda5a5d43f..96f4b9142b43b 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -869,7 +869,7 @@ void drcbe_x64::reset() a.bind(a.newNamedLabel("entry_point")); FuncDetail entry_point; - entry_point.init(FuncSignatureT(CallConvId::kHost), Environment::host()); + entry_point.init(FuncSignature::build(CallConvId::kHost), Environment::host()); FuncFrame frame; frame.init(entry_point); @@ -1036,7 +1036,7 @@ void drcbe_x64::get_info(drcbe_info &info) void drcbe_x64::alu_op_param(Assembler &a, Inst::Id const opcode, Operand const &dst, be_parameter const ¶m, std::function optimize) { - bool const is64 = dst.size() == 8; + bool const is64 = dst.x86RmSize() == 8; if (param.is_immediate()) { diff --git a/src/devices/cpu/drcbex86.cpp b/src/devices/cpu/drcbex86.cpp index 3f5e4346dea7f..0233ddef33b73 100644 --- a/src/devices/cpu/drcbex86.cpp +++ b/src/devices/cpu/drcbex86.cpp @@ -668,7 +668,7 @@ void drcbe_x86::reset() a.bind(a.newNamedLabel("entry_point")); FuncDetail entry_point; - entry_point.init(FuncSignatureT(CallConvId::kHost), Environment::host()); + entry_point.init(FuncSignature::build(CallConvId::kHost), Environment::host()); FuncFrame frame; frame.init(entry_point); From 700ed63aee27c8ccd61c5c9f4a2d744598dfb5b6 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 12 Apr 2024 14:51:45 +0200 Subject: [PATCH 068/109] 1942: correct default lives dipswitch, igor: lcd battery segment is unused --- src/lib/formats/kc_cas.cpp | 6 +++--- src/mame/capcom/1942.cpp | 24 ++++++++++++------------ src/mame/capcom/1943.cpp | 25 +++++++++++++++---------- src/mame/excalibur/igor.cpp | 2 +- 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/lib/formats/kc_cas.cpp b/src/lib/formats/kc_cas.cpp index 035d18fb4cd3b..dca608f4d34ee 100644 --- a/src/lib/formats/kc_cas.cpp +++ b/src/lib/formats/kc_cas.cpp @@ -243,7 +243,7 @@ static int kc_kcc_fill_wave(int16_t *buffer, int sample_count, uint8_t *bytes) ********************************************************************/ static int kc_kcc_to_wav_size(const uint8_t *casdata, int caslen) { - kc_image_size = caslen ; + kc_image_size = caslen; return kc_handle_kcc( nullptr, casdata ); } @@ -295,7 +295,7 @@ static int kc_tap_fill_wave(int16_t *buffer, int sample_count, uint8_t *bytes) ********************************************************************/ static int kc_tap_to_wav_size(const uint8_t *casdata, int caslen) { - kc_image_size = caslen ; + kc_image_size = caslen; return kc_handle_tap( nullptr, casdata ); } @@ -347,7 +347,7 @@ static int kc_sss_fill_wave(int16_t *buffer, int sample_count, uint8_t *bytes) ********************************************************************/ static int kc_sss_to_wav_size(const uint8_t *casdata, int caslen) { - kc_image_size = caslen ; + kc_image_size = caslen; return kc_handle_sss( nullptr, casdata ); } diff --git a/src/mame/capcom/1942.cpp b/src/mame/capcom/1942.cpp index 5cffedf5124ff..42cac1032d353 100644 --- a/src/mame/capcom/1942.cpp +++ b/src/mame/capcom/1942.cpp @@ -181,6 +181,7 @@ constexpr XTAL MASTER_CLOCK(12_MHz_XTAL); constexpr XTAL MAIN_CPU_CLOCK(MASTER_CLOCK/4); constexpr XTAL SOUND_CPU_CLOCK(MASTER_CLOCK/4); constexpr XTAL AUDIO_CLOCK(MASTER_CLOCK/8); + /* 20mhz OSC - both Z80s are 4 MHz */ constexpr XTAL MASTER_CLOCK_1942P(20_MHz_XTAL); constexpr XTAL MAIN_CPU_CLOCK_1942P(MASTER_CLOCK_1942P/5); @@ -189,6 +190,7 @@ constexpr XTAL AUDIO_CLOCK_1942P(MASTER_CLOCK_1942P/16); } // anonymous namespace + void _1942_state::_1942_bankswitch_w(uint8_t data) { membank("bank1")->set_entry(data & 0x03); @@ -218,8 +220,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(_1942_state::_1942_scanline) } - - void _1942_state::_1942_map(address_map &map) { map(0x0000, 0x7fff).rom(); @@ -359,7 +359,7 @@ static INPUT_PORTS_START( 1942 ) PORT_DIPSETTING( 0x20, "20K 100K 100K+" ) PORT_DIPSETTING( 0x10, "30K 80K 80K+" ) PORT_DIPSETTING( 0x00, "30K 100K 100K+" ) - PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA:2,1") + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA:2,1") PORT_DIPSETTING( 0x80, "1" ) PORT_DIPSETTING( 0x40, "2" ) PORT_DIPSETTING( 0xc0, "3" ) @@ -468,7 +468,7 @@ static INPUT_PORTS_START( 1942p ) PORT_DIPSETTING( 0x20, "20K 100K 100K+" ) PORT_DIPSETTING( 0x10, "30K 80K 80K+" ) PORT_DIPSETTING( 0x00, "30K 100K 100K+" ) - PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA:2,1") + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA:2,1") PORT_DIPSETTING( 0x80, "1" ) PORT_DIPSETTING( 0x40, "2" ) PORT_DIPSETTING( 0xc0, "3" ) @@ -990,7 +990,6 @@ ROM_START( 1942w ) ROM_END - ROM_START( 1942p ) ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASEFF ) /* 64k for code + 3*16k for the banked ROMs images */ ROM_LOAD( "1.bin", 0x00000, 0x8000, CRC(d8506aee) SHA1(aebdce3203e7743d70a8465a5e5766f9f47cb33f) ) // sldh @@ -1027,10 +1026,11 @@ void _1942_state::driver_init() } -GAME( 1984, 1942, 0, _1942, 1942, _1942_state, driver_init, ROT270, "Capcom", "1942 (Revision B)", MACHINE_SUPPORTS_SAVE) -GAME( 1984, 1942a, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "Capcom", "1942 (Revision A)", MACHINE_SUPPORTS_SAVE) -GAME( 1984, 1942abl, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "bootleg", "1942 (Revision A, bootleg)", MACHINE_SUPPORTS_SAVE) // data is the same as 1942a set, different rom format -GAME( 1991, 1942h, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "hack (Two Bit Score)", "Supercharger 1942", MACHINE_SUPPORTS_SAVE) // v1.28A of hack -GAME( 1984, 1942b, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "Capcom", "1942 (First Version)", MACHINE_SUPPORTS_SAVE) -GAME( 1985, 1942w, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "Capcom (Williams Electronics license)", "1942 (Williams Electronics license)", MACHINE_SUPPORTS_SAVE) /* Based on 1942 (Revision B) */ -GAME( 1984, 1942p, 1942, _1942p, 1942p, _1942p_state, driver_init, ROT270, "bootleg", "1942 (Tecfri PCB, bootleg?)", MACHINE_SUPPORTS_SAVE ) +// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY, FULLNAME, FLAGS +GAME( 1984, 1942, 0, _1942, 1942, _1942_state, driver_init, ROT270, "Capcom", "1942 (Revision B)", MACHINE_SUPPORTS_SAVE) +GAME( 1984, 1942a, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "Capcom", "1942 (Revision A)", MACHINE_SUPPORTS_SAVE) +GAME( 1984, 1942abl, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "bootleg", "1942 (Revision A, bootleg)", MACHINE_SUPPORTS_SAVE) // data is the same as 1942a set, different rom format +GAME( 1991, 1942h, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "hack (Two Bit Score)", "Supercharger 1942", MACHINE_SUPPORTS_SAVE) // v1.28A of hack +GAME( 1984, 1942b, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "Capcom", "1942 (First Version)", MACHINE_SUPPORTS_SAVE) +GAME( 1985, 1942w, 1942, _1942, 1942, _1942_state, driver_init, ROT270, "Capcom (Williams Electronics license)", "1942 (Williams Electronics license)", MACHINE_SUPPORTS_SAVE) // based on 1942 (Revision B) +GAME( 1984, 1942p, 1942, _1942p, 1942p, _1942p_state, driver_init, ROT270, "bootleg", "1942 (Tecfri PCB, bootleg?)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/capcom/1943.cpp b/src/mame/capcom/1943.cpp index e03a7b8c36148..b13f4dbfa1776 100644 --- a/src/mame/capcom/1943.cpp +++ b/src/mame/capcom/1943.cpp @@ -114,6 +114,7 @@ void _1943_state::sound_map(address_map &map) map(0xe002, 0xe003).w("ym2", FUNC(ym2203_device::write)); } + /* Input Ports */ static INPUT_PORTS_START( 1943 ) @@ -200,6 +201,7 @@ static INPUT_PORTS_START( 1943 ) PORT_DIPSETTING( 0x80, DEF_STR( On ) ) INPUT_PORTS_END + /* Graphics Layouts */ static const gfx_layout charlayout = @@ -325,6 +327,7 @@ void _1943_state::_1943b(machine_config &config) config.device_remove("mcu"); } + /* ROMs */ ROM_START( 1943 ) @@ -912,13 +915,15 @@ void _1943_state::init_1943() /* Game Drivers */ -GAME( 1987, 1943, 0, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: The Battle of Midway (Euro)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, 1943u, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: The Battle of Midway (US, Rev C)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, 1943ua, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: The Battle of Midway (US)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, 1943j, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: Midway Kaisen (Japan, Rev B)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, 1943ja, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: Midway Kaisen (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, 1943jah, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: Midway Kaisen (Japan, no protection hack)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, 1943b, 1943, _1943b, 1943, _1943_state, init_1943, ROT270, "bootleg", "1943: Battle of Midway (bootleg, hack of Japan set)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, 1943bj, 1943, _1943b, 1943, _1943_state, init_1943, ROT270, "bootleg", "1943: Midway Kaisen (bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, 1943kai, 0, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943 Kai: Midway Kaisen (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, 1943mii, 0, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: The Battle of Midway Mark II (US)", MACHINE_SUPPORTS_SAVE ) + +// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME, FLAGS +GAME( 1987, 1943, 0, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: The Battle of Midway (Euro)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, 1943u, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: The Battle of Midway (US, Rev C)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, 1943ua, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: The Battle of Midway (US)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, 1943j, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: Midway Kaisen (Japan, Rev B)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, 1943ja, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: Midway Kaisen (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, 1943jah, 1943, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: Midway Kaisen (Japan, no protection hack)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, 1943b, 1943, _1943b, 1943, _1943_state, init_1943, ROT270, "bootleg", "1943: Battle of Midway (bootleg, hack of Japan set)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, 1943bj, 1943, _1943b, 1943, _1943_state, init_1943, ROT270, "bootleg", "1943: Midway Kaisen (bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, 1943kai, 0, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943 Kai: Midway Kaisen (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, 1943mii, 0, _1943, 1943, _1943_state, init_1943, ROT270, "Capcom", "1943: The Battle of Midway Mark II (US)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/excalibur/igor.cpp b/src/mame/excalibur/igor.cpp index b5eb6630ff94c..cb61553e62a48 100644 --- a/src/mame/excalibur/igor.cpp +++ b/src/mame/excalibur/igor.cpp @@ -10,6 +10,7 @@ Hardware notes: - Hitachi H8/3214 MCU, 12MHz XTAL - small daughterboard (27C080 pinout) with a 128KB ROM under epoxy - 8-bit DAC (Yageo 10L503G resistor array), KA8602 amplifier +- LCD with 5 7segs and custom segments (BAT segment unused) - no LEDs, button sensors chessboard There's also a newer version from 2000 (model 711E-2) on much weaker hardware, @@ -18,7 +19,6 @@ it has a Samsung KS57C2308 MCU instead. TODO: - it does a cold boot at every reset, so nvram won't work properly unless MAME adds some kind of auxillary autosave state feature at power-off -- where is the low battery signal? *******************************************************************************/ From c5c8474c6f218372774493927fe9366fef7de26b Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 12 Apr 2024 15:22:24 +0200 Subject: [PATCH 069/109] msx ink: fix regression with flash read --- src/devices/bus/msx/cart/ink.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/devices/bus/msx/cart/ink.cpp b/src/devices/bus/msx/cart/ink.cpp index 81861415b996c..1704fac3ded83 100644 --- a/src/devices/bus/msx/cart/ink.cpp +++ b/src/devices/bus/msx/cart/ink.cpp @@ -35,6 +35,7 @@ class msx_cart_ink_device : public device_t, public msx_cart_interface private: required_device m_flash; + template u8 read_page(offs_t offset); template void write_page(offs_t offset, u8 data); }; @@ -65,10 +66,10 @@ std::error_condition msx_cart_ink_device::initialize_cartridge(std::string &mess u8 *flash = memregion("flash")->base(); memcpy(flash, cart_rom_region()->base(), size); - page(0)->install_rom(0x0000, 0x3fff, flash); - page(1)->install_rom(0x4000, 0x7fff, flash + 0x4000); - page(2)->install_rom(0x8000, 0xbfff, flash + 0x8000); - page(3)->install_rom(0xc000, 0xffff, flash + 0xc000); + page(0)->install_read_handler(0x0000, 0x3fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<0>))); + page(1)->install_read_handler(0x4000, 0x7fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<1>))); + page(2)->install_read_handler(0x8000, 0xbfff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<2>))); + page(3)->install_read_handler(0xc000, 0xffff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<3>))); page(0)->install_write_handler(0x0000, 0x3fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<0>))); page(1)->install_write_handler(0x4000, 0x7fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<1>))); page(2)->install_write_handler(0x8000, 0xbfff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<2>))); @@ -77,6 +78,12 @@ std::error_condition msx_cart_ink_device::initialize_cartridge(std::string &mess return std::error_condition(); } +template +u8 msx_cart_ink_device::read_page(offs_t offset) +{ + return m_flash->read(offset | (Page * 0x4000)); +} + template void msx_cart_ink_device::write_page(offs_t offset, u8 data) { From 15e56ea331bebad78d3a5f95c2c156ea73bd36b4 Mon Sep 17 00:00:00 2001 From: cam900 Date: Fri, 12 Apr 2024 22:30:41 +0900 Subject: [PATCH 070/109] itech/capbowl.cpp: Add machine().side_effects_disabled() check for debug (#12236) --- src/mame/itech/capbowl.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mame/itech/capbowl.cpp b/src/mame/itech/capbowl.cpp index fa9409541da2e..e53d27defe603 100644 --- a/src/mame/itech/capbowl.cpp +++ b/src/mame/itech/capbowl.cpp @@ -309,7 +309,8 @@ uint8_t bowlrama_state::blitter_r(offs_t offset) // Read data and increment address case 4: result = data; - m_blitter_addr = (m_blitter_addr + 1) & 0x3ffff; + if (!machine().side_effects_disabled()) + m_blitter_addr = (m_blitter_addr + 1) & 0x3ffff; break; default: From e2b33715eae43a42972f564826bef5b82905f202 Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Fri, 12 Apr 2024 14:32:44 +0100 Subject: [PATCH 071/109] lib/formats/dmk_dsk.cpp: Header byte 4 is not reserved. Fixes MT 8851. (#12232) --- src/lib/formats/dmk_dsk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/formats/dmk_dsk.cpp b/src/lib/formats/dmk_dsk.cpp index d15c4205a0b06..d02401b56cf22 100644 --- a/src/lib/formats/dmk_dsk.cpp +++ b/src/lib/formats/dmk_dsk.cpp @@ -95,7 +95,7 @@ int dmk_format::identify(util::random_read &io, uint32_t form_factor, const std: } // Verify reserved/unsupported header bytes - for (int i = 4; i < 0x10; i++) + for (int i = 5; i < 0x10; i++) { if (header[i] != 0x00) return 0; From cc595536dd4073d94eb18532fedc307e1485be42 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 12 Apr 2024 15:45:11 +0200 Subject: [PATCH 072/109] msx ink: small cleanup --- src/devices/bus/msx/cart/ink.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/devices/bus/msx/cart/ink.cpp b/src/devices/bus/msx/cart/ink.cpp index 1704fac3ded83..9e008e6272632 100644 --- a/src/devices/bus/msx/cart/ink.cpp +++ b/src/devices/bus/msx/cart/ink.cpp @@ -66,14 +66,10 @@ std::error_condition msx_cart_ink_device::initialize_cartridge(std::string &mess u8 *flash = memregion("flash")->base(); memcpy(flash, cart_rom_region()->base(), size); - page(0)->install_read_handler(0x0000, 0x3fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<0>))); - page(1)->install_read_handler(0x4000, 0x7fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<1>))); - page(2)->install_read_handler(0x8000, 0xbfff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<2>))); - page(3)->install_read_handler(0xc000, 0xffff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<3>))); - page(0)->install_write_handler(0x0000, 0x3fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<0>))); - page(1)->install_write_handler(0x4000, 0x7fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<1>))); - page(2)->install_write_handler(0x8000, 0xbfff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<2>))); - page(3)->install_write_handler(0xc000, 0xffff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<3>))); + page(0)->install_readwrite_handler(0x0000, 0x3fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<0>)), emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<0>))); + page(1)->install_readwrite_handler(0x4000, 0x7fff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<1>)), emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<1>))); + page(2)->install_readwrite_handler(0x8000, 0xbfff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<2>)), emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<2>))); + page(3)->install_readwrite_handler(0xc000, 0xffff, emu::rw_delegate(*this, FUNC(msx_cart_ink_device::read_page<3>)), emu::rw_delegate(*this, FUNC(msx_cart_ink_device::write_page<3>))); return std::error_condition(); } From a14e02aa98269f9e6881a02e4aa0ccb069dbc1ad Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Fri, 12 Apr 2024 18:19:59 +0200 Subject: [PATCH 073/109] apple2gs_flop_clcracked.xml: added 7 dumps, used info tags for a lot of dumps [Brian Troha] (#12213) New working software list items ------------------------------- GBA Championship Basketball: Two-on-Two (cleanly cracked) [Brian Troha] Reader Rabbit (Version 2.0) (cleanly cracked) [Brian Troha] ShowOff (Version 1.0) (cleanly cracked) [Brian Troha] Sid Meier's Pirates! (cleanly cracked) [Brian Troha] USA GeoGraph (Version 1.0) (cleanly cracked) [Brian Troha] World GeoGraph (Version 1.3) (cleanly cracked) [Brian Troha] --- hash/apple2gs_flop_clcracked.xml | 722 +++++++++++++++++++++++++------ 1 file changed, 584 insertions(+), 138 deletions(-) diff --git a/hash/apple2gs_flop_clcracked.xml b/hash/apple2gs_flop_clcracked.xml index 31ac10029a7d4..054d1c870b1b5 100644 --- a/hash/apple2gs_flop_clcracked.xml +++ b/hash/apple2gs_flop_clcracked.xml @@ -10,8 +10,10 @@ license:CC0-1.0 4th & Inches (cleanly cracked) 1987 Accolade - + + + @@ -35,8 +37,10 @@ license:CC0-1.0 Aesop's Fables (cleanly cracked) 1988 Unicorn Software - + + + @@ -59,8 +63,10 @@ license:CC0-1.0 All About America (cleanly cracked) 1988 Unicorn Software - + + + @@ -83,8 +89,9 @@ license:CC0-1.0 Ancient Land of Ys (cleanly cracked) 1989 Kyodai - + + @@ -107,8 +114,11 @@ license:CC0-1.0 Arkanoid (version 12-Jan-89) (cleanly cracked) 1988 Taito - + + + + @@ -126,8 +136,11 @@ license:CC0-1.0 Arkanoid II: Revenge of Doh (version 29-Aug-89) (cleanly cracked) 1989 Taito - + + + + @@ -144,8 +157,11 @@ license:CC0-1.0 Arkanoid II: Revenge of Doh (version 18-Jul-89) (cleanly cracked) 1989 Taito - + + + + @@ -162,9 +178,10 @@ license:CC0-1.0 Battle Chess (cleanly cracked) 1989 Interplay - - + + + @@ -180,9 +197,11 @@ license:CC0-1.0 Block Out (version 1.0) (cleanly cracked) 1989 California Dreams - - + + + + @@ -198,8 +217,9 @@ license:CC0-1.0 Bubble Ghost (cleanly cracked) 1988 Accolade - + + @@ -215,8 +235,10 @@ license:CC0-1.0 Bubble Ghost - Hard Drive compatible (cleanly cracked) 1988 Accolade - + + + @@ -233,8 +255,12 @@ license:CC0-1.0 Calendar Crafter (version 1.2) (cleanly cracked) 1987 MECC - + + + + + @@ -250,9 +276,10 @@ license:CC0-1.0 California Games (cleanly cracked) 1988 Epyx - - + + + @@ -268,8 +295,10 @@ license:CC0-1.0 Captain Blood (cleanly cracked) 1989 Mindscape - + + + @@ -285,9 +314,10 @@ license:CC0-1.0 Cavern Cobra (cleanly cracked) 1987 PBI Software - - + + + @@ -303,8 +333,11 @@ license:CC0-1.0 Club Backgammon (version 2.0) (cleanly cracked) 1988 California Dreams - + + + + @@ -320,8 +353,11 @@ license:CC0-1.0 Club Backgammon (version 1.0) (cleanly cracked) 1988 California Dreams - + + + + @@ -337,8 +373,11 @@ license:CC0-1.0 Cribbage King / Gin King (version 1.01) (cleanly cracked) 1989 The Software Toolworks - + + + + @@ -361,8 +400,10 @@ license:CC0-1.0 Defender of the Crown (cleanly cracked) 1988 Cinemaware - + + + @@ -385,8 +426,10 @@ license:CC0-1.0 Déjà Vu (cleanly cracked) 1988 ICOM Simulations - + + + @@ -409,8 +452,10 @@ license:CC0-1.0 Déjà Vu II: Lost in Las Vegas (cleanly cracked) 1989 Mindscape - + + + @@ -433,8 +478,12 @@ license:CC0-1.0 Designer Prints (version 1.0) (cleanly cracked) 1989 MECC - + + + + + @@ -457,8 +506,12 @@ license:CC0-1.0 Designer Puzzles (version 1.0) (cleanly cracked) 1989 MECC - + + + + + @@ -481,8 +534,10 @@ license:CC0-1.0 Destroyer (cleanly cracked) 1987 Epyx - + + + @@ -498,8 +553,11 @@ license:CC0-1.0 Downhill Challenge (cleanly cracked) 1989 Brøderbund Software - + + + + @@ -522,8 +580,11 @@ license:CC0-1.0 Fantavision (version 2.1) (cleanly cracked) 1987 Brøderbund Software - + + + + @@ -541,8 +602,11 @@ license:CC0-1.0 Fantavision (version 1.0) (cleanly cracked) 1987 Brøderbund Software - + + + + @@ -560,8 +624,10 @@ license:CC0-1.0 Fast Break (cleanly cracked) 1989 Accolade - + + + @@ -577,8 +643,9 @@ license:CC0-1.0 Final Assault (cleanly cracked) 1988 Epyx - + + @@ -594,8 +661,9 @@ license:CC0-1.0 Gauntlet (cleanly cracked) 1988 Mindscape - + + @@ -607,12 +675,33 @@ license:CC0-1.0 + + GBA Championship Basketball: Two-on-Two (cleanly cracked) + 1987 + Activision + + + + + + + + + + + + + + + Geometry (version 1.0) (cleanly cracked) 1988 Brøderbund - + + + @@ -641,8 +730,10 @@ license:CC0-1.0 Gnarly Golf (cleanly cracked) 1989 Fanfare by Britannica - + + + @@ -665,9 +756,10 @@ license:CC0-1.0 Grand Prix Circuit (cleanly cracked) 1989 Accolade - - + + + @@ -683,8 +775,10 @@ license:CC0-1.0 Great Western Shootout (cleanly cracked) 1989 Britannica Software - + + + @@ -708,8 +802,10 @@ license:CC0-1.0 Hacker II: The Doomsday Papers (cleanly cracked) 1987 Activision - + + + @@ -725,9 +821,10 @@ license:CC0-1.0 Hardball! (cleanly cracked) 1987 Accolade - - + + + @@ -743,8 +840,9 @@ license:CC0-1.0 Hostage: Rescue Mission (cleanly cracked) 1990 Mindscape - + + @@ -760,9 +858,10 @@ license:CC0-1.0 Impossible Mission II (cleanly cracked) 1989 Epyx - - + + + @@ -778,11 +877,18 @@ license:CC0-1.0 Jack Nicklaus' Greatest 18 Holes of Major Championship Golf (cleanly cracked) 1989 Accolade - + + + + + + + + @@ -796,14 +902,42 @@ license:CC0-1.0 + + + + + + + + + + + + + + + + + + + + + + + + + Jigsaw (version 1.4 - 022988) (cleanly cracked) 1988 Britannica Software - + + + + @@ -826,8 +960,11 @@ license:CC0-1.0 King's Quest - Quest for the Crown (cleanly cracked) 1987 Sierra On-Line - + + + + @@ -850,8 +987,10 @@ license:CC0-1.0 King's Quest II - Romancing The Throne (cleanly cracked) 1987 Sierra On-Line - + + + @@ -874,8 +1013,10 @@ license:CC0-1.0 King's Quest III - To Hier is Human (cleanly cracked) 1988 Sierra On-Line - + + + @@ -898,8 +1039,10 @@ license:CC0-1.0 LaserForce (cleanly cracked) 1989 Fanfare - + + + @@ -922,8 +1065,10 @@ license:CC0-1.0 Leisure Suit Larry in the Land of the Lounge Lizards (cleanly cracked) 1987 Sierra On-Line - + + + @@ -946,8 +1091,10 @@ license:CC0-1.0 Magical Myths (cleanly cracked) 1988 Unicorn Software - + + + @@ -970,8 +1117,11 @@ license:CC0-1.0 Mancala (version 1.0) (cleanly cracked) 1988 California Dreams - + + + + @@ -987,9 +1137,11 @@ license:CC0-1.0 Marble Madness (cleanly cracked) 1986 Electronic Arts - + + + @@ -1005,9 +1157,13 @@ license:CC0-1.0 Math Blaster Plus! (version 1.1) (cleanly cracked) 1989 Davidson and Associates - + + + + - + + @@ -1022,9 +1178,13 @@ license:CC0-1.0 Math Blaster Plus! (version 1.0) (cleanly cracked) 1989 Davidson and Associates - + + + + - + + @@ -1039,8 +1199,10 @@ license:CC0-1.0 Math Wizard (cleanly cracked) 1988 Unicorn Software - + + + @@ -1063,8 +1225,10 @@ license:CC0-1.0 Mavis Beacon Teaches Typing (version 1.8 21-Dec-88) (cleanly cracked) 1987 The Software Toolworks - + + + @@ -1088,8 +1252,10 @@ license:CC0-1.0 Mavis Beacon Teaches Typing (version 1.2 16-Nov-87) (cleanly cracked) 1987 The Software Toolworks - + + + @@ -1113,8 +1279,10 @@ license:CC0-1.0 Mean 18 (cleanly cracked) 1987 Accolade - + + + @@ -1150,8 +1318,12 @@ license:CC0-1.0 Mercury (version 1.0) (cleanly cracked) 1989 MECC - + + + + + @@ -1174,8 +1346,11 @@ license:CC0-1.0 Music Construction Set (version 1.0) (cleanly cracked) 1986 Electronic Arts - + + + + @@ -1191,8 +1366,10 @@ license:CC0-1.0 Neuromancer (cleanly cracked) 1989 Interplay Productions - + + + @@ -1208,8 +1385,10 @@ license:CC0-1.0 Paperboy (cleanly cracked) 1988 Mindscape - + + + @@ -1225,8 +1404,10 @@ license:CC0-1.0 Pipe Dream (cleanly cracked) 1990 Lucasfilm Games - + + + @@ -1242,9 +1423,10 @@ license:CC0-1.0 Qix (version 1.4? 16-Jan-90) (cleanly cracked) 1990 Taito - - + + + @@ -1261,8 +1443,10 @@ license:CC0-1.0 Read and Rhyme (cleanly cracked) 1988 Unicorn Software - + + + @@ -1285,8 +1469,10 @@ license:CC0-1.0 Read-a-Rama (cleanly cracked) 1989 Unicorn Software - + + + @@ -1315,8 +1501,11 @@ license:CC0-1.0 Reader Rabbit (version 2.3) (cleanly cracked) 1987 The Learning Company - + + + + @@ -1332,8 +1521,11 @@ license:CC0-1.0 Reader Rabbit (version 2.2) (cleanly cracked) 1987 The Learning Company - + + + + @@ -1345,12 +1537,35 @@ license:CC0-1.0 + + Reader Rabbit (Version 2.0) (cleanly cracked) + 1987 + The Learning Company + + + + + + + + + + + + + + + + Reading and Me (version 1.0) (cleanly cracked) 1988 Davidson and Associates - + + + + @@ -1373,9 +1588,11 @@ license:CC0-1.0 Sea Strike (version 1.0) (cleanly cracked) 1987 PBI Software - - + + + + @@ -1391,9 +1608,10 @@ license:CC0-1.0 Serve and Volley (cleanly cracked) 1988 Accolade - - + + + @@ -1409,8 +1627,11 @@ license:CC0-1.0 Shanghai (version 15-Sep-87) (cleanly cracked) 1987 Activision - + + + + @@ -1427,9 +1648,13 @@ license:CC0-1.0 Shanghai (version 20-Jan-87) (cleanly cracked) 1987 Activision - + + + - + + + @@ -1445,8 +1670,11 @@ license:CC0-1.0 ShowOff (version 1.1) (cleanly cracked) 1987 Brøderbund Software - + + + + @@ -1471,12 +1699,70 @@ license:CC0-1.0 + + ShowOff (Version 1.0) (cleanly cracked) + 1987 + Brøderbund Software + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sid Meier's Pirates! (cleanly cracked) + 1987 + Microprose + + + + + + + + + + + + + + + + + Silent Service (version 925.01) (cleanly cracked) 1987 Microprose - + + + + @@ -1492,8 +1778,10 @@ license:CC0-1.0 Silpheed - Super Dogfighter (cleanly cracked) 1987 Sierra On-Line - + + + @@ -1516,8 +1804,11 @@ license:CC0-1.0 Skate or Die (version 1.1 07-Oct-88) (cleanly cracked) 1988 Electronic Arts - + + + + @@ -1535,8 +1826,11 @@ license:CC0-1.0 Skate or Die (version 1.0 12-Aug-88) (cleanly cracked) 1988 Electronic Arts - + + + + @@ -1556,6 +1850,7 @@ license:CC0-1.0 Sierra On-Line + @@ -1578,8 +1873,10 @@ license:CC0-1.0 Space Quest II - Vohual's Revenge (cleanly cracked) 1988 Sierra On-Line - + + + @@ -1602,8 +1899,10 @@ license:CC0-1.0 Spirit of Excalibur (cleanly cracked) 1991 Virgin Mastertronic - + + + @@ -1632,8 +1931,12 @@ license:CC0-1.0 Storybook Weaver (version 1.0) (cleanly cracked) 1990 MECC - + + + + + @@ -1656,8 +1959,12 @@ license:CC0-1.0 Storybook Weaver - World of Adventure (version 1.0) (cleanly cracked) 1991 MECC - + + + + + @@ -1680,8 +1987,12 @@ license:CC0-1.0 Storybook Weaver - World of Make-Believe (version 1.0) (cleanly cracked) 1991 MECC - + + + + + @@ -1704,9 +2015,11 @@ license:CC0-1.0 Street Sports Soccer (cleanly cracked) 1988 Epyx - + + - + + @@ -1721,8 +2034,10 @@ license:CC0-1.0 Superstar Ice Hockey (cleanly cracked) 1988 Mindscape - + + + @@ -1738,8 +2053,10 @@ license:CC0-1.0 Tales From The Arabian Nights (cleanly cracked) 1988 Unicorn Software - + + + @@ -1762,9 +2079,10 @@ license:CC0-1.0 Task Force (cleanly cracked) 1990 Britannica Software - - + + + @@ -1787,8 +2105,10 @@ license:CC0-1.0 Tetris (cleanly cracked) 1988 Spectrum HoloByte - + + + @@ -1804,8 +2124,10 @@ license:CC0-1.0 The Adventures of Sinbad (cleanly cracked) 1988 Unicorn Software - + + + @@ -1828,9 +2150,10 @@ license:CC0-1.0 The Duel: Test Drive II (cleanly cracked) 1989 Accolade - - + + + @@ -1872,8 +2195,11 @@ license:CC0-1.0 The Fidelity Chessmaster 2100 (version 1.1 17-Nov-88) (cleanly cracked) 1988 The Software Toolworks - + + + + @@ -1897,8 +2223,11 @@ license:CC0-1.0 The Fidelity Chessmaster 2100 (version 1.01 28-Sep-88) (cleanly cracked) 1988 The Software Toolworks - + + + + @@ -1922,8 +2251,10 @@ license:CC0-1.0 The Graphics Studio (cleanly cracked) 1987 Accolade - + + + @@ -1939,8 +2270,10 @@ license:CC0-1.0 The Immortal (cleanly cracked) 1990 Electronic Arts - + + + @@ -1963,8 +2296,10 @@ license:CC0-1.0 The King of Chicago (cleanly cracked) 1988 Cinemaware - + + + @@ -1987,9 +2322,10 @@ license:CC0-1.0 The Last Ninja (cleanly cracked) 1988 Activision - - + + + @@ -2005,8 +2341,11 @@ license:CC0-1.0 The Logic Master (version 1.5) (cleanly cracked) 1990 Unicorn Software - + + + + @@ -2029,8 +2368,11 @@ license:CC0-1.0 The Print Shop (version 1.0) (cleanly cracked) 1987 Brøderbund Software - + + + + @@ -2047,8 +2389,10 @@ license:CC0-1.0 The Third Courier (cleanly cracked) 1989 Accolade - + + + @@ -2071,8 +2415,10 @@ license:CC0-1.0 The Tower of Myraglen (version 1.0) (cleanly cracked) 1987 PBI Software - + + + @@ -2095,8 +2441,10 @@ license:CC0-1.0 The Three Stooges (cleanly cracked) 1987 Cinemaware - + + + @@ -2119,8 +2467,10 @@ license:CC0-1.0 The Wonders of the Animal Kingdom (cleanly cracked) 1989 Unicorn Software - + + + @@ -2143,8 +2493,10 @@ license:CC0-1.0 The Word Master (cleanly cracked) 1989 Unicorn Software - + + + @@ -2160,8 +2512,11 @@ license:CC0-1.0 Thexder (version 2.7) (cleanly cracked) 1987 Sierra On-Line - + + + + @@ -2177,8 +2532,11 @@ license:CC0-1.0 Thexder (version 1.0) (cleanly cracked) (No OS, not self booting) 1987 Sierra - + + + + @@ -2196,8 +2554,10 @@ license:CC0-1.0 Topdraw (version 1.00A) (cleanly cracked) 1987 Styleware Software - + + + @@ -2214,8 +2574,11 @@ license:CC0-1.0 TrianGo (version 1.0) (cleanly cracked) 1988 California Dreams - + + + + @@ -2231,9 +2594,10 @@ license:CC0-1.0 Uninvited (cleanly cracked) 1988 ICOM Simulations - - + + + @@ -2252,12 +2616,42 @@ license:CC0-1.0 + + USA GeoGraph (Version 1.0) (cleanly cracked) + 1989 + MECC + + + + + + + + + + + + + + + + + + + + + + + Vegas Craps (version 1.0) (cleanly cracked) 1988 California Dreams - + + + + @@ -2273,8 +2667,11 @@ license:CC0-1.0 Vegas Gambler (version 1.1 25-Jul-88) (cleanly cracked) 1988 California Dreams - + + + + @@ -2291,8 +2688,11 @@ license:CC0-1.0 Vegas Gambler (version 1.0 07-Jun-88) (cleanly cracked) 1988 California Dreams - + + + + @@ -2309,8 +2709,10 @@ license:CC0-1.0 War in Middle Earth (cleanly cracked) 1989 Melbourne House - + + + @@ -2333,8 +2735,10 @@ license:CC0-1.0 Where in the U.S.A. is Carmen Sandiego? (cleanly cracked) 1989 Brøderbund Software - + + + @@ -2357,8 +2761,10 @@ license:CC0-1.0 Where in the World is Carmen Sandiego? (cleanly cracked) 1989 Brøderbund Software - + + + @@ -2381,8 +2787,10 @@ license:CC0-1.0 Winter Games (cleanly cracked) 1987 Epyx - + + + @@ -2398,8 +2806,10 @@ license:CC0-1.0 World Games (cleanly cracked) 1987 Epyx - + + + @@ -2411,12 +2821,41 @@ license:CC0-1.0 + + World GeoGraph (Version 1.3) (cleanly cracked) + 1989 + MECC + + + + + + + + + + + + + + + + + + + + + + + World Tour Golf (cleanly cracked) 1987 Electronic Arts - + + + @@ -2432,8 +2871,10 @@ license:CC0-1.0 Writer's Choice Elite (cleanly cracked) 1987 Activision - + + + @@ -2449,9 +2890,11 @@ license:CC0-1.0 Xenocide (version 25-Sep-89) (unprotected) 1989 Micro Revelations - - + + + + @@ -2468,9 +2911,11 @@ license:CC0-1.0 Xenocide (version 11-Aug-89) (cleanly cracked) 1989 Micro Revelations - - + + + + @@ -2487,9 +2932,10 @@ license:CC0-1.0 Zany Golf (cleanly cracked) 1988 Electronic Arts - - + + + From 338ded1f25a79eff788c2edb5642e7e5c789b4ef Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Fri, 12 Apr 2024 18:29:32 +0200 Subject: [PATCH 074/109] New systems marked not working ------------------------------ Knights in Armor [Jeff Anderson, Seth Soffer] Wheels II [Jeff Anderson, Seth Soffer] --- src/mame/mame.lst | 4 ++ src/mame/midway/midwayttl.cpp | 99 +++++++++++++++++++++++++++++++++++ src/mame/misc/pse.cpp | 54 +++++++++---------- 3 files changed, 128 insertions(+), 29 deletions(-) create mode 100644 src/mame/midway/midwayttl.cpp diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 3e1014087b080..4bebfe1f8dcde 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -27581,6 +27581,9 @@ wargods // (c) 1996 Midway (HD 10/09/1996 - Dual Resolut wargodsa // (c) 1996 Midway (HD 08/15/1996) wargodsb // (c) 1996 Midway (HD 12/11/1995) +@source:midway/midwayttl.cpp +wheelsii // + @source:midway/midwunit.cpp mk3 // (c) 1994 Midway mk3p40 // (c) 1994 Midway @@ -31499,6 +31502,7 @@ bazookabr // (c) 1977 Taito do Brasil dpatrol // (c) 1977 PSE dpatrola // (c) 1977 PSE / Telegames gametree // (c) 1978 PSE +knightar // (c) 1976 PSE @source:misc/quizo.cpp quizo // (c) 1985 Seoul Coin Corp. diff --git a/src/mame/midway/midwayttl.cpp b/src/mame/midway/midwayttl.cpp new file mode 100644 index 0000000000000..00466cd57fbe5 --- /dev/null +++ b/src/mame/midway/midwayttl.cpp @@ -0,0 +1,99 @@ +// license:BSD-3-Clause +// copyright-holders: + +/* +This driver contains early non-CPU Midway dumps, until they are emulated and moved as needed +*/ + +#include "emu.h" + +#include "machine/netlist.h" +#include "netlist/devices/net_lib.h" +#include "video/fixfreq.h" + + +namespace { + +// TODO: just a placeholder, everything needs to be updated + +#define MASTER_CLOCK 7159000 +#define V_TOTAL (0x105+1) // 262 +#define H_TOTAL (0x1C6+1) // 454 + +#define HBSTART (H_TOTAL) +#define HBEND (80) +#define VBSTART (V_TOTAL) +#define VBEND (16) + +#define HRES_MULT (1) + + +class midwayttl_state : public driver_device +{ +public: + midwayttl_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_video(*this, "fixfreq") + { + } + + void midwayttl(machine_config &config); + +private: + required_device m_maincpu; + required_device m_video; + +}; + + +static NETLIST_START(midwayttl) // TODO: just a placeholder, everything needs to be updated +{ + SOLVER(Solver, 48000) +// PARAM(Solver.FREQ, 48000) + PARAM(Solver.ACCURACY, 1e-4) + + // schematics + //... +} + + +void midwayttl_state::midwayttl(machine_config &config) +{ + // basic machine hardware + NETLIST_CPU(config, m_maincpu, netlist::config::DEFAULT_CLOCK()).set_source(netlist_midwayttl); + + // video hardware + SCREEN(config, "screen", SCREEN_TYPE_RASTER); // TODO: just a placeholder, everything needs to be updated + FIXFREQ(config, m_video).set_screen("screen"); + m_video->set_monitor_clock(MASTER_CLOCK); + m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL); + m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL); + m_video->set_fieldcount(1); + m_video->set_threshold(0.30); +} + + +ROM_START( wheelsii ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + + ROM_REGION( 0x1a0, "roms", 0 ) // All PROMs TI SN74188N. Read as National 74S188 + ROM_LOAD( "257.1k", 0x000, 0x020, CRC(00b8fef8) SHA1(e3f465b9df78cfbd8f4547b8b4d45281e30a2a89) ) + ROM_LOAD( "258.5k", 0x020, 0x020, CRC(eab44d13) SHA1(daed044e5759de22055c4dcaeeb57b12d572ca2b) ) + ROM_LOAD( "259.5l", 0x040, 0x020, CRC(ba31afc0) SHA1(f583dc898e6ecaa1dd6ac78fe9bea6619858d83c) ) + ROM_LOAD( "260.1p", 0x060, 0x020, CRC(2cf891d6) SHA1(625f904b97ed5b714b9174d70dbc247b2cb8cb22) ) + ROM_LOAD( "261.1j", 0x080, 0x020, CRC(8aa08f16) SHA1(7fc6a6a3b75640beddffa482012e724f0af332b3) ) + ROM_LOAD( "262.15j", 0x0a0, 0x020, CRC(814d0588) SHA1(6680b5dcd9af9ac1cef310b462a0f82c63616967) ) + ROM_LOAD( "263.15p", 0x0c0, 0x020, CRC(ada34863) SHA1(4491b38c5e17242459f38ac7c683371f7fdfe05e) ) + ROM_LOAD( "264.15r", 0x0e0, 0x020, CRC(a7114570) SHA1(1f91d1cc08cc3c4943bd6a6ac231f43935853cbe) ) + ROM_LOAD( "265.7p", 0x100, 0x020, CRC(501953ba) SHA1(f1016676c90def8a6aff1c8999c2a6ab2cb10398) ) + ROM_LOAD( "266.7r", 0x120, 0x020, CRC(a0eeb385) SHA1(7044c1ab239e3ec60a63b841c09cdf2b1d25a39b) ) + ROM_LOAD( "267.9p", 0x140, 0x020, CRC(a6983222) SHA1(265501cda78d85bdd82b0b6fa4731b519e40a9b7) ) + ROM_LOAD( "268.9r", 0x160, 0x020, CRC(715cb8da) SHA1(b72c8b549220b36d179b03ab5dfafda20d66fd56) ) + ROM_LOAD( "269.10k", 0x180, 0x020, CRC(eeb6a479) SHA1(e4f0540c1c5d0a5c9037ce9e9dcc1150eeeea3f9) ) +ROM_END + +} // anonymous namespace + + +GAME( 1975, wheelsii, 0, midwayttl, 0, midwayttl_state, empty_init, ROT0, "Midway", "Wheels II", MACHINE_IS_SKELETON ) diff --git a/src/mame/misc/pse.cpp b/src/mame/misc/pse.cpp index 6de68d34d4276..ea1aff8a338d8 100644 --- a/src/mame/misc/pse.cpp +++ b/src/mame/misc/pse.cpp @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Fabio Priuli,Dave Widel, gregf +// copyright-holders: Fabio Priuli, Dave Widel, gregf + /*************************************************************************** Project Support Engineering Games @@ -58,20 +59,16 @@ class pse_state : public driver_device { } - // devices - required_device m_maincpu; - required_device m_video; - void pse(machine_config &config); -protected: - // driver_device overrides +protected: virtual void machine_start() override; virtual void machine_reset() override; - virtual void video_start() override; private: + required_device m_maincpu; + required_device m_video; }; @@ -106,10 +103,10 @@ void pse_state::video_start() void pse_state::pse(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware NETLIST_CPU(config, m_maincpu, netlist::config::DEFAULT_CLOCK()).set_source(netlist_pse); - /* video hardware */ + // video hardware SCREEN(config, "screen", SCREEN_TYPE_RASTER); FIXFREQ(config, m_video).set_screen("screen"); m_video->set_monitor_clock(MASTER_CLOCK); @@ -153,16 +150,16 @@ ROM_END ROM_START( dpatrol ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_REGION( 0x0CA0, "roms", ROMREGION_ERASE00 ) + ROM_REGION( 0x0ca0, "roms", ROMREGION_ERASE00 ) ROM_LOAD( "bd1.d2", 0x0000, 0x0400, CRC(e4c8e4ab) SHA1(0b989ca9369139f212dcea1d1461998f20057db8)) // Computer program game code. 6341-1 or 82S181 according to Desert Patrol schematics - sldh w/dpatrola ROM_LOAD( "bd1.e2", 0x0400, 0x0400, CRC(256b3320) SHA1(712573e3d9625a84c54bbe2e3edafb8879a14b2e)) // Computer program game code. 6341-1 or 82S181 according to Desert Patrol schematics - sldh w/dpatrola ROM_LOAD( "bd2.l4", 0x0800, 0x0200, CRC(bc87c648) SHA1(c4709d155aa50cc87146abd152a11de618cfd64c)) // PROM 1 contains aircraft target images and explosion image. PCB has 82S141; schematics show 6341-1 - ROM_LOAD( "bd2.l1", 0x0A00, 0x0200, CRC(4ddcc237) SHA1(6bfad6a8bf8387e93c0bb1a04b647690b3701d54)) // PROM 2 contains parachute and man, falling man. PCB has 82S141; schematics show 6341-1 (from dpatrola, but expected to match) + ROM_LOAD( "bd2.l1", 0x0a00, 0x0200, CRC(4ddcc237) SHA1(6bfad6a8bf8387e93c0bb1a04b647690b3701d54)) // PROM 2 contains parachute and man, falling man. PCB has 82S141; schematics show 6341-1 (from dpatrola, but expected to match) - ROM_LOAD( "bd2.h7", 0x0C00, 0x0020, NO_DUMP) // Contains PROM address codes and image speeds. Each image has its own speed and address block in the image PROM. Chip is 82S123 + ROM_LOAD( "bd2.h7", 0x0c00, 0x0020, NO_DUMP) // Contains PROM address codes and image speeds. Each image has its own speed and address block in the image PROM. Chip is 82S123 - ROM_LOAD( "bd3.d1", 0x0C20, 0x0080, NO_DUMP ) // Data in PROM is organized to produce the waveform of a human scream. Chip type is 8574 or MM6301-0J + ROM_LOAD( "bd3.d1", 0x0c20, 0x0080, NO_DUMP ) // Data in PROM is organized to produce the waveform of a human scream. Chip type is 8574 or MM6301-0J ROM_END ROM_START( dpatrola ) @@ -180,15 +177,14 @@ ROM_START( dpatrola ) ROM_LOAD( "bd3.d1", 0x0820, 0x0080, NO_DUMP ) // Data in PROM is organized to produce the waveform of a human scream. Chip type is 8574 or MM6301-0J. Was not present on dumped PCB. ROM_END -/* ROM_START( knightar ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_REGION( 0x0020, "roms", ROMREGION_ERASE00 ) - ROM_LOAD( "1.m1" ) // Man ROM stores image characters of knights. 82S115P or 8205R according to Knights in Armor schematics - ROM_LOAD( "2.m2" ) // Horse ROM stores image characters of horses. 82S115P or 8205R according to Knights in Armor schematics + ROM_REGION( 0x0400, "roms", ROMREGION_ERASE00 ) + ROM_LOAD( "1.m1", 0x0000, 0x0200, CRC(7aa9c36c) SHA1(e06c4bf3311cd818d57c96d937e315d433dce457) ) // Man ROM stores image characters of knights. 82S115P or 8205R according to Knights in Armor schematics, but MMI 6341 on the dumped PCB + ROM_LOAD( "2.m2", 0x0200, 0x0200, CRC(a6705909) SHA1(0cbf033bff33b1b0a45e9190f527b7c00507250d) ) // Horse ROM stores image characters of horses. 82S115P or 8205R according to Knights in Armor schematics, but MMI 6341 on the dumped PCB ROM_END -*/ + ROM_START( gametree ) @@ -199,10 +195,10 @@ ROM_START( gametree ) ROM_LOAD( "bd1gthi.f2", 0x0400, 0x0400, CRC(3c5a04ac) SHA1(427bae562c019257bcd050458d64670874d903fb)) // Computer program game code. PCB has Signetics 82s2708; schematics show 6341-1 or 82S181 ROM_LOAD( "bd2gt1a.f12", 0x0800, 0x0200, CRC(820cec79) SHA1(b7142d75ba1cd4ebb0b69dd1184c6e1ea0611ba9)) // PROM 1 contains squirrel and squirrel point value. PCB has NEC B425; schematics show 82S141 or 6341-1 - ROM_LOAD( "bd2gt1b.f14", 0x0A00, 0x0200, CRC(52abe627) SHA1(960f19bef52fb5cf9fb74ab928a8dcb09922049d)) // PROM 1 contains squirrel and squirrel point value. PCB has NEC B425; schematics show 82S141 or 6341-1 + ROM_LOAD( "bd2gt1b.f14", 0x0a00, 0x0200, CRC(52abe627) SHA1(960f19bef52fb5cf9fb74ab928a8dcb09922049d)) // PROM 1 contains squirrel and squirrel point value. PCB has NEC B425; schematics show 82S141 or 6341-1 - ROM_LOAD( "bd2gt2a.e12", 0x0C00, 0x0200, CRC(5d8ef022) SHA1(8e6ccfded85b0611670e6a7fb99c0b279f79445e)) // PROM 2 contains other targets (rabbit and turkey) and point values. PCB has NEC B425 - ROM_LOAD( "bd2gt2b.e14", 0x0E00, 0x0200, CRC(9ca95a82) SHA1(c5057cbae18d71e6a04dd4ec87b83a5690a23888)) // PROM 2 - PCB has NEC B425; schematics show 82S141 or 6341-1 + ROM_LOAD( "bd2gt2a.e12", 0x0c00, 0x0200, CRC(5d8ef022) SHA1(8e6ccfded85b0611670e6a7fb99c0b279f79445e)) // PROM 2 contains other targets (rabbit and turkey) and point values. PCB has NEC B425 + ROM_LOAD( "bd2gt2b.e14", 0x0e00, 0x0200, CRC(9ca95a82) SHA1(c5057cbae18d71e6a04dd4ec87b83a5690a23888)) // PROM 2 - PCB has NEC B425; schematics show 82S141 or 6341-1 ROM_LOAD( "bd2a2.a2", 0x1000, 0x0020, CRC(1df96293) SHA1(7c8d19e34803efbe648b1db2d8c0c9a637df57d2)) // Contains PROM address codes and image speeds. Each has its own speed and address block in the image PROM. PCB has MMI 6331 @@ -212,9 +208,9 @@ ROM_END } // anonymous namespace -GAME( 1976, bazooka, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Bazooka", MACHINE_IS_SKELETON ) -GAME( 1977, bazookabr, bazooka, pse, 0, pse_state, empty_init, ROT0, "Taito do Brasil", "Bazooka (Brazil)", MACHINE_IS_SKELETON ) -GAME( 1977, dpatrol, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Desert Patrol", MACHINE_IS_SKELETON ) -GAME( 1977, dpatrola, dpatrol, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering (Telegames license)", "Desert Patrol (set 2)", MACHINE_IS_SKELETON ) -GAME( 1978, gametree, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Game Tree", MACHINE_IS_SKELETON ) -//GAME( 1976, knightar, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Knights in Armor", MACHINE_IS_SKELETON ) +GAME( 1976, bazooka, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Bazooka", MACHINE_IS_SKELETON ) +GAME( 1976, knightar, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Knights in Armor", MACHINE_IS_SKELETON ) +GAME( 1977, bazookabr, bazooka, pse, 0, pse_state, empty_init, ROT0, "Taito do Brasil", "Bazooka (Brazil)", MACHINE_IS_SKELETON ) +GAME( 1977, dpatrol, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Desert Patrol", MACHINE_IS_SKELETON ) +GAME( 1977, dpatrola, dpatrol, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering (Telegames license)", "Desert Patrol (set 2)", MACHINE_IS_SKELETON ) +GAME( 1978, gametree, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Game Tree", MACHINE_IS_SKELETON ) From 0fd858173bdc6c7b2ae9dbc5b8f8f23c704b7ad2 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Fri, 12 Apr 2024 18:32:24 +0200 Subject: [PATCH 075/109] Clones promoted to working -------------------------- Xiao Ao Jiang Hu (China, Ver. 1.00) [AJR, Guru] - subsino/subsino2.cpp: dumped GFX ROM for xiaoao [Guru] - subsino/subsino.cpp: updated ndongmul ROM loading so that it boots. Still need correct reel GFX loading / decoding and also hangs after a while. --- src/mame/bmc/koftball.cpp | 2 +- src/mame/mame.lst | 14 +++++++------- src/mame/subsino/subsino.cpp | 15 ++++++++++----- src/mame/subsino/subsino2.cpp | 8 ++------ 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/mame/bmc/koftball.cpp b/src/mame/bmc/koftball.cpp index ba3877361d81b..d6f5ac4489d97 100644 --- a/src/mame/bmc/koftball.cpp +++ b/src/mame/bmc/koftball.cpp @@ -7,7 +7,7 @@ King Of Football (c)1995 BMC preliminary driver by Tomasz Slanina TODO: -- uses same 'pixmap' as bmc/bmcpokr.cpp. Noted uses are for jxzh's test mode and bookkeeping. +- uses a 'pixmap' like bmc/bmcpokr.cpp. Noted uses are for jxzh's test mode and bookkeeping. For now implementation is just copied over, but it needs to be adapted; - lots of unknown writes / reads; - one of the customs could contain a VIA6522-like core. bmc/bmcbowl.cpp uses the VIA6522 and the diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 4bebfe1f8dcde..577afddba124a 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -42727,25 +42727,25 @@ expcard // (c) 1998 American Alpha humlan // (c) 2001 Subsino & Truemax mtrain // (c) 1997 Subsino mtraina // (c) 1996 Subsino -strain -tbonusal // (c) 1996 American Alpha new2001 // (c) 2000 Subsino ptrain // (c) 1999 Subsino ptraina // (c) 1999 Subsino +qbeebing queenbee // (c) 2001 American Alpha queenbeeb // (c) 2001 Subsino queenbeei // (c) 2001 Subsino queenbeesa // (c) 2001 Subsino saklove // (c) 1998 Subsino squeenb // (c) 2002 Subsino -wtrnymph // (c) 1996 Subsino -xplan // (c) 2006 Subsino -xtrain // (c) 1999 Subsino -qbeebing -treamary +strain +tbonusal // (c) 1996 American Alpha treacity treacity202 +treamary +wtrnymph // (c) 1996 Subsino xiaoao +xplan // (c) 2006 Subsino +xtrain // (c) 1999 Subsino @source:sun/sun1.cpp sun1 // diff --git a/src/mame/subsino/subsino.cpp b/src/mame/subsino/subsino.cpp index 0c19ea183ff76..5bd30f1125a19 100644 --- a/src/mame/subsino/subsino.cpp +++ b/src/mame/subsino/subsino.cpp @@ -3466,13 +3466,18 @@ ROM_START( ndongmul ) HD647180X_FAKE_INTERNAL_ROM ROM_REGION( 0x20000, "program", 0 ) - ROM_LOAD( "tms27c010a.u26", 0x00000, 0x20000, CRC(cf30ed7e) SHA1(138bbfa252769d19b976906a057e54e41135ebe7) ) + ROM_LOAD( "tms27c010a.u26", 0x10000, 0x10000, CRC(cf30ed7e) SHA1(138bbfa252769d19b976906a057e54e41135ebe7) ) + ROM_CONTINUE( 0x00000, 0x10000 ) ROM_REGION( 0x40000, "tilemap", 0 ) - ROM_LOAD( "m27512.u24", 0x00000, 0x10000, CRC(c3a4460c) SHA1(a8c663354faded0012e8fc18d37fdbe76e301fc1) ) - ROM_LOAD( "nm27c512q.u24a", 0x10000, 0x10000, CRC(e86f4432) SHA1(d545087561c93690438affea8994da1e6e3ce8af) ) - ROM_LOAD( "d27c512.u25", 0x20000, 0x10000, CRC(9ca948c1) SHA1(bf407820b10bea1726e00786892188e3dc07018f) ) - ROM_LOAD( "m27c512.u25a", 0x30000, 0x10000, CRC(1b943b64) SHA1(518c0e18bb942c8756364d60d9390e02e79e94f4) ) + ROM_LOAD( "m27512.u24", 0x00000, 0x08000, CRC(c3a4460c) SHA1(a8c663354faded0012e8fc18d37fdbe76e301fc1) ) + ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_LOAD( "nm27c512q.u24a", 0x08000, 0x08000, CRC(e86f4432) SHA1(d545087561c93690438affea8994da1e6e3ce8af) ) + ROM_CONTINUE( 0x18000, 0x08000 ) + ROM_LOAD( "d27c512.u25", 0x20000, 0x08000, CRC(9ca948c1) SHA1(bf407820b10bea1726e00786892188e3dc07018f) ) + ROM_CONTINUE( 0x30000, 0x08000 ) + ROM_LOAD( "m27c512.u25a", 0x28000, 0x08000, CRC(1b943b64) SHA1(518c0e18bb942c8756364d60d9390e02e79e94f4) ) + ROM_CONTINUE( 0x38000, 0x08000 ) ROM_REGION( 0x20000, "reels", 0 ) ROM_LOAD( "tms27c512.u29", 0x00000, 0x10000, BAD_DUMP CRC(c271fb5f) SHA1(980ab3f14b84dcb1802519047b6afdf0671259d2) ) // Bitrotten, address 0x00410 sometimes reads as 0002 and others as 0003 diff --git a/src/mame/subsino/subsino2.cpp b/src/mame/subsino/subsino2.cpp index c1478ac125f3f..44eeba3210848 100644 --- a/src/mame/subsino/subsino2.cpp +++ b/src/mame/subsino/subsino2.cpp @@ -3142,11 +3142,7 @@ ROM_START( xiaoao ) ROM_LOAD( "1-v100.u21", 0x00000, 0x80000, CRC(728b4597) SHA1(97f92b9a6c455d2d906d55482166fd9704253615) ) ROM_REGION( 0x400000, "tilemap", 0 ) - ROM_LOAD( "graphics.bin", 0x000000, 0x400000, NO_DUMP ) // SSOP70 ROM not dumped yet; using ROMs from bishjan for now - ROM_LOAD32_BYTE( "3-v201.u25", 0x000000, 0x100000, CRC(e013e647) SHA1(a5b0f82f3454393c1ea5e635b0d37735a25e2ea5) BAD_DUMP ) - ROM_LOAD32_BYTE( "4-v201.u26", 0x000002, 0x100000, CRC(e0d40ef1) SHA1(95f80889103a7b93080b46387274cb1ffe0c8768) BAD_DUMP ) - ROM_LOAD32_BYTE( "5-v201.u27", 0x000001, 0x100000, CRC(85067d40) SHA1(3ecf7851311a77a0dfca90775fcbf6faabe9c2ab) BAD_DUMP ) - ROM_LOAD32_BYTE( "6-v201.u28", 0x000003, 0x100000, CRC(430bd9d7) SHA1(dadf5a7eb90cf2dc20f97dbf20a4b6c8e7734fb1) BAD_DUMP ) + ROM_LOAD( "mj-gc1.u24", 0x000000, 0x400000, CRC(ed3eaaea) SHA1(941ef99dfb2ba0e26112dcd992f7690a1dba8d9c) ) ROM_REGION( 0x100000, "samples", 0 ) ROM_LOAD( "mj-v1.u10", 0x000000, 0x100000, CRC(4d797394) SHA1(fa40a410f903cd81f15c3a86a60ad405b5db8168) ) @@ -4052,7 +4048,7 @@ GAME( 1997, treacity, 0, saklove, treacity, subsino2_state, empty_init, GAME( 1997, treacity202, treacity,saklove, treacity, subsino2_state, empty_init, ROT0, "Subsino (American Alpha license)", "Treasure City (Ver. 202)", MACHINE_NOT_WORKING ) GAME( 1999, bishjan, 0, bishjan, bishjan, subsino2_state, init_bishjan, ROT0, "Subsino", "Bishou Jan (Japan, Ver. 203)", MACHINE_NO_SOUND ) -GAME( 200?, xiaoao, bishjan, xiaoao, bishjan, subsino2_state, init_xiaoao, ROT0, "Subsino", "Xiao Ao Jiang Hu", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1999, xiaoao, bishjan, xiaoao, bishjan, subsino2_state, init_xiaoao, ROT0, "Subsino", "Xiao Ao Jiang Hu (China, Ver. 1.00)", MACHINE_NO_SOUND ) GAME( 2000, new2001, 0, new2001, new2001, subsino2_state, init_new2001, ROT0, "Subsino", "New 2001 (Italy, Ver. 200N)", MACHINE_NO_SOUND ) From c0e8399c43dcfb02b0af679347fe3d1034273ef9 Mon Sep 17 00:00:00 2001 From: shattered Date: Fri, 12 Apr 2024 17:27:58 +0000 Subject: [PATCH 076/109] ussr/bk.cpp: Added DAC, QBus and unmapped read/write traps. (#12238) Also fixed cassette motor control and improved video output. --- src/mame/ussr/bk.cpp | 14 +++++++++++--- src/mame/ussr/bk.h | 8 ++++++++ src/mame/ussr/bk_m.cpp | 19 +++++++++++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/mame/ussr/bk.cpp b/src/mame/ussr/bk.cpp index ba15ed9911084..90edad4f945ff 100644 --- a/src/mame/ussr/bk.cpp +++ b/src/mame/ussr/bk.cpp @@ -41,19 +41,20 @@ BK driver by Miodrag Milanovic /* Address maps */ void bk_state::bk0010_mem(address_map &map) { - map.unmap_value_high(); + map(0x0000, 0xffff).rw(FUNC(bk_state::trap_r), FUNC(bk_state::trap_w)); map(0x0000, 0x3fff).ram(); map(0x4000, 0x7fff).ram().share("videoram"); map(0x8000, 0xfeff).rom().region("maincpu",0); map(0xffb0, 0xffb1).rw(FUNC(bk_state::key_state_r), FUNC(bk_state::key_state_w)); map(0xffb2, 0xffb3).r(FUNC(bk_state::key_code_r)); map(0xffb4, 0xffb5).rw(FUNC(bk_state::vid_scroll_r), FUNC(bk_state::vid_scroll_w)); + map(0xffcc, 0xffcd).noprw(); map(0xffce, 0xffcf).rw(FUNC(bk_state::key_press_r), FUNC(bk_state::key_press_w)); } void bk_state::bk0010fd_mem(address_map &map) { - map.unmap_value_high(); + map(0x0000, 0xffff).rw(FUNC(bk_state::trap_r), FUNC(bk_state::trap_w)); map(0x0000, 0x3fff).ram(); map(0x4000, 0x7fff).ram().share("videoram"); map(0x8000, 0x9fff).rom().region("maincpu",0); @@ -64,6 +65,7 @@ void bk_state::bk0010fd_mem(address_map &map) map(0xffb0, 0xffb1).rw(FUNC(bk_state::key_state_r), FUNC(bk_state::key_state_w)); map(0xffb2, 0xffb3).r(FUNC(bk_state::key_code_r)); map(0xffb4, 0xffb5).rw(FUNC(bk_state::vid_scroll_r), FUNC(bk_state::vid_scroll_w)); + map(0xffcc, 0xffcd).noprw(); map(0xffce, 0xffcf).rw(FUNC(bk_state::key_press_r), FUNC(bk_state::key_press_w)); } @@ -186,6 +188,11 @@ void bk_state::bk0010(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &bk_state::bk0010_mem); m_maincpu->in_iack().set(FUNC(bk_state::irq_callback)); + QBUS(config, m_qbus, 0); + m_qbus->set_space(m_maincpu, AS_PROGRAM); + m_qbus->birq4().set_inputline(m_maincpu, t11_device::VEC_LINE); + QBUS_SLOT(config, "qbus" ":1", qbus_cards, nullptr); + /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(50); @@ -198,9 +205,10 @@ void bk_state::bk0010(machine_config &config) PALETTE(config, "palette", palette_device::MONOCHROME); SPEAKER(config, "mono").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "mono", 0.25); CASSETTE(config, m_cassette); - m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED); + m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED); m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); m_cassette->set_interface("bk0010_cass"); diff --git a/src/mame/ussr/bk.h b/src/mame/ussr/bk.h index f1bfde9f21ead..89ed6851dbc74 100644 --- a/src/mame/ussr/bk.h +++ b/src/mame/ussr/bk.h @@ -10,8 +10,10 @@ #pragma once +#include "bus/qbus/qbus.h" #include "cpu/t11/t11.h" #include "imagedev/cassette.h" +#include "sound/dac.h" class bk_state : public driver_device { @@ -21,6 +23,8 @@ class bk_state : public driver_device , m_vram(*this, "videoram") , m_maincpu(*this, "maincpu") , m_cassette(*this, "cassette") + , m_dac(*this, "dac") + , m_qbus(*this, "qbus") , m_io_keyboard(*this, "LINE%u", 0U) { } @@ -39,9 +43,11 @@ class bk_state : public driver_device uint16_t key_code_r(); uint16_t vid_scroll_r(); uint16_t key_press_r(); + uint16_t trap_r(); void key_state_w(uint16_t data); void vid_scroll_w(uint16_t data); void key_press_w(uint16_t data); + void trap_w(uint16_t data); uint16_t floppy_cmd_r(); void floppy_cmd_w(uint16_t data); uint16_t floppy_data_r(); @@ -54,6 +60,8 @@ class bk_state : public driver_device required_shared_ptr m_vram; required_device m_maincpu; required_device m_cassette; + required_device m_dac; + required_device m_qbus; required_ioport_array<12> m_io_keyboard; void bk0010_mem(address_map &map); void bk0010fd_mem(address_map &map); diff --git a/src/mame/ussr/bk_m.cpp b/src/mame/ussr/bk_m.cpp index d05663025108c..f20f588bc2e99 100644 --- a/src/mame/ussr/bk_m.cpp +++ b/src/mame/ussr/bk_m.cpp @@ -102,6 +102,13 @@ uint16_t bk_state::key_press_r() return 0x8080 | m_key_pressed | cas; } +uint16_t bk_state::trap_r() +{ + if (!machine().side_effects_disabled()) + m_maincpu->pulse_input_line(t11_device::BUS_ERROR, attotime::zero); + return ~0; +} + void bk_state::key_state_w(uint16_t data) { m_kbd_state = (m_kbd_state & ~0x40) | (data & 0x40); @@ -114,7 +121,14 @@ void bk_state::vid_scroll_w(uint16_t data) void bk_state::key_press_w(uint16_t data) { + m_dac->write(BIT(data, 6)); m_cassette->output(BIT(data, 6) ? 1.0 : -1.0); + m_cassette->change_state((BIT(data, 7)) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR); +} + +void bk_state::trap_w(uint16_t data) +{ + m_maincpu->pulse_input_line(t11_device::BUS_ERROR, attotime::zero); } uint16_t bk_state::floppy_cmd_r() @@ -151,13 +165,14 @@ void bk_state::floppy_data_w(uint16_t data) u32 bk_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - u16 const nOfs = (m_scroll - 728) % 256; + u16 const mini = !BIT(m_scroll, 9); + u16 const nOfs = (m_scroll & 255) + (mini ? 40 : -216); for (u16 y = 0; y < 256; y++) { for (u16 x = 0; x < 32; x++) { - u16 const code = m_vram[((y+nOfs) %256)*32 + x]; + u16 const code = (y > 63 && mini) ? 0 : m_vram[((y+nOfs) %256)*32 + x]; for (u8 b = 0; b < 16; b++) bitmap.pix(y, x*16 + b) = BIT(code, b); } From ad7fdda12b4cade7032a0e34c3f6ae6dd3964cfa Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Sat, 13 Apr 2024 17:01:24 +0200 Subject: [PATCH 077/109] coleco: Add expansion bus and support for the Super Game Module This obsoletes PR#10816. Thanks to 0kmg for the initial implementation. --- scripts/src/bus.lua | 17 +++ src/devices/bus/coleco/expansion/cards.cpp | 18 +++ src/devices/bus/coleco/expansion/cards.h | 16 +++ .../bus/coleco/expansion/expansion.cpp | 60 +++++++++ src/devices/bus/coleco/expansion/expansion.h | 123 ++++++++++++++++++ src/devices/bus/coleco/expansion/sgm.cpp | 101 ++++++++++++++ src/devices/bus/coleco/expansion/sgm.h | 48 +++++++ src/mame/coleco/coleco.cpp | 12 ++ 8 files changed, 395 insertions(+) create mode 100644 src/devices/bus/coleco/expansion/cards.cpp create mode 100644 src/devices/bus/coleco/expansion/cards.h create mode 100644 src/devices/bus/coleco/expansion/expansion.cpp create mode 100644 src/devices/bus/coleco/expansion/expansion.h create mode 100644 src/devices/bus/coleco/expansion/sgm.cpp create mode 100644 src/devices/bus/coleco/expansion/sgm.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 2ae59a041ccf5..ed8419d7b6cf8 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1190,6 +1190,23 @@ if (BUSES["COLECO_CART"]~=null) then end +--------------------------------------------------- +-- +--@src/devices/bus/coleco/expansion/expansion.h,BUSES["COLECO_EXPANSION"] = true +--------------------------------------------------- + +if (BUSES["COLECO_EXPANSION"]~=null) then + files { + MAME_DIR .. "src/devices/bus/coleco/expansion/expansion.cpp", + MAME_DIR .. "src/devices/bus/coleco/expansion/expansion.h", + MAME_DIR .. "src/devices/bus/coleco/expansion/cards.cpp", + MAME_DIR .. "src/devices/bus/coleco/expansion/cards.h", + MAME_DIR .. "src/devices/bus/coleco/expansion/sgm.cpp", + MAME_DIR .. "src/devices/bus/coleco/expansion/sgm.h", + } +end + + --------------------------------------------------- -- --@src/devices/bus/crvision/slot.h,BUSES["CRVISION"] = true diff --git a/src/devices/bus/coleco/expansion/cards.cpp b/src/devices/bus/coleco/expansion/cards.cpp new file mode 100644 index 0000000000000..5789b37045647 --- /dev/null +++ b/src/devices/bus/coleco/expansion/cards.cpp @@ -0,0 +1,18 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Colecovision Expansion Slot cards + +***************************************************************************/ + +#include "emu.h" +#include "cards.h" + +#include "sgm.h" + + +void coleco_expansion_cards(device_slot_interface &device) +{ + device.option_add("sgm", COLECO_SGM); +} diff --git a/src/devices/bus/coleco/expansion/cards.h b/src/devices/bus/coleco/expansion/cards.h new file mode 100644 index 0000000000000..08577a2cba91f --- /dev/null +++ b/src/devices/bus/coleco/expansion/cards.h @@ -0,0 +1,16 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Colecovision Expansion Slot cards + +***************************************************************************/ + +#ifndef MAME_BUS_COlECO_EXPANSION_CARDS_H +#define MAME_BUS_COlECO_EXPANSION_CARDS_H + +#pragma once + +void coleco_expansion_cards(device_slot_interface &device); + +#endif // MAME_BUS_COlECO_EXPANSION_CARDS_H diff --git a/src/devices/bus/coleco/expansion/expansion.cpp b/src/devices/bus/coleco/expansion/expansion.cpp new file mode 100644 index 0000000000000..87223699c2bfb --- /dev/null +++ b/src/devices/bus/coleco/expansion/expansion.cpp @@ -0,0 +1,60 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Colecovision Expansion Slot + + 60-pin slot + +***************************************************************************/ + +#include "emu.h" +#include "expansion.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(COLECO_EXPANSION, coleco_expansion_device, "coleco_expansion", "Colecovision Expansion Bus") + + +//************************************************************************** +// SLOT DEVICE +//************************************************************************** + +coleco_expansion_device::coleco_expansion_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, COLECO_EXPANSION, tag, owner, clock), + device_single_card_slot_interface(mconfig, *this), + m_program(*this, finder_base::DUMMY_TAG, -1), + m_io(*this, finder_base::DUMMY_TAG, -1), + m_int_handler(*this), + m_nmi_handler(*this), + m_card(nullptr) +{ +} + +coleco_expansion_device::~coleco_expansion_device() +{ +} + +void coleco_expansion_device::device_start() +{ + // get inserted card + m_card = get_card_device(); +} + + +//************************************************************************** +// CARD INTERFACE +//************************************************************************** + +device_coleco_expansion_interface::device_coleco_expansion_interface(const machine_config &mconfig, device_t &device) : + device_interface(device, "colecoexp") +{ + m_expansion = dynamic_cast(device.owner()); +} + +device_coleco_expansion_interface::~device_coleco_expansion_interface() +{ +} diff --git a/src/devices/bus/coleco/expansion/expansion.h b/src/devices/bus/coleco/expansion/expansion.h new file mode 100644 index 0000000000000..421a2ab70d7ec --- /dev/null +++ b/src/devices/bus/coleco/expansion/expansion.h @@ -0,0 +1,123 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Colecovision Expansion Slot + + 60-pin slot + + 1 GND 60 -5V + 2 GND 59 +5V + 3 D3 58 +5V + 4 A14 57 +12V + 5 EN40 56 AUDOUT + 6 EN20 55 IORQ + 7 HALT 54 MREQ + 8 WR 53 RD + 9 NMI 52 BUSACK + 10 FX-9 51 INT + 11 BUSREQ 50 WAIT + 12 D1 49 RFSH + 13 RESET 48 D5 + 14 D0 47 A0 + 15 M1 46 D5 + 16 D2 45 CPUCLK + 17 D6 44 A3 + 18 A1 43 A15 + 19 D4 42 N/C + 20 A2 41 N/C + 21 A4 40 CPUCLK + 22 A13 39 EXVDCRST + 23 A5 38 A12 + 24 A8 37 A11 + 25 A7 36 EXRES2 + 26 A8 35 AUDCLK + 27 A9 34 EXRES1 + 28 A10 33 EXVID + 29 N/C 32 EXVIDEN + 30 N/C 31 EXAUD + +***************************************************************************/ + +#ifndef MAME_BUS_COlECO_EXPANSION_EXPANSION_H +#define MAME_BUS_COlECO_EXPANSION_EXPANSION_H + +#pragma once + +// include here so drivers don't need to +#include "cards.h" + +// forward declaration +class device_coleco_expansion_interface; + + +//************************************************************************** +// BUS DEVICE +//************************************************************************** + +class coleco_expansion_device : public device_t, public device_single_card_slot_interface +{ +public: + // construction/destruction + coleco_expansion_device(machine_config const &mconfig, char const *tag, device_t *owner, const char *dflt) : + coleco_expansion_device(mconfig, tag, owner, uint32_t(0)) + { + option_reset(); + coleco_expansion_cards(*this); + set_default_option(dflt); + set_fixed(false); + } + + coleco_expansion_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual ~coleco_expansion_device(); + + template void set_program_space(T &&tag, int spacenum) { m_program.set_tag(std::forward(tag), spacenum); } + template void set_io_space(T &&tag, int spacenum) { m_io.set_tag(std::forward(tag), spacenum); } + + // callbacks + auto int_handler() { return m_int_handler.bind(); } + auto nmi_handler() { return m_nmi_handler.bind(); } + + // called from card device + void int_w(int state) { m_int_handler(state); } + void nmi_w(int state) { m_nmi_handler(state); } + + address_space &mem_space() { return *m_program; } + address_space &io_space() { return *m_io; } + +protected: + // device-level overrides + virtual void device_start() override; + +private: + required_address_space m_program; + required_address_space m_io; + + devcb_write_line m_int_handler; + devcb_write_line m_nmi_handler; + + device_coleco_expansion_interface *m_card; +}; + + +//************************************************************************** +// CARD INTERFACE +//************************************************************************** + +class device_coleco_expansion_interface : public device_interface +{ +public: + virtual ~device_coleco_expansion_interface(); + +protected: + device_coleco_expansion_interface(const machine_config &mconfig, device_t &device); + + coleco_expansion_device *m_expansion; +}; + + +// device type declaration +DECLARE_DEVICE_TYPE(COLECO_EXPANSION, coleco_expansion_device) + + +#endif // MAME_BUS_COlECO_EXPANSION_EXPANSION_H diff --git a/src/devices/bus/coleco/expansion/sgm.cpp b/src/devices/bus/coleco/expansion/sgm.cpp new file mode 100644 index 0000000000000..8f074c3e2a985 --- /dev/null +++ b/src/devices/bus/coleco/expansion/sgm.cpp @@ -0,0 +1,101 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Opcode Super Game Module + +***************************************************************************/ + +#include "emu.h" +#include "sgm.h" +#include "sound/ay8910.h" +#include "speaker.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(COLECO_SGM, coleco_sgm_device, "coleco_sgm", "Opcode Super Game Module") + +coleco_sgm_device::coleco_sgm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, COLECO_SGM, tag, owner, clock), + device_coleco_expansion_interface(mconfig, *this), + m_view_lower(*this, "view_lower"), + m_view_upper(*this, "view_upper") +{ +} + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +void coleco_sgm_device::io_map(address_map &map) +{ + map(0x50, 0x50).w("ay", FUNC(ay8910_device::address_w)); + map(0x51, 0x51).w("ay", FUNC(ay8910_device::data_w)); + map(0x52, 0x52).r("ay", FUNC(ay8910_device::data_r)); + map(0x53, 0x53).w(FUNC(coleco_sgm_device::upper_enable_w)); + map(0x7f, 0x7f).w(FUNC(coleco_sgm_device::lower_enable_w)); +} + + +//************************************************************************** +// MACHINE DEFINITIONS +//************************************************************************** + +void coleco_sgm_device::device_add_mconfig(machine_config &config) +{ + SPEAKER(config, "mono").front_center(); + + ay8910_device &ay(AY8910(config, "ay", 7.15909_MHz_XTAL / 4)); + ay.add_route(ALL_OUTPUTS, "mono", 1.00); +} + + +//************************************************************************** +// MACHINE EMULATION +//************************************************************************** + +void coleco_sgm_device::device_start() +{ + // allocate memory for ram + m_ram_lower = std::make_unique(0x2000); + m_ram_upper = std::make_unique(0x6000); + + // register for save states + save_pointer(NAME(m_ram_lower), 0x2000); + save_pointer(NAME(m_ram_upper), 0x6000); + + // install device into memory map + m_expansion->io_space().install_device(0x00, 0x7f, *this, coleco_sgm_device::io_map); + + m_expansion->mem_space().install_view(0x0000, 0x1fff, m_view_lower); + m_view_lower[0].install_ram(0x0000, 0x1fff, &m_ram_lower[0]); + + m_expansion->mem_space().install_view(0x2000, 0x7fff, m_view_upper); + m_view_upper[0].install_ram(0x2000, 0x7fff, &m_ram_upper[0]); +} + +void coleco_sgm_device::device_reset() +{ + m_view_lower.disable(); + m_view_upper.disable(); +} + +void coleco_sgm_device::upper_enable_w(uint8_t data) +{ + if (BIT(data, 0)) + m_view_upper.select(0); + else + m_view_upper.disable(); +} + +void coleco_sgm_device::lower_enable_w(uint8_t data) +{ + if (BIT(data, 1)) + m_view_lower.disable(); + else + m_view_lower.select(0); +} diff --git a/src/devices/bus/coleco/expansion/sgm.h b/src/devices/bus/coleco/expansion/sgm.h new file mode 100644 index 0000000000000..cd77dbaa78e65 --- /dev/null +++ b/src/devices/bus/coleco/expansion/sgm.h @@ -0,0 +1,48 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Colecovision Super Game Module + +***************************************************************************/ + +#ifndef MAME_BUS_COLECO_EXPANSION_SGM_H +#define MAME_BUS_COLECO_EXPANSION_SGM_H + +#pragma once + +#include "expansion.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class coleco_sgm_device : public device_t, public device_coleco_expansion_interface +{ +public: + // construction/destruction + coleco_sgm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + virtual void device_reset() override; + +private: + memory_view m_view_lower; + memory_view m_view_upper; + + std::unique_ptr m_ram_lower; + std::unique_ptr m_ram_upper; + + void io_map(address_map &map); + + void upper_enable_w(uint8_t data); + void lower_enable_w(uint8_t data); +}; + +// device type declaration +DECLARE_DEVICE_TYPE(COLECO_SGM, coleco_sgm_device) + +#endif // MAME_BUS_COLECO_EXPANSION_SGM_H diff --git a/src/mame/coleco/coleco.cpp b/src/mame/coleco/coleco.cpp index feacf10b146b9..8580899cf89e5 100644 --- a/src/mame/coleco/coleco.cpp +++ b/src/mame/coleco/coleco.cpp @@ -69,7 +69,11 @@ */ #include "emu.h" + #include "coleco.h" + +#include "bus/coleco/expansion/expansion.h" + #include "screen.h" #include "softlist_dev.h" #include "speaker.h" @@ -593,6 +597,12 @@ void coleco_state::coleco(machine_config &config) SOFTWARE_LIST(config, "cart_list").set_original("coleco"); TIMER(config, "paddle_timer").configure_periodic(FUNC(coleco_state::paddle_update_callback), attotime::from_msec(20)); + + coleco_expansion_device &exp(COLECO_EXPANSION(config, "exp", nullptr)); + exp.set_program_space(m_maincpu, AS_PROGRAM); + exp.set_io_space(m_maincpu, AS_IO); + exp.int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0); // TODO: Merge with other IRQs? + exp.nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI); } void coleco_state::colecop(machine_config &config) @@ -643,6 +653,8 @@ void coleco_state::czz50(machine_config &config) { coleco(config); + config.device_remove("exp"); // this system has a different expansion port + /* basic machine hardware */ m_maincpu->set_addrmap(AS_PROGRAM, &coleco_state::czz50_map); // note: cpu speed unverified, assume it's the same as ColecoVision } From 4bc523f8ffa0aefcae3c61638772f75f81697b10 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 14 Apr 2024 00:57:13 +0900 Subject: [PATCH 078/109] itech/itech8.cpp: Cleaned up code. (#12235) * Removed TLC34076 for games that lack it. * Use palette devices for palettes. * Use input merger for VIA/YM3812 FIRQ. * Reduced tag lookups, suppress side effects for debugger accesses, use more const. * Changed single-line comments to C++ line comments. --- src/mame/itech/itech8.cpp | 500 ++++++++++++++++++------------------ src/mame/itech/itech8.h | 33 +-- src/mame/itech/itech8_m.cpp | 316 +++++++++++------------ src/mame/itech/itech8_v.cpp | 149 +++++------ 4 files changed, 502 insertions(+), 496 deletions(-) diff --git a/src/mame/itech/itech8.cpp b/src/mame/itech/itech8.cpp index 61841c398bd08..a520136364cdc 100644 --- a/src/mame/itech/itech8.cpp +++ b/src/mame/itech/itech8.cpp @@ -505,6 +505,7 @@ #include "cpu/z80/z80.h" #include "machine/6522via.h" #include "machine/6821pia.h" +#include "machine/input_merger.h" #include "sound/okim6295.h" #include "sound/ymopn.h" #include "sound/ymopl.h" @@ -543,21 +544,21 @@ void itech8_state::update_interrupts(int periodic, int tms34061, int blitter) { device_type main_cpu_type = m_maincpu->type(); - /* update the states */ + // update the states if (periodic != -1) m_periodic_int = periodic; if (tms34061 != -1) m_tms34061_int = tms34061; if (blitter != -1) m_blitter_int = blitter; - /* handle the 6809 case */ + // handle the 6809 case if (main_cpu_type == MC6809 || main_cpu_type == HD6309) { - /* just modify lines that have changed */ + // just modify lines that have changed if (periodic != -1) m_maincpu->set_input_line(INPUT_LINE_NMI, periodic ? ASSERT_LINE : CLEAR_LINE); if (tms34061 != -1) m_maincpu->set_input_line(M6809_IRQ_LINE, tms34061 ? ASSERT_LINE : CLEAR_LINE); if (blitter != -1) m_maincpu->set_input_line(M6809_FIRQ_LINE, blitter ? ASSERT_LINE : CLEAR_LINE); } - /* handle the 68000 case */ + // handle the 68000 case else { m_maincpu->set_input_line(2, m_blitter_int ? ASSERT_LINE : CLEAR_LINE); @@ -583,7 +584,7 @@ void itech8_state::generate_nmi(int state) { if (state) { - /* signal the NMI */ + // signal the NMI update_interrupts(1, -1, -1); m_irq_off_timer->adjust(attotime::from_usec(1)); @@ -601,8 +602,8 @@ void itech8_state::ninclown_irq(int state) void itech8_state::nmi_ack_w(u8 data) { -/* doesn't seem to hold for every game (e.g., hstennis) */ -/* m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);*/ +// doesn't seem to hold for every game (e.g., hstennis) +// m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } @@ -618,7 +619,7 @@ void itech8_state::nmi_ack_w(u8 data) void sstrike_state::machine_start() { - /* we need to update behind the beam as well */ + // we need to update behind the beam as well m_behind_beam_update_timer = timer_alloc(FUNC(sstrike_state::behind_the_beam_update), this); m_behind_beam_update_timer->adjust(m_screen->time_until_pos(0), 32); @@ -664,21 +665,20 @@ void grmatch_state::machine_start() save_item(NAME(m_palcontrol)); save_item(NAME(m_xscroll)); - save_item(NAME(m_palette)); m_palette_timer = timer_alloc(FUNC(grmatch_state::palette_update), this); } void itech8_state::machine_reset() { - /* make sure bank 0 is selected */ + // make sure bank 0 is selected if (m_mainbank) { m_mainbank->set_entry(0 ^ m_bankxor); m_maincpu->reset(); } - /* set the visible area */ + // set the visible area if (m_visarea.width() > 1) { m_screen->set_visible_area(m_visarea.min_x, m_visarea.max_x, m_visarea.min_y, m_visarea.max_y); @@ -702,16 +702,16 @@ void grmatch_state::machine_reset() TIMER_CALLBACK_MEMBER(sstrike_state::behind_the_beam_update) { int scanline = param >> 8; - int interval = param & 0xff; + const int interval = param & 0xff; - /* force a partial update to the current scanline */ + // force a partial update to the current scanline m_screen->update_partial(scanline); - /* advance by the interval, and wrap to 0 */ + // advance by the interval, and wrap to 0 scanline += interval; if (scanline >= 256) scanline = 0; - /* set a new timer */ + // set a new timer m_behind_beam_update_timer->adjust(m_screen->time_until_pos(scanline), (scanline << 8) + interval); } @@ -725,18 +725,18 @@ TIMER_CALLBACK_MEMBER(sstrike_state::behind_the_beam_update) void itech8_state::blitter_bank_w(offs_t offset, u8 data) { - /* bit 0x20 on address 7 controls CPU banking */ + // bit 0x20 on address 7 controls CPU banking if (offset / 2 == 7) - m_mainbank->set_entry(((data >> 5) & 1) ^ m_bankxor); + m_mainbank->set_entry(BIT(data, 5) ^ m_bankxor); - /* the rest is handled by the video hardware */ + // the rest is handled by the video hardware blitter_w(offset, data); } void itech8_state::rimrockn_bank_w(u8 data) { - /* banking is controlled here instead of by the blitter output */ + // banking is controlled here instead of by the blitter output m_mainbank->set_entry(data & 3); } @@ -771,10 +771,10 @@ void itech8_state::pia_portb_out(u8 data) { LOGCONTROL("PIA port B write = %02x\n", data); - /* bit 0 provides feedback to the main CPU */ - /* bit 4 controls the ticket dispenser */ - /* bit 5 controls the coin counter */ - /* bit 6 controls the diagnostic sound LED */ + // bit 0 provides feedback to the main CPU + // bit 4 controls the ticket dispenser + // bit 5 controls the coin counter + // bit 6 controls the diagnostic sound LED m_pia_portb_data = data; m_ticket->motor_w(BIT(data, 4)); machine().bookkeeping().coin_counter_w(0, BIT(data, 5)); @@ -785,10 +785,10 @@ void itech8_state::ym2203_portb_out(u8 data) { LOGCONTROL("YM2203 port B write = %02x\n", data); - /* bit 0 provides feedback to the main CPU */ - /* bit 5 controls the coin counter */ - /* bit 6 controls the diagnostic sound LED */ - /* bit 7 controls the ticket dispenser */ + // bit 0 provides feedback to the main CPU + // bit 5 controls the coin counter + // bit 6 controls the diagnostic sound LED + // bit 7 controls the ticket dispenser m_pia_portb_data = data; m_ticket->motor_w(BIT(data, 7)); machine().bookkeeping().coin_counter_w(0, BIT(data, 5)); @@ -805,7 +805,7 @@ void itech8_state::ym2203_portb_out(u8 data) void itech8_state::gtg2_sound_data_w(u8 data) { - /* on the later GTG2 board, they swizzle the data lines */ + // on the later GTG2 board, they swizzle the data lines data = ((data & 0x80) >> 7) | ((data & 0x5d) << 1) | ((data & 0x20) >> 3) | @@ -830,7 +830,8 @@ void itech8_state::grom_bank_w(u8 data) u16 itech8_state::rom_constant_r(offs_t offset) { // Ninja Clowns reads this area for program ROM checksum - LOGPROT("Read ROM constant area %04x\n",offset*2+0x40000); + if (!machine().side_effects_disabled()) + LOGPROT("Read ROM constant area %04x\n",offset*2+0x40000); return 0xd840; } @@ -852,7 +853,7 @@ void itech8_state::ninclown_palette_w(offs_t offset, u8 data) * *************************************/ -/*------ common layout with TMS34061 at 0000 ------*/ +//------ common layout with TMS34061 at 0000 ------ void itech8_state::common_lo_map(address_map &map) { map(0x0000, 0x0fff).rw(FUNC(itech8_state::tms34061_r), FUNC(itech8_state::tms34061_w)); @@ -865,12 +866,12 @@ void itech8_state::common_lo_map(address_map &map) map(0x11c0, 0x11df).rw(FUNC(itech8_state::blitter_r), FUNC(itech8_state::blitter_bank_w)); map(0x11e0, 0x11ff).w(FUNC(itech8_state::palette_w)); map(0x2000, 0x3fff).ram().share("nvram"); - map(0x4000, 0x7fff).bankr("mainbank"); - map(0x8000, 0xffff).bankr("fixed"); // non-banked area + map(0x4000, 0x7fff).bankr(m_mainbank); + map(0x8000, 0xffff).bankr(m_fixed); // non-banked area } -/*------ common layout with TMS34061 at 1000 ------*/ +//------ common layout with TMS34061 at 1000 ------ void itech8_state::common_hi_map(address_map &map) { map(0x0100, 0x0100).nopw(); @@ -883,12 +884,12 @@ void itech8_state::common_hi_map(address_map &map) map(0x01e0, 0x01ff).w(FUNC(itech8_state::palette_w)); map(0x1000, 0x1fff).rw(FUNC(itech8_state::tms34061_r), FUNC(itech8_state::tms34061_w)); map(0x2000, 0x3fff).ram().share("nvram"); - map(0x4000, 0x7fff).bankr("mainbank"); - map(0x8000, 0xffff).bankr("fixed"); // non-banked area + map(0x4000, 0x7fff).bankr(m_mainbank); + map(0x8000, 0xffff).bankr(m_fixed); // non-banked area } -/*------ Grudge Match layout ------*/ +//------ Grudge Match layout ------ void grmatch_state::grmatch_map(address_map &map) { itech8_state::common_hi_map(map); @@ -898,7 +899,7 @@ void grmatch_state::grmatch_map(address_map &map) } -/*------ Slick Shot layout ------*/ +//------ Slick Shot layout ------ void slikshot_state::mem_hi_map(address_map &map) { common_hi_map(map); @@ -907,7 +908,7 @@ void slikshot_state::mem_hi_map(address_map &map) } -/*------ Super Strike Bowling layout ------*/ +//------ Super Strike Bowling layout ------ void slikshot_state::mem_lo_map(address_map &map) { common_lo_map(map); @@ -916,7 +917,7 @@ void slikshot_state::mem_lo_map(address_map &map) } -/*------ Rim Rockin' Basketball layout ------*/ +//------ Rim Rockin' Basketball layout ------ void itech8_state::rimrockn_map(address_map &map) { common_hi_map(map); @@ -930,7 +931,7 @@ void itech8_state::rimrockn_map(address_map &map) } -/*------ Golden Tee Golf II 1992 layout ------*/ +//------ Golden Tee Golf II 1992 layout ------ void itech8_state::gtg2_map(address_map &map) { map(0x0100, 0x0100).portr("40").w(FUNC(itech8_state::nmi_ack_w)); @@ -943,11 +944,11 @@ void itech8_state::gtg2_map(address_map &map) map(0x01e0, 0x01e0).w(m_tms34061, FUNC(tms34061_device::latch_w)); map(0x1000, 0x1fff).rw(FUNC(itech8_state::tms34061_r), FUNC(itech8_state::tms34061_w)); map(0x2000, 0x3fff).ram().share("nvram"); - map(0x4000, 0x7fff).bankr("mainbank"); - map(0x8000, 0xffff).bankr("fixed"); // non-banked area + map(0x4000, 0x7fff).bankr(m_mainbank); + map(0x8000, 0xffff).bankr(m_fixed); // non-banked area } -/*------ Ninja Clowns layout ------*/ +//------ Ninja Clowns layout ------ void itech8_state::ninclown_map(address_map &map) { map(0x000000, 0x003fff).ram().share("nvram"); @@ -974,7 +975,7 @@ void itech8_state::ninclown_map(address_map &map) * *************************************/ -/*------ YM2203-based sound ------*/ +//------ YM2203-based sound ------ void itech8_state::sound2203_map(address_map &map) { map(0x0000, 0x0000).nopw(); @@ -986,7 +987,7 @@ void itech8_state::sound2203_map(address_map &map) } -/*------ YM2608B-based sound ------*/ +//------ YM2608B-based sound ------ void itech8_state::sound2608b_map(address_map &map) { map(0x1000, 0x1000).nopw(); @@ -997,7 +998,7 @@ void itech8_state::sound2608b_map(address_map &map) } -/*------ YM3812-based sound ------*/ +//------ YM3812-based sound ------ void itech8_state::sound3812_map(address_map &map) { map(0x0000, 0x0000).nopw(); @@ -1010,7 +1011,7 @@ void itech8_state::sound3812_map(address_map &map) } -/*------ external YM3812-based sound board ------*/ +//------ external YM3812-based sound board ------ void itech8_state::sound3812_external_map(address_map &map) { map(0x0000, 0x0000).nopw(); @@ -1018,7 +1019,7 @@ void itech8_state::sound3812_external_map(address_map &map) map(0x2000, 0x2001).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write)); map(0x3000, 0x37ff).ram(); map(0x4000, 0x4000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0x5000, 0x500f).m("via6522_0", FUNC(via6522_device::map)); + map(0x5000, 0x500f).m("via6522", FUNC(via6522_device::map)); map(0x8000, 0xffff).rom(); } @@ -1052,7 +1053,7 @@ void slikshot_state::z80_io_map(address_map &map) static INPUT_PORTS_START( wfortune ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x08, DEF_STR( Upright ) ) @@ -1071,17 +1072,17 @@ static INPUT_PORTS_START( wfortune ) PORT_START("80") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("AN_D") /* analog D */ + PORT_START("AN_D") // analog D PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(75) PORT_KEYDELTA(10) PORT_PLAYER(1) - PORT_START("AN_F") /* analog F */ + PORT_START("AN_F") // analog F PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(75) PORT_KEYDELTA(10) PORT_COCKTAIL PORT_PLAYER(2) INPUT_PORTS_END static INPUT_PORTS_START( grmatch ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_DIPNAME( 0x08, 0x08, "Adjustments Lockout" ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) @@ -1119,7 +1120,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( stratab ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x08, DEF_STR( Upright ) ) @@ -1140,26 +1141,26 @@ static INPUT_PORTS_START( stratab ) PORT_START("80") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("AN_C") /* analog C */ + PORT_START("AN_C") // analog C PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_PLAYER(1) - PORT_START("AN_D") /* analog D */ + PORT_START("AN_D") // analog D PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_REVERSE PORT_PLAYER(1) - PORT_START("AN_E") /* analog E */ + PORT_START("AN_E") // analog E PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_COCKTAIL PORT_PLAYER(2) - PORT_START("AN_F") /* analog F */ + PORT_START("AN_F") // analog F PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_REVERSE PORT_COCKTAIL PORT_PLAYER(2) INPUT_PORTS_END static INPUT_PORTS_START( stratabs ) PORT_INCLUDE( stratab ) - PORT_START("FAKEX") /* fake */ + PORT_START("FAKEX") // fake PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_RESET PORT_PLAYER(1) - PORT_START("FAKEY") /* fake */ + PORT_START("FAKEY") // fake PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(100) PORT_RESET PORT_REVERSE PORT_PLAYER(1) INPUT_PORTS_END @@ -1172,7 +1173,7 @@ CUSTOM_INPUT_MEMBER(itech8_state::gtg_mux) static INPUT_PORTS_START( gtg ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x08, DEF_STR( Upright ) ) @@ -1181,8 +1182,8 @@ static INPUT_PORTS_START( gtg ) PORT_SERVICE_NO_TOGGLE( 0x80, IP_ACTIVE_LOW ) PORT_START("60") - /* it is still unknown how the second player inputs are muxed in */ - /* currently we map both sets of controls to the same inputs */ + // it is still unknown how the second player inputs are muxed in + // currently we map both sets of controls to the same inputs PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(itech8_state, gtg_mux) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) @@ -1209,7 +1210,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( gtgt ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x7e, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_SERVICE_NO_TOGGLE( 0x80, IP_ACTIVE_LOW ) @@ -1226,17 +1227,17 @@ static INPUT_PORTS_START( gtgt ) PORT_START("80") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("AN_C") /* analog C */ + PORT_START("AN_C") // analog C PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_PLAYER(1) - PORT_START("AN_D") /* analog D */ + PORT_START("AN_D") // analog D PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_REVERSE PORT_PLAYER(1) INPUT_PORTS_END static INPUT_PORTS_START( gtg2t ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x08, DEF_STR( Upright ) ) @@ -1257,23 +1258,23 @@ static INPUT_PORTS_START( gtg2t ) PORT_START("80") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("AN_C") /* analog C */ + PORT_START("AN_C") // analog C PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_PLAYER(1) - PORT_START("AN_D") /* analog D */ + PORT_START("AN_D") // analog D PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_REVERSE PORT_PLAYER(1) - PORT_START("AN_E") /* analog E */ + PORT_START("AN_E") // analog E PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_COCKTAIL PORT_PLAYER(2) - PORT_START("AN_F") /* analog F */ + PORT_START("AN_F") // analog F PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_REVERSE PORT_COCKTAIL PORT_PLAYER(2) INPUT_PORTS_END static INPUT_PORTS_START( slikshot ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x7e, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_SERVICE_NO_TOGGLE( 0x80, IP_ACTIVE_LOW ) @@ -1290,24 +1291,24 @@ static INPUT_PORTS_START( slikshot ) PORT_START("80") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("FAKEX") /* fake */ + PORT_START("FAKEX") // fake PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_RESET PORT_PLAYER(1) - PORT_START("FAKEY") /* fake */ + PORT_START("FAKEY") // fake PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(100) PORT_RESET PORT_REVERSE PORT_PLAYER(1) INPUT_PORTS_END static INPUT_PORTS_START( dynobop ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x7e, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_SERVICE_NO_TOGGLE( 0x80, IP_ACTIVE_LOW ) PORT_START("60") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) /* ball gate */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // ball gate PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) /* ball detect */ + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // ball detect PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN3 ) @@ -1317,17 +1318,17 @@ static INPUT_PORTS_START( dynobop ) PORT_START("80") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("FAKEX") /* fake */ + PORT_START("FAKEX") // fake PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_RESET PORT_PLAYER(1) - PORT_START("FAKEY") /* fake */ + PORT_START("FAKEY") // fake PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(100) PORT_RESET PORT_REVERSE PORT_PLAYER(1) INPUT_PORTS_END static INPUT_PORTS_START( sstrike ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x7e, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_SERVICE_NO_TOGGLE( 0x80, IP_ACTIVE_LOW ) @@ -1344,17 +1345,17 @@ static INPUT_PORTS_START( sstrike ) PORT_START("80") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("FAKEX") /* fake */ + PORT_START("FAKEX") // fake PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_RESET PORT_PLAYER(1) - PORT_START("FAKEY") /* fake */ + PORT_START("FAKEY") // fake PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(100) PORT_RESET PORT_REVERSE PORT_PLAYER(1) INPUT_PORTS_END static INPUT_PORTS_START( pokrdice ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Lower Right") PORT_CODE(KEYCODE_3_PAD) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Cabinet ) ) @@ -1383,12 +1384,12 @@ INPUT_PORTS_END static INPUT_PORTS_START( hstennis ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x08, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) /* see code at fbb5 */ + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) // see code at fbb5 PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x10, DEF_STR( On ) ) PORT_BIT( 0x60, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1418,9 +1419,9 @@ INPUT_PORTS_END static INPUT_PORTS_START( arlingtn ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) /* see code at e23c */ + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // see code at e23c PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1449,7 +1450,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( peggle ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x7e, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_SERVICE_NO_TOGGLE( 0x80, IP_ACTIVE_LOW ) @@ -1471,7 +1472,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( pegglet ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x7e, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_SERVICE_NO_TOGGLE( 0x80, IP_ACTIVE_LOW ) @@ -1486,16 +1487,16 @@ static INPUT_PORTS_START( pegglet ) PORT_BIT( 0x7e, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_START("AN_D") /* analog D */ + PORT_START("AN_D") // analog D PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_RESET PORT_PLAYER(1) INPUT_PORTS_END static INPUT_PORTS_START( neckneck ) PORT_START("40") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) /* see code at e23c */ + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) // see code at e23c PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1534,12 +1535,12 @@ static INPUT_PORTS_START( rimrockn ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) /* input from sound board */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(itech8_state, special_r) // input from sound board PORT_START("80") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("161") /* special 161 */ + PORT_START("161") // special 161 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 Pass") PORT_PLAYER(1) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Shoot") PORT_PLAYER(1) @@ -1549,7 +1550,7 @@ static INPUT_PORTS_START( rimrockn ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) - PORT_START("162") /* special 162 */ + PORT_START("162") // special 162 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P2 Pass") PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P2 Shoot") PORT_PLAYER(2) @@ -1559,7 +1560,7 @@ static INPUT_PORTS_START( rimrockn ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) - PORT_START("163") /* special 163 */ + PORT_START("163") // special 163 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P3 Shoot") PORT_PLAYER(3) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P3 Pass") PORT_PLAYER(3) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -1569,7 +1570,7 @@ static INPUT_PORTS_START( rimrockn ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(3) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START3 ) - PORT_START("164") /* special 164 */ + PORT_START("164") // special 164 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P4 Shoot") PORT_PLAYER(4) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P4 Pass") PORT_PLAYER(4) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -1579,7 +1580,7 @@ static INPUT_PORTS_START( rimrockn ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(4) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START4 ) - PORT_START("165") /* special 165 */ + PORT_START("165") // special 165 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE4 ) @@ -1655,16 +1656,16 @@ static INPUT_PORTS_START( gtg2 ) PORT_BIT( 0x78, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) - PORT_START("AN_C") /* analog C */ + PORT_START("AN_C") // analog C PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_PLAYER(1) - PORT_START("AN_D") /* analog D */ + PORT_START("AN_D") // analog D PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_REVERSE PORT_PLAYER(1) - PORT_START("AN_E") /* analog E */ + PORT_START("AN_E") // analog E PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_COCKTAIL PORT_PLAYER(2) - PORT_START("AN_F") /* analog F */ + PORT_START("AN_F") // analog F PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_RESET PORT_REVERSE PORT_COCKTAIL PORT_PLAYER(2) INPUT_PORTS_END @@ -1731,18 +1732,14 @@ void itech8_state::itech8_core_devices(machine_config &config) m_screen->screen_vblank().set(FUNC(itech8_state::generate_nmi)); TMS34061(config, m_tms34061, 0); - m_tms34061->set_rowshift(8); /* VRAM address is (row << rowshift) | col */ + m_tms34061->set_rowshift(8); // VRAM address is (row << rowshift) | col m_tms34061->set_vram_size(itech8_state::VRAM_SIZE); - m_tms34061->int_callback().set(FUNC(itech8_state::generate_tms34061_interrupt)); /* interrupt gen callback */ + m_tms34061->int_callback().set(FUNC(itech8_state::generate_tms34061_interrupt)); // interrupt gen callback SPEAKER(config, "mono").front_center(); GENERIC_LATCH_8(config, m_soundlatch, 0); m_soundlatch->data_pending_callback().set_inputline(m_soundcpu, M6809_IRQ_LINE); - - via6522_device &via(MOS6522(config, "via6522_0", CLOCK_8MHz/4)); - via.writepb_handler().set(FUNC(itech8_state::pia_portb_out)); - via.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); } void itech8_state::itech8_core_lo(machine_config &config) @@ -1761,11 +1758,11 @@ void itech8_state::itech8_core_hi(machine_config &config) void itech8_state::itech8_sound_ym2203(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware MC6809(config, m_soundcpu, CLOCK_8MHz); m_soundcpu->set_addrmap(AS_PROGRAM, &itech8_state::sound2203_map); - /* sound hardware */ + // sound hardware ym2203_device &ymsnd(YM2203(config, "ymsnd", CLOCK_8MHz/2)); ymsnd.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); ymsnd.port_b_write_callback().set(FUNC(itech8_state::ym2203_portb_out)); @@ -1780,11 +1777,11 @@ void itech8_state::itech8_sound_ym2203(machine_config &config) void itech8_state::itech8_sound_ym2608b(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware MC6809(config, m_soundcpu, CLOCK_8MHz); m_soundcpu->set_addrmap(AS_PROGRAM, &itech8_state::sound2608b_map); - /* sound hardware */ + // sound hardware ym2608_device &ymsnd(YM2608(config, "ymsnd", CLOCK_8MHz)); ymsnd.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); ymsnd.port_b_write_callback().set(FUNC(itech8_state::ym2203_portb_out)); @@ -1793,7 +1790,7 @@ void itech8_state::itech8_sound_ym2608b(machine_config &config) void itech8_state::itech8_sound_ym3812(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware MC6809(config, m_soundcpu, CLOCK_8MHz); m_soundcpu->set_addrmap(AS_PROGRAM, &itech8_state::sound3812_map); @@ -1802,7 +1799,7 @@ void itech8_state::itech8_sound_ym3812(machine_config &config) pia.writepa_handler().set(FUNC(itech8_state::pia_porta_out)); pia.writepb_handler().set(FUNC(itech8_state::pia_portb_out)); - /* sound hardware */ + // sound hardware ym3812_device &ymsnd(YM3812(config, "ymsnd", CLOCK_8MHz/2)); ymsnd.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); ymsnd.add_route(ALL_OUTPUTS, "mono", 0.75); @@ -1813,13 +1810,19 @@ void itech8_state::itech8_sound_ym3812(machine_config &config) void itech8_state::itech8_sound_ym3812_external(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware MC6809(config, m_soundcpu, CLOCK_8MHz); m_soundcpu->set_addrmap(AS_PROGRAM, &itech8_state::sound3812_external_map); - /* sound hardware */ + INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); + + via6522_device &via(MOS6522(config, "via6522", CLOCK_8MHz/4)); + via.writepb_handler().set(FUNC(itech8_state::pia_portb_out)); + via.irq_handler().set("soundirq", FUNC(input_merger_device::in_w<0>)); + + // sound hardware ym3812_device &ymsnd(YM3812(config, "ymsnd", CLOCK_8MHz/2)); - ymsnd.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); + ymsnd.irq_handler().set("soundirq", FUNC(input_merger_device::in_w<1>)); ymsnd.add_route(ALL_OUTPUTS, "mono", 0.75); okim6295_device &oki(OKIM6295(config, "oki", CLOCK_8MHz/8, okim6295_device::PIN7_HIGH)); // was /128, not /132, so unsure so pin 7 not verified @@ -1847,6 +1850,11 @@ void grmatch_state::grmatch(machine_config &config) m_screen->set_visarea(0, 399, 0, 239); m_screen->set_screen_update(FUNC(grmatch_state::screen_update)); + + config.device_remove("tlc34076"); // replaced with TMS34070s + + for (auto &elem : m_palette) + PALETTE(config, elem).set_entries(16); } void itech8_state::stratab_hi(machine_config &config) @@ -1983,13 +1991,13 @@ ROM_START( wfortune ) ROM_LOAD( "grom3-wof.grom3", 0x30000, 0x10000, CRC(117a2ce9) SHA1(8d601c1cf9f783a42617f13c6862a5835553ac4f) ) ROM_REGION( 0x40000, "oki", 0 ) - ROM_LOAD( "wof_vr-sbom0.srom0", 0x00000, 0x20000, CRC(5c28c3fe) SHA1(eba64ede749fb26f9926f644d66860b54b4c76e7) ) /* Labeled as WOF VR-SBOM0 (yes it's actually "SBOM0") */ + ROM_LOAD( "wof_vr-sbom0.srom0", 0x00000, 0x20000, CRC(5c28c3fe) SHA1(eba64ede749fb26f9926f644d66860b54b4c76e7) ) // Labeled as WOF VR-SBOM0 (yes it's actually "SBOM0") ROM_END ROM_START( wfortunea ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "wof-pgm_r1.u5", 0x00000, 0x10000, CRC(c3d3eb21) SHA1(21137663afd19fba875e188640f0347fc8c5dcf0) ) /* Labeled as WOF-PGM R1 */ + ROM_LOAD( "wof-pgm_r1.u5", 0x00000, 0x10000, CRC(c3d3eb21) SHA1(21137663afd19fba875e188640f0347fc8c5dcf0) ) // Labeled as WOF-PGM R1 ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "wof_snd-wof.u27", 0x08000, 0x8000, CRC(0a6aa5dc) SHA1(42eef40a4300d6d16d9e2af678432a02be05f104) ) @@ -2001,7 +2009,7 @@ ROM_START( wfortunea ) ROM_LOAD( "grom3-wof.grom3", 0x30000, 0x10000, CRC(117a2ce9) SHA1(8d601c1cf9f783a42617f13c6862a5835553ac4f) ) ROM_REGION( 0x40000, "oki", 0 ) - ROM_LOAD( "wof_vr-sbom0.srom0", 0x00000, 0x20000, CRC(5c28c3fe) SHA1(eba64ede749fb26f9926f644d66860b54b4c76e7) ) /* Labeled as WOF VR-SBOM0 (yes it's actually "SBOM0") */ + ROM_LOAD( "wof_vr-sbom0.srom0", 0x00000, 0x20000, CRC(5c28c3fe) SHA1(eba64ede749fb26f9926f644d66860b54b4c76e7) ) // Labeled as WOF VR-SBOM0 (yes it's actually "SBOM0") ROM_END @@ -2028,10 +2036,10 @@ ROM_END ROM_START( stratab ) ROM_REGION( 0x8000, "maincpu", 0 ) - ROM_LOAD( "sb_prog_v3_u5.u5", 0x00000, 0x8000, CRC(a5ae728f) SHA1(85098eef1614d5148e8082df4c936883662292ee) ) /* Labeled as SB PROG V3 (U5) */ + ROM_LOAD( "sb_prog_v3_u5.u5", 0x00000, 0x8000, CRC(a5ae728f) SHA1(85098eef1614d5148e8082df4c936883662292ee) ) // Labeled as SB PROG V3 (U5) ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "sb_snds_u27.u27", 0x08000, 0x8000, CRC(b36c8f0a) SHA1(c4c3edf3352d95561f76705087338c1946137447) ) /* Labeled as SB SNDS (U27) */ + ROM_LOAD( "sb_snds_u27.u27", 0x08000, 0x8000, CRC(b36c8f0a) SHA1(c4c3edf3352d95561f76705087338c1946137447) ) // Labeled as SB SNDS (U27) ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "sb_grom0_0.grom0", 0x00000, 0x20000, CRC(a915b0bd) SHA1(0955c7ebb48e97ccffc18c5deec6eccce1d68de8) ) @@ -2045,10 +2053,10 @@ ROM_END ROM_START( stratab1 ) ROM_REGION( 0x8000, "maincpu", 0 ) - ROM_LOAD( "sb_prog_v1_u5.u5", 0x00000, 0x8000, CRC(46d51604) SHA1(de7b6306fdcee4907b07667baf874bd195822e6a) ) /* Labeled as SB PROG V1 (U5) */ + ROM_LOAD( "sb_prog_v1_u5.u5", 0x00000, 0x8000, CRC(46d51604) SHA1(de7b6306fdcee4907b07667baf874bd195822e6a) ) // Labeled as SB PROG V1 (U5) ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "sb_snds_u27.u27", 0x08000, 0x8000, CRC(b36c8f0a) SHA1(c4c3edf3352d95561f76705087338c1946137447) ) /* Labeled as SB SNDS (U27) */ + ROM_LOAD( "sb_snds_u27.u27", 0x08000, 0x8000, CRC(b36c8f0a) SHA1(c4c3edf3352d95561f76705087338c1946137447) ) // Labeled as SB SNDS (U27) ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "sb_grom0_0.grom0", 0x00000, 0x20000, CRC(a915b0bd) SHA1(0955c7ebb48e97ccffc18c5deec6eccce1d68de8) ) @@ -2069,10 +2077,10 @@ Fun fact: */ ROM_START( gtg ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gtg_joy_v3.3_u5.u5", 0x00000, 0x10000, CRC(983a5c0c) SHA1(245fd6b86e96ef57ea9a85c7a501d846e135cfc6) ) /* Joystick version - Labeled GTG JOY V3.3 (U5) */ + ROM_LOAD( "gtg_joy_v3.3_u5.u5", 0x00000, 0x10000, CRC(983a5c0c) SHA1(245fd6b86e96ef57ea9a85c7a501d846e135cfc6) ) // Joystick version - Labeled GTG JOY V3.3 (U5) ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "golf_snd-v1.1_u27.u27", 0x08000, 0x8000, CRC(358d2440) SHA1(7b09350c89f9d2c86dc187d8812bbf26b576a38f) ) /* Labeled GOLF SND-V1.1 (U27) */ + ROM_LOAD( "golf_snd-v1.1_u27.u27", 0x08000, 0x8000, CRC(358d2440) SHA1(7b09350c89f9d2c86dc187d8812bbf26b576a38f) ) // Labeled GOLF SND-V1.1 (U27) ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "golf_grom00.grom0", 0x00000, 0x20000, CRC(a29c688a) SHA1(32dbb996a5e4c23cfd44b79312ac4a767658f20a) ) @@ -2089,10 +2097,10 @@ ROM_END ROM_START( gtgj31 ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gtg_joy_v3.1_u5.u5", 0x00000, 0x10000, CRC(61984272) SHA1(be735f8576fb2cccc0e9e6ea6f2fd54b6c0b3bb3) ) /* Joystick version - Labeled GTG JOY V3.1 (U5) */ + ROM_LOAD( "gtg_joy_v3.1_u5.u5", 0x00000, 0x10000, CRC(61984272) SHA1(be735f8576fb2cccc0e9e6ea6f2fd54b6c0b3bb3) ) // Joystick version - Labeled GTG JOY V3.1 (U5) ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "golf_snd-v1.1_u27.u27", 0x08000, 0x8000, CRC(358d2440) SHA1(7b09350c89f9d2c86dc187d8812bbf26b576a38f) ) /* Labeled GOLF SND-V1.1 (U27) */ + ROM_LOAD( "golf_snd-v1.1_u27.u27", 0x08000, 0x8000, CRC(358d2440) SHA1(7b09350c89f9d2c86dc187d8812bbf26b576a38f) ) // Labeled GOLF SND-V1.1 (U27) ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "golf_grom00.grom0", 0x00000, 0x20000, CRC(a29c688a) SHA1(32dbb996a5e4c23cfd44b79312ac4a767658f20a) ) @@ -2100,7 +2108,7 @@ ROM_START( gtgj31 ) ROM_LOAD( "golf_grom02.grom2", 0x40000, 0x20000, CRC(9b8e3a61) SHA1(1b5682b1328d6c97b604fb71512e8f72322a688f) ) ROM_LOAD( "golf_grom03.grom3", 0x60000, 0x20000, CRC(b6e9fb15) SHA1(c1b28ea911696cb4ed56bfba212848693530b59f) ) ROM_LOAD( "golf_grom04.grom4", 0x80000, 0x20000, CRC(faa16729) SHA1(5d46cddda66b6d23c9ebdf2fb4cebce15586b4ad) ) - ROM_LOAD( "golf_grom05.grom5", 0xa0000, 0x20000, CRC(5b393314) SHA1(9e314a75ea52373369904915ec786f09eee725a9) ) /* sldh */ + ROM_LOAD( "golf_grom05.grom5", 0xa0000, 0x20000, CRC(5b393314) SHA1(9e314a75ea52373369904915ec786f09eee725a9) ) // sldh ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "golf_srom0.srom0", 0x00000, 0x20000, CRC(1cccbfdf) SHA1(546059fea2e7cd5627a666d80b1fc3ed8fcc0762) ) @@ -2109,10 +2117,10 @@ ROM_END ROM_START( gtgt21 ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gtg_bim_2.1.u5", 0x0000, 0x10000, CRC(25f626d9) SHA1(19d3e01f388ac4d430cda6e46b4dda8cfceaf325) ) /* Trackball version */ + ROM_LOAD( "gtg_bim_2.1.u5", 0x0000, 0x10000, CRC(25f626d9) SHA1(19d3e01f388ac4d430cda6e46b4dda8cfceaf325) ) // Trackball version ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "golf_snd_u27.u27", 0x08000, 0x8000, CRC(ac6d3f32) SHA1(82b98df915cd794037ad863558e777f3ad10145b) ) /* Labeled GOLF SND (U27) - slds */ + ROM_LOAD( "golf_snd_u27.u27", 0x08000, 0x8000, CRC(ac6d3f32) SHA1(82b98df915cd794037ad863558e777f3ad10145b) ) // Labeled GOLF SND (U27) - slds ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "golf_grom00.grom0", 0x00000, 0x20000, CRC(a29c688a) SHA1(32dbb996a5e4c23cfd44b79312ac4a767658f20a) ) @@ -2120,19 +2128,19 @@ ROM_START( gtgt21 ) ROM_LOAD( "golf_grom02.grom2", 0x40000, 0x20000, CRC(9b8e3a61) SHA1(1b5682b1328d6c97b604fb71512e8f72322a688f) ) ROM_LOAD( "golf_grom03.grom3", 0x60000, 0x20000, CRC(b6e9fb15) SHA1(c1b28ea911696cb4ed56bfba212848693530b59f) ) ROM_LOAD( "golf_grom04.grom4", 0x80000, 0x20000, CRC(faa16729) SHA1(5d46cddda66b6d23c9ebdf2fb4cebce15586b4ad) ) - ROM_LOAD( "golf_grom05.grom5", 0xa0000, 0x10000, CRC(dab92dfb) SHA1(f99f553d48fb0600d971959efb4d0410d7606131) ) /* sldh */ + ROM_LOAD( "golf_grom05.grom5", 0xa0000, 0x10000, CRC(dab92dfb) SHA1(f99f553d48fb0600d971959efb4d0410d7606131) ) // sldh ROM_REGION( 0x40000, "oki", 0 ) - ROM_LOAD( "golf_srom0.srom0", 0x00000, 0x20000, CRC(d041e0c9) SHA1(1d90f37071d92c714ff69ab2b0337c7c66147995) ) /* sldh */ + ROM_LOAD( "golf_srom0.srom0", 0x00000, 0x20000, CRC(d041e0c9) SHA1(1d90f37071d92c714ff69ab2b0337c7c66147995) ) // sldh ROM_END ROM_START( gtgt20 ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gtg_bim_2.0.u5", 0x0000, 0x10000, CRC(4c907166) SHA1(338a599645fa49c9fcbfbe5ba3431dafffddacc7) ) /* Trackball version */ + ROM_LOAD( "gtg_bim_2.0.u5", 0x0000, 0x10000, CRC(4c907166) SHA1(338a599645fa49c9fcbfbe5ba3431dafffddacc7) ) // Trackball version ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "golf_snd_u27.u27", 0x08000, 0x8000, CRC(f6a7429b) SHA1(0fb378606c12c3543aa1ff603101e262acb9c692) ) /* Labeled GOLF SND (U27) - slds */ + ROM_LOAD( "golf_snd_u27.u27", 0x08000, 0x8000, CRC(f6a7429b) SHA1(0fb378606c12c3543aa1ff603101e262acb9c692) ) // Labeled GOLF SND (U27) - slds ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "golf_grom00.grom0", 0x00000, 0x20000, CRC(a29c688a) SHA1(32dbb996a5e4c23cfd44b79312ac4a767658f20a) ) @@ -2140,19 +2148,19 @@ ROM_START( gtgt20 ) ROM_LOAD( "golf_grom02.grom2", 0x40000, 0x20000, CRC(9b8e3a61) SHA1(1b5682b1328d6c97b604fb71512e8f72322a688f) ) ROM_LOAD( "golf_grom03.grom3", 0x60000, 0x20000, CRC(b6e9fb15) SHA1(c1b28ea911696cb4ed56bfba212848693530b59f) ) ROM_LOAD( "golf_grom04.grom4", 0x80000, 0x20000, CRC(faa16729) SHA1(5d46cddda66b6d23c9ebdf2fb4cebce15586b4ad) ) - ROM_LOAD( "golf_grom05.grom5", 0xa0000, 0x10000, CRC(62a523d2) SHA1(431f89fa044bf0ed3c197745d9c1a61f666da658) ) /* sldh */ + ROM_LOAD( "golf_grom05.grom5", 0xa0000, 0x10000, CRC(62a523d2) SHA1(431f89fa044bf0ed3c197745d9c1a61f666da658) ) // sldh ROM_REGION( 0x40000, "oki", 0 ) - ROM_LOAD( "golf_srom0.srom0", 0x00000, 0x20000, CRC(d041e0c9) SHA1(1d90f37071d92c714ff69ab2b0337c7c66147995) ) /* sldh */ + ROM_LOAD( "golf_srom0.srom0", 0x00000, 0x20000, CRC(d041e0c9) SHA1(1d90f37071d92c714ff69ab2b0337c7c66147995) ) // sldh ROM_END ROM_START( gtgt10 ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gtg_bim_1.0.u5", 0x00000, 0x10000, CRC(ec70b510) SHA1(318984d77eb1df6258b855781ae1c9a09aa74f15) ) /* Trackball version */ + ROM_LOAD( "gtg_bim_1.0.u5", 0x00000, 0x10000, CRC(ec70b510) SHA1(318984d77eb1df6258b855781ae1c9a09aa74f15) ) // Trackball version ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "golf_snd_u27.u27", 0x08000, 0x8000, CRC(471da557) SHA1(32bfe450a42d9eb6c14edcfa2b4e33f65a11126e) ) /* Labeled GOLF SND (U27) - slds */ + ROM_LOAD( "golf_snd_u27.u27", 0x08000, 0x8000, CRC(471da557) SHA1(32bfe450a42d9eb6c14edcfa2b4e33f65a11126e) ) // Labeled GOLF SND (U27) - slds ROM_REGION( 0xb0000, "grom", 0 ) ROM_LOAD( "golf_grom00.grom0", 0x00000, 0x20000, CRC(a29c688a) SHA1(32dbb996a5e4c23cfd44b79312ac4a767658f20a) ) @@ -2160,19 +2168,19 @@ ROM_START( gtgt10 ) ROM_LOAD( "golf_grom02.grom2", 0x40000, 0x20000, CRC(9b8e3a61) SHA1(1b5682b1328d6c97b604fb71512e8f72322a688f) ) ROM_LOAD( "golf_grom03.grom3", 0x60000, 0x20000, CRC(b6e9fb15) SHA1(c1b28ea911696cb4ed56bfba212848693530b59f) ) ROM_LOAD( "golf_grom04.grom4", 0x80000, 0x20000, CRC(faa16729) SHA1(5d46cddda66b6d23c9ebdf2fb4cebce15586b4ad) ) - ROM_LOAD( "golf_grom05.grom5", 0xa0000, 0x10000, CRC(44b47015) SHA1(5dde4c932a697b51fe02eab8d948889b3fe7baff) ) /* sldh */ + ROM_LOAD( "golf_grom05.grom5", 0xa0000, 0x10000, CRC(44b47015) SHA1(5dde4c932a697b51fe02eab8d948889b3fe7baff) ) // sldh ROM_REGION( 0x40000, "oki", 0 ) - ROM_LOAD( "golf_srom0.srom0", 0x00000, 0x20000, CRC(d041e0c9) SHA1(1d90f37071d92c714ff69ab2b0337c7c66147995) ) /* sldh */ + ROM_LOAD( "golf_srom0.srom0", 0x00000, 0x20000, CRC(d041e0c9) SHA1(1d90f37071d92c714ff69ab2b0337c7c66147995) ) // sldh ROM_END ROM_START( gtg2t ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gtgii_tb_v1.1.u5", 0x00000, 0x10000, CRC(c7b3a9f3) SHA1(5edaca6fd6ee58bd1676dc9b2c86da4dd2f51687) ) /* Trackball version - labeled GTGII TB V1.1 (U5) */ + ROM_LOAD( "gtgii_tb_v1.1.u5", 0x00000, 0x10000, CRC(c7b3a9f3) SHA1(5edaca6fd6ee58bd1676dc9b2c86da4dd2f51687) ) // Trackball version - labeled GTGII TB V1.1 (U5) ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "gtgii_snd_v1_u27.u27", 0x08000, 0x8000, CRC(dd2a5905) SHA1(dc93f13de3953852a6757361eb9683a57d3ed326) ) /* labeled GTGII SND V1 (U27) */ + ROM_LOAD( "gtgii_snd_v1_u27.u27", 0x08000, 0x8000, CRC(dd2a5905) SHA1(dc93f13de3953852a6757361eb9683a57d3ed326) ) // labeled GTGII SND V1 (U27) ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "gtgii-grom0.grom0", 0x00000, 0x20000, CRC(a29c688a) SHA1(32dbb996a5e4c23cfd44b79312ac4a767658f20a) ) @@ -2183,7 +2191,7 @@ ROM_START( gtg2t ) ROM_LOAD( "gtgii-grom5.grom5", 0xa0000, 0x20000, CRC(a680ce6a) SHA1(fe51546933c093cea81858b213afb0e926e9eb4e) ) ROM_REGION( 0x40000, "oki", 0 ) - ROM_LOAD( "gtgii_vr_srom0.srom0", 0x00000, 0x20000, CRC(4dd4db42) SHA1(0dffb51e8de36d8747f443fd65fe9927815eaff0) ) /* labeled GTGII VR-SROM0 */ + ROM_LOAD( "gtgii_vr_srom0.srom0", 0x00000, 0x20000, CRC(4dd4db42) SHA1(0dffb51e8de36d8747f443fd65fe9927815eaff0) ) // labeled GTGII VR-SROM0 ROM_REGION( 0x0200, "plds", 0 ) ROM_LOAD( "tibpal16l8.u11", 0x0000, 0x0104, CRC(9bf5a75f) SHA1(79786f7ce656f30a33a92887a290b767a7cbbf31) ) @@ -2192,10 +2200,10 @@ ROM_END ROM_START( gtg2j ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gtg2.bim_1.0.u5", 0x00000, 0x10000, CRC(9c95ceaa) SHA1(d9fd2b2419c026822a07d2ba51d6ab40b7cd0d49) ) /* Joystick version */ + ROM_LOAD( "gtg2.bim_1.0.u5", 0x00000, 0x10000, CRC(9c95ceaa) SHA1(d9fd2b2419c026822a07d2ba51d6ab40b7cd0d49) ) // Joystick version ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "gtgii_snd_v1_u27.u27", 0x08000, 0x8000, CRC(dd2a5905) SHA1(dc93f13de3953852a6757361eb9683a57d3ed326) ) /* labeled GTGII SND V1 (U27) */ + ROM_LOAD( "gtgii_snd_v1_u27.u27", 0x08000, 0x8000, CRC(dd2a5905) SHA1(dc93f13de3953852a6757361eb9683a57d3ed326) ) // labeled GTGII SND V1 (U27) ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "gtgii-grom0.grom0", 0x00000, 0x20000, CRC(a29c688a) SHA1(32dbb996a5e4c23cfd44b79312ac4a767658f20a) ) @@ -2221,7 +2229,7 @@ ROM_START( slikshot ) ROM_LOAD( "pool_snd-u27.u27", 0x08000, 0x8000, CRC(a96ce0f7) SHA1(c1fec3aeef97c846fd1a20b91af54f6bf9723a71) ) ROM_REGION( 0x10000, "sub", 0 ) - ROM_LOAD( "z80_pgm_u53.u53", 0x00000, 0x0800, CRC(04b85918) SHA1(409aef2e71937c7654334999df9313909d757966) ) /* labeled Z80 PGM (U53) */ + ROM_LOAD( "z80_pgm_u53.u53", 0x00000, 0x0800, CRC(04b85918) SHA1(409aef2e71937c7654334999df9313909d757966) ) // labeled Z80 PGM (U53) ROM_CONTINUE( 0x00000, 0x0800 ) ROM_CONTINUE( 0x00000, 0x0800 ) ROM_CONTINUE( 0x00000, 0x0800 ) @@ -2243,7 +2251,7 @@ ROM_START( slikshot17 ) ROM_LOAD( "pool_snd-u27.u27", 0x08000, 0x8000, CRC(a96ce0f7) SHA1(c1fec3aeef97c846fd1a20b91af54f6bf9723a71) ) ROM_REGION( 0x10000, "sub", 0 ) - ROM_LOAD( "z80_pgm_u53.u53", 0x00000, 0x0800, CRC(04b85918) SHA1(409aef2e71937c7654334999df9313909d757966) ) /* labeled Z80 PGM (U53) */ + ROM_LOAD( "z80_pgm_u53.u53", 0x00000, 0x0800, CRC(04b85918) SHA1(409aef2e71937c7654334999df9313909d757966) ) // labeled Z80 PGM (U53) ROM_CONTINUE( 0x00000, 0x0800 ) ROM_CONTINUE( 0x00000, 0x0800 ) ROM_CONTINUE( 0x00000, 0x0800 ) @@ -2265,7 +2273,7 @@ ROM_START( slikshot16 ) ROM_LOAD( "pool_snd-u27.u27", 0x08000, 0x8000, CRC(a96ce0f7) SHA1(c1fec3aeef97c846fd1a20b91af54f6bf9723a71) ) ROM_REGION( 0x10000, "sub", 0 ) - ROM_LOAD( "z80_pgm_u53.u53", 0x00000, 0x0800, CRC(04b85918) SHA1(409aef2e71937c7654334999df9313909d757966) ) /* labeled Z80 PGM (U53) */ + ROM_LOAD( "z80_pgm_u53.u53", 0x00000, 0x0800, CRC(04b85918) SHA1(409aef2e71937c7654334999df9313909d757966) ) // labeled Z80 PGM (U53) ROM_CONTINUE( 0x00000, 0x0800 ) ROM_CONTINUE( 0x00000, 0x0800 ) ROM_CONTINUE( 0x00000, 0x0800 ) @@ -2281,7 +2289,7 @@ ROM_START( slikshot16 ) ROM_END -ROM_START( dynobop ) /* known to be labeled as DYNO PGM 1.0 U5, but same data - a "true" v1.0 most likely labeled as DYNO BIM U5 */ +ROM_START( dynobop ) // known to be labeled as DYNO PGM 1.0 U5, but same data - a "true" v1.0 most likely labeled as DYNO BIM U5 ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "dyno_pgm_1.1_u5.u5", 0x00000, 0x10000, CRC(98452c40) SHA1(9b9316fc258792e0d825f16e0fadf8e0c35a864e) ) @@ -2289,7 +2297,7 @@ ROM_START( dynobop ) /* known to be labeled as DYNO PGM 1.0 U5, but same data - ROM_LOAD( "dyno_snd-u27.u27", 0x08000, 0x8000, CRC(a37d862b) SHA1(922eeae184df2c5c28040da27699dd55744f8dca) ) ROM_REGION( 0x10000, "sub", 0 ) - ROM_LOAD( "z80_pgm_u53.u53", 0x00000, 0x0800, CRC(04b85918) SHA1(409aef2e71937c7654334999df9313909d757966) ) /* labeled Z80 PGM (U53) */ + ROM_LOAD( "z80_pgm_u53.u53", 0x00000, 0x0800, CRC(04b85918) SHA1(409aef2e71937c7654334999df9313909d757966) ) // labeled Z80 PGM (U53) ROM_CONTINUE( 0x00000, 0x0800 ) ROM_CONTINUE( 0x00000, 0x0800 ) ROM_CONTINUE( 0x00000, 0x0800 ) @@ -2305,10 +2313,10 @@ ROM_END ROM_START( sstrike ) ROM_REGION( 0x8000, "maincpu", 0 ) - ROM_LOAD( "sstrik_prg-v1_u5.u5", 0x00000, 0x8000, CRC(af00cddf) SHA1(b866e8dfce1449f7462a79efa385ea6b55cdc6e7) ) /* labeled SSTRIKE PRG-V1(U5) */ + ROM_LOAD( "sstrik_prg-v1_u5.u5", 0x00000, 0x8000, CRC(af00cddf) SHA1(b866e8dfce1449f7462a79efa385ea6b55cdc6e7) ) // labeled SSTRIKE PRG-V1(U5) ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "sstrik_snd1.4_u27.u27", 0x08000, 0x8000, CRC(efab7252) SHA1(eb3b2002531e551e3d67958ea3cc56a69fa660e2) ) /* labeled SSTRIKE SND1.4(U27) */ + ROM_LOAD( "sstrik_snd1.4_u27.u27", 0x08000, 0x8000, CRC(efab7252) SHA1(eb3b2002531e551e3d67958ea3cc56a69fa660e2) ) // labeled SSTRIKE SND1.4(U27) ROM_REGION( 0x10000, "sub", 0 ) ROM_LOAD( "spstku53.u53", 0x00000, 0x0800, CRC(04b85918) SHA1(409aef2e71937c7654334999df9313909d757966) ) @@ -2365,80 +2373,80 @@ ROM_START( pokrdice ) ROM_END -ROM_START( hstennis ) /* PCB p/n 1030 */ +ROM_START( hstennis ) // PCB p/n 1030 ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "ten.bim_v1.1_u5.u5", 0x00000, 0x10000, CRC(faffab5c) SHA1(4de525f6adb16205c47788b78aecdebd57008295) ) /* labeled as TEN.BIM V1.1 (U5) */ + ROM_LOAD( "ten.bim_v1.1_u5.u5", 0x00000, 0x10000, CRC(faffab5c) SHA1(4de525f6adb16205c47788b78aecdebd57008295) ) // labeled as TEN.BIM V1.1 (U5) ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "tensnd.bim_v1_u27.u27", 0x08000, 0x8000, CRC(f034a694) SHA1(3540e2edff2ce47504260ec856bab9b638d9260d) ) /* labeled as TENSND.BIM V1 U27 */ + ROM_LOAD( "tensnd.bim_v1_u27.u27", 0x08000, 0x8000, CRC(f034a694) SHA1(3540e2edff2ce47504260ec856bab9b638d9260d) ) // labeled as TENSND.BIM V1 U27 ROM_REGION( 0xc0000, "grom", 0 ) - ROM_LOAD( "t_grom0.bim.grom0", 0x00000, 0x20000, CRC(1e69ebae) SHA1(a32e2c2f4e4a527ae6b57adeccd2c4d2045ab5fe) ) /* labeled as T GROM0.BIM, ect... */ + ROM_LOAD( "t_grom0.bim.grom0", 0x00000, 0x20000, CRC(1e69ebae) SHA1(a32e2c2f4e4a527ae6b57adeccd2c4d2045ab5fe) ) // labeled as T GROM0.BIM, ect... ROM_LOAD( "t_grom1.bim.grom1", 0x20000, 0x20000, CRC(4e6a22d5) SHA1(3c2d51dd874f61c0a557ea2c1968afa02d9bfc42) ) ROM_LOAD( "t_grom2.bim.grom2", 0x40000, 0x20000, CRC(c0b643a9) SHA1(d240f703a55c39ce4a969612fbb9cd76e4b849ac) ) ROM_LOAD( "t_grom3.bim.grom3", 0x60000, 0x20000, CRC(54afb456) SHA1(0a7f10b1a490825a85489ac3f678eb1e11a0ac65) ) ROM_LOAD( "t_grom4.bim.grom4", 0x80000, 0x20000, CRC(ee09d645) SHA1(8233cfbd17d9de548ae3ca5e30928061712e0781) ) ROM_REGION( 0x40000, "oki", 0 ) - ROM_LOAD( "tennis.vr_srom0.srom0", 0x00000, 0x20000, CRC(d9ce58c3) SHA1(92574e60497d86b8608fba6278ccfc9036cb7f22) ) /* labeled as TENNIS.VR SROM0 */ + ROM_LOAD( "tennis.vr_srom0.srom0", 0x00000, 0x20000, CRC(d9ce58c3) SHA1(92574e60497d86b8608fba6278ccfc9036cb7f22) ) // labeled as TENNIS.VR SROM0 ROM_REGION( 0x0200, "plds", 0 ) ROM_LOAD( "pal16l8-itvs.u11", 0x0000, 0x0104, CRC(fee03727) SHA1(e784ff18505cdccc1020dbe5cb0e7cc9efc068a4) ) ROM_END -ROM_START( hstennis10 ) /* PCB p/n 1030 */ +ROM_START( hstennis10 ) // PCB p/n 1030 ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "ten.bim_v1.0_u5.u5", 0x00000, 0x10000, CRC(d108a6e0) SHA1(1041e1d95b10245fc50f6484e710803db2706f9a) ) /* labeled as TEN.BIM V1.0 (U5) */ + ROM_LOAD( "ten.bim_v1.0_u5.u5", 0x00000, 0x10000, CRC(d108a6e0) SHA1(1041e1d95b10245fc50f6484e710803db2706f9a) ) // labeled as TEN.BIM V1.0 (U5) ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "tensnd.bim_v1_u27.u27", 0x08000, 0x8000, CRC(f034a694) SHA1(3540e2edff2ce47504260ec856bab9b638d9260d) ) /* labeled as TENSND.BIM V1 U27 */ + ROM_LOAD( "tensnd.bim_v1_u27.u27", 0x08000, 0x8000, CRC(f034a694) SHA1(3540e2edff2ce47504260ec856bab9b638d9260d) ) // labeled as TENSND.BIM V1 U27 ROM_REGION( 0xc0000, "grom", 0 ) - ROM_LOAD( "t_grom0.bim.grom0", 0x00000, 0x20000, CRC(1e69ebae) SHA1(a32e2c2f4e4a527ae6b57adeccd2c4d2045ab5fe) ) /* labeled as T GROM0.BIM, ect... */ + ROM_LOAD( "t_grom0.bim.grom0", 0x00000, 0x20000, CRC(1e69ebae) SHA1(a32e2c2f4e4a527ae6b57adeccd2c4d2045ab5fe) ) // labeled as T GROM0.BIM, ect... ROM_LOAD( "t_grom1.bim.grom1", 0x20000, 0x20000, CRC(4e6a22d5) SHA1(3c2d51dd874f61c0a557ea2c1968afa02d9bfc42) ) ROM_LOAD( "t_grom2.bim.grom2", 0x40000, 0x20000, CRC(c0b643a9) SHA1(d240f703a55c39ce4a969612fbb9cd76e4b849ac) ) ROM_LOAD( "t_grom3.bim.grom3", 0x60000, 0x20000, CRC(54afb456) SHA1(0a7f10b1a490825a85489ac3f678eb1e11a0ac65) ) ROM_LOAD( "t_grom4.bim.grom4", 0x80000, 0x20000, CRC(ee09d645) SHA1(8233cfbd17d9de548ae3ca5e30928061712e0781) ) ROM_REGION( 0x40000, "oki", 0 ) - ROM_LOAD( "tennis.vr_srom0.srom0", 0x00000, 0x20000, CRC(d9ce58c3) SHA1(92574e60497d86b8608fba6278ccfc9036cb7f22) ) /* labeled as TENNIS.VR SROM0 */ + ROM_LOAD( "tennis.vr_srom0.srom0", 0x00000, 0x20000, CRC(d9ce58c3) SHA1(92574e60497d86b8608fba6278ccfc9036cb7f22) ) // labeled as TENNIS.VR SROM0 ROM_REGION( 0x0200, "plds", 0 ) ROM_LOAD( "pal16l8-itvs.u11", 0x0000, 0x0104, CRC(fee03727) SHA1(e784ff18505cdccc1020dbe5cb0e7cc9efc068a4) ) ROM_END -ROM_START( arlingtn ) /* PCB p/n 1030 rev. 1A */ +ROM_START( arlingtn ) // PCB p/n 1030 rev. 1A ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "ahr-d_v_1.40_u5.u5", 0x00000, 0x10000, CRC(02338ddd) SHA1(8e8e0c319c0b7533511089aa7a671a112169a4a1) ) /* labeled AHR-D V 1.40 (U5) - service menu reports version as 1.40-D */ + ROM_LOAD( "ahr-d_v_1.40_u5.u5", 0x00000, 0x10000, CRC(02338ddd) SHA1(8e8e0c319c0b7533511089aa7a671a112169a4a1) ) // labeled AHR-D V 1.40 (U5) - service menu reports version as 1.40-D ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "ahr_snd_v1.1_u27.u27", 0x08000, 0x8000, CRC(dec57dca) SHA1(21a8ead10b0434629f41f6b067c49b6622569a6c) ) /* labeled AHR SND V1.1 (U27) */ + ROM_LOAD( "ahr_snd_v1.1_u27.u27", 0x08000, 0x8000, CRC(dec57dca) SHA1(21a8ead10b0434629f41f6b067c49b6622569a6c) ) // labeled AHR SND V1.1 (U27) ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "ahr_grom0.grom0", 0x00000, 0x20000, CRC(5ef57fe5) SHA1(e877979e034a61968b432037501e25a302a17a9a) ) ROM_LOAD( "ahr_grom1.grom1", 0x20000, 0x20000, CRC(6aca95c0) SHA1(da7a899bf0812a7af178e48b5a626ce56a836579) ) ROM_LOAD( "ahr_grom2.grom2", 0x40000, 0x10000, CRC(6d6fde1b) SHA1(aaabc45d4b566be42e8d28d767e4771a96d9caae) ) - /* GROM3, GROM4 & GROM5 are unpopulated */ + // GROM3, GROM4 & GROM5 are unpopulated ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "ahr_srom0.srom0", 0x00000, 0x40000, CRC(56087f81) SHA1(1d4a1f396ee9d8ed51d0417ea94b0b379312d72f) ) ROM_END -ROM_START( arlingtna ) /* PCB p/n 1030 rev. 1A */ +ROM_START( arlingtna ) // PCB p/n 1030 rev. 1A ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "ahr-d_v_1.21_u5.u5", 0x00000, 0x10000, CRC(00aae02e) SHA1(3bcfbd256c34ae222dde24ba9544f19da70b698e) ) /* labeled AHR-D V 1.21 (U5) - service menu reports version as 1.21-D */ + ROM_LOAD( "ahr-d_v_1.21_u5.u5", 0x00000, 0x10000, CRC(00aae02e) SHA1(3bcfbd256c34ae222dde24ba9544f19da70b698e) ) // labeled AHR-D V 1.21 (U5) - service menu reports version as 1.21-D ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "ahr_snd_v1.1_u27.u27", 0x08000, 0x8000, CRC(dec57dca) SHA1(21a8ead10b0434629f41f6b067c49b6622569a6c) ) /* labeled AHR SND V 1.1 (U27) */ + ROM_LOAD( "ahr_snd_v1.1_u27.u27", 0x08000, 0x8000, CRC(dec57dca) SHA1(21a8ead10b0434629f41f6b067c49b6622569a6c) ) // labeled AHR SND V 1.1 (U27) ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "ahr_grom0.grom0", 0x00000, 0x20000, CRC(5ef57fe5) SHA1(e877979e034a61968b432037501e25a302a17a9a) ) ROM_LOAD( "ahr_grom1.grom1", 0x20000, 0x20000, CRC(6aca95c0) SHA1(da7a899bf0812a7af178e48b5a626ce56a836579) ) ROM_LOAD( "ahr_grom2.grom2", 0x40000, 0x10000, CRC(6d6fde1b) SHA1(aaabc45d4b566be42e8d28d767e4771a96d9caae) ) - /* GROM3, GROM4 & GROM5 are unpopulated */ + // GROM3, GROM4 & GROM5 are unpopulated ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "ahr_srom0.srom0", 0x00000, 0x40000, CRC(56087f81) SHA1(1d4a1f396ee9d8ed51d0417ea94b0b379312d72f) ) @@ -2499,10 +2507,10 @@ ROM_END ROM_START( rimrockn ) ROM_REGION( 0x20000, "maincpu", 0 ) - ROM_LOAD( "rrb.bim_2.2_u5.u5", 0x00000, 0x20000, CRC(97777683) SHA1(0998dde26daaa2d2b78e83647e03ba01b0ef31f2) ) /* Labeled as RRB.BIM 2.2 U5 */ + ROM_LOAD( "rrb.bim_2.2_u5.u5", 0x00000, 0x20000, CRC(97777683) SHA1(0998dde26daaa2d2b78e83647e03ba01b0ef31f2) ) // Labeled as RRB.BIM 2.2 U5 ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "rrbsnd_v1.1_u27.u27", 0x08000, 0x8000, CRC(59f87f0e) SHA1(46f38aca35a7c2faee227b4c950d20a6076c6fa7) ) /* Labeled as RRBSND V1.1 U27 */ + ROM_LOAD( "rrbsnd_v1.1_u27.u27", 0x08000, 0x8000, CRC(59f87f0e) SHA1(46f38aca35a7c2faee227b4c950d20a6076c6fa7) ) // Labeled as RRBSND V1.1 U27 ROM_REGION( 0x100000, "grom", 0 ) ROM_LOAD( "rbb-grom00", 0x00000, 0x40000, CRC(3eacbad9) SHA1(bff1ec6a24ccf983434e4e9453c30f36fa397534) ) @@ -2514,18 +2522,18 @@ ROM_START( rimrockn ) ROM_LOAD( "rbb-srom0", 0x00000, 0x40000, CRC(7ad42be0) SHA1(c9b519bad3c5c9a3315d1bf3292cc30ee0771db7) ) ROM_REGION( 0x0600, "plds", 0 ) - ROM_LOAD( "pal16l8.u14", 0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "pal16r4.u45", 0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "pal16l8.u29", 0x0400, 0x0104, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "pal16l8.u14", 0x0000, 0x0104, NO_DUMP ) // PAL is read protected + ROM_LOAD( "pal16r4.u45", 0x0200, 0x0104, NO_DUMP ) // PAL is read protected + ROM_LOAD( "pal16l8.u29", 0x0400, 0x0104, NO_DUMP ) // PAL is read protected ROM_END ROM_START( rimrockn20 ) ROM_REGION( 0x20000, "maincpu", 0 ) - ROM_LOAD( "rrb.bim_2.0_u5.u5", 0x00000, 0x20000, CRC(7e9d5545) SHA1(2aa028b3f5d05bec4ee289e7d39eaad30b3d4d5f) ) /* Labeled as RRB.BIM 2.0 U5 */ + ROM_LOAD( "rrb.bim_2.0_u5.u5", 0x00000, 0x20000, CRC(7e9d5545) SHA1(2aa028b3f5d05bec4ee289e7d39eaad30b3d4d5f) ) // Labeled as RRB.BIM 2.0 U5 ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "rrbsnd_v1.1_u27.u27", 0x08000, 0x8000, CRC(59f87f0e) SHA1(46f38aca35a7c2faee227b4c950d20a6076c6fa7) ) /* Labeled as RRBSND V1.1 U27 */ + ROM_LOAD( "rrbsnd_v1.1_u27.u27", 0x08000, 0x8000, CRC(59f87f0e) SHA1(46f38aca35a7c2faee227b4c950d20a6076c6fa7) ) // Labeled as RRBSND V1.1 U27 ROM_REGION( 0x100000, "grom", 0 ) ROM_LOAD( "rbb-grom00", 0x00000, 0x40000, CRC(3eacbad9) SHA1(bff1ec6a24ccf983434e4e9453c30f36fa397534) ) @@ -2540,10 +2548,10 @@ ROM_END ROM_START( rimrockn16 ) ROM_REGION( 0x20000, "maincpu", 0 ) - ROM_LOAD( "rrb.bim_1.6_u5.u5",0x00000, 0x20000, CRC(999cd502) SHA1(8ad0d641a9f853eff27be1d4de04ab86b9275d57) ) /* Labeled as RRB.BIM 1.6 U5 */ + ROM_LOAD( "rrb.bim_1.6_u5.u5",0x00000, 0x20000, CRC(999cd502) SHA1(8ad0d641a9f853eff27be1d4de04ab86b9275d57) ) // Labeled as RRB.BIM 1.6 U5 ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "rrbsnd_v1.1_u27.u27", 0x08000, 0x8000, CRC(59f87f0e) SHA1(46f38aca35a7c2faee227b4c950d20a6076c6fa7) ) /* Labeled as RRBSND V1.1 U27 */ + ROM_LOAD( "rrbsnd_v1.1_u27.u27", 0x08000, 0x8000, CRC(59f87f0e) SHA1(46f38aca35a7c2faee227b4c950d20a6076c6fa7) ) // Labeled as RRBSND V1.1 U27 ROM_REGION( 0x100000, "grom", 0 ) ROM_LOAD( "rbb-grom00", 0x00000, 0x40000, CRC(3eacbad9) SHA1(bff1ec6a24ccf983434e4e9453c30f36fa397534) ) @@ -2558,10 +2566,10 @@ ROM_END ROM_START( rimrockn15 ) ROM_REGION( 0x20000, "maincpu", 0 ) - ROM_LOAD( "rrb.bim_1.5_u5.u5",0x00000, 0x20000, CRC(d6c25bdf) SHA1(8255313e93a4afbe537ae61f5219e51fcf60d6b7) ) /* Labeled as RRB.BIM 1.5 U5 */ + ROM_LOAD( "rrb.bim_1.5_u5.u5",0x00000, 0x20000, CRC(d6c25bdf) SHA1(8255313e93a4afbe537ae61f5219e51fcf60d6b7) ) // Labeled as RRB.BIM 1.5 U5 ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "rrbsnd_v1.1_u27.u27", 0x08000, 0x8000, CRC(59f87f0e) SHA1(46f38aca35a7c2faee227b4c950d20a6076c6fa7) ) /* Labeled as RRBSND V1.1 U27 */ + ROM_LOAD( "rrbsnd_v1.1_u27.u27", 0x08000, 0x8000, CRC(59f87f0e) SHA1(46f38aca35a7c2faee227b4c950d20a6076c6fa7) ) // Labeled as RRBSND V1.1 U27 ROM_REGION( 0x100000, "grom", 0 ) ROM_LOAD( "rbb-grom00", 0x00000, 0x40000, CRC(3eacbad9) SHA1(bff1ec6a24ccf983434e4e9453c30f36fa397534) ) @@ -2576,10 +2584,10 @@ ROM_END ROM_START( rimrockn12 ) ROM_REGION( 0x20000, "maincpu", 0 ) - ROM_LOAD( "rrb.bim_1.2_u5.u5",0x00000, 0x20000, CRC(661761a6) SHA1(7224b1eac2fd0969d70657448ab241a433143df4) ) /* Labeled as RRB.BIM 1.2 U5 */ + ROM_LOAD( "rrb.bim_1.2_u5.u5",0x00000, 0x20000, CRC(661761a6) SHA1(7224b1eac2fd0969d70657448ab241a433143df4) ) // Labeled as RRB.BIM 1.2 U5 ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "rrbsnd_v1_u27.u27", 0x08000, 0x8000, CRC(8eda5f53) SHA1(f256544a8c87125587719460ed0fef14efef9015) ) /* Labeled as RRBSND V1 U27 */ + ROM_LOAD( "rrbsnd_v1_u27.u27", 0x08000, 0x8000, CRC(8eda5f53) SHA1(f256544a8c87125587719460ed0fef14efef9015) ) // Labeled as RRBSND V1 U27 ROM_REGION( 0x100000, "grom", 0 ) ROM_LOAD( "rbb-grom00", 0x00000, 0x40000, CRC(3eacbad9) SHA1(bff1ec6a24ccf983434e4e9453c30f36fa397534) ) @@ -2608,7 +2616,7 @@ ROM_START( rimrockn12b ) ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "rbb-srom0", 0x00000, 0x40000, CRC(7ad42be0) SHA1(c9b519bad3c5c9a3315d1bf3292cc30ee0771db7) ) - /* Unused */ + // Unused ROM_REGION( 0x0096b, "plds", 0 ) ROM_LOAD( "a-palce16v8h.u53", 0x00000, 0x00117, NO_DUMP ) // Undumped (solderded) ROM_LOAD( "a-palce16v8q.u45", 0x00117, 0x00117, NO_DUMP ) // Undumped (solderded) @@ -2641,9 +2649,9 @@ ROM_START( ninclown ) ROM_END -ROM_START( gpgolf ) /* P/N 1047 REV. 1 main board + P/N 1038 REV2 sound board */ +ROM_START( gpgolf ) // P/N 1047 REV. 1 main board + P/N 1038 REV2 sound board ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gpg_v1.1.u5", 0x00000, 0x10000, CRC(631e77e0) SHA1(847ba1e00d31441620a2a1f45a9aa58df84bde8b) ) /* Joystick version 1.1 */ + ROM_LOAD( "gpg_v1.1.u5", 0x00000, 0x10000, CRC(631e77e0) SHA1(847ba1e00d31441620a2a1f45a9aa58df84bde8b) ) // Joystick version 1.1 ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "sndv1.u27", 0x08000, 0x8000, CRC(55734876) SHA1(eb5ef816acbc6e35642749e38a2908b7ba359b9d) ) @@ -2652,35 +2660,35 @@ ROM_START( gpgolf ) /* P/N 1047 REV. 1 main board + P/N 1038 REV2 sound board */ ROM_LOAD( "grom00.grom0", 0x00000, 0x40000, CRC(c3a7b54b) SHA1(414d693bc5337d578d2630817dd647cf7e5cbcf7) ) ROM_LOAD( "grom01.grom1", 0x40000, 0x40000, CRC(b7fe172d) SHA1(1ad0f3ce0f240ac1a23c0c5bdd9f99ec81bc14f1) ) ROM_LOAD( "grom02.grom2", 0x80000, 0x40000, CRC(aebe6c45) SHA1(15e64fcb36cb1064988ee5cd45699d501a6e7f01) ) - /* GROM3 not socketted or populated */ + // GROM3 not socketted or populated ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "srom00.srom0", 0x00000, 0x20000, CRC(4dd4db42) SHA1(0dffb51e8de36d8747f443fd65fe9927815eaff0) ) ROM_END -ROM_START( gpgolfa ) /* P/N 1047 REV. 1 main board + P/N 1038 REV2 sound board */ +ROM_START( gpgolfa ) // P/N 1047 REV. 1 main board + P/N 1038 REV2 sound board ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gpar.bin.u5", 0x00000, 0x10000, CRC(bcb030b0) SHA1(6fbe0ccd50c3769050d86e2376950fd06ce2abdc) ) /* Joystick version 1.0 - handwritten label */ + ROM_LOAD( "gpar.bin.u5", 0x00000, 0x10000, CRC(bcb030b0) SHA1(6fbe0ccd50c3769050d86e2376950fd06ce2abdc) ) // Joystick version 1.0 - handwritten label ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "golf_sound_12-19-91_v.96.u27", 0x00000, 0x10000, CRC(f46b4300) SHA1(7be1878b72c55fb83b2cae3b79b1f65fe8825b4a) ) /* 27C512 with the first 0x8000 as 0xFF fill - handwritten label GOLF SOUND 12/19/91 V.96 */ -// ROM_LOAD( "golf_sound.u27", 0x08000, 0x8000, CRC(3183d7f3) SHA1(482411947aa3074cec7d4491f6ee64785894d27c) ) /* Different than sndv1.u27 */ + ROM_LOAD( "golf_sound_12-19-91_v.96.u27", 0x00000, 0x10000, CRC(f46b4300) SHA1(7be1878b72c55fb83b2cae3b79b1f65fe8825b4a) ) // 27C512 with the first 0x8000 as 0xFF fill - handwritten label GOLF SOUND 12/19/91 V.96 +// ROM_LOAD( "golf_sound.u27", 0x08000, 0x8000, CRC(3183d7f3) SHA1(482411947aa3074cec7d4491f6ee64785894d27c) ) // Different than sndv1.u27 ROM_REGION( 0xc0000, "grom", 0 ) ROM_LOAD( "grom00.grom0", 0x00000, 0x40000, CRC(c3a7b54b) SHA1(414d693bc5337d578d2630817dd647cf7e5cbcf7) ) ROM_LOAD( "grom01.grom1", 0x40000, 0x40000, CRC(b7fe172d) SHA1(1ad0f3ce0f240ac1a23c0c5bdd9f99ec81bc14f1) ) ROM_LOAD( "grom02.grom2", 0x80000, 0x40000, CRC(aebe6c45) SHA1(15e64fcb36cb1064988ee5cd45699d501a6e7f01) ) - /* GROM3 not socketted or populated */ + // GROM3 not socketted or populated ROM_REGION( 0x40000, "oki", 0 ) - ROM_LOAD( "golf_speech_12-19-91_v.96.srom0", 0x00000, 0x20000, CRC(4dd4db42) SHA1(0dffb51e8de36d8747f443fd65fe9927815eaff0) ) /* == srom00.srom0 - handwritten label GOLF SPEECh 12/19/91 V.96 */ + ROM_LOAD( "golf_speech_12-19-91_v.96.srom0", 0x00000, 0x20000, CRC(4dd4db42) SHA1(0dffb51e8de36d8747f443fd65fe9927815eaff0) ) // == srom00.srom0 - handwritten label GOLF SPEECh 12/19/91 V.96 ROM_END ROM_START( gtg2 ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "gtg2_v2_2.u5", 0x00000, 0x10000, CRC(4a61580f) SHA1(7c64648d47418fbcc0f9b5bd91f88856209bc0f5) ) /* Trackball version */ + ROM_LOAD( "gtg2_v2_2.u5", 0x00000, 0x10000, CRC(4a61580f) SHA1(7c64648d47418fbcc0f9b5bd91f88856209bc0f5) ) // Trackball version ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "sndv1.u27", 0x08000, 0x8000, CRC(55734876) SHA1(eb5ef816acbc6e35642749e38a2908b7ba359b9d) ) @@ -2697,7 +2705,7 @@ ROM_START( gtg2 ) ROM_LOAD( "srom00.bin", 0x00000, 0x20000, CRC(4dd4db42) SHA1(0dffb51e8de36d8747f443fd65fe9927815eaff0) ) ROM_REGION( 0x0200, "plds", 0 ) - ROM_LOAD( "tibpal16l8.u29", 0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "tibpal16l8.u29", 0x0000, 0x0104, NO_DUMP ) // PAL is read protected ROM_END @@ -2744,54 +2752,54 @@ void itech8_state::init_neckneck() * *************************************/ -/* Wheel of Fortune-style PCB */ -GAME( 1989, wfortune, 0, wfortune, wfortune, itech8_state, empty_init, ROT0, "GameTek", "Wheel Of Fortune (set 1)", 0 ) -GAME( 1989, wfortunea, wfortune, wfortune, wfortune, itech8_state, empty_init, ROT0, "GameTek", "Wheel Of Fortune (set 2)", 0 ) /* program ROM label states "R1" */ - -/* Grudge Match-style PCB */ -GAME( 1989, grmatch, 0, grmatch, grmatch, grmatch_state, empty_init, ROT0, "Yankee Game Technology", "Grudge Match (Yankee Game Technology)", 0 ) - -/* Strata Bowling-style PCB */ -GAME( 1990, stratab, 0, stratab_hi, stratab, itech8_state, empty_init, ROT270, "Strata/Incredible Technologies", "Strata Bowling (V3)", 0 ) // still says V1 in service mode? -GAME( 1990, stratab1, stratab, stratab_hi, stratab, itech8_state, empty_init, ROT270, "Strata/Incredible Technologies", "Strata Bowling (V1)", 0 ) -GAME( 1990, gtg, 0, stratab_hi, gtg, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Golden Tee Golf (Joystick, v3.3)", 0 ) -GAME( 1990, gtgj31, gtg, stratab_hi, gtg, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Golden Tee Golf (Joystick, v3.1)", 0 ) -GAME( 1989, gtgt21, gtg, stratab_hi, gtgt, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Golden Tee Golf (Trackball, v2.1)", 0 ) -GAME( 1989, gtgt20, gtg, stratab_hi, gtgt, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Golden Tee Golf (Trackball, v2.0)", 0 ) -GAME( 1989, gtgt10, gtg, stratab_hi, gtgt, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Golden Tee Golf (Trackball, v1.0)", 0 ) -GAME( 1989, gtg2t, gtg2, stratab_hi, gtg2t, itech8_state, init_invbank, ROT0, "Strata/Incredible Technologies", "Golden Tee Golf II (Trackball, V1.1)", 0 ) -GAME( 1991, gtg2j, gtg2, stratab_lo, gtg, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Golden Tee Golf II (Joystick, V1.0)", 0 ) - -/* Slick Shot-style PCB */ -GAME( 1990, slikshot, 0, slikshot_hi, slikshot, slikshot_state, empty_init, ROT90, "Grand Products/Incredible Technologies", "Slick Shot (V2.2)", MACHINE_MECHANICAL ) -GAME( 1990, slikshot17, slikshot, slikshot_hi, slikshot, slikshot_state, empty_init, ROT90, "Grand Products/Incredible Technologies", "Slick Shot (V1.7)", MACHINE_MECHANICAL ) -GAME( 1990, slikshot16, slikshot, slikshot_hi, slikshot, slikshot_state, empty_init, ROT90, "Grand Products/Incredible Technologies", "Slick Shot (V1.6)", MACHINE_MECHANICAL ) -GAME( 1990, dynobop, 0, slikshot_hi, dynobop, slikshot_state, empty_init, ROT90, "Grand Products/Incredible Technologies", "Dyno Bop (V1.1)", MACHINE_MECHANICAL ) -GAME( 1990, sstrike, 0, slikshot_lo, sstrike, sstrike_state, empty_init, ROT270, "Strata/Incredible Technologies", "Super Strike Bowling (V1)", MACHINE_MECHANICAL ) -GAME( 1990, stratabs, stratab, slikshot_lo, stratabs, sstrike_state, empty_init, ROT270, "Strata/Incredible Technologies", "Strata Bowling (V1 4T, Super Strike Bowling type PCB)", MACHINE_NOT_WORKING ) // need to figure out the control hookup for this set, service mode indicates it's still a trackball like stratab -GAME( 1991, pokrdice, 0, slikshot_lo_noz80, pokrdice, itech8_state, empty_init, ROT90, "Strata/Incredible Technologies", "Poker Dice (V1.7)", 0 ) - -/* Hot Shots Tennis-style PCB */ -GAME( 1990, hstennis, 0, hstennis_hi, hstennis, itech8_state, init_hstennis, ROT90, "Strata/Incredible Technologies", "Hot Shots Tennis (V1.1)", 0 ) -GAME( 1990, hstennis10, hstennis, hstennis_hi, hstennis, itech8_state, init_hstennis, ROT90, "Strata/Incredible Technologies", "Hot Shots Tennis (V1.0)", 0 ) -GAME( 1991, arlingtn, 0, hstennis_hi, arlingtn, itech8_state, init_arligntn, ROT0, "Strata/Incredible Technologies", "Arlington Horse Racing (v1.40-D)", 0 ) -GAME( 1991, arlingtna, arlingtn, hstennis_hi, arlingtn, itech8_state, init_arligntn, ROT0, "Strata/Incredible Technologies", "Arlington Horse Racing (v1.21-D)", 0 ) -GAME( 1991, peggle, 0, hstennis_lo, peggle, itech8_state, init_peggle, ROT90, "Strata/Incredible Technologies", "Peggle (Joystick, v1.0)", 0 ) -GAME( 1991, pegglet, peggle, hstennis_lo, pegglet, itech8_state, init_peggle, ROT90, "Strata/Incredible Technologies", "Peggle (Trackball, v1.0)", 0 ) -GAME( 1992, neckneck, 0, hstennis_lo, neckneck, itech8_state, init_neckneck, ROT0, "Bundra Games/Incredible Technologies", "Neck-n-Neck (v1.2)", 0 ) - -/* Rim Rockin' Basketball-style PCB */ -GAME( 1991, rimrockn, 0, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Rim Rockin' Basketball (V2.2)", 0 ) -GAME( 1991, rimrockn20, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Rim Rockin' Basketball (V2.0)", 0 ) -GAME( 1991, rimrockn16, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Rim Rockin' Basketball (V1.6)", 0 ) -GAME( 1991, rimrockn15, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Rim Rockin' Basketball (V1.5)", 0 ) -GAME( 1991, rimrockn12, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Rim Rockin' Basketball (V1.2)", 0 ) -GAME( 1991, rimrockn12b, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "bootleg", "Rim Rockin' Basketball (V1.2, bootleg)", 0 ) - -/* Ninja Clowns-style PCB */ -GAME( 1991, ninclown, 0, ninclown, ninclown, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Ninja Clowns (27 oct 91)", 0 ) - -/* Golden Tee Golf II-style PCB */ -GAME( 1992, gpgolf, 0, gtg2, gpgolf, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Golden Par Golf (Joystick, V1.1)", 0 ) /* Seems to stall during Demo Mode?? */ -GAME( 1991, gpgolfa, gpgolf, gtg2, gpgolf, itech8_state, empty_init, ROT0, "Strata/Incredible Technologies", "Golden Par Golf (Joystick, V1.0)", 0 ) /* Seems to stall during Demo Mode?? */ -GAME( 1992, gtg2, 0, gtg2, gtg2, itech8_state, init_invbank, ROT0, "Strata/Incredible Technologies", "Golden Tee Golf II (Trackball, V2.2)", 0 ) +// Wheel of Fortune-style PCB +GAME( 1989, wfortune, 0, wfortune, wfortune, itech8_state, empty_init, ROT0, "GameTek", "Wheel Of Fortune (set 1)", 0 ) +GAME( 1989, wfortunea, wfortune, wfortune, wfortune, itech8_state, empty_init, ROT0, "GameTek", "Wheel Of Fortune (set 2)", 0 ) // program ROM label states "R1" + +// Grudge Match-style PCB +GAME( 1989, grmatch, 0, grmatch, grmatch, grmatch_state, empty_init, ROT0, "Yankee Game Technology", "Grudge Match (Yankee Game Technology)", 0 ) + +// Strata Bowling-style PCB +GAME( 1990, stratab, 0, stratab_hi, stratab, itech8_state, empty_init, ROT270, "Strata / Incredible Technologies", "Strata Bowling (V3)", 0 ) // still says V1 in service mode? +GAME( 1990, stratab1, stratab, stratab_hi, stratab, itech8_state, empty_init, ROT270, "Strata / Incredible Technologies", "Strata Bowling (V1)", 0 ) +GAME( 1990, gtg, 0, stratab_hi, gtg, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Golden Tee Golf (Joystick, v3.3)", 0 ) +GAME( 1990, gtgj31, gtg, stratab_hi, gtg, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Golden Tee Golf (Joystick, v3.1)", 0 ) +GAME( 1989, gtgt21, gtg, stratab_hi, gtgt, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Golden Tee Golf (Trackball, v2.1)", 0 ) +GAME( 1989, gtgt20, gtg, stratab_hi, gtgt, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Golden Tee Golf (Trackball, v2.0)", 0 ) +GAME( 1989, gtgt10, gtg, stratab_hi, gtgt, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Golden Tee Golf (Trackball, v1.0)", 0 ) +GAME( 1989, gtg2t, gtg2, stratab_hi, gtg2t, itech8_state, init_invbank, ROT0, "Strata / Incredible Technologies", "Golden Tee Golf II (Trackball, V1.1)", 0 ) +GAME( 1991, gtg2j, gtg2, stratab_lo, gtg, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Golden Tee Golf II (Joystick, V1.0)", 0 ) + +// Slick Shot-style PCB +GAME( 1990, slikshot, 0, slikshot_hi, slikshot, slikshot_state, empty_init, ROT90, "Grand Products / Incredible Technologies", "Slick Shot (V2.2)", MACHINE_MECHANICAL ) +GAME( 1990, slikshot17, slikshot, slikshot_hi, slikshot, slikshot_state, empty_init, ROT90, "Grand Products / Incredible Technologies", "Slick Shot (V1.7)", MACHINE_MECHANICAL ) +GAME( 1990, slikshot16, slikshot, slikshot_hi, slikshot, slikshot_state, empty_init, ROT90, "Grand Products / Incredible Technologies", "Slick Shot (V1.6)", MACHINE_MECHANICAL ) +GAME( 1990, dynobop, 0, slikshot_hi, dynobop, slikshot_state, empty_init, ROT90, "Grand Products / Incredible Technologies", "Dyno Bop (V1.1)", MACHINE_MECHANICAL ) +GAME( 1990, sstrike, 0, slikshot_lo, sstrike, sstrike_state, empty_init, ROT270, "Strata / Incredible Technologies", "Super Strike Bowling (V1)", MACHINE_MECHANICAL ) +GAME( 1990, stratabs, stratab, slikshot_lo, stratabs, sstrike_state, empty_init, ROT270, "Strata / Incredible Technologies", "Strata Bowling (V1 4T, Super Strike Bowling type PCB)", MACHINE_NOT_WORKING ) // need to figure out the control hookup for this set, service mode indicates it's still a trackball like stratab +GAME( 1991, pokrdice, 0, slikshot_lo_noz80, pokrdice, itech8_state, empty_init, ROT90, "Strata / Incredible Technologies", "Poker Dice (V1.7)", 0 ) + +// Hot Shots Tennis-style PCB +GAME( 1990, hstennis, 0, hstennis_hi, hstennis, itech8_state, init_hstennis, ROT90, "Strata / Incredible Technologies", "Hot Shots Tennis (V1.1)", 0 ) +GAME( 1990, hstennis10, hstennis, hstennis_hi, hstennis, itech8_state, init_hstennis, ROT90, "Strata / Incredible Technologies", "Hot Shots Tennis (V1.0)", 0 ) +GAME( 1991, arlingtn, 0, hstennis_hi, arlingtn, itech8_state, init_arligntn, ROT0, "Strata / Incredible Technologies", "Arlington Horse Racing (v1.40-D)", 0 ) +GAME( 1991, arlingtna, arlingtn, hstennis_hi, arlingtn, itech8_state, init_arligntn, ROT0, "Strata / Incredible Technologies", "Arlington Horse Racing (v1.21-D)", 0 ) +GAME( 1991, peggle, 0, hstennis_lo, peggle, itech8_state, init_peggle, ROT90, "Strata / Incredible Technologies", "Peggle (Joystick, v1.0)", 0 ) +GAME( 1991, pegglet, peggle, hstennis_lo, pegglet, itech8_state, init_peggle, ROT90, "Strata / Incredible Technologies", "Peggle (Trackball, v1.0)", 0 ) +GAME( 1992, neckneck, 0, hstennis_lo, neckneck, itech8_state, init_neckneck, ROT0, "Bundra Games / Incredible Technologies", "Neck-n-Neck (v1.2)", 0 ) + +// Rim Rockin' Basketball-style PCB +GAME( 1991, rimrockn, 0, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Rim Rockin' Basketball (V2.2)", 0 ) +GAME( 1991, rimrockn20, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Rim Rockin' Basketball (V2.0)", 0 ) +GAME( 1991, rimrockn16, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Rim Rockin' Basketball (V1.6)", 0 ) +GAME( 1991, rimrockn15, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Rim Rockin' Basketball (V1.5)", 0 ) +GAME( 1991, rimrockn12, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Rim Rockin' Basketball (V1.2)", 0 ) +GAME( 1991, rimrockn12b, rimrockn, rimrockn, rimrockn, itech8_state, empty_init, ROT0, "bootleg", "Rim Rockin' Basketball (V1.2, bootleg)", 0 ) + +// Ninja Clowns-style PCB +GAME( 1991, ninclown, 0, ninclown, ninclown, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Ninja Clowns (27 oct 91)", 0 ) + +// Golden Tee Golf II-style PCB +GAME( 1992, gpgolf, 0, gtg2, gpgolf, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Golden Par Golf (Joystick, V1.1)", 0 ) // Seems to stall during Demo Mode?? +GAME( 1991, gpgolfa, gpgolf, gtg2, gpgolf, itech8_state, empty_init, ROT0, "Strata / Incredible Technologies", "Golden Par Golf (Joystick, V1.0)", 0 ) // Seems to stall during Demo Mode?? +GAME( 1992, gtg2, 0, gtg2, gtg2, itech8_state, init_invbank, ROT0, "Strata / Incredible Technologies", "Golden Tee Golf II (Trackball, V2.2)", 0 ) diff --git a/src/mame/itech/itech8.h b/src/mame/itech/itech8.h index d8ebdffa45862..0801344fd3a42 100644 --- a/src/mame/itech/itech8.h +++ b/src/mame/itech/itech8.h @@ -13,6 +13,7 @@ #include "machine/nvram.h" #include "video/tlc34076.h" #include "video/tms34061.h" +#include "emupal.h" #include "screen.h" @@ -67,7 +68,7 @@ class itech8_state : public driver_device required_device m_nvram; required_device m_soundlatch; required_device m_tms34061; - required_device m_tlc34076; + optional_device m_tlc34076; required_device m_screen; required_device m_ticket; required_region_ptr m_grom; @@ -192,12 +193,12 @@ class slikshot_state : public itech8_state u8 m_curx = 0; s8 m_xbuffer[YBUFFER_COUNT]{}; s8 m_ybuffer[YBUFFER_COUNT]{}; - int m_ybuffer_next = 0; - int m_curxpos = 0; - int m_last_ytotal = 0; + u8 m_ybuffer_next = 0; + s32 m_curxpos = 0; + s32 m_last_ytotal = 0; u8 m_crosshair_vis = 0; - /*----------- defined in machine/itech8.cpp -----------*/ + //----------- defined in itech/itech8_m.cpp ----------- u8 z80_port_r(); void z80_port_w(u8 data); @@ -207,14 +208,14 @@ class slikshot_state : public itech8_state void z80_control_w(u8 data); void inters_to_vels(u16 inter1, u16 inter2, u16 inter3, u8 beams, - u8 *xres, u8 *vxres, u8 *vyres); + u8 &xres, u8 &vxres, u8 &vyres); void vels_to_inters(u8 x, u8 vx, u8 vy, - u16 *inter1, u16 *inter2, u16 *inter3, u8 *beams); - void inters_to_words(u16 inter1, u16 inter2, u16 inter3, u8 *beams, - u16 *word1, u16 *word2, u16 *word3); + u16 &inter1, u16 &inter2, u16 &inter3, u8 &beams); + void inters_to_words(u16 inter1, u16 inter2, u16 inter3, u8 &beams, + u16 &word1, u16 &word2, u16 &word3); void words_to_sensors(u16 word1, u16 word2, u16 word3, u8 beams, - u16 *sens0, u16 *sens1, u16 *sens2, u16 *sens3); + u16 &sens0, u16 &sens1, u16 &sens2, u16 &sens3); void compute_sensors(); TIMER_CALLBACK_MEMBER(delayed_z80_control_w); @@ -249,6 +250,7 @@ class grmatch_state : public itech8_state public: grmatch_state(const machine_config &mconfig, device_type type, const char *tag) : itech8_state(mconfig, type, tag), + m_palette(*this, "palette_%u", 0U), m_palette_timer(nullptr) { } @@ -259,6 +261,12 @@ class grmatch_state : public itech8_state virtual void machine_start() override; virtual void machine_reset() override; +private: + required_device_array m_palette; + emu_timer *m_palette_timer = nullptr; + u8 m_palcontrol = 0U; + u8 m_xscroll = 0U; + void palette_w(u8 data); void xscroll_w(u8 data); @@ -266,10 +274,5 @@ class grmatch_state : public itech8_state TIMER_CALLBACK_MEMBER(palette_update); - emu_timer *m_palette_timer = nullptr; - u8 m_palcontrol = 0U; - u8 m_xscroll = 0U; - rgb_t m_palette[2][16]{}; - void grmatch_map(address_map &map); }; diff --git a/src/mame/itech/itech8_m.cpp b/src/mame/itech/itech8_m.cpp index fbdc9393ccfbe..9491ea0798e10 100644 --- a/src/mame/itech/itech8_m.cpp +++ b/src/mame/itech/itech8_m.cpp @@ -97,27 +97,27 @@ #ifdef STANDALONE static void sensors_to_words(u16 sens0, u16 sens1, u16 sens2, u16 sens3, - u16 *word1, u16 *word2, u16 *word3, u8 *beams) + u16 &word1, u16 &word2, u16 &word3, u8 &beams) { - /* word 1 contains the difference between the larger of sensors 2 & 3 and the smaller */ - *word1 = (sens3 > sens2) ? (sens3 - sens2) : (sens2 - sens3); + // word 1 contains the difference between the larger of sensors 2 & 3 and the smaller + word1 = (sens3 > sens2) ? (sens3 - sens2) : (sens2 - sens3); - /* word 2 contains the value of the smaller of sensors 2 & 3 */ - *word2 = (sens3 > sens2) ? sens2 : sens3; + // word 2 contains the value of the smaller of sensors 2 & 3 + word2 = (sens3 > sens2) ? sens2 : sens3; - /* word 3 contains the value of sensor 0 or 1, depending on which fired */ - *word3 = sens0 ? sens0 : sens1; + // word 3 contains the value of sensor 0 or 1, depending on which fired + word3 = sens0 ? sens0 : sens1; - /* set the beams bits */ - *beams = 0; + // set the beams bits + beams = 0; - /* if sensor 1 fired first, set bit 0 */ + // if sensor 1 fired first, set bit 0 if (!sens0) - *beams |= 1; + beams |= 1; - /* if sensor 3 has the larger value, set bit 1 */ + // if sensor 3 has the larger value, set bit 1 if (sens3 > sens2) - *beams |= 2; + beams |= 2; } #endif @@ -135,37 +135,37 @@ static void sensors_to_words(u16 sens0, u16 sens1, u16 sens2, u16 sens3, #ifdef STANDALONE static void words_to_inters(u16 word1, u16 word2, u16 word3, u8 beams, - u16 *inter1, u16 *inter2, u16 *inter3) + u16 &inter1, u16 &inter2, u16 &inter3) { - /* word 2 is scaled up by 0x1.6553 */ - u16 word2mod = ((uint64_t)word2 * 0x16553) >> 16; + // word 2 is scaled up by 0x1.6553 + u16 word2mod = ((u64)word2 * 0x16553) >> 16; - /* intermediate values 1 and 2 are determined based on the beams bits */ + // intermediate values 1 and 2 are determined based on the beams bits switch (beams) { case 0: - *inter1 = word1 + word2mod; - *inter2 = word2mod + word3; + inter1 = word1 + word2mod; + inter2 = word2mod + word3; break; case 1: - *inter1 = word1 + word2mod + word3; - *inter2 = word2mod; + inter1 = word1 + word2mod + word3; + inter2 = word2mod; break; case 2: - *inter1 = word2mod; - *inter2 = word1 + word2mod + word3; + inter1 = word2mod; + inter2 = word1 + word2mod + word3; break; case 3: - *inter1 = word2mod + word3; - *inter2 = word1 + word2mod; + inter1 = word2mod + word3; + inter2 = word1 + word2mod; break; } - /* intermediate value 3 is always equal to the third word */ - *inter3 = word3; + // intermediate value 3 is always equal to the third word + inter3 = word3; } #endif @@ -181,63 +181,60 @@ static void words_to_inters(u16 word1, u16 word2, u16 word3, u8 beams, *************************************/ void slikshot_state::inters_to_vels(u16 inter1, u16 inter2, u16 inter3, u8 beams, - u8 *xres, u8 *vxres, u8 *vyres) + u8 &xres, u8 &vxres, u8 &vyres) { - u32 _27d8, _27c2; - u32 vx, vy, _283a, _283e; - u8 vxsgn; - u16 xoffs = 0x0016; - u8 xscale = 0xe6; + u16 const xoffs = 0x0016; + u8 const xscale = 0xe6; u16 x; - /* compute Vy */ - vy = inter1 ? (0x31c28 / inter1) : 0; + // compute Vy + u32 vy = inter1 ? (0x31c28 / inter1) : 0; - /* compute Vx */ - _283a = inter2 ? (0x30f2e / inter2) : 0; - _27d8 = ((uint64_t)vy * 0xfbd3) >> 16; - _27c2 = _283a - _27d8; - vxsgn = 0; - if ((int32_t)_27c2 < 0) + // compute Vx + u32 const _283a = inter2 ? (0x30f2e / inter2) : 0; + u32 _27d8 = ((u64)vy * 0xfbd3) >> 16; + u32 _27c2 = _283a - _27d8; + u8 vxsgn = 0; + if ((s32)_27c2 < 0) { vxsgn = 1; _27c2 = _27d8 - _283a; } - vx = ((uint64_t)_27c2 * 0x58f8c) >> 16; + u32 vx = ((u64)_27c2 * 0x58f8c) >> 16; - /* compute X */ - _27d8 = ((uint64_t)(inter3 << 16) * _283a) >> 16; - _283e = ((uint64_t)_27d8 * 0x4a574b) >> 16; + // compute X + _27d8 = ((u64)(inter3 << 16) * _283a) >> 16; + u32 _283e = ((u64)_27d8 * 0x4a574b) >> 16; - /* adjust X based on the low bit of the beams */ + // adjust X based on the low bit of the beams if (beams & 1) x = 0x7a + (_283e >> 16) - xoffs; else x = 0x7a - (_283e >> 16) - xoffs; - /* apply a constant X scale */ + // apply a constant X scale if (xscale) x = ((xscale * (x & 0xff)) >> 8) & 0xff; - /* clamp if out of range */ + // clamp if out of range if ((vx & 0xffff) >= 0x80) x = 0; - /* put the sign back in Vx */ + // put the sign back in Vx vx &= 0xff; if (!vxsgn) vx = -vx; - /* clamp VY */ + // clamp VY if ((vy & 0xffff) > 0x7f) vy = 0x7f; else vy &= 0xff; - /* copy the results */ - *xres = x; - *vxres = vx; - *vyres = vy; + // copy the results + xres = x; + vxres = vx; + vyres = vy; } @@ -254,42 +251,39 @@ void slikshot_state::inters_to_vels(u16 inter1, u16 inter2, u16 inter3, u8 beams *************************************/ void slikshot_state::vels_to_inters(u8 x, u8 vx, u8 vy, - u16 *inter1, u16 *inter2, u16 *inter3, u8 *beams) + u16 &inter1, u16 &inter2, u16 &inter3, u8 &beams) { - u32 _27d8; - u16 xoffs = 0x0016; - u8 xscale = 0xe6; + u16 const xoffs = 0x0016; + u8 const xscale = 0xe6; u8 x1, vx1, vy1; u8 x2, vx2, vy2; - u8 diff1, diff2; - u16 inter2a; - - /* inter1 comes from Vy */ - *inter1 = vy ? 0x31c28 / vy : 0; - - /* inter2 can be derived from Vx and Vy */ - _27d8 = ((uint64_t)vy * 0xfbd3) >> 16; - *inter2 = 0x30f2e / (_27d8 + (((u32)abs((s8)vx) << 16) / 0x58f8c)); - inter2a = 0x30f2e / (_27d8 - (((u32)abs((s8)vx) << 16) / 0x58f8c)); - - /* compute it back both ways and pick the closer */ - inters_to_vels(*inter1, *inter2, 0, 0, &x1, &vx1, &vy1); - inters_to_vels(*inter1, inter2a, 0, 0, &x2, &vx2, &vy2); - diff1 = (vx > vx1) ? (vx - vx1) : (vx1 - vx); - diff2 = (vx > vx2) ? (vx - vx2) : (vx2 - vx); + + // inter1 comes from Vy + inter1 = vy ? 0x31c28 / vy : 0; + + // inter2 can be derived from Vx and Vy + u32 const _27d8 = ((u64)vy * 0xfbd3) >> 16; + inter2 = 0x30f2e / (_27d8 + (((u32)abs((s8)vx) << 16) / 0x58f8c)); + u16 inter2a = 0x30f2e / (_27d8 - (((u32)abs((s8)vx) << 16) / 0x58f8c)); + + // compute it back both ways and pick the closer + inters_to_vels(inter1, inter2, 0, 0, x1, vx1, vy1); + inters_to_vels(inter1, inter2a, 0, 0, x2, vx2, vy2); + u8 const diff1 = (vx > vx1) ? (vx - vx1) : (vx1 - vx); + u8 const diff2 = (vx > vx2) ? (vx - vx2) : (vx2 - vx); if (diff2 < diff1) - *inter2 = inter2a; + inter2 = inter2a; - /* inter3: (beams & 1 == 1), inter3a: (beams & 1) == 0 */ + // inter3: (beams & 1 == 1), inter3a: (beams & 1) == 0 if (((x << 8) / xscale) + xoffs >= 0x7a) { - *beams = 1; - *inter3 = (((((((uint64_t)(((x << 8) / xscale) + xoffs - 0x7a)) << 16) << 16) / 0x4a574b) << 16) / (0x30f2e / *inter2)) >> 16; + beams = 1; + inter3 = (((((((u64)(((x << 8) / xscale) + xoffs - 0x7a)) << 16) << 16) / 0x4a574b) << 16) / (0x30f2e / inter2)) >> 16; } else { - *beams = 0; - *inter3 = (((((((uint64_t)(((x << 8) / xscale) + xoffs - 0x7a) * -1) << 16) << 16) / 0x4a574b) << 16) / (0x30f2e / *inter2)) >> 16; + beams = 0; + inter3 = (((((((u64)(((x << 8) / xscale) + xoffs - 0x7a) * -1) << 16) << 16) / 0x4a574b) << 16) / (0x30f2e / inter2)) >> 16; } } @@ -306,53 +300,53 @@ void slikshot_state::vels_to_inters(u8 x, u8 vx, u8 vy, * *************************************/ -void slikshot_state::inters_to_words(u16 inter1, u16 inter2, u16 inter3, u8 *beams, - u16 *word1, u16 *word2, u16 *word3) +void slikshot_state::inters_to_words(u16 inter1, u16 inter2, u16 inter3, u8 &beams, + u16 &word1, u16 &word2, u16 &word3) { u16 word2mod; - /* intermediate value 3 is always equal to the third word */ - *word3 = inter3; + // intermediate value 3 is always equal to the third word + word3 = inter3; - /* on input, it is expected that the low bit of beams has already been determined */ - if (*beams & 1) + // on input, it is expected that the low bit of beams has already been determined + if (beams & 1) { - /* make sure we can do it */ + // make sure we can do it if (inter3 <= inter1) { - /* always go back via case 3 */ - *beams |= 2; + // always go back via case 3 + beams |= 2; - /* compute an appropriate value for the scaled version of word 2 */ + // compute an appropriate value for the scaled version of word 2 word2mod = inter1 - inter3; - /* compute the other values from that */ - *word1 = inter2 - word2mod; - *word2 = ((uint64_t)word2mod << 16) / 0x16553; + // compute the other values from that + word1 = inter2 - word2mod; + word2 = ((u64)word2mod << 16) / 0x16553; } else LOGSENSOR("inters_to_words: unable to convert %04x %04x %04x %02x\n", - (u32)inter1, (u32)inter2, (u32)inter3, (u32)*beams); + inter1, inter2, inter3, beams); } - /* handle the case where low bit of beams is 0 */ + // handle the case where low bit of beams is 0 else { - /* make sure we can do it */ + // make sure we can do it if (inter3 <= inter2) { - /* always go back via case 0 */ + // always go back via case 0 - /* compute an appropriate value for the scaled version of word 2 */ + // compute an appropriate value for the scaled version of word 2 word2mod = inter2 - inter3; - /* compute the other values from that */ - *word1 = inter1 - word2mod; - *word2 = ((uint64_t)word2mod << 16) / 0x16553; + // compute the other values from that + word1 = inter1 - word2mod; + word2 = ((u64)word2mod << 16) / 0x16553; } else LOGSENSOR("inters_to_words: unable to convert %04x %04x %04x %02x\n", - (u32)inter1, (u32)inter2, (u32)inter3, (u32)*beams); + inter1, inter2, inter3, beams); } } @@ -369,19 +363,19 @@ void slikshot_state::inters_to_words(u16 inter1, u16 inter2, u16 inter3, u8 *bea *************************************/ void slikshot_state::words_to_sensors(u16 word1, u16 word2, u16 word3, u8 beams, - u16 *sens0, u16 *sens1, u16 *sens2, u16 *sens3) + u16 &sens0, u16 &sens1, u16 &sens2, u16 &sens3) { - /* if bit 0 of the beams is set, sensor 1 fired first; otherwise sensor 0 fired */ + // if bit 0 of the beams is set, sensor 1 fired first; otherwise sensor 0 fired if (beams & 1) - *sens0 = 0, *sens1 = word3; + sens0 = 0, sens1 = word3; else - *sens0 = word3, *sens1 = 0; + sens0 = word3, sens1 = 0; - /* if bit 1 of the beams is set, sensor 3 had a larger value */ + // if bit 1 of the beams is set, sensor 3 had a larger value if (beams & 2) - *sens3 = word2 + word1, *sens2 = word2; + sens3 = word2 + word1, sens2 = word2; else - *sens2 = word2 + word1, *sens3 = word2; + sens2 = word2 + word1, sens3 = word2; } @@ -398,14 +392,14 @@ void slikshot_state::compute_sensors() u16 word1 = 0, word2 = 0, word3 = 0; u8 beams; - /* skip if we're not ready */ + // skip if we're not ready if (m_sensor0 != 0 || m_sensor1 != 0 || m_sensor2 != 0 || m_sensor3 != 0) return; - /* reverse map the inputs */ - vels_to_inters(m_curx, m_curvx, m_curvy, &inter1, &inter2, &inter3, &beams); - inters_to_words(inter1, inter2, inter3, &beams, &word1, &word2, &word3); - words_to_sensors(word1, word2, word3, beams, &m_sensor0, &m_sensor1, &m_sensor2, &m_sensor3); + // reverse map the inputs + vels_to_inters(m_curx, m_curvx, m_curvy, inter1, inter2, inter3, beams); + inters_to_words(inter1, inter2, inter3, beams, word1, word2, word3); + words_to_sensors(word1, word2, word3, beams, m_sensor0, m_sensor1, m_sensor2, m_sensor3); LOGSENSOR("%15f: Sensor values: %04x %04x %04x %04x\n", machine().time().as_double(), m_sensor0, m_sensor1, m_sensor2, m_sensor3); } @@ -420,21 +414,37 @@ void slikshot_state::compute_sensors() u8 slikshot_state::z80_port_r() { - int result = 0; - - /* if we have nothing, return 0x03 */ + // if we have nothing, return 0x03 if (!m_sensor0 && !m_sensor1 && !m_sensor2 && !m_sensor3) return 0x03 | (m_z80_clear_to_send << 7); - /* 1 bit for each sensor */ + u8 result = 0; + + // 1 bit for each sensor if (m_sensor0) - result |= 1, m_sensor0--; + { + result |= 1; + if (!machine().side_effects_disabled()) + m_sensor0--; + } if (m_sensor1) - result |= 2, m_sensor1--; + { + result |= 2; + if (!machine().side_effects_disabled()) + m_sensor1--; + } if (m_sensor2) - result |= 4, m_sensor2--; + { + result |= 4; + if (!machine().side_effects_disabled()) + m_sensor2--; + } if (m_sensor3) - result |= 8, m_sensor3--; + { + result |= 8; + if (!machine().side_effects_disabled()) + m_sensor3--; + } result |= m_z80_clear_to_send << 7; return result; @@ -464,8 +474,9 @@ void slikshot_state::z80_port_w(u8 data) u8 slikshot_state::z80_r() { - /* allow the Z80 to send us stuff now */ - m_z80_clear_to_send = 1; + // allow the Z80 to send us stuff now + if (!machine().side_effects_disabled()) + m_z80_clear_to_send = 1; return m_z80_port_val; } @@ -492,25 +503,25 @@ u8 slikshot_state::z80_control_r() TIMER_CALLBACK_MEMBER(slikshot_state::delayed_z80_control_w) { - int data = param; + u8 const data = param; - /* bit 4 controls the reset line on the Z80 */ + // bit 4 controls the reset line on the Z80 - /* this is a big kludge: only allow a reset if the Z80 is stopped */ - /* at its endpoint; otherwise, we never get a result from the Z80 */ + // this is a big kludge: only allow a reset if the Z80 is stopped + // at its endpoint; otherwise, we never get a result from the Z80 if ((data & 0x10) || m_subcpu->state_int(Z80_PC) == 0x13a) { m_subcpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE); - /* on the rising edge, make the crosshair visible again */ + // on the rising edge, make the crosshair visible again if ((data & 0x10) && !(m_z80_ctrl & 0x10)) m_crosshair_vis = 1; } - /* boost the interleave whenever this is written to */ + // boost the interleave whenever this is written to machine().scheduler().perfect_quantum(attotime::from_usec(100)); - /* stash the new value */ + // stash the new value m_z80_ctrl = data; } @@ -558,54 +569,37 @@ void slikshot_state::machine_start() /************************************* * - * SCREEN_UPDATE( slikshot ) + * slikshot_state::screen_update * *************************************/ u32 slikshot_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - int totaldy, totaldx; - int temp, i; - - /* draw the normal video first */ + // draw the normal video first screen_update_2page(screen, bitmap, cliprect); - /* add the current X,Y positions to the list */ + // add the current X,Y positions to the list m_xbuffer[m_ybuffer_next % YBUFFER_COUNT] = m_fakex->read(); m_ybuffer[m_ybuffer_next % YBUFFER_COUNT] = m_fakey->read(); m_ybuffer_next++; - /* determine where to draw the starting point */ - m_curxpos += m_xbuffer[(m_ybuffer_next + 1) % YBUFFER_COUNT]; - if (m_curxpos < -0x80) m_curxpos = -0x80; - if (m_curxpos > 0x80) m_curxpos = 0x80; + // determine where to draw the starting point + m_curxpos = std::clamp(m_curxpos + m_xbuffer[(m_ybuffer_next + 1) % YBUFFER_COUNT], -0x80, 0x80); - /* compute the total X/Y movement */ - totaldx = totaldy = 0; - for (i = 0; i < YBUFFER_COUNT - 1; i++) + // compute the total X/Y movement + s32 totaldx = 0, totaldy = 0; + for (int i = 0; i < YBUFFER_COUNT - 1; i++) { totaldx += m_xbuffer[(m_ybuffer_next + i + 1) % YBUFFER_COUNT]; totaldy += m_ybuffer[(m_ybuffer_next + i + 1) % YBUFFER_COUNT]; } - /* if the shoot button is pressed, fire away */ + // if the shoot button is pressed, fire away if (totaldy < m_last_ytotal && m_last_ytotal > 50 && m_crosshair_vis) { - /* compute the updated values */ - temp = totaldx; - if (temp <= -0x80) temp = -0x7f; - if (temp >= 0x80) temp = 0x7f; - m_curvx = temp; - - temp = m_last_ytotal - 50; - if (temp <= 0x10) temp = 0x10; - if (temp >= 0x7f) temp = 0x7f; - m_curvy = temp; - - temp = 0x60 + (m_curxpos * 0x30 / 0x80); - if (temp <= 0x30) temp = 0x30; - if (temp >= 0x90) temp = 0x90; - m_curx = temp; + m_curvx = std::clamp(totaldx, -0x7f, 0x7f); + m_curvy = std::clamp(m_last_ytotal - 50, 0x10, 0x7f); + m_curx = std::clamp(0x60 + ((m_curxpos * 3) >> 3), 0x30, 0x90); compute_sensors(); // popmessage("V=%02x,%02x X=%02x", m_curvx, m_curvy, m_curx); @@ -613,7 +607,7 @@ u32 slikshot_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c } m_last_ytotal = totaldy; - /* clear the buffer while the crosshair is not visible */ + // clear the buffer while the crosshair is not visible if (!m_crosshair_vis) { memset(m_xbuffer, 0, sizeof(m_xbuffer)); diff --git a/src/mame/itech/itech8_v.cpp b/src/mame/itech/itech8_v.cpp index 2d80081297d22..ad13d1f776f3d 100644 --- a/src/mame/itech/itech8_v.cpp +++ b/src/mame/itech/itech8_v.cpp @@ -133,11 +133,11 @@ #define BLITTER_XSTOP m_blitter_data[10] #define BLITTER_YSKIP m_blitter_data[11] -#define BLITFLAG_SHIFT 0x01 -#define BLITFLAG_XFLIP 0x02 -#define BLITFLAG_YFLIP 0x04 -#define BLITFLAG_RLE 0x08 -#define BLITFLAG_TRANSPARENT 0x10 +static constexpr u8 BLITFLAG_SHIFT = 0x01; +static constexpr u8 BLITFLAG_XFLIP = 0x02; +static constexpr u8 BLITFLAG_YFLIP = 0x04; +static constexpr u8 BLITFLAG_RLE = 0x08; +static constexpr u8 BLITFLAG_TRANSPARENT = 0x10; @@ -149,10 +149,10 @@ void itech8_state::video_start() { - /* get the TMS34061 display state */ + // get the TMS34061 display state m_tms34061->get_display_state(); - /* reset statics */ + // reset statics m_page_select = 0xc0; m_blit_in_progress = 0; @@ -238,8 +238,6 @@ inline void itech8_state::consume_rle(int count) { while (count) { - int num_to_consume; - if (m_fetch_rle_count == 0) { m_fetch_rle_count = m_grom[m_fetch_offset++ % m_grom.length()]; @@ -250,7 +248,7 @@ inline void itech8_state::consume_rle(int count) m_fetch_rle_value = m_grom[m_fetch_offset++ % m_grom.length()]; } - num_to_consume = (count < m_fetch_rle_count) ? count : m_fetch_rle_count; + int const num_to_consume = (count < m_fetch_rle_count) ? count : m_fetch_rle_count; count -= num_to_consume; m_fetch_rle_count -= num_to_consume; @@ -270,48 +268,48 @@ inline void itech8_state::consume_rle(int count) void itech8_state::perform_blit() { offs_t addr = m_tms34061->xyaddress() | ((m_tms34061->xyoffset() & 0x300) << 8); - u8 shift = (BLITTER_FLAGS & BLITFLAG_SHIFT) ? 4 : 0; - int transparent = (BLITTER_FLAGS & BLITFLAG_TRANSPARENT); - int ydir = (BLITTER_FLAGS & BLITFLAG_YFLIP) ? -1 : 1; + u8 const shift = (BLITTER_FLAGS & BLITFLAG_SHIFT) ? 4 : 0; + int const transparent = (BLITTER_FLAGS & BLITFLAG_TRANSPARENT); + int const ydir = (BLITTER_FLAGS & BLITFLAG_YFLIP) ? -1 : 1; int xdir = (BLITTER_FLAGS & BLITFLAG_XFLIP) ? -1 : 1; - int xflip = (BLITTER_FLAGS & BLITFLAG_XFLIP); - int rle = (BLITTER_FLAGS & BLITFLAG_RLE); - int color = m_tms34061->latch_r(); + int const xflip = (BLITTER_FLAGS & BLITFLAG_XFLIP); + int const rle = (BLITTER_FLAGS & BLITFLAG_RLE); + int const color = m_tms34061->latch_r(); int width = BLITTER_WIDTH; int height = BLITTER_HEIGHT; u8 transmaskhi, transmasklo; - u8 mask = BLITTER_MASK; + u8 const mask = BLITTER_MASK; u8 skip[3]; int x, y; - /* debugging */ + // debugging LOGBLITTER("Blit: scan=%d src=%06x @ (%05x) for %dx%d ... flags=%02x\n", m_screen->vpos(), (m_grom_bank << 16) | (BLITTER_ADDRHI << 8) | BLITTER_ADDRLO, m_tms34061->xyaddress() | ((m_tms34061->xyoffset() & 0x300) << 8), BLITTER_WIDTH, BLITTER_HEIGHT, BLITTER_FLAGS); - /* initialize the fetcher */ + // initialize the fetcher m_fetch_offset = (m_grom_bank << 16) | (BLITTER_ADDRHI << 8) | BLITTER_ADDRLO; m_fetch_rle_count = 0; - /* RLE starts with a couple of extra 0's */ + // RLE starts with a couple of extra 0's if (rle) m_fetch_offset += 2; - /* select 4-bit versus 8-bit transparency */ + // select 4-bit versus 8-bit transparency if (BLITTER_OUTPUT & 0x40) transmaskhi = 0xf0, transmasklo = 0x0f; else transmaskhi = transmasklo = 0xff; - /* compute horiz skip counts */ + // compute horiz skip counts skip[0] = BLITTER_XSTART; skip[1] = (width <= BLITTER_XSTOP) ? 0 : width - 1 - BLITTER_XSTOP; if (xdir == -1) { int temp = skip[0]; skip[0] = skip[1]; skip[1] = temp; } width -= skip[0] + skip[1]; - /* compute vertical skip counts */ + // compute vertical skip counts if (ydir == 1) { skip[2] = (height <= BLITTER_YCOUNT) ? 0 : height - BLITTER_YCOUNT; @@ -323,71 +321,71 @@ void itech8_state::perform_blit() if (BLITTER_YCOUNT > 1) height -= BLITTER_YCOUNT - 1; } - /* skip top */ + // skip top for (y = 0; y < skip[2]; y++) { - /* skip src and dest */ + // skip src and dest addr += xdir * (width + skip[0] + skip[1]); if (rle) consume_rle(width + skip[0] + skip[1]); else consume_raw(width + skip[0] + skip[1]); - /* back up one and reverse directions */ + // back up one and reverse directions addr -= xdir; addr += ydir * 256; addr &= VRAM_MASK; xdir = -xdir; } - /* loop over height */ + // loop over height for (y = skip[2]; y < height; y++) { - /* skip left */ + // skip left addr += xdir * skip[y & 1]; if (rle) consume_rle(skip[y & 1]); else consume_raw(skip[y & 1]); - /* loop over width */ + // loop over width for (x = 0; x < width; x++) { u8 pix = rle ? fetch_next_rle() : fetch_next_raw(); - /* swap pixels for X flip in 4bpp mode */ + // swap pixels for X flip in 4bpp mode if (xflip && transmaskhi != 0xff) pix = (pix >> 4) | (pix << 4); pix &= mask; - /* draw upper pixel */ + // draw upper pixel if (!transparent || (pix & transmaskhi)) { m_tms34061->m_display.vram[addr] = (m_tms34061->m_display.vram[addr] & (0x0f << shift)) | ((pix & 0xf0) >> shift); m_tms34061->m_display.latchram[addr] = (m_tms34061->m_display.latchram[addr] & (0x0f << shift)) | ((color & 0xf0) >> shift); } - /* draw lower pixel */ + // draw lower pixel if (!transparent || (pix & transmasklo)) { - offs_t addr1 = addr + shift/4; + offs_t const addr1 = addr + shift/4; m_tms34061->m_display.vram[addr1] = (m_tms34061->m_display.vram[addr1] & (0xf0 >> shift)) | ((pix & 0x0f) << shift); m_tms34061->m_display.latchram[addr1] = (m_tms34061->m_display.latchram[addr1] & (0xf0 >> shift)) | ((color & 0x0f) << shift); } - /* advance to the next byte */ + // advance to the next byte addr += xdir; addr &= VRAM_MASK; } - /* skip right */ + // skip right addr += xdir * skip[~y & 1]; if (rle) consume_rle(skip[~y & 1]); else consume_raw(skip[~y & 1]); - /* back up one and reverse directions */ + // back up one and reverse directions addr -= xdir; addr += ydir * 256; addr &= VRAM_MASK; @@ -405,7 +403,7 @@ void itech8_state::perform_blit() TIMER_CALLBACK_MEMBER(itech8_state::blitter_done) { - /* turn off blitting and generate an interrupt */ + // turn off blitting and generate an interrupt m_blit_in_progress = 0; update_interrupts(-1, -1, 1); @@ -424,23 +422,24 @@ u8 itech8_state::blitter_r(offs_t offset) { int result = m_blitter_data[offset / 2]; - /* debugging */ + // debugging LOGBLITTER("%s:blitter_r(%02x)\n", machine().describe_context(), offset / 2); - /* low bit seems to be ignored */ + // low bit seems to be ignored offset /= 2; - /* a read from offset 3 clears the interrupt and returns the status */ + // a read from offset 3 clears the interrupt and returns the status if (offset == 3) { - update_interrupts(-1, -1, 0); + if (!machine().side_effects_disabled()) + update_interrupts(-1, -1, 0); if (m_blit_in_progress) result |= 0x80; else result &= 0x7f; } - /* a read from offsets 12-15 return input port values */ + // a read from offsets 12-15 return input port values if (offset >= 12 && offset <= 15) result = m_an[offset - 12].read_safe(0); @@ -450,14 +449,14 @@ u8 itech8_state::blitter_r(offs_t offset) void itech8_state::blitter_w(offs_t offset, u8 data) { - /* low bit seems to be ignored */ + // low bit seems to be ignored offset /= 2; m_blitter_data[offset] = data; - /* a write to offset 3 starts things going */ + // a write to offset 3 starts things going if (offset == 3) { - /* log to the blitter file */ + // log to the blitter file LOGBLITTER("Blit: XY=%1X%04X SRC=%02X%02X%02X SIZE=%3dx%3d FLAGS=%02x", (m_tms34061->xyoffset() >> 8) & 0x0f, m_tms34061->xyaddress(), m_grom_bank, m_blitter_data[0], m_blitter_data[1], @@ -473,15 +472,15 @@ void itech8_state::blitter_w(offs_t offset, u8 data) m_blitter_data[12], m_blitter_data[13], m_blitter_data[14], m_blitter_data[15]); - /* perform the blit */ + // perform the blit perform_blit(); m_blit_in_progress = 1; - /* set a timer to go off when we're done */ + // set a timer to go off when we're done m_blitter_done_timer->adjust(attotime::from_hz(12000000/4) * (BLITTER_WIDTH * BLITTER_HEIGHT + 12)); } - /* debugging */ + // debugging LOGBLITTER("%s:blitter_w(%02x)=%02x\n", machine().describe_context(), offset, data); } @@ -495,7 +494,7 @@ void itech8_state::blitter_w(offs_t offset, u8 data) void itech8_state::tms34061_w(offs_t offset, u8 data) { - int func = (offset >> 9) & 7; + int const func = (offset >> 9) & 7; int col = offset & 0xff; /* Column address (CA0-CA8) is hooked up the A0-A7, with A1 being inverted @@ -503,14 +502,14 @@ void itech8_state::tms34061_w(offs_t offset, u8 data) if (func == 0 || func == 2) col ^= 2; - /* Row address (RA0-RA8) is not dependent on the offset */ + // Row address (RA0-RA8) is not dependent on the offset m_tms34061->write(col, 0xff, func, data); } u8 itech8_state::tms34061_r(offs_t offset) { - int func = (offset >> 9) & 7; + int const func = (offset >> 9) & 7; int col = offset & 0xff; /* Column address (CA0-CA8) is hooked up the A0-A7, with A1 being inverted @@ -518,7 +517,7 @@ u8 itech8_state::tms34061_r(offs_t offset) if (func == 0 || func == 2) col ^= 2; - /* Row address (RA0-RA8) is not dependent on the offset */ + // Row address (RA0-RA8) is not dependent on the offset return m_tms34061->read(col, 0xff, func); } @@ -532,14 +531,14 @@ u8 itech8_state::tms34061_r(offs_t offset) void grmatch_state::palette_w(u8 data) { - /* set the palette control; examined in the scanline callback */ + // set the palette control; examined in the scanline callback m_palcontrol = data; } void grmatch_state::xscroll_w(u8 data) { - /* update the X scroll value */ + // update the X scroll value //m_screen->update_now(); m_screen->update_partial(m_screen->vpos()); m_xscroll = data; @@ -548,21 +547,21 @@ void grmatch_state::xscroll_w(u8 data) TIMER_CALLBACK_MEMBER(grmatch_state::palette_update) { - /* if the high bit is set, we are supposed to latch the palette values */ + // if the high bit is set, we are supposed to latch the palette values if (m_palcontrol & 0x80) { - /* the TMS34070s latch at the start of the frame, based on the first few bytes */ - u32 page_offset = (m_tms34061->m_display.dispstart & 0x0ffff) | m_xscroll; + // the TMS34070s latch at the start of the frame, based on the first few bytes + u32 const page_offset = (m_tms34061->m_display.dispstart & 0x0ffff) | m_xscroll; - /* iterate over both pages */ + // iterate over both pages for (int page = 0; page < 2; page++) { const u8 *base = &m_tms34061->m_display.vram[(page * 0x20000 + page_offset) & VRAM_MASK]; for (int x = 0; x < 16; x++) { - u8 data0 = base[x * 2 + 0]; - u8 data1 = base[x * 2 + 1]; - m_palette[page][x] = rgb_t(pal4bit(data0 >> 0), pal4bit(data1 >> 4), pal4bit(data1 >> 0)); + u8 const data0 = base[x * 2 + 0]; + u8 const data1 = base[x * 2 + 1]; + m_palette[page]->set_pen_color(x, rgb_t(pal4bit(data0 >> 0), pal4bit(data1 >> 4), pal4bit(data1 >> 0))); } } } @@ -582,10 +581,10 @@ u32 itech8_state::screen_update_2layer(screen_device &screen, bitmap_rgb32 &bitm { pen_t const *const pens = m_tlc34076->pens(); - /* first get the current display state */ + // first get the current display state m_tms34061->get_display_state(); - /* if we're blanked, just fill with black */ + // if we're blanked, just fill with black if (m_tms34061->blanked()) { bitmap.fill(rgb_t::black(), cliprect); @@ -604,7 +603,7 @@ u32 itech8_state::screen_update_2layer(screen_device &screen, bitmap_rgb32 &bitm for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { - int const pix0 = base0[x] & 0x0f; + u8 const pix0 = base0[x] & 0x0f; dest[x] = pens[pix0 ? pix0 : base2[x]]; } } @@ -614,10 +613,12 @@ u32 itech8_state::screen_update_2layer(screen_device &screen, bitmap_rgb32 &bitm u32 grmatch_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - /* first get the current display state */ + pen_t const *const pens[2] = { m_palette[0]->pens(), m_palette[1]->pens() }; + + // first get the current display state m_tms34061->get_display_state(); - /* if we're blanked, just fill with black */ + // if we're blanked, just fill with black if (m_tms34061->blanked()) { bitmap.fill(rgb_t::black(), cliprect); @@ -642,14 +643,14 @@ u32 grmatch_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, co u8 const pix2 = base2[x / 2]; if ((pix0 & 0xf0) != 0) - dest[x] = m_palette[0][pix0 >> 4]; + dest[x] = pens[0][pix0 >> 4]; else - dest[x] = m_palette[1][pix2 >> 4]; + dest[x] = pens[1][pix2 >> 4]; if ((pix0 & 0x0f) != 0) - dest[x + 1] = m_palette[0][pix0 & 0x0f]; + dest[x + 1] = pens[0][pix0 & 0x0f]; else - dest[x + 1] = m_palette[1][pix2 & 0x0f]; + dest[x + 1] = pens[1][pix2 & 0x0f]; } } return 0; @@ -660,10 +661,10 @@ u32 itech8_state::screen_update_2page(screen_device &screen, bitmap_rgb32 &bitma { pen_t const *const pens = m_tlc34076->pens(); - /* first get the current display state */ + // first get the current display state m_tms34061->get_display_state(); - /* if we're blanked, just fill with black */ + // if we're blanked, just fill with black if (m_tms34061->blanked()) { bitmap.fill(rgb_t::black(), cliprect); @@ -689,10 +690,10 @@ u32 itech8_state::screen_update_2page_large(screen_device &screen, bitmap_rgb32 { pen_t const *const pens = m_tlc34076->pens(); - /* first get the current display state */ + // first get the current display state m_tms34061->get_display_state(); - /* if we're blanked, just fill with black */ + // if we're blanked, just fill with black if (m_tms34061->blanked()) { bitmap.fill(rgb_t::black(), cliprect); From 31dee56a86d0ff48a6b57dc3193d2c5ba2283d84 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 14 Apr 2024 01:05:08 +0900 Subject: [PATCH 079/109] kaneko/sandscrp.cpp: Suppress side effects for debugger reads of sound latches. (#12240) Also give sprite ROM region a more meaningful name. --- src/mame/kaneko/sandscrp.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/mame/kaneko/sandscrp.cpp b/src/mame/kaneko/sandscrp.cpp index 7518cb0ec79bd..06bd24a7f915e 100644 --- a/src/mame/kaneko/sandscrp.cpp +++ b/src/mame/kaneko/sandscrp.cpp @@ -258,7 +258,8 @@ void sandscrp_state::latchstatus_68k_w(u8 data) template u8 sandscrp_state::soundlatch_r() { - m_latch_full[Latch] = false; + if (!machine().side_effects_disabled()) + m_latch_full[Latch] = false; return m_soundlatch[Latch]->read(); } @@ -421,7 +422,7 @@ INPUT_PORTS_END static GFXDECODE_START( gfx_sandscrp_spr ) - GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_row_2x2_group_packed_msb, 0x000, 0x10 ) // [0] Sprites + GFXDECODE_ENTRY( "sprites", 0, gfx_8x8x4_row_2x2_group_packed_msb, 0x000, 0x10 ) // [0] Sprites GFXDECODE_END @@ -497,7 +498,7 @@ ROM_START( sandscrp ) /* Z03VA-003 PCB */ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 Code */ ROM_LOAD( "8.ic51", 0x00000, 0x20000, CRC(6f3e9db1) SHA1(06a04fa17f44319986913bff70433510c89e38f1) ) - ROM_REGION( 0x100000, "gfx1", 0 ) /* Sprites */ + ROM_REGION( 0x100000, "sprites", 0 ) ROM_LOAD( "5.ic16", 0x000000, 0x080000, CRC(9bb675f6) SHA1(c3f6768cfd99a0e19ca2224fff9aa4e27ec0da24) ) ROM_LOAD( "6.ic17", 0x080000, 0x080000, CRC(7df2f219) SHA1(e2a59e201bfededa92d6c86f8dc1b212527ef66f) ) @@ -517,7 +518,7 @@ ROM_START( sandscrpa ) /* Z03VA-003 PCB, earlier program version */ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 Code */ ROM_LOAD( "8.ic51", 0x00000, 0x20000, CRC(6f3e9db1) SHA1(06a04fa17f44319986913bff70433510c89e38f1) ) - ROM_REGION( 0x100000, "gfx1", 0 ) /* Sprites */ + ROM_REGION( 0x100000, "sprites", 0 ) ROM_LOAD( "5.ic16", 0x000000, 0x080000, CRC(9bb675f6) SHA1(c3f6768cfd99a0e19ca2224fff9aa4e27ec0da24) ) ROM_LOAD( "6.ic17", 0x080000, 0x080000, CRC(7df2f219) SHA1(e2a59e201bfededa92d6c86f8dc1b212527ef66f) ) @@ -539,7 +540,7 @@ ROM_START( sandscrpb ) /* Different rev PCB */ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 Code */ ROM_LOAD( "8.ic51", 0x00000, 0x20000, CRC(6f3e9db1) SHA1(06a04fa17f44319986913bff70433510c89e38f1) ) - ROM_REGION( 0x100000, "gfx1", 0 ) /* Sprites */ + ROM_REGION( 0x100000, "sprites", 0 ) ROM_LOAD( "ss502.ic16", 0x000000, 0x100000, CRC(d8012ebb) SHA1(975bbb3b57a09e41d2257d4fa3a64097144de554) ) ROM_REGION( 0x100000, "view2", 0 ) /* Layers */ From 6fa5b13a4917c63a8e7b18b311413d301e0ed196 Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Sat, 13 Apr 2024 17:30:30 +0100 Subject: [PATCH 080/109] msx: Implemented a little more MSX2+ functionality. (#12239) * Moved MSX2+ machines to msx/msx2p.cpp. * msx/msx.cpp: Add support Kanji level 2 I/O ports. * Added support for MSX2+ boot flags register. * Hooked up msx2p_cart and msxr_cart software lists. * bus/msx/slot/music.cpp: Use an object finder to get YM2413. --- src/devices/bus/msx/slot/music.cpp | 15 +- src/devices/bus/msx/slot/music.h | 10 +- src/mame/mame.lst | 32 +- src/mame/msx/msx.cpp | 231 ++++++--- src/mame/msx/msx.h | 54 ++- src/mame/msx/msx2.cpp | 699 +-------------------------- src/mame/msx/msx2p.cpp | 748 +++++++++++++++++++++++++++++ 7 files changed, 967 insertions(+), 822 deletions(-) create mode 100644 src/mame/msx/msx2p.cpp diff --git a/src/devices/bus/msx/slot/music.cpp b/src/devices/bus/msx/slot/music.cpp index 240ca81c4a3ed..4cf305ea390ed 100644 --- a/src/devices/bus/msx/slot/music.cpp +++ b/src/devices/bus/msx/slot/music.cpp @@ -9,8 +9,7 @@ DEFINE_DEVICE_TYPE(MSX_SLOT_MUSIC, msx_slot_music_device, "msx_slot_music", "MSX msx_slot_music_device::msx_slot_music_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : msx_slot_rom_device(mconfig, MSX_SLOT_MUSIC, tag, owner, clock) - , m_ym2413(nullptr) - , m_ym2413_tag(nullptr) + , m_ym2413(*this, finder_base::DUMMY_TAG) { } @@ -18,18 +17,6 @@ void msx_slot_music_device::device_start() { msx_slot_rom_device::device_start(); - if (m_ym2413_tag == nullptr) - { - fatalerror("msx_slot_music_device: no YM2413 tag specified\n"); - } - - m_ym2413 = owner()->subdevice(m_ym2413_tag); - - if (m_ym2413 == nullptr) - { - fatalerror("msx_slot_ym2413_device: Unable to find YM2413 with tag '%s'\n", m_ym2413_tag); - } - // Install IO read/write handlers io_space().install_write_handler(0x7c, 0x7d, emu::rw_delegate(*m_ym2413, FUNC(ym2413_device::write))); } diff --git a/src/devices/bus/msx/slot/music.h b/src/devices/bus/msx/slot/music.h index 4d7662b3b82e1..41c34fdc313b0 100644 --- a/src/devices/bus/msx/slot/music.h +++ b/src/devices/bus/msx/slot/music.h @@ -7,8 +7,11 @@ #include "rom.h" #include "slot.h" + #include "sound/ymopl.h" +#include + DECLARE_DEVICE_TYPE(MSX_SLOT_MUSIC, msx_slot_music_device) @@ -18,15 +21,14 @@ class msx_slot_music_device : public msx_slot_rom_device public: msx_slot_music_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - // configuration helpers - void set_ym2413_tag(const char *tag) { m_ym2413_tag = tag; } + // configuration + template void set_ym2413_tag(T &&tag) { m_ym2413.set_tag(std::forward(tag)); } protected: virtual void device_start() override; private: - ym2413_device *m_ym2413; - const char *m_ym2413_tag; + required_device m_ym2413; }; diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 577afddba124a..562a77f335a3c 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -32494,10 +32494,6 @@ cpg120 // cx7128 // 1986 MSX2 cx7m128 // 1986 MSX2 expert20 // 1986 MSX2 Korea -expert3i // -expert3t // -expertac // -expertdx // fpc900 // fs4500 // 1986 MSX2 Japan fs4600f // 1986 MSX2 Japan @@ -32509,19 +32505,11 @@ fsa1 // 1986 MSX2 Japan fsa1a // 1986 MSX2 Japan fsa1f // 1987 MSX2 Japan fsa1fm // 1988 MSX2 Japan -fsa1fx // 1988 MSX2+ Japan -fsa1gt // fsa1mk2 // 1987 MSX2 Japan -fsa1st // -fsa1wsx // 1989 MSX2+ Japan -fsa1wx // 1988 MSX2+ Japan -fsa1wxa // 1988 MSX2+ Japan fstm1 // hbf1 // 1986 MSX2 Japan hbf1ii // 1987 MSX2 Japan hbf1xd // 1987 MSX2 Japan -hbf1xdj // 1988 MSX2+ Japan -hbf1xv // 1989 MSX2+ Japan hbf5 // hbf500 // 1986 MSX2 Japan hbf500_2 // @@ -32570,10 +32558,7 @@ nms8280f // nms8280g // 1986 MSX2 phc23 // 1986 MSX2 Japan phc23jb // 1987 MSX2 Japan -phc35j // 1989 MSX2+ Japan phc55fd2 // -phc70fd // 1988 MSX2+ Japan -phc70fd2 // 1988 MSX2+ Japan phc77 // tpc310 // 1986 MSX2 tpp311 // @@ -32596,6 +32581,23 @@ y805128r2e // y805256 // yis604 // +@source:msx/msx2p.cpp +expert3i // +expert3t // +expertac // +expertdx // +fsa1fx // 1988 MSX2+ Japan +fsa1gt // +fsa1st // +fsa1wsx // 1989 MSX2+ Japan +fsa1wx // 1988 MSX2+ Japan +fsa1wxa // 1988 MSX2+ Japan +hbf1xdj // 1988 MSX2+ Japan +hbf1xv // 1989 MSX2+ Japan +phc35j // 1989 MSX2+ Japan +phc70fd // 1988 MSX2+ Japan +phc70fd2 // 1988 MSX2+ Japan + @source:msx/pengadvb.cpp pengadvb // (c) 1988 Screen pengadvb2 // (c) 1988 Comet diff --git a/src/mame/msx/msx.cpp b/src/mame/msx/msx.cpp index a37199a7141e3..028794202e180 100644 --- a/src/mame/msx/msx.cpp +++ b/src/mame/msx/msx.cpp @@ -277,8 +277,7 @@ void msx_state::msx_base_io_map(address_map &map) map(0xa8, 0xab).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)); // // Sanyo optical pen interface (not emulated) // map(0xb8, 0xbb).noprw(); - map(0xd8, 0xd9).w(FUNC(msx_state::kanji_w)); - map(0xd9, 0xd9).r(FUNC(msx_state::kanji_r)); + // 0xd8 - 0xdb : Kanji rom interface. I/O handlers will be installed in a kanji rom is present. // 0xfc - 0xff : Memory mapper I/O ports. I/O handlers will be installed if a memory mapper is present in a system } @@ -312,6 +311,17 @@ void msx_state::machine_start() m_caps_led.resolve(); m_code_led.resolve(); m_port_c_old = 0xff; + + if (m_region_kanji.found() && m_region_kanji.length() >= 0x20000) + { + get_io_space().install_write_handler(0xd8, 0xd9, emu::rw_delegate(*this, FUNC(msx_state::kanji_w))); + get_io_space().install_read_handler(0xd9, 0xd9, emu::rw_delegate(*this, FUNC(msx_state::kanji_r))); + if (m_region_kanji.length() >= 0x40000) + { + get_io_space().install_write_handler(0xda, 0xdb, emu::rw_delegate(*this, FUNC(msx_state::kanji2_w))); + get_io_space().install_read_handler(0xd9, 0xd9, emu::rw_delegate(*this, FUNC(msx_state::kanji2_r))); + } + } } void msx_state::driver_start() @@ -430,17 +440,12 @@ u8 msx_state::expanded_slot_r() u8 msx_state::kanji_r(offs_t offset) { - u8 result = 0xff; + const u32 latch = m_kanji_fsa1fx ? bitswap<17>(m_kanji_latch, 4, 3, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 2, 1, 0) : m_kanji_latch; + const u8 result = m_region_kanji[latch]; - if (m_region_kanji) + if (!machine().side_effects_disabled()) { - u32 latch = m_kanji_fsa1fx ? bitswap<17>(m_kanji_latch, 4, 3, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 2, 1, 0) : m_kanji_latch; - result = m_region_kanji->as_u8(latch); - - if (!machine().side_effects_disabled()) - { - m_kanji_latch = (m_kanji_latch & ~0x1f) | ((m_kanji_latch + 1) & 0x1f); - } + m_kanji_latch = (m_kanji_latch & ~0x1f) | ((m_kanji_latch + 1) & 0x1f); } return result; } @@ -453,6 +458,27 @@ void msx_state::kanji_w(offs_t offset, u8 data) m_kanji_latch = (m_kanji_latch & 0x1f800) | ((data & 0x3f) << 5); } +u8 msx_state::kanji2_r(offs_t offset) +{ + // TODO: Are there one or two latches in a system? + const u32 latch = m_kanji_fsa1fx ? bitswap<17>(m_kanji_latch, 4, 3, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 2, 1, 0) : m_kanji_latch; + const u8 result = m_region_kanji[0x20000 | latch]; + + if (!machine().side_effects_disabled()) + { + m_kanji_latch = (m_kanji_latch & ~0x1f) | ((m_kanji_latch + 1) & 0x1f); + } + return result; +} + +void msx_state::kanji2_w(offs_t offset, u8 data) +{ + if (offset) + m_kanji_latch = (m_kanji_latch & 0x007e0) | ((data & 0x3f) << 11); + else + m_kanji_latch = (m_kanji_latch & 0x1f800) | ((data & 0x3f) << 5); +} + void msx_state::msx_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) { // basic machine hardware @@ -480,10 +506,10 @@ void msx_state::msx_base(ay8910_type ay8910_type, machine_config &config, const if (ay8910_type == SND_YM2149) YM2149(config, m_ay8910, m_main_xtal / m_cpu_xtal_divider / 2); m_ay8910->set_flags(AY8910_SINGLE_OUTPUT); - m_ay8910->port_a_read_callback().set(FUNC(msx2_base_state::psg_port_a_r)); - m_ay8910->port_b_read_callback().set(FUNC(msx2_base_state::psg_port_b_r)); - m_ay8910->port_a_write_callback().set(FUNC(msx2_base_state::psg_port_a_w)); - m_ay8910->port_b_write_callback().set(FUNC(msx2_base_state::psg_port_b_w)); + m_ay8910->port_a_read_callback().set(FUNC(msx_state::psg_port_a_r)); + m_ay8910->port_b_read_callback().set(FUNC(msx_state::psg_port_b_r)); + m_ay8910->port_a_write_callback().set(FUNC(msx_state::psg_port_a_w)); + m_ay8910->port_b_write_callback().set(FUNC(msx_state::psg_port_b_w)); m_ay8910->add_route(ALL_OUTPUTS, m_speaker, 1.0); MSX_GENERAL_PURPOSE_PORT(config, m_gen_port1, msx_general_purpose_port_devices, "joystick"); @@ -556,6 +582,30 @@ void msx_state::msx1(vdp_type vdp_type, ay8910_type ay8910_type, machine_config msx1_add_softlists(config); } +address_space& msx_state::get_io_space() +{ + return m_maincpu->space(AS_IO); +} + +void msx_state::setup_slot_spaces(msx_internal_slot_interface &device) +{ + device.set_memory_space(m_maincpu, AS_PROGRAM); + device.set_io_space(m_maincpu, AS_IO); + device.set_maincpu(m_maincpu); +} + + + +msx2_base_state::msx2_base_state(const machine_config &mconfig, device_type type, const char *tag, XTAL main_xtal, int cpu_xtal_divider) + : msx_state(mconfig, type, tag, main_xtal, cpu_xtal_divider) + , m_v9938(*this, "v9938") + , m_v9958(*this, "v9958") + , m_ym2413(*this, "ym2413") + , m_rtc(*this, "rtc") + , m_rtc_latch(0) +{ +} + void msx2_base_state::msx2_base_io_map(address_map &map) { msx_base_io_map(map); @@ -571,7 +621,7 @@ void msx2_base_state::msx2_io_map(address_map &map) map(0x98, 0x9b).rw(m_v9938, FUNC(v9938_device::read), FUNC(v9938_device::write)); } -void msx2_base_state::msx2plus_io_map(address_map &map) +void msx2_base_state::msx2_v9958_io_map(address_map &map) { msx2_base_io_map(map); // TODO: S-1985 mirrors 9c-9f @@ -627,17 +677,9 @@ void msx2_base_state::switched_w(offs_t offset, u8 data) } } -// Some MSX2+ can switch the z80 clock between 3.5 and 5.3 MHz -void msx2_base_state::turbo_w(int state) -{ - // 0 - 5.369317 MHz - // 1 - 3.579545 MHz - m_maincpu->set_unscaled_clock(m_main_xtal / (state ? 6 : 4)); -} - void msx2_base_state::msx_ym2413(machine_config &config) { - YM2413(config, "ym2413", m_main_xtal / m_cpu_xtal_divider).add_route(ALL_OUTPUTS, m_speaker, 0.8); + YM2413(config, m_ym2413, m_main_xtal / m_cpu_xtal_divider).add_route(ALL_OUTPUTS, m_speaker, 0.8); } void msx2_base_state::msx2_64kb_vram(machine_config &config) @@ -666,51 +708,6 @@ void msx2_base_state::msx2_add_softlists(machine_config &config) } } -void msx2_base_state::msx2plus_add_softlists(machine_config &config) -{ - if (m_hw_def.has_cassette()) - { - SOFTWARE_LIST(config, "cass_list").set_original("msx2_cass"); - SOFTWARE_LIST(config, "msx1_cass_list").set_compatible("msx1_cass"); - } - - if (m_hw_def.has_cartslot()) - { - SOFTWARE_LIST(config, "cart_list").set_original("msx2_cart"); - SOFTWARE_LIST(config, "msx1_cart_list").set_compatible("msx1_cart"); - } - - if (m_hw_def.has_fdc()) - { - SOFTWARE_LIST(config, "flop_list").set_original("msx2p_flop"); - SOFTWARE_LIST(config, "msx2_flop_list").set_compatible("msx2_flop"); - SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop"); - } -} - -void msx2_base_state::turbor_add_softlists(machine_config &config) -{ - if (m_hw_def.has_cassette()) - { - SOFTWARE_LIST(config, "cass_list").set_original("msx2_cass"); - SOFTWARE_LIST(config, "msx1_cass_list").set_compatible("msx1_cass"); - } - - if (m_hw_def.has_cartslot()) - { - SOFTWARE_LIST(config, "cart_list").set_original("msx2_cart"); - SOFTWARE_LIST(config, "msx1_cart_list").set_compatible("msx1_cart"); - } - - if (m_hw_def.has_fdc()) - { - SOFTWARE_LIST(config, "flop_list").set_original("msxr_flop"); - SOFTWARE_LIST(config, "msx2p_flop_list").set_compatible("msx2p_flop"); - SOFTWARE_LIST(config, "msx2_flop_list").set_compatible("msx2_flop"); - SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop"); - } -} - void msx2_base_state::msx2_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) { msx_base(ay8910_type, config, layout); @@ -741,11 +738,11 @@ void msx2_base_state::msx2_pal(ay8910_type ay8910_type, machine_config &config, m_v9938->set_screen_pal(m_screen); } -void msx2_base_state::msx2plus_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) +void msx2_base_state::msx2_v9958_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) { msx2_base(ay8910_type, config, layout); - m_maincpu->set_addrmap(AS_IO, &msx2_base_state::msx2plus_io_map); + m_maincpu->set_addrmap(AS_IO, &msx2_base_state::msx2_v9958_io_map); // video hardware V9958(config, m_v9958, m_main_xtal); @@ -754,7 +751,44 @@ void msx2_base_state::msx2plus_base(ay8910_type ay8910_type, machine_config &con m_v9958->int_cb().set(m_mainirq, FUNC(input_merger_device::in_w<0>)); } -void msx2_base_state::msx2plus(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) + + +msx2p_base_state::msx2p_base_state(const machine_config &mconfig, device_type type, const char *tag, XTAL main_xtal, int cpu_xtal_divider) + : msx2_base_state(mconfig, type, tag, main_xtal, cpu_xtal_divider) + , m_cold_boot_flags(0) + , m_boot_flags(0) +{ +} + +void msx2p_base_state::machine_start() +{ + msx2_base_state::machine_start(); + + m_boot_flags = m_cold_boot_flags; + save_item(NAME(m_boot_flags)); +} + +void msx2p_base_state::msx2plus_io_map(address_map &map) +{ + msx2_v9958_io_map(map); + // f3 - vdp display mode? + map(0xf4, 0xf4).lrw8(NAME([this]() { return m_boot_flags;}), NAME([this](u8 data) { m_boot_flags = data; })); +} + +void msx2p_base_state::msx2plus_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) +{ + msx2_v9958_base(ay8910_type, config, layout); + + m_maincpu->set_addrmap(AS_IO, &msx2p_base_state::msx2plus_io_map); +} + +void msx2p_base_state::msx2plus_pal_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) +{ + msx2plus_base(ay8910_type, config, layout); + m_v9958->set_screen_pal(m_screen); +} + +void msx2p_base_state::msx2plus(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) { msx2plus_base(ay8910_type, config, layout); @@ -762,20 +796,63 @@ void msx2_base_state::msx2plus(ay8910_type ay8910_type, machine_config &config, msx2plus_add_softlists(config); } -void msx2_base_state::msx2plus_pal(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) +void msx2p_base_state::msx2plus_pal(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) { msx2plus(ay8910_type, config, layout); m_v9958->set_screen_pal(m_screen); } -void msx2_base_state::turbor(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) +void msx2p_base_state::msx2plus_add_softlists(machine_config &config) +{ + if (m_hw_def.has_cassette()) + { + SOFTWARE_LIST(config, "cass_list").set_original("msx2_cass"); + SOFTWARE_LIST(config, "msx1_cass_list").set_compatible("msx1_cass"); + } + + if (m_hw_def.has_cartslot()) + { + SOFTWARE_LIST(config, "cart_list").set_original("msx2p_cart"); + SOFTWARE_LIST(config, "msx2_cart_list").set_compatible("msx2_cart"); + SOFTWARE_LIST(config, "msx1_cart_list").set_compatible("msx1_cart"); + } + + if (m_hw_def.has_fdc()) + { + SOFTWARE_LIST(config, "flop_list").set_original("msx2p_flop"); + SOFTWARE_LIST(config, "msx2_flop_list").set_compatible("msx2_flop"); + SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop"); + } +} + +void msx2p_base_state::turbor(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout) { msx2plus_base(ay8910_type, config, layout); R800(config.replace(), m_maincpu, 28.636363_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &msx2_base_state::memory_map); - m_maincpu->set_addrmap(AS_IO, &msx2_base_state::msx2plus_io_map); + m_maincpu->set_addrmap(AS_PROGRAM, &msx2p_base_state::memory_map); + m_maincpu->set_addrmap(AS_IO, &msx2p_base_state::msx2plus_io_map); // Software lists turbor_add_softlists(config); } + +void msx2p_base_state::turbor_add_softlists(machine_config &config) +{ + if (m_hw_def.has_cartslot()) + { + SOFTWARE_LIST(config, "cart_list").set_original("msxr_cart"); + SOFTWARE_LIST(config, "msx2p_cart_list").set_compatible("msx2p_cart"); + SOFTWARE_LIST(config, "msx2_cart_list").set_compatible("msx2_cart"); + SOFTWARE_LIST(config, "msx1_cart_list").set_compatible("msx1_cart"); + } + + if (m_hw_def.has_fdc()) + { + SOFTWARE_LIST(config, "flop_list").set_original("msxr_flop"); + SOFTWARE_LIST(config, "msx2p_flop_list").set_compatible("msx2p_flop"); + SOFTWARE_LIST(config, "msx2_flop_list").set_compatible("msx2_flop"); + SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop"); + } +} + diff --git a/src/mame/msx/msx.h b/src/mame/msx/msx.h index 19f1dc8fd1c8f..24feb1569bafe 100644 --- a/src/mame/msx/msx.h +++ b/src/mame/msx/msx.h @@ -163,6 +163,8 @@ class msx_state : public driver_device u8 expanded_slot_r(); u8 kanji_r(offs_t offset); void kanji_w(offs_t offset, u8 data); + u8 kanji2_r(offs_t offset); + void kanji2_w(offs_t offset, u8 data); void ppi_port_a_w(u8 data); void ppi_port_c_w(u8 data); u8 ppi_port_b_r(); @@ -190,7 +192,7 @@ class msx_state : public driver_device required_device m_speaker; required_device m_mainirq; required_device m_screen; - optional_memory_region m_region_kanji; + optional_region_ptr m_region_kanji; required_device m_gen_port1; required_device m_gen_port2; required_ioport_array<11> m_io_key; @@ -246,15 +248,16 @@ class msx_state : public driver_device const XTAL m_main_xtal; const int m_cpu_xtal_divider; + virtual void setup_slot_spaces(msx_internal_slot_interface &device); + virtual address_space &get_io_space(); + private: // configuration helpers template auto &add_base_slot(machine_config &config, T &&type, U &&tag, u8 prim, bool expanded, u8 sec, u8 page, u8 numpages, u32 clock = 0) { auto &device(std::forward(type)(config, std::forward(tag), clock)); - device.set_memory_space(m_maincpu, AS_PROGRAM); - device.set_io_space(m_maincpu, AS_IO); - device.set_maincpu(m_maincpu); + setup_slot_spaces(device); m_internal_slots.push_back({prim, expanded, sec, page, numpages, &device}); return device; } @@ -328,27 +331,15 @@ class msx_state : public driver_device class msx2_base_state : public msx_state { protected: - msx2_base_state(const machine_config &mconfig, device_type type, const char *tag, XTAL main_xtal, int cpu_xtal_divider) - : msx_state(mconfig, type, tag, main_xtal, cpu_xtal_divider) - , m_v9938(*this, "v9938") - , m_v9958(*this, "v9958") - , m_rtc(*this, "rtc") - , m_rtc_latch(0) - { - } + msx2_base_state(const machine_config &mconfig, device_type type, const char *tag, XTAL main_xtal, int cpu_xtal_divider); virtual void machine_start() override; void msx2_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); void msx2(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); void msx2_pal(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); - void msx2plus_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); - void msx2plus(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); - void msx2plus_pal(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); - void turbor(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); + void msx2_v9958_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); void msx2_add_softlists(machine_config &config); - void msx2plus_add_softlists(machine_config &config); - void turbor_add_softlists(machine_config &config); void msx_ym2413(machine_config &config); void msx2_64kb_vram(machine_config &config); u8 rtc_reg_r(); @@ -356,19 +347,42 @@ class msx2_base_state : public msx_state void rtc_latch_w(u8 data); u8 switched_r(offs_t offset); void switched_w(offs_t offset, u8 data); - void turbo_w(int state); void msx2_base_io_map(address_map &map); void msx2_io_map(address_map &map); - void msx2plus_io_map(address_map &map); + void msx2_v9958_io_map(address_map &map); std::vector m_switched; optional_device m_v9938; optional_device m_v9958; + optional_device m_ym2413; required_device m_rtc; // rtc u8 m_rtc_latch = 0; }; + +class msx2p_base_state : public msx2_base_state +{ +protected: + msx2p_base_state(const machine_config &mconfig, device_type type, const char *tag, XTAL main_xtal, int cpu_xtal_divider); + + void set_cold_boot_flags(u8 cold_boot_flags) { m_cold_boot_flags = cold_boot_flags; } + + virtual void machine_start() override; + + void msx2plus_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); + void msx2plus_pal_base(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); + void msx2plus(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); + void msx2plus_pal(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); + void msx2plus_io_map(address_map &map); + void msx2plus_add_softlists(machine_config &config); + void turbor_add_softlists(machine_config &config); + void turbor(ay8910_type ay8910_type, machine_config &config, const internal_layout &layout); + + u8 m_cold_boot_flags; + u8 m_boot_flags; +}; + #endif // MAME_MSX_MSX_H diff --git a/src/mame/msx/msx2.cpp b/src/mame/msx/msx2.cpp index 1ec790c88c781..5958313f6d7e6 100644 --- a/src/mame/msx/msx2.cpp +++ b/src/mame/msx/msx2.cpp @@ -25,7 +25,6 @@ #include "msx_ar.lh" #include "msx_ar_1fdd.lh" #include "msx_ar_2fdd.lh" -#include "msx_en.lh" #include "msx_jp.lh" #include "msx_jp_1fdd.lh" #include "msx_jp_2fdd.lh" @@ -101,10 +100,6 @@ class msx2_state : public msx2_base_state void cx7128(machine_config &config); void cx7m128(machine_config &config); void expert20(machine_config &config); - void expert3i(machine_config &config); - void expert3t(machine_config &config); - void expertac(machine_config &config); - void expertdx(machine_config &config); void fpc900(machine_config &config); void kmc5000(machine_config &config); void mbh70(machine_config &config); @@ -128,19 +123,11 @@ class msx2_state : public msx2_base_state void fsa1a(machine_config &config); void fsa1f(machine_config &config); void fsa1fm(machine_config &config); - void fsa1fx(machine_config &config); - void fsa1gt(machine_config &config); - void fsa1st(machine_config &config); void fsa1mk2(machine_config &config); - void fsa1wsx(machine_config &config); - void fsa1wx(machine_config &config); - void fsa1wxa(machine_config &config); void fstm1(machine_config &config); void hbf1(machine_config &config); void hbf1ii(machine_config &config); void hbf1xd(machine_config &config); - void hbf1xdj(machine_config &config); - void hbf1xv(machine_config &config); void hbf5(machine_config &config); void hbf500(machine_config &config); void hbf500_2(machine_config &config); @@ -175,10 +162,7 @@ class msx2_state : public msx2_base_state void nms8280g(machine_config &config); void phc23(machine_config &config); void phc23jb(machine_config &config); - void phc35j(machine_config &config); void phc55fd2(machine_config &config); - void phc70fd(machine_config &config); - void phc70fd2(machine_config &config); void phc77(machine_config &config); void tpc310(machine_config &config); void tpp311(machine_config &config); @@ -475,7 +459,7 @@ ROM_END void msx2_state::cpg120(machine_config &config) { - // By pressing the turbo button the CPU can switched between 3.579545 and 5.369317 MHz + // By pressing the turbo button the CPU can be switched between 3.579545 and 5.369317 MHz // YM2149 (in S1985) // FDC: None, 0 drives // 2 Cartridge slots? @@ -490,14 +474,15 @@ void msx2_state::cpg120(machine_config &config) add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM add_internal_slot(config, MSX_SLOT_ROM, "saubrom", 0, 3, 0, 2, "subrom"); add_cartridge_slot<1>(config, 1); - add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 2, 1, 1, "music").set_ym2413_tag("ym2413"); + add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 2, 1, 1, "music").set_ym2413_tag(m_ym2413); add_cartridge_slot<2>(config, 3); MSX_S1985(config, "s1985", 0); msx_ym2413(config); m_hw_def.has_printer_port(false); - msx2plus(SND_AY8910, config, layout_msx_nocode_nocaps); + msx2_v9958_base(SND_AY8910, config, layout_msx_nocode_nocaps); + msx2_add_softlists(config); } /* MSX2 - Daisen Sangyo MX-2021 */ @@ -2162,7 +2147,9 @@ void msx2_state::ax370(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "painter", 3, 1, 0, 4, "painter"); add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 3, 0, 4).set_total_size(0x20000).set_unused_bits(0xf8); // 128KB Mapper RAM - msx2plus_pal(SND_AY8910, config, layout_msx_ar_1fdd); + msx2_v9958_base(SND_AY8910, config, layout_msx_ar_1fdd); + m_v9958->set_screen_pal(m_screen); + msx2_add_softlists(config); } /* MSX2 - Sakhr AX-500 */ @@ -3985,658 +3972,6 @@ ROM_START(y805128r2e) ROM_LOAD("yis805128r2epaint.rom", 0x00000, 0x10000, CRC(1bda68a3) SHA1(7fd2a28c4fdaeb140f3c8c8fb90271b1472c97b9)) ROM_END -/******************************** MSX 2+ **********************************/ - -/* MSX2+ - Ciel Expert 3 IDE */ - -ROM_START(expert3i) - ROM_REGION(0x8000, "mainrom", 0) - ROM_LOAD("exp30bios.rom", 0x0000, 0x8000, CRC(a10bb1ce) SHA1(5029cf47031b22bd5d1f68ebfd3be6d6da56dfe9)) - - ROM_REGION(0x4000, "subrom", 0) - ROM_LOAD("exp30ext.rom", 0x0000, 0x4000, CRC(6bcf4100) SHA1(cc1744c6c513d6409a142b4fb42fbe70a95d9b7f)) - - ROM_REGION(0x4000, "diskrom", 0) - ROM_LOAD("cieldisk.rom", 0x0000, 0x4000, CRC(bb550b09) SHA1(0274dd9b5096065a7f4ed019101124c9bd1d56b8)) - - ROM_REGION(0x4000, "music", 0) - ROM_LOAD("exp30mus.rom", 0x0000, 0x4000, CRC(9881b3fd) SHA1(befebc916bfdb5e8057040f0ae82b5517a7750db)) - - ROM_REGION(0x10000, "ide", 0) - ROM_LOAD("ide240a.rom", 0x00000, 0x10000, CRC(7adf857f) SHA1(8a919dbeed92db8c06a611279efaed8552810239)) -ROM_END - -void msx2_state::expert3i(machine_config &config) -{ - // AY8910/YM2149? - // FDC: wd2793, 1 or 2? drives - // 2 Cartridge slots? - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); - add_cartridge_slot<1>(config, 1); - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 1, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "music", 1, 1, 1, 1, "music").set_ym2413_tag("ym2413"); - add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793, "disk", 1, 2, 1, 2, "diskrom"); - add_internal_slot(config, MSX_SLOT_ROM, "ide", 1, 3, 0, 4, "ide"); /* IDE hardware needs to be emulated */ - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 4).set_total_size(0x40000); // 256KB?? Mapper RAM - add_cartridge_slot<2>(config, 3); - - msx_ym2413(config); - - msx2plus(SND_AY8910, config, layout_msx_nocode_1fdd); -} - -/* MSX2+ - Ciel Expert 3 Turbo -This one is a full motherboard by CIEL (not an upgrade kit), created to replace the motherboard of a Gradiente Expert (which means that only the case, the analog boards and the keyboard remains Gradiente). This new motherboard has the following built-in features: - -1) MSX2+ -2) Support either 3.57MHz or 7.14MHz natively, switched either by software (*1) or by a hardware-switch on the front panel. Turbo-led included. -3) Up to 4MB of Memory Mapper (1MB is the most common configuration) -4) MSX-Music -5) 4 expansion slots (two external on the front panel, two internal) -6) Stereo sound (YM2413 channels 0-6 on right, PSG+YM2413 channels 7-9 on left) -7) Support the V9938 instead of the V9958 by switching some jumpers -8) The main-ram can be placed on slot 2 or slot 3, using jumpers (slot 2 is the default) - - -*1: A routine hidden inside the BIOS frame-0 is used to switch the turbo. - */ - -/* Uses a Z84C0010 - CMOS processor working at 7 MHz */ -ROM_START(expert3t) - ROM_REGION(0x8000, "mainrom", 0) - ROM_LOAD("exp30bios.rom", 0x0000, 0x8000, CRC(a10bb1ce) SHA1(5029cf47031b22bd5d1f68ebfd3be6d6da56dfe9)) - - ROM_REGION(0x4000, "subrom", 0) - ROM_LOAD("exp30ext.rom", 0x0000, 0x4000, CRC(6bcf4100) SHA1(cc1744c6c513d6409a142b4fb42fbe70a95d9b7f)) - - ROM_REGION(0x4000, "diskrom", 0) - ROM_LOAD("cieldisk.rom", 0x0000, 0x4000, CRC(bb550b09) SHA1(0274dd9b5096065a7f4ed019101124c9bd1d56b8)) - - ROM_REGION(0x4000, "music", 0) - ROM_LOAD("exp30mus.rom", 0x0000, 0x4000, CRC(9881b3fd) SHA1(befebc916bfdb5e8057040f0ae82b5517a7750db)) - - ROM_REGION(0x4000, "turbo", 0) - ROM_LOAD("turbo.rom", 0x0000, 0x4000, CRC(ab528416) SHA1(d468604269ae7664ac739ea9f922a05e14ffa3d1)) -ROM_END - -void msx2_state::expert3t(machine_config &config) -{ - // AY8910 - // FDC: wd2793?, 1 or 2? drives - // 4 Cartridge/Expansion slots? - // FM/YM2413 built-in - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); - add_cartridge_slot<1>(config, 1, 0); - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 1, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "music", 1, 1, 1, 1, "music").set_ym2413_tag("ym2413"); - add_internal_slot(config, MSX_SLOT_ROM, "turbo", 1, 2, 1, 1, "turbo"); /* Turbo hardware needs to be emulated */ - add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793, "disk", 1, 3, 1, 2, "diskrom"); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 4).set_total_size(0x40000); // 256KB Mapper RAM - add_cartridge_slot<2>(config, 3); - - msx_ym2413(config); - - msx2plus(SND_AY8910, config, layout_msx_nocode_1fdd); -} - -/* MSX2+ - Gradiente Expert AC88+ */ - -ROM_START(expertac) - ROM_REGION(0x8000, "mainrom", 0) - ROM_LOAD("ac88bios.rom", 0x0000, 0x8000, CRC(9ce0da44) SHA1(1fc2306911ab6e1ebdf7cb8c3c34a7f116414e88)) - - ROM_REGION(0x4000, "subrom", 0) - ROM_LOAD("ac88ext.rom", 0x0000, 0x4000, CRC(c74c005c) SHA1(d5528825c7eea2cfeadd64db1dbdbe1344478fc6)) - - ROM_REGION(0x4000, "diskrom", 0) - ROM_LOAD("panadisk.rom", 0x0000, 0x4000, CRC(17fa392b) SHA1(7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6)) - - ROM_REGION(0x4000, "asm", 0) - ROM_LOAD("ac88asm.rom", 0x0000, 0x4000, CRC(a8a955ae) SHA1(91e522473a8470511584df3ee5b325ea5e2b81ef)) - - ROM_REGION(0x4000, "xbasic", 0) - ROM_LOAD("xbasic2.rom", 0x0000, 0x4000, CRC(2825b1a0) SHA1(47370bec7ca1f0615a54eda548b07fbc0c7ef398)) -ROM_END - -void msx2_state::expertac(machine_config &config) -{ - // AY8910/YM2149? - // FDC: wd2793?, 1 or 2? drives - // 2 Cartridge slots? - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM?? - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_ROM, "asm", 3, 1, 1, 1, "asm"); - add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793, "disk", 3, 2, 1, 2, "diskrom"); - add_internal_slot(config, MSX_SLOT_ROM, "xbasic", 3, 3, 1, 1, "xbasic"); - - msx2plus(SND_AY8910, config, layout_msx_nocode_1fdd); -} - -/* MSX2+ - Gradiente Expert DDX+ */ - -ROM_START(expertdx) - ROM_REGION(0x8000, "mainrom", 0) - ROM_LOAD("ddxbios.rom", 0x0000, 0x8000, CRC(e00af3dc) SHA1(5c463dd990582e677c8206f61035a7c54d8c67f0)) - - ROM_REGION(0x4000, "subrom", 0) - ROM_LOAD("ddxext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) - - ROM_REGION(0x4000, "diskrom", 0) - ROM_LOAD("panadisk.rom", 0x0000, 0x4000, CRC(17fa392b) SHA1(7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6)) - - ROM_REGION(0x4000, "xbasic", 0) - ROM_LOAD("xbasic2.rom", 0x0000, 0x4000, CRC(2825b1a0) SHA1(47370bec7ca1f0615a54eda548b07fbc0c7ef398)) - - ROM_REGION(0x8000, "kanjirom", 0) - ROM_LOAD("kanji.rom", 0x0000, 0x8000, CRC(b4fc574d) SHA1(dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06)) -ROM_END - -void msx2_state::expertdx(machine_config &config) -{ - // AY8910/YM2149? - // FDC: tc8566af, 1 3.5" DSDD drive? - // 2 Cartridge slots? - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); - add_cartridge_slot<1>(config, 1, 0); - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 1, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_ROM, "xbasic", 1, 2, 1, 1, "xbasic"); - add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 1, 3, 1, 2, "diskrom"); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM?? - add_cartridge_slot<2>(config, 3); - /* Kanji? */ - - msx2plus(SND_AY8910, config, layout_msx_nocode_1fdd); -} - -/* MSX2+ - Panasonic FS-A1FX */ - -ROM_START(fsa1fx) - ROM_REGION(0x40000, "maincpu", 0) - ROM_LOAD("a1fx.ic16", 0, 0x40000, CRC(c0b2d882) SHA1(623cbca109b6410df08ee7062150a6bda4b5d5d4)) - - // Kanji rom contents are the first half of the single rom -// ROM_REGION(0x20000, "kanji", 0) - ROM_REGION(0x40000, "kanji", 0) - ROM_LOAD("a1fx.ic16", 0, 0x40000, CRC(c0b2d882) SHA1(623cbca109b6410df08ee7062150a6bda4b5d5d4)) -ROM_END - -void msx2_state::fsa1fx(machine_config &config) -{ - // AY8910 (in T9769) - // FDC: tc8566af, 1 3.5" DSDD drive - // 2 Cartridge slots - // T9769(B) - // ren-sha turbo slider - // pause button - // firmware switch - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "maincpu", 0x30000); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "maincpu", 0x38000); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x28000); - add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 3, 2, 1, 2, "maincpu", 0x3c000); - add_internal_slot(config, MSX_SLOT_ROM, "firmware", 3, 3, 1, 2, "maincpu", 0x20000); - - msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0)); - matsushita.turbo_callback().set(FUNC(msx2_state::turbo_w)); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); - - m_kanji_fsa1fx = true; - msx2plus(SND_AY8910, config, layout_msx_jp_1fdd); -} - -/* MSX2+ - Panasonic FS-A1WSX */ - -ROM_START(fsa1wsx) - ROM_REGION(0x8000, "mainrom", 0) - ROM_LOAD("a1wsbios.rom", 0x0000, 0x8000, CRC(358ec547) SHA1(f4433752d3bf876bfefb363c749d4d2e08a218b6)) - - ROM_REGION(0x4000, "subrom", 0) - ROM_LOAD("a1wsext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) - - ROM_REGION(0x4000, "diskrom", 0) - ROM_LOAD("a1wsdisk.rom", 0x0000, 0x4000, CRC(17fa392b) SHA1(7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6)) - - ROM_REGION(0x8000, "kdr", 0) - ROM_LOAD("a1wskdr.rom", 0x0000, 0x8000, CRC(b4fc574d) SHA1(dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06)) - - ROM_REGION(0x4000, "msxmusic", 0) - ROM_LOAD("a1wsmusp.rom", 0x0000, 0x4000, CRC(5c32eb29) SHA1(aad42ba4289b33d8eed225d42cea930b7fc5c228)) - - ROM_REGION(0x200000, "firmware", 0) - ROM_LOAD("a1wsfirm.rom", 0x000000, 0x200000, CRC(e363595d) SHA1(3330d9b6b76e3c4ccb7cf252496ed15d08b95d3f)) - - ROM_REGION(0x40000, "kanji", 0) - ROM_LOAD("a1wskfn.rom", 0, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) -ROM_END - -void msx2_state::fsa1wsx(machine_config &config) -{ - // AY8910 (in T9769) - // FDC: tc8566af, 1 3.5" DSDD drive - // 2 Cartridge slots - // FM built-in - // T9769(C) - // ren-sha turbo slider - // firmware switch - // pause button - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 0, 2, 1, 1, "msxmusic").set_ym2413_tag("ym2413"); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "kdr"); - add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 3, 2, 1, 2, "diskrom"); - add_internal_slot(config, MSX_SLOT_PANASONIC08, "firmware", 3, 3, 0, 4, "firmware"); - - msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0)); - matsushita.turbo_callback().set(FUNC(msx2_state::turbo_w)); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); - - msx_ym2413(config); - - msx2plus(SND_AY8910, config, layout_msx_jp_1fdd); -} - -/* MSX2+ - Panasonic FS-A1WX */ - -ROM_START(fsa1wx) - ROM_REGION(0x8000, "mainrom", 0) - ROM_LOAD("a1wxbios.rom", 0x0000, 0x8000, CRC(19771608) SHA1(e90f80a61d94c617850c415e12ad70ac41e66bb7)) - - ROM_REGION(0x4000, "subrom", 0) - ROM_LOAD("a1wxext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) - - ROM_REGION(0x4000, "diskrom", 0) - ROM_LOAD("a1wxdisk.rom", 0x0000, 0x4000, CRC(905daa1b) SHA1(bb59c849898d46a23fdbd0cc04ab35088e74a18d)) - - ROM_REGION(0x8000, "kdr", 0) - ROM_LOAD("a1wxkdr.rom", 0x0000, 0x8000, CRC(a068cba9) SHA1(1ef3956f7f918873fb9b031339bba45d1e5e5878)) - - ROM_REGION(0x4000, "msxmusic", 0) - ROM_LOAD("a1wxmusp.rom", 0x0000, 0x4000, CRC(456e494e) SHA1(6354ccc5c100b1c558c9395fa8c00784d2e9b0a3)) - - ROM_REGION(0x200000, "firmware", 0) - ROM_LOAD("a1wxfirm.rom", 0x000000, 0x200000, CRC(283f3250) SHA1(d37ab4bd2bfddd8c97476cbe7347ae581a6f2972)) - - ROM_REGION(0x40000, "kanji", 0) - ROM_LOAD("a1wxkfn.rom", 0, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) -ROM_END - -void msx2_state::fsa1wx(machine_config &config) -{ - // AY8910 (in T9769) - // FDC: tc8566af, 1 3.5" DSDD drive - // 2 Cartridge slots - // FM built-in - // MSX Engine T9769A/B - // ren-sha turbo slider - // firmware switch - // pause button - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 0, 2, 1, 1, "msxmusic").set_ym2413_tag("ym2413"); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "kdr"); - add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 3, 2, 1, 2, "diskrom"); - add_internal_slot(config, MSX_SLOT_PANASONIC08, "firmware", 3, 3, 0, 4, "firmware"); - - msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0)); - matsushita.turbo_callback().set(FUNC(msx2_state::turbo_w)); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); - - msx_ym2413(config); - - msx2plus(SND_AY8910, config, layout_msx_jp_1fdd); -} - -/* MSX2+ - Panasonic FS-A1WX (a) */ - -ROM_START(fsa1wxa) - ROM_REGION(0x8000, "mainrom", 0) - ROM_LOAD("a1wxbios.rom", 0x0000, 0x8000, CRC(19771608) SHA1(e90f80a61d94c617850c415e12ad70ac41e66bb7)) - - ROM_REGION(0x4000, "subrom", 0) - ROM_LOAD("a1wxext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) - - ROM_REGION(0x4000, "diskrom", 0) - ROM_LOAD("a1wxdisk.rom", 0x0000, 0x4000, CRC(2bda0184) SHA1(2a0d228afde36ac7c5d3c2aac9c7c664dd071a8c)) - - ROM_REGION(0x8000, "kdr", 0) - ROM_LOAD("a1wxkdr.rom", 0x0000, 0x8000, CRC(a068cba9) SHA1(1ef3956f7f918873fb9b031339bba45d1e5e5878)) - - ROM_REGION(0x4000, "msxmusic", 0) - ROM_LOAD("a1wxmusp.rom", 0x0000, 0x4000, CRC(456e494e) SHA1(6354ccc5c100b1c558c9395fa8c00784d2e9b0a3)) - - ROM_REGION(0x200000, "firmware", 0) - ROM_LOAD("a1wxfira.rom", 0x000000, 0x200000, CRC(58440a8e) SHA1(8e0d4a77e7d5736e8225c2df4701509363eb230f)) - - ROM_REGION(0x40000, "kanji", 0) - ROM_LOAD("a1wxkfn.rom", 0, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) -ROM_END - -/* MSX2+ - Sanyo Wavy PHC-35J */ - -ROM_START(phc35j) - ROM_REGION(0x8000, "mainrom", 0) - ROM_LOAD("35jbios.rom", 0x0000, 0x8000, CRC(358ec547) SHA1(f4433752d3bf876bfefb363c749d4d2e08a218b6)) - - ROM_REGION(0x4000, "subrom", 0) - ROM_LOAD("35jext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) - - ROM_REGION(0x8000, "kdr", 0) - ROM_LOAD("35jkdr.rom", 0x0000, 0x8000, CRC(b4fc574d) SHA1(dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06)) - - ROM_REGION(0x20000, "kanji", 0) - ROM_LOAD("35jkfn.rom", 0, 0x20000, CRC(c9651b32) SHA1(84a645becec0a25d3ab7a909cde1b242699a8662)) -ROM_END - -void msx2_state::phc35j(machine_config &config) -{ - // AY8910 (in T9769) - // FDC: None, 0 drives - // 2 Cartridge slots - // T9769A - // ren-sha turbo slider - // pause button - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "kdr"); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); - msx2plus(SND_AY8910, config, layout_msx_jp); -} - -/* MSX2+ - Sanyo Wavy PHC-70FD */ - -ROM_START(phc70fd) - ROM_REGION(0x20000, "mainrom", 0) - ROM_LOAD("phc-70fd.rom", 0x0000, 0x20000, CRC(d2307ddf) SHA1(b6f2ca2e8a18d6c7cd326cb8d1a1d7d747f23059)) -// ROM_LOAD("70fdbios.rom", 0x0000, 0x8000, CRC(19771608) SHA1(e90f80a61d94c617850c415e12ad70ac41e66bb7)) -// ROM_LOAD("70fdext.rom", 0x8000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) -// ROM_LOAD("70fddisk.rom", 0xc000, 0x4000, CRC(db7f1125) SHA1(9efa744be8355675e7bfdd3976bbbfaf85d62e1d)) -// ROM_LOAD("70fdkdr.rom", 0x10000, 0x8000, CRC(a068cba9) SHA1(1ef3956f7f918873fb9b031339bba45d1e5e5878)) -// ROM_LOAD("70fdmus.rom", 0x18000, 0x4000, CRC(5c32eb29) SHA1(aad42ba4289b33d8eed225d42cea930b7fc5c228)) -// ROM_LOAD("70fdbas.rom", 0x1c000, 0x4000, CRC(da7be246) SHA1(22b3191d865010264001b9d896186a9818478a6b)) - - ROM_REGION(0x20000, "kanji", 0) - ROM_LOAD("70fdkfn.rom", 0, 0x20000, CRC(c9651b32) SHA1(84a645becec0a25d3ab7a909cde1b242699a8662)) -ROM_END - -void msx2_state::phc70fd(machine_config &config) -{ - // AY8910 (in T9769) - // FDC: tc8566af, 1 3.5" DSDD drive - // 2 Cartridge slots - // T9769 - // FM built-in - // ren-sha turbo slider - // pause button - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom", 0x10000); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "mainrom", 0x18000); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "mainrom", 0x8000); - add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 3, 2, 1, 2, "mainrom", 0x1c000); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x00000).set_ym2413_tag("ym2413"); - add_internal_slot(config, MSX_SLOT_ROM, "basickun", 3, 3, 2, 1, "mainrom", 0x04000); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); - - msx_ym2413(config); - - msx2plus(SND_AY8910, config, layout_msx_jp_1fdd); -} - -/* MSX2+ - Sanyo Wavy PHC-70FD2 */ - -ROM_START(phc70fd2) - ROM_REGION(0x20000, "mainrom", 0) - ROM_LOAD("70f2bios.rom", 0x0000, 0x8000, CRC(19771608) SHA1(e90f80a61d94c617850c415e12ad70ac41e66bb7)) - - ROM_REGION(0x4000, "subrom", 0) - ROM_LOAD("70f2ext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) - - ROM_REGION(0x4000, "diskrom", 0) - ROM_LOAD("70f2disk.rom", 0x0000, 0x4000, CRC(db7f1125) SHA1(9efa744be8355675e7bfdd3976bbbfaf85d62e1d)) - - ROM_REGION(0x8000, "kdr", 0) - ROM_LOAD("70f2kdr.rom", 0x0000, 0x8000, CRC(a068cba9) SHA1(1ef3956f7f918873fb9b031339bba45d1e5e5878)) - - ROM_REGION(0x4000, "msxmusic", 0) - ROM_LOAD("70f2mus.rom", 0x0000, 0x4000, CRC(5c32eb29) SHA1(aad42ba4289b33d8eed225d42cea930b7fc5c228)) - - ROM_REGION(0x4000, "basickun", 0) - ROM_LOAD("70f2bas.rom", 0x0000, 0x4000, CRC(da7be246) SHA1(22b3191d865010264001b9d896186a9818478a6b)) - - ROM_REGION(0x40000, "kanji", 0) - ROM_LOAD("70f2kfn.rom", 0, 0x40000, CRC(9a850db9) SHA1(bcdb4dae303dfe5234f372d70a5e0271d3202c36)) -ROM_END - -void msx2_state::phc70fd2(machine_config &config) -{ - // AY8910 - // FDC: tc8566af, 2 3.5" DSDD drives - // 2 Cartridge slots - // FM built-in - // T9769 - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "kdr"); - add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566_2_DRIVES, "disk", 3, 2, 1, 2, "diskrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "msxmusic").set_ym2413_tag("ym2413"); - add_internal_slot(config, MSX_SLOT_ROM, "basickun", 3, 3, 2, 1, "basickun"); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); - - msx_ym2413(config); - - msx2plus(SND_AY8910, config, layout_msx_jp_2fdd); -} - -/* MSX2+ - Sony HB-F1XDJ */ - -ROM_START(hbf1xdj) - ROM_REGION(0x20000, "mainrom", 0) - ROM_LOAD("hb-f1xdj_main.rom", 0x0000, 0x20000, CRC(d89bab74) SHA1(f2a1d326d72d4c70ea214d7883838de8847a82b7)) - - ROM_REGION(0x100000, "firmware", 0) - ROM_LOAD("f1xjfirm.rom", 0x000000, 0x100000, CRC(77be583f) SHA1(ade0c5ba5574f8114d7079050317099b4519e88f)) - - ROM_REGION(0x40000, "kanji", 0) - ROM_LOAD("f1xjkfn.rom", 0, 0x40000, CRC(7016dfd0) SHA1(218d91eb6df2823c924d3774a9f455492a10aecb)) -ROM_END - -void msx2_state::hbf1xdj(machine_config &config) -{ - // YM2149 (in S-1985 MSX Engine) - // FDC: MB89311, 1 3.5" DSDD drive - // 2 Cartridge slots - // FM built-in - // S-1985 MSX Engine - // speed controller - // pause button - // ren-sha turbo - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); - add_internal_slot(config, MSX_SLOT_SONY08, "firmware", 0, 3, 0, 4, "firmware"); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "mainrom", 0x8000); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "mainrom", 0x10000); - add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793_N, "disk", 3, 2, 1, 2, "mainrom", 0xc000); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x18000).set_ym2413_tag("ym2413"); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); - - MSX_S1985(config, "s1985", 0); - - msx_ym2413(config); - - msx2plus(SND_YM2149, config, layout_msx_jp_1fdd); -} - -/* MSX2+ - Sony HB-F1XV */ - -ROM_START(hbf1xv) - ROM_REGION(0x20000, "mainrom", 0) - ROM_LOAD("hb-f1xdj_main.rom", 0x0000, 0x20000, CRC(d89bab74) SHA1(f2a1d326d72d4c70ea214d7883838de8847a82b7)) - - ROM_REGION(0x100000, "firmware", 0) - ROM_LOAD("f1xvfirm.rom", 0x0, 0x100000, CRC(77be583f) SHA1(ade0c5ba5574f8114d7079050317099b4519e88f)) - - ROM_REGION(0x40000, "kanji", 0) - ROM_LOAD("f1xvkfn.rom", 0, 0x40000, CRC(7016dfd0) SHA1(218d91eb6df2823c924d3774a9f455492a10aecb)) -ROM_END - -void msx2_state::hbf1xv(machine_config &config) -{ - // YM2149 (in S-1985 MSX Engine) - // FDC: mb89311, 1 3.5" DSDD drives - // 2 Cartridge slots - // FM built-in - // S-1985 MSX Engine - // speed controller - // pause button - // ren-sha turbo - - add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); - add_internal_slot(config, MSX_SLOT_SONY08, "firmware", 0, 3, 0, 4, "firmware"); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "mainrom", 0x8000); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "mainrom", 0x10000); - add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793_N, "disk", 3, 2, 1, 2, "mainrom", 0xc000); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x18000).set_ym2413_tag("ym2413"); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); - - MSX_S1985(config, "s1985", 0); - - msx_ym2413(config); - - msx2plus(SND_YM2149, config, layout_msx_jp_1fdd); -} - -/* MSX Turbo-R - Panasonic FS-A1GT */ - -ROM_START(fsa1gt) - ROM_REGION(0x46c000, "maincpu", 0) - ROM_LOAD("a1gtbios.rom", 0x0000, 0x8000, CRC(937c8dbb) SHA1(242e73d8284a012b275c0a266844ebbc4269d787)) - ROM_LOAD("a1gtext.rom", 0x8000, 0x4000, CRC(70aea0fe) SHA1(018d7a5222f28514908fb1b1513286a6558a6d05)) - ROM_LOAD("a1gtdos.rom", 0xc000, 0x10000, CRC(bb2a0eae) SHA1(4880bf34f1c86fff5456ec2b4cf70d02339e2caa)) - ROM_LOAD("a1gtkdr.rom", 0x1c000, 0x8000, CRC(eaf0d125) SHA1(5b39c1ccd3a213b78e02927f56a9abc72cd8c28d)) - ROM_LOAD("a1gtmus.rom", 0x24000, 0x4000, CRC(f5f93437) SHA1(6aea1aef5ec31c1826c22edf580525f93baad425)) - ROM_LOAD("a1gtopt.rom", 0x28000, 0x4000, CRC(50d11f60) SHA1(b4433a3975c57dd440d6bf12dbd28b2ac1b90ef4)) - ROM_LOAD("a1gtkfn.rom", 0x2c000, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) - ROM_LOAD("a1gtfirm.rom", 0x6c000, 0x400000, CRC(feefeadc) SHA1(e779c338eb91a7dea3ff75f3fde76b8af22c4a3a)) -ROM_END - -void msx2_state::fsa1gt(machine_config &config) -{ - // AY8910 (in T9769) - // FDC: tc8566af, 1 3.5" DSDD drive - // 2 Cartridge slots - // T9769C + S1990 - // FM built-in - // Microphone - // MIDI-in - // MIDI-out - // firmware switch - // pause button - // ren-sha turbo slider - - add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu"); - add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000).set_ym2413_tag("ym2413"); - add_internal_slot(config, MSX_SLOT_ROM, "opt", 0, 3, 1, 1, "maincpu", 0x28000); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); // 128KB?? Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x1c000); - add_internal_disk(config, MSX_SLOT_DISK4_TC8566, "dos", 3, 2, 1, 3, "maincpu", 0xc000); - add_internal_slot(config, MSX_SLOT_ROM, "firm", 3, 3, 0, 4, "maincpu", 0x6c000); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); - - msx_ym2413(config); - - turbor(SND_AY8910, config, layout_msx_jp_1fdd); -} - -/* MSX Turbo-R - Panasonic FS-A1ST */ - -ROM_START(fsa1st) - ROM_REGION(0x46c000, "maincpu", 0) - ROM_LOAD("a1stbios.rom", 0x0000, 0x8000, CRC(77b94ae0) SHA1(f078b5ec56884bfb81481d45c7151418770bff5a)) - ROM_LOAD("a1stext.rom", 0x8000, 0x4000, CRC(2c2c77a4) SHA1(373412f9c32762de1c3a7e27fc3d80614e0a0c8e)) - ROM_LOAD("a1stdos.rom", 0xc000, 0x10000, CRC(1fc71407) SHA1(5d2186658adcf4ce0c2d3232384b5712341108e5)) - ROM_LOAD("a1stkdr.rom", 0x1c000, 0x8000, CRC(eaf0d125) SHA1(5b39c1ccd3a213b78e02927f56a9abc72cd8c28d)) - ROM_LOAD("a1stmus.rom", 0x24000, 0x4000, CRC(fd7dec41) SHA1(e002a9b426732e6c2d31e548c40cf7c122348ce3)) - ROM_LOAD("a1stopt.rom", 0x28000, 0x4000, CRC(c6a4a2a1) SHA1(cb06dea7b025745f9d2b87dcf03ded615287ead3)) - ROM_LOAD("a1stkfn.rom", 0x2c000, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) - ROM_LOAD("a1stfirm.rom", 0x6c000, 0x400000, CRC(139ac99c) SHA1(c212b11fda13f83dafed688c54d098e7e47ab225)) -ROM_END - -void msx2_state::fsa1st(machine_config &config) -{ - // AY8910 (in T9769) - // FDC: tc8566af, 1 3.5" DSDD drive - // T9769C + S1990 - // 2 Cartridge slots - // FM built-in - // microphone - // firmware switch - // pause button - // ren-sha turbo slider - - add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu"); - add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000).set_ym2413_tag("ym2413"); - add_internal_slot(config, MSX_SLOT_ROM, "opt", 0, 3, 1, 1, "maincpu", 0x28000); - add_cartridge_slot<1>(config, 1); - add_cartridge_slot<2>(config, 2); - add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); // 128KB?? Mapper RAM - add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000); - add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x1c000); - add_internal_disk(config, MSX_SLOT_DISK4_TC8566, "dos", 3, 2, 1, 3, "maincpu", 0xc000); - add_internal_slot(config, MSX_SLOT_ROM, "firm", 3, 3, 0, 4, "maincpu", 0x6c000); - - MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); - - msx_ym2413(config); - - turbor(SND_AY8910, config, layout_msx_jp_1fdd); -} - } // anonymous namespace /* MSX2 */ @@ -4744,23 +4079,3 @@ COMP(1986, y805128, y805256, 0, y805128, msx2jp, msx2_state, empty_ COMP(1986, y805128r2, y805256, 0, y805128r2, msx2, msx2_state, empty_init, "Yamaha", "YIS805/128R2 (MSX2, USSR)", MACHINE_NOT_WORKING) // Network not implemented COMP(198?, y805128r2e, y805256, 0, y805128r2, y503iir2, msx2_state, empty_init, "Yamaha", "YIS805/128R2 (MSX2, Estonian)", MACHINE_NOT_WORKING) // Network not implemented COMP(198?, y805256, 0, 0, y805256, msx2jp, msx2_state, empty_init, "Yamaha", "YIS805/256 (MSX2, Japan)", MACHINE_NOT_WORKING) // Floppy support broken? - -/* MSX2+ */ -COMP(19??, expert3i, 0, 0, expert3i, msx2, msx2_state, empty_init, "Ciel", "Expert 3 IDE (MSX2+, Brazil)", MACHINE_NOT_WORKING) // Some hardware not emulated -COMP(1996, expert3t, 0, 0, expert3t, msx2, msx2_state, empty_init, "Ciel", "Expert 3 Turbo (MSX2+, Brazil)", MACHINE_NOT_WORKING) // Some hardware not emulated -COMP(19??, expertac, 0, 0, expertac, msx2, msx2_state, empty_init, "Gradiente", "Expert AC88+ (MSX2+, Brazil)", MACHINE_NOT_WORKING) // Some hardware not emulated -COMP(19??, expertdx, 0, 0, expertdx, msx2, msx2_state, empty_init, "Gradiente", "Expert DDX+ (MSX2+, Brazil)", MACHINE_NOT_WORKING) // Some hardware not emulated -COMP(1988, fsa1fx, 0, 0, fsa1fx, msx2jp, msx2_state, empty_init, "Panasonic", "FS-A1FX (MSX2+, Japan)", 0) -COMP(1989, fsa1wsx, 0, 0, fsa1wsx, msx2jp, msx2_state, empty_init, "Panasonic", "FS-A1WSX (MSX2+, Japan)", 0) -COMP(1988, fsa1wx, fsa1wxa, 0, fsa1wx, msx2jp, msx2_state, empty_init, "Panasonic", "FS-A1WX / 1st released version (MSX2+, Japan)", 0) -COMP(1988, fsa1wxa, 0, 0, fsa1wx, msx2jp, msx2_state, empty_init, "Panasonic", "FS-A1WX / 2nd released version (MSX2+, Japan)", 0) -COMP(1988, phc70fd, phc70fd2, 0, phc70fd, msx2jp, msx2_state, empty_init, "Sanyo", "PHC-70FD / Wavy70FD (MSX2+, Japan)", 0) -COMP(1989, phc70fd2, 0, 0, phc70fd2, msx2jp, msx2_state, empty_init, "Sanyo", "PHC-70FD2 / Wavy70FD2 (MSX2+, Japan)", 0) -COMP(1989, phc35j, 0, 0, phc35j, msx2jp, msx2_state, empty_init, "Sanyo", "PHC-35J / Wavy35 (MSX2+, Japan)", 0) -COMP(1988, hbf1xdj, 0, 0, hbf1xdj, msx2jp, msx2_state, empty_init, "Sony", "HB-F1XDJ (MSX2+, Japan)", 0) -COMP(1989, hbf1xv, 0, 0, hbf1xv, msx2jp, msx2_state, empty_init, "Sony", "HB-F1XV (MSX2+, Japan)", 0) - -/* MSX Turbo-R */ -/* Temporary placeholders, Turbo-R hardware is not supported yet */ -COMP(1991, fsa1gt, 0, 0, fsa1gt, msx2jp, msx2_state, empty_init, "Panasonic", "FS-A1GT (MSX Turbo-R, Japan)", MACHINE_NOT_WORKING) -COMP(1991, fsa1st, 0, 0, fsa1st, msx2jp, msx2_state, empty_init, "Panasonic", "FS-A1ST (MSX Turbo-R, Japan)", MACHINE_NOT_WORKING) diff --git a/src/mame/msx/msx2p.cpp b/src/mame/msx/msx2p.cpp new file mode 100644 index 0000000000000..2b21a3fa40a98 --- /dev/null +++ b/src/mame/msx/msx2p.cpp @@ -0,0 +1,748 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol + +#include "emu.h" +#include "msx.h" +#include "msx_keyboard.h" +#include "msx_matsushita.h" +#include "msx_s1985.h" +#include "msx_systemflags.h" +#include "bus/msx/slot/disk.h" +#include "bus/msx/slot/music.h" +#include "bus/msx/slot/panasonic08.h" +#include "bus/msx/slot/ram_mm.h" +#include "bus/msx/slot/sony08.h" +#include "softlist_dev.h" + +#include "msx_jp.lh" +#include "msx_jp_1fdd.lh" +#include "msx_jp_2fdd.lh" +#include "msx_nocode_1fdd.lh" + +using namespace msx_keyboard; + + +/*************************************************************************** + + MSX2+ machines + +***************************************************************************/ + +namespace { + +class msx2p_state : public msx2p_base_state +{ +public: + msx2p_state(const machine_config &mconfig, device_type type, const char *tag) + : msx2p_base_state(mconfig, type, tag, 21.477272_MHz_XTAL, 6) + { + } + + // MSX2+ machines + // Did the expert machines have the f4 boot flags i/o port? (not referenced from system bios) + void expert3i(machine_config &config); + void expert3t(machine_config &config); + void expertac(machine_config &config); + void expertdx(machine_config &config); + void fsa1fx(machine_config &config); + void fsa1wsx(machine_config &config); + void fsa1wx(machine_config &config); + void fsa1wxa(machine_config &config); + void phc70fd(machine_config &config); + void phc70fd2(machine_config &config); + void phc35j(machine_config &config); + void hbf1xdj(machine_config &config); + void hbf1xv(machine_config &config); + + void fsa1gt(machine_config &config); + void fsa1st(machine_config &config); +}; + +/******************************** MSX 2+ **********************************/ + +/* MSX2+ - Ciel Expert 3 IDE */ + +ROM_START(expert3i) + ROM_REGION(0x8000, "mainrom", 0) + ROM_LOAD("exp30bios.rom", 0x0000, 0x8000, CRC(a10bb1ce) SHA1(5029cf47031b22bd5d1f68ebfd3be6d6da56dfe9)) + + ROM_REGION(0x4000, "subrom", 0) + ROM_LOAD("exp30ext.rom", 0x0000, 0x4000, CRC(6bcf4100) SHA1(cc1744c6c513d6409a142b4fb42fbe70a95d9b7f)) + + ROM_REGION(0x4000, "diskrom", 0) + ROM_LOAD("cieldisk.rom", 0x0000, 0x4000, CRC(bb550b09) SHA1(0274dd9b5096065a7f4ed019101124c9bd1d56b8)) + + ROM_REGION(0x4000, "music", 0) + ROM_LOAD("exp30mus.rom", 0x0000, 0x4000, CRC(9881b3fd) SHA1(befebc916bfdb5e8057040f0ae82b5517a7750db)) + + ROM_REGION(0x10000, "ide", 0) + ROM_LOAD("ide240a.rom", 0x00000, 0x10000, CRC(7adf857f) SHA1(8a919dbeed92db8c06a611279efaed8552810239)) +ROM_END + +void msx2p_state::expert3i(machine_config &config) +{ + // AY8910/YM2149? + // FDC: wd2793, 1 or 2? drives + // 2 Cartridge slots? + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); + add_cartridge_slot<1>(config, 1); + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 1, 1, 0, 1, "subrom"); + add_internal_slot(config, MSX_SLOT_MUSIC, "music", 1, 1, 1, 1, "music"); + add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793, "disk", 1, 2, 1, 2, "diskrom"); + add_internal_slot(config, MSX_SLOT_ROM, "ide", 1, 3, 0, 4, "ide"); /* IDE hardware needs to be emulated */ + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 4).set_total_size(0x40000); // 256KB?? Mapper RAM + add_cartridge_slot<2>(config, 3); + + msx_ym2413(config); + + msx2plus(SND_AY8910, config, layout_msx_nocode_1fdd); +} + +/* MSX2+ - Ciel Expert 3 Turbo +This one is a full motherboard by CIEL (not an upgrade kit), created to replace the motherboard of a Gradiente Expert (which means that only the case, the analog boards and the keyboard remains Gradiente). This new motherboard has the following built-in features: + +1) MSX2+ +2) Support either 3.57MHz or 7.14MHz natively, switched either by software (*1) or by a hardware-switch on the front panel. Turbo-led included. +3) Up to 4MB of Memory Mapper (1MB is the most common configuration) +4) MSX-Music +5) 4 expansion slots (two external on the front panel, two internal) +6) Stereo sound (YM2413 channels 0-6 on right, PSG+YM2413 channels 7-9 on left) +7) Support the V9938 instead of the V9958 by switching some jumpers +8) The main-ram can be placed on slot 2 or slot 3, using jumpers (slot 2 is the default) + + +*1: A routine hidden inside the BIOS frame-0 is used to switch the turbo. + */ + +/* Uses a Z84C0010 - CMOS processor working at 7 MHz */ +ROM_START(expert3t) + ROM_REGION(0x8000, "mainrom", 0) + ROM_LOAD("exp30bios.rom", 0x0000, 0x8000, CRC(a10bb1ce) SHA1(5029cf47031b22bd5d1f68ebfd3be6d6da56dfe9)) + + ROM_REGION(0x4000, "subrom", 0) + ROM_LOAD("exp30ext.rom", 0x0000, 0x4000, CRC(6bcf4100) SHA1(cc1744c6c513d6409a142b4fb42fbe70a95d9b7f)) + + ROM_REGION(0x4000, "diskrom", 0) + ROM_LOAD("cieldisk.rom", 0x0000, 0x4000, CRC(bb550b09) SHA1(0274dd9b5096065a7f4ed019101124c9bd1d56b8)) + + ROM_REGION(0x4000, "music", 0) + ROM_LOAD("exp30mus.rom", 0x0000, 0x4000, CRC(9881b3fd) SHA1(befebc916bfdb5e8057040f0ae82b5517a7750db)) + + ROM_REGION(0x4000, "turbo", 0) + ROM_LOAD("turbo.rom", 0x0000, 0x4000, CRC(ab528416) SHA1(d468604269ae7664ac739ea9f922a05e14ffa3d1)) +ROM_END + +void msx2p_state::expert3t(machine_config &config) +{ + // AY8910 + // FDC: wd2793?, 1 or 2? drives + // 4 Cartridge/Expansion slots? + // FM/YM2413 built-in + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); + add_cartridge_slot<1>(config, 1, 0); + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 1, 1, 0, 1, "subrom"); + add_internal_slot(config, MSX_SLOT_MUSIC, "music", 1, 1, 1, 1, "music"); + add_internal_slot(config, MSX_SLOT_ROM, "turbo", 1, 2, 1, 1, "turbo"); /* Turbo hardware needs to be emulated */ + add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793, "disk", 1, 3, 1, 2, "diskrom"); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 4).set_total_size(0x40000); // 256KB Mapper RAM + add_cartridge_slot<2>(config, 3); + + msx_ym2413(config); + + msx2plus(SND_AY8910, config, layout_msx_nocode_1fdd); +} + +/* MSX2+ - Gradiente Expert AC88+ */ + +ROM_START(expertac) + ROM_REGION(0x8000, "mainrom", 0) + ROM_LOAD("ac88bios.rom", 0x0000, 0x8000, CRC(9ce0da44) SHA1(1fc2306911ab6e1ebdf7cb8c3c34a7f116414e88)) + + ROM_REGION(0x4000, "subrom", 0) + ROM_LOAD("ac88ext.rom", 0x0000, 0x4000, CRC(c74c005c) SHA1(d5528825c7eea2cfeadd64db1dbdbe1344478fc6)) + + ROM_REGION(0x4000, "diskrom", 0) + ROM_LOAD("panadisk.rom", 0x0000, 0x4000, CRC(17fa392b) SHA1(7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6)) + + ROM_REGION(0x4000, "asm", 0) + ROM_LOAD("ac88asm.rom", 0x0000, 0x4000, CRC(a8a955ae) SHA1(91e522473a8470511584df3ee5b325ea5e2b81ef)) + + ROM_REGION(0x4000, "xbasic", 0) + ROM_LOAD("xbasic2.rom", 0x0000, 0x4000, CRC(2825b1a0) SHA1(47370bec7ca1f0615a54eda548b07fbc0c7ef398)) +ROM_END + +void msx2p_state::expertac(machine_config &config) +{ + // AY8910/YM2149? + // FDC: wd2793?, 1 or 2? drives + // 2 Cartridge slots? + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM?? + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); + add_internal_slot(config, MSX_SLOT_ROM, "asm", 3, 1, 1, 1, "asm"); + add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793, "disk", 3, 2, 1, 2, "diskrom"); + add_internal_slot(config, MSX_SLOT_ROM, "xbasic", 3, 3, 1, 1, "xbasic"); + + msx2plus(SND_AY8910, config, layout_msx_nocode_1fdd); +} + +/* MSX2+ - Gradiente Expert DDX+ */ + +ROM_START(expertdx) + ROM_REGION(0x8000, "mainrom", 0) + ROM_LOAD("ddxbios.rom", 0x0000, 0x8000, CRC(e00af3dc) SHA1(5c463dd990582e677c8206f61035a7c54d8c67f0)) + + ROM_REGION(0x4000, "subrom", 0) + ROM_LOAD("ddxext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) + + ROM_REGION(0x4000, "diskrom", 0) + ROM_LOAD("panadisk.rom", 0x0000, 0x4000, CRC(17fa392b) SHA1(7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6)) + + ROM_REGION(0x4000, "xbasic", 0) + ROM_LOAD("xbasic2.rom", 0x0000, 0x4000, CRC(2825b1a0) SHA1(47370bec7ca1f0615a54eda548b07fbc0c7ef398)) + + ROM_REGION(0x8000, "kanjirom", 0) + ROM_LOAD("kanji.rom", 0x0000, 0x8000, CRC(b4fc574d) SHA1(dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06)) +ROM_END + +void msx2p_state::expertdx(machine_config &config) +{ + // AY8910/YM2149? + // FDC: tc8566af, 1 3.5" DSDD drive? + // 2 Cartridge slots? + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); + add_cartridge_slot<1>(config, 1, 0); + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 1, 1, 0, 1, "subrom"); + add_internal_slot(config, MSX_SLOT_ROM, "xbasic", 1, 2, 1, 1, "xbasic"); + add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 1, 3, 1, 2, "diskrom"); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM?? + add_cartridge_slot<2>(config, 3); + /* Kanji? */ + + msx2plus(SND_AY8910, config, layout_msx_nocode_1fdd); +} + +/* MSX2+ - Panasonic FS-A1FX */ + +ROM_START(fsa1fx) + ROM_REGION(0x40000, "maincpu", 0) + ROM_LOAD("a1fx.ic16", 0, 0x40000, CRC(c0b2d882) SHA1(623cbca109b6410df08ee7062150a6bda4b5d5d4)) + + // Kanji rom contents are the first half of the single rom +// ROM_REGION(0x20000, "kanji", 0) + ROM_REGION(0x40000, "kanji", 0) + ROM_LOAD("a1fx.ic16", 0, 0x40000, CRC(c0b2d882) SHA1(623cbca109b6410df08ee7062150a6bda4b5d5d4)) +ROM_END + +void msx2p_state::fsa1fx(machine_config &config) +{ + // AY8910 (in T9769) + // FDC: tc8566af, 1 3.5" DSDD drive + // 2 Cartridge slots + // T9769(B) + // ren-sha turbo slider + // pause button + // firmware switch + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "maincpu", 0x30000); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "maincpu", 0x38000); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x28000); + add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 3, 2, 1, 2, "maincpu", 0x3c000); + add_internal_slot(config, MSX_SLOT_ROM, "firmware", 3, 3, 1, 2, "maincpu", 0x20000); + + msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0)); + matsushita.turbo_callback().set([this] (int state) { + // 0 - 5.369317 MHz + // 1 - 3.579545 MHz + m_maincpu->set_unscaled_clock(m_main_xtal / (state ? 6 : 4)); + }); + + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); + set_cold_boot_flags(0xff); + + m_kanji_fsa1fx = true; + msx2plus(SND_AY8910, config, layout_msx_jp_1fdd); +} + +/* MSX2+ - Panasonic FS-A1WSX */ + +ROM_START(fsa1wsx) + ROM_REGION(0x8000, "mainrom", 0) + ROM_LOAD("a1wsbios.rom", 0x0000, 0x8000, CRC(358ec547) SHA1(f4433752d3bf876bfefb363c749d4d2e08a218b6)) + + ROM_REGION(0x4000, "subrom", 0) + ROM_LOAD("a1wsext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) + + ROM_REGION(0x4000, "diskrom", 0) + ROM_LOAD("a1wsdisk.rom", 0x0000, 0x4000, CRC(17fa392b) SHA1(7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6)) + + ROM_REGION(0x8000, "kdr", 0) + ROM_LOAD("a1wskdr.rom", 0x0000, 0x8000, CRC(b4fc574d) SHA1(dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06)) + + ROM_REGION(0x4000, "msxmusic", 0) + ROM_LOAD("a1wsmusp.rom", 0x0000, 0x4000, CRC(5c32eb29) SHA1(aad42ba4289b33d8eed225d42cea930b7fc5c228)) + + ROM_REGION(0x200000, "firmware", 0) + ROM_LOAD("a1wsfirm.rom", 0x000000, 0x200000, CRC(e363595d) SHA1(3330d9b6b76e3c4ccb7cf252496ed15d08b95d3f)) + + ROM_REGION(0x40000, "kanji", 0) + ROM_LOAD("a1wskfn.rom", 0, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) +ROM_END + +void msx2p_state::fsa1wsx(machine_config &config) +{ + // AY8910 (in T9769) + // FDC: tc8566af, 1 3.5" DSDD drive + // 2 Cartridge slots + // FM built-in + // T9769(C) + // ren-sha turbo slider + // firmware switch + // pause button + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 0, 2, 1, 1, "msxmusic"); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "kdr"); + add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 3, 2, 1, 2, "diskrom"); + add_internal_slot(config, MSX_SLOT_PANASONIC08, "firmware", 3, 3, 0, 4, "firmware"); + + msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0)); + matsushita.turbo_callback().set([this] (int state) { + // 0 - 5.369317 MHz + // 1 - 3.579545 MHz + m_maincpu->set_unscaled_clock(m_main_xtal / (state ? 6 : 4)); + }); + + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); + set_cold_boot_flags(0xff); + + msx_ym2413(config); + + msx2plus(SND_AY8910, config, layout_msx_jp_1fdd); +} + +/* MSX2+ - Panasonic FS-A1WX */ + +ROM_START(fsa1wx) + ROM_REGION(0x8000, "mainrom", 0) + ROM_LOAD("a1wxbios.rom", 0x0000, 0x8000, CRC(19771608) SHA1(e90f80a61d94c617850c415e12ad70ac41e66bb7)) + + ROM_REGION(0x4000, "subrom", 0) + ROM_LOAD("a1wxext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) + + ROM_REGION(0x4000, "diskrom", 0) + ROM_LOAD("a1wxdisk.rom", 0x0000, 0x4000, CRC(905daa1b) SHA1(bb59c849898d46a23fdbd0cc04ab35088e74a18d)) + + ROM_REGION(0x8000, "kdr", 0) + ROM_LOAD("a1wxkdr.rom", 0x0000, 0x8000, CRC(a068cba9) SHA1(1ef3956f7f918873fb9b031339bba45d1e5e5878)) + + ROM_REGION(0x4000, "msxmusic", 0) + ROM_LOAD("a1wxmusp.rom", 0x0000, 0x4000, CRC(456e494e) SHA1(6354ccc5c100b1c558c9395fa8c00784d2e9b0a3)) + + ROM_REGION(0x200000, "firmware", 0) + ROM_LOAD("a1wxfirm.rom", 0x000000, 0x200000, CRC(283f3250) SHA1(d37ab4bd2bfddd8c97476cbe7347ae581a6f2972)) + + ROM_REGION(0x40000, "kanji", 0) + ROM_LOAD("a1wxkfn.rom", 0, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) +ROM_END + +void msx2p_state::fsa1wx(machine_config &config) +{ + // AY8910 (in T9769) + // FDC: tc8566af, 1 3.5" DSDD drive + // 2 Cartridge slots + // FM built-in + // MSX Engine T9769A/B + // ren-sha turbo slider + // firmware switch + // pause button + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 0, 2, 1, 1, "msxmusic"); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "kdr"); + add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 3, 2, 1, 2, "diskrom"); + add_internal_slot(config, MSX_SLOT_PANASONIC08, "firmware", 3, 3, 0, 4, "firmware"); + + msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0)); + matsushita.turbo_callback().set([this] (int state) { + // 0 - 5.369317 MHz + // 1 - 3.579545 MHz + m_maincpu->set_unscaled_clock(m_main_xtal / (state ? 6 : 4)); + }); + + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); + set_cold_boot_flags(0xff); + + msx_ym2413(config); + + msx2plus(SND_AY8910, config, layout_msx_jp_1fdd); +} + +/* MSX2+ - Panasonic FS-A1WX (a) */ + +ROM_START(fsa1wxa) + ROM_REGION(0x8000, "mainrom", 0) + ROM_LOAD("a1wxbios.rom", 0x0000, 0x8000, CRC(19771608) SHA1(e90f80a61d94c617850c415e12ad70ac41e66bb7)) + + ROM_REGION(0x4000, "subrom", 0) + ROM_LOAD("a1wxext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) + + ROM_REGION(0x4000, "diskrom", 0) + ROM_LOAD("a1wxdisk.rom", 0x0000, 0x4000, CRC(2bda0184) SHA1(2a0d228afde36ac7c5d3c2aac9c7c664dd071a8c)) + + ROM_REGION(0x8000, "kdr", 0) + ROM_LOAD("a1wxkdr.rom", 0x0000, 0x8000, CRC(a068cba9) SHA1(1ef3956f7f918873fb9b031339bba45d1e5e5878)) + + ROM_REGION(0x4000, "msxmusic", 0) + ROM_LOAD("a1wxmusp.rom", 0x0000, 0x4000, CRC(456e494e) SHA1(6354ccc5c100b1c558c9395fa8c00784d2e9b0a3)) + + ROM_REGION(0x200000, "firmware", 0) + ROM_LOAD("a1wxfira.rom", 0x000000, 0x200000, CRC(58440a8e) SHA1(8e0d4a77e7d5736e8225c2df4701509363eb230f)) + + ROM_REGION(0x40000, "kanji", 0) + ROM_LOAD("a1wxkfn.rom", 0, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) +ROM_END + +/* MSX2+ - Sanyo Wavy PHC-35J */ + +ROM_START(phc35j) + ROM_REGION(0x8000, "mainrom", 0) + ROM_LOAD("35jbios.rom", 0x0000, 0x8000, CRC(358ec547) SHA1(f4433752d3bf876bfefb363c749d4d2e08a218b6)) + + ROM_REGION(0x4000, "subrom", 0) + ROM_LOAD("35jext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) + + ROM_REGION(0x8000, "kdr", 0) + ROM_LOAD("35jkdr.rom", 0x0000, 0x8000, CRC(b4fc574d) SHA1(dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06)) + + ROM_REGION(0x20000, "kanji", 0) + ROM_LOAD("35jkfn.rom", 0, 0x20000, CRC(c9651b32) SHA1(84a645becec0a25d3ab7a909cde1b242699a8662)) +ROM_END + +void msx2p_state::phc35j(machine_config &config) +{ + // AY8910 (in T9769) + // FDC: None, 0 drives + // 2 Cartridge slots + // T9769A + // ren-sha turbo slider + // pause button + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "kdr"); + + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); + set_cold_boot_flags(0xff); + msx2plus(SND_AY8910, config, layout_msx_jp); +} + +/* MSX2+ - Sanyo Wavy PHC-70FD */ + +ROM_START(phc70fd) + ROM_REGION(0x20000, "mainrom", 0) + ROM_LOAD("phc-70fd.rom", 0x0000, 0x20000, CRC(d2307ddf) SHA1(b6f2ca2e8a18d6c7cd326cb8d1a1d7d747f23059)) +// ROM_LOAD("70fdbios.rom", 0x0000, 0x8000, CRC(19771608) SHA1(e90f80a61d94c617850c415e12ad70ac41e66bb7)) +// ROM_LOAD("70fdext.rom", 0x8000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) +// ROM_LOAD("70fddisk.rom", 0xc000, 0x4000, CRC(db7f1125) SHA1(9efa744be8355675e7bfdd3976bbbfaf85d62e1d)) +// ROM_LOAD("70fdkdr.rom", 0x10000, 0x8000, CRC(a068cba9) SHA1(1ef3956f7f918873fb9b031339bba45d1e5e5878)) +// ROM_LOAD("70fdmus.rom", 0x18000, 0x4000, CRC(5c32eb29) SHA1(aad42ba4289b33d8eed225d42cea930b7fc5c228)) +// ROM_LOAD("70fdbas.rom", 0x1c000, 0x4000, CRC(da7be246) SHA1(22b3191d865010264001b9d896186a9818478a6b)) + + ROM_REGION(0x20000, "kanji", 0) + ROM_LOAD("70fdkfn.rom", 0, 0x20000, CRC(c9651b32) SHA1(84a645becec0a25d3ab7a909cde1b242699a8662)) +ROM_END + +void msx2p_state::phc70fd(machine_config &config) +{ + // AY8910 (in T9769) + // FDC: tc8566af, 1 3.5" DSDD drive + // 2 Cartridge slots + // T9769 + // FM built-in + // ren-sha turbo slider + // pause button + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom", 0x10000); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "mainrom", 0x18000); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "mainrom", 0x8000); + add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 3, 2, 1, 2, "mainrom", 0x1c000); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x00000); + add_internal_slot(config, MSX_SLOT_ROM, "basickun", 3, 3, 2, 1, "mainrom", 0x04000); + + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); + set_cold_boot_flags(0xff); + + msx_ym2413(config); + + msx2plus(SND_AY8910, config, layout_msx_jp_1fdd); +} + +/* MSX2+ - Sanyo Wavy PHC-70FD2 */ + +ROM_START(phc70fd2) + ROM_REGION(0x20000, "mainrom", 0) + ROM_LOAD("70f2bios.rom", 0x0000, 0x8000, CRC(19771608) SHA1(e90f80a61d94c617850c415e12ad70ac41e66bb7)) + + ROM_REGION(0x4000, "subrom", 0) + ROM_LOAD("70f2ext.rom", 0x0000, 0x4000, CRC(b8ba44d3) SHA1(fe0254cbfc11405b79e7c86c7769bd6322b04995)) + + ROM_REGION(0x4000, "diskrom", 0) + ROM_LOAD("70f2disk.rom", 0x0000, 0x4000, CRC(db7f1125) SHA1(9efa744be8355675e7bfdd3976bbbfaf85d62e1d)) + + ROM_REGION(0x8000, "kdr", 0) + ROM_LOAD("70f2kdr.rom", 0x0000, 0x8000, CRC(a068cba9) SHA1(1ef3956f7f918873fb9b031339bba45d1e5e5878)) + + ROM_REGION(0x4000, "msxmusic", 0) + ROM_LOAD("70f2mus.rom", 0x0000, 0x4000, CRC(5c32eb29) SHA1(aad42ba4289b33d8eed225d42cea930b7fc5c228)) + + ROM_REGION(0x4000, "basickun", 0) + ROM_LOAD("70f2bas.rom", 0x0000, 0x4000, CRC(da7be246) SHA1(22b3191d865010264001b9d896186a9818478a6b)) + + ROM_REGION(0x40000, "kanji", 0) + ROM_LOAD("70f2kfn.rom", 0, 0x40000, CRC(9a850db9) SHA1(bcdb4dae303dfe5234f372d70a5e0271d3202c36)) +ROM_END + +void msx2p_state::phc70fd2(machine_config &config) +{ + // AY8910 + // FDC: tc8566af, 2 3.5" DSDD drives + // 2 Cartridge slots + // FM built-in + // T9769 + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "kdr"); + add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566_2_DRIVES, "disk", 3, 2, 1, 2, "diskrom"); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "msxmusic"); + add_internal_slot(config, MSX_SLOT_ROM, "basickun", 3, 3, 2, 1, "basickun"); + + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); + set_cold_boot_flags(0xff); + + msx_ym2413(config); + + msx2plus(SND_AY8910, config, layout_msx_jp_2fdd); +} + +/* MSX2+ - Sony HB-F1XDJ */ + +ROM_START(hbf1xdj) + ROM_REGION(0x20000, "mainrom", 0) + ROM_LOAD("hb-f1xdj_main.rom", 0x0000, 0x20000, CRC(d89bab74) SHA1(f2a1d326d72d4c70ea214d7883838de8847a82b7)) + + ROM_REGION(0x100000, "firmware", 0) + ROM_LOAD("f1xjfirm.rom", 0x000000, 0x100000, CRC(77be583f) SHA1(ade0c5ba5574f8114d7079050317099b4519e88f)) + + ROM_REGION(0x40000, "kanji", 0) + ROM_LOAD("f1xjkfn.rom", 0, 0x40000, CRC(7016dfd0) SHA1(218d91eb6df2823c924d3774a9f455492a10aecb)) +ROM_END + +void msx2p_state::hbf1xdj(machine_config &config) +{ + // YM2149 (in S-1985 MSX Engine) + // FDC: MB89311, 1 3.5" DSDD drive + // 2 Cartridge slots + // FM built-in + // S-1985 MSX Engine + // speed controller + // pause button + // ren-sha turbo + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); + add_internal_slot(config, MSX_SLOT_SONY08, "firmware", 0, 3, 0, 4, "firmware"); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "mainrom", 0x8000); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "mainrom", 0x10000); + add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793_N, "disk", 3, 2, 1, 2, "mainrom", 0xc000); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x18000); + + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); + + MSX_S1985(config, "s1985", 0); + + msx_ym2413(config); + + msx2plus(SND_YM2149, config, layout_msx_jp_1fdd); +} + +/* MSX2+ - Sony HB-F1XV */ + +ROM_START(hbf1xv) + ROM_REGION(0x20000, "mainrom", 0) + ROM_LOAD("hb-f1xdj_main.rom", 0x0000, 0x20000, CRC(d89bab74) SHA1(f2a1d326d72d4c70ea214d7883838de8847a82b7)) + + ROM_REGION(0x100000, "firmware", 0) + ROM_LOAD("f1xvfirm.rom", 0x0, 0x100000, CRC(77be583f) SHA1(ade0c5ba5574f8114d7079050317099b4519e88f)) + + ROM_REGION(0x40000, "kanji", 0) + ROM_LOAD("f1xvkfn.rom", 0, 0x40000, CRC(7016dfd0) SHA1(218d91eb6df2823c924d3774a9f455492a10aecb)) +ROM_END + +void msx2p_state::hbf1xv(machine_config &config) +{ + // YM2149 (in S-1985 MSX Engine) + // FDC: mb89311, 1 3.5" DSDD drives + // 2 Cartridge slots + // FM built-in + // S-1985 MSX Engine + // speed controller + // pause button + // ren-sha turbo + + add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); + add_internal_slot(config, MSX_SLOT_SONY08, "firmware", 0, 3, 0, 4, "firmware"); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "mainrom", 0x8000); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "mainrom", 0x10000); + add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793_N, "disk", 3, 2, 1, 2, "mainrom", 0xc000); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x18000); + + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); + + MSX_S1985(config, "s1985", 0); + + msx_ym2413(config); + + msx2plus(SND_YM2149, config, layout_msx_jp_1fdd); +} + +/* MSX Turbo-R - Panasonic FS-A1GT */ + +ROM_START(fsa1gt) + ROM_REGION(0x46c000, "maincpu", 0) + ROM_LOAD("a1gtbios.rom", 0x0000, 0x8000, CRC(937c8dbb) SHA1(242e73d8284a012b275c0a266844ebbc4269d787)) + ROM_LOAD("a1gtext.rom", 0x8000, 0x4000, CRC(70aea0fe) SHA1(018d7a5222f28514908fb1b1513286a6558a6d05)) + ROM_LOAD("a1gtdos.rom", 0xc000, 0x10000, CRC(bb2a0eae) SHA1(4880bf34f1c86fff5456ec2b4cf70d02339e2caa)) + ROM_LOAD("a1gtkdr.rom", 0x1c000, 0x8000, CRC(eaf0d125) SHA1(5b39c1ccd3a213b78e02927f56a9abc72cd8c28d)) + ROM_LOAD("a1gtmus.rom", 0x24000, 0x4000, CRC(f5f93437) SHA1(6aea1aef5ec31c1826c22edf580525f93baad425)) + ROM_LOAD("a1gtopt.rom", 0x28000, 0x4000, CRC(50d11f60) SHA1(b4433a3975c57dd440d6bf12dbd28b2ac1b90ef4)) + ROM_LOAD("a1gtkfn.rom", 0x2c000, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) + ROM_LOAD("a1gtfirm.rom", 0x6c000, 0x400000, CRC(feefeadc) SHA1(e779c338eb91a7dea3ff75f3fde76b8af22c4a3a)) +ROM_END + +void msx2p_state::fsa1gt(machine_config &config) +{ + // AY8910 (in T9769) + // FDC: tc8566af, 1 3.5" DSDD drive + // 2 Cartridge slots + // T9769C + S1990 + // FM built-in + // Microphone + // MIDI-in + // MIDI-out + // firmware switch + // pause button + // ren-sha turbo slider + + add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu"); + add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000); + add_internal_slot(config, MSX_SLOT_ROM, "opt", 0, 3, 1, 1, "maincpu", 0x28000); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); // 128KB?? Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x1c000); + add_internal_disk(config, MSX_SLOT_DISK4_TC8566, "dos", 3, 2, 1, 3, "maincpu", 0xc000); + add_internal_slot(config, MSX_SLOT_ROM, "firm", 3, 3, 0, 4, "maincpu", 0x6c000); + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); + + msx_ym2413(config); + + turbor(SND_AY8910, config, layout_msx_jp_1fdd); +} + +/* MSX Turbo-R - Panasonic FS-A1ST */ + +ROM_START(fsa1st) + ROM_REGION(0x46c000, "maincpu", 0) + ROM_LOAD("a1stbios.rom", 0x0000, 0x8000, CRC(77b94ae0) SHA1(f078b5ec56884bfb81481d45c7151418770bff5a)) + ROM_LOAD("a1stext.rom", 0x8000, 0x4000, CRC(2c2c77a4) SHA1(373412f9c32762de1c3a7e27fc3d80614e0a0c8e)) + ROM_LOAD("a1stdos.rom", 0xc000, 0x10000, CRC(1fc71407) SHA1(5d2186658adcf4ce0c2d3232384b5712341108e5)) + ROM_LOAD("a1stkdr.rom", 0x1c000, 0x8000, CRC(eaf0d125) SHA1(5b39c1ccd3a213b78e02927f56a9abc72cd8c28d)) + ROM_LOAD("a1stmus.rom", 0x24000, 0x4000, CRC(fd7dec41) SHA1(e002a9b426732e6c2d31e548c40cf7c122348ce3)) + ROM_LOAD("a1stopt.rom", 0x28000, 0x4000, CRC(c6a4a2a1) SHA1(cb06dea7b025745f9d2b87dcf03ded615287ead3)) + ROM_LOAD("a1stkfn.rom", 0x2c000, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49)) + ROM_LOAD("a1stfirm.rom", 0x6c000, 0x400000, CRC(139ac99c) SHA1(c212b11fda13f83dafed688c54d098e7e47ab225)) +ROM_END + +void msx2p_state::fsa1st(machine_config &config) +{ + // AY8910 (in T9769) + // FDC: tc8566af, 1 3.5" DSDD drive + // T9769C + S1990 + // 2 Cartridge slots + // FM built-in + // microphone + // firmware switch + // pause button + // ren-sha turbo slider + + add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu"); + add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000); + add_internal_slot(config, MSX_SLOT_ROM, "opt", 0, 3, 1, 1, "maincpu", 0x28000); + add_cartridge_slot<1>(config, 1); + add_cartridge_slot<2>(config, 2); + add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); // 128KB?? Mapper RAM + add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000); + add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x1c000); + add_internal_disk(config, MSX_SLOT_DISK4_TC8566, "dos", 3, 2, 1, 3, "maincpu", 0xc000); + add_internal_slot(config, MSX_SLOT_ROM, "firm", 3, 3, 0, 4, "maincpu", 0x6c000); + MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); + + msx_ym2413(config); + + turbor(SND_AY8910, config, layout_msx_jp_1fdd); +} + +} // anonymous namespace + +COMP(19??, expert3i, 0, 0, expert3i, msx2, msx2p_state, empty_init, "Ciel", "Expert 3 IDE (MSX2+, Brazil)", MACHINE_NOT_WORKING) // Some hardware not emulated +COMP(1996, expert3t, 0, 0, expert3t, msx2, msx2p_state, empty_init, "Ciel", "Expert 3 Turbo (MSX2+, Brazil)", MACHINE_NOT_WORKING) // Some hardware not emulated +COMP(19??, expertac, 0, 0, expertac, msx2, msx2p_state, empty_init, "Gradiente", "Expert AC88+ (MSX2+, Brazil)", MACHINE_NOT_WORKING) // Some hardware not emulated +COMP(19??, expertdx, 0, 0, expertdx, msx2, msx2p_state, empty_init, "Gradiente", "Expert DDX+ (MSX2+, Brazil)", MACHINE_NOT_WORKING) // Some hardware not emulated +COMP(1988, fsa1fx, 0, 0, fsa1fx, msx2jp, msx2p_state, empty_init, "Panasonic", "FS-A1FX (MSX2+, Japan)", 0) +COMP(1989, fsa1wsx, 0, 0, fsa1wsx, msx2jp, msx2p_state, empty_init, "Panasonic", "FS-A1WSX (MSX2+, Japan)", 0) +COMP(1988, fsa1wx, fsa1wxa, 0, fsa1wx, msx2jp, msx2p_state, empty_init, "Panasonic", "FS-A1WX / 1st released version (MSX2+, Japan)", 0) +COMP(1988, fsa1wxa, 0, 0, fsa1wx, msx2jp, msx2p_state, empty_init, "Panasonic", "FS-A1WX / 2nd released version (MSX2+, Japan)", 0) +COMP(1988, phc70fd, phc70fd2, 0, phc70fd, msx2jp, msx2p_state, empty_init, "Sanyo", "PHC-70FD / Wavy70FD (MSX2+, Japan)", 0) +COMP(1989, phc70fd2, 0, 0, phc70fd2, msx2jp, msx2p_state, empty_init, "Sanyo", "PHC-70FD2 / Wavy70FD2 (MSX2+, Japan)", 0) +COMP(1989, phc35j, 0, 0, phc35j, msx2jp, msx2p_state, empty_init, "Sanyo", "PHC-35J / Wavy35 (MSX2+, Japan)", 0) +COMP(1988, hbf1xdj, 0, 0, hbf1xdj, msx2jp, msx2p_state, empty_init, "Sony", "HB-F1XDJ (MSX2+, Japan)", 0) +COMP(1989, hbf1xv, 0, 0, hbf1xv, msx2jp, msx2p_state, empty_init, "Sony", "HB-F1XV (MSX2+, Japan)", 0) + +/* MSX Turbo-R */ +/* Temporary placeholders, Turbo-R hardware is not supported yet */ +COMP(1991, fsa1gt, 0, 0, fsa1gt, msx2jp, msx2p_state, empty_init, "Panasonic", "FS-A1GT (MSX Turbo-R, Japan)", MACHINE_NOT_WORKING) +COMP(1991, fsa1st, 0, 0, fsa1st, msx2jp, msx2p_state, empty_init, "Panasonic", "FS-A1ST (MSX Turbo-R, Japan)", MACHINE_NOT_WORKING) From d4cd52e74bb649f14d0a65d4dfe800283212d9c8 Mon Sep 17 00:00:00 2001 From: 987123879113 <63495610+987123879113@users.noreply.github.com> Date: Sun, 14 Apr 2024 01:44:33 +0900 Subject: [PATCH 081/109] konami/konamigv.cpp: Added printer simulation for Tokimeki Memorial Oshiete Your Heart games. (#12233) Systems promoted to working -------------------------- Tokimeki Memorial Oshiete Your Heart (GQ673 JAA) Tokimeki Memorial Oshiete Your Heart Seal Version (GE755 JAA) Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAB) --- src/mame/konami/konamigv.cpp | 311 ++++++++++++++++++++++++++++++++--- 1 file changed, 291 insertions(+), 20 deletions(-) diff --git a/src/mame/konami/konamigv.cpp b/src/mame/konami/konamigv.cpp index bf83cb9a91c47..b18b931c2ee67 100644 --- a/src/mame/konami/konamigv.cpp +++ b/src/mame/konami/konamigv.cpp @@ -180,10 +180,10 @@ Notes: (all main parts shown) This PCB is plugged into the Tokimeki Memorial Oshiete Your Heart main board into CN4 It provides additional functionality for the printer and sensor(s) and possibly other things. - CN10 & CN11 - TCS7927-54 4-pin mini DIN connectors + CN10 & CN11 - TCS7927-54 4-pin mini DIN connectors, S-Video in and out for printer CN9 - 6 pin connector CN8 - 5 pin connector - CN7 - 7 pin connector + CN7 - 7 pin connector, printer communication CN6 - 3 pin connector CN5 - 2 pin connector CN3 - 4 pin power connector. Joins to CN6 on mainboard via a Y-splitter cable. The other end of the @@ -214,6 +214,13 @@ GQ673 PWB404691A CN1 - 4 pin power connector joining to GQ673 PCB CN3 and CN6 on mainboard via a Y-splitter cable. CN1/CN2 - 2 pin connector + +Notes: +The Tokimeki Memorial Oshiete Your Heart printer appears to be a model based on the Sony UP-1200 which is +a color video printer that takes S-Video as input. +https://www.ykuns-mechanical-club.com/tokimemo.html +https://www2.biglobe.ne.jp/~tell/keihin/tokimeki/tyheart/tyheart.html + ***************************************************************************/ @@ -245,6 +252,7 @@ class konamigv_state : public driver_device public: konamigv_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) + , m_screen(*this, "screen") , m_ncr53cf96(*this, "scsi:7:ncr53cf96") , m_btc_trackball(*this, "upd%u", 1) , m_maincpu(*this, "maincpu") @@ -272,6 +280,8 @@ class konamigv_state : public driver_device TIMER_CALLBACK_MEMBER(scsi_dma_transfer); + required_device m_screen; + required_device m_ncr53cf96; optional_device_array m_btc_trackball; @@ -319,6 +329,7 @@ class tokimeki_state : public konamigv_state , m_gsr(*this, "GSR") , m_printer_meta(*this, "PRINTER_META") , m_device_val_start_state(0) + , m_printer_is_manual_layout(false) { } @@ -335,12 +346,23 @@ class tokimeki_state : public konamigv_state void tokimeki_device_check_w(int state); private: + enum + { + // This should actually be A6 sized paper (105mm x 148mm) + PRINTER_PAGE_WIDTH = 800, + PRINTER_PAGE_HEIGHT = 600, + }; + virtual void machine_start() override; virtual void machine_reset() override; + uint32_t printer_screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void tmosh_map(address_map &map); TIMER_CALLBACK_MEMBER(heartbeat_timer_tick); + TIMER_CALLBACK_MEMBER(printing_status_timeout); + TIMER_CALLBACK_MEMBER(printer_scan_video_frame); required_ioport m_heartbeat; required_ioport m_gsr; @@ -355,7 +377,22 @@ class tokimeki_state : public konamigv_state uint16_t m_serial_sensor_data; uint8_t m_heartbeat_signal; + uint8_t m_printer_bit; + uint8_t m_printer_data[6]; + uint8_t m_printer_curbit; + uint8_t m_printer_curbyte; + attotime m_printer_pulse_starttime; + uint8_t m_printer_is_printing; + uint32_t m_printer_current_image; + bool m_printer_is_manual_layout; + bool m_printer_page_is_dirty; + uint8_t m_printer_video_last_vblank_state; + + bitmap_rgb32 m_page_bitmap; + emu_timer *m_heartbeat_timer; + emu_timer *m_printer_printing_status_timeout; + emu_timer *m_printer_video_frame_timer; }; void konamigv_state::konamigv_map(address_map &map) @@ -486,8 +523,23 @@ void tokimeki_state::machine_start() save_item(NAME(m_serial_sensor_data)); save_item(NAME(m_heartbeat_signal)); + save_item(NAME(m_printer_bit)); + save_item(NAME(m_printer_curbit)); + save_item(NAME(m_printer_curbyte)); + save_item(NAME(m_printer_is_printing)); + save_item(NAME(m_printer_current_image)); + save_item(NAME(m_printer_data)); + save_item(NAME(m_printer_page_is_dirty)); + save_item(NAME(m_printer_video_last_vblank_state)); + save_item(NAME(m_page_bitmap)); + m_heartbeat_timer = timer_alloc(FUNC(tokimeki_state::heartbeat_timer_tick), this); m_heartbeat_timer->adjust(attotime::zero); + + m_printer_printing_status_timeout = timer_alloc(FUNC(tokimeki_state::printing_status_timeout), this); + m_printer_video_frame_timer = timer_alloc(FUNC(tokimeki_state::printer_scan_video_frame), this); + + m_page_bitmap.allocate(PRINTER_PAGE_WIDTH, PRINTER_PAGE_HEIGHT); } void tokimeki_state::machine_reset() @@ -500,6 +552,18 @@ void tokimeki_state::machine_reset() m_serial_sensor_id = 0; m_serial_sensor_data = 0; m_heartbeat_signal = 1; + + m_printer_bit = 0; + m_printer_curbit = 0; + m_printer_curbyte = 0; + m_printer_is_printing = 0; + m_printer_current_image = 0; + m_printer_video_last_vblank_state = 0; + + std::fill(std::begin(m_printer_data), std::end(m_printer_data), 0); + + m_page_bitmap.fill(0xffffffff); + m_printer_page_is_dirty = true; } void konamigv_state::konamigv(machine_config &config) @@ -532,7 +596,7 @@ void konamigv_state::konamigv(machine_config &config) // video hardware CXD8514Q(config, "gpu", XTAL(53'693'175), 0x100000, subdevice("maincpu")).set_screen("screen"); - SCREEN(config, "screen", SCREEN_TYPE_RASTER); + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); // sound hardware SPEAKER(config, "lspeaker").front_left(); @@ -751,6 +815,89 @@ TIMER_CALLBACK_MEMBER(tokimeki_state::heartbeat_timer_tick) } } +TIMER_CALLBACK_MEMBER(tokimeki_state::printing_status_timeout) +{ + m_printer_is_printing = 0; +} + +TIMER_CALLBACK_MEMBER(tokimeki_state::printer_scan_video_frame) +{ + // only accept video frame when it's the start of the next vblank area + const int vblank = m_screen->vblank(); + const bool is_next_vblank = vblank != m_printer_video_last_vblank_state && vblank != 0; + + m_printer_video_last_vblank_state = vblank; + + if (!is_next_vblank) + { + m_printer_video_frame_timer->adjust(attotime::from_nsec(500)); + return; + } + + if (m_printer_is_manual_layout) + { + // 4x4 image layout + // The game tells the printer to take a video still of each individual + // image that'll be printed on the sticker sheet instead of one only + // one picture for the entire sheet like the non-plus version. + + // HACK: crop out some unwanted padding and garbage from the input image. + // The left side of image gets cropped off due to PSX gpu rendering issues. + // The actual image itself uses 4x4 pixels except for a few pixels + // around the edge of the image, so those few pixels are also cropped + // to allow for clean scaling without chunky pixels. + const int32_t crop_left = 1; + const int32_t crop_top = 40; + const int32_t crop_right = 19; + const int32_t crop_bottom = 16; + + bitmap_rgb32 cropped( + m_screen->curbitmap().as_rgb32(), + { + crop_left, + m_screen->cliprect().max_x - crop_right, + crop_top, + m_screen->cliprect().max_y - crop_bottom, + } + ); + + // scale the individual screenshot down to roughly the right size + const int32_t inner_pad_x = 6, inner_pad_y = 5; + const int32_t width_margin = 163, height_margin = 161; // full size of padding on both sides + const int32_t dest_w = (PRINTER_PAGE_WIDTH - width_margin - (inner_pad_x * 3)) / 4; + const int32_t dest_h = (PRINTER_PAGE_HEIGHT - height_margin - (inner_pad_y * 3)) / 4; + const int32_t scale_w = (cropped.width() << 16) / dest_w; + const int32_t scale_h = (cropped.height() << 16) / dest_h; + + bitmap_rgb32 scaled(dest_w, dest_h); + + copyrozbitmap( + scaled, + scaled.cliprect(), + cropped, + 0, 0, + scale_w, 0, 0, scale_h, + false + ); + + // render the cropped and scaled image to the printer page + const int x = (m_printer_current_image % 4) * (scaled.width() + inner_pad_x); + const int y = (m_printer_current_image / 4) * (scaled.height() + inner_pad_y); + copybitmap(m_page_bitmap, scaled, 0, 0, width_margin / 2 + x, height_margin / 2 + y, m_page_bitmap.cliprect()); + + m_printer_current_image++; + } + else + { + // center entire screen onto printer page + m_page_bitmap.fill(0xffffffff); + + const int x = (PRINTER_PAGE_WIDTH - m_screen->width()) / 2; + const int y = (PRINTER_PAGE_HEIGHT - m_screen->height()) / 2; + copybitmap(m_page_bitmap, m_screen->curbitmap().as_rgb32(), 0, 0, x, y, m_page_bitmap.cliprect()); + } +} + void tokimeki_state::heartbeat_pulse_w(int state) { if (state) @@ -772,7 +919,7 @@ uint16_t tokimeki_state::tokimeki_serial_r() if (!BIT(printer_meta, 1)) r |= 0x80; // printer is malfunctioning - r |= 0x40; // required to be set to avoid error when printer tries to print something + r |= m_printer_is_printing << 6; return r; } @@ -780,20 +927,126 @@ uint16_t tokimeki_state::tokimeki_serial_r() void tokimeki_state::tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t mem_mask) { /* - serial EEPROM-like device here: when mem_mask == 0x000000ff only, - - 0x40 = chip enable - 0x20 = clock - 0x10 = data - + 0x20 = serial clock + 0x10 = serial data 0x02 = sensors dest - 0x80 = printer config? - 0x40 = printer config? - 0x01 = printer data? + 0x80 = printer s-video in display flag? only shown during printer config menus + 0x01 = printer data. the duration of the value being held 1 is used to determine the command or value */ - int clk = BIT(data, 5); + const int printer_bit = BIT(data, 0); + if (printer_bit && !m_printer_bit) + { + m_printer_pulse_starttime = machine().time(); + } + else if (!printer_bit && m_printer_bit) + { + /* + duration of the transition from 1->0->1 is used to figure out what is being sent/ + the durations are clocked against the PS1's clock via GetRCnt(0xf2000002) + internally the values compared are 2400, 4800, and 9600 cycles + 9600 = start of new data transfer + 4800 = data bit 1 + 2400 = data bit 0 + */ + const auto curtime = machine().time(); + const auto ticks = (curtime - m_printer_pulse_starttime).as_ticks(m_maincpu->clock() / 16); + + if (ticks >= 9000) + { + // start of data transfer + m_printer_curbit = 0; + } + else + { + // data bit transfer + const int bit = ticks >= 4000 && ticks <= 5600; + + if (m_printer_curbit == 0) + m_printer_data[m_printer_curbyte] = 0; + + m_printer_data[m_printer_curbyte] |= bit << m_printer_curbit; + m_printer_curbit++; + + // game is programmed to always sends two bytes. first byte is 7 bits, second byte is hardcoded to be 0xf9 + if ((m_printer_curbyte & 1) == 0 && m_printer_curbit == 7) + { + m_printer_curbyte++; + m_printer_curbit = 0; + } + else if ((m_printer_curbyte & 1) == 1 && m_printer_curbit == 8) + { + if (m_printer_data[m_printer_curbyte] != 0xf9) + logerror("tokimeki printer 2nd byte was expected to be f9, found %02x", m_printer_data[m_printer_curbyte]); + + m_printer_curbyte++; + m_printer_curbit = 0; + } + } + + if (m_printer_curbyte >= 6) + { + /* + All of the commands seem to correspond to physical buttons available on the machine. + The manual configuration option in the printer test menu appears to let you control + the printer's OSD via the cabinet controls and you can see it sending 64/65/66/67 + depending on which direction you press on the joystick. + + 0x0b = sent before 0x63 -> 0x62 sequence when holding button to exit manual configuration menu. stop? + 0x10 = memory in + 0x11 = print + 0x17 = source/memory? + 0x62 = menu + 0x63 = exec + 0x64 = up + 0x65 = down + 0x66 = left + 0x67 = right + */ + + // The same sequence of 2 bytes will be sent 3 times every time it is sent, so only accept the value if it was repeated 3 times + if (m_printer_data[0] != m_printer_data[2] || m_printer_data[0] != m_printer_data[4] || m_printer_data[1] != m_printer_data[3] || m_printer_data[1] != m_printer_data[5]) + { + logerror("printer command not accepted, found different bytes [%02x %02x %02x] [%02x %02x %02x]", m_printer_data[0], m_printer_data[2], m_printer_data[4], m_printer_data[1], m_printer_data[3], m_printer_data[5]); + } + else if (m_printer_data[1] != 0xf9) + { + logerror("printer command not accepted, found second byte that wasn't 0xf9 [%02x %02x %02x] [%02x %02x %02x]", m_printer_data[0], m_printer_data[2], m_printer_data[4], m_printer_data[1], m_printer_data[3], m_printer_data[5]); + } + else if (m_printer_data[0] == 0x10) + { + // memory in + m_printer_video_last_vblank_state = m_screen->vblank(); + m_printer_video_frame_timer->adjust(m_screen->time_until_vblank_start()); + } + else if (m_printer_data[0] == 0x11) + { + // print + // tmoshs expects the busy status bit to be set for a little bit after this command or it errors out + m_printer_is_printing = 1; + m_printer_page_is_dirty = true; + m_printer_printing_status_timeout->adjust(attotime::from_msec(1000)); + } + else if (m_printer_data[0] == 0x17) + { + // source/memory? + m_page_bitmap.fill(0xffffffff); + m_printer_current_image = 0; + } + else + { + logerror("tokimeki printer found unknown command %02x\n", m_printer_data[0]); + } + + m_printer_curbyte = 0; + m_printer_curbit = 0; + } + } + + m_printer_bit = printer_bit; + + const int serial_clk = BIT(data, 5); if (BIT(data, 1)) { m_serial_sensor_data = 0; @@ -801,7 +1054,7 @@ void tokimeki_state::tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t me m_serial_val = 0; m_serial_len = 0; } - else if (!m_serial_clk && clk) + else if (!m_serial_clk && serial_clk) { if (m_serial_len < 5) { @@ -834,13 +1087,30 @@ void tokimeki_state::tokimeki_serial_w(offs_t offset, uint16_t data, uint16_t me m_serial_len++; } - m_serial_clk = clk; + m_serial_clk = serial_clk; } void tokimeki_state::tmosh(machine_config &config) { konamigv(config); m_maincpu->set_addrmap(AS_PROGRAM, &tokimeki_state::tmosh_map); + + auto &screen(SCREEN(config, "printer", SCREEN_TYPE_RASTER)); + screen.set_size(PRINTER_PAGE_WIDTH, PRINTER_PAGE_HEIGHT); + screen.set_visarea_full(); + screen.set_refresh_hz(10); // infrequently updated, only displays printed page + screen.set_screen_update(FUNC(tokimeki_state::printer_screen_update)); +} + +uint32_t tokimeki_state::printer_screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + if (!m_printer_page_is_dirty) + return UPDATE_HAS_NOT_CHANGED; + + copybitmap(bitmap, m_page_bitmap, 0, 0, 0, 0, cliprect); + m_printer_page_is_dirty = false; + + return 0; } void tokimeki_state::tmoshs_init() @@ -851,6 +1121,7 @@ void tokimeki_state::tmoshs_init() void tokimeki_state::tmoshsp_init() { m_device_val_start_state = 0xf0ba; + m_printer_is_manual_layout = true; } CUSTOM_INPUT_MEMBER(tokimeki_state::tokimeki_device_check_r) @@ -1174,10 +1445,10 @@ GAME( 1996, susume, lacrazyc, konamigv, konamigv, konamigv_state, empty_init, GAME( 1996, btchamp, konamigv, btchamp, btchamp, konamigv_state, empty_init, ROT0, "Konami", "Beat the Champ (GV053 UAA01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) GAME( 1996, kdeadeye, konamigv, kdeadeye, kdeadeye, konamigv_state, empty_init, ROT0, "Konami", "Dead Eye (GV054 UAA01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) GAME( 1997, weddingr, konamigv, konamigv, weddingr, konamigv_state, empty_init, ROT0, "Konami", "Wedding Rhapsody (GX624 JAA)", MACHINE_IMPERFECT_SOUND ) -GAME( 1997, tmosh, konamigv, tmosh, tmosh, tokimeki_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart (GQ673 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER ) -GAME( 1997, tmoshs, konamigv, tmosh, tmosh, tokimeki_state, tmoshs_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version (GE755 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER ) -GAME( 1997, tmoshsp, konamigv, tmosh, tmosh, tokimeki_state, tmoshsp_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAB)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER ) -GAME( 1997, tmoshspa, tmoshsp, tmosh, tmosh, tokimeki_state, tmoshsp_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER ) +GAME( 1997, tmosh, konamigv, tmosh, tmosh, tokimeki_state, empty_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart (GQ673 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // graphics: picture to be printed is cut off on the left +GAME( 1997, tmoshs, konamigv, tmosh, tmosh, tokimeki_state, tmoshs_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version (GE755 JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1997, tmoshsp, konamigv, tmosh, tmosh, tokimeki_state, tmoshsp_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAB)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1997, tmoshspa, tmoshsp, tmosh, tmosh, tokimeki_state, tmoshsp_init, ROT0, "Konami", "Tokimeki Memorial Oshiete Your Heart Seal Version Plus (GE756 JAA)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1998, nagano98, konamigv, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Nagano Winter Olympics '98 (GX720 EAA)", MACHINE_IMPERFECT_SOUND) GAME( 1998, naganoj, nagano98, konamigv, konamigv, konamigv_state, empty_init, ROT0, "Konami", "Hyper Olympic in Nagano (GX720 JAA)", MACHINE_IMPERFECT_SOUND) GAME( 2000, simpbowl, konamigv, simpbowl, simpbowl, simpbowl_state, empty_init, ROT0, "Konami", "The Simpsons Bowling (GQ829 UAA)", MACHINE_IMPERFECT_SOUND) From 8789ca615ace040df545290aa86a66bf53f1b6a8 Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Sat, 13 Apr 2024 18:43:47 +0200 Subject: [PATCH 082/109] coleco/expansion/sgm: Fix clang error --- src/devices/bus/coleco/expansion/sgm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/bus/coleco/expansion/sgm.cpp b/src/devices/bus/coleco/expansion/sgm.cpp index 8f074c3e2a985..8849813a2412d 100644 --- a/src/devices/bus/coleco/expansion/sgm.cpp +++ b/src/devices/bus/coleco/expansion/sgm.cpp @@ -69,7 +69,7 @@ void coleco_sgm_device::device_start() save_pointer(NAME(m_ram_upper), 0x6000); // install device into memory map - m_expansion->io_space().install_device(0x00, 0x7f, *this, coleco_sgm_device::io_map); + m_expansion->io_space().install_device(0x00, 0x7f, *this, &coleco_sgm_device::io_map); m_expansion->mem_space().install_view(0x0000, 0x1fff, m_view_lower); m_view_lower[0].install_ram(0x0000, 0x1fff, &m_ram_lower[0]); From 71b4db167835a12b771400804998d7709395ffcd Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sun, 14 Apr 2024 03:08:09 +1000 Subject: [PATCH 083/109] sinclair/specnext_divmmc.cpp: Added Spectrum Next DivMMC device emulation. [holub] --- src/mame/sinclair/specnext_divmmc.cpp | 140 ++++++++++++++++++++++++++ src/mame/sinclair/specnext_divmmc.h | 89 ++++++++++++++++ 2 files changed, 229 insertions(+) create mode 100644 src/mame/sinclair/specnext_divmmc.cpp create mode 100644 src/mame/sinclair/specnext_divmmc.h diff --git a/src/mame/sinclair/specnext_divmmc.cpp b/src/mame/sinclair/specnext_divmmc.cpp new file mode 100644 index 0000000000000..c3741877bb567 --- /dev/null +++ b/src/mame/sinclair/specnext_divmmc.cpp @@ -0,0 +1,140 @@ +// license:BSD-3-Clause +// copyright-holders:Andrei I. Holub +/********************************************************************** + Spectrum Next DivMMC +**********************************************************************/ + +#include "emu.h" +#include "specnext_divmmc.h" + + +specnext_divmmc_device::specnext_divmmc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, SPECNEXT_DIVMMC, tag, owner, clock) +{ +} + +bool specnext_divmmc_device::conmem() const noexcept +{ + return BIT(m_divmmc_reg, 7); +} + +bool specnext_divmmc_device::mapram() const noexcept +{ + return BIT(m_divmmc_reg, 6); +} + +bool specnext_divmmc_device::page0() const noexcept +{ + return m_cpu_a_15_13 == 0; +} + +bool specnext_divmmc_device::page1() const noexcept +{ + return m_cpu_a_15_13 == 1; +} + +bool specnext_divmmc_device::rom_en() const noexcept +{ + return page0() && (conmem() || automap()) && !mapram(); +} + +bool specnext_divmmc_device::ram_en() const noexcept +{ + return (page0() && (conmem() || automap()) && mapram()) || (page1() && (conmem() || automap())); +} + +u8 specnext_divmmc_device::ram_bank() const noexcept +{ + return page0() ? 3 : (m_divmmc_reg & 0x0f); +} + +bool specnext_divmmc_device::automap_nmi_instant_on() const noexcept +{ + return m_automap_nmi_instant_on && m_button_nmi; +} + +bool specnext_divmmc_device::automap_nmi_delayed_on() const noexcept +{ + return m_automap_nmi_delayed_on && m_button_nmi; +} + +bool specnext_divmmc_device::automap() const noexcept +{ + return !m_automap_reset && (m_automap_held + || (m_automap_active && (m_automap_instant_on || automap_nmi_instant_on())) + || (m_automap_rom3_active && m_automap_rom3_instant_on)); +} + +void specnext_divmmc_device::clock_w() noexcept +{ + // Rising edge + if (m_automap_reset || m_retn_seen) + m_button_nmi = 0; + else if (m_divmmc_button) + m_button_nmi = 1; + else if (m_automap_held) + m_button_nmi = 0; + + if (m_automap_reset || m_retn_seen) + { + m_automap_hold = 0; + } + else if (!m_cpu_mreq_n && !m_cpu_m1_n) + { + m_automap_hold = (m_automap_active && (m_automap_instant_on || m_automap_delayed_on || automap_nmi_instant_on() || automap_nmi_delayed_on())) + || (m_automap_rom3_active && (m_automap_rom3_instant_on || m_automap_rom3_delayed_on)) + || (m_automap_held && !(m_automap_active && m_automap_delayed_off)); + } + + if (m_automap_reset || m_retn_seen) + m_automap_held = 0; + else if (m_cpu_mreq_n) + m_automap_held = m_automap_hold; +} + + +void specnext_divmmc_device::device_start() +{ + save_item(NAME(m_cpu_a_15_13)); + save_item(NAME(m_cpu_mreq_n)); + save_item(NAME(m_cpu_m1_n)); + save_item(NAME(m_en)); + save_item(NAME(m_automap_reset)); + save_item(NAME(m_automap_active)); + save_item(NAME(m_automap_rom3_active)); + save_item(NAME(m_retn_seen)); + save_item(NAME(m_divmmc_button)); + save_item(NAME(m_divmmc_reg)); + save_item(NAME(m_automap_instant_on)); + save_item(NAME(m_automap_delayed_on)); + save_item(NAME(m_automap_delayed_off)); + save_item(NAME(m_automap_rom3_instant_on)); + save_item(NAME(m_automap_rom3_delayed_on)); + save_item(NAME(m_automap_nmi_instant_on)); + save_item(NAME(m_automap_nmi_delayed_on)); + save_item(NAME(m_button_nmi)); + save_item(NAME(m_automap_hold)); + save_item(NAME(m_automap_held)); +} + +void specnext_divmmc_device::device_reset() +{ + m_cpu_mreq_n = 0; + m_cpu_m1_n = 0; + + m_automap_instant_on = 0; + m_automap_delayed_on = 0; + m_automap_delayed_off = 0; + m_automap_rom3_instant_on = 0; + m_automap_rom3_delayed_on = 0; + m_automap_nmi_instant_on = 0; + m_automap_nmi_delayed_on = 0; + + m_automap_hold = 0; + m_automap_held = 0; + m_button_nmi = 0; +} + + +// device type definition +DEFINE_DEVICE_TYPE(SPECNEXT_DIVMMC, specnext_divmmc_device, "specnext_divmmc", "Spectrum Next DivMMC") diff --git a/src/mame/sinclair/specnext_divmmc.h b/src/mame/sinclair/specnext_divmmc.h new file mode 100644 index 0000000000000..27d6023e18879 --- /dev/null +++ b/src/mame/sinclair/specnext_divmmc.h @@ -0,0 +1,89 @@ +// license:BSD-3-Clause +// copyright-holders:Andrei I. Holub +#ifndef MAME_SINCLAIR_SPECNEXT_DIVMMC_H +#define MAME_SINCLAIR_SPECNEXT_DIVMMC_H + +#pragma once + +class specnext_divmmc_device : public device_t +{ +public: + specnext_divmmc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + void cpu_a_15_13_w(u8 data) { m_cpu_a_15_13 = data & 0x07; }; + void cpu_mreq_n_w(bool data) { m_cpu_mreq_n = data; } + void cpu_m1_n_w(bool data) { m_cpu_m1_n = data; } + void automap_active_w(bool data) { m_automap_active = data; } + void automap_rom3_active_w(bool data) { m_automap_rom3_active = data; } + + void en_w(bool data) { m_en = data; } + void automap_reset_w(bool data) { m_automap_reset = data; } + void retn_seen_w(bool data) { m_retn_seen = data; } + + void divmmc_button_w(bool data) { m_divmmc_button = data; } + void divmmc_reg_w(u8 data) { m_divmmc_reg = data; } + + void automap_instant_on_w(bool data) { m_automap_instant_on = data; } + void automap_delayed_on_w(bool data) { m_automap_delayed_on = data; } + void automap_delayed_off_w(bool data) { m_automap_delayed_off = data; } + void automap_rom3_instant_on_w(bool data) { m_automap_rom3_instant_on = data; } + void automap_rom3_delayed_on_w(bool data) { m_automap_rom3_delayed_on = data; } + void automap_nmi_instant_on_w(bool data) { m_automap_nmi_instant_on = data; } + void automap_nmi_delayed_on_w(bool data) { m_automap_nmi_delayed_on = data; } + + bool divmmc_rom_en_r() const { return rom_en() && m_en; } + bool divmmc_ram_en_r() const { return ram_en() && m_en; } + bool divmmc_rdonly_r() const { return page0() || (mapram() && ram_bank() == 3); } + u8 divmmc_ram_bank_r() const { return ram_bank() & 0x0f; } + + void clock_w() noexcept; // called on active clock edge + +protected: + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + +private: + // in + u8 m_cpu_a_15_13; + bool m_cpu_mreq_n; + bool m_cpu_m1_n; + + bool m_en; + bool m_automap_reset; + bool m_automap_active; + bool m_automap_rom3_active; + bool m_retn_seen; + + bool m_divmmc_button; + u8 m_divmmc_reg; + + bool m_automap_instant_on; + bool m_automap_delayed_on; + bool m_automap_delayed_off; + bool m_automap_rom3_instant_on; + bool m_automap_rom3_delayed_on; + bool m_automap_nmi_instant_on; + bool m_automap_nmi_delayed_on; + + // internal + bool m_button_nmi; + bool m_automap_hold; + bool m_automap_held; + + // signal + bool conmem() const noexcept; + bool mapram() const noexcept; + bool page0() const noexcept; + bool page1() const noexcept; + bool rom_en() const noexcept; + bool ram_en() const noexcept; + u8 ram_bank() const noexcept; + bool automap_nmi_instant_on() const noexcept; + bool automap_nmi_delayed_on() const noexcept; + bool automap() const noexcept; + +}; + +DECLARE_DEVICE_TYPE(SPECNEXT_DIVMMC, specnext_divmmc_device) + +#endif // MAME_SINCLAIR_SPECNEXT_DIVMMC_H From 62e6be83e7c15246e55ae3a6923d21da8d433d96 Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Sat, 13 Apr 2024 20:57:18 +0100 Subject: [PATCH 084/109] msx/msx2p.cpp: Fix validation. (#12244) --- src/mame/msx/msx2p.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mame/msx/msx2p.cpp b/src/mame/msx/msx2p.cpp index 2b21a3fa40a98..7cf6cf8cbd062 100644 --- a/src/mame/msx/msx2p.cpp +++ b/src/mame/msx/msx2p.cpp @@ -88,7 +88,7 @@ void msx2p_state::expert3i(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); add_cartridge_slot<1>(config, 1); add_internal_slot(config, MSX_SLOT_ROM, "subrom", 1, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "music", 1, 1, 1, 1, "music"); + add_internal_slot(config, MSX_SLOT_MUSIC, "music", 1, 1, 1, 1, "music").set_ym2413_tag(m_ym2413); add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793, "disk", 1, 2, 1, 2, "diskrom"); add_internal_slot(config, MSX_SLOT_ROM, "ide", 1, 3, 0, 4, "ide"); /* IDE hardware needs to be emulated */ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 4).set_total_size(0x40000); // 256KB?? Mapper RAM @@ -143,7 +143,7 @@ void msx2p_state::expert3t(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 2, "mainrom"); add_cartridge_slot<1>(config, 1, 0); add_internal_slot(config, MSX_SLOT_ROM, "subrom", 1, 1, 0, 1, "subrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "music", 1, 1, 1, 1, "music"); + add_internal_slot(config, MSX_SLOT_MUSIC, "music", 1, 1, 1, 1, "music").set_ym2413_tag(m_ym2413); add_internal_slot(config, MSX_SLOT_ROM, "turbo", 1, 2, 1, 1, "turbo"); /* Turbo hardware needs to be emulated */ add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793, "disk", 1, 3, 1, 2, "diskrom"); add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 4).set_total_size(0x40000); // 256KB Mapper RAM @@ -310,7 +310,7 @@ void msx2p_state::fsa1wsx(machine_config &config) // pause button add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 0, 2, 1, 1, "msxmusic"); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 0, 2, 1, 1, "msxmusic").set_ym2413_tag(m_ym2413); add_cartridge_slot<1>(config, 1); add_cartridge_slot<2>(config, 2); add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM @@ -371,7 +371,7 @@ void msx2p_state::fsa1wx(machine_config &config) // pause button add_internal_slot(config, MSX_SLOT_ROM, "mainrom", 0, 0, 0, 2, "mainrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 0, 2, 1, 1, "msxmusic"); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 0, 2, 1, 1, "msxmusic").set_ym2413_tag(m_ym2413); add_cartridge_slot<1>(config, 1); add_cartridge_slot<2>(config, 2); add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_unused_bits(0x80); // 64KB Mapper RAM @@ -490,7 +490,7 @@ void msx2p_state::phc70fd(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "mainrom", 0x18000); add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "mainrom", 0x8000); add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566, "disk", 3, 2, 1, 2, "mainrom", 0x1c000); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x00000); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x00000).set_ym2413_tag(m_ym2413); add_internal_slot(config, MSX_SLOT_ROM, "basickun", 3, 3, 2, 1, "mainrom", 0x04000); MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); @@ -541,7 +541,7 @@ void msx2p_state::phc70fd2(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "subrom"); add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "kdr"); add_internal_disk_mirrored(config, MSX_SLOT_DISK3_TC8566_2_DRIVES, "disk", 3, 2, 1, 2, "diskrom"); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "msxmusic"); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "msxmusic").set_ym2413_tag(m_ym2413); add_internal_slot(config, MSX_SLOT_ROM, "basickun", 3, 3, 2, 1, "basickun"); MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff); @@ -584,7 +584,7 @@ void msx2p_state::hbf1xdj(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "mainrom", 0x8000); add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "mainrom", 0x10000); add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793_N, "disk", 3, 2, 1, 2, "mainrom", 0xc000); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x18000); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x18000).set_ym2413_tag(m_ym2413); MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); @@ -627,7 +627,7 @@ void msx2p_state::hbf1xv(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 1, 0, 1, "mainrom", 0x8000); add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "mainrom", 0x10000); add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793_N, "disk", 3, 2, 1, 2, "mainrom", 0xc000); - add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x18000); + add_internal_slot(config, MSX_SLOT_MUSIC, "msxmusic", 3, 3, 1, 1, "mainrom", 0x18000).set_ym2413_tag(m_ym2413); MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00); @@ -667,7 +667,7 @@ void msx2p_state::fsa1gt(machine_config &config) // ren-sha turbo slider add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu"); - add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000); + add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000).set_ym2413_tag(m_ym2413); add_internal_slot(config, MSX_SLOT_ROM, "opt", 0, 3, 1, 1, "maincpu", 0x28000); add_cartridge_slot<1>(config, 1); add_cartridge_slot<2>(config, 2); @@ -710,7 +710,7 @@ void msx2p_state::fsa1st(machine_config &config) // ren-sha turbo slider add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu"); - add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000); + add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000).set_ym2413_tag(m_ym2413); add_internal_slot(config, MSX_SLOT_ROM, "opt", 0, 3, 1, 1, "maincpu", 0x28000); add_cartridge_slot<1>(config, 1); add_cartridge_slot<2>(config, 2); From c0d5bbe9617e46bbbda73082100b2dc34fe8afb4 Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Sat, 13 Apr 2024 21:00:34 +0100 Subject: [PATCH 085/109] msx/msx.cpp: Use arrays of memory views. (#12243) --- src/mame/msx/msx.cpp | 128 ++++++++++++------------------------------- src/mame/msx/msx.h | 25 +-------- 2 files changed, 37 insertions(+), 116 deletions(-) diff --git a/src/mame/msx/msx.cpp b/src/mame/msx/msx.cpp index 028794202e180..199d85cabbebf 100644 --- a/src/mame/msx/msx.cpp +++ b/src/mame/msx/msx.cpp @@ -130,26 +130,13 @@ msx_state::msx_state(const machine_config &mconfig, device_type type, const char , m_gen_port1(*this, "gen1") , m_gen_port2(*this, "gen2") , m_io_key(*this, "KEY%u", 0U) - , m_view_page0(*this, "view0") - , m_view_page1(*this, "view1") - , m_view_page2(*this, "view2") - , m_view_page3(*this, "view3") - , m_view_slot0_page0(*this, "view0_0") - , m_view_slot0_page1(*this, "view0_1") - , m_view_slot0_page2(*this, "view0_2") - , m_view_slot0_page3(*this, "view0_3") - , m_view_slot1_page0(*this, "view1_0") - , m_view_slot1_page1(*this, "view1_1") - , m_view_slot1_page2(*this, "view1_2") - , m_view_slot1_page3(*this, "view1_3") - , m_view_slot2_page0(*this, "view2_0") - , m_view_slot2_page1(*this, "view2_1") - , m_view_slot2_page2(*this, "view2_2") - , m_view_slot2_page3(*this, "view2_3") - , m_view_slot3_page0(*this, "view3_0") - , m_view_slot3_page1(*this, "view3_1") - , m_view_slot3_page2(*this, "view3_2") - , m_view_slot3_page3(*this, "view3_3") + , m_view{ {*this, "view0"}, {*this, "view1"}, {*this, "view2"}, {*this, "view3"} } + , m_exp_view{ + { {*this, "view0_0"}, {*this, "view0_1"}, {*this, "view0_2"}, {*this, "view0_3"} }, + { {*this, "view1_0"}, {*this, "view1_1"}, {*this, "view1_2"}, {*this, "view1_3"} }, + { {*this, "view2_0"}, {*this, "view2_1"}, {*this, "view2_2"}, {*this, "view2_3"} }, + { {*this, "view3_0"}, {*this, "view3_1"}, {*this, "view3_2"}, {*this, "view3_3"} }, + } , m_psg_b(0) , m_kanji_latch(0) , m_slot_expanded{false, false, false, false} @@ -162,26 +149,6 @@ msx_state::msx_state(const machine_config &mconfig, device_type type, const char , m_main_xtal(main_xtal) , m_cpu_xtal_divider(cpu_xtal_divider) { - m_view[0] = &m_view_page0; - m_view[1] = &m_view_page1; - m_view[2] = &m_view_page2; - m_view[3] = &m_view_page3; - m_exp_view[0][0] = &m_view_slot0_page0; - m_exp_view[0][1] = &m_view_slot0_page1; - m_exp_view[0][2] = &m_view_slot0_page2; - m_exp_view[0][3] = &m_view_slot0_page3; - m_exp_view[1][0] = &m_view_slot1_page0; - m_exp_view[1][1] = &m_view_slot1_page1; - m_exp_view[1][2] = &m_view_slot1_page2; - m_exp_view[1][3] = &m_view_slot1_page3; - m_exp_view[2][0] = &m_view_slot2_page0; - m_exp_view[2][1] = &m_view_slot2_page1; - m_exp_view[2][2] = &m_view_slot2_page2; - m_exp_view[2][3] = &m_view_slot2_page3; - m_exp_view[3][0] = &m_view_slot3_page0; - m_exp_view[3][1] = &m_view_slot3_page1; - m_exp_view[3][2] = &m_view_slot3_page2; - m_exp_view[3][3] = &m_view_slot3_page3; } void msx_state::memory_expand_slot(int slot) @@ -193,18 +160,16 @@ void msx_state::memory_expand_slot(int slot) if (m_slot_expanded[slot]) return; - m_view_page0[slot](0x0000, 0x3fff).view(*m_exp_view[slot][0]); - m_view_page1[slot](0x4000, 0x7fff).view(*m_exp_view[slot][1]); - m_view_page2[slot](0x8000, 0xbfff).view(*m_exp_view[slot][2]); - m_view_page3[slot](0xc000, 0xffff).view(*m_exp_view[slot][3]); - m_view_page3[slot](0xffff, 0xffff).rw(FUNC(msx_state::expanded_slot_r), FUNC(msx_state::expanded_slot_w)); - for (int i = 0; i < 4; i++) + m_view[0][slot](0x0000, 0x3fff).view(m_exp_view[slot][0]); + m_view[1][slot](0x4000, 0x7fff).view(m_exp_view[slot][1]); + m_view[2][slot](0x8000, 0xbfff).view(m_exp_view[slot][2]); + m_view[3][slot](0xc000, 0xffff).view(m_exp_view[slot][3]); + m_view[3][slot](0xffff, 0xffff).rw(FUNC(msx_state::expanded_slot_r), FUNC(msx_state::expanded_slot_w)); + for (int subslot = 0; subslot < 4; subslot++) { // Ensure that the views will exist - (*m_exp_view[slot][0])[i]; - (*m_exp_view[slot][1])[i]; - (*m_exp_view[slot][2])[i]; - (*m_exp_view[slot][3])[i]; + for (int page = 0; page < 4; page++) + (m_exp_view[slot][page])[subslot]; } m_slot_expanded[slot] = true; } @@ -213,19 +178,15 @@ void msx_state::memory_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x3fff).view(m_view_page0); - map(0x4000, 0x7fff).view(m_view_page1); - map(0x8000, 0xbfff).view(m_view_page2); - map(0xc000, 0xffff).view(m_view_page3); + map(0x0000, 0x3fff).view(m_view[0]); + map(0x4000, 0x7fff).view(m_view[1]); + map(0x8000, 0xbfff).view(m_view[2]); + map(0xc000, 0xffff).view(m_view[3]); // setup defaults - for (int i = 0; i < 4; i++) - { - m_view_page0[i]; - m_view_page1[i]; - m_view_page2[i]; - m_view_page3[i]; - } + for (int slot = 0; slot < 4; slot++) + for (int page = 0; page < 4; page++) + m_view[page][slot]; // Look for expanded slots for (const auto& entry : m_internal_slots) @@ -238,27 +199,15 @@ void msx_state::memory_map(address_map &map) { memory_view::memory_view_entry *view[4] = {nullptr, nullptr, nullptr, nullptr}; for (int i = 0; i < entry.numpages; i++) - { view[entry.page + i] = get_view(entry.page + i, entry.prim, entry.sec); - } + entry.internal_slot->install(view[0], view[1], view[2], view[3]); } } memory_view::memory_view_entry *msx_state::get_view(int page, int prim, int sec) { - switch (page) - { - case 0: - return m_slot_expanded[prim] ? &(*m_exp_view[prim][0])[sec] : &m_view_page0[prim]; - case 1: - return m_slot_expanded[prim] ? &(*m_exp_view[prim][1])[sec] : &m_view_page1[prim]; - case 2: - return m_slot_expanded[prim] ? &(*m_exp_view[prim][2])[sec] : &m_view_page2[prim]; - case 3: - return m_slot_expanded[prim] ? &(*m_exp_view[prim][3])[sec] : &m_view_page3[prim]; - } - return nullptr; + return m_slot_expanded[prim] ? &(m_exp_view[prim][page])[sec] : &m_view[page][prim]; } void msx_state::msx_base_io_map(address_map &map) @@ -291,17 +240,14 @@ void msx_state::machine_reset() { m_primary_slot = 0; m_secondary_slot[0] = 0; - m_view_page0.select(0); - m_view_page1.select(0); - m_view_page2.select(0); - m_view_page3.select(0); + + for (int page = 0; page < 4; page++) + m_view[page].select(0); + if (m_slot_expanded[0]) - { - m_view_slot0_page0.select(0); - m_view_slot0_page1.select(0); - m_view_slot0_page2.select(0); - m_view_slot0_page3.select(0); - } + for (int page = 0; page < 4; page++) + m_exp_view[0][page].select(0); + m_caps_led = 0; m_code_led = 0; } @@ -382,10 +328,8 @@ void msx_state::ppi_port_a_w(u8 data) m_primary_slot = data; LOG("write to primary slot select: %02x\n", m_primary_slot); - m_view_page0.select((data >> 0) & 0x03); - m_view_page1.select((data >> 2) & 0x03); - m_view_page2.select((data >> 4) & 0x03); - m_view_page3.select((data >> 6) & 0x03); + for (int page = 0; page < 4; page++) + m_view[page].select((data >> (page * 2)) & 0x03); } void msx_state::ppi_port_c_w(u8 data) @@ -426,10 +370,8 @@ void msx_state::expanded_slot_w(u8 data) const int slot = (m_primary_slot >> 6) & 0x03; m_secondary_slot[slot] = data; LOG("write to expanded slot select: %02x\n", data); - m_exp_view[slot][0]->select((data >> 0) & 0x03); - m_exp_view[slot][1]->select((data >> 2) & 0x03); - m_exp_view[slot][2]->select((data >> 4) & 0x03); - m_exp_view[slot][3]->select((data >> 6) & 0x03); + for (int page = 0; page < 4; page++) + m_exp_view[slot][page].select((data >> (page * 2)) & 0x03); } u8 msx_state::expanded_slot_r() diff --git a/src/mame/msx/msx.h b/src/mame/msx/msx.h index 24feb1569bafe..cd682c17629cb 100644 --- a/src/mame/msx/msx.h +++ b/src/mame/msx/msx.h @@ -199,29 +199,8 @@ class msx_state : public driver_device msx_hw_def m_hw_def; // This is here until more direct rom dumps from kanji font roms become available. bool m_kanji_fsa1fx = false; - memory_view m_view_page0; - memory_view m_view_page1; - memory_view m_view_page2; - memory_view m_view_page3; - memory_view *m_view[4]; - // There must be a better way to do this - memory_view m_view_slot0_page0; - memory_view m_view_slot0_page1; - memory_view m_view_slot0_page2; - memory_view m_view_slot0_page3; - memory_view m_view_slot1_page0; - memory_view m_view_slot1_page1; - memory_view m_view_slot1_page2; - memory_view m_view_slot1_page3; - memory_view m_view_slot2_page0; - memory_view m_view_slot2_page1; - memory_view m_view_slot2_page2; - memory_view m_view_slot2_page3; - memory_view m_view_slot3_page0; - memory_view m_view_slot3_page1; - memory_view m_view_slot3_page2; - memory_view m_view_slot3_page3; - memory_view *m_exp_view[4][4]; + memory_view m_view[4]; + memory_view m_exp_view[4][4]; struct internal_slot { int prim; From 7662be246fa603345ec44776ca0f09984328c4bd Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sun, 14 Apr 2024 06:54:27 +1000 Subject: [PATCH 086/109] Fixed a few class memory access warnings. --- src/emu/render.cpp | 3 +- src/lib/util/xmlfile.cpp | 8 +- src/mame/atari/atarifdc.cpp | 12 ++- src/mame/atari/atarifdc.h | 22 ++-- src/mame/atari/lynx_m.cpp | 8 +- src/mame/bfm/bfcobra.cpp | 154 ++++++++++++++-------------- src/mame/canon/x07.cpp | 12 ++- src/mame/ensoniq/esq1.cpp | 7 +- src/mame/koei/pasogo.cpp | 2 +- src/mame/sinclair/specnext_divmmc.h | 1 - 10 files changed, 118 insertions(+), 111 deletions(-) diff --git a/src/emu/render.cpp b/src/emu/render.cpp index 2b9efa1c7fa6f..571f4e79084a2 100644 --- a/src/emu/render.cpp +++ b/src/emu/render.cpp @@ -336,7 +336,8 @@ render_texture::render_texture() m_curseq(0) { m_sbounds.set(0, -1, 0, -1); - memset(m_scaled, 0, sizeof(m_scaled)); + for (auto &elem : m_scaled) + elem.seqid = 0; } diff --git a/src/lib/util/xmlfile.cpp b/src/lib/util/xmlfile.cpp index 7cd6a4eecda76..db8d87930e283 100644 --- a/src/lib/util/xmlfile.cpp +++ b/src/lib/util/xmlfile.cpp @@ -76,10 +76,12 @@ void write_escaped(core_file &file, std::string const &str) struct parse_info { + parse_info() { memset(&parser, 0, sizeof(parser)); } + XML_Parser parser; file::ptr rootnode; - data_node * curnode; - uint32_t flags; + data_node * curnode = nullptr; + uint32_t flags = 0; }; @@ -813,7 +815,7 @@ std::string normalize_string(std::string_view string) static bool expat_setup_parser(parse_info &info, parse_options const *opts) { // setup info structure - memset(&info, 0, sizeof(info)); + info = parse_info(); if (opts != nullptr) { info.flags = opts->flags; diff --git a/src/mame/atari/atarifdc.cpp b/src/mame/atari/atarifdc.cpp index 8573b8ff179b4..1684e7ddf02e3 100644 --- a/src/mame/atari/atarifdc.cpp +++ b/src/mame/atari/atarifdc.cpp @@ -15,6 +15,7 @@ #include "formats/atari_dsk.h" +#include #include #include @@ -741,8 +742,8 @@ static const floppy_interface atari_floppy_interface = DEFINE_DEVICE_TYPE(ATARI_FDC, atari_fdc_device, "atari_fdc", "Atari FDC") -atari_fdc_device::atari_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, ATARI_FDC, tag, owner, clock), +atari_fdc_device::atari_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, ATARI_FDC, tag, owner, clock), m_floppy(*this, "floppy%u", 0U), m_pokey(*this, "^pokey"), m_pia(*this, "^pia"), @@ -763,9 +764,10 @@ atari_fdc_device::atari_fdc_device(const machine_config &mconfig, const char *ta void atari_fdc_device::device_start() { - memset(m_serout_buff, 0, sizeof(m_serout_buff)); - memset(m_serin_buff, 0, sizeof(m_serin_buff)); - memset(m_drv, 0, sizeof(m_drv)); + std::fill(std::begin(m_serout_buff), std::end(m_serout_buff), 0); + std::fill(std::begin(m_serin_buff), std::end(m_serin_buff), 0); + for (auto &drv : m_drv) + drv = atari_drive(); for (auto &floppy : m_floppy) floppy->floppy_install_load_proc(_atari_load_proc); diff --git a/src/mame/atari/atarifdc.h b/src/mame/atari/atarifdc.h index 968a34c474dbd..92d82485f517c 100644 --- a/src/mame/atari/atarifdc.h +++ b/src/mame/atari/atarifdc.h @@ -37,17 +37,17 @@ class atari_fdc_device : public device_t struct atari_drive { - std::unique_ptr image; /* alloc'd image */ - int type; /* type of image (XFD, ATR, DSK) */ - int mode; /* 0 read only, != 0 read/write */ - int density; /* 0 SD, 1 MD, 2 DD */ - int header_skip; /* number of bytes in format header */ - int tracks; /* number of tracks (35,40,77,80) */ - int heads; /* number of heads (1,2) */ - int spt; /* sectors per track (18,26) */ - int seclen; /* sector length (128,256) */ - int bseclen; /* boot sector length (sectors 1..3) */ - int sectors; /* total sectors, ie. tracks x heads x spt */ + std::unique_ptr image; // alloc'd image + int type = 0; // type of image (XFD, ATR, DSK) + int mode = 0; // 0 read only, != 0 read/write + int density = 0; // 0 SD, 1 MD, 2 DD + int header_skip = 0; // number of bytes in format header + int tracks = 0; // number of tracks (35,40,77,80) + int heads = 0; // number of heads (1,2) + int spt = 0; // sectors per track (18,26) + int seclen = 0; // sector length (128,256) + int bseclen = 0; // boot sector length (sectors 1..3) + int sectors = 0; // total sectors, ie. tracks x heads x spt }; required_device_array m_floppy; diff --git a/src/mame/atari/lynx_m.cpp b/src/mame/atari/lynx_m.cpp index 296f47daae112..cacb368fa9492 100644 --- a/src/mame/atari/lynx_m.cpp +++ b/src/mame/atari/lynx_m.cpp @@ -1320,7 +1320,7 @@ TIM_BORROWOUT EQU %00000001 void lynx_state::timer_init(int which) { - memset(&m_timer[which], 0, sizeof(LYNX_TIMER)); + m_timer[which] = LYNX_TIMER(); m_timer[which].timer = timer_alloc(FUNC(lynx_state::timer_shot), this); save_item(NAME(m_timer[which].bakup), which); @@ -1557,7 +1557,7 @@ void lynx_state::update_screen_timing() void lynx_state::uart_reset() { - memset(&m_uart, 0, sizeof(m_uart)); + m_uart = UART(); } TIMER_CALLBACK_MEMBER(lynx_state::uart_loopback_timer) @@ -1879,8 +1879,8 @@ void lynx_state::machine_reset() m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); m_maincpu->set_input_line(M65SC02_IRQ_LINE, CLEAR_LINE); - memset(&m_suzy, 0, sizeof(m_suzy)); - memset(&m_mikey, 0, sizeof(m_mikey)); + m_suzy = SUZY(); + m_mikey = MIKEY(); m_suzy.data[0x88] = 0x01; m_suzy.data[0x90] = 0x00; diff --git a/src/mame/bfm/bfcobra.cpp b/src/mame/bfm/bfcobra.cpp index 5c89a5be102bb..56862d17205f4 100644 --- a/src/mame/bfm/bfcobra.cpp +++ b/src/mame/bfm/bfcobra.cpp @@ -155,14 +155,14 @@ union ADDR_REG }; /* Blitter register flag bits */ -#define CMD_RUN 0x01 -#define CMD_COLST 0x02 -#define CMD_PARRD 0x04 /* Never used? */ -#define CMD_SRCUP 0x08 -#define CMD_DSTUP 0x10 -#define CMD_LT0 0x20 -#define CMD_LT1 0x40 -#define CMD_LINEDRAW 0x80 +static constexpr uint8_t CMD_RUN = 0x01; +static constexpr uint8_t CMD_COLST = 0x02; +static constexpr uint8_t CMD_PARRD = 0x04; /* Never used? */ +static constexpr uint8_t CMD_SRCUP = 0x08; +static constexpr uint8_t CMD_DSTUP = 0x10; +static constexpr uint8_t CMD_LT0 = 0x20; +static constexpr uint8_t CMD_LT1 = 0x40; +static constexpr uint8_t CMD_LINEDRAW = 0x80; /* All unconfirmed */ @@ -172,20 +172,20 @@ union ADDR_REG #define SRCDST_A_1 0x80 /* This might be correct for line drawing? */ /* These appear to be correct */ -#define MODE_SSIGN 0x80 -#define MODE_DSIGN 0x40 -#define MODE_YFRAC 0x20 -#define MODE_BITTOBYTE 0x04 -#define MODE_PALREMAP 0x10 - -#define CMPFUNC_LT 0x01 -#define CMPFUNC_EQ 0x02 -#define CMPFUNC_GT 0x04 -#define CMPFUNC_BEQ 0x08 -#define CMPFUNC_LOG0 0x10 -#define CMPFUNC_LOG1 0x20 -#define CMPFUNC_LOG2 0x40 -#define CMPFUNC_LOG3 0x80 +static constexpr uint8_t MODE_SSIGN = 0x80; +static constexpr uint8_t MODE_DSIGN = 0x40; +static constexpr uint8_t MODE_YFRAC = 0x20; +static constexpr uint8_t MODE_BITTOBYTE = 0x04; +static constexpr uint8_t MODE_PALREMAP = 0x10; + +static constexpr uint8_t CMPFUNC_LT = 0x01; +static constexpr uint8_t CMPFUNC_EQ = 0x02; +static constexpr uint8_t CMPFUNC_GT = 0x04; +static constexpr uint8_t CMPFUNC_BEQ = 0x08; +static constexpr uint8_t CMPFUNC_LOG0 = 0x10; +static constexpr uint8_t CMPFUNC_LOG1 = 0x20; +static constexpr uint8_t CMPFUNC_LOG2 = 0x40; +static constexpr uint8_t CMPFUNC_LOG3 = 0x80; /* Blitter state @@ -194,26 +194,26 @@ struct bf_blitter_t { ADDR_REG program; - uint8_t control = 0; - uint8_t status = 0; + uint8_t control = 0; + uint8_t status = 0; - uint8_t command = 0; + uint8_t command = 0; ADDR_REG source; ADDR_REG dest; - uint8_t modectl = 0; - uint8_t compfunc = 0; - uint8_t outercnt = 0; + uint8_t modectl = 0; + uint8_t compfunc = 0; + uint8_t outercnt = 0; - uint8_t innercnt = 0; - uint8_t step = 0; - uint8_t pattern = 0; + uint8_t innercnt = 0; + uint8_t step = 0; + uint8_t pattern = 0; }; #define LOOPTYPE ( ( blitter.command&0x60 ) >> 5 ) struct fdc_t { - uint8_t MSR = 0; + uint8_t MSR = 0; int side = 0; int track = 0; @@ -231,8 +231,8 @@ struct fdc_t int cmd_cnt = 0; int res_len = 0; int res_cnt = 0; - uint8_t cmd[10]{}; - uint8_t results[8]{}; + uint8_t cmd[10]{}; + uint8_t results[8]{}; }; @@ -304,7 +304,7 @@ class bfcobra_state : public driver_device void reset_fdc(); void exec_w_phase(uint8_t data); void init_ram(); - void command_phase(struct fdc_t &fdc, uint8_t data); + void command_phase(fdc_t &fdc, uint8_t data); inline uint8_t* blitter_get_addr(uint32_t addr); inline void z80_bank(int num, int data); @@ -339,7 +339,7 @@ class bfcobra_state : public driver_device uint8_t m_col7bit[256]{}; uint8_t m_col6bit[256]{}; struct bf_blitter_t m_blitter; - struct fdc_t m_fdc; + fdc_t m_fdc; required_device m_maincpu; required_device m_audiocpu; required_device m_acia6850_0; @@ -1058,7 +1058,7 @@ enum command void bfcobra_state::reset_fdc() { - memset(&m_fdc, 0, sizeof(m_fdc)); + m_fdc = fdc_t(); m_fdc.MSR = 0x80; m_fdc.phase = COMMAND; @@ -1075,71 +1075,70 @@ uint8_t bfcobra_state::fdctrl_r() uint8_t bfcobra_state::fddata_r() { - struct fdc_t &fdc = m_fdc; - #define BPS 1024 - #define SPT 10 - #define BPT 1024*10 + constexpr int BPS = 1024; + constexpr int SPT = 10; + constexpr int BPT = BPS * SPT; uint8_t val = 0; - if (fdc.phase == EXECUTION_R) + if (m_fdc.phase == EXECUTION_R) { - switch (fdc.cmd[0] & 0x1f) + switch (m_fdc.cmd[0] & 0x1f) { /* Specify */ case READ_DATA: { - if (fdc.setup_read) + if (m_fdc.setup_read) { - fdc.track = fdc.cmd[2]; - fdc.side = fdc.cmd[3]; - fdc.sector = fdc.cmd[4]; - fdc.number = fdc.cmd[5]; - fdc.stop_track = fdc.cmd[6]; - //int GPL = fdc.cmd[7]; - //int DTL = fdc.cmd[8]; - - fdc.setup_read = 0; - fdc.byte_pos = 0; + m_fdc.track = m_fdc.cmd[2]; + m_fdc.side = m_fdc.cmd[3]; + m_fdc.sector = m_fdc.cmd[4]; + m_fdc.number = m_fdc.cmd[5]; + m_fdc.stop_track = m_fdc.cmd[6]; + //int GPL = m_fdc.cmd[7]; + //int DTL = m_fdc.cmd[8]; + + m_fdc.setup_read = 0; + m_fdc.byte_pos = 0; } - fdc.offset = (BPT * fdc.track*2) + (fdc.side ? BPT : 0) + (BPS * (fdc.sector-1)) + fdc.byte_pos++; - val = *(memregion("user2")->base() + fdc.offset); + m_fdc.offset = (BPT * m_fdc.track*2) + (m_fdc.side ? BPT : 0) + (BPS * (m_fdc.sector-1)) + m_fdc.byte_pos++; + val = *(memregion("user2")->base() + m_fdc.offset); /* Move on to next sector? */ - if (fdc.byte_pos == 1024) + if (m_fdc.byte_pos == 1024) { - fdc.byte_pos = 0; + m_fdc.byte_pos = 0; - if (fdc.sector == fdc.stop_track || ++fdc.sector == 11) + if (m_fdc.sector == m_fdc.stop_track || ++m_fdc.sector == 11) { /* End of read operation */ - fdc.MSR = 0xd0; - fdc.phase = RESULTS; + m_fdc.MSR = 0xd0; + m_fdc.phase = RESULTS; - fdc.results[0] = 0; - fdc.results[1] = 0; - fdc.results[2] = 0; + m_fdc.results[0] = 0; + m_fdc.results[1] = 0; + m_fdc.results[2] = 0; - fdc.results[3] = 0; - fdc.results[4] = 0; - fdc.results[5] = 0; - fdc.results[6] = 0; + m_fdc.results[3] = 0; + m_fdc.results[4] = 0; + m_fdc.results[5] = 0; + m_fdc.results[6] = 0; } } break; } } } - else if (fdc.phase == RESULTS) + else if (m_fdc.phase == RESULTS) { - val = fdc.results[fdc.res_cnt++]; + val = m_fdc.results[m_fdc.res_cnt++]; - if (fdc.res_cnt == fdc.res_len) + if (m_fdc.res_cnt == m_fdc.res_len) { - fdc.phase = COMMAND; - fdc.res_cnt = 0; - fdc.MSR &= ~0x40; + m_fdc.phase = COMMAND; + m_fdc.res_cnt = 0; + m_fdc.MSR &= ~0x40; } } @@ -1148,12 +1147,11 @@ uint8_t bfcobra_state::fddata_r() void bfcobra_state::fdctrl_w(uint8_t data) { - struct fdc_t &fdc = m_fdc; - switch (fdc.phase) + switch (m_fdc.phase) { case COMMAND: { - command_phase(fdc, data); + command_phase(m_fdc, data); break; } case EXECUTION_W: @@ -1168,7 +1166,7 @@ void bfcobra_state::fdctrl_w(uint8_t data) } } -void bfcobra_state::command_phase(struct fdc_t &fdc, uint8_t data) +void bfcobra_state::command_phase(fdc_t &fdc, uint8_t data) { if (fdc.cmd_cnt == 0) { diff --git a/src/mame/canon/x07.cpp b/src/mame/canon/x07.cpp index 9c2ab5994f268..9c9bbcd93d6e3 100644 --- a/src/mame/canon/x07.cpp +++ b/src/mame/canon/x07.cpp @@ -35,6 +35,8 @@ #include "softlist_dev.h" #include "speaker.h" +#include + /*************************************************************************** T6834 IMPLEMENTATION @@ -1447,10 +1449,12 @@ void x07_state::machine_reset() memset(m_regs_r, 0, sizeof(m_regs_r)); memset(m_regs_w, 0, sizeof(m_regs_w)); memset(m_alarm, 0, sizeof(m_alarm)); - memset(&m_in, 0, sizeof(m_in)); - memset(&m_out, 0, sizeof(m_out)); - memset(&m_locate, 0, sizeof(m_locate)); - memset(&m_cursor, 0, sizeof(m_cursor)); + std::fill(std::begin(m_in.data), std::end(m_in.data), 0); + m_in.read = m_in.write = 0; + std::fill(std::begin(m_out.data), std::end(m_out.data), 0); + m_out.read = m_out.write = 0; + m_locate = lcd_position(); + m_cursor = lcd_position(); memset(m_prn_buffer, 0, sizeof(m_prn_buffer)); memset(m_lcd_map, 0, sizeof(m_lcd_map)); diff --git a/src/mame/ensoniq/esq1.cpp b/src/mame/ensoniq/esq1.cpp index 2bcc5360c9ed1..ca643fdd81e13 100644 --- a/src/mame/ensoniq/esq1.cpp +++ b/src/mame/ensoniq/esq1.cpp @@ -335,7 +335,8 @@ void esq1_filters::recalc_filter(filter &f) void esq1_filters::device_start() { stream = stream_alloc(8, 2, 44100); - memset(filters, 0, sizeof(filters)); + for(auto & elem : filters) + elem = filter(); for(auto & elem : filters) recalc_filter(elem); } @@ -389,8 +390,8 @@ namespace { class esq1_state : public driver_device { public: - esq1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + esq1_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_duart(*this, "duart"), m_filters(*this, "filters"), diff --git a/src/mame/koei/pasogo.cpp b/src/mame/koei/pasogo.cpp index bdff84f6ae3b0..990fcc0926b22 100644 --- a/src/mame/koei/pasogo.cpp +++ b/src/mame/koei/pasogo.cpp @@ -219,7 +219,7 @@ void pasogo_state::machine_start() { system_time systime; - memset(&m_vg230, 0, sizeof(m_vg230)); + m_vg230 = decltype(m_vg230)(); m_vg230.pmu.write_protected = true; machine().base_datetime(systime); diff --git a/src/mame/sinclair/specnext_divmmc.h b/src/mame/sinclair/specnext_divmmc.h index 27d6023e18879..6a8a68215feef 100644 --- a/src/mame/sinclair/specnext_divmmc.h +++ b/src/mame/sinclair/specnext_divmmc.h @@ -81,7 +81,6 @@ class specnext_divmmc_device : public device_t bool automap_nmi_instant_on() const noexcept; bool automap_nmi_delayed_on() const noexcept; bool automap() const noexcept; - }; DECLARE_DEVICE_TYPE(SPECNEXT_DIVMMC, specnext_divmmc_device) From 8e7af961c656c1cc1b1d2282a1c2a3d8d1f6d020 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sun, 14 Apr 2024 07:36:45 +1000 Subject: [PATCH 087/109] emu/rendlay.cpp, ui/ui.cpp: Allow layout views to control pointer display. --- docs/source/luascript/ref-core.rst | 3 -- docs/source/luascript/ref-render.rst | 15 +++++++- docs/source/techspecs/layout_files.rst | 5 +++ scripts/build/complay.py | 1 + src/emu/rendlay.cpp | 40 +++++++++++++++++++++ src/emu/rendlay.h | 9 +++++ src/frontend/mame/luaengine.cpp | 1 - src/frontend/mame/luaengine_render.cpp | 3 ++ src/frontend/mame/ui/selmenu.cpp | 1 - src/frontend/mame/ui/ui.cpp | 48 ++++++++++++++++---------- src/frontend/mame/ui/ui.h | 2 -- 11 files changed, 101 insertions(+), 27 deletions(-) diff --git a/docs/source/luascript/ref-core.rst b/docs/source/luascript/ref-core.rst index f761b20f5deac..7b72d90ebdb90 100644 --- a/docs/source/luascript/ref-core.rst +++ b/docs/source/luascript/ref-core.rst @@ -587,9 +587,6 @@ driver.is_bios_root (read-only) driver.requires_artwork (read-only) A Boolean indicating whether the system requires external artwork to be usable. -driver.clickable_artwork (read-only) - A Boolean indicating whether the system requires clickable artwork features - to be usable. driver.unofficial (read-only) A Boolean indicating whether this is an unofficial but common user modification to a system. diff --git a/docs/source/luascript/ref-render.rst b/docs/source/luascript/ref-render.rst index eee432660ddad..7cc1400b3cb41 100644 --- a/docs/source/luascript/ref-render.rst +++ b/docs/source/luascript/ref-render.rst @@ -754,6 +754,10 @@ manager.machine.video.snapshot_target Properties ~~~~~~~~~~ +target.ui_container (read-only) + The :ref:`render container ` for drawing user + interface elements over this render target, or ``nil`` for hidden render + targets (targets that are not shown to the user directly). target.index (read-only) The 1-based index of the render target. This has O(n) complexity. target.width (read-only) @@ -810,6 +814,9 @@ Instantiation manager.machine.render.ui_container Gets the render container used to draw the user interface, including menus, sliders and pop-up messages. +manager.machine.render.targets[index].ui_container + Gets the render container used to draw user interface elements over a + particular render target. manager.machine.screens[tag].container Gets the render container used to draw a given screen. @@ -1145,10 +1152,16 @@ view.bounds (read-only) effective bounds of the view in its current configuration. The coordinates are in view units, which are arbitrary but assumed to have square aspect ratio. -view.has_art +view.has_art (read-only) A Boolean indicating whether the view has any non-screen items, including items that are not visible because the user has hidden the item collection that they belong to. +view.show_pointers (read/write) + A Boolean that sets whether mouse and pon pointers should be displayed for + the view. +view.hide_inactive_pointers (read/write) + A Boolean that sets whether mouse pointers for the view should be hidden + after a period of inactivity. .. _luascript-ref-renderlayitem: diff --git a/docs/source/techspecs/layout_files.rst b/docs/source/techspecs/layout_files.rst index 297521bf9454a..a014756a32b45 100644 --- a/docs/source/techspecs/layout_files.rst +++ b/docs/source/techspecs/layout_files.rst @@ -690,6 +690,11 @@ element. This means a view can reference elements and groups that appear after it in the file, and parameters from the enclosing scope will have their final values from the end of the ``mamelayout`` element. +A ``view`` element may have a ``showpointers`` attribute to set whether mouse +and pen pointers should be shown for the view. If present, the value must be +either ``yes`` or ``no``. If the ``showpointers`` attribute is not present, pen +and mouse pointers are shown for views that contain items bound to I/O ports. + The following child elements are allowed inside a ``view`` element: bounds diff --git a/scripts/build/complay.py b/scripts/build/complay.py index f0e330240a199..6519a01de0604 100755 --- a/scripts/build/complay.py +++ b/scripts/build/complay.py @@ -409,6 +409,7 @@ def layoutStartHandler(self, name, attrs): self.views[attrs['name']] = self.format_location() elif not self.VARPATTERN.match(attrs['name']): self.handle_error('Element view has duplicate name "%s" (previous %s)' % (attrs['name'], self.views[attrs['name']])) + self.check_bool_attribute(name, attrs, 'showpointers', None) self.handlers.append((self.groupViewStartHandler, self.groupViewEndHandler)) self.variable_scopes.append({ }) self.item_ids = { } diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index de17b5dae6f65..be5413f99ae81 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -4000,7 +4000,17 @@ layout_view::layout_view( , m_elemmap(elemmap) , m_defvismask(0U) , m_has_art(false) + , m_show_ptr(false) + , m_ptr_time_out(true) // FIXME: add attribute for this + , m_exp_show_ptr(-1) { + // check for explicit pointer display setting + if (viewnode.get_attribute_string_ptr("showpointers")) + { + m_show_ptr = env.get_attribute_bool(viewnode, "showpointers", false); + m_exp_show_ptr = m_show_ptr ? 1 : 0; + } + // parse the layout m_expbounds.x0 = m_expbounds.y0 = m_expbounds.x1 = m_expbounds.y1 = 0; view_environment local(env, m_name.c_str()); @@ -4178,6 +4188,7 @@ void layout_view::recompute(u32 visibility_mask, bool zoom_to_screen) // loop over items and filter by visibility mask bool first = true; bool scrfirst = true; + bool haveinput = false; for (item &curitem : m_items) { if ((visibility_mask & curitem.visibility_mask()) == curitem.visibility_mask()) @@ -4209,9 +4220,15 @@ void layout_view::recompute(u32 visibility_mask, bool zoom_to_screen) // accumulate interactive elements if (!curitem.clickthrough() || curitem.has_input()) m_interactive_items.emplace_back(curitem); + if (curitem.has_input()) + haveinput = true; } } + // if show pointers isn't explicitly, update it based on visible items + if (0 > m_exp_show_ptr) + m_show_ptr = haveinput; + // if we have an explicit bounds, override it if (m_expbounds.x1 > m_expbounds.x0) m_bounds = m_expbounds; @@ -4282,6 +4299,29 @@ void layout_view::recompute(u32 visibility_mask, bool zoom_to_screen) } +//------------------------------------------------- +// set_show_pointers - set whether pointers +// should be displayed +//------------------------------------------------- + +void layout_view::set_show_pointers(bool value) noexcept +{ + m_show_ptr = value; + m_exp_show_ptr = value ? 1 : 0; +} + + +//------------------------------------------------- +// set_pointers_time_out - set whether pointers +// should be hidden after inactivity +//------------------------------------------------- + +void layout_view::set_hide_inactive_pointers(bool value) noexcept +{ + m_ptr_time_out = value; +} + + //------------------------------------------------- // set_prepare_items_callback - set handler called // before adding items to render target diff --git a/src/emu/rendlay.h b/src/emu/rendlay.h index 7edeb4b40c5ce..23431e7fd92b7 100644 --- a/src/emu/rendlay.h +++ b/src/emu/rendlay.h @@ -527,6 +527,12 @@ class layout_view const visibility_toggle_vector &visibility_toggles() const { return m_vistoggles; } u32 default_visibility_mask() const { return m_defvismask; } bool has_art() const { return m_has_art; } + bool show_pointers() const { return m_show_ptr; } + bool hide_inactive_pointers() const { return m_ptr_time_out; } + + // setters + void set_show_pointers(bool value) noexcept; + void set_hide_inactive_pointers(bool value) noexcept ATTR_COLD; // set handlers void set_prepare_items_callback(prepare_items_delegate &&handler) ATTR_COLD; @@ -621,6 +627,9 @@ class layout_view render_bounds m_expbounds; // explicit bounds of the view u32 m_defvismask; // default visibility mask bool m_has_art; // true if the layout contains non-screen elements + bool m_show_ptr; // whether pointers should be displayed + bool m_ptr_time_out; // whether pointers should be hidden after inactivity + s8 m_exp_show_ptr; // explicitly configured pointer visibility }; diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index c97cc2988bc10..6aa2d3840ecf5 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -1502,7 +1502,6 @@ void lua_engine::initialize() game_driver_type["no_cocktail"] = sol::property([] (game_driver const &driver) { return (driver.flags & machine_flags::NO_COCKTAIL) != 0; }); game_driver_type["is_bios_root"] = sol::property([] (game_driver const &driver) { return (driver.flags & machine_flags::IS_BIOS_ROOT) != 0; }); game_driver_type["requires_artwork"] = sol::property([] (game_driver const &driver) { return (driver.flags & machine_flags::REQUIRES_ARTWORK) != 0; }); - game_driver_type["clickable_artwork"] = sol::property([] (game_driver const &driver) { return (driver.flags & machine_flags::CLICKABLE_ARTWORK) != 0; }); game_driver_type["unofficial"] = sol::property([] (game_driver const &driver) { return (driver.flags & machine_flags::UNOFFICIAL) != 0; }); game_driver_type["no_sound_hw"] = sol::property([] (game_driver const &driver) { return (driver.flags & machine_flags::NO_SOUND_HW) != 0; }); game_driver_type["mechanical"] = sol::property([] (game_driver const &driver) { return (driver.flags & machine_flags::MECHANICAL) != 0; }); diff --git a/src/frontend/mame/luaengine_render.cpp b/src/frontend/mame/luaengine_render.cpp index 3fd0bfdba109e..8f931f91dac7c 100644 --- a/src/frontend/mame/luaengine_render.cpp +++ b/src/frontend/mame/luaengine_render.cpp @@ -994,6 +994,8 @@ void lua_engine::initialize_render(sol::table &emu) layout_view_type["effective_aspect"] = sol::property(&layout_view::effective_aspect); layout_view_type["bounds"] = sol::property(&layout_view::bounds); layout_view_type["has_art"] = sol::property(&layout_view::has_art); + layout_view_type["show_pointers"] = sol::property(&layout_view::show_pointers, &layout_view::set_show_pointers); + layout_view_type["hide_inactive_pointers"] = sol::property(&layout_view::hide_inactive_pointers, &layout_view::set_hide_inactive_pointers); auto layout_view_item_type = sol().registry().new_usertype("layout_item", sol::no_constructor); @@ -1100,6 +1102,7 @@ void lua_engine::initialize_render(sol::table &emu) auto target_type = sol().registry().new_usertype("target", sol::no_constructor); + target_type["ui_container"] = sol::property(&render_target::ui_container); target_type["index"] = sol::property([] (render_target const &t) { return t.index() + 1; }); target_type["width"] = sol::property(&render_target::width); target_type["height"] = sol::property(&render_target::height); diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp index 7791aaff8d1f6..a5645e79ca840 100644 --- a/src/frontend/mame/ui/selmenu.cpp +++ b/src/frontend/mame/ui/selmenu.cpp @@ -4202,7 +4202,6 @@ void menu_select_launch::general_info(ui_system_info const *system, game_driver str << ((flags.machine_flags() & machine_flags::MECHANICAL) ? _("Mechanical System\tYes\n") : _("Mechanical System\tNo\n")); str << ((flags.machine_flags() & machine_flags::REQUIRES_ARTWORK) ? _("Requires Artwork\tYes\n") : _("Requires Artwork\tNo\n")); - str << ((flags.machine_flags() & machine_flags::CLICKABLE_ARTWORK) ? _("Requires Clickable Artwork\tYes\n") : _("Requires Clickable Artwork\tNo\n")); if (flags.machine_flags() & machine_flags::NO_COCKTAIL) str << _("Support Cocktail\tNo\n"); str << ((flags.machine_flags() & machine_flags::IS_BIOS_ROOT) ? _("System is BIOS\tYes\n") : _("System is BIOS\tNo\n")); diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index a9a4fd5ceedca..0c4af7b8ba526 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -38,6 +38,7 @@ #include "render.h" #include "cheat.h" #include "rendfont.h" +#include "rendlay.h" #include "romload.h" #include "screen.h" #include "speaker.h" @@ -165,7 +166,13 @@ enum class mame_ui_manager::ui_callback_type : int struct mame_ui_manager::active_pointer { - active_pointer(ui_event const &event) : target(event.target), type(event.pointer_type), ptrid(event.pointer_id), x(-1.0F), y(-1.0F) + active_pointer(ui_event const &event) + : target(event.target) + , updated(std::chrono::steady_clock::time_point::min()) + , type(event.pointer_type) + , ptrid(event.pointer_id) + , x(-1.0F) + , y(-1.0F) { } @@ -175,6 +182,7 @@ struct mame_ui_manager::active_pointer } render_target *target; + std::chrono::steady_clock::time_point updated; osd::ui_event_handler::pointer type; u16 ptrid; float x, y; @@ -198,8 +206,6 @@ mame_ui_manager::mame_ui_manager(running_machine &machine) , m_popup_text_end(0) , m_mouse_bitmap(32, 32) , m_mouse_arrow_texture(nullptr) - , m_mouse_show(false) - , m_update_pointers(false) , m_pointers_changed(false) , m_target_font_height(0) , m_has_warnings(false) @@ -240,7 +246,6 @@ void mame_ui_manager::init() return 0; })); m_non_char_keys_down = std::make_unique((std::size(non_char_keys) + 7) / 8); - m_mouse_show = machine().system().flags & machine_flags::CLICKABLE_ARTWORK ? true : false; // request notification callbacks machine().add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(&mame_ui_manager::frame_update, this)); @@ -733,7 +738,7 @@ bool mame_ui_manager::update_and_render(render_container &container) // display the internal pointers bool const pointer_update = m_pointers_changed; m_pointers_changed = false; - if (m_mouse_show || (is_menu_active() && machine().options().ui_mouse())) + if (!is_menu_active() || machine().options().ui_mouse()) { const float cursor_size = 0.6 * get_line_height(); for (auto const &pointer : m_display_pointers) @@ -1128,12 +1133,12 @@ void mame_ui_manager::process_ui_events() { if (osd::ui_event_handler::pointer::TOUCH != event.pointer_type) { - m_update_pointers = true; auto pos(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), std::make_pair(event.target, event.pointer_id))); if ((m_active_pointers.end() == pos) || (pos->target != event.target) || (pos->ptrid != event.pointer_id)) pos = m_active_pointers.emplace(pos, event); else assert(pos->type == event.pointer_type); + pos->updated = std::chrono::steady_clock::now(); event.target->map_point_container(event.pointer_x, event.pointer_y, *event.target->ui_container(), pos->x, pos->y); } @@ -1150,10 +1155,7 @@ void mame_ui_manager::process_ui_events() { auto const pos(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), std::make_pair(event.target, event.pointer_id))); if (m_active_pointers.end() != pos) - { - m_update_pointers = true; m_active_pointers.erase(pos); - } event.target->pointer_left( event.pointer_type, event.pointer_id, event.pointer_device, @@ -1168,10 +1170,7 @@ void mame_ui_manager::process_ui_events() { auto const pos(std::lower_bound(m_active_pointers.begin(), m_active_pointers.end(), std::make_pair(event.target, event.pointer_id))); if (m_active_pointers.end() != pos) - { - m_update_pointers = true; m_active_pointers.erase(pos); - } event.target->pointer_aborted( event.pointer_type, event.pointer_id, event.pointer_device, @@ -1379,15 +1378,20 @@ uint32_t mame_ui_manager::handler_ingame(render_container &container) // process UI events and update pointers if necessary process_ui_events(); - if (m_update_pointers) + display_pointer_vector pointers; + pointers.reserve(m_active_pointers.size()); + auto const now(std::chrono::steady_clock::now()); + for (auto const &pointer : m_active_pointers) { - display_pointer_vector pointers; - pointers.reserve(m_active_pointers.size()); - for (auto const &pointer : m_active_pointers) - pointers.emplace_back(display_pointer{ *pointer.target, pointer.type, pointer.x, pointer.y }); - set_pointers(pointers.begin(), pointers.end()); - m_update_pointers = false; + layout_view const &view(pointer.target->current_view()); + if (view.show_pointers()) + { + // TODO: make timeout configurable + if (!view.hide_inactive_pointers() || (osd::ui_event_handler::pointer::PEN == pointer.type) || ((now - pointer.updated) <= std::chrono::seconds(3))) + pointers.emplace_back(display_pointer{ *pointer.target, pointer.type, pointer.x, pointer.y }); + } } + set_pointers(pointers.begin(), pointers.end()); if (!ui_disabled) { @@ -2400,6 +2404,12 @@ bool mame_ui_manager::set_ui_event_handler(std::function &&handler) if (ui_callback_type::GENERAL != m_handler_callback_type) return false; + for (auto *target = machine().render().first_target(); target; target = target->next()) + { + if (!target->hidden()) + target->forget_pointers(); + } + set_handler( ui_callback_type::CUSTOM, handler_callback_func( diff --git a/src/frontend/mame/ui/ui.h b/src/frontend/mame/ui/ui.h index 231a6de15cb0a..d213d861f34c8 100644 --- a/src/frontend/mame/ui/ui.h +++ b/src/frontend/mame/ui/ui.h @@ -298,8 +298,6 @@ class mame_ui_manager : public ui_manager display_pointer_vector m_display_pointers; bitmap_argb32 m_mouse_bitmap; render_texture * m_mouse_arrow_texture; - bool m_mouse_show; - bool m_update_pointers; bool m_pointers_changed; ui_options m_ui_options; From 4980f881393e86d4de39f32b33ff1a98cd3f8f49 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sun, 14 Apr 2024 07:38:32 +1000 Subject: [PATCH 088/109] -emu/gamedrv.h: Got rid of the "clickable artwork" system flag. -formats/wavfile.cpp: Fixed a class memory access warning. --- src/emu/gamedrv.h | 10 ++- src/lib/formats/wavfile.cpp | 1 - src/mame/appliedconcepts/boris.cpp | 4 +- src/mame/appliedconcepts/borisdpl.cpp | 2 +- src/mame/appliedconcepts/ggm.cpp | 2 +- src/mame/appliedconcepts/prodigy.cpp | 2 +- src/mame/barcrest/mpu3.cpp | 2 +- src/mame/bfm/bfm_sc1.cpp | 2 +- src/mame/bfm/bfm_sc2.cpp | 2 +- src/mame/bfm/bfm_sc4.cpp | 2 +- src/mame/capcom/kenseim.cpp | 2 +- src/mame/casio/ctk551.cpp | 4 +- src/mame/casio/cz1.cpp | 4 +- src/mame/casio/cz101.cpp | 2 +- src/mame/casio/cz230s.cpp | 4 +- src/mame/chess/ave_arb.cpp | 4 +- src/mame/chess/cking_master.cpp | 2 +- src/mame/chess/cking_triomphe.cpp | 2 +- src/mame/chess/compuchess.cpp | 8 +-- src/mame/chess/conchess.cpp | 16 ++--- src/mame/chess/conic_cchess2.cpp | 2 +- src/mame/chess/regence.cpp | 2 +- src/mame/chess/tasc.cpp | 8 +-- src/mame/commodore/chessmate.cpp | 6 +- src/mame/cxg/chess2001.cpp | 2 +- src/mame/cxg/computachess.cpp | 4 +- src/mame/cxg/dominator.cpp | 10 +-- src/mame/cxg/professor.cpp | 2 +- src/mame/cxg/senterprise.cpp | 4 +- src/mame/cxg/sphinx40.cpp | 2 +- src/mame/ddr/chessmst.cpp | 4 +- src/mame/ddr/chessmstdm.cpp | 2 +- src/mame/ddr/sc2.cpp | 4 +- src/mame/ddr/sprachmg.cpp | 2 +- src/mame/elektor/avrmax.cpp | 8 +-- src/mame/excalibur/igor.cpp | 2 +- src/mame/excalibur/ivant.cpp | 2 +- src/mame/excalibur/mirage.cpp | 2 +- src/mame/fidelity/as12.cpp | 10 +-- src/mame/fidelity/bridgeb.cpp | 2 +- src/mame/fidelity/card.cpp | 10 +-- src/mame/fidelity/cc1.cpp | 6 +- src/mame/fidelity/cc10.cpp | 6 +- src/mame/fidelity/cc7.cpp | 6 +- src/mame/fidelity/checkc2.cpp | 2 +- src/mame/fidelity/chesster.cpp | 8 +-- src/mame/fidelity/csc.cpp | 10 +-- src/mame/fidelity/dames.cpp | 2 +- src/mame/fidelity/desdis.cpp | 12 ++-- src/mame/fidelity/eag68k.cpp | 42 ++++++------ src/mame/fidelity/eldorado.cpp | 2 +- src/mame/fidelity/elite.cpp | 38 +++++------ src/mame/fidelity/excel.cpp | 24 +++---- src/mame/fidelity/msc.cpp | 2 +- src/mame/fidelity/phantom.cpp | 4 +- src/mame/fidelity/sc12.cpp | 4 +- src/mame/fidelity/sc6.cpp | 6 +- src/mame/fidelity/sc8.cpp | 2 +- src/mame/fidelity/sc9.cpp | 8 +-- src/mame/fidelity/vcc.cpp | 6 +- src/mame/fidelity/vsc.cpp | 2 +- src/mame/handheld/hh_cop400.cpp | 16 ++--- src/mame/handheld/hh_mn1400.cpp | 4 +- src/mame/handheld/hh_pic16.cpp | 12 ++-- src/mame/handheld/hh_tms1k.cpp | 78 +++++++++++------------ src/mame/handheld/hh_ucom4.cpp | 6 +- src/mame/hegenerglaser/academy.cpp | 12 ++-- src/mame/hegenerglaser/amsterdam.cpp | 12 ++-- src/mame/hegenerglaser/berlin.cpp | 10 +-- src/mame/hegenerglaser/brikett.cpp | 20 +++--- src/mame/hegenerglaser/europa.cpp | 2 +- src/mame/hegenerglaser/glasgow.cpp | 8 +-- src/mame/hegenerglaser/milano.cpp | 6 +- src/mame/hegenerglaser/mm1.cpp | 6 +- src/mame/hegenerglaser/mm2.cpp | 48 +++++++------- src/mame/hegenerglaser/modena.cpp | 6 +- src/mame/hegenerglaser/modular.cpp | 32 +++++----- src/mame/hegenerglaser/modular_tm.cpp | 16 ++--- src/mame/hegenerglaser/mondial.cpp | 2 +- src/mame/hegenerglaser/mondial2.cpp | 2 +- src/mame/hegenerglaser/mondial68k.cpp | 2 +- src/mame/hegenerglaser/montec.cpp | 8 +-- src/mame/hegenerglaser/polgar.cpp | 8 +-- src/mame/hegenerglaser/risc.cpp | 4 +- src/mame/hegenerglaser/roma2.cpp | 4 +- src/mame/hegenerglaser/smondial.cpp | 12 ++-- src/mame/igt/peplus.cpp | 32 +++++----- src/mame/intel/intellec4.cpp | 4 +- src/mame/jpm/jpmimpctsw.cpp | 6 +- src/mame/jpm/jpmsys5sw.cpp | 2 +- src/mame/mattel/chess.cpp | 2 +- src/mame/maygay/maygay1bsw.cpp | 2 +- src/mame/miltonbradley/milton6805.cpp | 2 +- src/mame/misc/ltcasino.cpp | 8 +-- src/mame/misc/rulechan.cpp | 6 +- src/mame/misc/trvmadns.cpp | 4 +- src/mame/namco/30test.cpp | 2 +- src/mame/namco/cgang.cpp | 2 +- src/mame/namco/wacky_gator.cpp | 2 +- src/mame/novag/accord.cpp | 2 +- src/mame/novag/cexpert.cpp | 2 +- src/mame/novag/cforte.cpp | 4 +- src/mame/novag/const.cpp | 12 ++-- src/mame/novag/constjr.cpp | 2 +- src/mame/novag/diablo.cpp | 6 +- src/mame/novag/mentor16.cpp | 2 +- src/mame/novag/micro.cpp | 2 +- src/mame/novag/micro2.cpp | 2 +- src/mame/novag/primo.cpp | 8 +-- src/mame/novag/robotadv.cpp | 2 +- src/mame/novag/savant.cpp | 4 +- src/mame/novag/sdiamond.cpp | 2 +- src/mame/novag/sexpert.cpp | 28 ++++---- src/mame/novag/vip.cpp | 10 +-- src/mame/saitek/chessac.cpp | 4 +- src/mame/saitek/chesstrv.cpp | 4 +- src/mame/saitek/companion.cpp | 2 +- src/mame/saitek/companion2.cpp | 6 +- src/mame/saitek/corona.cpp | 6 +- src/mame/saitek/cp2000.cpp | 2 +- src/mame/saitek/delta1.cpp | 2 +- src/mame/saitek/ecbackg.cpp | 2 +- src/mame/saitek/edames.cpp | 2 +- src/mame/saitek/exechess.cpp | 2 +- src/mame/saitek/gk2000.cpp | 2 +- src/mame/saitek/intchess.cpp | 2 +- src/mame/saitek/leonardo.cpp | 8 +-- src/mame/saitek/mark5.cpp | 4 +- src/mame/saitek/minichess.cpp | 2 +- src/mame/saitek/prisma.cpp | 2 +- src/mame/saitek/prschess.cpp | 2 +- src/mame/saitek/renaissance.cpp | 4 +- src/mame/saitek/risc2500.cpp | 6 +- src/mame/saitek/schess.cpp | 2 +- src/mame/saitek/simultano.cpp | 6 +- src/mame/saitek/ssystem3.cpp | 4 +- src/mame/saitek/stratos.cpp | 10 +-- src/mame/saitek/superstar.cpp | 8 +-- src/mame/saitek/turbo16k.cpp | 10 +-- src/mame/saitek/turbos24k.cpp | 2 +- src/mame/seta/seta.cpp | 12 ++-- src/mame/ti/snspellc.cpp | 8 +-- src/mame/tiger/gamecom.cpp | 2 +- src/mame/tiger/pylo.cpp | 2 +- src/mame/tryom/chess.cpp | 2 +- src/mame/tryom/gammonm.cpp | 2 +- src/mame/tryom/omar.cpp | 4 +- src/mame/tvgames/spg2xx_senario_poker.cpp | 6 +- src/mame/ussr/debut.cpp | 2 +- src/mame/ussr/im01.cpp | 6 +- src/mame/ussr/intellect02.cpp | 2 +- src/mame/verifone/tranz330.cpp | 2 +- src/mame/virtual/vgmplay.cpp | 2 +- src/mame/votrax/votrhv.cpp | 2 +- src/mame/westinghouse/testconsole.cpp | 2 +- src/mame/yamaha/ymdx9.cpp | 2 +- src/mame/yamaha/ympsr150.cpp | 22 +++---- src/mame/yamaha/ympsr60.cpp | 4 +- src/mame/yamaha/ymtx81z.cpp | 2 +- src/mame/yeno/301xl.cpp | 2 +- src/mame/yeno/416xl.cpp | 2 +- src/mame/yeno/532xl.cpp | 2 +- 162 files changed, 526 insertions(+), 529 deletions(-) diff --git a/src/emu/gamedrv.h b/src/emu/gamedrv.h index 4f0050e2a198e..6ab934bc53f8a 100644 --- a/src/emu/gamedrv.h +++ b/src/emu/gamedrv.h @@ -45,11 +45,10 @@ struct machine_flags NO_COCKTAIL = 0x0000'0100, // screen flip support is missing IS_BIOS_ROOT = 0x0000'0200, // this driver entry is a BIOS root REQUIRES_ARTWORK = 0x0000'0400, // requires external artwork for key game elements - CLICKABLE_ARTWORK = 0x0000'0800, // artwork is clickable and requires mouse cursor - UNOFFICIAL = 0x0000'1000, // unofficial hardware modification - NO_SOUND_HW = 0x0000'2000, // system has no sound output - MECHANICAL = 0x0000'4000, // contains mechanical parts (pinball, redemption games, ...) - IS_INCOMPLETE = 0x0000'8000 // official system with blatantly incomplete hardware/software + UNOFFICIAL = 0x0000'0800, // unofficial hardware modification + NO_SOUND_HW = 0x0000'1000, // system has no sound output + MECHANICAL = 0x0000'2000, // contains mechanical parts (pinball, redemption games, ...) + IS_INCOMPLETE = 0x0000'4000 // official system with blatantly incomplete hardware/software }; }; @@ -71,7 +70,6 @@ constexpr u64 MACHINE_SUPPORTS_SAVE = machine_flags::SUPPORTS_SAVE; constexpr u64 MACHINE_NO_COCKTAIL = machine_flags::NO_COCKTAIL; ///< The system supports screen flipping for use in a cocktail cabinet, but this feature is not properly emulated constexpr u64 MACHINE_IS_BIOS_ROOT = machine_flags::IS_BIOS_ROOT; ///< The system represents an empty system board of some kind - clones are treated as separate systems rather than variants constexpr u64 MACHINE_REQUIRES_ARTWORK = machine_flags::REQUIRES_ARTWORK; ///< The system requires external artwork for key functionality -constexpr u64 MACHINE_CLICKABLE_ARTWORK = machine_flags::CLICKABLE_ARTWORK; ///< Enables pointer display for the system to facilitate using clickable artwork constexpr u64 MACHINE_UNOFFICIAL = machine_flags::UNOFFICIAL; ///< The system represents an after-market or end-user modification to a system constexpr u64 MACHINE_NO_SOUND_HW = machine_flags::NO_SOUND_HW; ///< The system has no sound output capability constexpr u64 MACHINE_MECHANICAL = machine_flags::MECHANICAL; ///< The system depends on mechanical features for key functionality diff --git a/src/lib/formats/wavfile.cpp b/src/lib/formats/wavfile.cpp index e410c7f9ff9d4..6cce494f1c8af 100644 --- a/src/lib/formats/wavfile.cpp +++ b/src/lib/formats/wavfile.cpp @@ -170,7 +170,6 @@ static cassette_image::error wavfile_identify(cassette_image *cassette, cassette static cassette_image::error wavfile_load(cassette_image *cassette) { cassette_image::Options opts; - memset(&opts, 0, sizeof(opts)); return wavfile_process(cassette, &opts, true); } diff --git a/src/mame/appliedconcepts/boris.cpp b/src/mame/appliedconcepts/boris.cpp index 9135bcb280cb2..01492cbdd4472 100644 --- a/src/mame/appliedconcepts/boris.cpp +++ b/src/mame/appliedconcepts/boris.cpp @@ -244,5 +244,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1978, boris, 0, 0, boris, boris, boris_state, empty_init, "Applied Concepts", "Boris (rev. 01)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) // "Boris awaits your move" -SYST( 1978, borisa, boris, 0, boris, boris, boris_state, empty_init, "Applied Concepts", "Boris (rev. 00)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) // "Boris plays black" +SYST( 1978, boris, 0, 0, boris, boris, boris_state, empty_init, "Applied Concepts", "Boris (rev. 01)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // "Boris awaits your move" +SYST( 1978, borisa, boris, 0, boris, boris, boris_state, empty_init, "Applied Concepts", "Boris (rev. 00)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // "Boris plays black" diff --git a/src/mame/appliedconcepts/borisdpl.cpp b/src/mame/appliedconcepts/borisdpl.cpp index 5547b710c0f1f..ddec5fbb3fb76 100644 --- a/src/mame/appliedconcepts/borisdpl.cpp +++ b/src/mame/appliedconcepts/borisdpl.cpp @@ -222,4 +222,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, borisdpl, 0, 0, borisdpl, borisdpl, borisdpl_state, empty_init, "Applied Concepts", "Boris Diplomat", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, borisdpl, 0, 0, borisdpl, borisdpl, borisdpl_state, empty_init, "Applied Concepts", "Boris Diplomat", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/appliedconcepts/ggm.cpp b/src/mame/appliedconcepts/ggm.cpp index 5451f8dcd8c96..f125bf2117d3d 100644 --- a/src/mame/appliedconcepts/ggm.cpp +++ b/src/mame/appliedconcepts/ggm.cpp @@ -616,4 +616,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, ggm, 0, 0, ggm, ggm, ggm_state, empty_init, "Applied Concepts", "Great Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, ggm, 0, 0, ggm, ggm, ggm_state, empty_init, "Applied Concepts", "Great Game Machine", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/appliedconcepts/prodigy.cpp b/src/mame/appliedconcepts/prodigy.cpp index ef44c9f74517b..cc7b7027d6d01 100644 --- a/src/mame/appliedconcepts/prodigy.cpp +++ b/src/mame/appliedconcepts/prodigy.cpp @@ -304,4 +304,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, prodigy, 0, 0, prodigy, prodigy, prodigy_state, empty_init, "Applied Concepts", "Destiny Prodigy", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1982, prodigy, 0, 0, prodigy, prodigy, prodigy_state, empty_init, "Applied Concepts", "Destiny Prodigy", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/barcrest/mpu3.cpp b/src/mame/barcrest/mpu3.cpp index 851a242ecb851..578d4ec0444c1 100644 --- a/src/mame/barcrest/mpu3.cpp +++ b/src/mame/barcrest/mpu3.cpp @@ -1571,7 +1571,7 @@ ROM_END // search for cmpa (x+$01) in trace logs to find protection accesses -#define GAME_FLAGS MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL|MACHINE_CLICKABLE_ARTWORK +#define GAME_FLAGS MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL diff --git a/src/mame/bfm/bfm_sc1.cpp b/src/mame/bfm/bfm_sc1.cpp index 4d8c0c42b9de0..a0ae86a6865c8 100644 --- a/src/mame/bfm/bfm_sc1.cpp +++ b/src/mame/bfm/bfm_sc1.cpp @@ -2615,7 +2615,7 @@ ROM_END ///////////////////////////////////////////////////////////////////////////////////// -#define GAME_FLAGS MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL|MACHINE_CLICKABLE_ARTWORK +#define GAME_FLAGS MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL //Adder 2 GAME( 1996, m_tppokr, 0, scorpion1_adder2, toppoker, bfm_sc1_state, init_toppoker, 0, "BFM/ELAM", "Top Poker (Dutch, Game Card 95-750-899)", MACHINE_SUPPORTS_SAVE|MACHINE_NOT_WORKING ) diff --git a/src/mame/bfm/bfm_sc2.cpp b/src/mame/bfm/bfm_sc2.cpp index 67f8dac3b046e..321dec54c329b 100644 --- a/src/mame/bfm/bfm_sc2.cpp +++ b/src/mame/bfm/bfm_sc2.cpp @@ -8595,7 +8595,7 @@ ROM_END /* Video Based (Adder 2) */ -#define GAME_FLAGS MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL|MACHINE_CLICKABLE_ARTWORK +#define GAME_FLAGS MACHINE_SUPPORTS_SAVE|MACHINE_REQUIRES_ARTWORK|MACHINE_NOT_WORKING|MACHINE_MECHANICAL GAMEL( 1993, quintoon, 0, scorpion2_vidm, quintoon, bfm_sc2_vid_state, init_quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-750-206)", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND,layout_quintoon ) //Current samples need verification GAMEL( 1993, quintond, quintoon, scorpion2_vidm, quintoon, bfm_sc2_vid_state, init_quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-751-206, Datapak)", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING,layout_quintoon ) //Current samples need verification diff --git a/src/mame/bfm/bfm_sc4.cpp b/src/mame/bfm/bfm_sc4.cpp index f6a4f679d7ad8..c3ea24d9b0b9c 100644 --- a/src/mame/bfm/bfm_sc4.cpp +++ b/src/mame/bfm/bfm_sc4.cpp @@ -1739,7 +1739,7 @@ INPUT_PORTS_START( sc4_base ) // just some fairly generic defaults we map to gam PORT_DIPSETTING( 0x0010, DEF_STR( On ) ) INPUT_PORTS_END -#define MACHINE_FLAGS MACHINE_NOT_WORKING|MACHINE_CLICKABLE_ARTWORK +#define MACHINE_FLAGS MACHINE_NOT_WORKING #define MACHINE_FLAGS_NOSOUND MACHINE_FLAGS|MACHINE_NO_SOUND bool compare_mbus(uint16_t* rom) diff --git a/src/mame/capcom/kenseim.cpp b/src/mame/capcom/kenseim.cpp index 4b6e20c9b0d27..fdfa8d119b2f3 100644 --- a/src/mame/capcom/kenseim.cpp +++ b/src/mame/capcom/kenseim.cpp @@ -715,4 +715,4 @@ void kenseim_state::init_kenseim() // 1994.04.18 is from extra PCB rom, Siguma or Sigma? (Siguma is in the ROM) // the CPS1 board roms contain "M O G U R A 9 2 0 9 2 4" strings suggesting that part of the code was developed earlier -GAMEL( 1994, kenseim, 0, kenseim, kenseim, kenseim_state, init_kenseim, ROT0, "Capcom / Togo / Sigma", "Ken Sei Mogura: Street Fighter II (Japan 940418, Ver 1.00)", MACHINE_CLICKABLE_ARTWORK, layout_kenseim ) +GAMEL( 1994, kenseim, 0, kenseim, kenseim, kenseim_state, init_kenseim, ROT0, "Capcom / Togo / Sigma", "Ken Sei Mogura: Street Fighter II (Japan 940418, Ver 1.00)", 0, layout_kenseim ) diff --git a/src/mame/casio/ctk551.cpp b/src/mame/casio/ctk551.cpp index 39fd45ae9a88b..d0514dbf2d169 100644 --- a/src/mame/casio/ctk551.cpp +++ b/src/mame/casio/ctk551.cpp @@ -1236,8 +1236,8 @@ void ctk551_state::init_gz70sp() // models with MACHINE_IMPERFECT_SOUND are missing DSP emulation // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -SYST( 1995, ap10, 0, 0, ap10, ap10, ctk551_state, init_ap10, "Casio", "Celviano AP-10", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) -SYST( 1995, ctk530, 0, 0, ctk530, ctk530, ctk551_state, init_ctk530, "Casio", "CTK-530", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1995, ap10, 0, 0, ap10, ap10, ctk551_state, init_ap10, "Casio", "Celviano AP-10", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +SYST( 1995, ctk530, 0, 0, ctk530, ctk530, ctk551_state, init_ctk530, "Casio", "CTK-530", MACHINE_SUPPORTS_SAVE ) SYST( 1996, gz70sp, 0, 0, gz70sp, gz70sp, ctk551_state, init_gz70sp, "Casio", "GZ-70SP", MACHINE_SUPPORTS_SAVE ) SYST( 1997, ctk601, 0, 0, ctk601, ctk601, ctk551_state, empty_init, "Casio", "CTK-601", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) SYST( 2000, ctk551, 0, 0, ctk551, ctk551, ctk551_state, empty_init, "Casio", "CTK-551", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/casio/cz1.cpp b/src/mame/casio/cz1.cpp index 60c4ea80d116c..204ded1690338 100644 --- a/src/mame/casio/cz1.cpp +++ b/src/mame/casio/cz1.cpp @@ -946,5 +946,5 @@ ROM_END //************************************************************************** // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -SYST( 1986, cz1, 0, 0, cz1, cz1, cz1_state, empty_init, "Casio", "CZ-1", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) -SYST( 1986, mz1, cz1, 0, mz1, mz1, cz1_state, empty_init, "Casio", "MZ-1 (prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) +SYST( 1986, cz1, 0, 0, cz1, cz1, cz1_state, empty_init, "Casio", "CZ-1", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +SYST( 1986, mz1, cz1, 0, mz1, mz1, cz1_state, empty_init, "Casio", "MZ-1 (prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/casio/cz101.cpp b/src/mame/casio/cz101.cpp index 7ba4293d92679..15dbd8d331025 100644 --- a/src/mame/casio/cz101.cpp +++ b/src/mame/casio/cz101.cpp @@ -522,4 +522,4 @@ ROM_END //************************************************************************** // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -CONS( 1984, cz101, 0, 0, cz101, cz101, cz101_state, empty_init, "Casio", "CZ-101", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1984, cz101, 0, 0, cz101, cz101, cz101_state, empty_init, "Casio", "CZ-101", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/casio/cz230s.cpp b/src/mame/casio/cz230s.cpp index e376bb3c46ab5..0a695e6495e96 100644 --- a/src/mame/casio/cz230s.cpp +++ b/src/mame/casio/cz230s.cpp @@ -690,5 +690,5 @@ ROM_END //************************************************************************** // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -SYST( 1985, cz230s, 0, 0, cz230s, cz230s, cz230s_state, empty_init, "Casio", "CZ-230S", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, sz1, 0, 0, sz1, sz1, cz230s_state, empty_init, "Casio", "SZ-1", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, cz230s, 0, 0, cz230s, cz230s, cz230s_state, empty_init, "Casio", "CZ-230S", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, sz1, 0, 0, sz1, sz1, cz230s_state, empty_init, "Casio", "SZ-1", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/chess/ave_arb.cpp b/src/mame/chess/ave_arb.cpp index 26671921a7896..105f145ff7285 100644 --- a/src/mame/chess/ave_arb.cpp +++ b/src/mame/chess/ave_arb.cpp @@ -353,5 +353,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, arb, 0, 0, arb, arb, arb_state, empty_init, "AVE Micro Systems", "Auto Response Board", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 2012, arbv2, arb, 0, v2, arb, arb_state, empty_init, "hack (Steve Braid)", "ARB V2 Sargon 4.0", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, arb, 0, 0, arb, arb, arb_state, empty_init, "AVE Micro Systems", "Auto Response Board", MACHINE_SUPPORTS_SAVE ) +SYST( 2012, arbv2, arb, 0, v2, arb, arb_state, empty_init, "hack (Steve Braid)", "ARB V2 Sargon 4.0", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/chess/cking_master.cpp b/src/mame/chess/cking_master.cpp index 1bba074fe470e..a65e45699f356 100644 --- a/src/mame/chess/cking_master.cpp +++ b/src/mame/chess/cking_master.cpp @@ -262,4 +262,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1983, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King / Intelligent Software", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King / Intelligent Software", "Master (Chess King)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/chess/cking_triomphe.cpp b/src/mame/chess/cking_triomphe.cpp index b5ae9313784f1..2d251ec0024d9 100644 --- a/src/mame/chess/cking_triomphe.cpp +++ b/src/mame/chess/cking_triomphe.cpp @@ -186,4 +186,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1985, triomphe, 0, 0, triomphe, triomphe, triomphe_state, empty_init, "Chess King / Intelligent Software", "Triomphe", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, triomphe, 0, 0, triomphe, triomphe, triomphe_state, empty_init, "Chess King / Intelligent Software", "Triomphe", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/chess/compuchess.cpp b/src/mame/chess/compuchess.cpp index aaad3e04be1d4..b5044b5095492 100644 --- a/src/mame/chess/compuchess.cpp +++ b/src/mame/chess/compuchess.cpp @@ -502,9 +502,9 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1977, cmpchess, 0, 0, cmpchess, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka CompuChess I -SYST( 1978, cmpchess2, 0, 0, cmpchess2, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess: The Second Edition", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1977, cmpchess, 0, 0, cmpchess, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) // aka CompuChess I +SYST( 1978, cmpchess2, 0, 0, cmpchess2, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess: The Second Edition", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) -SYST( 1978, ccmk1, cmpchess, 0, mk1, mk1, cmpchess_state, empty_init, "bootleg (Novag Industries)", "Chess Champion: MK I", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1978, ccmk1, cmpchess, 0, mk1, mk1, cmpchess_state, empty_init, "bootleg (Novag Industries)", "Chess Champion: MK I", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) -SYST( 1979, cncchess, 0, 0, cncchess, cncchess, cmpchess_state, empty_init, "Conic", "Computer Chess (Conic, model 7011)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, cncchess, 0, 0, cncchess, cncchess, cmpchess_state, empty_init, "Conic", "Computer Chess (Conic, model 7011)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/chess/conchess.cpp b/src/mame/chess/conchess.cpp index ba5af49a26c00..d3c1421004c31 100644 --- a/src/mame/chess/conchess.cpp +++ b/src/mame/chess/conchess.cpp @@ -376,14 +376,14 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, conc, 0, 0, conc, conchess, conchess_state, empty_init, "Consumenta Computer / Loproc", "Conchess (standard, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, conca, conc, 0, conc, conchess, conchess_state, empty_init, "Consumenta Computer / Loproc", "Conchess (standard, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1982, conc, 0, 0, conc, conchess, conchess_state, empty_init, "Consumenta Computer / Loproc", "Conchess (standard, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, conca, conc, 0, conc, conchess, conchess_state, empty_init, "Consumenta Computer / Loproc", "Conchess (standard, set 2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1984, concgla, 0, 0, concgla, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Princhess Glasgow", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, concglap, 0, 0, concgla, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Glasgow Plus (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, concglapa, concglap, 0, concgla, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Glasgow Plus (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1984, concgla, 0, 0, concgla, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Princhess Glasgow", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, concglap, 0, 0, concgla, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Glasgow Plus (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, concglapa, concglap, 0, concgla, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Glasgow Plus (set 2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1985, concams, 0, 0, concams, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Amsterdam", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, concams5, concams, 0, concams5, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Amsterdam 5.5MHz", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, concams, 0, 0, concams, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Amsterdam", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, concams5, concams, 0, concams5, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Amsterdam 5.5MHz", MACHINE_SUPPORTS_SAVE ) -SYST( 1990, concvicp, 0, 0, concvicp, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Victoria (prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, concvicp, 0, 0, concvicp, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Victoria (prototype)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/chess/conic_cchess2.cpp b/src/mame/chess/conic_cchess2.cpp index e7bae4932667a..b94c3a00b7bc9 100644 --- a/src/mame/chess/conic_cchess2.cpp +++ b/src/mame/chess/conic_cchess2.cpp @@ -282,4 +282,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, cncchess2, 0, 0, cncchess2, cncchess2, cchess2_state, empty_init, "Conic", "Computer Chess (Conic, model 7012)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, cncchess2, 0, 0, cncchess2, cncchess2, cchess2_state, empty_init, "Conic", "Computer Chess (Conic, model 7012)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/chess/regence.cpp b/src/mame/chess/regence.cpp index 81ba20752f892..eaa7867c74069 100644 --- a/src/mame/chess/regence.cpp +++ b/src/mame/chess/regence.cpp @@ -248,4 +248,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, regence, 0, 0, regence, regence, regence_state, empty_init, "France Double R / Intelligent Software", u8"La Régence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1982, regence, 0, 0, regence, regence, regence_state, empty_init, "France Double R / Intelligent Software", u8"La Régence", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/chess/tasc.cpp b/src/mame/chess/tasc.cpp index 52b410b0738ca..b7904cce00307 100644 --- a/src/mame/chess/tasc.cpp +++ b/src/mame/chess/tasc.cpp @@ -371,7 +371,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1995, tascr30, 0, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.50)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1993, tascr30a, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.20)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1993, tascr30b, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.23, TM version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) // competed in several chesscomputer tournaments -SYST( 1993, tascr30g, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (Gideon 3.1, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) // made in 1993, later released in 2012 +SYST( 1995, tascr30, 0, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.50)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) +SYST( 1993, tascr30a, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.20)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) +SYST( 1993, tascr30b, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.23, TM version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // competed in several chesscomputer tournaments +SYST( 1993, tascr30g, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (Gideon 3.1, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // made in 1993, later released in 2012 diff --git a/src/mame/commodore/chessmate.cpp b/src/mame/commodore/chessmate.cpp index 59d647d58023e..36f79c377830d 100644 --- a/src/mame/commodore/chessmate.cpp +++ b/src/mame/commodore/chessmate.cpp @@ -318,7 +318,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1978, chmate, 0, 0, chmate, chmate, chmate_state, empty_init, "Commodore", "Chessmate", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1978, chmate, 0, 0, chmate, chmate, chmate_state, empty_init, "Commodore", "Chessmate", MACHINE_SUPPORTS_SAVE ) -SYST( 1979, ccmk2, chmate, 0, mk2, mk2, chmate_state, empty_init, "Novag Industries", "Chess Champion: MK II (ver. 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 1st version (jukebox model), aka version B -SYST( 1979, ccmk2a, chmate, 0, mk2a, mk2a, chmate_state, empty_init, "Novag Industries", "Chess Champion: MK II (ver. 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, ccmk2, chmate, 0, mk2, mk2, chmate_state, empty_init, "Novag Industries", "Chess Champion: MK II (ver. 1)", MACHINE_SUPPORTS_SAVE ) // 1st version (jukebox model), aka version B +SYST( 1979, ccmk2a, chmate, 0, mk2a, mk2a, chmate_state, empty_init, "Novag Industries", "Chess Champion: MK II (ver. 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/cxg/chess2001.cpp b/src/mame/cxg/chess2001.cpp index c7c27db56d63f..f7fd605bdcf42 100644 --- a/src/mame/cxg/chess2001.cpp +++ b/src/mame/cxg/chess2001.cpp @@ -215,4 +215,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1984, ch2001, 0, 0, chess2001, chess2001, chess2001_state, empty_init, "CXG Systems / Newcrest Technology / Intelligent Software", "Chess 2001", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1984, ch2001, 0, 0, chess2001, chess2001, chess2001_state, empty_init, "CXG Systems / Newcrest Technology / Intelligent Software", "Chess 2001", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/cxg/computachess.cpp b/src/mame/cxg/computachess.cpp index 413e8232084b7..c4400fcb269f6 100644 --- a/src/mame/cxg/computachess.cpp +++ b/src/mame/cxg/computachess.cpp @@ -243,5 +243,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, scptchess, 0, 0, scptchess, scptchess, computachess_state, empty_init, "CXG Systems / White & Allcock / Intelligent Software", "Sensor Computachess (1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, scptchessa, scptchess, 0, scptchessa, scptchessa, computachess_state, empty_init, "CXG Systems / Newcrest Technology / Intelligent Software", "Sensor Computachess (1985 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, scptchess, 0, 0, scptchess, scptchess, computachess_state, empty_init, "CXG Systems / White & Allcock / Intelligent Software", "Sensor Computachess (1981 version)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, scptchessa, scptchess, 0, scptchessa, scptchessa, computachess_state, empty_init, "CXG Systems / Newcrest Technology / Intelligent Software", "Sensor Computachess (1985 version)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/cxg/dominator.cpp b/src/mame/cxg/dominator.cpp index b39c8301e8849..9442438ea63ee 100644 --- a/src/mame/cxg/dominator.cpp +++ b/src/mame/cxg/dominator.cpp @@ -341,10 +341,10 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, sdtor, 0, 0, dominator, dominator, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Dominator (v2.05)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, sdtor, 0, 0, dominator, dominator, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Dominator (v2.05)", MACHINE_SUPPORTS_SAVE ) -SYST( 1988, sgalaxy, 0, 0, galaxy, galaxy, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Galaxy (v2.03)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, sgalaxya, sgalaxy, 0, galaxy, galaxy, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Galaxy (v2.00)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, sgalaxyb, sgalaxy, 0, galaxy, galaxy, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Galaxy (v1.03)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, sgalaxy, 0, 0, galaxy, galaxy, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Galaxy (v2.03)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, sgalaxya, sgalaxy, 0, galaxy, galaxy, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Galaxy (v2.00)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, sgalaxyb, sgalaxy, 0, galaxy, galaxy, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Galaxy (v1.03)", MACHINE_SUPPORTS_SAVE ) -SYST( 1989, scmder, 0, 0, commander, commander, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Commander (v2.00)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, scmder, 0, 0, commander, commander, dominator_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Commander (v2.00)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/cxg/professor.cpp b/src/mame/cxg/professor.cpp index f35f1e155ec44..6ab0a4b04c2fa 100644 --- a/src/mame/cxg/professor.cpp +++ b/src/mame/cxg/professor.cpp @@ -252,4 +252,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, scprof, 0, 0, professor, professor, professor_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Chess Professor", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, scprof, 0, 0, professor, professor, professor_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx Chess Professor", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/cxg/senterprise.cpp b/src/mame/cxg/senterprise.cpp index 9dfba4e426942..2ba9e82c98b3b 100644 --- a/src/mame/cxg/senterprise.cpp +++ b/src/mame/cxg/senterprise.cpp @@ -395,5 +395,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, senterp, 0, 0, senterp, senterp, senterp_state, empty_init, "CXG Systems / Newcrest Technology", "Super Enterprise (model 210)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, senterpc, senterp, 0, senterpc, senterpc, senterpc_state, empty_init, "CXG Systems / Newcrest Technology", "Super Enterprise (model 210.C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, senterp, 0, 0, senterp, senterp, senterp_state, empty_init, "CXG Systems / Newcrest Technology", "Super Enterprise (model 210)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, senterpc, senterp, 0, senterpc, senterpc, senterpc_state, empty_init, "CXG Systems / Newcrest Technology", "Super Enterprise (model 210.C)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/cxg/sphinx40.cpp b/src/mame/cxg/sphinx40.cpp index f048dd00afd8a..143750c8361c7 100644 --- a/src/mame/cxg/sphinx40.cpp +++ b/src/mame/cxg/sphinx40.cpp @@ -324,4 +324,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, sphinx40, 0, 0, sphinx40, sphinx40, sphinx40_state, empty_init, "CXG Systems / Newcrest Technology / Intelligent Software", "Sphinx 40", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, sphinx40, 0, 0, sphinx40, sphinx40, sphinx40_state, empty_init, "CXG Systems / Newcrest Technology / Intelligent Software", "Sphinx 40", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/ddr/chessmst.cpp b/src/mame/ddr/chessmst.cpp index 8205599a7aeba..a4e5a93a34c64 100644 --- a/src/mame/ddr/chessmst.cpp +++ b/src/mame/ddr/chessmst.cpp @@ -297,5 +297,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -SYST( 1984, chessmst, 0, 0, chessmst, chessmst, chessmst_state, empty_init, "VEB Mikroelektronik \"Karl Marx\" Erfurt", "Chess-Master (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, chessmsta, chessmst, 0, chessmsta, chessmst, chessmst_state, empty_init, "VEB Mikroelektronik \"Karl Marx\" Erfurt", "Chess-Master (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1984, chessmst, 0, 0, chessmst, chessmst, chessmst_state, empty_init, "VEB Mikroelektronik \"Karl Marx\" Erfurt", "Chess-Master (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, chessmsta, chessmst, 0, chessmsta, chessmst, chessmst_state, empty_init, "VEB Mikroelektronik \"Karl Marx\" Erfurt", "Chess-Master (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) diff --git a/src/mame/ddr/chessmstdm.cpp b/src/mame/ddr/chessmstdm.cpp index a6fb1462fe6f1..92b6e2778f27f 100644 --- a/src/mame/ddr/chessmstdm.cpp +++ b/src/mame/ddr/chessmstdm.cpp @@ -351,4 +351,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -SYST( 1987, chessmstdm, 0, 0, chessmstdm, chessmstdm, chessmstdm_state, empty_init, "VEB Mikroelektronik \"Karl Marx\" Erfurt", "Chess-Master Diamond", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, chessmstdm, 0, 0, chessmstdm, chessmstdm, chessmstdm_state, empty_init, "VEB Mikroelektronik \"Karl Marx\" Erfurt", "Chess-Master Diamond", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/ddr/sc2.cpp b/src/mame/ddr/sc2.cpp index 88f3e394d4145..abbe55a8293e1 100644 --- a/src/mame/ddr/sc2.cpp +++ b/src/mame/ddr/sc2.cpp @@ -257,5 +257,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, sc2, 0, 0, sc2, sc2, sc2_state, empty_init, "VEB Funkwerk Erfurt", "Schachcomputer SC 2 (rev. E)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1981, sc2a, sc2, 0, sc2, sc2, sc2_state, empty_init, "VEB Funkwerk Erfurt", "Schachcomputer SC 2", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, sc2, 0, 0, sc2, sc2, sc2_state, empty_init, "VEB Funkwerk Erfurt", "Schachcomputer SC 2 (rev. E)", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, sc2a, sc2, 0, sc2, sc2, sc2_state, empty_init, "VEB Funkwerk Erfurt", "Schachcomputer SC 2", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/ddr/sprachmg.cpp b/src/mame/ddr/sprachmg.cpp index b1f5d8022f1c8..334bf4ae61d30 100644 --- a/src/mame/ddr/sprachmg.cpp +++ b/src/mame/ddr/sprachmg.cpp @@ -428,4 +428,4 @@ ROM_END //************************************************************************** // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1985, sprachmg, 0, 0, sprachmg, sprachmg, sprachmg_state, empty_init, "Institut für Kosmosforschung", "Gerät 32620 (Sprach/Morsegenerator)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +COMP( 1985, sprachmg, 0, 0, sprachmg, sprachmg, sprachmg_state, empty_init, "Institut für Kosmosforschung", "Gerät 32620 (Sprach/Morsegenerator)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/elektor/avrmax.cpp b/src/mame/elektor/avrmax.cpp index be5779a320e9c..1271746719d85 100644 --- a/src/mame/elektor/avrmax.cpp +++ b/src/mame/elektor/avrmax.cpp @@ -370,8 +370,8 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 2009, avrmax, 0, 0, avrmax, avrmax, avrmax_state, empty_init, "Elektor", "AVR-Max Chess Computer (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) -SYST( 2009, avrmaxg, avrmax, 0, avrmax, avrmax, avrmax_state, empty_init, "Elektor", "AVR-Max-Schachzwerg (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) // German 'text' +SYST( 2009, avrmax, 0, 0, avrmax, avrmax, avrmax_state, empty_init, "Elektor", "AVR-Max Chess Computer (English)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 2009, avrmaxg, avrmax, 0, avrmax, avrmax, avrmax_state, empty_init, "Elektor", "AVR-Max-Schachzwerg (German)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // German 'text' -SYST( 2009, atm18mcc, 0, 0, atm18mcc, avrmax, avrmax_state, empty_init, "Elektor", "ATM18 Mini Chess Computer (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) -SYST( 2009, cc2schach, atm18mcc, 0, atm18mcc, avrmax, avrmax_state, empty_init, "Elektor", "CC2-Schachzwerg (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) +SYST( 2009, atm18mcc, 0, 0, atm18mcc, avrmax, avrmax_state, empty_init, "Elektor", "ATM18 Mini Chess Computer (English)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 2009, cc2schach, atm18mcc, 0, atm18mcc, avrmax, avrmax_state, empty_init, "Elektor", "CC2-Schachzwerg (German)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/excalibur/igor.cpp b/src/mame/excalibur/igor.cpp index cb61553e62a48..93053f8586b39 100644 --- a/src/mame/excalibur/igor.cpp +++ b/src/mame/excalibur/igor.cpp @@ -353,4 +353,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1997, igor, 0, 0, igor, igor, igor_state, init_igor, "Excalibur Electronics", "Igor (Excalibur)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1997, igor, 0, 0, igor, igor, igor_state, init_igor, "Excalibur Electronics", "Igor (Excalibur)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/excalibur/ivant.cpp b/src/mame/excalibur/ivant.cpp index 4612cdf8e9eaf..dea7a81d7d697 100644 --- a/src/mame/excalibur/ivant.cpp +++ b/src/mame/excalibur/ivant.cpp @@ -346,4 +346,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1996, ivant, 0, 0, ivant, ivant, ivant_state, empty_init, "Excalibur Electronics", "Ivan The Terrible", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1996, ivant, 0, 0, ivant, ivant, ivant_state, empty_init, "Excalibur Electronics", "Ivan The Terrible", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/excalibur/mirage.cpp b/src/mame/excalibur/mirage.cpp index 693be8fff2bdc..a15325ffadef8 100644 --- a/src/mame/excalibur/mirage.cpp +++ b/src/mame/excalibur/mirage.cpp @@ -623,4 +623,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1996, emirage, 0, 0, mirage, mirage, mirage_state, empty_init, "Excalibur Electronics", "Mirage (Excalibur)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1996, emirage, 0, 0, mirage, mirage, mirage_state, empty_init, "Excalibur Electronics", "Mirage (Excalibur)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/fidelity/as12.cpp b/src/mame/fidelity/as12.cpp index 3d4486a31988b..f7e5ce37a6835 100644 --- a/src/mame/fidelity/as12.cpp +++ b/src/mame/fidelity/as12.cpp @@ -312,8 +312,8 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, feleg, 0, 0, feleg, feleg, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model 6085)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, felega, feleg, 0, felega, felega, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model AS12, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, felega1, feleg, 0, felega, felega, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model AS12, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, felega2, feleg, 0, felega, felega, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model AS12, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, felega3, feleg, 0, felega, felega, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model AS12, set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, feleg, 0, 0, feleg, feleg, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model 6085)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, felega, feleg, 0, felega, felega, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model AS12, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, felega1, feleg, 0, felega, felega, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model AS12, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, felega2, feleg, 0, felega, felega, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model AS12, set 3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, felega3, feleg, 0, felega, felega, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger (model AS12, set 4)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/bridgeb.cpp b/src/mame/fidelity/bridgeb.cpp index b03143faa9038..f380bd4b19600 100644 --- a/src/mame/fidelity/bridgeb.cpp +++ b/src/mame/fidelity/bridgeb.cpp @@ -293,4 +293,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, bridgeb, 0, 0, bridgeb, bridgeb, bridgeb_state, empty_init, "Fidelity Electronics", "Bridge Bidder", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, bridgeb, 0, 0, bridgeb, bridgeb, bridgeb_state, empty_init, "Fidelity Electronics", "Bridge Bidder", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/card.cpp b/src/mame/fidelity/card.cpp index 20228d7281a45..6ad75bea0b022 100644 --- a/src/mame/fidelity/card.cpp +++ b/src/mame/fidelity/card.cpp @@ -715,11 +715,11 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, bridgec, 0, 0, brc, brc, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1979, bridgec, 0, 0, brc, brc, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) -SYST( 1979, bridgeca, 0, 0, brc, brc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -SYST( 1979, bridgecv, bridgeca, 0, vbrc, brc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1979, bridgeca, 0, 0, brc, brc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1979, bridgecv, bridgeca, 0, vbrc, brc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) -SYST( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) -SYST( 1982, gincribc, 0, 0, gin, gin, card_state, empty_init, "Fidelity Electronics", "Gin & Cribbage Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1982, gincribc, 0, 0, gin, gin, card_state, empty_init, "Fidelity Electronics", "Gin & Cribbage Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/fidelity/cc1.cpp b/src/mame/fidelity/cc1.cpp index 0faec2b91801e..eea3f9bddbf81 100644 --- a/src/mame/fidelity/cc1.cpp +++ b/src/mame/fidelity/cc1.cpp @@ -319,6 +319,6 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1977, cc1, 0, 0, cc1, cc1, cc1_state, empty_init, "Fidelity Electronics", "Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) -SYST( 1977, cc3, 0, 0, cc3, cc3, cc1_state, empty_init, "Fidelity Electronics", "Chess Challenger (upgraded version, 3 levels)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) // aka Chess Challenger 3 -SYST( 1979, cc10c, 0, 0, cc10c, cc10c, cc1_state, empty_init, "Fidelity Electronics", "Chess Challenger (model UCC10, 10 levels)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) // aka Chess Challenger 10 C +SYST( 1977, cc1, 0, 0, cc1, cc1, cc1_state, empty_init, "Fidelity Electronics", "Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 1977, cc3, 0, 0, cc3, cc3, cc1_state, empty_init, "Fidelity Electronics", "Chess Challenger (upgraded version, 3 levels)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // aka Chess Challenger 3 +SYST( 1979, cc10c, 0, 0, cc10c, cc10c, cc1_state, empty_init, "Fidelity Electronics", "Chess Challenger (model UCC10, 10 levels)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // aka Chess Challenger 10 C diff --git a/src/mame/fidelity/cc10.cpp b/src/mame/fidelity/cc10.cpp index 7f25925edd6cd..02ece7b8ffae1 100644 --- a/src/mame/fidelity/cc10.cpp +++ b/src/mame/fidelity/cc10.cpp @@ -355,7 +355,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1978, cc10, 0, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger \"10\" (model CCX, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1978, cc10a, cc10, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger \"10\" (model CCX)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka version A +SYST( 1978, cc10, 0, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger \"10\" (model CCX, rev. B)", MACHINE_SUPPORTS_SAVE ) +SYST( 1978, cc10a, cc10, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger \"10\" (model CCX)", MACHINE_SUPPORTS_SAVE ) // aka version A -SYST( 1978, checkc4, 0, 0, acr, acr, ccx_state, empty_init, "Fidelity Electronics", "Checker Challenger (model ACR, 4 levels)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) +SYST( 1978, checkc4, 0, 0, acr, acr, ccx_state, empty_init, "Fidelity Electronics", "Checker Challenger (model ACR, 4 levels)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/fidelity/cc7.cpp b/src/mame/fidelity/cc7.cpp index fc587827763d0..5279a06776f3b 100644 --- a/src/mame/fidelity/cc7.cpp +++ b/src/mame/fidelity/cc7.cpp @@ -277,7 +277,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, cc7, 0, 0, bcc, bcc, bcc_state, empty_init, "Fidelity Electronics", "Chess Challenger \"7\" (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, cc7a, cc7, 0, bcc, bcc, bcc_state, empty_init, "Fidelity Electronics", "Chess Challenger \"7\" (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, cc7, 0, 0, bcc, bcc, bcc_state, empty_init, "Fidelity Electronics", "Chess Challenger \"7\" (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1979, cc7a, cc7, 0, bcc, bcc, bcc_state, empty_init, "Fidelity Electronics", "Chess Challenger \"7\" (set 2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1979, backgamc, 0, 0, bkc, bkc, bcc_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) +SYST( 1979, backgamc, 0, 0, bkc, bkc, bcc_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/fidelity/checkc2.cpp b/src/mame/fidelity/checkc2.cpp index 79352cda47a82..e6736a38ec6b8 100644 --- a/src/mame/fidelity/checkc2.cpp +++ b/src/mame/fidelity/checkc2.cpp @@ -245,4 +245,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1978, checkc2, 0, 0, cr, cr, cr_state, empty_init, "Fidelity Electronics", "Checker Challenger (model CR, 2 levels)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) +SYST( 1978, checkc2, 0, 0, cr, cr, cr_state, empty_init, "Fidelity Electronics", "Checker Challenger (model CR, 2 levels)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/fidelity/chesster.cpp b/src/mame/fidelity/chesster.cpp index a402c3b2af22c..95ca55d7e885b 100644 --- a/src/mame/fidelity/chesster.cpp +++ b/src/mame/fidelity/chesster.cpp @@ -258,7 +258,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1990, chesster, 0, 0, chesster, chesster, chesster_state, empty_init, "Fidelity Electronics", "Chesster Challenger (v1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, chesstera, chesster, 0, chesster, chesster, chesster_state, empty_init, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, kishon, chesster, 0, kishon, chesster, chesster_state, empty_init, "Fidelity Electronics", "Kishon Chesster (v2.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, kishona, chesster, 0, kishon, chesster, chesster_state, empty_init, "Fidelity Electronics", "Kishon Chesster (v2.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, chesster, 0, 0, chesster, chesster, chesster_state, empty_init, "Fidelity Electronics", "Chesster Challenger (v1.3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, chesstera, chesster, 0, chesster, chesster, chesster_state, empty_init, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE ) +SYST( 1991, kishon, chesster, 0, kishon, chesster, chesster_state, empty_init, "Fidelity Electronics", "Kishon Chesster (v2.3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1991, kishona, chesster, 0, kishon, chesster, chesster_state, empty_init, "Fidelity Electronics", "Kishon Chesster (v2.2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/csc.cpp b/src/mame/fidelity/csc.cpp index 791436c81ccdb..3d2665d412d81 100644 --- a/src/mame/fidelity/csc.cpp +++ b/src/mame/fidelity/csc.cpp @@ -847,10 +847,10 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, csc, 0, 0, csc, csc, csc_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1981, csce, 0, 0, csce, csc, csc_state, empty_init, "Fidelity Electronics", "Elite Champion Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1981, cscet, csce, 0, cscet, csc, csc_state, empty_init, "Fidelity Electronics", u8"Elite Champion Challenger (WMCCC 1981 Travemünde TM)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, csc, 0, 0, csc, csc, csc_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, csce, 0, 0, csce, csc, csc_state, empty_init, "Fidelity Electronics", "Elite Champion Challenger", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, cscet, csce, 0, cscet, csc, csc_state, empty_init, "Fidelity Electronics", u8"Elite Champion Challenger (WMCCC 1981 Travemünde TM)", MACHINE_SUPPORTS_SAVE ) -SYST( 1983, super9cc, 0, 0, su9, su9, csc_state, empty_init, "Fidelity Electronics", "Super \"9\" Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, super9cc, 0, 0, su9, su9, csc_state, empty_init, "Fidelity Electronics", "Super \"9\" Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE ) -SYST( 1981, reversic, 0, 0, rsc, rsc, csc_state, empty_init, "Fidelity Electronics", "Reversi Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, reversic, 0, 0, rsc, rsc, csc_state, empty_init, "Fidelity Electronics", "Reversi Sensory Challenger", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/dames.cpp b/src/mame/fidelity/dames.cpp index f44aef251bed7..27310db61abf7 100644 --- a/src/mame/fidelity/dames.cpp +++ b/src/mame/fidelity/dames.cpp @@ -263,4 +263,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, damesc, 0, 0, dsc, dsc, dsc_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, damesc, 0, 0, dsc, dsc, dsc_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/desdis.cpp b/src/mame/fidelity/desdis.cpp index c24b51a946965..ecd399ddbb528 100644 --- a/src/mame/fidelity/desdis.cpp +++ b/src/mame/fidelity/desdis.cpp @@ -402,10 +402,10 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, fdes2100d, 0, 0, fdes2100d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2100 Display (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, fdes2100da, fdes2100d, 0, fdes2100d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2100 Display (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, fdes2000d, fdes2100d, 0, fdes2000d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, fdes2100d, 0, 0, fdes2100d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2100 Display (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, fdes2100da, fdes2100d, 0, fdes2100d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2100 Display (set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, fdes2000d, fdes2100d, 0, fdes2000d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE ) -SYST( 1989, fdes2265, 0, 0, fdes2265, desdis, desmas_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, fdes2265a, fdes2265, 0, fdes2265, desdis, desmas_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, fdes2325, fdes2265, 0, fdes2325, desdis, desmas_state, empty_init, "Fidelity Electronics", "Designer Mach IV 68020 Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, fdes2265, 0, 0, fdes2265, desdis, desmas_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265 (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, fdes2265a, fdes2265, 0, fdes2265, desdis, desmas_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265 (set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1991, fdes2325, fdes2265, 0, fdes2325, desdis, desmas_state, empty_init, "Fidelity Electronics", "Designer Mach IV 68020 Master 2325", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/eag68k.cpp b/src/mame/fidelity/eag68k.cpp index c1b2b8b7b905d..ca8920957501a 100644 --- a/src/mame/fidelity/eag68k.cpp +++ b/src/mame/fidelity/eag68k.cpp @@ -989,24 +989,24 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, fex68k, 0, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, fex68ka, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, fex68kb, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, fex68km2, fex68k, 0, fex68km2, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, fex68km2a, fex68k, 0, fex68km2, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, fex68km3, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master 2265 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, fex68km3a, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master 2265 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, fex68km3b, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master 2265 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, fex68km4, fex68k, 0, fex68km4, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach IV 68020 Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -SYST( 1989, feagv4, 0, 0, eagv4, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2265 (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, feagv4a, feagv4, 0, eagv4, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2265 (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, feagv5, feagv4, 0, eagv5, eag, eagv5_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2265 (model 6114-5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, feagv7, feagv4, 0, eagv7, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-6/7, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, feagv7a, feagv4, 0, eagv7, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-6/7, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, feagv7b, feagv4, 0, eagv7, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-6/7, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, feagv9, feagv4, 0, eagv9, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, feagv10, feagv4, 0, eagv10, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING ) -SYST( 2001, feagv11, feagv4, 0, eagv11, eag, eag_state, empty_init, "hack (Wilfried Bucke)", "Elite Avant Garde 2325 (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING ) - -SYST( 1992, premiere, 0, 0, premiere, premiere, premiere_state, empty_init, "Fidelity Electronics", "Elite Premiere", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, fex68k, 0, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, fex68ka, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, fex68kb, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, fex68km2, fex68k, 0, fex68km2, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, fex68km2a, fex68k, 0, fex68km2, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, fex68km3, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master 2265 (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, fex68km3a, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master 2265 (set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, fex68km3b, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master 2265 (set 3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, fex68km4, fex68k, 0, fex68km4, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach IV 68020 Master 2325", MACHINE_SUPPORTS_SAVE ) + +SYST( 1989, feagv4, 0, 0, eagv4, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2265 (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, feagv4a, feagv4, 0, eagv4, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2265 (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, feagv5, feagv4, 0, eagv5, eag, eagv5_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2265 (model 6114-5)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, feagv7, feagv4, 0, eagv7, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-6/7, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, feagv7a, feagv4, 0, eagv7, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-6/7, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, feagv7b, feagv4, 0, eagv7, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-6/7, set 3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, feagv9, feagv4, 0, eagv9, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-9)", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, feagv10, feagv4, 0, eagv10, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde 2325 (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) +SYST( 2001, feagv11, feagv4, 0, eagv11, eag, eag_state, empty_init, "hack (Wilfried Bucke)", "Elite Avant Garde 2325 (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) + +SYST( 1992, premiere, 0, 0, premiere, premiere, premiere_state, empty_init, "Fidelity Electronics", "Elite Premiere", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/eldorado.cpp b/src/mame/fidelity/eldorado.cpp index 0a57e37d4e202..c538b91dcdce7 100644 --- a/src/mame/fidelity/eldorado.cpp +++ b/src/mame/fidelity/eldorado.cpp @@ -203,4 +203,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1990, feldo, 0, 0, eldorado, eldorado, eldorado_state, empty_init, "Fidelity Electronics / CXG Systems", "Eldorado Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, feldo, 0, 0, eldorado, eldorado, eldorado_state, empty_init, "Fidelity Electronics / CXG Systems", "Eldorado Chess Challenger", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/elite.cpp b/src/mame/fidelity/elite.cpp index 0378a64fdcffe..feaa813e6926e 100644 --- a/src/mame/fidelity/elite.cpp +++ b/src/mame/fidelity/elite.cpp @@ -1089,22 +1089,22 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1983, feas, 0, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (original program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, feasbu, feas, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, model EAS)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, feasbua, feas, 0, ewc, ewc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, model EWC)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, feasgla, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, feasglaa, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, feasglab, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -SYST( 1982, fpres, 0, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, fpresa, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, fpresb, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, fpresc, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, fpresd, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, fprese, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, fpresbu, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, fpresgla, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Glasgow program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -SYST( 1986, feag, 0, 0, eag, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6081)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, feag2100, feag, 0, eag2100, eag, eag_state, init_eag2100, "Fidelity Electronics", "Elite Avant Garde 2100 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, feag2100a, feag, 0, eag2100, eag, eag_state, init_eag2100, "Fidelity Electronics", "Elite Avant Garde 2100 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, feas, 0, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (original program)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, feasbu, feas, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, model EAS)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, feasbua, feas, 0, ewc, ewc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, model EWC)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, feasgla, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, feasglaa, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, feasglab, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 3)", MACHINE_SUPPORTS_SAVE ) + +SYST( 1982, fpres, 0, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fpresa, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fpresb, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fpresc, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 4)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fpresd, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 5)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fprese, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 6)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, fpresbu, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, fpresgla, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Glasgow program)", MACHINE_SUPPORTS_SAVE ) + +SYST( 1986, feag, 0, 0, eag, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6081)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, feag2100, feag, 0, eag2100, eag, eag_state, init_eag2100, "Fidelity Electronics", "Elite Avant Garde 2100 (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, feag2100a, feag, 0, eag2100, eag, eag_state, init_eag2100, "Fidelity Electronics", "Elite Avant Garde 2100 (set 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/excel.cpp b/src/mame/fidelity/excel.cpp index c4e4f2260ee5b..3096b2875a2c8 100644 --- a/src/mame/fidelity/excel.cpp +++ b/src/mame/fidelity/excel.cpp @@ -552,15 +552,15 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, fexcel, 0, 0, fexcelb, fexcelb, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, fexcelv, fexcel, 0, fexcelv, fexcelv, excel_state, empty_init, "Fidelity Electronics", "Voice Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, fexceld, fexcel, 0, fexceld, fexcelb, excel_state, empty_init, "Fidelity Electronics", "Excel Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, fexcel12, fexcel, 0, fexcel, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 1st version of The Excellence -SYST( 1985, fexcel124, fexcel, 0, fexcel4, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, fexcela, fexcel, 0, fexcel, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -SYST( 1986, fexcelp, 0, 0, fexcelp, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Par Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, fexcelpb, fexcelp, 0, fexcelp, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Par Excellence (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, granits, fexcelp, 0, granits, fexcel, excel_state, empty_init, "hack (RCS)", "Granit S", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2100", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, fexcel, 0, 0, fexcelb, fexcelb, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080B)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, fexcelv, fexcel, 0, fexcelv, fexcelv, excel_state, empty_init, "Fidelity Electronics", "Voice Excellence", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, fexceld, fexcel, 0, fexceld, fexcelb, excel_state, empty_init, "Fidelity Electronics", "Excel Display", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, fexcel12, fexcel, 0, fexcel, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 1)", MACHINE_SUPPORTS_SAVE ) // 1st version of The Excellence +SYST( 1985, fexcel124, fexcel, 0, fexcel4, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, fexcela, fexcel, 0, fexcel, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080)", MACHINE_SUPPORTS_SAVE ) + +SYST( 1986, fexcelp, 0, 0, fexcelp, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Par Excellence", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, fexcelpb, fexcelp, 0, fexcelp, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Par Excellence (rev. B)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, granits, fexcelp, 0, granits, fexcel, excel_state, empty_init, "hack (RCS)", "Granit S", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2100", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/msc.cpp b/src/mame/fidelity/msc.cpp index 665e76294c988..1c830a79e702e 100644 --- a/src/mame/fidelity/msc.cpp +++ b/src/mame/fidelity/msc.cpp @@ -232,4 +232,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, miniscco, miniscc, 0, msc, msc, msc_state, empty_init, "Fidelity Electronics", "Mini Sensory Chess Challenger (1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, miniscco, miniscc, 0, msc, msc, msc_state, empty_init, "Fidelity Electronics", "Mini Sensory Chess Challenger (1981 version)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/phantom.cpp b/src/mame/fidelity/phantom.cpp index 9992283cd93f9..837593ce30d8f 100644 --- a/src/mame/fidelity/phantom.cpp +++ b/src/mame/fidelity/phantom.cpp @@ -686,6 +686,6 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, fphantom, 0, 0, phantom, phantom, phantom_state, init_phantom, "Fidelity Electronics", "Phantom (Fidelity)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1988, fphantom, 0, 0, phantom, phantom, phantom_state, init_phantom, "Fidelity Electronics", "Phantom (Fidelity)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) -SYST( 1991, cphantom, 0, 0, cphantom, cphantom, chessterp_state, init_phantom, "Fidelity Electronics", "Chesster Phantom (model 6126)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1991, cphantom, 0, 0, cphantom, cphantom, chessterp_state, init_phantom, "Fidelity Electronics", "Chesster Phantom (model 6126)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/fidelity/sc12.cpp b/src/mame/fidelity/sc12.cpp index d54c5011d7986..98927e6104767 100644 --- a/src/mame/fidelity/sc12.cpp +++ b/src/mame/fidelity/sc12.cpp @@ -291,5 +291,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, fscc12, 0, 0, sc12b, sc12b, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"12 B\" (model 6086)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, fscc12a, fscc12, 0, sc12, sc12, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"12\" (model SC12)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, fscc12, 0, 0, sc12b, sc12b, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"12 B\" (model 6086)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, fscc12a, fscc12, 0, sc12, sc12, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"12\" (model SC12)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/sc6.cpp b/src/mame/fidelity/sc6.cpp index 70204733f7808..d5db57a7bcc9d 100644 --- a/src/mame/fidelity/sc6.cpp +++ b/src/mame/fidelity/sc6.cpp @@ -373,7 +373,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, fscc6, 0, 0, sc6, sc6, sc6_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"6\"", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, miniscc, 0, 0, msc, msc, sc6_state, empty_init, "Fidelity Electronics", "Mini Sensory Chess Challenger (1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka "Mini Sensory II" +SYST( 1982, fscc6, 0, 0, sc6, sc6, sc6_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"6\"", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, miniscc, 0, 0, msc, msc, sc6_state, empty_init, "Fidelity Electronics", "Mini Sensory Chess Challenger (1982 version)", MACHINE_SUPPORTS_SAVE ) // aka "Mini Sensory II" -SYST( 1989, gambit, 0, 0, gambit, gambit, sc6_state, empty_init, "Fidelity Electronics", "The Gambit (1989 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, gambit, 0, 0, gambit, gambit, sc6_state, empty_init, "Fidelity Electronics", "The Gambit (1989 version)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/sc8.cpp b/src/mame/fidelity/sc8.cpp index d7117ebb97335..370a02abebbf4 100644 --- a/src/mame/fidelity/sc8.cpp +++ b/src/mame/fidelity/sc8.cpp @@ -200,4 +200,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, fscc8, 0, 0, scc, scc, scc_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"8\"", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, fscc8, 0, 0, scc, scc, scc_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"8\"", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/sc9.cpp b/src/mame/fidelity/sc9.cpp index 2ae740f76e5be..d21d52bba1a81 100644 --- a/src/mame/fidelity/sc9.cpp +++ b/src/mame/fidelity/sc9.cpp @@ -321,7 +321,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, fscc9, 0, 0, sc9d, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"9\" (rev. D)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka version "B" -SYST( 1982, fscc9b, fscc9, 0, sc9b, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"9\" (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, fscc9c, fscc9, 0, sc9b, sc9c, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"9\" (rev. C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, fscc9ps, fscc9, 0, playmatic, sc9, sc9_state, empty_init, "Fidelity Deutschland", "Sensory 9 Playmatic S", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 9 is not between quotation marks here +SYST( 1982, fscc9, 0, 0, sc9d, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"9\" (rev. D)", MACHINE_SUPPORTS_SAVE ) // aka version "B" +SYST( 1982, fscc9b, fscc9, 0, sc9b, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"9\" (rev. B)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fscc9c, fscc9, 0, sc9b, sc9c, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger \"9\" (rev. C)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, fscc9ps, fscc9, 0, playmatic, sc9, sc9_state, empty_init, "Fidelity Deutschland", "Sensory 9 Playmatic S", MACHINE_SUPPORTS_SAVE ) // 9 is not between quotation marks here diff --git a/src/mame/fidelity/vcc.cpp b/src/mame/fidelity/vcc.cpp index 7d24b5ca225f6..88f6b679b1acc 100644 --- a/src/mame/fidelity/vcc.cpp +++ b/src/mame/fidelity/vcc.cpp @@ -445,7 +445,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, vcc, 0, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, vcca, vcc, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, vcc, 0, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1979, vcca, vcc, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (set 2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1980, uvc, vcc, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, uvc, vcc, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/fidelity/vsc.cpp b/src/mame/fidelity/vsc.cpp index 678525f3bd6e3..6ec644d238dda 100644 --- a/src/mame/fidelity/vsc.cpp +++ b/src/mame/fidelity/vsc.cpp @@ -486,4 +486,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, vsc, 0, 0, vsc, vsc, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, vsc, 0, 0, vsc, vsc, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_cop400.cpp b/src/mame/handheld/hh_cop400.cpp index 0f5f6ffe76a82..b1fe912787dbc 100644 --- a/src/mame/handheld/hh_cop400.cpp +++ b/src/mame/handheld/hh_cop400.cpp @@ -2818,7 +2818,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, ctstein, 0, 0, ctstein, ctstein, ctstein_state, empty_init, "Castle Toy", "Einstein (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, ctstein, 0, 0, ctstein, ctstein, ctstein_state, empty_init, "Castle Toy", "Einstein (Castle Toy)", MACHINE_SUPPORTS_SAVE ) SYST( 1980, h2hbaskbc, h2hbaskb, 0, h2hbaskbc, h2hbaskbc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (COP420L version)", MACHINE_SUPPORTS_SAVE ) SYST( 1980, h2hhockeyc, h2hhockey, 0, h2hhockeyc, h2hhockeyc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (COP420L version)", MACHINE_SUPPORTS_SAVE ) @@ -2826,11 +2826,11 @@ SYST( 1980, h2hsoccerc, 0, 0, h2hsoccerc, h2hsoccerc, h2hbaskbc_sta SYST( 1981, einvaderc, einvader, 0, einvaderc, einvaderc, einvaderc_state, empty_init, "Entex", "Space Invader (Entex, COP444L version)", MACHINE_SUPPORTS_SAVE ) -SYST( 1980, lchicken, 0, 0, lchicken, lchicken, lchicken_state, empty_init, "LJN Toys", "I Took a Lickin' From a Chicken", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) +SYST( 1980, lchicken, 0, 0, lchicken, lchicken, lchicken_state, empty_init, "LJN Toys", "I Took a Lickin' From a Chicken", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) -SYST( 1979, funjacks, 0, 0, funjacks, funjacks, funjacks_state, empty_init, "Mattel Electronics", "Funtronics: Jacks", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, funrlgl, 0, 0, funrlgl, funrlgl, funrlgl_state, empty_init, "Mattel Electronics", "Funtronics: Red Light Green Light", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1980, funtag, 0, 0, funtag, funtag, funtag_state, empty_init, "Mattel Electronics", "Funtronics: Tag", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, funjacks, 0, 0, funjacks, funjacks, funjacks_state, empty_init, "Mattel Electronics", "Funtronics: Jacks", MACHINE_SUPPORTS_SAVE ) +SYST( 1979, funrlgl, 0, 0, funrlgl, funrlgl, funrlgl_state, empty_init, "Mattel Electronics", "Funtronics: Red Light Green Light", MACHINE_SUPPORTS_SAVE ) +SYST( 1980, funtag, 0, 0, funtag, funtag, funtag_state, empty_init, "Mattel Electronics", "Funtronics: Tag", MACHINE_SUPPORTS_SAVE ) SYST( 1979, mbaskb2, 0, 0, mbaskb2, mbaskb2, mbaskb2_state, empty_init, "Mattel Electronics", "Basketball 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) SYST( 1979, msoccer2, 0, 0, msoccer2, msoccer2, mbaskb2_state, empty_init, "Mattel Electronics", "Soccer 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) SYST( 1980, lafootb, 0, 0, lafootb, lafootb, lafootb_state, empty_init, "Mattel Electronics", "Look Alive! Football", MACHINE_SUPPORTS_SAVE ) @@ -2839,8 +2839,8 @@ SYST( 1981, mdallas, 0, 0, mdallas, mdallas, mdallas_state SYST( 1980, minspace, 0, 0, minspace, minspace, minspace_state, empty_init, "Mego", "Invasion From Space (patent)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) SYST( 1980, plus1, 0, 0, plus1, plus1, plus1_state, empty_init, "Milton Bradley", "Plus One", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // *** -SYST( 1981, lightfgt, 0, 0, lightfgt, lightfgt, lightfgt_state, empty_init, "Milton Bradley", "Electronic Lightfight: The Games of Dueling Lights", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, bshipg, bship, 0, bshipg, bshipg, bshipg_state, empty_init, "Milton Bradley", "Electronic Battleship (COP420 version, rev. G)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +SYST( 1981, lightfgt, 0, 0, lightfgt, lightfgt, lightfgt_state, empty_init, "Milton Bradley", "Electronic Lightfight: The Games of Dueling Lights", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, bshipg, bship, 0, bshipg, bshipg, bshipg_state, empty_init, "Milton Bradley", "Electronic Battleship (COP420 version, rev. G)", MACHINE_SUPPORTS_SAVE ) // *** SYST( 1979, qkracera, qkracer, 0, qkracera, qkracera, qkracera_state, empty_init, "National Semiconductor", "QuizKid Racer (COP420 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) SYST( 1982, copspa, 0, 0, mdallas, copspa, mdallas_state, empty_init, "National Semiconductor", "COPS Pocket Assistant", MACHINE_SUPPORTS_SAVE ) @@ -2849,7 +2849,7 @@ SYST( 1984, solution, 0, 0, scat, solution, scat_state, SYST( 1987, vidchal, 0, 0, vidchal, vidchal, vidchal_state, empty_init, "Select Merchandise", "Video Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -SYST( 1981, comparca, comparc, 0, comparca, comparca, comparca_state, empty_init, "Tandy Corporation", "Computerized Arcade (COP421 version, model 60-2159A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the games: *** +SYST( 1981, comparca, comparc, 0, comparca, comparca, comparca_state, empty_init, "Tandy Corporation", "Computerized Arcade (COP421 version, model 60-2159A)", MACHINE_SUPPORTS_SAVE ) // some of the games: *** SYST( 1989, lilcomp, 0, 0, lilcomp, lilcomp, lilcomp_state, empty_init, "Texas Instruments", "My Little Computer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) diff --git a/src/mame/handheld/hh_mn1400.cpp b/src/mame/handheld/hh_mn1400.cpp index 8c52b1b130004..f08b98ac4d6e5 100644 --- a/src/mame/handheld/hh_mn1400.cpp +++ b/src/mame/handheld/hh_mn1400.cpp @@ -559,8 +559,8 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, compperf, 0, 0, compperf, compperf, compperf_state, empty_init, "Lakeside", "Computer Perfection", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, compperf, 0, 0, compperf, compperf, compperf_state, empty_init, "Lakeside", "Computer Perfection", MACHINE_SUPPORTS_SAVE ) SYST( 1980, scrablexa, scrablex, 0, scrablexa, scrablexa, scrablexa_state, empty_init, "Selchow & Righter", "Scrabble Lexor: Computer Word Game (MN1405 version)", MACHINE_SUPPORTS_SAVE ) -SYST( 1980, tmbaskb, 0, 0, tmbaskb, tmbaskb, tmbaskb_state, empty_init, "Tomy", "Basketball (Tomy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, tmbaskb, 0, 0, tmbaskb, tmbaskb, tmbaskb_state, empty_init, "Tomy", "Basketball (Tomy)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_pic16.cpp b/src/mame/handheld/hh_pic16.cpp index 6fa04f8d54b1a..1f19aa39e048b 100644 --- a/src/mame/handheld/hh_pic16.cpp +++ b/src/mame/handheld/hh_pic16.cpp @@ -2193,22 +2193,22 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, touchme, 0, 0, touchme, touchme, touchme_state, empty_init, "Atari", "Touch Me (handheld, rev. 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, touchme, 0, 0, touchme, touchme, touchme_state, empty_init, "Atari", "Touch Me (handheld, rev. 2)", MACHINE_SUPPORTS_SAVE ) SYST( 1979, pabball, 0, 0, pabball, pabball, pabball_state, empty_init, "Calfax / Caprice Electronics", "Pro-Action Electronic-Computerized Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) SYST( 1981, sfxphasor, 0, 0, sfxphasor, sfxphasor, sfxphasor_state, empty_init, "Electroplay", "Sound FX Phasor", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -SYST( 1980, melodym, 0, 0, melodym, melodym, melodym_state, empty_init, "GAF", "Melody Madness", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, melodym, 0, 0, melodym, melodym, melodym_state, empty_init, "GAF", "Melody Madness", MACHINE_SUPPORTS_SAVE ) -SYST( 1979, maniac, 0, 0, maniac, maniac, maniac_state, empty_init, "Ideal Toy Corporation", "Maniac", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1980, flash, 0, 0, flash, flash, flash_state, empty_init, "Ideal Toy Corporation", "Flash (Ideal)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, maniac, 0, 0, maniac, maniac, maniac_state, empty_init, "Ideal Toy Corporation", "Maniac", MACHINE_SUPPORTS_SAVE ) +SYST( 1980, flash, 0, 0, flash, flash, flash_state, empty_init, "Ideal Toy Corporation", "Flash (Ideal)", MACHINE_SUPPORTS_SAVE ) -SYST( 1980, matchme, 0, 0, matchme, matchme, matchme_state, empty_init, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, matchme, 0, 0, matchme, matchme, matchme_state, empty_init, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE ) SYST( 1979, drdunk, 0, 0, drdunk, drdunk, drdunk_state, empty_init, "Kmart Corporation", "Dr. Dunk", MACHINE_SUPPORTS_SAVE ) -SYST( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE ) SYST( 1979, rockpin, 0, 0, rockpin, rockpin, rockpin_state, empty_init, "Tiger Electronics", "Rocket Pinball", MACHINE_SUPPORTS_SAVE ) SYST( 1979, hccbaskb, 0, 0, hccbaskb, hccbaskb, hccbaskb_state, empty_init, "Tiger Electronics", "Half Court Computer Basketball", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_tms1k.cpp b/src/mame/handheld/hh_tms1k.cpp index dba95bc6e22f8..b97d658da26aa 100644 --- a/src/mame/handheld/hh_tms1k.cpp +++ b/src/mame/handheld/hh_tms1k.cpp @@ -17289,12 +17289,12 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, matchnum, 0, 0, matchnum, matchnum, matchnum_state, empty_init, "A-One LSI", "Match Number", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, matchnum, 0, 0, matchnum, matchnum, matchnum_state, empty_init, "A-One LSI", "Match Number", MACHINE_SUPPORTS_SAVE ) SYST( 1980, arrball, 0, 0, arrball, arrball, arrball_state, empty_init, "A-One LSI", "Arrange Ball", MACHINE_SUPPORTS_SAVE ) SYST( 1980, mathmagi, 0, 0, mathmagi, mathmagi, mathmagi_state, empty_init, "APF Electronics Inc.", "Mathemagician", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -SYST( 1979, bcheetah, 0, 0, bcheetah, bcheetah, bcheetah_state, empty_init, "Bandai", "System Control Car: Cheetah", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_MECHANICAL | MACHINE_CLICKABLE_ARTWORK ) // *** +SYST( 1979, bcheetah, 0, 0, bcheetah, bcheetah, bcheetah_state, empty_init, "Bandai", "System Control Car: Cheetah", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_MECHANICAL ) // *** SYST( 1980, racetime, 0, 0, racetime, racetime, racetime_state, empty_init, "Bandai", "Race Time", MACHINE_SUPPORTS_SAVE ) SYST( 1981, tc7atc, 0, 0, tc7atc, tc7atc, tc7atc_state, empty_init, "Bandai", "TC7: Air Traffic Control", MACHINE_SUPPORTS_SAVE ) SYST( 1982, uboat, 0, 0, uboat, uboat, uboat_state, empty_init, "Bandai", "U-Boat", MACHINE_SUPPORTS_SAVE ) @@ -17304,8 +17304,8 @@ SYST( 1977, palmmd8, 0, 0, palmmd8, palmmd8, palmmd8_state, SYST( 1977, cchime, 0, 0, cchime, cchime, cchime_state, empty_init, "Chromatronics", "Chroma-Chime", MACHINE_SUPPORTS_SAVE ) -SYST( 1978, amaztron, 0, 0, amaztron, amaztron, amaztron_state, empty_init, "Coleco", "Amaze-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** -SYST( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac: The Astrology Computer", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1978, amaztron, 0, 0, amaztron, amaztron, amaztron_state, empty_init, "Coleco", "Amaze-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // *** +SYST( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac: The Astrology Computer", MACHINE_SUPPORTS_SAVE ) SYST( 1978, cqback, 0, 0, cqback, cqback, cqback_state, empty_init, "Coleco", "Electronic Quarterback", MACHINE_SUPPORTS_SAVE ) SYST( 1979, h2hfootb, 0, 0, h2hfootb, h2hfootb, h2hfootb_state, empty_init, "Coleco", "Head to Head: Electronic Football", MACHINE_SUPPORTS_SAVE ) SYST( 1979, h2hbaskb, 0, 0, h2hbaskb, h2hbaskb, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (TMS1000 version)", MACHINE_SUPPORTS_SAVE ) @@ -17315,16 +17315,16 @@ SYST( 1981, h2hboxing, 0, 0, h2hboxing, h2hboxing, h2hboxing_state SYST( 1981, quizwizc, 0, 0, quizwizc, quizwizc, quizwizc_state, empty_init, "Coleco", "Quiz Wiz Challenger", MACHINE_SUPPORTS_SAVE ) // *** SYST( 1981, tc4, 0, 0, tc4, tc4, tc4_state, empty_init, "Coleco", "Total Control 4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -SYST( 1978, litelrn, 0, 0, litelrn, litelrn, litelrn_state, empty_init, "Concept 2000", "Lite 'n Learn: Electronic Organ", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1978, litelrn, 0, 0, litelrn, litelrn, litelrn_state, empty_init, "Concept 2000", "Lite 'n Learn: Electronic Organ", MACHINE_SUPPORTS_SAVE ) SYST( 1978, mrmusical, 0, 0, mrmusical, mrmusical, mrmusical_state, empty_init, "Concept 2000", "Mr. Mus-I-Cal", MACHINE_SUPPORTS_SAVE ) SYST( 1979, cnbaskb, 0, 0, cnbaskb, cnbaskb, cnbaskb_state, empty_init, "Conic", "Electronic Basketball (Conic)", MACHINE_SUPPORTS_SAVE ) SYST( 1979, cmsport, 0, 0, cmsport, cmsport, cmsport_state, empty_init, "Conic", "Electronic Multisport", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) SYST( 1979, cnfball, 0, 0, cnfball, cnfball, cnfball_state, empty_init, "Conic", "Electronic Football (Conic, TMS1000 version)", MACHINE_SUPPORTS_SAVE ) SYST( 1979, cnfball2, 0, 0, cnfball2, cnfball2, cnfball2_state, empty_init, "Conic", "Electronic Football II (Conic)", MACHINE_SUPPORTS_SAVE ) -SYST( 1979, eleciq, 0, 0, eleciq, eleciq, eleciq_state, empty_init, "Conic", "Electronic I.Q.", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, eleciq, 0, 0, eleciq, eleciq, eleciq_state, empty_init, "Conic", "Electronic I.Q.", MACHINE_SUPPORTS_SAVE ) -SYST( 1979, qfire, 0, 0, qfire, qfire, qfire_state, empty_init, "Electroplay", "Quickfire", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, qfire, 0, 0, qfire, qfire, qfire_state, empty_init, "Electroplay", "Quickfire", MACHINE_SUPPORTS_SAVE ) SYST( 1979, esoccer, 0, 0, esoccer, esoccer, esoccer_state, empty_init, "Entex", "Electronic Soccer (Entex)", MACHINE_SUPPORTS_SAVE ) SYST( 1979, ebball, 0, 0, ebball, ebball, ebball_state, empty_init, "Entex", "Electronic Baseball (Entex)", MACHINE_SUPPORTS_SAVE ) @@ -17337,7 +17337,7 @@ SYST( 1980, efootb4 , 0, 0, efootb4, efootb4, efootb4_state, SYST( 1980, ebaskb2 , 0, 0, ebaskb2, ebaskb2, ebaskb2_state, empty_init, "Entex", "Electronic Basketball 2 (Entex)", MACHINE_SUPPORTS_SAVE ) SYST( 1980, raisedvl, 0, 0, raisedvl, raisedvl, raisedvl_state, empty_init, "Entex", "Raise The Devil Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) SYST( 1982, ebknight, 0, 0, ebknight, raisedvl, raisedvl_state, empty_init, "Entex", "Black Knight Pinball (Entex)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -SYST( 1980, mmarvin, 0, 0, mmarvin, mmarvin, mmarvin_state, empty_init, "Entex", "Musical Marvin", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, mmarvin, 0, 0, mmarvin, mmarvin, mmarvin_state, empty_init, "Entex", "Musical Marvin", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) SYST( 1979, f2pbball, 0, 0, f2pbball, f2pbball, f2pbball_state, empty_init, "Fonas", "2 Player Baseball (Fonas)", MACHINE_SUPPORTS_SAVE ) SYST( 1979, f3in1, 0, 0, f3in1, f3in1, f3in1_state, empty_init, "Fonas", "3 in 1: Football, Basketball, Soccer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) @@ -17347,50 +17347,50 @@ SYST( 1980, gjackpot, 0, 0, gjackpot, gjackpot, gjackpot_state, SYST( 1980, ginv, 0, 0, ginv, ginv, ginv_state, empty_init, "Gakken", "Invader (Gakken, cyan version)", MACHINE_SUPPORTS_SAVE ) SYST( 1981, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, empty_init, "Gakken", "Galaxy Invader 1000", MACHINE_SUPPORTS_SAVE ) SYST( 1982, ginv2000, 0, 0, ginv2000, ginv2000, ginv2000_state, empty_init, "Gakken", "Invader 2000", MACHINE_SUPPORTS_SAVE ) -SYST( 1981, fxmcr165, 0, 0, fxmcr165, fxmcr165, fxmcr165_state, empty_init, "Gakken", "FX-Micom R-165", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, fxmcr165, 0, 0, fxmcr165, fxmcr165, fxmcr165_state, empty_init, "Gakken", "FX-Micom R-165", MACHINE_SUPPORTS_SAVE ) -SYST( 1979, elecdet, 0, 0, elecdet, elecdet, elecdet_state, empty_init, "Ideal Toy Corporation", "Electronic Detective", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +SYST( 1979, elecdet, 0, 0, elecdet, elecdet, elecdet_state, empty_init, "Ideal Toy Corporation", "Electronic Detective", MACHINE_SUPPORTS_SAVE ) // *** SYST( 1981, skywriter, 0, 0, skywriter, skywriter, skywriter_state, empty_init, "Ideal Toy Corporation", "Sky-Writer: The Electronic Message Sender", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_CONTROLS ) -SYST( 1978, starwlb, 0, 0, starwlb, starwlb, starwlb_state, empty_init, "Kenner", "Star Wars: Electronic Laser Battle Game", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, starwbc, 0, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars: Electronic Battle Command Game", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, starwbcp, starwbc, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars: Electronic Battle Command Game (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1978, starwlb, 0, 0, starwlb, starwlb, starwlb_state, empty_init, "Kenner", "Star Wars: Electronic Laser Battle Game", MACHINE_SUPPORTS_SAVE ) +SYST( 1979, starwbc, 0, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars: Electronic Battle Command Game", MACHINE_SUPPORTS_SAVE ) +SYST( 1979, starwbcp, starwbc, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars: Electronic Battle Command Game (patent)", MACHINE_SUPPORTS_SAVE ) SYST( 1980, liveafb, 0, 0, liveafb, liveafb, liveafb_state, empty_init, "Kenner", "Live Action Football", MACHINE_SUPPORTS_SAVE ) SYST( 1979, astro, 0, 0, astro, astro, astro_state, empty_init, "Kosmos", "Astro", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -SYST( 1980, strobe, 0, 0, strobe, strobe, strobe_state, empty_init, "Lakeside", "Strobe", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, strobe, 0, 0, strobe, strobe, strobe_state, empty_init, "Lakeside", "Strobe", MACHINE_SUPPORTS_SAVE ) SYST( 1978, elecbowl, 0, 0, elecbowl, elecbowl, elecbowl_state, empty_init, "Marx", "Electronic Bowling (Marx)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // *** SYST( 1979, horseran, 0, 0, horseran, horseran, horseran_state, empty_init, "Mattel Electronics", "Thoroughbred Horse Race Analyzer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -SYST( 1980, mdndclab, 0, 0, mdndclab, mdndclab, mdndclab_state, empty_init, "Mattel Electronics", "Dungeons & Dragons: Computer Labyrinth Game", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** - -SYST( 1977, comp4, 0, 0, comp4, comp4, comp4_state, empty_init, "Milton Bradley", "Comp IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) -SYST( 1977, bship, 0, 0, bship, bship, bship_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) // *** -SYST( 1978, bshipb, bship, 0, bshipb, bship, bshipb_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // *** -SYST( 1978, simon, 0, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, simonf, simon, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (rev. F)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, ssimon, 0, 0, ssimon, ssimon, ssimon_state, empty_init, "Milton Bradley", "Super Simon", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, mdndclab, 0, 0, mdndclab, mdndclab, mdndclab_state, empty_init, "Mattel Electronics", "Dungeons & Dragons: Computer Labyrinth Game", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // *** + +SYST( 1977, comp4, 0, 0, comp4, comp4, comp4_state, empty_init, "Milton Bradley", "Comp IV", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 1977, bship, 0, 0, bship, bship, bship_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // *** +SYST( 1978, bshipb, bship, 0, bshipb, bship, bshipb_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // *** +SYST( 1978, simon, 0, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (rev. A)", MACHINE_SUPPORTS_SAVE ) +SYST( 1979, simonf, simon, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (rev. F)", MACHINE_SUPPORTS_SAVE ) +SYST( 1979, ssimon, 0, 0, ssimon, ssimon, ssimon_state, empty_init, "Milton Bradley", "Super Simon", MACHINE_SUPPORTS_SAVE ) SYST( 1979, bigtrak, 0, 0, bigtrak, bigtrak, bigtrak_state, empty_init, "Milton Bradley", "Big Trak", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) // *** -SYST( 1981, mbdtower, 0, 0, mbdtower, mbdtower, mbdtower_state, empty_init, "Milton Bradley", "Dark Tower (Milton Bradley)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) // *** -SYST( 1983, arcmania, 0, 0, arcmania, arcmania, arcmania_state, empty_init, "Milton Bradley", "Electronic Arcade Mania (Arcade Machine)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) // *** +SYST( 1981, mbdtower, 0, 0, mbdtower, mbdtower, mbdtower_state, empty_init, "Milton Bradley", "Dark Tower (Milton Bradley)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) // *** +SYST( 1983, arcmania, 0, 0, arcmania, arcmania, arcmania_state, empty_init, "Milton Bradley", "Electronic Arcade Mania (Arcade Machine)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // *** -SYST( 1977, cnsector, 0, 0, cnsector, cnsector, cnsector_state, empty_init, "Parker Brothers", "Code Name: Sector", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) // *** -SYST( 1978, merlin, 0, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin: The Electronic Wizard", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1977, cnsector, 0, 0, cnsector, cnsector, cnsector_state, empty_init, "Parker Brothers", "Code Name: Sector", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** +SYST( 1978, merlin, 0, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin: The Electronic Wizard", MACHINE_SUPPORTS_SAVE ) SYST( 1978, pbmastm, 0, 0, pbmastm, pbmastm, pbmastm_state, empty_init, "Parker Brothers", "Electronic Master Mind (Parker Brothers)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** -SYST( 1979, stopthief, 0, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief: Electronic Cops and Robbers (Electronic Crime Scanner)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** -SYST( 1979, stopthiefp, stopthief, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief: Electronic Cops and Robbers (Electronic Crime Scanner) (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +SYST( 1979, stopthief, 0, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief: Electronic Cops and Robbers (Electronic Crime Scanner)", MACHINE_SUPPORTS_SAVE ) // *** +SYST( 1979, stopthiefp, stopthief, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief: Electronic Cops and Robbers (Electronic Crime Scanner) (patent)", MACHINE_SUPPORTS_SAVE ) // *** SYST( 1980, bankshot, 0, 0, bankshot, bankshot, bankshot_state, empty_init, "Parker Brothers", "Bank Shot: Electronic Pool", MACHINE_SUPPORTS_SAVE ) SYST( 1980, splitsec, 0, 0, splitsec, splitsec, splitsec_state, empty_init, "Parker Brothers", "Split Second", MACHINE_SUPPORTS_SAVE ) -SYST( 1982, mmerlin, 0, 0, mmerlin, mmerlin, mmerlin_state, empty_init, "Parker Brothers", "Master Merlin", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, lostreas, 0, 0, lostreas, lostreas, lostreas_state, empty_init, "Parker Brothers", "Lost Treasure: The Electronic Deep-Sea Diving Game (Electronic Dive-Control Center)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +SYST( 1982, mmerlin, 0, 0, mmerlin, mmerlin, mmerlin_state, empty_init, "Parker Brothers", "Master Merlin", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, lostreas, 0, 0, lostreas, lostreas, lostreas_state, empty_init, "Parker Brothers", "Lost Treasure: The Electronic Deep-Sea Diving Game (Electronic Dive-Control Center)", MACHINE_SUPPORTS_SAVE ) // *** SYST( 1978, alphie, 0, 0, alphie, alphie, alphie_state, empty_init, "Playskool", "Alphie: The Electronic Robot (patent)", MACHINE_SUPPORTS_SAVE ) // *** SYST( 1980, tcfball, 0, 0, tcfball, tcfball, tcfball_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2150)", MACHINE_SUPPORTS_SAVE ) SYST( 1980, tcfballa, tcfball, 0, tcfballa, tcfballa, tcfballa_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2151)", MACHINE_SUPPORTS_SAVE ) -SYST( 1981, comparc, 0, 0, comparc, comparc, comparc_state, empty_init, "Tandy Corporation", "Computerized Arcade (TMS1100 version, model 60-2159)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the games: *** +SYST( 1981, comparc, 0, 0, comparc, comparc, comparc_state, empty_init, "Tandy Corporation", "Computerized Arcade (TMS1100 version, model 60-2159)", MACHINE_SUPPORTS_SAVE ) // some of the games: *** SYST( 1982, monkeysee, 0, 0, monkeysee, monkeysee, monkeysee_state, empty_init, "Tandy Corporation", "Monkey See (1982 version)", MACHINE_SUPPORTS_SAVE ) SYST( 1984, t3in1sa, 0, 0, t3in1sa, t3in1sa, t3in1sa_state, empty_init, "Tandy Corporation", "3 in 1 Sports Arena", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) SYST( 1984, vclock3, 0, 0, vclock3, vclock3, vclock3_state, empty_init, "Tandy Corporation", "VoxClock 3", MACHINE_SUPPORTS_SAVE ) @@ -17426,15 +17426,15 @@ SYST( 1979, tithermos, 0, 0, tithermos, tithermos, tithermos_state SYST( 1979, subwars, 0, 0, subwars, subwars, subwars_state, empty_init, "Tiger Electronics", "Sub Wars (LED version)", MACHINE_SUPPORTS_SAVE ) SYST( 1980, playmaker, 0, 0, playmaker, playmaker, playmaker_state, empty_init, "Tiger Electronics", "Playmaker: Hockey, Soccer, Basketball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) SYST( 1980, dxfootb, 0, 0, dxfootb, dxfootb, dxfootb_state, empty_init, "Tiger Electronics", "Deluxe Football with Instant Replay", MACHINE_SUPPORTS_SAVE ) -SYST( 1979, copycat, 0, 0, copycat, copycat, copycat_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-520)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, copycata, copycat, 0, copycata, copycata, copycata_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-522)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1981, ditto, 0, 0, ditto, ditto, ditto_state, empty_init, "Tiger Electronics", "Ditto", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1981, fingbowl, 0, 0, fingbowl, fingbowl, fingbowl_state, empty_init, "Tiger Electronics", "Finger Bowl", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the games: *** -SYST( 1982, t7in1ss, 0, 0, t7in1ss, t7in1ss, t7in1ss_state, empty_init, "Tiger Electronics", "7 in 1 Sports Stadium", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +SYST( 1979, copycat, 0, 0, copycat, copycat, copycat_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-520)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, copycata, copycat, 0, copycata, copycata, copycata_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-522)", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, ditto, 0, 0, ditto, ditto, ditto_state, empty_init, "Tiger Electronics", "Ditto", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, fingbowl, 0, 0, fingbowl, fingbowl, fingbowl_state, empty_init, "Tiger Electronics", "Finger Bowl", MACHINE_SUPPORTS_SAVE ) // some of the games: *** +SYST( 1982, t7in1ss, 0, 0, t7in1ss, t7in1ss, t7in1ss_state, empty_init, "Tiger Electronics", "7 in 1 Sports Stadium", MACHINE_SUPPORTS_SAVE ) -SYST( 1979, tmvolleyb, 0, 0, tmvolleyb, tmvolleyb, tmvolleyb_state, empty_init, "Tomy", "Volleyball (Tomy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, tmvolleyb, 0, 0, tmvolleyb, tmvolleyb, tmvolleyb_state, empty_init, "Tomy", "Volleyball (Tomy)", MACHINE_SUPPORTS_SAVE ) SYST( 1979, tbreakup, 0, 0, tbreakup, tbreakup, tbreakup_state, empty_init, "Tomy", "Break Up (Tomy)", MACHINE_SUPPORTS_SAVE ) -SYST( 1980, phpball, 0, 0, phpball, phpball, phpball_state, empty_init, "Tomy", "Power House Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +SYST( 1980, phpball, 0, 0, phpball, phpball, phpball_state, empty_init, "Tomy", "Power House Pinball", MACHINE_SUPPORTS_SAVE ) SYST( 1982, tdracula, 0, 0, tdracula, tdracula, tdracula_state, empty_init, "Tsukuda", "The Dracula (Tsukuda)", MACHINE_SUPPORTS_SAVE ) SYST( 1983, slepachi, 0, 0, slepachi, slepachi, slepachi_state, empty_init, "Tsukuda", "Slot Elepachi", MACHINE_SUPPORTS_SAVE ) @@ -17442,7 +17442,7 @@ SYST( 1983, slepachi, 0, 0, slepachi, slepachi, slepachi_state, SYST( 1980, scruiser, 0, 0, scruiser, scruiser, scruiser_state, empty_init, "U.S. Games Corporation", "Space Cruiser (U.S. Games)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) SYST( 1980, ssports4, 0, 0, ssports4, ssports4, ssports4_state, empty_init, "U.S. Games Corporation", "Super Sports-4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -SYST( 1983, xl25, 0, 0, xl25, xl25, xl25_state, empty_init, "Vulcan Electronics", "XL 25", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, xl25, 0, 0, xl25, xl25, xl25_state, empty_init, "Vulcan Electronics", "XL 25", MACHINE_SUPPORTS_SAVE ) // ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction // with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/hh_ucom4.cpp b/src/mame/handheld/hh_ucom4.cpp index ea4f54fbb2811..3642869e1c4cb 100644 --- a/src/mame/handheld/hh_ucom4.cpp +++ b/src/mame/handheld/hh_ucom4.cpp @@ -3341,8 +3341,8 @@ SYST( 1980, bgunf, 0, 0, bgunf, bgunf, bgunf_state, empt SYST( 1981, bgalaxn, 0, 0, bgalaxn, bgalaxn, bgalaxn_state, empty_init, "Bandai", "Galaxian (Bandai)", MACHINE_SUPPORTS_SAVE ) SYST( 1982, bcclimbr, 0, 0, bcclimbr, bcclimbr, bcclimbr_state, empty_init, "Bandai", "Crazy Climber (Bandai)", MACHINE_SUPPORTS_SAVE ) -SYST( 1980, tactix, 0, 0, tactix, tactix, tactix_state, empty_init, "Castle Toy", "Tactix (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1980, ctntune, 0, 0, ctntune, ctntune, ctntune_state, empty_init, "Castle Toy", "Name That Tune (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +SYST( 1980, tactix, 0, 0, tactix, tactix, tactix_state, empty_init, "Castle Toy", "Tactix (Castle Toy)", MACHINE_SUPPORTS_SAVE ) +SYST( 1980, ctntune, 0, 0, ctntune, ctntune, ctntune_state, empty_init, "Castle Toy", "Name That Tune (Castle Toy)", MACHINE_SUPPORTS_SAVE ) // *** SYST( 1980, einspace, 0, 0, einspace, einspace, einspace_state, empty_init, "Epoch", "Invader From Space", MACHINE_SUPPORTS_SAVE ) SYST( 1980, efball, 0, 0, efball, efball, efball_state, empty_init, "Epoch", "Electronic Football (Epoch)", MACHINE_SUPPORTS_SAVE ) @@ -3355,7 +3355,7 @@ SYST( 1979, mcompgin, 0, 0, mcompgin, mcompgin, mcompgin_state, empt SYST( 1979, mvbfree, 0, 0, mvbfree, mvbfree, mvbfree_state, empty_init, "Mego", "Mini-Vid: Break Free", MACHINE_SUPPORTS_SAVE ) -SYST( 1980, grobot9, 0, 0, grobot9, grobot9, grobot9_state, empty_init, "Takatoku Toys", "Game Robot 9", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the games: *** +SYST( 1980, grobot9, 0, 0, grobot9, grobot9, grobot9_state, empty_init, "Takatoku Toys", "Game Robot 9", MACHINE_SUPPORTS_SAVE ) // some of the games: *** SYST( 1980, tccombat, 0, 0, tccombat, tccombat, tccombat_state, empty_init, "Tomy", "Cosmic Combat", MACHINE_SUPPORTS_SAVE ) SYST( 1980, tmtennis, 0, 0, tmtennis, tmtennis, tmtennis_state, empty_init, "Tomy", "Tennis (Tomy)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/academy.cpp b/src/mame/hegenerglaser/academy.cpp index 31a74040934d8..48fea7b8a94cd 100644 --- a/src/mame/hegenerglaser/academy.cpp +++ b/src/mame/hegenerglaser/academy.cpp @@ -201,10 +201,10 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, academy, 0, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (English, 04-10-88)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, academyg, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 06-03-89)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, academyga, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 04-10-88)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, academygb, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 27-08-88)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, academyd, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (Dutch, 04-10-88)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, academy, 0, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (English, 04-10-88)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, academyg, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 06-03-89)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, academyga, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 04-10-88)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, academygb, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 27-08-88)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, academyd, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (Dutch, 04-10-88)", MACHINE_SUPPORTS_SAVE ) -SYST( 1989, academytt, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy T+T (Dutch, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, academytt, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy T+T (Dutch, prototype)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/amsterdam.cpp b/src/mame/hegenerglaser/amsterdam.cpp index 1f189ff3e3f29..29fa3ca03fb68 100644 --- a/src/mame/hegenerglaser/amsterdam.cpp +++ b/src/mame/hegenerglaser/amsterdam.cpp @@ -255,11 +255,11 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1985, amsterd, 0, 0, amsterdam, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Amsterdam", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, amsterd, 0, 0, amsterdam, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Amsterdam", MACHINE_SUPPORTS_SAVE ) -SYST( 1986, dallas32, 0, 0, dallas32, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68020 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, dallas32a, dallas32, 0, dallas32, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68020 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, dallas16, dallas32, 0, amsterdam, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, dallas32, 0, 0, dallas32, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68020 (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, dallas32a, dallas32, 0, dallas32, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68020 (set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, dallas16, dallas32, 0, amsterdam, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68000", MACHINE_SUPPORTS_SAVE ) -SYST( 1987, roma32, 0, 0, dallas32, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Roma 68020", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, roma16, roma32, 0, amsterdam, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Roma 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, roma32, 0, 0, dallas32, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Roma 68020", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, roma16, roma32, 0, amsterdam, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Roma 68000", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/berlin.cpp b/src/mame/hegenerglaser/berlin.cpp index 0bc07fe8755a0..5b4ab1ce6aec8 100644 --- a/src/mame/hegenerglaser/berlin.cpp +++ b/src/mame/hegenerglaser/berlin.cpp @@ -202,9 +202,9 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1992, berl16, 0, 0, berlin, berlin, berlin_state, empty_init, "Hegener + Glaser", "Mephisto Berlin 68000 (v0.03)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1992, berl16a, berl16, 0, berlin, berlin, berlin_state, empty_init, "Hegener + Glaser", "Mephisto Berlin 68000 (v0.02)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1996, berl16l, berl16, 0, berlin, berlin, berlin_state, empty_init, "Richard Lang", "Mephisto Berlin 68000 (London upgrade)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1992, berl16, 0, 0, berlin, berlin, berlin_state, empty_init, "Hegener + Glaser", "Mephisto Berlin 68000 (v0.03)", MACHINE_SUPPORTS_SAVE ) +SYST( 1992, berl16a, berl16, 0, berlin, berlin, berlin_state, empty_init, "Hegener + Glaser", "Mephisto Berlin 68000 (v0.02)", MACHINE_SUPPORTS_SAVE ) +SYST( 1996, berl16l, berl16, 0, berlin, berlin, berlin_state, empty_init, "Richard Lang", "Mephisto Berlin 68000 (London upgrade)", MACHINE_SUPPORTS_SAVE ) -SYST( 1994, berlinp, 0, 0, berlinp, berlin, berlin_state, empty_init, "Hegener + Glaser", "Mephisto Berlin Professional 68020", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1996, berlinpl, berlinp, 0, berlinp, berlin, berlin_state, empty_init, "Richard Lang", "Mephisto Berlin Professional 68020 (London upgrade)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1994, berlinp, 0, 0, berlinp, berlin, berlin_state, empty_init, "Hegener + Glaser", "Mephisto Berlin Professional 68020", MACHINE_SUPPORTS_SAVE ) +SYST( 1996, berlinpl, berlinp, 0, berlinp, berlin, berlin_state, empty_init, "Richard Lang", "Mephisto Berlin Professional 68020 (London upgrade)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/brikett.cpp b/src/mame/hegenerglaser/brikett.cpp index 5e53fd18d3da0..b643045a78874 100644 --- a/src/mame/hegenerglaser/brikett.cpp +++ b/src/mame/hegenerglaser/brikett.cpp @@ -597,17 +597,17 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, mephisto, 0, 0, mephisto, mephisto, brikett_state, empty_init, "Hegener + Glaser", "Mephisto", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, mephisto, 0, 0, mephisto, mephisto, brikett_state, empty_init, "Hegener + Glaser", "Mephisto", MACHINE_SUPPORTS_SAVE ) -SYST( 1981, mephisto1x, 0, 0, mephisto2, mephisto, brikett_state, empty_init, "Hegener + Glaser", "Mephisto 1X", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, mephistoj, 0, 0, mephistoj, mephistoj, brikett_state, empty_init, "Hegener + Glaser", "Mephisto Junior (1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // there's also a "Mephisto Junior" from 1990 +SYST( 1981, mephisto1x, 0, 0, mephisto2, mephisto, brikett_state, empty_init, "Hegener + Glaser", "Mephisto 1X", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, mephistoj, 0, 0, mephistoj, mephistoj, brikett_state, empty_init, "Hegener + Glaser", "Mephisto Junior (1982 version)", MACHINE_SUPPORTS_SAVE ) // there's also a "Mephisto Junior" from 1990 -SYST( 1981, mephisto2, 0, 0, mephisto2, mephisto, brikett_state, empty_init, "Hegener + Glaser", "Mephisto II (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1981, mephisto2a, mephisto2, 0, mephisto2, mephisto, brikett_state, empty_init, "Hegener + Glaser", "Mephisto II (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, mephisto2, 0, 0, mephisto2, mephisto, brikett_state, empty_init, "Hegener + Glaser", "Mephisto II (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, mephisto2a, mephisto2, 0, mephisto2, mephisto, brikett_state, empty_init, "Hegener + Glaser", "Mephisto II (set 2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1981, mephisto2e, 0, 0, mephisto2e, mephisto2e, brikett_state, empty_init, "Hegener + Glaser", "Mephisto ESB II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, mephisto2e, 0, 0, mephisto2e, mephisto2e, brikett_state, empty_init, "Hegener + Glaser", "Mephisto ESB II", MACHINE_SUPPORTS_SAVE ) -SYST( 1983, mephisto3, 0, 0, mephisto3, mephisto3, brikett_state, empty_init, "Hegener + Glaser", "Mephisto III (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, mephisto3a, mephisto3, 0, mephisto3, mephisto3, brikett_state, empty_init, "Hegener + Glaser", "Mephisto III (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, mephisto3b, mephisto3, 0, mephisto3, mephisto3, brikett_state, empty_init, "Hegener + Glaser", "Mephisto III (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, mephisto3c, mephisto3, 0, mephisto3, mephisto3, brikett_state, empty_init, "Hegener + Glaser", "Mephisto III (set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, mephisto3, 0, 0, mephisto3, mephisto3, brikett_state, empty_init, "Hegener + Glaser", "Mephisto III (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, mephisto3a, mephisto3, 0, mephisto3, mephisto3, brikett_state, empty_init, "Hegener + Glaser", "Mephisto III (set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, mephisto3b, mephisto3, 0, mephisto3, mephisto3, brikett_state, empty_init, "Hegener + Glaser", "Mephisto III (set 3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, mephisto3c, mephisto3, 0, mephisto3, mephisto3, brikett_state, empty_init, "Hegener + Glaser", "Mephisto III (set 4)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/europa.cpp b/src/mame/hegenerglaser/europa.cpp index b8269f8f81a10..d4eede6a7a9dd 100644 --- a/src/mame/hegenerglaser/europa.cpp +++ b/src/mame/hegenerglaser/europa.cpp @@ -224,4 +224,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, europa, 0, 0, europa, europa, europa_state, empty_init, "Hegener + Glaser", "Mephisto Europa", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, europa, 0, 0, europa, europa, europa_state, empty_init, "Hegener + Glaser", "Mephisto Europa", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/glasgow.cpp b/src/mame/hegenerglaser/glasgow.cpp index be19a3c06b68e..2fe7ad3b2fa2e 100644 --- a/src/mame/hegenerglaser/glasgow.cpp +++ b/src/mame/hegenerglaser/glasgow.cpp @@ -240,9 +240,9 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1984, glasgow, 0, 0, glasgow, glasgow, glasgow_state, empty_init, "Hegener + Glaser", "Mephisto III-S Glasgow", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1984, glasgow, 0, 0, glasgow, glasgow, glasgow_state, empty_init, "Hegener + Glaser", "Mephisto III-S Glasgow", MACHINE_SUPPORTS_SAVE ) // newer chesscomputers on 4-ROM hardware (see amsterdam.cpp for parent sets) -SYST( 1985, amsterdg, amsterd, 0, glasgow, glasgow, glasgow_state, empty_init, "Hegener + Glaser", "Mephisto Amsterdam (Glasgow hardware)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, dallas16g, dallas32, 0, glasgow, glasgow, glasgow_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68000 (Glasgow hardware)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, roma16g, roma32, 0, glasgow, glasgow, glasgow_state, empty_init, "Hegener + Glaser", "Mephisto Roma 68000 (Glasgow hardware)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, amsterdg, amsterd, 0, glasgow, glasgow, glasgow_state, empty_init, "Hegener + Glaser", "Mephisto Amsterdam (Glasgow hardware)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, dallas16g, dallas32, 0, glasgow, glasgow, glasgow_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68000 (Glasgow hardware)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, roma16g, roma32, 0, glasgow, glasgow, glasgow_state, empty_init, "Hegener + Glaser", "Mephisto Roma 68000 (Glasgow hardware)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/milano.cpp b/src/mame/hegenerglaser/milano.cpp index d2d890683119d..15022e7cc1842 100644 --- a/src/mame/hegenerglaser/milano.cpp +++ b/src/mame/hegenerglaser/milano.cpp @@ -220,7 +220,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1991, milano, 0, 0, milano, milano, milano_state, empty_init, "Hegener + Glaser", "Mephisto Milano (v1.02)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, milanoa, milano, 0, milano, milano, milano_state, empty_init, "Hegener + Glaser", "Mephisto Milano (v1.01)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, milano, 0, 0, milano, milano, milano_state, empty_init, "Hegener + Glaser", "Mephisto Milano (v1.02)", MACHINE_SUPPORTS_SAVE ) +SYST( 1991, milanoa, milano, 0, milano, milano, milano_state, empty_init, "Hegener + Glaser", "Mephisto Milano (v1.01)", MACHINE_SUPPORTS_SAVE ) -SYST( 1993, nshort, 0, 0, milano, milano, milano_state, empty_init, "Hegener + Glaser", "Mephisto Nigel Short", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1993, nshort, 0, 0, milano, milano, milano_state, empty_init, "Hegener + Glaser", "Mephisto Nigel Short", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/mm1.cpp b/src/mame/hegenerglaser/mm1.cpp index 5919f6bb5953a..635420f1aefde 100644 --- a/src/mame/hegenerglaser/mm1.cpp +++ b/src/mame/hegenerglaser/mm1.cpp @@ -320,7 +320,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1983, mm1, 0, 0, mm1, mm1, mm1_state, empty_init, "Hegener + Glaser", "Mephisto MM I (ver. A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, mm1b, mm1, 0, mm1, mm1, mm1_state, empty_init, "Hegener + Glaser", "Mephisto MM I (ver. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, mm1, 0, 0, mm1, mm1, mm1_state, empty_init, "Hegener + Glaser", "Mephisto MM I (ver. A)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, mm1b, mm1, 0, mm1, mm1, mm1_state, empty_init, "Hegener + Glaser", "Mephisto MM I (ver. B)", MACHINE_SUPPORTS_SAVE ) -SYST( 1984, mmirage, 0, 0, mirage, mirage, mm1_state, empty_init, "Hegener + Glaser", "Mephisto Mirage", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1984, mmirage, 0, 0, mirage, mirage, mm1_state, empty_init, "Hegener + Glaser", "Mephisto Mirage", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/mm2.cpp b/src/mame/hegenerglaser/mm2.cpp index 183238732be9d..e820d50e13521 100644 --- a/src/mame/hegenerglaser/mm2.cpp +++ b/src/mame/hegenerglaser/mm2.cpp @@ -547,27 +547,27 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1985, bup, 0, 0, bup, bup, mm2_state, empty_init, "Hegener + Glaser", u8"Mephisto Blitz- und Problemlösungs-Modul (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, bupa, bup, 0, bup, bup, mm2_state, empty_init, "Hegener + Glaser", u8"Mephisto Blitz- und Problemlösungs-Modul (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -SYST( 1985, mm2, 0, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 1, v4.00)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, mm2a, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 2, v3.00)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, mm2b, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 3, v2.00)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, mm2c, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, mm2d, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, mm2e, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -SYST( 1985, mm2nona, 0, 0, mm2nona, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (Nona program, DOCCC 1985 Leiden TM)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -SYST( 1986, rebel5, 0, 0, rebel5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto Rebell 5,0 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka MM III -SYST( 1986, rebel5a, rebel5, 0, rebel5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto Rebell 5,0 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // " -SYST( 1986, rebel5b, rebel5, 0, rebel5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto Rebell 5,0 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // " - -SYST( 1987, mm4, 0, 0, mm4, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM IV (v7.10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, mm4a, mm4, 0, mm4, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM IV (v7.00)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, mm4b, mm4, 0, mm4, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM IV (v6.00)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, mm4tk, mm4, 0, mm4tk, mm2, mm2_state, empty_init, "hack", "Mephisto MM IV (TurboKit)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING ) - -SYST( 1990, mm5, 0, 0, mm5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (v5.1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, mm5a, mm5, 0, mm5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (v5.0)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, mm5p, mm5, 0, mm5p, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (WMCCC 1989 Portorose TM)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING ) // aka Rebel +SYST( 1985, bup, 0, 0, bup, bup, mm2_state, empty_init, "Hegener + Glaser", u8"Mephisto Blitz- und Problemlösungs-Modul (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, bupa, bup, 0, bup, bup, mm2_state, empty_init, "Hegener + Glaser", u8"Mephisto Blitz- und Problemlösungs-Modul (set 2)", MACHINE_SUPPORTS_SAVE ) + +SYST( 1985, mm2, 0, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 1, v4.00)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, mm2a, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 2, v3.00)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, mm2b, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 3, v2.00)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, mm2c, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 4)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, mm2d, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 5)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, mm2e, mm2, 0, mm2, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (set 6)", MACHINE_SUPPORTS_SAVE ) + +SYST( 1985, mm2nona, 0, 0, mm2nona, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM II (Nona program, DOCCC 1985 Leiden TM)", MACHINE_SUPPORTS_SAVE ) + +SYST( 1986, rebel5, 0, 0, rebel5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto Rebell 5,0 (set 1)", MACHINE_SUPPORTS_SAVE ) // aka MM III +SYST( 1986, rebel5a, rebel5, 0, rebel5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto Rebell 5,0 (set 2)", MACHINE_SUPPORTS_SAVE ) // " +SYST( 1986, rebel5b, rebel5, 0, rebel5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto Rebell 5,0 (set 3)", MACHINE_SUPPORTS_SAVE ) // " + +SYST( 1987, mm4, 0, 0, mm4, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM IV (v7.10)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, mm4a, mm4, 0, mm4, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM IV (v7.00)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, mm4b, mm4, 0, mm4, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM IV (v6.00)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, mm4tk, mm4, 0, mm4tk, mm2, mm2_state, empty_init, "hack", "Mephisto MM IV (TurboKit)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) + +SYST( 1990, mm5, 0, 0, mm5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (v5.1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, mm5a, mm5, 0, mm5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (v5.0)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, mm5p, mm5, 0, mm5p, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (WMCCC 1989 Portorose TM)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // aka Rebel diff --git a/src/mame/hegenerglaser/modena.cpp b/src/mame/hegenerglaser/modena.cpp index 686ad8a30955c..824c13a1b0712 100644 --- a/src/mame/hegenerglaser/modena.cpp +++ b/src/mame/hegenerglaser/modena.cpp @@ -223,6 +223,6 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1992, modena, 0, 0, modena, modena, modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1992, modenaa, modena, 0, modena, modena, modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1992, modenab, modena, 0, modena, modena, modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1992, modena, 0, 0, modena, modena, modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1992, modenaa, modena, 0, modena, modena, modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1992, modenab, modena, 0, modena, modena, modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 3)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/modular.cpp b/src/mame/hegenerglaser/modular.cpp index 4148716201c35..8ffbd0da37295 100644 --- a/src/mame/hegenerglaser/modular.cpp +++ b/src/mame/hegenerglaser/modular.cpp @@ -622,24 +622,24 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, alm32, 0, 0, alm32, alm32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Almeria 32 Bit", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 0.12 or 0.121? -SYST( 1988, alm16, alm32, 0, alm16, alm16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Almeria 16 Bit (v0.13)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, alm16a, alm32, 0, alm16, alm16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Almeria 16 Bit (v0.121)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, alm32, 0, 0, alm32, alm32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Almeria 32 Bit", MACHINE_SUPPORTS_SAVE ) // 0.12 or 0.121? +SYST( 1988, alm16, alm32, 0, alm16, alm16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Almeria 16 Bit (v0.13)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, alm16a, alm32, 0, alm16, alm16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Almeria 16 Bit (v0.121)", MACHINE_SUPPORTS_SAVE ) -SYST( 1989, port32, 0, 0, port32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 32 Bit (v1.04)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, port32a, port32, 0, port32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 32 Bit (v1.03)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, port32b, port32, 0, port32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 32 Bit (v1.01)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, port16, port32, 0, port16, port16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 16 Bit (v1.01)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, port32, 0, 0, port32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 32 Bit (v1.04)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, port32a, port32, 0, port32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 32 Bit (v1.03)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, port32b, port32, 0, port32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 32 Bit (v1.01)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, port16, port32, 0, port16, port16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 16 Bit (v1.01)", MACHINE_SUPPORTS_SAVE ) -SYST( 1990, lyon32, 0, 0, port32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Lyon 32 Bit", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, lyon16, lyon32, 0, port16, port16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Lyon 16 Bit", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, lyon32, 0, 0, port32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Lyon 32 Bit", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, lyon16, lyon32, 0, port16, port16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Lyon 16 Bit", MACHINE_SUPPORTS_SAVE ) -SYST( 1991, van32, 0, 0, van32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Vancouver 32 Bit", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, van16, van32, 0, van16, port16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Vancouver 16 Bit", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, van32, 0, 0, van32, port32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Vancouver 32 Bit", MACHINE_SUPPORTS_SAVE ) +SYST( 1991, van16, van32, 0, van16, port16, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Vancouver 16 Bit", MACHINE_SUPPORTS_SAVE ) -SYST( 1993, gen32, 0, 0, gen32, gen32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Genius 68030 (v4.01)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1993, gen32a, gen32, 0, gen32, gen32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Genius 68030 (v4.00)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1996, gen32l, gen32, 0, gen32, gen32, mmodular_state, empty_init, "Richard Lang", "Mephisto Genius 68030 (London upgrade)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1993, gen32, 0, 0, gen32, gen32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Genius 68030 (v4.01)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) +SYST( 1993, gen32a, gen32, 0, gen32, gen32, mmodular_state, empty_init, "Hegener + Glaser", "Mephisto Genius 68030 (v4.00)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) +SYST( 1996, gen32l, gen32, 0, gen32, gen32, mmodular_state, empty_init, "Richard Lang", "Mephisto Genius 68030 (London upgrade)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) -SYST( 1996, lond32, 0, 0, van32, port32, mmodular_state, empty_init, "Richard Lang", "Mephisto London 32 Bit", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // for alm32/port32/lyon32/van32 -SYST( 1996, lond16, lond32, 0, van16, port16, mmodular_state, empty_init, "Richard Lang", "Mephisto London 16 Bit", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // for alm16/port16/lyon16/van16 +SYST( 1996, lond32, 0, 0, van32, port32, mmodular_state, empty_init, "Richard Lang", "Mephisto London 32 Bit", MACHINE_SUPPORTS_SAVE ) // for alm32/port32/lyon32/van32 +SYST( 1996, lond16, lond32, 0, van16, port16, mmodular_state, empty_init, "Richard Lang", "Mephisto London 16 Bit", MACHINE_SUPPORTS_SAVE ) // for alm16/port16/lyon16/van16 diff --git a/src/mame/hegenerglaser/modular_tm.cpp b/src/mame/hegenerglaser/modular_tm.cpp index 956ca1a4952e1..d87ead3d2c7bc 100644 --- a/src/mame/hegenerglaser/modular_tm.cpp +++ b/src/mame/hegenerglaser/modular_tm.cpp @@ -292,14 +292,14 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, port32t, port32, 0, mmtm_v, mmtm_v, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 68030", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, port32t, port32, 0, mmtm_v, mmtm_v, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto Portorose 68030", MACHINE_SUPPORTS_SAVE ) -SYST( 1990, lyon32t, lyon32, 0, mmtm_v, mmtm_v, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto Lyon 68030", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, lyon32t8, lyon32, 0, mmtm_t, mmtm_t, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto TM Lyon", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, lyon32t, lyon32, 0, mmtm_v, mmtm_v, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto Lyon 68030", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, lyon32t8, lyon32, 0, mmtm_t, mmtm_t, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto TM Lyon", MACHINE_SUPPORTS_SAVE ) -SYST( 1991, van32t, van32, 0, mmtm_v, mmtm_v, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto Vancouver 68030", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, van32t8, van32, 0, mmtm_t, mmtm_t, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto TM Vancouver", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, berl32t8p, van32, 0, mmtm_t, mmtm_t, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto TM Berlin (prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, van32t, van32, 0, mmtm_v, mmtm_v, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto Vancouver 68030", MACHINE_SUPPORTS_SAVE ) +SYST( 1991, van32t8, van32, 0, mmtm_t, mmtm_t, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto TM Vancouver", MACHINE_SUPPORTS_SAVE ) +SYST( 1991, berl32t8p, van32, 0, mmtm_t, mmtm_t, mmtm_state, empty_init, "Hegener + Glaser", "Mephisto TM Berlin (prototype)", MACHINE_SUPPORTS_SAVE ) -SYST( 1996, lond32t, lond32, 0, mmtm_v, mmtm_v, mmtm_state, empty_init, "Saitek", "Mephisto London 68030", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // after Saitek took over H+G -SYST( 1996, lond32t8, lond32, 0, mmtm_t, mmtm_t, mmtm_state, empty_init, "Saitek", "Mephisto TM London", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // " +SYST( 1996, lond32t, lond32, 0, mmtm_v, mmtm_v, mmtm_state, empty_init, "Saitek", "Mephisto London 68030", MACHINE_SUPPORTS_SAVE ) // after Saitek took over H+G +SYST( 1996, lond32t8, lond32, 0, mmtm_t, mmtm_t, mmtm_state, empty_init, "Saitek", "Mephisto TM London", MACHINE_SUPPORTS_SAVE ) // " diff --git a/src/mame/hegenerglaser/mondial.cpp b/src/mame/hegenerglaser/mondial.cpp index c40fd9cb54f78..db074497daa57 100644 --- a/src/mame/hegenerglaser/mondial.cpp +++ b/src/mame/hegenerglaser/mondial.cpp @@ -209,4 +209,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1985, mondial, 0, 0, mondial, mondial, mondial_state, empty_init, "Hegener + Glaser", "Mephisto Mondial", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, mondial, 0, 0, mondial, mondial, mondial_state, empty_init, "Hegener + Glaser", "Mephisto Mondial", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/mondial2.cpp b/src/mame/hegenerglaser/mondial2.cpp index 4eb1acd7c0532..739d8fd6479fc 100644 --- a/src/mame/hegenerglaser/mondial2.cpp +++ b/src/mame/hegenerglaser/mondial2.cpp @@ -214,4 +214,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, mondial2, 0, 0, mondial2, mondial2, mondial2_state, empty_init, "Hegener + Glaser", "Mephisto Mondial II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, mondial2, 0, 0, mondial2, mondial2, mondial2_state, empty_init, "Hegener + Glaser", "Mephisto Mondial II", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/mondial68k.cpp b/src/mame/hegenerglaser/mondial68k.cpp index 9fc3fbe680b01..a21e17b8e692c 100644 --- a/src/mame/hegenerglaser/mondial68k.cpp +++ b/src/mame/hegenerglaser/mondial68k.cpp @@ -240,4 +240,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, mondl68k, 0, 0, mondial68k, mondial68k, mondial68k_state, empty_init, "Hegener + Glaser", "Mephisto Mondial 68000XL", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, mondl68k, 0, 0, mondial68k, mondial68k, mondial68k_state, empty_init, "Hegener + Glaser", "Mephisto Mondial 68000XL", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/montec.cpp b/src/mame/hegenerglaser/montec.cpp index 040ea4c886dc4..7d60e03970bfb 100644 --- a/src/mame/hegenerglaser/montec.cpp +++ b/src/mame/hegenerglaser/montec.cpp @@ -267,8 +267,8 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, montec, 0, 0, montec, montec, montec_state, empty_init, "Hegener + Glaser", "Mephisto Monte Carlo (ver. MC3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, monteca, montec, 0, montec, montec, montec_state, empty_init, "Hegener + Glaser", "Mephisto Monte Carlo (ver. MC2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, montec, 0, 0, montec, montec, montec_state, empty_init, "Hegener + Glaser", "Mephisto Monte Carlo (ver. MC3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, monteca, montec, 0, montec, montec, montec_state, empty_init, "Hegener + Glaser", "Mephisto Monte Carlo (ver. MC2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1989, montec4, 0, 0, montec4, montec, montec_state, empty_init, "Hegener + Glaser", "Mephisto Monte Carlo IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, montec4le, montec4, 0, montec4le, montec, montec_state, empty_init, "Hegener + Glaser", "Mephisto Monte Carlo IV: Limited Edition", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, montec4, 0, 0, montec4, montec, montec_state, empty_init, "Hegener + Glaser", "Mephisto Monte Carlo IV", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, montec4le, montec4, 0, montec4le, montec, montec_state, empty_init, "Hegener + Glaser", "Mephisto Monte Carlo IV: Limited Edition", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/polgar.cpp b/src/mame/hegenerglaser/polgar.cpp index bd72b9aaff942..4a2e37300f299 100644 --- a/src/mame/hegenerglaser/polgar.cpp +++ b/src/mame/hegenerglaser/polgar.cpp @@ -176,7 +176,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1990, polgar, 0, 0, polgar, polgar, polgar_state, empty_init, "Hegener + Glaser", "Mephisto Polgar (v1.50)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, polgara, polgar, 0, polgar, polgar, polgar_state, empty_init, "Hegener + Glaser", "Mephisto Polgar (v1.10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, polgar101, polgar, 0, polgar10, polgar, polgar_state, empty_init, "Hegener + Glaser", "Mephisto Polgar 10 MHz (v10.1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, polgar10, polgar, 0, polgar10, polgar, polgar_state, empty_init, "Hegener + Glaser", "Mephisto Polgar 10 MHz (v10.0)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, polgar, 0, 0, polgar, polgar, polgar_state, empty_init, "Hegener + Glaser", "Mephisto Polgar (v1.50)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, polgara, polgar, 0, polgar, polgar, polgar_state, empty_init, "Hegener + Glaser", "Mephisto Polgar (v1.10)", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, polgar101, polgar, 0, polgar10, polgar, polgar_state, empty_init, "Hegener + Glaser", "Mephisto Polgar 10 MHz (v10.1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, polgar10, polgar, 0, polgar10, polgar, polgar_state, empty_init, "Hegener + Glaser", "Mephisto Polgar 10 MHz (v10.0)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/risc.cpp b/src/mame/hegenerglaser/risc.cpp index 143b942b61952..c65c201d30a48 100644 --- a/src/mame/hegenerglaser/risc.cpp +++ b/src/mame/hegenerglaser/risc.cpp @@ -197,5 +197,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1992, mrisc, 0, 0, mrisc, mrisc, risc_state, empty_init, "Hegener + Glaser / Tasc", "Mephisto Risc 1MB", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1994, mrisc2, mrisc, 0, mrisc, mrisc, risc_state, empty_init, "Hegener + Glaser / Tasc", "Mephisto Risc II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1992, mrisc, 0, 0, mrisc, mrisc, risc_state, empty_init, "Hegener + Glaser / Tasc", "Mephisto Risc 1MB", MACHINE_SUPPORTS_SAVE ) +SYST( 1994, mrisc2, mrisc, 0, mrisc, mrisc, risc_state, empty_init, "Hegener + Glaser / Tasc", "Mephisto Risc II", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/roma2.cpp b/src/mame/hegenerglaser/roma2.cpp index 5c904a5219b7c..e65238d70f727 100644 --- a/src/mame/hegenerglaser/roma2.cpp +++ b/src/mame/hegenerglaser/roma2.cpp @@ -237,5 +237,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, roma2, 0, 0, roma2, roma2, roma2_state, empty_init, "Hegener + Glaser", "Mephisto Roma II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1993, montreal, 0, 0, montreal, montreal, roma2_state, empty_init, "Hegener + Glaser", "Mephisto Montreal 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, roma2, 0, 0, roma2, roma2, roma2_state, empty_init, "Hegener + Glaser", "Mephisto Roma II", MACHINE_SUPPORTS_SAVE ) +SYST( 1993, montreal, 0, 0, montreal, montreal, roma2_state, empty_init, "Hegener + Glaser", "Mephisto Montreal 68000", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/smondial.cpp b/src/mame/hegenerglaser/smondial.cpp index fffa3ccf140b3..240a47701a411 100644 --- a/src/mame/hegenerglaser/smondial.cpp +++ b/src/mame/hegenerglaser/smondial.cpp @@ -401,11 +401,11 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, smondial, 0, 0, smondiala, smondial, smondiala_state, empty_init, "Hegener + Glaser", "Mephisto Super Mondial (ver. A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, smondialab, smondial, 0, smondiala, smondial, smondiala_state, empty_init, "Hegener + Glaser", "Mephisto Super Mondial (ver. AB)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, smondialb, smondial, 0, smondialb, smondial, smondialb_state, empty_init, "Hegener + Glaser", "Mephisto Super Mondial (ver. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, smondial, 0, 0, smondiala, smondial, smondiala_state, empty_init, "Hegener + Glaser", "Mephisto Super Mondial (ver. A)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, smondialab, smondial, 0, smondiala, smondial, smondiala_state, empty_init, "Hegener + Glaser", "Mephisto Super Mondial (ver. AB)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, smondialb, smondial, 0, smondialb, smondial, smondialb_state, empty_init, "Hegener + Glaser", "Mephisto Super Mondial (ver. B)", MACHINE_SUPPORTS_SAVE ) -SYST( 1988, smondial2, 0, 0, smondial2, smondial2, smondialb_state, empty_init, "Hegener + Glaser", "Mephisto Super Mondial II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, smondial2, 0, 0, smondial2, smondial2, smondialb_state, empty_init, "Hegener + Glaser", "Mephisto Super Mondial II", MACHINE_SUPPORTS_SAVE ) -SYST( 1988, mega4, 0, 0, mega4, smondial, smondialb_state, empty_init, "Hegener + Glaser", "Mephisto Mega IV (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, mega4a, mega4, 0, mega4, smondial, smondialb_state, empty_init, "Hegener + Glaser", "Mephisto Mega IV (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, mega4, 0, 0, mega4, smondial, smondialb_state, empty_init, "Hegener + Glaser", "Mephisto Mega IV (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, mega4a, mega4, 0, mega4, smondial, smondialb_state, empty_init, "Hegener + Glaser", "Mephisto Mega IV (set 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/igt/peplus.cpp b/src/mame/igt/peplus.cpp index b0350a7dc967c..3fa0a3018c84a 100644 --- a/src/mame/igt/peplus.cpp +++ b/src/mame/igt/peplus.cpp @@ -16196,19 +16196,19 @@ GAMEL( 1994, pebe0014, pebe0013, peplus, peplus_bjack, peplus_state, init_pepl GAMEL( 1994, pebe0014a, pebe0013, peplus, peplus_bjack, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (BE0014) Blackjack (International English/Spanish)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_pe_bjack ) // Needs CG1339 graphics roms // Normal board Keno -GAMEL( 1994, peke0004, 0, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0004) Keno (set 1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke0004a, peke0004, peplus, peplus_keno, peplus_state, init_nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0004) Keno (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke0004b, peke0004, peplus, peplus_keno, peplus_state, init_nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0004) Keno (set 3)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke0017, peke0004, peplus, peplus_keno, peplus_state, init_nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0017) Keno (set 1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke0017a, peke0004, peplus, peplus_keno, peplus_state, init_nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0017) Keno (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke0026, peke0004, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0026) Keno", MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) // Needs printer support -GAMEL( 1994, peke1001, 0, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1001) Keno", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke1006, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1006) Keno", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke1012, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1012) Keno (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke1012a, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1012) Keno (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke1012b, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1012) Keno (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke1013, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1013) Keno (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1994, peke1013a, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1013) Keno (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) +GAMEL( 1994, peke0004, 0, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0004) Keno (set 1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE , layout_pe_keno ) +GAMEL( 1994, peke0004a, peke0004, peplus, peplus_keno, peplus_state, init_nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0004) Keno (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE , layout_pe_keno ) +GAMEL( 1994, peke0004b, peke0004, peplus, peplus_keno, peplus_state, init_nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0004) Keno (set 3)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE , layout_pe_keno ) +GAMEL( 1994, peke0017, peke0004, peplus, peplus_keno, peplus_state, init_nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0017) Keno (set 1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE , layout_pe_keno ) +GAMEL( 1994, peke0017a, peke0004, peplus, peplus_keno, peplus_state, init_nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0017) Keno (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE , layout_pe_keno ) +GAMEL( 1994, peke0026, peke0004, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0026) Keno", MACHINE_NOT_WORKING | MACHINE_NODEVICE_PRINTER | MACHINE_SUPPORTS_SAVE , layout_pe_keno ) // Needs printer support +GAMEL( 1994, peke1001, 0, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1001) Keno", MACHINE_SUPPORTS_SAVE, layout_pe_keno ) +GAMEL( 1994, peke1006, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1006) Keno", MACHINE_SUPPORTS_SAVE, layout_pe_keno ) +GAMEL( 1994, peke1012, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1012) Keno (set 1)", MACHINE_SUPPORTS_SAVE, layout_pe_keno ) +GAMEL( 1994, peke1012a, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1012) Keno (set 2)", MACHINE_SUPPORTS_SAVE, layout_pe_keno ) +GAMEL( 1994, peke1012b, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1012) Keno (set 3)", MACHINE_SUPPORTS_SAVE, layout_pe_keno ) +GAMEL( 1994, peke1013, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1013) Keno (set 1)", MACHINE_SUPPORTS_SAVE, layout_pe_keno ) +GAMEL( 1994, peke1013a, peke1001, peplus, peplus_keno, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE1013) Keno (set 2)", MACHINE_SUPPORTS_SAVE, layout_pe_keno ) // Normal board Slots machine GAMEL( 1996, peps0014, 0, peplus, peplus_slots, peplus_state, init_peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (PS0014) Super Joker Slots", MACHINE_SUPPORTS_SAVE, layout_pe_slots ) @@ -16489,9 +16489,9 @@ GAMEL( 1995, pexmp026, 0, peplus, peplus_poker, peplus_state, init_pepl GAMEL( 1995, pexmp030, 0, peplus, peplus_poker, peplus_state, init_peplussbw, ROT0, "IGT - International Game Technology", "Player's Edge Plus (XMP00030) 5-in-1 Wingboard (CG2451)", MACHINE_SUPPORTS_SAVE, layout_pe_poker ) // Superboard : Keno -GAMEL( 1995, pex0006k, 0, peplus, peplus_keno, peplus_state, init_peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000006K+XK000001) Keno", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1995, pex0013k, pex0006k, peplus, peplus_keno, peplus_state, init_peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000013K+XK000011) Keno", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) -GAMEL( 1995, pex0013ka, pex0006k, peplus, peplus_keno, peplus_state, init_peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000013K+XK000012) Keno", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_pe_keno ) +GAMEL( 1995, pex0006k, 0, peplus, peplus_keno, peplus_state, init_peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000006K+XK000001) Keno", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_pe_keno ) +GAMEL( 1995, pex0013k, pex0006k, peplus, peplus_keno, peplus_state, init_peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000013K+XK000011) Keno", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_pe_keno ) +GAMEL( 1995, pex0013ka, pex0006k, peplus, peplus_keno, peplus_state, init_peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000013K+XK000012) Keno", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_pe_keno ) // Superboard : Slots machine GAMEL( 1997, pex0827s, 0, peplus, peplus_slots, peplus_state, init_peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000827S+XS000002) Red, White & Blue Slots", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE, layout_pe_slots ) // Wrong CG graphics and CAPX color chip diff --git a/src/mame/intel/intellec4.cpp b/src/mame/intel/intellec4.cpp index 45e3e80d90d05..65e15a134417a 100644 --- a/src/mame/intel/intellec4.cpp +++ b/src/mame/intel/intellec4.cpp @@ -1486,5 +1486,5 @@ ROM_END ***********************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1973?, intlc44, 0, 0, mod4, mod4, mod4_state, empty_init, "Intel", "INTELLEC 4/MOD 4", MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK | MACHINE_SUPPORTS_SAVE ) -COMP( 1974?, intlc440, 0, 0, mod40, mod40, mod40_state, empty_init, "Intel", "INTELLEC 4/MOD 40", MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK | MACHINE_SUPPORTS_SAVE ) +COMP( 1973?, intlc44, 0, 0, mod4, mod4, mod4_state, empty_init, "Intel", "INTELLEC 4/MOD 4", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) +COMP( 1974?, intlc440, 0, 0, mod40, mod40, mod40_state, empty_init, "Intel", "INTELLEC 4/MOD 40", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/jpm/jpmimpctsw.cpp b/src/mame/jpm/jpmimpctsw.cpp index 668e28df24882..b624404b0c017 100644 --- a/src/mame/jpm/jpmimpctsw.cpp +++ b/src/mame/jpm/jpmimpctsw.cpp @@ -11587,11 +11587,11 @@ ROM_END /* Mechanical Below */ -#define GAME_FLAGS MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL|MACHINE_NO_SOUND|MACHINE_CLICKABLE_ARTWORK +#define GAME_FLAGS MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL|MACHINE_NO_SOUND -#define GAME_FLAGS_SOUND MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL|MACHINE_CLICKABLE_ARTWORK +#define GAME_FLAGS_SOUND MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL -#define GAME_FLAGS_WORKING MACHINE_MECHANICAL|MACHINE_CLICKABLE_ARTWORK +#define GAME_FLAGS_WORKING MACHINE_MECHANICAL // ************************************************************************************************************* // JPM + others games with old 'error log' style codes for errors diff --git a/src/mame/jpm/jpmsys5sw.cpp b/src/mame/jpm/jpmsys5sw.cpp index 3f120b0f06d10..8c6c83b8ca7d5 100644 --- a/src/mame/jpm/jpmsys5sw.cpp +++ b/src/mame/jpm/jpmsys5sw.cpp @@ -1406,7 +1406,7 @@ ROM_END -#define GAME_FLAGS MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL|MACHINE_NO_SOUND|MACHINE_CLICKABLE_ARTWORK +#define GAME_FLAGS MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL|MACHINE_NO_SOUND GAME( 199?, j5tstal, 0, jpmsys5_ym, popeye, jpmsys5_state, empty_init, ROT0, "JPM", "JPM System 5 Alpha Display Test Utility (JPM) (SYSTEM5)", GAME_FLAGS ) GAME( 199?, j5tst1, 0, jpmsys5_ym, popeye, jpmsys5_state, empty_init, ROT0, "JPM", "JPM System 5 Test Set (JPM) (SYSTEM5, set 1)", GAME_FLAGS ) diff --git a/src/mame/mattel/chess.cpp b/src/mame/mattel/chess.cpp index 92f5d5723f921..c85da1ca9023b 100644 --- a/src/mame/mattel/chess.cpp +++ b/src/mame/mattel/chess.cpp @@ -245,4 +245,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, mchess, 0, 0, mchess, mchess, mchess_state, empty_init, "Mattel Electronics / Teletape Productions", "Computer Chess (Mattel)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, mchess, 0, 0, mchess, mchess, mchess_state, empty_init, "Mattel Electronics / Teletape Productions", "Computer Chess (Mattel)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/maygay/maygay1bsw.cpp b/src/mame/maygay/maygay1bsw.cpp index 5f154038fc23b..fc7f6a4d15243 100644 --- a/src/mame/maygay/maygay1bsw.cpp +++ b/src/mame/maygay/maygay1bsw.cpp @@ -85,7 +85,7 @@ #include "m1wotwa.lh" -#define GAME_FLAGS MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL|MACHINE_CLICKABLE_ARTWORK +#define GAME_FLAGS MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL // I assume all sets have this, or is M1B different? We don't use it right now anyway. // TODO: Add these to appropriate boards as a BIOS or similar, for now we expect all sets to have them diff --git a/src/mame/miltonbradley/milton6805.cpp b/src/mame/miltonbradley/milton6805.cpp index 126311cd3ab3a..a7833acefba63 100644 --- a/src/mame/miltonbradley/milton6805.cpp +++ b/src/mame/miltonbradley/milton6805.cpp @@ -300,4 +300,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, milton, 0, 0, milton, milton, milton_state, empty_init, "Milton Bradley", "Electronic Milton", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, milton, 0, 0, milton, milton, milton_state, empty_init, "Milton Bradley", "Electronic Milton", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc/ltcasino.cpp b/src/mame/misc/ltcasino.cpp index 139ecc05ccaf1..3c74c9fda0f3d 100644 --- a/src/mame/misc/ltcasino.cpp +++ b/src/mame/misc/ltcasino.cpp @@ -638,7 +638,7 @@ ROM_END //************************************************************************** // YEAR NAME PARENT MACHINE INPUT CLASS INIT ROTATION COMPANY FULLNAME FLAGS -GAMEL( 1982, ltcasino, 0, ltcasino, ltcasino, ltcasino_state, empty_init, ROT0, "Digital Controls Inc.", "Little Casino", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_ltcasino ) -GAMEL( 1983, mv4in1, 0, mv4in1, mv4in1, ltcasino_state, init_mv4in1, ROT0, "Entertainment Enterprises, Ltd.", "Mini Vegas 4in1", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_ltcasinn ) -GAMEL( 1984, ltcasin2, 0, ltcasin2, ltcasin2, ltcasino_state, empty_init, ROT0, "Digital Controls Inc.", "Little Casino II v18.1", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_ltcasinn ) -GAMEL( 1984, ltcasin2a, ltcasin2, ltcasin2, ltcasin2a, ltcasino_state, empty_init, ROT0, "Digital Controls Inc.", "Little Casino II v17.0", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_ltcasinn ) +GAMEL( 1982, ltcasino, 0, ltcasino, ltcasino, ltcasino_state, empty_init, ROT0, "Digital Controls Inc.", "Little Casino", MACHINE_SUPPORTS_SAVE, layout_ltcasino ) +GAMEL( 1983, mv4in1, 0, mv4in1, mv4in1, ltcasino_state, init_mv4in1, ROT0, "Entertainment Enterprises, Ltd.", "Mini Vegas 4in1", MACHINE_SUPPORTS_SAVE, layout_ltcasinn ) +GAMEL( 1984, ltcasin2, 0, ltcasin2, ltcasin2, ltcasino_state, empty_init, ROT0, "Digital Controls Inc.", "Little Casino II v18.1", MACHINE_SUPPORTS_SAVE, layout_ltcasinn ) +GAMEL( 1984, ltcasin2a, ltcasin2, ltcasin2, ltcasin2a, ltcasino_state, empty_init, ROT0, "Digital Controls Inc.", "Little Casino II v17.0", MACHINE_SUPPORTS_SAVE, layout_ltcasinn ) diff --git a/src/mame/misc/rulechan.cpp b/src/mame/misc/rulechan.cpp index f0f01802b1054..2b0081297ae28 100644 --- a/src/mame/misc/rulechan.cpp +++ b/src/mame/misc/rulechan.cpp @@ -810,6 +810,6 @@ void rulechan_state::rulechan_init() * Game Driver(s) * **************************************/ -// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT -GAMEL(1991, rulechan, 0, rulechan, rulechan, rulechan_state, rulechan_init, ROT0, "ElectroChance", "Super Ball (Version EC-3.50 N322)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL | MACHINE_CLICKABLE_ARTWORK, layout_rulechan) -GAMEL(1991, rulechab, 0, rulechan, rulechan, rulechan_state, rulechan_init, ROT0, "ElectroChance", "Super Ball (Version EC-3.50 N165)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL | MACHINE_CLICKABLE_ARTWORK, layout_rulechan) +// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT +GAMEL(1991, rulechan, 0, rulechan, rulechan, rulechan_state, rulechan_init, ROT0, "ElectroChance", "Super Ball (Version EC-3.50 N322)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL, layout_rulechan) +GAMEL(1991, rulechab, 0, rulechan, rulechan, rulechan_state, rulechan_init, ROT0, "ElectroChance", "Super Ball (Version EC-3.50 N165)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL, layout_rulechan) diff --git a/src/mame/misc/trvmadns.cpp b/src/mame/misc/trvmadns.cpp index 1c24ea38eb2c2..3898d555ef603 100644 --- a/src/mame/misc/trvmadns.cpp +++ b/src/mame/misc/trvmadns.cpp @@ -439,5 +439,5 @@ ROM_END //************************************************************************** // YEAR NAME PARENT MACHINE INPUT CLASS INIT ROTATION COMPANY FULLNAME FLAGS -GAME( 1985, trvmadns, 0, trvmadns, trvmadns, trvmadns_state, empty_init, ROT0, "Thunderhead Inc.", "Trivia Madness - Series A Question set", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -GAME( 1985, trvmadnsa, trvmadns, trvmadns, trvmadns, trvmadns_state, empty_init, ROT0, "Thunderhead Inc.", "Trivia Madness - Series B Question set", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +GAME( 1985, trvmadns, 0, trvmadns, trvmadns, trvmadns_state, empty_init, ROT0, "Thunderhead Inc.", "Trivia Madness - Series A Question set", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1985, trvmadnsa, trvmadns, trvmadns, trvmadns, trvmadns_state, empty_init, ROT0, "Thunderhead Inc.", "Trivia Madness - Series B Question set", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/namco/30test.cpp b/src/mame/namco/30test.cpp index b9678742b2fb5..b94de2f9ee240 100644 --- a/src/mame/namco/30test.cpp +++ b/src/mame/namco/30test.cpp @@ -291,4 +291,4 @@ ROM_END ******************************************************************************/ /* YEAR NAME PARENT MACHINE INPUT CLASS INIT MONITOR COMPANY, FULLNAME, FLAGS */ -GAMEL( 1997, 30test, 0, namco_30test, 30test, namco_30test_state, empty_init, ROT0, "Namco", "30 Test (remake)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK, layout_30test ) +GAMEL( 1997, 30test, 0, namco_30test, 30test, namco_30test_state, empty_init, ROT0, "Namco", "30 Test (remake)", MACHINE_SUPPORTS_SAVE, layout_30test ) diff --git a/src/mame/namco/cgang.cpp b/src/mame/namco/cgang.cpp index 73ccdef6b0eca..d5bb39e71bf3e 100644 --- a/src/mame/namco/cgang.cpp +++ b/src/mame/namco/cgang.cpp @@ -861,4 +861,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT MACHINE INPUT CLASS INIT MONITOR COMPANY, FULLNAME, FLAGS -GAME( 1990, cgang, 0, cgang, cgang, cgang_state, empty_init, ROT0, "Namco (Data East license)", "Cosmo Gang (US)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +GAME( 1990, cgang, 0, cgang, cgang, cgang_state, empty_init, ROT0, "Namco (Data East license)", "Cosmo Gang (US)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/namco/wacky_gator.cpp b/src/mame/namco/wacky_gator.cpp index 583e9e28f5335..8f3ba4d7d1fde 100644 --- a/src/mame/namco/wacky_gator.cpp +++ b/src/mame/namco/wacky_gator.cpp @@ -352,4 +352,4 @@ ROM_END } // anonymous namespace -GAME(1988, wackygtr, 0, wackygtr, wackygtr, wackygtr_state, empty_init, ROT0, "Namco (Data East license)", "Wacky Gator (US)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_CLICKABLE_ARTWORK) +GAME(1988, wackygtr, 0, wackygtr, wackygtr, wackygtr_state, empty_init, ROT0, "Namco (Data East license)", "Wacky Gator (US)", MACHINE_IS_SKELETON_MECHANICAL) diff --git a/src/mame/novag/accord.cpp b/src/mame/novag/accord.cpp index 3de3cf1a96939..3c792e55cefce 100644 --- a/src/mame/novag/accord.cpp +++ b/src/mame/novag/accord.cpp @@ -232,4 +232,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, accord, 0, 0, accord, accord, accord_state, empty_init, "Novag Industries", "Accord", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, accord, 0, 0, accord, accord, accord_state, empty_init, "Novag Industries", "Accord", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/cexpert.cpp b/src/mame/novag/cexpert.cpp index 942d169d3ae3d..bc6b3ff2662eb 100644 --- a/src/mame/novag/cexpert.cpp +++ b/src/mame/novag/cexpert.cpp @@ -264,4 +264,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1985, cexpert, 0, 0, cexpert, cexpert, cexpert_state, empty_init, "Novag Industries", "Constellation Expert", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, cexpert, 0, 0, cexpert, cexpert, cexpert_state, empty_init, "Novag Industries", "Constellation Expert", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/cforte.cpp b/src/mame/novag/cforte.cpp index ae53c881c586e..d73742a736053 100644 --- a/src/mame/novag/cforte.cpp +++ b/src/mame/novag/cforte.cpp @@ -293,5 +293,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, cfortea, 0, 0, cforte, cforte, cforte_state, empty_init, "Novag Industries", "Constellation Forte (version A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, cforteb, cfortea, 0, cforte, cforte, cforte_state, empty_init, "Novag Industries", "Constellation Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, cfortea, 0, 0, cforte, cforte, cforte_state, empty_init, "Novag Industries", "Constellation Forte (version A)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, cforteb, cfortea, 0, cforte, cforte, cforte_state, empty_init, "Novag Industries", "Constellation Forte (version B)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/const.cpp b/src/mame/novag/const.cpp index b8432f780eae7..5b7220376eb00 100644 --- a/src/mame/novag/const.cpp +++ b/src/mame/novag/const.cpp @@ -513,11 +513,11 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, ssensor4, 0, 0, ssensor4, ssensor4, const_state, empty_init, "Novag Industries", "Super Sensor IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, ssensor4, 0, 0, ssensor4, ssensor4, const_state, empty_init, "Novag Industries", "Super Sensor IV", MACHINE_SUPPORTS_SAVE ) -SYST( 1983, const, 0, 0, nconst, nconst, const_state, init_const, "Novag Industries", "Constellation", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, const36, const, 0, nconst36, nconst, const_state, init_const, "Novag Industries", "Constellation 3.6MHz (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, const36a, const, 0, nconst36a, nconst, const_state, init_const, "Novag Industries", "Constellation 3.6MHz (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, constq, const, 0, nconstq, nconstq, const_state, init_const, "Novag Industries", "Constellation Quattro", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, const, 0, 0, nconst, nconst, const_state, init_const, "Novag Industries", "Constellation", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, const36, const, 0, nconst36, nconst, const_state, init_const, "Novag Industries", "Constellation 3.6MHz (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, const36a, const, 0, nconst36a, nconst, const_state, init_const, "Novag Industries", "Constellation 3.6MHz (set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, constq, const, 0, nconstq, nconstq, const_state, init_const, "Novag Industries", "Constellation Quattro", MACHINE_SUPPORTS_SAVE ) -SYST( 1984, supercon, 0, 0, sconst, sconst, const_state, empty_init, "Novag Industries", "Super Constellation", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1984, supercon, 0, 0, sconst, sconst, const_state, empty_init, "Novag Industries", "Super Constellation", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/constjr.cpp b/src/mame/novag/constjr.cpp index 774d5fe470a01..d821dae80453e 100644 --- a/src/mame/novag/constjr.cpp +++ b/src/mame/novag/constjr.cpp @@ -237,4 +237,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1985, constjr, 0, 0, constjr, constjr, constjr_state, empty_init, "Novag Industries", "Constellation Junior", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, constjr, 0, 0, constjr, constjr, constjr_state, empty_init, "Novag Industries", "Constellation Junior", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/diablo.cpp b/src/mame/novag/diablo.cpp index 2492154be43b7..b137913fd3074 100644 --- a/src/mame/novag/diablo.cpp +++ b/src/mame/novag/diablo.cpp @@ -375,7 +375,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1991, diablo68, 0, 0, diablo68k, diablo68k, diablo_state, empty_init, "Novag Industries", "Diablo 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, diablo68a, diablo68, 0, diablo68k, diablo68k, diablo_state, empty_init, "Novag Industries", "Diablo 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, diablo68, 0, 0, diablo68k, diablo68k, diablo_state, empty_init, "Novag Industries", "Diablo 68000 (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1991, diablo68a, diablo68, 0, diablo68k, diablo68k, diablo_state, empty_init, "Novag Industries", "Diablo 68000 (set 2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1991, scorpio68, 0, 0, scorpio68k, diablo68k, diablo_state, empty_init, "Novag Industries", "Scorpio 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, scorpio68, 0, 0, scorpio68k, diablo68k, diablo_state, empty_init, "Novag Industries", "Scorpio 68000", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/mentor16.cpp b/src/mame/novag/mentor16.cpp index 8b8cbe8fd2347..0b91c63a74a94 100644 --- a/src/mame/novag/mentor16.cpp +++ b/src/mame/novag/mentor16.cpp @@ -312,4 +312,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, mentor16, 0, 0, mentor16, mentor16, mentor16_state, empty_init, "Novag Industries", "Mentor 16", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, mentor16, 0, 0, mentor16, mentor16, mentor16_state, empty_init, "Novag Industries", "Mentor 16", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/micro.cpp b/src/mame/novag/micro.cpp index 18de5d3774405..f3ecd10342a20 100644 --- a/src/mame/novag/micro.cpp +++ b/src/mame/novag/micro.cpp @@ -242,4 +242,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, nmicro, 0, 0, micro, micro, micro_state, empty_init, "Novag Industries", "Micro Chess", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, nmicro, 0, 0, micro, micro, micro_state, empty_init, "Novag Industries", "Micro Chess", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/micro2.cpp b/src/mame/novag/micro2.cpp index 24c0aa57709b0..c7ceca736e07e 100644 --- a/src/mame/novag/micro2.cpp +++ b/src/mame/novag/micro2.cpp @@ -237,4 +237,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, nmicro2, 0, 0, micro2, micro2, micro2_state, empty_init, "Novag Industries / Heuristic Software", "Micro II (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1982, nmicro2, 0, 0, micro2, micro2, micro2_state, empty_init, "Novag Industries / Heuristic Software", "Micro II (Novag)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/primo.cpp b/src/mame/novag/primo.cpp index ea5e6d051e319..fe5433b66735b 100644 --- a/src/mame/novag/primo.cpp +++ b/src/mame/novag/primo.cpp @@ -479,9 +479,9 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, nprimo, 0, 0, primo, primo, primo_state, empty_init, "Novag Industries", "Primo (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, nprimo, 0, 0, primo, primo, primo_state, empty_init, "Novag Industries", "Primo (Novag)", MACHINE_SUPPORTS_SAVE ) -SYST( 1988, supremo, 0, 0, supremo, supremo, primo_state, empty_init, "Novag Industries", "Supremo", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, supremo, 0, 0, supremo, supremo, primo_state, empty_init, "Novag Industries", "Supremo", MACHINE_SUPPORTS_SAVE ) -SYST( 1990, nsnova, 0, 0, snova, snova, primo_state, empty_init, "Novag Industries", "Super Nova (Novag, v1.05 set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, nsnovaa, nsnova, 0, snova, snova, primo_state, empty_init, "Novag Industries", "Super Nova (Novag, v1.05 set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, nsnova, 0, 0, snova, snova, primo_state, empty_init, "Novag Industries", "Super Nova (Novag, v1.05 set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, nsnovaa, nsnova, 0, snova, snova, primo_state, empty_init, "Novag Industries", "Super Nova (Novag, v1.05 set 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/robotadv.cpp b/src/mame/novag/robotadv.cpp index eb8cdf071e424..5d05211e5b0a4 100644 --- a/src/mame/novag/robotadv.cpp +++ b/src/mame/novag/robotadv.cpp @@ -573,4 +573,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, robotadv, 0, 0, robotadv, robotadv, robotadv_state, empty_init, "Novag Industries", "Chess Robot Adversary", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1982, robotadv, 0, 0, robotadv, robotadv, robotadv_state, empty_init, "Novag Industries", "Chess Robot Adversary", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/novag/savant.cpp b/src/mame/novag/savant.cpp index 7f2fa1ff147e6..f3b84f8c4c66d 100644 --- a/src/mame/novag/savant.cpp +++ b/src/mame/novag/savant.cpp @@ -436,5 +436,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, savant, 0, 0, savant, savant, savant_state, empty_init, "Novag Industries", "Savant", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, savant2, savant, 0, savant, savant, savant_state, empty_init, "Novag Industries", "Savant II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, savant, 0, 0, savant, savant, savant_state, empty_init, "Novag Industries", "Savant", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, savant2, savant, 0, savant, savant, savant_state, empty_init, "Novag Industries", "Savant II", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/sdiamond.cpp b/src/mame/novag/sdiamond.cpp index 8dba100a1dc12..31775c4912a21 100644 --- a/src/mame/novag/sdiamond.cpp +++ b/src/mame/novag/sdiamond.cpp @@ -368,4 +368,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 2003, sdiamond, 0, 0, sdiamond, sdiamond, sdiamond_state, empty_init, "Perfect Technology", "Star Diamond (v1.04)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 2003, sdiamond, 0, 0, sdiamond, sdiamond, sdiamond_state, empty_init, "Perfect Technology", "Star Diamond (v1.04)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/sexpert.cpp b/src/mame/novag/sexpert.cpp index bcf35aaf08557..d37e3a1dfbe76 100644 --- a/src/mame/novag/sexpert.cpp +++ b/src/mame/novag/sexpert.cpp @@ -599,17 +599,17 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, sexperta, 0, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version A, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 886 -SYST( 1987, sexperta1, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version A, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 878 -SYST( 1987, sexperta2, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version A, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 878 -SYST( 1988, sexpertb, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 887 -SYST( 1990, sexpertc, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version C, v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 902 -SYST( 1990, sexpertc1, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version C, v3.0)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 902 -SYST( 1990, sexpertc2, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version C, v1.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 902 - -SYST( 1987, sfortea, 0, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version A, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, sfortea1, sfortea, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version A, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, sfortea2, sfortea, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version A, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, sforteb, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, sfortec, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version C, v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, sfortec1, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version C, v1.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, sexperta, 0, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version A, set 1)", MACHINE_SUPPORTS_SAVE ) // 886 +SYST( 1987, sexperta1, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version A, set 2)", MACHINE_SUPPORTS_SAVE ) // 878 +SYST( 1987, sexperta2, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version A, set 3)", MACHINE_SUPPORTS_SAVE ) // 878 +SYST( 1988, sexpertb, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version B)", MACHINE_SUPPORTS_SAVE ) // 887 +SYST( 1990, sexpertc, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version C, v3.6)", MACHINE_SUPPORTS_SAVE ) // 902 +SYST( 1990, sexpertc1, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version C, v3.0)", MACHINE_SUPPORTS_SAVE ) // 902 +SYST( 1990, sexpertc2, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version C, v1.2)", MACHINE_SUPPORTS_SAVE ) // 902 + +SYST( 1987, sfortea, 0, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version A, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, sfortea1, sfortea, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version A, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, sfortea2, sfortea, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version A, set 3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, sforteb, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version B)", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, sfortec, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version C, v3.6)", MACHINE_SUPPORTS_SAVE ) +SYST( 1990, sfortec1, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version C, v1.2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/novag/vip.cpp b/src/mame/novag/vip.cpp index 92bb57e0149f5..a88850b13d8ff 100644 --- a/src/mame/novag/vip.cpp +++ b/src/mame/novag/vip.cpp @@ -421,9 +421,9 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, nvip, 0, 0, vip, vip, vip_state, empty_init, "Novag Industries", "VIP (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, nvip, 0, 0, vip, vip, vip_state, empty_init, "Novag Industries", "VIP (Novag)", MACHINE_SUPPORTS_SAVE ) -SYST( 1989, nsvip, 0, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v3.7)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, nsvipa, nsvip, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, nsvipb, nsvip, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v1.03)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, nsvipc, nsvip, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v1.01)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, nsvip, 0, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v3.7)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, nsvipa, nsvip, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v3.6)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, nsvipb, nsvip, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v1.03)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, nsvipc, nsvip, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v1.01)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/chessac.cpp b/src/mame/saitek/chessac.cpp index f13082e43f64f..370ba9b98f936 100644 --- a/src/mame/saitek/chessac.cpp +++ b/src/mame/saitek/chessac.cpp @@ -411,5 +411,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1997, chessac, 0, 0, chessac, chessac, chessac_state, empty_init, "Saitek", "Kasparov Chess Academy", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1997, schachak, chessac, 0, schachak, chessac, chessac_state, empty_init, "Saitek", "Mephisto Schachakademie", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1997, chessac, 0, 0, chessac, chessac, chessac_state, empty_init, "Saitek", "Kasparov Chess Academy", MACHINE_SUPPORTS_SAVE ) +SYST( 1997, schachak, chessac, 0, schachak, chessac, chessac_state, empty_init, "Saitek", "Mephisto Schachakademie", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/chesstrv.cpp b/src/mame/saitek/chesstrv.cpp index a0618da3f2333..5cb2e1fbd67bd 100644 --- a/src/mame/saitek/chesstrv.cpp +++ b/src/mame/saitek/chesstrv.cpp @@ -313,5 +313,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "SciSys / Novag Industries", "Chess Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, chesstrvi, 0, 0, chesstrvi, chesstrvi, chesstrv_state, empty_init, "SciSys", "Chess Intercontinental Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "SciSys / Novag Industries", "Chess Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) +SYST( 1982, chesstrvi, 0, 0, chesstrvi, chesstrvi, chesstrv_state, empty_init, "SciSys", "Chess Intercontinental Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/companion.cpp b/src/mame/saitek/companion.cpp index ae33db267a6f7..5976cb03b54f6 100644 --- a/src/mame/saitek/companion.cpp +++ b/src/mame/saitek/companion.cpp @@ -231,4 +231,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, compan, 0, 0, compan, compan, compan_state, empty_init, "SciSys / Heuristic Software", "Chess Companion", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1982, compan, 0, 0, compan, compan, compan_state, empty_init, "SciSys / Heuristic Software", "Chess Companion", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/companion2.cpp b/src/mame/saitek/companion2.cpp index 9dcb5f6144828..e44fb043b2900 100644 --- a/src/mame/saitek/companion2.cpp +++ b/src/mame/saitek/companion2.cpp @@ -413,7 +413,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1983, compan2, 0, 0, compan2, compan2, compan2_state, empty_init, "SciSys", "Chess Companion II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, expchess, compan2, 0, expchess, expchess, compan2_state, empty_init, "SciSys", "Explorer Chess", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, compan2, 0, 0, compan2, compan2, compan2_state, empty_init, "SciSys", "Chess Companion II", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, expchess, compan2, 0, expchess, expchess, compan2_state, empty_init, "SciSys", "Explorer Chess", MACHINE_SUPPORTS_SAVE ) -SYST( 1984, enterp, 0, 0, enterp, enterp, compan2_state, empty_init, "CXG Systems / Newcrest Technology", "Enterprise \"S\"", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1984, enterp, 0, 0, enterp, enterp, compan2_state, empty_init, "CXG Systems / Newcrest Technology", "Enterprise \"S\"", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/corona.cpp b/src/mame/saitek/corona.cpp index dfb55b23feb42..3ddb1d33fd9fc 100644 --- a/src/mame/saitek/corona.cpp +++ b/src/mame/saitek/corona.cpp @@ -317,6 +317,6 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1990, corona, 0, 0, corona, corona, corona_state, empty_init, "Saitek / Heuristic Software", "Kasparov Corona (ver. D+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka Corona II -SYST( 1988, coronaa, corona, 0, corona, corona, corona_state, empty_init, "Saitek / Heuristic Software", "Kasparov Corona (ver. C, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, coronab, corona, 0, corona, corona, corona_state, empty_init, "Saitek / Heuristic Software", "Kasparov Corona (ver. C, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, corona, 0, 0, corona, corona, corona_state, empty_init, "Saitek / Heuristic Software", "Kasparov Corona (ver. D+)", MACHINE_SUPPORTS_SAVE ) // aka Corona II +SYST( 1988, coronaa, corona, 0, corona, corona, corona_state, empty_init, "Saitek / Heuristic Software", "Kasparov Corona (ver. C, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, coronab, corona, 0, corona, corona, corona_state, empty_init, "Saitek / Heuristic Software", "Kasparov Corona (ver. C, set 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/cp2000.cpp b/src/mame/saitek/cp2000.cpp index 076d28e792127..d2ede7c7c1c41 100644 --- a/src/mame/saitek/cp2000.cpp +++ b/src/mame/saitek/cp2000.cpp @@ -258,4 +258,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, cp2000, 0, 0, cp2000, cp2000, cp2000_state, empty_init, "SciSys / Novag Industries", "Chess Partner 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, cp2000, 0, 0, cp2000, cp2000, cp2000_state, empty_init, "SciSys / Novag Industries", "Chess Partner 2000", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/delta1.cpp b/src/mame/saitek/delta1.cpp index 8a01a4c8207ce..9699c794443a9 100644 --- a/src/mame/saitek/delta1.cpp +++ b/src/mame/saitek/delta1.cpp @@ -253,4 +253,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, ccdelta1, 0, 0, delta1, delta1, delta1_state, empty_init, "SciSys / Novag Industries", "Chess Champion: Delta-1", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, ccdelta1, 0, 0, delta1, delta1, delta1_state, empty_init, "SciSys / Novag Industries", "Chess Champion: Delta-1", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/saitek/ecbackg.cpp b/src/mame/saitek/ecbackg.cpp index ee761099d34da..df7609798ce13 100644 --- a/src/mame/saitek/ecbackg.cpp +++ b/src/mame/saitek/ecbackg.cpp @@ -551,4 +551,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, ecbackg, 0, 0, ecbackg, ecbackg, ecbackg_state, empty_init, "Saitek", "Electronic Champion Backgammon", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, ecbackg, 0, 0, ecbackg, ecbackg, ecbackg_state, empty_init, "Saitek", "Electronic Champion Backgammon", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/edames.cpp b/src/mame/saitek/edames.cpp index 86c8e21c2fac5..3c7bda15b56c7 100644 --- a/src/mame/saitek/edames.cpp +++ b/src/mame/saitek/edames.cpp @@ -300,4 +300,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, edames, 0, 0, edames, edames, edames_state, empty_init, "Saitek", "Electronic Dames", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, edames, 0, 0, edames, edames, edames_state, empty_init, "Saitek", "Electronic Dames", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/exechess.cpp b/src/mame/saitek/exechess.cpp index 779d782913572..c5e87b7294b85 100644 --- a/src/mame/saitek/exechess.cpp +++ b/src/mame/saitek/exechess.cpp @@ -268,4 +268,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, exechess, 0, 0, exechess, exechess, exechess_state, empty_init, "SciSys", "Executive Chess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, exechess, 0, 0, exechess, exechess, exechess_state, empty_init, "SciSys", "Executive Chess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/gk2000.cpp b/src/mame/saitek/gk2000.cpp index 2a5ed56b2b248..d4512e94176ed 100644 --- a/src/mame/saitek/gk2000.cpp +++ b/src/mame/saitek/gk2000.cpp @@ -315,4 +315,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1992, gk2000, 0, 0, gk2000, gk2000, gk2000_state, empty_init, "Saitek", "Kasparov GK 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1992, gk2000, 0, 0, gk2000, gk2000, gk2000_state, empty_init, "Saitek", "Kasparov GK 2000", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/intchess.cpp b/src/mame/saitek/intchess.cpp index 2410b62616529..58e85f99d86f1 100644 --- a/src/mame/saitek/intchess.cpp +++ b/src/mame/saitek/intchess.cpp @@ -358,4 +358,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, intchess, 0, 0, intchess, intchess, intchess_state, empty_init, "SciSys / Intelligent Games", "Intelligent Chess", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_GRAPHICS ) +SYST( 1980, intchess, 0, 0, intchess, intchess, intchess_state, empty_init, "SciSys / Intelligent Games", "Intelligent Chess", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/saitek/leonardo.cpp b/src/mame/saitek/leonardo.cpp index 4d8c45d3bc934..00c103e613a42 100644 --- a/src/mame/saitek/leonardo.cpp +++ b/src/mame/saitek/leonardo.cpp @@ -484,8 +484,8 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, leonardo, 0, 0, leonardo, leonardo, leo_state, empty_init, "SciSys / Heuristic Software", "Kasparov Leonardo (v1.4)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, leonardoa, leonardo, 0, leonardoa, leonardo, leo_state, empty_init, "SciSys / Heuristic Software", "Kasparov Leonardo (v1.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, leonardob, leonardo, 0, leonardoa, leonardo, leo_state, empty_init, "SciSys / Heuristic Software", "Kasparov Leonardo (v1.0)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, leonardo, 0, 0, leonardo, leonardo, leo_state, empty_init, "SciSys / Heuristic Software", "Kasparov Leonardo (v1.4)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, leonardoa, leonardo, 0, leonardoa, leonardo, leo_state, empty_init, "SciSys / Heuristic Software", "Kasparov Leonardo (v1.2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, leonardob, leonardo, 0, leonardoa, leonardo, leo_state, empty_init, "SciSys / Heuristic Software", "Kasparov Leonardo (v1.0)", MACHINE_SUPPORTS_SAVE ) -SYST( 1988, galileo, leonardo, 0, galileo, galileo, leo_state, empty_init, "Saitek / Heuristic Software", "Kasparov Galileo (v1.4)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, galileo, leonardo, 0, galileo, galileo, leo_state, empty_init, "Saitek / Heuristic Software", "Kasparov Galileo (v1.4)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/mark5.cpp b/src/mame/saitek/mark5.cpp index 881885b98d719..a5f1b6d9334b0 100644 --- a/src/mame/saitek/mark5.cpp +++ b/src/mame/saitek/mark5.cpp @@ -502,5 +502,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, ccmk5, 0, 0, mark5, mark5, mark5_state, empty_init, "SciSys / Philidor Software", "Chess Champion: Mark V", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, ccmk6, ccmk5, 0, mark6, mark6, mark5_state, empty_init, "SciSys / Philidor Software", "Chess Champion: Mark VI/Philidor", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, ccmk5, 0, 0, mark5, mark5, mark5_state, empty_init, "SciSys / Philidor Software", "Chess Champion: Mark V", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, ccmk6, ccmk5, 0, mark6, mark6, mark5_state, empty_init, "SciSys / Philidor Software", "Chess Champion: Mark VI/Philidor", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/minichess.cpp b/src/mame/saitek/minichess.cpp index 404ac6ce35a16..0ae7a13310907 100644 --- a/src/mame/saitek/minichess.cpp +++ b/src/mame/saitek/minichess.cpp @@ -225,4 +225,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, smchess, 0, 0, smchess, smchess, mini_state, empty_init, "SciSys", "Mini Chess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, smchess, 0, 0, smchess, smchess, mini_state, empty_init, "SciSys", "Mini Chess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/prisma.cpp b/src/mame/saitek/prisma.cpp index b749df5dbca55..d781c8befd797 100644 --- a/src/mame/saitek/prisma.cpp +++ b/src/mame/saitek/prisma.cpp @@ -371,4 +371,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1990, prisma, 0, 0, prisma, prisma, prisma_state, empty_init, "Saitek / Heuristic Software", "Kasparov Prisma", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, prisma, 0, 0, prisma, prisma, prisma_state, empty_init, "Saitek / Heuristic Software", "Kasparov Prisma", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/prschess.cpp b/src/mame/saitek/prschess.cpp index de86c8943350c..a3c8392101894 100644 --- a/src/mame/saitek/prschess.cpp +++ b/src/mame/saitek/prschess.cpp @@ -225,4 +225,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, prschess, 0, 0, prschess, prschess, prschess_state, empty_init, "SciSys / Heuristic Software", "President Chess", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1982, prschess, 0, 0, prschess, prschess, prschess_state, empty_init, "SciSys / Heuristic Software", "President Chess", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/renaissance.cpp b/src/mame/saitek/renaissance.cpp index bb400fdffb3ca..94067372c886b 100644 --- a/src/mame/saitek/renaissance.cpp +++ b/src/mame/saitek/renaissance.cpp @@ -475,5 +475,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, renaissa, 0, 0, ren, ren, ren_state, empty_init, "Saitek / Heuristic Software", "Kasparov Renaissance (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, renaissaa, renaissa, 0, ren, ren, ren_state, empty_init, "Saitek / Heuristic Software", "Kasparov Renaissance (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, renaissa, 0, 0, ren, ren, ren_state, empty_init, "Saitek / Heuristic Software", "Kasparov Renaissance (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, renaissaa, renaissa, 0, ren, ren, ren_state, empty_init, "Saitek / Heuristic Software", "Kasparov Renaissance (set 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/risc2500.cpp b/src/mame/saitek/risc2500.cpp index 20eb9d4befc91..6f5e82f67d7bf 100644 --- a/src/mame/saitek/risc2500.cpp +++ b/src/mame/saitek/risc2500.cpp @@ -498,7 +498,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1992, risc2500, 0, 0, risc2500, risc2500, risc2500_state, empty_init, "Saitek / Tasc", "Kasparov RISC 2500 (v1.04)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1992, risc2500a, risc2500, 0, risc2500, risc2500, risc2500_state, empty_init, "Saitek / Tasc", "Kasparov RISC 2500 (v1.03)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1992, risc2500, 0, 0, risc2500, risc2500, risc2500_state, empty_init, "Saitek / Tasc", "Kasparov RISC 2500 (v1.04)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) +SYST( 1992, risc2500a, risc2500, 0, risc2500, risc2500, risc2500_state, empty_init, "Saitek / Tasc", "Kasparov RISC 2500 (v1.03)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) -SYST( 1995, montreux, 0, 0, montreux, montreux, risc2500_state, empty_init, "Saitek / Tasc", "Mephisto Montreux", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) // after Saitek bought Hegener + Glaser +SYST( 1995, montreux, 0, 0, montreux, montreux, risc2500_state, empty_init, "Saitek / Tasc", "Mephisto Montreux", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // after Saitek bought Hegener + Glaser diff --git a/src/mame/saitek/schess.cpp b/src/mame/saitek/schess.cpp index a488f664f051f..2568e501e8c87 100644 --- a/src/mame/saitek/schess.cpp +++ b/src/mame/saitek/schess.cpp @@ -251,4 +251,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, schess, 0, 0, schess, schess, schess_state, empty_init, "SciSys / Heuristic Software", "Sensor Chess", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, schess, 0, 0, schess, schess, schess_state, empty_init, "SciSys / Heuristic Software", "Sensor Chess", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/simultano.cpp b/src/mame/saitek/simultano.cpp index 2d90e8e2b4d39..f5a99e867924b 100644 --- a/src/mame/saitek/simultano.cpp +++ b/src/mame/saitek/simultano.cpp @@ -403,7 +403,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, simultano, 0, 0, simultano, simultano, simultano_state, empty_init, "Saitek / Heuristic Software", "Kasparov Simultano (ver. C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, simultanoa, simultano, 0, simultano, simultano, simultano_state, empty_init, "Saitek / Heuristic Software", "Kasparov Simultano (ver. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, simultano, 0, 0, simultano, simultano, simultano_state, empty_init, "Saitek / Heuristic Software", "Kasparov Simultano (ver. C)", MACHINE_SUPPORTS_SAVE ) +SYST( 1989, simultanoa, simultano, 0, simultano, simultano, simultano_state, empty_init, "Saitek / Heuristic Software", "Kasparov Simultano (ver. B)", MACHINE_SUPPORTS_SAVE ) -SYST( 1988, cc2150, simultano, 0, cc2150, cc2150, simultano_state, empty_init, "Tandy Corporation / Saitek / Heuristic Software", "Chess Champion 2150", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, cc2150, simultano, 0, cc2150, cc2150, simultano_state, empty_init, "Tandy Corporation / Saitek / Heuristic Software", "Chess Champion 2150", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/ssystem3.cpp b/src/mame/saitek/ssystem3.cpp index b6d9893a25a5d..aa5855e70c4f4 100644 --- a/src/mame/saitek/ssystem3.cpp +++ b/src/mame/saitek/ssystem3.cpp @@ -568,5 +568,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, ssystem3, 0, 0, ssystem3, ssystem3, ssystem3_state, init_ssystem3, "SciSys / Novag Industries", "Chess Champion: Super System III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1980, ssystem4, 0, 0, ssystem4, ssystem4, ssystem3_state, empty_init, "SciSys", "Chess Champion: Super System IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, ssystem3, 0, 0, ssystem3, ssystem3, ssystem3_state, init_ssystem3, "SciSys / Novag Industries", "Chess Champion: Super System III", MACHINE_SUPPORTS_SAVE ) +SYST( 1980, ssystem4, 0, 0, ssystem4, ssystem4, ssystem3_state, empty_init, "SciSys", "Chess Champion: Super System IV", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/stratos.cpp b/src/mame/saitek/stratos.cpp index 0fb4255806964..6dd97d210fbda 100644 --- a/src/mame/saitek/stratos.cpp +++ b/src/mame/saitek/stratos.cpp @@ -574,9 +574,9 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, stratos, 0, 0, stratos, stratos, stratos_state, empty_init, "SciSys / Heuristic Software", "Kasparov Stratos (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, stratosa, stratos, 0, stratos, stratos, stratos_state, empty_init, "SciSys / Heuristic Software", "Kasparov Stratos (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, stratos, 0, 0, stratos, stratos, stratos_state, empty_init, "SciSys / Heuristic Software", "Kasparov Stratos (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1987, stratosa, stratos, 0, stratos, stratos, stratos_state, empty_init, "SciSys / Heuristic Software", "Kasparov Stratos (set 2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1990, tking, stratos, 0, tking2, tking2, stratos_state, empty_init, "Saitek / Heuristic Software", "Kasparov Turbo King (ver. D)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka Turbo King II -SYST( 1988, tkinga, stratos, 0, tking, tking, stratos_state, empty_init, "Saitek / Heuristic Software", "Kasparov Turbo King (ver. B, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, tkingb, stratos, 0, tking, tking, stratos_state, empty_init, "Saitek / Heuristic Software", "Kasparov Turbo King (ver. B, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, tking, stratos, 0, tking2, tking2, stratos_state, empty_init, "Saitek / Heuristic Software", "Kasparov Turbo King (ver. D)", MACHINE_SUPPORTS_SAVE ) // aka Turbo King II +SYST( 1988, tkinga, stratos, 0, tking, tking, stratos_state, empty_init, "Saitek / Heuristic Software", "Kasparov Turbo King (ver. B, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, tkingb, stratos, 0, tking, tking, stratos_state, empty_init, "Saitek / Heuristic Software", "Kasparov Turbo King (ver. B, set 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/superstar.cpp b/src/mame/saitek/superstar.cpp index 70ea44f7acec1..bcda4daa63276 100644 --- a/src/mame/saitek/superstar.cpp +++ b/src/mame/saitek/superstar.cpp @@ -301,8 +301,8 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1983, sstar28k, 0, 0, sstar28k, sstar28k, star_state, empty_init, "SciSys / Heuristic Software", "Superstar 28K", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, sstar28k, 0, 0, sstar28k, sstar28k, star_state, empty_init, "SciSys / Heuristic Software", "Superstar 28K", MACHINE_SUPPORTS_SAVE ) -SYST( 1985, tstar432, 0, 0, tstar432, tstar432, star_state, empty_init, "SciSys / Heuristic Software", "Turbostar 432 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, tstar432a, tstar432, 0, tstar432, tstar432, star_state, empty_init, "SciSys / Heuristic Software", "Turbostar 432 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1985, tstar432b, tstar432, 0, tstar432, tstar432, star_state, empty_init, "SciSys / Heuristic Software", "Turbostar 432 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, tstar432, 0, 0, tstar432, tstar432, star_state, empty_init, "SciSys / Heuristic Software", "Turbostar 432 (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, tstar432a, tstar432, 0, tstar432, tstar432, star_state, empty_init, "SciSys / Heuristic Software", "Turbostar 432 (set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, tstar432b, tstar432, 0, tstar432, tstar432, star_state, empty_init, "SciSys / Heuristic Software", "Turbostar 432 (set 3)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/turbo16k.cpp b/src/mame/saitek/turbo16k.cpp index 0f0fcd4563326..00b0f6f1f0cff 100644 --- a/src/mame/saitek/turbo16k.cpp +++ b/src/mame/saitek/turbo16k.cpp @@ -505,10 +505,10 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, turbo16k, 0, 0, turbo16k, turbo16k, turbo16k_state, empty_init, "SciSys / Heuristic Software", "Turbo 16K", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, compan3, turbo16k, 0, compan3, compan3, turbo16k_state, empty_init, "SciSys / Heuristic Software", "Companion III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, turbo16k, 0, 0, turbo16k, turbo16k, turbo16k_state, empty_init, "SciSys / Heuristic Software", "Turbo 16K", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, compan3, turbo16k, 0, compan3, compan3, turbo16k_state, empty_init, "SciSys / Heuristic Software", "Companion III", MACHINE_SUPPORTS_SAVE ) -SYST( 1988, conquist, 0, 0, conquist, conquist, conquist_state, empty_init, "Saitek / Heuristic Software", "Kasparov Conquistador", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, tmate, conquist, 0, tmate, tmate, conquist_state, empty_init, "Saitek / Heuristic Software", "Kasparov Team-Mate", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, conquist, 0, 0, conquist, conquist, conquist_state, empty_init, "Saitek / Heuristic Software", "Kasparov Conquistador", MACHINE_SUPPORTS_SAVE ) +SYST( 1988, tmate, conquist, 0, tmate, tmate, conquist_state, empty_init, "Saitek / Heuristic Software", "Kasparov Team-Mate", MACHINE_SUPPORTS_SAVE ) -SYST( 1986, t1850, 0, 0, t1850, t1850, turbo16k_state, empty_init, "Tandy Corporation / SciSys / Heuristic Software", "1850 Deluxe Table Chess (model 60-2199)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, t1850, 0, 0, t1850, t1850, turbo16k_state, empty_init, "Tandy Corporation / SciSys / Heuristic Software", "1850 Deluxe Table Chess (model 60-2199)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/saitek/turbos24k.cpp b/src/mame/saitek/turbos24k.cpp index 80e874f0bb962..ecdf9ec6496b7 100644 --- a/src/mame/saitek/turbos24k.cpp +++ b/src/mame/saitek/turbos24k.cpp @@ -349,4 +349,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, turbos24k, 0, 0, turbos24k, turbos24k, turbos24k_state, empty_init, "SciSys / Heuristic Software", "Kasparov Turbo S-24K", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, turbos24k, 0, 0, turbos24k, turbos24k, turbos24k_state, empty_init, "SciSys / Heuristic Software", "Kasparov Turbo S-24K", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/seta/seta.cpp b/src/mame/seta/seta.cpp index b8149e876fd19..6386ce42bec89 100644 --- a/src/mame/seta/seta.cpp +++ b/src/mame/seta/seta.cpp @@ -11306,8 +11306,8 @@ void jockeyc_state::init_inttoote() ***************************************************************************/ -GAME( 1989?, setaroul, 0, setaroul, setaroul, setaroul_state, empty_init, ROT270, "Visco", "The Roulette (Visco)", MACHINE_CLICKABLE_ARTWORK ) -GAME( 1989?, setaroula, setaroul, setaroul, setaroul, setaroul_state, empty_init, ROT270, "hack (CODERE)", "Super Ruleta 36 (Spanish hack of The Roulette)", MACHINE_CLICKABLE_ARTWORK ) +GAME( 1989?, setaroul, 0, setaroul, setaroul, setaroul_state, empty_init, ROT270, "Visco", "The Roulette (Visco)", 0 ) +GAME( 1989?, setaroula, setaroul, setaroul, setaroul, setaroul_state, empty_init, ROT270, "hack (CODERE)", "Super Ruleta 36 (Spanish hack of The Roulette)", 0 ) GAME( 1989, drgnunit, 0, drgnunit, drgnunit, seta_state, empty_init, ROT0, "Athena / Seta", "Dragon Unit / Castle of Dragon", 0 ) // Country/License: DSW @@ -11321,10 +11321,10 @@ GAME( 1990, thunderlbl2,thunderl,thunderlbl,thunderl, thunderl_state, empty_ini GAME( 1994, wiggie, 0, wiggie, thunderl, seta_state, init_wiggie, ROT270, "Promat", "Wiggie Waggie", MACHINE_IMPERFECT_GRAPHICS ) // hack of Thunder & Lightning GAME( 1994, superbar, wiggie, superbar, thunderl, seta_state, init_wiggie, ROT270, "Promat", "Super Bar", MACHINE_IMPERFECT_GRAPHICS ) // hack of Thunder & Lightning -GAME( 1990, jockeyc, 0, jockeyc, jockeyc, jockeyc_state, empty_init, ROT0, "Seta (Visco license)", "Jockey Club (v1.18)", MACHINE_CLICKABLE_ARTWORK ) -GAME( 1993, inttoote2, jockeyc, jockeyc, jockeyc, jockeyc_state, empty_init, ROT0, "bootleg (Coinmaster)", "International Toote II (v1.24, P387.V01)", MACHINE_CLICKABLE_ARTWORK ) -GAME( 1998, inttoote, jockeyc, inttoote, inttoote, jockeyc_state, init_inttoote, ROT0, "bootleg (Coinmaster)", "International Toote (Germany, P523.V01)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_CLICKABLE_ARTWORK ) -GAME( 1990, gderby, jockeyc, jockeyc, jockeyc, jockeyc_state, empty_init, ROT0, "hack (CODERE)", "Gran Derby (Spanish hack of Jockey Club)", MACHINE_CLICKABLE_ARTWORK ) +GAME( 1990, jockeyc, 0, jockeyc, jockeyc, jockeyc_state, empty_init, ROT0, "Seta (Visco license)", "Jockey Club (v1.18)", 0 ) +GAME( 1993, inttoote2, jockeyc, jockeyc, jockeyc, jockeyc_state, empty_init, ROT0, "bootleg (Coinmaster)", "International Toote II (v1.24, P387.V01)", 0 ) +GAME( 1998, inttoote, jockeyc, inttoote, inttoote, jockeyc_state, init_inttoote, ROT0, "bootleg (Coinmaster)", "International Toote (Germany, P523.V01)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1990, gderby, jockeyc, jockeyc, jockeyc, jockeyc_state, empty_init, ROT0, "hack (CODERE)", "Gran Derby (Spanish hack of Jockey Club)", 0 ) GAME( 1992, rezon, 0, rezon, rezon, seta_state, empty_init, ROT0, "Allumer", "Rezon", 0 ) // License: Jumper GAME( 1991, rezono, rezon, rezon, rezon, seta_state, empty_init, ROT0, "Allumer", "Rezon (earlier)", 0 ) // "" diff --git a/src/mame/ti/snspellc.cpp b/src/mame/ti/snspellc.cpp index 93d9636a5544e..cb9d4d9987b5f 100644 --- a/src/mame/ti/snspellc.cpp +++ b/src/mame/ti/snspellc.cpp @@ -880,9 +880,9 @@ SYST( 1982, snwrite, snspellc, 0, snwrite, snwrite, snspellc_state, ini SYST( 1982, mathsmag, 0, 0, mathsmag, mathsmag, snspellc_state, init_snspellc, "Texas Instruments", "Les Maths Magiques (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -SYST( 1981, tntell, 0, 0, tntell, tntell, tntell_state, init_tntell, "Texas Instruments", "Touch & Tell (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) -SYST( 1980, tntellp, tntell, 0, tntell, tntell, tntell_state, init_tntell, "Texas Instruments", "Touch & Tell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) -SYST( 1981, tntelluk, tntell, 0, tntell, tntell, tntell_state, init_tntell, "Texas Instruments", "Touch & Tell (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) -SYST( 1981, tntellfr, tntell, 0, tntell, tntell, tntell_state, init_tntell, "Texas Instruments", "Le Livre Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) +SYST( 1981, tntell, 0, 0, tntell, tntell, tntell_state, init_tntell, "Texas Instruments", "Touch & Tell (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_REQUIRES_ARTWORK ) +SYST( 1980, tntellp, tntell, 0, tntell, tntell, tntell_state, init_tntell, "Texas Instruments", "Touch & Tell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) +SYST( 1981, tntelluk, tntell, 0, tntell, tntell, tntell_state, init_tntell, "Texas Instruments", "Touch & Tell (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_REQUIRES_ARTWORK ) +SYST( 1981, tntellfr, tntell, 0, tntell, tntell, tntell_state, init_tntell, "Texas Instruments", "Le Livre Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_REQUIRES_ARTWORK ) SYST( 1982, vocaid, 0, 0, vocaid, tntell, tntell_state, empty_init, "Texas Instruments", "Vocaid", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_REQUIRES_ARTWORK ) diff --git a/src/mame/tiger/gamecom.cpp b/src/mame/tiger/gamecom.cpp index 9acabf1546411..93dfd5bbf149b 100644 --- a/src/mame/tiger/gamecom.cpp +++ b/src/mame/tiger/gamecom.cpp @@ -299,4 +299,4 @@ ROM_START( gamecom ) ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -CONS( 1997, gamecom, 0, 0, gamecom, gamecom, gamecom_state, init_gamecom, "Tiger", "Game.com", MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK) +CONS( 1997, gamecom, 0, 0, gamecom, gamecom, gamecom_state, init_gamecom, "Tiger", "Game.com", MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/tiger/pylo.cpp b/src/mame/tiger/pylo.cpp index f7b324916dbc3..5cdb426048167 100644 --- a/src/mame/tiger/pylo.cpp +++ b/src/mame/tiger/pylo.cpp @@ -223,4 +223,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, pylo, 0, 0, pylo, pylo, pylo_state, empty_init, "Tiger", "Punch Your Lights Out", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, pylo, 0, 0, pylo, pylo, pylo_state, empty_init, "Tiger", "Punch Your Lights Out", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/tryom/chess.cpp b/src/mame/tryom/chess.cpp index 3bad50fda2330..a196b6a9d95d6 100644 --- a/src/mame/tryom/chess.cpp +++ b/src/mame/tryom/chess.cpp @@ -283,4 +283,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, tchess, 0, 0, tchess, tchess, chess_state, empty_init, "Tryom", "Electronic Chess (Tryom)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, tchess, 0, 0, tchess, tchess, chess_state, empty_init, "Tryom", "Electronic Chess (Tryom)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/tryom/gammonm.cpp b/src/mame/tryom/gammonm.cpp index f7fcf9be34028..532c290ecf1b3 100644 --- a/src/mame/tryom/gammonm.cpp +++ b/src/mame/tryom/gammonm.cpp @@ -198,4 +198,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1978, gammonm2, 0, 0, gammonm2, gammonm2, gammonm_state, empty_init, "Tryom", "Gammonmaster II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1978, gammonm2, 0, 0, gammonm2, gammonm2, gammonm_state, empty_init, "Tryom", "Gammonmaster II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/tryom/omar.cpp b/src/mame/tryom/omar.cpp index b067d4660a342..2683409d5975c 100644 --- a/src/mame/tryom/omar.cpp +++ b/src/mame/tryom/omar.cpp @@ -378,5 +378,5 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, omar1, 0, 0, omar1, omar, omar_state, empty_init, "Tryom", "Omar I", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, omar2, 0, 0, omar2, omar, omar2_state, empty_init, "Tryom", "Omar II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, omar1, 0, 0, omar1, omar, omar_state, empty_init, "Tryom", "Omar I", MACHINE_SUPPORTS_SAVE ) +SYST( 1979, omar2, 0, 0, omar2, omar, omar2_state, empty_init, "Tryom", "Omar II", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/tvgames/spg2xx_senario_poker.cpp b/src/mame/tvgames/spg2xx_senario_poker.cpp index c23078ff4ad32..457c3740e2091 100644 --- a/src/mame/tvgames/spg2xx_senario_poker.cpp +++ b/src/mame/tvgames/spg2xx_senario_poker.cpp @@ -726,8 +726,8 @@ void sentx6p_state::init_sentx6pd() } // anonymous namespace -CONS( 2004, sentx6p, 0, 0, sentx6p, sentx6p, sentx6p_state, init_sentx6p, "Senario", "Vs Maxx Texas Hold'em TV Poker - 6 Player Edition (US)", MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // from a US version, values in USD -CONS( 2004, sentx6puk, sentx6p, 0, sentx6p, sentx6p, sentx6p_state, init_sentx6puk, "Senario / Play Vision", "Vs Maxx Texas Hold'em TV Poker - 6 Player Edition (UK)", MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // from a UK Play Vision branded box, values in GBP +CONS( 2004, sentx6p, 0, 0, sentx6p, sentx6p, sentx6p_state, init_sentx6p, "Senario", "Vs Maxx Texas Hold'em TV Poker - 6 Player Edition (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // from a US version, values in USD +CONS( 2004, sentx6puk, sentx6p, 0, sentx6p, sentx6p, sentx6p_state, init_sentx6puk, "Senario / Play Vision", "Vs Maxx Texas Hold'em TV Poker - 6 Player Edition (UK)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // from a UK Play Vision branded box, values in GBP -CONS( 2004, sentx6pd, 0, 0, sentx6p, sentx6p, sentx6p_state, init_sentx6pd, "Senario", "Deluxe TV Poker - Texas Hold'em, Blackjack & Video Poker (US)", MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +CONS( 2004, sentx6pd, 0, 0, sentx6p, sentx6p, sentx6p_state, init_sentx6pd, "Senario", "Deluxe TV Poker - Texas Hold'em, Blackjack & Video Poker (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // Deluxe version wasn't released outside of US? diff --git a/src/mame/ussr/debut.cpp b/src/mame/ussr/debut.cpp index 8880723e3f3f5..f15409f83ba16 100644 --- a/src/mame/ussr/debut.cpp +++ b/src/mame/ussr/debut.cpp @@ -269,4 +269,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1994, debutm, 0, 0, debutm, debutm, debut_state, empty_init, "Energopribor", "Debut-M", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1994, debutm, 0, 0, debutm, debutm, debut_state, empty_init, "Energopribor", "Debut-M", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/ussr/im01.cpp b/src/mame/ussr/im01.cpp index aa6c78e1b934e..f58d642045fae 100644 --- a/src/mame/ussr/im01.cpp +++ b/src/mame/ussr/im01.cpp @@ -422,7 +422,7 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, im01, 0, 0, im01, im01, im01_state, empty_init, "Svetlana", "Elektronika IM-01", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, im01t, im01, 0, im01t, im01, im01_state, empty_init, "Svetlana", "Elektronika IM-01T", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, im01, 0, 0, im01, im01, im01_state, empty_init, "Svetlana", "Elektronika IM-01", MACHINE_SUPPORTS_SAVE ) +SYST( 1991, im01t, im01, 0, im01t, im01, im01_state, empty_init, "Svetlana", "Elektronika IM-01T", MACHINE_SUPPORTS_SAVE ) -SYST( 1993, im05, 0, 0, im05, im05, im01_state, empty_init, "Svetlana", "Elektronika IM-05", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1993, im05, 0, 0, im05, im05, im01_state, empty_init, "Svetlana", "Elektronika IM-05", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/ussr/intellect02.cpp b/src/mame/ussr/intellect02.cpp index 7ea049e1ef23b..d4f321a673480 100644 --- a/src/mame/ussr/intellect02.cpp +++ b/src/mame/ussr/intellect02.cpp @@ -259,4 +259,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1985, intel02, 0, 0, intel02, intel02, intel02_state, empty_init, "BREA Research Institute", "Intellect-02", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, intel02, 0, 0, intel02, intel02, intel02_state, empty_init, "BREA Research Institute", "Intellect-02", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/verifone/tranz330.cpp b/src/mame/verifone/tranz330.cpp index 77fad03ef362a..9acd6dd159546 100644 --- a/src/mame/verifone/tranz330.cpp +++ b/src/mame/verifone/tranz330.cpp @@ -195,4 +195,4 @@ ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1985, tranz330, 0, 0, tranz330, tranz330, tranz330_state, empty_init, "VeriFone", "Tranz 330", MACHINE_CLICKABLE_ARTWORK ) +COMP( 1985, tranz330, 0, 0, tranz330, tranz330, tranz330_state, empty_init, "VeriFone", "Tranz 330", 0 ) diff --git a/src/mame/virtual/vgmplay.cpp b/src/mame/virtual/vgmplay.cpp index cfcf5d84e7fc4..b04cf2e237acd 100644 --- a/src/mame/virtual/vgmplay.cpp +++ b/src/mame/virtual/vgmplay.cpp @@ -4095,4 +4095,4 @@ ROM_START( vgmplay ) ROM_REGION32_BE( 0x400000, "gamecart_sh2", ROMREGION_ERASE00 ) ROM_END -CONS( 2016, vgmplay, 0, 0, vgmplay, vgmplay, vgmplay_state, empty_init, "MAME", "VGM player", MACHINE_CLICKABLE_ARTWORK ) +CONS( 2016, vgmplay, 0, 0, vgmplay, vgmplay, vgmplay_state, empty_init, "MAME", "VGM player", 0 ) diff --git a/src/mame/votrax/votrhv.cpp b/src/mame/votrax/votrhv.cpp index f8583432f8d3f..de5b7c7306d80 100644 --- a/src/mame/votrax/votrhv.cpp +++ b/src/mame/votrax/votrhv.cpp @@ -737,5 +737,5 @@ ROM_END ******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1978, hc110, 0, 0, hc110, hc110, votrhv_state, empty_init, "Votrax/Phonic Mirror", "HandiVoice HC-110", MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +COMP( 1978, hc110, 0, 0, hc110, hc110, votrhv_state, empty_init, "Votrax/Phonic Mirror", "HandiVoice HC-110", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) COMP( 1978, hc120, hc110, 0, votrhv, hc120, hc120_state, empty_init, "Votrax/Phonic Mirror", "HandiVoice HC-120", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/westinghouse/testconsole.cpp b/src/mame/westinghouse/testconsole.cpp index 5e59b27ff4bfe..72965e07c0fd4 100644 --- a/src/mame/westinghouse/testconsole.cpp +++ b/src/mame/westinghouse/testconsole.cpp @@ -210,4 +210,4 @@ ROM_END } // anonymous namespace // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1980?, whousetc, 0, 0, whousetc, whousetc, whouse_testcons_state, empty_init, "Westinghouse", "Test Console Serial #5", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) +COMP( 1980?, whousetc, 0, 0, whousetc, whousetc, whouse_testcons_state, empty_init, "Westinghouse", "Test Console Serial #5", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/yamaha/ymdx9.cpp b/src/mame/yamaha/ymdx9.cpp index 87ac45079798c..4c6dcb930f149 100644 --- a/src/mame/yamaha/ymdx9.cpp +++ b/src/mame/yamaha/ymdx9.cpp @@ -416,4 +416,4 @@ ROM_END } // anonymous namespace -SYST(1983, dx9, 0, 0, dx9, dx9, yamaha_dx9_state, empty_init, "Yamaha", "DX9 Digital Programmable Algorithm Synthesizer", MACHINE_IS_SKELETON | MACHINE_CLICKABLE_ARTWORK) +SYST(1983, dx9, 0, 0, dx9, dx9, yamaha_dx9_state, empty_init, "Yamaha", "DX9 Digital Programmable Algorithm Synthesizer", MACHINE_IS_SKELETON) diff --git a/src/mame/yamaha/ympsr150.cpp b/src/mame/yamaha/ympsr150.cpp index 75a98f7eb94ee..9cbe1d3f66c21 100644 --- a/src/mame/yamaha/ympsr150.cpp +++ b/src/mame/yamaha/ympsr150.cpp @@ -1803,16 +1803,16 @@ ROM_END } // anonymous namespace // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -SYST( 1992, psr150, 0, 0, psr150, psr150, psr150_state, empty_init, "Yamaha", "PSR-150", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1993, psr110, psr150, 0, psr110, psr110, psr150_state, empty_init, "Yamaha", "PSR-110", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1992, psr75, psr150, 0, psr75, psr75, psr150_state, empty_init, "Yamaha", "PSR-75", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1992, pss11, psr150, 0, pss11, pss11, psr150_state, empty_init, "Yamaha", "PSS-11", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1992, pss21, psr150, 0, pss21, pss21, psr150_state, empty_init, "Yamaha", "PSS-21", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1992, pss31, psr150, 0, pss31, pss31, psr150_state, empty_init, "Yamaha", "PSS-31", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1994, dd9, 0, 0, dd9, dd9, psr150_state, empty_init, "Yamaha", "DD-9 Digital Percussion", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1994, psr180, 0, 0, psr180, psr180, psr150_state, empty_init, "Yamaha", "PSR-180", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1994, psr76, psr180, 0, psr76, psr76, psr150_state, empty_init, "Yamaha", "PSR-76", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1994, pss12, 0, 0, pss12, pss12, psr150_state, empty_init, "Yamaha", "PSS-12", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1994, pss6, pss12, 0, pss6, pss6, psr150_state, empty_init, "Yamaha", "PSS-6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1992, psr150, 0, 0, psr150, psr150, psr150_state, empty_init, "Yamaha", "PSR-150", MACHINE_SUPPORTS_SAVE ) +SYST( 1993, psr110, psr150, 0, psr110, psr110, psr150_state, empty_init, "Yamaha", "PSR-110", MACHINE_SUPPORTS_SAVE ) +SYST( 1992, psr75, psr150, 0, psr75, psr75, psr150_state, empty_init, "Yamaha", "PSR-75", MACHINE_SUPPORTS_SAVE ) +SYST( 1992, pss11, psr150, 0, pss11, pss11, psr150_state, empty_init, "Yamaha", "PSS-11", MACHINE_SUPPORTS_SAVE ) +SYST( 1992, pss21, psr150, 0, pss21, pss21, psr150_state, empty_init, "Yamaha", "PSS-21", MACHINE_SUPPORTS_SAVE ) +SYST( 1992, pss31, psr150, 0, pss31, pss31, psr150_state, empty_init, "Yamaha", "PSS-31", MACHINE_SUPPORTS_SAVE ) +SYST( 1994, dd9, 0, 0, dd9, dd9, psr150_state, empty_init, "Yamaha", "DD-9 Digital Percussion", MACHINE_SUPPORTS_SAVE ) +SYST( 1994, psr180, 0, 0, psr180, psr180, psr150_state, empty_init, "Yamaha", "PSR-180", MACHINE_SUPPORTS_SAVE ) +SYST( 1994, psr76, psr180, 0, psr76, psr76, psr150_state, empty_init, "Yamaha", "PSR-76", MACHINE_SUPPORTS_SAVE ) +SYST( 1994, pss12, 0, 0, pss12, pss12, psr150_state, empty_init, "Yamaha", "PSS-12", MACHINE_SUPPORTS_SAVE ) +SYST( 1994, pss6, pss12, 0, pss6, pss6, psr150_state, empty_init, "Yamaha", "PSS-6", MACHINE_SUPPORTS_SAVE ) SYST( 1996, psr190, 0, 0, psr190, psr190, psr150_state, empty_init, "Yamaha", "PSR-190", MACHINE_SUPPORTS_SAVE ) SYST( 1996, psr78, psr190, 0, psr78, psr78, psr150_state, empty_init, "Yamaha", "PSR-78", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/yamaha/ympsr60.cpp b/src/mame/yamaha/ympsr60.cpp index fe38f3f248b8f..5f2925c42cff7 100644 --- a/src/mame/yamaha/ympsr60.cpp +++ b/src/mame/yamaha/ympsr60.cpp @@ -738,5 +738,5 @@ ROM_END } // namespace -CONS(1985, psr60, 0, 0, psr60, psr60, psr60_state, empty_init, "Yamaha", "PSR-60 PortaSound", MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK) -CONS(1985, psr70, psr60, 0, psr70, psr70, psr60_state, empty_init, "Yamaha", "PSR-70 PortaSound", MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK) +CONS(1985, psr60, 0, 0, psr60, psr60, psr60_state, empty_init, "Yamaha", "PSR-60 PortaSound", MACHINE_IMPERFECT_SOUND) +CONS(1985, psr70, psr60, 0, psr70, psr70, psr60_state, empty_init, "Yamaha", "PSR-70 PortaSound", MACHINE_IMPERFECT_SOUND) diff --git a/src/mame/yamaha/ymtx81z.cpp b/src/mame/yamaha/ymtx81z.cpp index f74b9a7c5c0b8..58e8fdd2daa4d 100644 --- a/src/mame/yamaha/ymtx81z.cpp +++ b/src/mame/yamaha/ymtx81z.cpp @@ -187,4 +187,4 @@ ROM_END } // anonymous namespace -SYST(1987, tx81z, 0, 0, tx81z, tx81z, ymtx81z_state, empty_init, "Yamaha", "TX81Z FM Tone Generator", MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK) +SYST(1987, tx81z, 0, 0, tx81z, tx81z, ymtx81z_state, empty_init, "Yamaha", "TX81Z FM Tone Generator", MACHINE_IMPERFECT_SOUND) diff --git a/src/mame/yeno/301xl.cpp b/src/mame/yeno/301xl.cpp index f91f4d53904fc..8f27562a8d4e2 100644 --- a/src/mame/yeno/301xl.cpp +++ b/src/mame/yeno/301xl.cpp @@ -238,4 +238,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, y301xl, 0, 0, y301xl, y301xl, y301xl_state, empty_init, "Yeno / Bray Research", "301 XL (Yeno)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, y301xl, 0, 0, y301xl, y301xl, y301xl_state, empty_init, "Yeno / Bray Research", "301 XL (Yeno)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/yeno/416xl.cpp b/src/mame/yeno/416xl.cpp index f45723c83d7b8..86949f07291c0 100644 --- a/src/mame/yeno/416xl.cpp +++ b/src/mame/yeno/416xl.cpp @@ -219,4 +219,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, y416xl, 0, 0, y416xl, y416xl, y416xl_state, empty_init, "Yeno", "416 XL (Yeno)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, y416xl, 0, 0, y416xl, y416xl, y416xl_state, empty_init, "Yeno", "416 XL (Yeno)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/yeno/532xl.cpp b/src/mame/yeno/532xl.cpp index fd60cf1a8dd8a..569cc882c8b15 100644 --- a/src/mame/yeno/532xl.cpp +++ b/src/mame/yeno/532xl.cpp @@ -278,4 +278,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, y532xl, 0, 0, y532xl, y532xl, y532xl_state, empty_init, "Yeno", "532 XL (Yeno)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, y532xl, 0, 0, y532xl, y532xl, y532xl_state, empty_init, "Yeno", "532 XL (Yeno)", MACHINE_SUPPORTS_SAVE ) From 4c4bb3181b343f7a7e238ce6cea8fae30bada908 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sun, 14 Apr 2024 08:14:34 +1000 Subject: [PATCH 089/109] Fixed a few more class memory access warnings. --- src/devices/machine/ie15.cpp | 2 +- src/mame/midway/midyunit_v.cpp | 19 ++++++------- src/mame/misc/3do_m.cpp | 4 +-- src/mame/nintendo/n64_m.cpp | 5 +++- src/mame/nintendo/n64_v.h | 10 ++++--- src/mame/nintendo/n64types.h | 52 +++++++++++++++++----------------- src/mame/nintendo/pokemini.cpp | 26 ++++++++--------- src/mame/phoenix/phoenix_a.cpp | 6 ++-- src/mame/phoenix/phoenix_a.h | 8 +++--- src/tools/regrep.cpp | 17 +++++++---- 10 files changed, 79 insertions(+), 70 deletions(-) diff --git a/src/devices/machine/ie15.cpp b/src/devices/machine/ie15.cpp index ee0278801e346..bf8c929487818 100644 --- a/src/devices/machine/ie15.cpp +++ b/src/devices/machine/ie15.cpp @@ -494,7 +494,7 @@ void ie15_device::device_reset() { update_serial(0); - memset(&m_video, 0, sizeof(m_video)); + m_video = decltype(m_video)(); m_kb_ruslat = m_long_beep = m_kb_control = m_kb_data = m_kb_flag0 = 0; m_kb_flag = IE_TRUE; m_kbd_sdv = false; diff --git a/src/mame/midway/midyunit_v.cpp b/src/mame/midway/midyunit_v.cpp index 2e0e979d07998..6bcd2d0739a4e 100644 --- a/src/mame/midway/midyunit_v.cpp +++ b/src/mame/midway/midyunit_v.cpp @@ -58,7 +58,7 @@ VIDEO_START_MEMBER(midyunit_state,common) /* reset DMA state */ memset(m_dma_register, 0, sizeof(m_dma_register)); - memset(&m_dma_state, 0, sizeof(m_dma_state)); + m_dma_state = dma_state_t(); /* register for state saving */ save_item(NAME(m_autoerase_enable)); @@ -272,14 +272,13 @@ void midyunit_state::midyunit_paletteram_w(offs_t offset, uint16_t data, uint16_ void midyunit_state::dma_draw(uint16_t command) { - struct dma_state_t &dma_state = m_dma_state; int dx = (command & 0x10) ? -1 : 1; - int height = dma_state.height; - int width = dma_state.width; + int height = m_dma_state.height; + int width = m_dma_state.width; uint8_t *base = m_gfx_rom; - uint32_t offset = dma_state.offset >> 3; - uint16_t pal = dma_state.palette; - uint16_t color = pal | dma_state.color; + uint32_t offset = m_dma_state.offset >> 3; + uint16_t pal = m_dma_state.palette; + uint16_t color = pal | m_dma_state.color; int x, y; /* we only need the low 4 bits of the command */ @@ -288,14 +287,14 @@ void midyunit_state::dma_draw(uint16_t command) /* loop over the height */ for (y = 0; y < height; y++) { - int tx = dma_state.xpos; - int ty = dma_state.ypos; + int tx = m_dma_state.xpos; + int ty = m_dma_state.ypos; uint32_t o = offset; uint16_t *dest; /* determine Y position */ ty = (ty + y) & 0x1ff; - offset += dma_state.rowbytes; + offset += m_dma_state.rowbytes; /* determine destination pointer */ dest = &m_local_videoram[ty * 512]; diff --git a/src/mame/misc/3do_m.cpp b/src/mame/misc/3do_m.cpp index 8a09ad65e63a5..1a3d63a80a317 100644 --- a/src/mame/misc/3do_m.cpp +++ b/src/mame/misc/3do_m.cpp @@ -1099,7 +1099,7 @@ uint32_t _3do_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, void _3do_state::m_madam_init( void ) { - memset( &m_madam, 0, sizeof(MADAM) ); + m_madam = MADAM(); m_madam.revision = 0x01020000; m_madam.msysbits = 0x51; } @@ -1112,7 +1112,7 @@ void _3do_state::m_slow2_init( void ) void _3do_state::m_clio_init() { - memset( &m_clio, 0, sizeof(CLIO) ); + m_clio = CLIO(); m_clio.screen = m_screen; m_clio.revision = 0x02022000 /* 0x04000000 */; m_clio.unclerev = 0x03800000; diff --git a/src/mame/nintendo/n64_m.cpp b/src/mame/nintendo/n64_m.cpp index 068f64a2ae480..5e012e1d9599d 100644 --- a/src/mame/nintendo/n64_m.cpp +++ b/src/mame/nintendo/n64_m.cpp @@ -13,6 +13,9 @@ #include "debugger.h" #include "screen.h" +#include + + // device type definition DEFINE_DEVICE_TYPE(N64PERIPH, n64_periphs, "n64_periphs", "N64 Peripheral Chips") @@ -167,7 +170,7 @@ void n64_periphs::device_reset() field = 0; ai_timer->adjust(attotime::never); - memset(ai_fifo, 0, sizeof(ai_fifo)); + std::fill(std::begin(ai_fifo), std::end(ai_fifo), AUDIO_DMA()); ai_fifo_wpos = 0; ai_fifo_rpos = 0; ai_fifo_num = 0; diff --git a/src/mame/nintendo/n64_v.h b/src/mame/nintendo/n64_v.h index 2b9f87bfeae2a..a05c1e598d3dc 100644 --- a/src/mame/nintendo/n64_v.h +++ b/src/mame/nintendo/n64_v.h @@ -1,11 +1,13 @@ // license:BSD-3-Clause // copyright-holders:Ryan Holtz -#ifndef _VIDEO_N64_H_ -#define _VIDEO_N64_H_ +#ifndef MAME_NINTENDO_N64_V_H +#define MAME_NINTENDO_N64_V_H #include "video/poly.h" #include "pin64.h" +#include + /*****************************************************************************/ #define PIXEL_SIZE_4BIT 0 @@ -150,7 +152,7 @@ class n64_rdp : public poly_manager m_norm_slope_rom[i] = (normslope[(i << 1) + 1] << 8) | normslope[i << 1]; } - memset(m_tiles, 0, 8 * sizeof(n64_tile_t)); + std::fill(std::begin(m_tiles), std::end(m_tiles), n64_tile_t()); memset(m_cmd_data, 0, sizeof(m_cmd_data)); for (int32_t i = 0; i < 8; i++) @@ -396,4 +398,4 @@ class n64_rdp : public poly_manager bool dolog; }; -#endif // _VIDEO_N64_H_ +#endif // MAME_NINTENDO_N64_V_H diff --git a/src/mame/nintendo/n64types.h b/src/mame/nintendo/n64types.h index 6c99aec4e68ef..d2a800a163eb7 100644 --- a/src/mame/nintendo/n64types.h +++ b/src/mame/nintendo/n64types.h @@ -113,27 +113,27 @@ enum struct n64_tile_t { - int32_t format; // Image data format: RGBA, YUV, CI, IA, I - int32_t size; // Size of texel element: 4b, 8b, 16b, 32b - int32_t line; // Size of tile line in bytes - int32_t tmem; // Starting tmem address for this tile in bytes - int32_t palette; // Palette number for 4b CI texels - int32_t ct, mt, cs, ms; // Clamp / mirror enable bits for S / T direction - int32_t mask_t, shift_t, mask_s, shift_s; // Mask values / LOD shifts - int32_t lshift_s, rshift_s, lshift_t, rshift_t; - int32_t wrapped_mask_s, wrapped_mask_t; - bool clamp_s, clamp_t; - rgbaint_t mm, invmm; - rgbaint_t wrapped_mask; - rgbaint_t mask; - rgbaint_t invmask; - rgbaint_t lshift; - rgbaint_t rshift; - rgbaint_t sth; - rgbaint_t stl; - rgbaint_t clamp_st; - uint16_t sl, tl, sh, th; // 10.2 fixed-point, starting and ending texel row / column - int32_t num; + int32_t format = 0; // Image data format: RGBA, YUV, CI, IA, I + int32_t size = 0; // Size of texel element: 4b, 8b, 16b, 32b + int32_t line = 0; // Size of tile line in bytes + int32_t tmem = 0; // Starting tmem address for this tile in bytes + int32_t palette = 0; // Palette number for 4b CI texels + int32_t ct = 0, mt = 0, cs = 0, ms = 0; // Clamp / mirror enable bits for S / T direction + int32_t mask_t = 0, shift_t = 0, mask_s = 0, shift_s = 0; // Mask values / LOD shifts + int32_t lshift_s = 0, rshift_s = 0, lshift_t = 0, rshift_t = 0; + int32_t wrapped_mask_s = 0, wrapped_mask_t = 0; + bool clamp_s = false, clamp_t = false; + rgbaint_t mm = { 0, 0, 0, 0 }, invmm = { 0, 0, 0, 0 }; + rgbaint_t wrapped_mask = { 0, 0, 0, 0 }; + rgbaint_t mask = { 0, 0, 0, 0 }; + rgbaint_t invmask = { 0, 0, 0, 0 }; + rgbaint_t lshift = { 0, 0, 0, 0 }; + rgbaint_t rshift = { 0, 0, 0, 0 }; + rgbaint_t sth = { 0, 0, 0, 0 }; + rgbaint_t stl = { 0, 0, 0, 0 }; + rgbaint_t clamp_st = { 0, 0, 0, 0 }; + uint16_t sl = 0, tl = 0, sh = 0, th = 0; // 10.2 fixed-point, starting and ending texel row / column + int32_t num = 0; }; struct span_base_t @@ -255,10 +255,10 @@ struct rdp_poly_state other_modes_t m_other_modes; /* miscellaneous rasterizer bits (2) */ span_base_t m_span_base; /* span initial values for triangle rasterization */ rectangle_t m_scissor; /* screen-space scissor bounds */ - uint32_t m_fill_color; /* poly fill color */ + uint32_t m_fill_color; /* poly fill color */ n64_tile_t m_tiles[8]; /* texture tile state */ - uint8_t m_tmem[0x1000]; /* texture cache */ - int32_t tilenum; /* texture tile index */ + uint8_t m_tmem[0x1000]; /* texture cache */ + int32_t tilenum; /* texture tile index */ bool flip; /* left-major / right-major flip */ bool rect; /* primitive is rectangle (vs. triangle) */ }; @@ -268,8 +268,8 @@ struct rdp_poly_state // This is enormous and horrible struct rdp_span_aux { - uint32_t m_unscissored_rx; - uint16_t m_cvg[RDP_CVG_SPAN_MAX]; + uint32_t m_unscissored_rx; + uint16_t m_cvg[RDP_CVG_SPAN_MAX]; color_t m_memory_color; color_t m_pixel_color; color_t m_inv_pixel_color; diff --git a/src/mame/nintendo/pokemini.cpp b/src/mame/nintendo/pokemini.cpp index 2581451d814dc..5b44119606ab1 100644 --- a/src/mame/nintendo/pokemini.cpp +++ b/src/mame/nintendo/pokemini.cpp @@ -46,17 +46,17 @@ class pokemini_state : public driver_device private: struct PRC { - uint8_t colors_inverted = 0; - uint8_t background_enabled = 0; - uint8_t sprites_enabled = 0; - uint8_t copy_enabled = 0; - uint8_t map_size = 0; - uint8_t map_size_x = 0; - uint8_t frame_count = 0; - uint8_t max_frame_count = 0; - uint32_t bg_tiles = 0; - uint32_t spr_tiles = 0; - uint8_t count = 0; + uint8_t colors_inverted = 0; + uint8_t background_enabled = 0; + uint8_t sprites_enabled = 0; + uint8_t copy_enabled = 0; + uint8_t map_size = 0; + uint8_t map_size_x = 0; + uint8_t frame_count = 0; + uint8_t max_frame_count = 0; + uint32_t bg_tiles = 0; + uint32_t spr_tiles = 0; + uint8_t count = 0; emu_timer *count_timer = nullptr; }; @@ -1651,8 +1651,8 @@ TIMER_CALLBACK_MEMBER(pokemini_state::prc_counter_callback) void pokemini_state::machine_start() { /* Clear internal structures */ - memset( &m_prc, 0, sizeof(m_prc) ); - memset( &m_timers, 0, sizeof(m_timers) ); + m_prc = PRC(); + m_timers = TIMERS(); memset( m_pm_reg, 0, sizeof(m_pm_reg) ); /* Set up timers */ diff --git a/src/mame/phoenix/phoenix_a.cpp b/src/mame/phoenix/phoenix_a.cpp index 1008a61539ccd..0f24cd62de4a1 100644 --- a/src/mame/phoenix/phoenix_a.cpp +++ b/src/mame/phoenix/phoenix_a.cpp @@ -68,9 +68,9 @@ void phoenix_sound_device::device_start() uint32_t shiftreg; m_sound_latch_a = 0; - memset(&m_c24_state, 0, sizeof(m_c24_state)); - memset(&m_c25_state, 0, sizeof(m_c25_state)); - memset(&m_noise_state, 0, sizeof(m_noise_state)); + m_c24_state = c_state(); + m_c25_state = c_state(); + m_noise_state = n_state(); m_poly18 = std::make_unique(1ul << (18-5)); diff --git a/src/mame/phoenix/phoenix_a.h b/src/mame/phoenix/phoenix_a.h index 3738de54b8f2f..389ec20ca7119 100644 --- a/src/mame/phoenix/phoenix_a.h +++ b/src/mame/phoenix/phoenix_a.h @@ -41,10 +41,10 @@ class phoenix_sound_device : public device_t, public device_sound_interface }; // internal state - struct c_state m_c24_state; - struct c_state m_c25_state; - struct n_state m_noise_state; - uint8_t m_sound_latch_a = 0; + c_state m_c24_state; + c_state m_c25_state; + n_state m_noise_state; + uint8_t m_sound_latch_a = 0; sound_stream * m_channel = nullptr; std::unique_ptr m_poly18; required_device m_discrete; diff --git a/src/tools/regrep.cpp b/src/tools/regrep.cpp index 21254acfe3c74..316ef805f5a85 100644 --- a/src/tools/regrep.cpp +++ b/src/tools/regrep.cpp @@ -14,6 +14,7 @@ #include "osdcomm.h" +#include #include #include #include @@ -67,8 +68,8 @@ struct summary_file summary_file * next; char name[20]; char source[100]; - uint8_t status[MAX_COMPARES]; - uint8_t matchbitmap[MAX_COMPARES]; + uint8_t status[MAX_COMPARES]; + uint8_t matchbitmap[MAX_COMPARES]; std::string text[MAX_COMPARES]; }; @@ -290,7 +291,7 @@ int main(int argc, char *argv[]) static summary_file *get_file(const char *filename) { - summary_file *file; + summary_file *file = nullptr; /* use the first two characters as a lookup */ for (file = filehash[filename[0] & 0x7f][filename[1] & 0x7f]; file != nullptr; file = file->next) @@ -298,10 +299,14 @@ static summary_file *get_file(const char *filename) return file; /* didn't find one -- allocate */ - file = (summary_file *)malloc(sizeof(*file)); + file = new (std::nothrow) summary_file; if (file == nullptr) return nullptr; - memset(file, 0, sizeof(*file)); + file->next = nullptr; + std::fill(std::begin(file->name), std::end(file->name), '\0'); + std::fill(std::begin(file->source), std::end(file->source), '\0'); + std::fill(std::begin(file->status), std::end(file->status), 0); + std::fill(std::begin(file->matchbitmap), std::end(file->matchbitmap), 0); /* set the name so we find it in the future */ strcpy(file->name, filename); @@ -510,7 +515,7 @@ static int CLIB_DECL compare_file(const void *file0ptr, const void *file1ptr) into a single, sorted list -------------------------------------------------*/ -static summary_file *sort_file_list(void) +static summary_file *sort_file_list() { summary_file *listhead, **tailptr, *curfile, **filearray; int numfiles, filenum; From e294e5598ffa0d2e7c83a69865529a57c70e8fa1 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 14 Apr 2024 01:09:58 +0200 Subject: [PATCH 090/109] misc internal artwork: disable orange mouse pointer (false positive clickable artwork detection) --- docs/source/luascript/ref-render.rst | 2 +- src/mame/layout/alphie.lay | 2 +- src/mame/layout/autorace.lay | 2 +- src/mame/layout/microvision.lay | 2 +- src/mame/layout/videoart.lay | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/luascript/ref-render.rst b/docs/source/luascript/ref-render.rst index 7cc1400b3cb41..1ebe11df3e1bc 100644 --- a/docs/source/luascript/ref-render.rst +++ b/docs/source/luascript/ref-render.rst @@ -1157,7 +1157,7 @@ view.has_art (read-only) items that are not visible because the user has hidden the item collection that they belong to. view.show_pointers (read/write) - A Boolean that sets whether mouse and pon pointers should be displayed for + A Boolean that sets whether mouse and pen pointers should be displayed for the view. view.hide_inactive_pointers (read/write) A Boolean that sets whether mouse pointers for the view should be hidden diff --git a/src/mame/layout/alphie.lay b/src/mame/layout/alphie.lay index 3d3b591c31a27..09e05057a9604 100644 --- a/src/mame/layout/alphie.lay +++ b/src/mame/layout/alphie.lay @@ -46,7 +46,7 @@ authors:hap - + diff --git a/src/mame/layout/autorace.lay b/src/mame/layout/autorace.lay index 8a4b215cb3500..356e4dc337f17 100644 --- a/src/mame/layout/autorace.lay +++ b/src/mame/layout/autorace.lay @@ -55,7 +55,7 @@ authors:hap - + diff --git a/src/mame/layout/microvision.lay b/src/mame/layout/microvision.lay index 445e50c06c88e..d293d2b1d8306 100644 --- a/src/mame/layout/microvision.lay +++ b/src/mame/layout/microvision.lay @@ -34,7 +34,7 @@ authors:hap - + diff --git a/src/mame/layout/videoart.lay b/src/mame/layout/videoart.lay index 590a1bd99ea08..39d03924dde25 100644 --- a/src/mame/layout/videoart.lay +++ b/src/mame/layout/videoart.lay @@ -56,7 +56,7 @@ authors:hap - + From 03a23ff7392acb20070627acf89d1592c1ff7b28 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Sun, 14 Apr 2024 02:14:23 +0200 Subject: [PATCH 091/109] capcom/mitchell.cpp: Rename the pkladiesblu OKI sound ROM to avoid name conflicts. --- src/mame/capcom/mitchell.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/capcom/mitchell.cpp b/src/mame/capcom/mitchell.cpp index 5ca9dc2bde8bd..0a6ba3e963297 100644 --- a/src/mame/capcom/mitchell.cpp +++ b/src/mame/capcom/mitchell.cpp @@ -2222,7 +2222,7 @@ ROM_START( pkladiesblu ) // uncensored encrypted bootleg. ROMs 1, 2, 3, 16 & 17 ROM_LOAD("pklbu17.bin", 0x000000, 0x20000, CRC(5a6efdcc) SHA1(04120dd4da0ff8df514f98a44d7eee7100e4c033) ) ROM_REGION( 0x80000, "oki", 0 ) - ROM_LOAD("pklbu13.bin", 0x000000, 0x20000, CRC(16b79788) SHA1(6b796119d3c57229ba3d613ce8832c94e9616f76) ) + ROM_LOAD("pklbu3.bin", 0x000000, 0x20000, CRC(16b79788) SHA1(6b796119d3c57229ba3d613ce8832c94e9616f76) ) ROM_END ROM_START( pkladiesbl2 ) // same as the above but without the z80 block, only 1.ic112 differs From 2fcb2dc5333cf6d97a32406fa3884b404bf25629 Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Sun, 14 Apr 2024 13:44:09 +0200 Subject: [PATCH 092/109] coleco/expansion: Implement device_mixer_interface --- src/devices/bus/coleco/expansion/expansion.cpp | 1 + src/devices/bus/coleco/expansion/expansion.h | 5 ++++- src/devices/bus/coleco/expansion/sgm.cpp | 5 +---- src/mame/coleco/coleco.cpp | 1 + 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/devices/bus/coleco/expansion/expansion.cpp b/src/devices/bus/coleco/expansion/expansion.cpp index 87223699c2bfb..30b9c831dfbf5 100644 --- a/src/devices/bus/coleco/expansion/expansion.cpp +++ b/src/devices/bus/coleco/expansion/expansion.cpp @@ -26,6 +26,7 @@ DEFINE_DEVICE_TYPE(COLECO_EXPANSION, coleco_expansion_device, "coleco_expansion" coleco_expansion_device::coleco_expansion_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, COLECO_EXPANSION, tag, owner, clock), device_single_card_slot_interface(mconfig, *this), + device_mixer_interface(mconfig, *this), m_program(*this, finder_base::DUMMY_TAG, -1), m_io(*this, finder_base::DUMMY_TAG, -1), m_int_handler(*this), diff --git a/src/devices/bus/coleco/expansion/expansion.h b/src/devices/bus/coleco/expansion/expansion.h index 421a2ab70d7ec..74dadfe57f32b 100644 --- a/src/devices/bus/coleco/expansion/expansion.h +++ b/src/devices/bus/coleco/expansion/expansion.h @@ -55,7 +55,10 @@ class device_coleco_expansion_interface; // BUS DEVICE //************************************************************************** -class coleco_expansion_device : public device_t, public device_single_card_slot_interface +class coleco_expansion_device : + public device_t, + public device_single_card_slot_interface, + public device_mixer_interface { public: // construction/destruction diff --git a/src/devices/bus/coleco/expansion/sgm.cpp b/src/devices/bus/coleco/expansion/sgm.cpp index 8849813a2412d..d52d91f5b478d 100644 --- a/src/devices/bus/coleco/expansion/sgm.cpp +++ b/src/devices/bus/coleco/expansion/sgm.cpp @@ -9,7 +9,6 @@ #include "emu.h" #include "sgm.h" #include "sound/ay8910.h" -#include "speaker.h" //************************************************************************** @@ -47,10 +46,8 @@ void coleco_sgm_device::io_map(address_map &map) void coleco_sgm_device::device_add_mconfig(machine_config &config) { - SPEAKER(config, "mono").front_center(); - ay8910_device &ay(AY8910(config, "ay", 7.15909_MHz_XTAL / 4)); - ay.add_route(ALL_OUTPUTS, "mono", 1.00); + ay.add_route(ALL_OUTPUTS, DEVICE_SELF_OWNER, 1.0); } diff --git a/src/mame/coleco/coleco.cpp b/src/mame/coleco/coleco.cpp index 8580899cf89e5..46d749bbddf64 100644 --- a/src/mame/coleco/coleco.cpp +++ b/src/mame/coleco/coleco.cpp @@ -603,6 +603,7 @@ void coleco_state::coleco(machine_config &config) exp.set_io_space(m_maincpu, AS_IO); exp.int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0); // TODO: Merge with other IRQs? exp.nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI); + exp.add_route(ALL_OUTPUTS, "mono", 1.00); } void coleco_state::colecop(machine_config &config) From 1f0b6e76d8e7fde4ecfc0d9be940326e7127496b Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Mon, 15 Apr 2024 01:22:39 +1000 Subject: [PATCH 093/109] -ui/menu.cpp, ui/selmenu.cpp: Handle mouse wheel units properly. -Fixed a few more class memory access warnings. --- src/devices/bus/qbus/dvk_mx.cpp | 36 +++++++++++++-- src/devices/bus/qbus/dvk_mx.h | 4 ++ src/devices/machine/1801vp128.cpp | 36 +++++++++++++-- src/devices/machine/1801vp128.h | 4 ++ src/devices/machine/fdc_pll.h | 4 +- src/devices/machine/iopdma.cpp | 6 ++- src/frontend/mame/ui/menu.cpp | 40 ++++++++++++----- src/frontend/mame/ui/menu.h | 2 + src/frontend/mame/ui/selmenu.cpp | 73 +++++++++++++++++++++++++------ src/frontend/mame/ui/selmenu.h | 2 + src/mame/fujitsu/fmtowns.cpp | 4 +- src/mame/pc/mc1502.cpp | 3 +- src/mame/pc/poisk1.cpp | 2 +- src/mame/rm/rmnimbus_m.cpp | 2 +- 14 files changed, 177 insertions(+), 41 deletions(-) diff --git a/src/devices/bus/qbus/dvk_mx.cpp b/src/devices/bus/qbus/dvk_mx.cpp index fb95431e270fa..757262481ec54 100644 --- a/src/devices/bus/qbus/dvk_mx.cpp +++ b/src/devices/bus/qbus/dvk_mx.cpp @@ -53,6 +53,38 @@ DEFINE_DEVICE_TYPE(DVK_MX, dvk_mx_device, "dvk_mx", "DVK MX floppy controller") + +inline dvk_mx_device::floppy_info::floppy_info() + : tm(nullptr) + , dev(nullptr) + , id(0) + , main_state(0) + , sub_state(0) + , dir(0) + , counter(0) + , live(false) + , index(false) +{ +} + + +inline dvk_mx_device::live_info::live_info() + : tm(attotime::never) + , state(IDLE) + , next_state(-1) + , fi(nullptr) + , shift_reg(0) + , bit_counter(0) + , byte_counter(0) + , data_separator_phase(false) + , data_reg(0) + , cksum(0) + , pll() +{ +} + + + //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -66,10 +98,6 @@ dvk_mx_device::dvk_mx_device(const machine_config &mconfig, const char *tag, dev , device_qbus_card_interface(mconfig, *this) , m_connectors(*this, "%u", 0U) { - memset(&cur_live, 0x00, sizeof(cur_live)); - cur_live.tm = attotime::never; - cur_live.state = IDLE; - cur_live.next_state = -1; } diff --git a/src/devices/bus/qbus/dvk_mx.h b/src/devices/bus/qbus/dvk_mx.h index 6dc8482398e73..f65b4ec1b27d6 100644 --- a/src/devices/bus/qbus/dvk_mx.h +++ b/src/devices/bus/qbus/dvk_mx.h @@ -101,6 +101,8 @@ class dvk_mx_device : public device_t, public device_qbus_card_interface }; struct floppy_info { + floppy_info(); + emu_timer *tm; floppy_image_device *dev; int id; @@ -110,6 +112,8 @@ class dvk_mx_device : public device_t, public device_qbus_card_interface }; struct live_info { + live_info(); + attotime tm; int state, next_state; floppy_info *fi; diff --git a/src/devices/machine/1801vp128.cpp b/src/devices/machine/1801vp128.cpp index 58d399dbd2df9..2c1f089f55765 100644 --- a/src/devices/machine/1801vp128.cpp +++ b/src/devices/machine/1801vp128.cpp @@ -49,6 +49,38 @@ DEFINE_DEVICE_TYPE(K1801VP128, k1801vp128_device, "1801vp1-128", "1801VP1-128") +inline k1801vp128_device::floppy_info::floppy_info() + : tm(nullptr) + , dev(nullptr) + , id(0) + , main_state(0) + , sub_state(0) + , dir(0) + , counter(0) + , live(false) + , index(false) +{ +} + + +inline k1801vp128_device::live_info::live_info() + : tm(attotime::never) + , state(IDLE) + , next_state(-1) + , fi(nullptr) + , shift_reg(0) + , crc(0) + , bit_counter(0) + , data_separator_phase(false) + , data_bit_context(false) + , crc_init(false) + , data_reg(0) + , pll() +{ +} + + + //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -62,10 +94,6 @@ k1801vp128_device::k1801vp128_device(const machine_config &mconfig, const char * , m_connectors(*this, "%u", 0U) , m_read_ds(*this, -1) { - memset(&cur_live, 0x00, sizeof(cur_live)); - cur_live.tm = attotime::never; - cur_live.state = IDLE; - cur_live.next_state = -1; } diff --git a/src/devices/machine/1801vp128.h b/src/devices/machine/1801vp128.h index 339ddcbd423cb..4a83f58b01828 100644 --- a/src/devices/machine/1801vp128.h +++ b/src/devices/machine/1801vp128.h @@ -139,6 +139,8 @@ class k1801vp128_device : public device_t struct floppy_info { + floppy_info(); + emu_timer *tm; floppy_image_device *dev; int id; @@ -149,6 +151,8 @@ class k1801vp128_device : public device_t struct live_info { + live_info(); + attotime tm; int state, next_state; floppy_info *fi; diff --git a/src/devices/machine/fdc_pll.h b/src/devices/machine/fdc_pll.h index e232260162cc5..c048f5d26187a 100644 --- a/src/devices/machine/fdc_pll.h +++ b/src/devices/machine/fdc_pll.h @@ -17,8 +17,8 @@ class fdc_pll_t { attotime write_start_time; attotime write_buffer[32]; - int write_position; - int freq_hist; + int write_position = 0; + int freq_hist = 0; void set_clock(const attotime &period); void reset(const attotime &when); diff --git a/src/devices/machine/iopdma.cpp b/src/devices/machine/iopdma.cpp index 784bc16b515d5..8ca904d1747c3 100644 --- a/src/devices/machine/iopdma.cpp +++ b/src/devices/machine/iopdma.cpp @@ -14,6 +14,8 @@ #include "cpu/mips/ps2vu.h" +#include + DEFINE_DEVICE_TYPE(SONYIOP_DMA, iop_dma_device, "iopdma", "PlayStation 2 IOP DMAC") @@ -72,8 +74,8 @@ void iop_dma_device::device_start() void iop_dma_device::device_reset() { - memset(m_channels, 0, sizeof(channel_t) * 16); - memset(m_int_ctrl, 0, sizeof(intctrl_t) * 2); + std::fill(std::begin(m_channels), std::end(m_channels), channel_t()); + std::fill(std::begin(m_int_ctrl), std::end(m_int_ctrl), intctrl_t{ 0, 0, false }); m_dpcr[0] = 0; m_dpcr[1] = 0; m_dicr[0] = 0; diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp index a5c82aa90c227..00710e073a99b 100644 --- a/src/frontend/mame/ui/menu.cpp +++ b/src/frontend/mame/ui/menu.cpp @@ -227,10 +227,7 @@ uint32_t menu::global_state::ui_handler(render_container &container) // ensure topmost menu is active - need a loop because it could push another menu while (m_stack && !m_stack->is_active()) { - m_stack->m_items_drawn = false; - m_stack->m_pointer_state = track_pointer::IDLE; - m_stack->m_active = true; - m_stack->menu_activated(); + m_stack->activate_menu(); if (m_stack && m_stack->is_active()) { // menu activated - draw it to ensure it's on-screen before it can process input @@ -414,6 +411,7 @@ menu::menu(mame_ui_manager &mui, render_container &container) , m_pointer_updated(0.0F, 0.0F) , m_pointer_line(0) , m_pointer_repeat(std::chrono::steady_clock::time_point::min()) + , m_accumulated_wheel(0) , m_process_flags(0) , m_selected(0) , m_special_main_menu(false) @@ -1044,9 +1042,16 @@ bool menu::handle_events(uint32_t flags, event &ev) case ui_event::type::MOUSE_WHEEL: if ((track_pointer::IDLE == m_pointer_state) || (track_pointer::IGNORED == m_pointer_state)) { - if (!custom_mouse_scroll((0 < local_menu_event.zdelta) ? -local_menu_event.num_lines : local_menu_event.num_lines) && !(flags & (PROCESS_ONLYCHAR | PROCESS_CUSTOM_NAV))) + // the value is scaled to 120 units per "click" + m_accumulated_wheel += local_menu_event.zdelta * local_menu_event.num_lines; + int const lines((m_accumulated_wheel + ((0 < local_menu_event.zdelta) ? 36 : -36)) / 120); + if (!lines) + break; + m_accumulated_wheel -= lines * 120; + + if (!custom_mouse_scroll(-lines) && !(flags & (PROCESS_ONLYCHAR | PROCESS_CUSTOM_NAV))) { - if (local_menu_event.zdelta > 0) + if (lines > 0) { if (is_first_selected()) { @@ -1054,12 +1059,12 @@ bool menu::handle_events(uint32_t flags, event &ev) } else { - m_selected -= local_menu_event.num_lines; + m_selected -= lines; validate_selection(-1); } top_line -= (m_selected <= top_line && top_line != 0); if (m_selected <= top_line && m_visible_items != m_visible_lines) - top_line -= local_menu_event.num_lines; + top_line -= lines; } else { @@ -1069,12 +1074,12 @@ bool menu::handle_events(uint32_t flags, event &ev) } else { - m_selected += local_menu_event.num_lines; + m_selected -= lines; validate_selection(1); } top_line += (m_selected >= top_line + m_visible_items + (top_line != 0)); if (m_selected >= (top_line + m_visible_items + (top_line != 0))) - top_line += local_menu_event.num_lines; + top_line -= lines; } } } @@ -1899,6 +1904,21 @@ void menu::validate_selection(int scandir) } +//------------------------------------------------- +// activate_menu - handle becoming top of the +// menu stack +//------------------------------------------------- + +void menu::activate_menu() +{ + m_items_drawn = false; + m_pointer_state = track_pointer::IDLE; + m_accumulated_wheel = 0; + m_active = true; + menu_activated(); +} + + //------------------------------------------------- // check_metrics - recompute metrics if target // geometry has changed diff --git a/src/frontend/mame/ui/menu.h b/src/frontend/mame/ui/menu.h index 791432482b5d6..14031fb2c0891 100644 --- a/src/frontend/mame/ui/menu.h +++ b/src/frontend/mame/ui/menu.h @@ -511,6 +511,7 @@ class menu void extra_text_draw_box(float origx1, float origx2, float origy, float yspan, std::string_view text, int direction); + void activate_menu(); bool check_metrics(); bool do_rebuild(); bool first_item_visible() const { return top_line <= 0; } @@ -562,6 +563,7 @@ class menu std::pair m_pointer_updated; // location where pointer tracking was updated int m_pointer_line; // the line we're tracking pointer motion in std::chrono::steady_clock::time_point m_pointer_repeat; + int m_accumulated_wheel; // accumulated scroll wheel/gesture movement uint32_t m_process_flags; // event processing options int m_selected; // which item is selected diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp index a5645e79ca840..5655c226d3f0e 100644 --- a/src/frontend/mame/ui/selmenu.cpp +++ b/src/frontend/mame/ui/selmenu.cpp @@ -533,6 +533,8 @@ menu_select_launch::menu_select_launch(mame_ui_manager &mui, render_container &c , m_base_pointer(0.0F, 0.0F) , m_last_pointer(0.0F, 0.0F) , m_clicked_line(0) + , m_wheel_target(focused_menu::MAIN) + , m_wheel_movement(0) , m_primary_vbounds(0.0F, -1.0F) , m_primary_items_top(-1.0F) , m_primary_items_hbounds(0.0F, -1.0F) @@ -938,6 +940,8 @@ void menu_select_launch::custom_render(u32 flags, void *selectedref, float top, void menu_select_launch::menu_activated() { m_panels_status = ui().options().hide_panels(); + m_wheel_target = focused_menu::MAIN; + m_wheel_movement = 0; } @@ -1645,22 +1649,57 @@ bool menu_select_launch::handle_events(u32 flags, event &ev) case ui_event::type::MOUSE_WHEEL: if ((&machine().render().ui_target() == local_menu_event.target) && pointer_idle() && !m_ui_error) { + // check whether it's over something scrollable float x, y; bool const hit(local_menu_event.target->map_point_container(local_menu_event.mouse_x, local_menu_event.mouse_y, container(), x, y)); if (!hit) + { + m_wheel_movement = 0; break; - + } + focused_menu hover; if ((x >= m_primary_items_hbounds.first) && (x < m_primary_items_hbounds.second) && (y >= m_primary_items_top) && (y < (m_primary_items_top + (float(m_primary_lines) * line_height())))) { - if (local_menu_event.zdelta > 0) + hover = focused_menu::MAIN; + } + else if (show_left_panel() && (x >= m_left_items_hbounds.first) && (x < m_left_items_hbounds.second) && (y >= m_left_items_top) && (y < (m_left_items_top + (float(m_left_visible_lines) * m_info_line_height)))) + { + hover = focused_menu::LEFT; + } + else if (show_right_panel() && (x >= m_right_content_hbounds.first) && (x < m_right_content_hbounds.second) && (y >= m_right_content_vbounds.first) && (y < m_right_content_vbounds.second)) + { + hover = focused_menu::RIGHTBOTTOM; + } + else + { + m_wheel_movement = 0; + break; + } + + // clear out leftovers if it isn't the last thing to be scrolled + if (hover != m_wheel_target) + m_wheel_movement = 0; + m_wheel_target = hover; + + // the value is scaled to 120 units per "click" + m_wheel_movement += local_menu_event.zdelta * local_menu_event.num_lines; + int const lines((m_wheel_movement + ((0 < local_menu_event.zdelta) ? 36 : -36)) / 120); + if (!lines) + break; + m_wheel_movement -= lines * 120; + + switch (hover) + { + case focused_menu::MAIN: + if (lines > 0) { if ((selected_index() >= m_available_items) || is_first_selected()) break; stop = true; ev.iptkey = IPT_CUSTOM; // stop processing events so info can be rebuilt - set_selected_index(selected_index() - local_menu_event.num_lines); + set_selected_index(selected_index() - lines); if (selected_index() < top_line + (top_line != 0)) - top_line -= local_menu_event.num_lines; + top_line -= lines; } else { @@ -1668,20 +1707,26 @@ bool menu_select_launch::handle_events(u32 flags, event &ev) break; stop = true; ev.iptkey = IPT_CUSTOM; // stop processing events so info can be rebuilt - set_selected_index(std::min(selected_index() + local_menu_event.num_lines, m_available_items - 1)); + set_selected_index(std::min(selected_index() - lines, m_available_items - 1)); if (selected_index() >= top_line + m_visible_items + (top_line != 0)) - top_line += local_menu_event.num_lines; + top_line -= lines; } - } - else if ((x >= m_right_content_hbounds.first) && (x < m_right_content_hbounds.second) && (y >= m_right_content_vbounds.first) && (y < m_right_content_vbounds.second)) - { - if (show_right_panel() && (RP_INFOS == m_right_panel)) + break; + case focused_menu::LEFT: { - if (local_menu_event.zdelta > 0) - m_topline_datsview -= local_menu_event.num_lines; - else - m_topline_datsview += local_menu_event.num_lines; + m_left_visible_top = std::clamp(m_left_visible_top - lines, 0, m_left_item_count - m_left_visible_lines); + int const first(left_at_top() ? 0 : (m_left_visible_top + 1)); + int const last(m_left_visible_top + m_left_visible_lines - (left_at_bottom() ? 1 : 2)); + m_filter_highlight = std::clamp(m_filter_highlight, first, last); + m_filter_highlight = std::clamp(m_filter_highlight - lines, 0, m_left_item_count - 1); } + break; + case focused_menu::RIGHTBOTTOM: + if (RP_INFOS == m_right_panel) + m_topline_datsview -= lines; + break; + case focused_menu::RIGHTTOP: + break; // never gets here } } break; diff --git a/src/frontend/mame/ui/selmenu.h b/src/frontend/mame/ui/selmenu.h index b6793994a1f54..d03bae9de8fab 100644 --- a/src/frontend/mame/ui/selmenu.h +++ b/src/frontend/mame/ui/selmenu.h @@ -435,6 +435,8 @@ class menu_select_launch : public menu std::pair m_base_pointer; std::pair m_last_pointer; int m_clicked_line; + focused_menu m_wheel_target; + int m_wheel_movement; std::pair m_primary_vbounds; float m_primary_items_top; diff --git a/src/mame/fujitsu/fmtowns.cpp b/src/mame/fujitsu/fmtowns.cpp index c16ce16cf3b2e..6208cc12c4290 100644 --- a/src/mame/fujitsu/fmtowns.cpp +++ b/src/mame/fujitsu/fmtowns.cpp @@ -2357,8 +2357,8 @@ void towns_state::driver_start() m_towns_status_timer = timer_alloc(FUNC(towns_state::towns_cd_status_ready), this); m_towns_cdda_timer = timer_alloc(FUNC(towns_state::towns_delay_cdda), this); - memset(&m_video,0,sizeof(struct towns_video_controller)); - memset(&m_towns_cd,0,sizeof(struct towns_cdrom_controller)); + m_video = towns_video_controller(); + m_towns_cd = towns_cdrom_controller(); m_towns_cd.status = 0x01; // CDROM controller ready m_towns_cd.buffer_ptr = -1; m_towns_cd.read_timer = timer_alloc(FUNC(towns_state::towns_cdrom_read_byte), this); diff --git a/src/mame/pc/mc1502.cpp b/src/mame/pc/mc1502.cpp index dd47022b30bcb..234f9e6798415 100644 --- a/src/mame/pc/mc1502.cpp +++ b/src/mame/pc/mc1502.cpp @@ -274,7 +274,8 @@ void mc1502_state::machine_start() Last pulse causes BIOS to write a 'break' scancode into port 60h. */ m_pic8259->ir1_w(1); - memset(&m_kbd, 0, sizeof(m_kbd)); + m_kbd.pulsing = 0; + m_kbd.mask = 0; m_kbd.keyb_signal_timer = timer_alloc(FUNC(mc1502_state::keyb_signal_callback), this); m_kbd.keyb_signal_timer->adjust(attotime::from_msec(20), 0, attotime::from_msec(20)); } diff --git a/src/mame/pc/poisk1.cpp b/src/mame/pc/poisk1.cpp index 6094d0e85381f..b2065bbda0739 100644 --- a/src/mame/pc/poisk1.cpp +++ b/src/mame/pc/poisk1.cpp @@ -429,7 +429,7 @@ void p1_state::video_start() { address_space &space = m_maincpu->space(AS_PROGRAM); - memset(&m_video, 0, sizeof(m_video)); + m_video = decltype(m_video)(); m_video.videoram_base = std::make_unique(0x8000); m_video.videoram = m_video.videoram_base.get(); m_video.stride = 80; diff --git a/src/mame/rm/rmnimbus_m.cpp b/src/mame/rm/rmnimbus_m.cpp index 2a17d32882f35..fedc14e6ee417 100644 --- a/src/mame/rm/rmnimbus_m.cpp +++ b/src/mame/rm/rmnimbus_m.cpp @@ -696,7 +696,7 @@ void rmnimbus_state::pc8031_reset() { logerror("peripheral controller reset\n"); - memset(&m_ipc_interface,0,sizeof(m_ipc_interface)); + m_ipc_interface = decltype(m_ipc_interface)(); } From ed96f589b937d59dbfbd09320ee5fd80000585e0 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 14 Apr 2024 13:40:47 +0200 Subject: [PATCH 094/109] shifter overlay: remove vertical widescreen views --- src/mame/layout/buggychl.lay | 20 ++---------------- src/mame/layout/chqflag.lay | 20 ++---------------- src/mame/layout/grchamp.lay | 20 ++---------------- src/mame/layout/lagunar.lay | 20 ++---------------- src/mame/layout/overdriv.lay | 20 ++---------------- src/mame/layout/spyhunt.lay | 37 +++++----------------------------- src/mame/layout/spyhunttec.lay | 37 +++++----------------------------- src/mame/layout/turbo.lay | 30 ++------------------------- src/mame/layout/turbotag.lay | 16 --------------- src/mame/layout/vclock3.lay | 2 +- 10 files changed, 23 insertions(+), 199 deletions(-) diff --git a/src/mame/layout/buggychl.lay b/src/mame/layout/buggychl.lay index beda9e0d4a949..f530664aaabfc 100644 --- a/src/mame/layout/buggychl.lay +++ b/src/mame/layout/buggychl.lay @@ -74,7 +74,7 @@ license:CC0-1.0 - + @@ -82,23 +82,7 @@ license:CC0-1.0 - - - - - - - - - - - - - - - - - + diff --git a/src/mame/layout/chqflag.lay b/src/mame/layout/chqflag.lay index 13fa456d6b5a3..1f01833254222 100644 --- a/src/mame/layout/chqflag.lay +++ b/src/mame/layout/chqflag.lay @@ -74,7 +74,7 @@ license:CC0-1.0 - + @@ -82,23 +82,7 @@ license:CC0-1.0 - - - - - - - - - - - - - - - - - + diff --git a/src/mame/layout/grchamp.lay b/src/mame/layout/grchamp.lay index 4524b79e0eda6..2bac96ea62094 100644 --- a/src/mame/layout/grchamp.lay +++ b/src/mame/layout/grchamp.lay @@ -74,7 +74,7 @@ license:CC0-1.0 - + @@ -82,23 +82,7 @@ license:CC0-1.0 - - - - - - - - - - - - - - - - - + diff --git a/src/mame/layout/lagunar.lay b/src/mame/layout/lagunar.lay index 7a2f082036019..311c78385a7df 100644 --- a/src/mame/layout/lagunar.lay +++ b/src/mame/layout/lagunar.lay @@ -74,7 +74,7 @@ license:CC0-1.0 - + @@ -82,23 +82,7 @@ license:CC0-1.0 - - - - - - - - - - - - - - - - - + diff --git a/src/mame/layout/overdriv.lay b/src/mame/layout/overdriv.lay index 6b86fa59434d3..5b8e9882a96c8 100644 --- a/src/mame/layout/overdriv.lay +++ b/src/mame/layout/overdriv.lay @@ -74,7 +74,7 @@ license:CC0-1.0 - + @@ -82,23 +82,7 @@ license:CC0-1.0 - - - - - - - - - - - - - - - - - + diff --git a/src/mame/layout/spyhunt.lay b/src/mame/layout/spyhunt.lay index c803ffebe2911..c87dadfb45437 100644 --- a/src/mame/layout/spyhunt.lay +++ b/src/mame/layout/spyhunt.lay @@ -1,6 +1,7 @@ @@ -171,7 +172,7 @@ license:CC0-1.0 - + @@ -189,7 +190,7 @@ license:CC0-1.0 - + @@ -219,7 +220,7 @@ license:CC0-1.0 - + @@ -249,36 +250,8 @@ license:CC0-1.0 - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mame/layout/spyhunttec.lay b/src/mame/layout/spyhunttec.lay index 2e71e273b1aa3..3309e8d1e2438 100644 --- a/src/mame/layout/spyhunttec.lay +++ b/src/mame/layout/spyhunttec.lay @@ -1,6 +1,7 @@ @@ -171,7 +172,7 @@ license:CC0-1.0 - + @@ -189,7 +190,7 @@ license:CC0-1.0 - + @@ -219,7 +220,7 @@ license:CC0-1.0 - + @@ -249,36 +250,8 @@ license:CC0-1.0 - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mame/layout/turbo.lay b/src/mame/layout/turbo.lay index 1fd9e0ed3b99a..601084c6a56f2 100644 --- a/src/mame/layout/turbo.lay +++ b/src/mame/layout/turbo.lay @@ -404,7 +404,7 @@ authors:hap - + @@ -417,33 +417,7 @@ authors:hap - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/mame/layout/turbotag.lay b/src/mame/layout/turbotag.lay index 8cd2dd7332d2a..6dadf2f64ccc0 100644 --- a/src/mame/layout/turbotag.lay +++ b/src/mame/layout/turbotag.lay @@ -85,20 +85,4 @@ license:CC0-1.0 - - - - - - - - - - - - - - - - diff --git a/src/mame/layout/vclock3.lay b/src/mame/layout/vclock3.lay index cc02e133a327c..f9c3bdba1c6d4 100644 --- a/src/mame/layout/vclock3.lay +++ b/src/mame/layout/vclock3.lay @@ -27,7 +27,7 @@ authors:hap - + From 6b57a2fe2c8d34d2f529781e638ad9a3934c5733 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 14 Apr 2024 15:54:54 +0200 Subject: [PATCH 095/109] shifter overlay: remove orange mouse pointer / block clickable input --- src/mame/layout/280zzzap.lay | 39 +++-- src/mame/layout/buggybjr.lay | 38 +++-- src/mame/layout/buggyboy.lay | 25 ++- src/mame/layout/buggychl.lay | 31 +++- src/mame/layout/cbombers.lay | 31 +++- src/mame/layout/changela.lay | 31 +++- src/mame/layout/chasehq.lay | 31 +++- src/mame/layout/chqflag.lay | 31 +++- src/mame/layout/cischeat.lay | 31 +++- src/mame/layout/contcirc.lay | 30 +++- src/mame/layout/dblaxle.lay | 31 +++- src/mame/layout/destroyr.lay | 31 +++- src/mame/layout/enforceja.lay | 30 +++- src/mame/layout/f1gpstar.lay | 31 +++- src/mame/layout/f1superb.lay | 31 +++- src/mame/layout/finalapr.lay | 31 +++- src/mame/layout/finallap.lay | 31 +++- src/mame/layout/grchamp.lay | 31 +++- src/mame/layout/konamigt.lay | 31 +++- src/mame/layout/lagunar.lay | 31 +++- src/mame/layout/outrun.lay | 31 +++- src/mame/layout/overdriv.lay | 31 +++- src/mame/layout/pdrift.lay | 31 +++- src/mame/layout/polepos.lay | 31 +++- src/mame/layout/radr.lay | 31 +++- src/mame/layout/roundup5.lay | 33 +++- src/mame/layout/spdheat.lay | 69 +++++++- src/mame/layout/speedfrk.lay | 33 +++- src/mame/layout/speedrs.lay | 35 +++- src/mame/layout/speedup.lay | 31 +++- src/mame/layout/spyhunt.lay | 220 +++++++++++++++++++------ src/mame/layout/spyhunttec.lay | 220 +++++++++++++++++++------ src/mame/layout/sspeedr.lay | 289 ++++++++++++++++++++++----------- src/mame/layout/stocker.lay | 31 +++- src/mame/layout/superchs.lay | 129 ++++++++++++--- src/mame/layout/topracer.lay | 35 +++- src/mame/layout/topspeed.lay | 31 +++- src/mame/layout/turbo.lay | 62 ++++--- src/mame/layout/turbotag.lay | 31 +++- src/mame/layout/tx1.lay | 25 ++- src/mame/layout/wecleman.lay | 31 +++- 41 files changed, 1622 insertions(+), 465 deletions(-) diff --git a/src/mame/layout/280zzzap.lay b/src/mame/layout/280zzzap.lay index c0bb6513a6058..9694ec132601a 100644 --- a/src/mame/layout/280zzzap.lay +++ b/src/mame/layout/280zzzap.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -63,7 +68,7 @@ license:CC0-1.0 - + @@ -73,6 +78,9 @@ license:CC0-1.0 + + + @@ -80,7 +88,7 @@ license:CC0-1.0 - + @@ -90,14 +98,17 @@ license:CC0-1.0 + + + - + - + @@ -107,13 +118,17 @@ license:CC0-1.0 + + + - + + - + @@ -123,18 +138,14 @@ license:CC0-1.0 + + + + - - - - - - - - diff --git a/src/mame/layout/buggybjr.lay b/src/mame/layout/buggybjr.lay index 92af7a59dc807..c4828e032d868 100644 --- a/src/mame/layout/buggybjr.lay +++ b/src/mame/layout/buggybjr.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,45 +56,52 @@ license:CC0-1.0 - + + + + - - - + + + + - - + - - + + + + - - + + - - + + + + - + diff --git a/src/mame/layout/buggyboy.lay b/src/mame/layout/buggyboy.lay index 9b58dfffa45a1..3f2362d73e28f 100644 --- a/src/mame/layout/buggyboy.lay +++ b/src/mame/layout/buggyboy.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,7 +56,7 @@ license:CC0-1.0 - + @@ -62,12 +67,15 @@ license:CC0-1.0 + + + - + @@ -78,26 +86,35 @@ license:CC0-1.0 + + + - + + + + - + + + + diff --git a/src/mame/layout/buggychl.lay b/src/mame/layout/buggychl.lay index f530664aaabfc..52bee73a891a7 100644 --- a/src/mame/layout/buggychl.lay +++ b/src/mame/layout/buggychl.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/cbombers.lay b/src/mame/layout/cbombers.lay index bda5739b1f659..d0ad661da4522 100644 --- a/src/mame/layout/cbombers.lay +++ b/src/mame/layout/cbombers.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/changela.lay b/src/mame/layout/changela.lay index 3895ced99927a..7eb7edd818339 100644 --- a/src/mame/layout/changela.lay +++ b/src/mame/layout/changela.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/chasehq.lay b/src/mame/layout/chasehq.lay index d2444690812ce..c8c167da6069f 100644 --- a/src/mame/layout/chasehq.lay +++ b/src/mame/layout/chasehq.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/chqflag.lay b/src/mame/layout/chqflag.lay index 1f01833254222..8c0f80e5b6d23 100644 --- a/src/mame/layout/chqflag.lay +++ b/src/mame/layout/chqflag.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/cischeat.lay b/src/mame/layout/cischeat.lay index 144f48bcecf40..73f2d73d9701e 100644 --- a/src/mame/layout/cischeat.lay +++ b/src/mame/layout/cischeat.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/contcirc.lay b/src/mame/layout/contcirc.lay index 9d69985858891..c2183a09d7b33 100644 --- a/src/mame/layout/contcirc.lay +++ b/src/mame/layout/contcirc.lay @@ -7,6 +7,10 @@ authors:hap + + + + @@ -62,38 +66,52 @@ authors:hap - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/dblaxle.lay b/src/mame/layout/dblaxle.lay index 3c085be14c23c..641eb384b5e52 100644 --- a/src/mame/layout/dblaxle.lay +++ b/src/mame/layout/dblaxle.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/destroyr.lay b/src/mame/layout/destroyr.lay index 2ded2c5f6cd85..2188488bc57f4 100644 --- a/src/mame/layout/destroyr.lay +++ b/src/mame/layout/destroyr.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/enforceja.lay b/src/mame/layout/enforceja.lay index 411dadd5143ea..eb7acca13679c 100644 --- a/src/mame/layout/enforceja.lay +++ b/src/mame/layout/enforceja.lay @@ -7,6 +7,10 @@ authors:hap + + + + @@ -62,38 +66,52 @@ authors:hap - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/f1gpstar.lay b/src/mame/layout/f1gpstar.lay index d8fd9082d5c49..1de3aa657315f 100644 --- a/src/mame/layout/f1gpstar.lay +++ b/src/mame/layout/f1gpstar.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/f1superb.lay b/src/mame/layout/f1superb.lay index 39336095d38a7..5140dc189791c 100644 --- a/src/mame/layout/f1superb.lay +++ b/src/mame/layout/f1superb.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/finalapr.lay b/src/mame/layout/finalapr.lay index d2444690812ce..c8c167da6069f 100644 --- a/src/mame/layout/finalapr.lay +++ b/src/mame/layout/finalapr.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/finallap.lay b/src/mame/layout/finallap.lay index b5e68a10b6f22..887538820acc2 100644 --- a/src/mame/layout/finallap.lay +++ b/src/mame/layout/finallap.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/grchamp.lay b/src/mame/layout/grchamp.lay index 2bac96ea62094..990517ff09712 100644 --- a/src/mame/layout/grchamp.lay +++ b/src/mame/layout/grchamp.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/konamigt.lay b/src/mame/layout/konamigt.lay index d2444690812ce..c8c167da6069f 100644 --- a/src/mame/layout/konamigt.lay +++ b/src/mame/layout/konamigt.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/lagunar.lay b/src/mame/layout/lagunar.lay index 311c78385a7df..a318fd5230c8f 100644 --- a/src/mame/layout/lagunar.lay +++ b/src/mame/layout/lagunar.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/outrun.lay b/src/mame/layout/outrun.lay index f535ab50a9742..812224f2f3953 100644 --- a/src/mame/layout/outrun.lay +++ b/src/mame/layout/outrun.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/overdriv.lay b/src/mame/layout/overdriv.lay index 5b8e9882a96c8..3ebc6b600af35 100644 --- a/src/mame/layout/overdriv.lay +++ b/src/mame/layout/overdriv.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/pdrift.lay b/src/mame/layout/pdrift.lay index 942dde03ab34e..60f6e00169300 100644 --- a/src/mame/layout/pdrift.lay +++ b/src/mame/layout/pdrift.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/polepos.lay b/src/mame/layout/polepos.lay index c1b3f20b50c40..673ce8b1ee65e 100644 --- a/src/mame/layout/polepos.lay +++ b/src/mame/layout/polepos.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/radr.lay b/src/mame/layout/radr.lay index 9f8740c2ff59e..ad4626e7cc816 100644 --- a/src/mame/layout/radr.lay +++ b/src/mame/layout/radr.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/roundup5.lay b/src/mame/layout/roundup5.lay index ff4983e015f94..87ce7c1869f96 100644 --- a/src/mame/layout/roundup5.lay +++ b/src/mame/layout/roundup5.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + - + + diff --git a/src/mame/layout/spdheat.lay b/src/mame/layout/spdheat.lay index 290d941c04150..75b086c4c21a4 100644 --- a/src/mame/layout/spdheat.lay +++ b/src/mame/layout/spdheat.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,7 +56,7 @@ license:CC0-1.0 - + @@ -66,18 +71,27 @@ license:CC0-1.0 + + + + + + + + + @@ -85,6 +99,9 @@ license:CC0-1.0 + + + @@ -94,7 +111,7 @@ license:CC0-1.0 - + @@ -113,6 +130,9 @@ license:CC0-1.0 + + + @@ -120,6 +140,9 @@ license:CC0-1.0 + + + @@ -127,12 +150,18 @@ license:CC0-1.0 + + + + + + @@ -141,7 +170,7 @@ license:CC0-1.0 - + @@ -156,31 +185,47 @@ license:CC0-1.0 + + + + + + + + + + + + + + + + - + @@ -199,25 +244,41 @@ license:CC0-1.0 + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/speedfrk.lay b/src/mame/layout/speedfrk.lay index 44da9c6b51008..25df04a71237b 100644 --- a/src/mame/layout/speedfrk.lay +++ b/src/mame/layout/speedfrk.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -90,40 +95,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - - + + - + + + + - + diff --git a/src/mame/layout/speedrs.lay b/src/mame/layout/speedrs.lay index 466e5ff617274..cc686b0d1f6d3 100644 --- a/src/mame/layout/speedrs.lay +++ b/src/mame/layout/speedrs.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -53,7 +58,7 @@ license:CC0-1.0 - + @@ -61,37 +66,47 @@ license:CC0-1.0 + + + - - + + + + + - + - - + + + + + - + + - + @@ -99,8 +114,12 @@ license:CC0-1.0 + + + + diff --git a/src/mame/layout/speedup.lay b/src/mame/layout/speedup.lay index 016b08dfe0901..378e893b11308 100644 --- a/src/mame/layout/speedup.lay +++ b/src/mame/layout/speedup.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/spyhunt.lay b/src/mame/layout/spyhunt.lay index c87dadfb45437..9db7adc068c30 100644 --- a/src/mame/layout/spyhunt.lay +++ b/src/mame/layout/spyhunt.lay @@ -5,6 +5,12 @@ authors:hap --> + + + + + + @@ -13,7 +19,6 @@ authors:hap - @@ -22,7 +27,6 @@ authors:hap - @@ -31,7 +35,6 @@ authors:hap - @@ -40,7 +43,6 @@ authors:hap - @@ -50,6 +52,87 @@ authors:hap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -100,7 +183,9 @@ authors:hap - + + + @@ -120,19 +205,64 @@ authors:hap + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + - + + + + @@ -140,118 +270,114 @@ authors:hap - + - + + + + - + - + - + + + + - + + - + - + + + + + - + - - - - - - - - - - - - - - - + + + + + + + - + - - - - - - - - - - - - - - - + + + + + + + + diff --git a/src/mame/layout/spyhunttec.lay b/src/mame/layout/spyhunttec.lay index 3309e8d1e2438..9a127cdf42ddc 100644 --- a/src/mame/layout/spyhunttec.lay +++ b/src/mame/layout/spyhunttec.lay @@ -5,6 +5,12 @@ authors:hap --> + + + + + + @@ -13,7 +19,6 @@ authors:hap - @@ -22,7 +27,6 @@ authors:hap - @@ -31,7 +35,6 @@ authors:hap - @@ -40,7 +43,6 @@ authors:hap - @@ -50,6 +52,87 @@ authors:hap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -100,7 +183,9 @@ authors:hap - + + + @@ -120,19 +205,64 @@ authors:hap + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + - + + + + @@ -140,118 +270,114 @@ authors:hap - + - + + + + - + - + - + + + + - + + - + - + + + + + - + - - - - - - - - - - - - - - - + + + + + + + - + - - - - - - - - - - - - - - - + + + + + + + + diff --git a/src/mame/layout/sspeedr.lay b/src/mame/layout/sspeedr.lay index 40b91a340df01..0317cc7284f34 100644 --- a/src/mame/layout/sspeedr.lay +++ b/src/mame/layout/sspeedr.lay @@ -3,9 +3,67 @@ license:CC0-1.0 --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -16,31 +74,38 @@ license:CC0-1.0 - + + - + + - + + - + + - + + - + + - + + @@ -70,128 +135,158 @@ license:CC0-1.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + - + + - - + - + - - - + + + + + + - - + + + - - - - + + + + + - - - + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + - - + - - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/stocker.lay b/src/mame/layout/stocker.lay index 754a266092e8f..6768c744c6ebc 100644 --- a/src/mame/layout/stocker.lay +++ b/src/mame/layout/stocker.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/superchs.lay b/src/mame/layout/superchs.lay index 3e4f8629accef..3ab1d0d1407bc 100644 --- a/src/mame/layout/superchs.lay +++ b/src/mame/layout/superchs.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,44 +56,122 @@ license:CC0-1.0 - + + + + + + + + + + + + + + + + - - - - + + + + + + + + + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - + + + + + + + + + - + - + - - - - + + + + + + + + + diff --git a/src/mame/layout/topracer.lay b/src/mame/layout/topracer.lay index df62d84d5a512..02c4a6e6f84e5 100644 --- a/src/mame/layout/topracer.lay +++ b/src/mame/layout/topracer.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + - + + + + - + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/topspeed.lay b/src/mame/layout/topspeed.lay index d2444690812ce..c8c167da6069f 100644 --- a/src/mame/layout/topspeed.lay +++ b/src/mame/layout/topspeed.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/turbo.lay b/src/mame/layout/turbo.lay index 601084c6a56f2..4fa7e21a13388 100644 --- a/src/mame/layout/turbo.lay +++ b/src/mame/layout/turbo.lay @@ -30,7 +30,9 @@ authors:hap - + + + @@ -367,7 +369,7 @@ authors:hap - + @@ -375,13 +377,18 @@ authors:hap - - - - + + + + + + + + + - + @@ -389,13 +396,18 @@ authors:hap - - - - + + + + + + + + + - + @@ -403,12 +415,18 @@ authors:hap - - - + + + + + + + + + - + @@ -416,9 +434,15 @@ authors:hap - - - + + + + + + + + + diff --git a/src/mame/layout/turbotag.lay b/src/mame/layout/turbotag.lay index 6dadf2f64ccc0..41e66a9650ef0 100644 --- a/src/mame/layout/turbotag.lay +++ b/src/mame/layout/turbotag.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + diff --git a/src/mame/layout/tx1.lay b/src/mame/layout/tx1.lay index 0005839c53a98..6ed46cf5c2600 100644 --- a/src/mame/layout/tx1.lay +++ b/src/mame/layout/tx1.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,7 +56,7 @@ license:CC0-1.0 - + @@ -62,12 +67,15 @@ license:CC0-1.0 + + + - + @@ -78,26 +86,35 @@ license:CC0-1.0 + + + - + + + + - + + + + diff --git a/src/mame/layout/wecleman.lay b/src/mame/layout/wecleman.lay index c5561509cf858..61f841a68885f 100644 --- a/src/mame/layout/wecleman.lay +++ b/src/mame/layout/wecleman.lay @@ -3,6 +3,11 @@ license:CC0-1.0 --> + + + + + @@ -51,38 +56,52 @@ license:CC0-1.0 - + + + + - + + + + - + - + + + + - + + - + + + + + From 6bcb9f52b1577b80280f343ef6f532c1967079ce Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 14 Apr 2024 17:33:24 +0200 Subject: [PATCH 096/109] shifter overlay: add opaque shifter option --- src/mame/layout/280zzzap.lay | 24 ++++++- src/mame/layout/buckrog.lay | 9 ++- src/mame/layout/buggybjr.lay | 24 ++++++- src/mame/layout/buggyboy.lay | 124 +++++++++++++++++++++++++++++++-- src/mame/layout/buggychl.lay | 24 ++++++- src/mame/layout/cbombers.lay | 24 ++++++- src/mame/layout/changela.lay | 24 ++++++- src/mame/layout/chasehq.lay | 24 ++++++- src/mame/layout/chqflag.lay | 24 ++++++- src/mame/layout/cischeat.lay | 24 ++++++- src/mame/layout/contcirc.lay | 24 ++++++- src/mame/layout/dblaxle.lay | 24 ++++++- src/mame/layout/destroyr.lay | 24 ++++++- src/mame/layout/enforceja.lay | 24 ++++++- src/mame/layout/f1gpstar.lay | 24 ++++++- src/mame/layout/f1superb.lay | 24 ++++++- src/mame/layout/finalapr.lay | 24 ++++++- src/mame/layout/finallap.lay | 24 ++++++- src/mame/layout/gorf.lay | 7 +- src/mame/layout/grchamp.lay | 24 ++++++- src/mame/layout/konamigt.lay | 24 ++++++- src/mame/layout/lagunar.lay | 24 ++++++- src/mame/layout/outrun.lay | 24 ++++++- src/mame/layout/overdriv.lay | 24 ++++++- src/mame/layout/pdrift.lay | 24 ++++++- src/mame/layout/polepos.lay | 24 ++++++- src/mame/layout/radr.lay | 24 ++++++- src/mame/layout/roundup5.lay | 24 ++++++- src/mame/layout/spdheat.lay | 92 +++++++++++++++++++++++- src/mame/layout/speedfrk.lay | 24 ++++++- src/mame/layout/speedrs.lay | 24 ++++++- src/mame/layout/speedup.lay | 24 ++++++- src/mame/layout/spyhunt.lay | 34 ++++++++- src/mame/layout/spyhunttec.lay | 34 ++++++++- src/mame/layout/sspeedr.lay | 24 ++++++- src/mame/layout/stocker.lay | 24 ++++++- src/mame/layout/superchs.lay | 44 +++++++++++- src/mame/layout/topracer.lay | 24 ++++++- src/mame/layout/topspeed.lay | 24 ++++++- src/mame/layout/turbo.lay | 36 +++++++++- src/mame/layout/turbotag.lay | 24 ++++++- src/mame/layout/tx1.lay | 124 +++++++++++++++++++++++++++++++-- src/mame/layout/wecleman.lay | 24 ++++++- 43 files changed, 1185 insertions(+), 135 deletions(-) diff --git a/src/mame/layout/280zzzap.lay b/src/mame/layout/280zzzap.lay index 9694ec132601a..364ff89c09cab 100644 --- a/src/mame/layout/280zzzap.lay +++ b/src/mame/layout/280zzzap.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -85,6 +83,11 @@ license:CC0-1.0 + + + + + @@ -105,6 +108,11 @@ license:CC0-1.0 + + + + + @@ -125,6 +133,11 @@ license:CC0-1.0 + + + + + @@ -145,6 +158,11 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/buckrog.lay b/src/mame/layout/buckrog.lay index bbbd5aefb2def..7cb1c844167d1 100644 --- a/src/mame/layout/buckrog.lay +++ b/src/mame/layout/buckrog.lay @@ -27,6 +27,8 @@ authors:hap + + @@ -117,11 +119,14 @@ authors:hap - - + + + + + diff --git a/src/mame/layout/buggybjr.lay b/src/mame/layout/buggybjr.lay index c4828e032d868..c775ca75bb867 100644 --- a/src/mame/layout/buggybjr.lay +++ b/src/mame/layout/buggybjr.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/buggyboy.lay b/src/mame/layout/buggyboy.lay index 3f2362d73e28f..4004f737e563f 100644 --- a/src/mame/layout/buggyboy.lay +++ b/src/mame/layout/buggyboy.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -56,7 +54,7 @@ license:CC0-1.0 - + @@ -74,8 +72,39 @@ license:CC0-1.0 + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -93,8 +122,39 @@ license:CC0-1.0 + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -106,8 +166,33 @@ license:CC0-1.0 + + + + + + + + + + + + + + + + + + + + + + + + - + + @@ -119,5 +204,30 @@ license:CC0-1.0 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/buggychl.lay b/src/mame/layout/buggychl.lay index 52bee73a891a7..cc8caad691a17 100644 --- a/src/mame/layout/buggychl.lay +++ b/src/mame/layout/buggychl.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/cbombers.lay b/src/mame/layout/cbombers.lay index d0ad661da4522..efa534d99abc2 100644 --- a/src/mame/layout/cbombers.lay +++ b/src/mame/layout/cbombers.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/changela.lay b/src/mame/layout/changela.lay index 7eb7edd818339..a7deb2797cda0 100644 --- a/src/mame/layout/changela.lay +++ b/src/mame/layout/changela.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/chasehq.lay b/src/mame/layout/chasehq.lay index c8c167da6069f..a89ca1de3e048 100644 --- a/src/mame/layout/chasehq.lay +++ b/src/mame/layout/chasehq.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/chqflag.lay b/src/mame/layout/chqflag.lay index 8c0f80e5b6d23..f4f7fbad0ae4e 100644 --- a/src/mame/layout/chqflag.lay +++ b/src/mame/layout/chqflag.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/cischeat.lay b/src/mame/layout/cischeat.lay index 73f2d73d9701e..887581e9dee1c 100644 --- a/src/mame/layout/cischeat.lay +++ b/src/mame/layout/cischeat.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/contcirc.lay b/src/mame/layout/contcirc.lay index c2183a09d7b33..52e4399faedc5 100644 --- a/src/mame/layout/contcirc.lay +++ b/src/mame/layout/contcirc.lay @@ -7,9 +7,7 @@ authors:hap - - - + @@ -77,6 +75,11 @@ authors:hap + + + + + @@ -89,6 +92,11 @@ authors:hap + + + + + @@ -101,6 +109,11 @@ authors:hap + + + + + @@ -113,6 +126,11 @@ authors:hap + + + + + diff --git a/src/mame/layout/dblaxle.lay b/src/mame/layout/dblaxle.lay index 641eb384b5e52..4fe64fbb605bc 100644 --- a/src/mame/layout/dblaxle.lay +++ b/src/mame/layout/dblaxle.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/destroyr.lay b/src/mame/layout/destroyr.lay index 2188488bc57f4..42e6777f60c1c 100644 --- a/src/mame/layout/destroyr.lay +++ b/src/mame/layout/destroyr.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/enforceja.lay b/src/mame/layout/enforceja.lay index eb7acca13679c..204419875be47 100644 --- a/src/mame/layout/enforceja.lay +++ b/src/mame/layout/enforceja.lay @@ -7,9 +7,7 @@ authors:hap - - - + @@ -77,6 +75,11 @@ authors:hap + + + + + @@ -89,6 +92,11 @@ authors:hap + + + + + @@ -101,6 +109,11 @@ authors:hap + + + + + @@ -113,6 +126,11 @@ authors:hap + + + + + diff --git a/src/mame/layout/f1gpstar.lay b/src/mame/layout/f1gpstar.lay index 1de3aa657315f..d10b41bd42e53 100644 --- a/src/mame/layout/f1gpstar.lay +++ b/src/mame/layout/f1gpstar.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/f1superb.lay b/src/mame/layout/f1superb.lay index 5140dc189791c..6cc0a20935698 100644 --- a/src/mame/layout/f1superb.lay +++ b/src/mame/layout/f1superb.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/finalapr.lay b/src/mame/layout/finalapr.lay index c8c167da6069f..a89ca1de3e048 100644 --- a/src/mame/layout/finalapr.lay +++ b/src/mame/layout/finalapr.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/finallap.lay b/src/mame/layout/finallap.lay index 887538820acc2..9bf8e7dec8def 100644 --- a/src/mame/layout/finallap.lay +++ b/src/mame/layout/finallap.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/gorf.lay b/src/mame/layout/gorf.lay index 0dec22b9c5507..890dc48ae1e74 100644 --- a/src/mame/layout/gorf.lay +++ b/src/mame/layout/gorf.lay @@ -57,7 +57,7 @@ authors:hap - + @@ -123,8 +123,11 @@ authors:hap + + + - + diff --git a/src/mame/layout/grchamp.lay b/src/mame/layout/grchamp.lay index 990517ff09712..d6a529afd8a96 100644 --- a/src/mame/layout/grchamp.lay +++ b/src/mame/layout/grchamp.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/konamigt.lay b/src/mame/layout/konamigt.lay index c8c167da6069f..a89ca1de3e048 100644 --- a/src/mame/layout/konamigt.lay +++ b/src/mame/layout/konamigt.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/lagunar.lay b/src/mame/layout/lagunar.lay index a318fd5230c8f..4a66c8de70c33 100644 --- a/src/mame/layout/lagunar.lay +++ b/src/mame/layout/lagunar.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/outrun.lay b/src/mame/layout/outrun.lay index 812224f2f3953..bbc2fea8d34da 100644 --- a/src/mame/layout/outrun.lay +++ b/src/mame/layout/outrun.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/overdriv.lay b/src/mame/layout/overdriv.lay index 3ebc6b600af35..3abb9e83fac74 100644 --- a/src/mame/layout/overdriv.lay +++ b/src/mame/layout/overdriv.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/pdrift.lay b/src/mame/layout/pdrift.lay index 60f6e00169300..e1f9e2c1c303c 100644 --- a/src/mame/layout/pdrift.lay +++ b/src/mame/layout/pdrift.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/polepos.lay b/src/mame/layout/polepos.lay index 673ce8b1ee65e..7b218add67821 100644 --- a/src/mame/layout/polepos.lay +++ b/src/mame/layout/polepos.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/radr.lay b/src/mame/layout/radr.lay index ad4626e7cc816..7ca606f8c138d 100644 --- a/src/mame/layout/radr.lay +++ b/src/mame/layout/radr.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/roundup5.lay b/src/mame/layout/roundup5.lay index 87ce7c1869f96..2a90f1e66071b 100644 --- a/src/mame/layout/roundup5.lay +++ b/src/mame/layout/roundup5.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/spdheat.lay b/src/mame/layout/spdheat.lay index 75b086c4c21a4..b64dd15f36d6a 100644 --- a/src/mame/layout/spdheat.lay +++ b/src/mame/layout/spdheat.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -78,6 +76,11 @@ license:CC0-1.0 + + + + + @@ -87,6 +90,11 @@ license:CC0-1.0 + + + + + @@ -97,6 +105,12 @@ license:CC0-1.0 + + + + + + @@ -107,6 +121,12 @@ license:CC0-1.0 + + + + + + @@ -138,6 +158,12 @@ license:CC0-1.0 + + + + + + @@ -148,6 +174,12 @@ license:CC0-1.0 + + + + + + @@ -157,6 +189,11 @@ license:CC0-1.0 + + + + + @@ -166,6 +203,11 @@ license:CC0-1.0 + + + + + @@ -192,6 +234,11 @@ license:CC0-1.0 + + + + + @@ -201,6 +248,11 @@ license:CC0-1.0 + + + + + @@ -211,6 +263,12 @@ license:CC0-1.0 + + + + + + @@ -221,6 +279,12 @@ license:CC0-1.0 + + + + + + @@ -252,6 +316,12 @@ license:CC0-1.0 + + + + + + @@ -262,6 +332,12 @@ license:CC0-1.0 + + + + + + @@ -271,6 +347,11 @@ license:CC0-1.0 + + + + + @@ -280,6 +361,11 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/speedfrk.lay b/src/mame/layout/speedfrk.lay index 25df04a71237b..a1792051c8653 100644 --- a/src/mame/layout/speedfrk.lay +++ b/src/mame/layout/speedfrk.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -106,6 +104,11 @@ license:CC0-1.0 + + + + + @@ -118,6 +121,11 @@ license:CC0-1.0 + + + + + @@ -130,6 +138,11 @@ license:CC0-1.0 + + + + + @@ -142,5 +155,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/speedrs.lay b/src/mame/layout/speedrs.lay index cc686b0d1f6d3..3eff7db5cb5e6 100644 --- a/src/mame/layout/speedrs.lay +++ b/src/mame/layout/speedrs.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -73,6 +71,11 @@ license:CC0-1.0 + + + + + @@ -89,6 +92,11 @@ license:CC0-1.0 + + + + + @@ -105,6 +113,11 @@ license:CC0-1.0 + + + + + @@ -121,5 +134,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/speedup.lay b/src/mame/layout/speedup.lay index 378e893b11308..7c93db59b86d3 100644 --- a/src/mame/layout/speedup.lay +++ b/src/mame/layout/speedup.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/spyhunt.lay b/src/mame/layout/spyhunt.lay index 9db7adc068c30..79950231498c5 100644 --- a/src/mame/layout/spyhunt.lay +++ b/src/mame/layout/spyhunt.lay @@ -7,9 +7,7 @@ authors:hap - - - + @@ -267,6 +265,11 @@ authors:hap + + + + + @@ -289,6 +292,11 @@ authors:hap + + + + + @@ -311,6 +319,11 @@ authors:hap + + + + + @@ -333,6 +346,11 @@ authors:hap + + + + + @@ -355,6 +373,11 @@ authors:hap + + + + + @@ -377,6 +400,11 @@ authors:hap + + + + + diff --git a/src/mame/layout/spyhunttec.lay b/src/mame/layout/spyhunttec.lay index 9a127cdf42ddc..d66488047fbe3 100644 --- a/src/mame/layout/spyhunttec.lay +++ b/src/mame/layout/spyhunttec.lay @@ -7,9 +7,7 @@ authors:hap - - - + @@ -267,6 +265,11 @@ authors:hap + + + + + @@ -289,6 +292,11 @@ authors:hap + + + + + @@ -311,6 +319,11 @@ authors:hap + + + + + @@ -333,6 +346,11 @@ authors:hap + + + + + @@ -355,6 +373,11 @@ authors:hap + + + + + @@ -377,6 +400,11 @@ authors:hap + + + + + diff --git a/src/mame/layout/sspeedr.lay b/src/mame/layout/sspeedr.lay index 0317cc7284f34..03e2ba0a26858 100644 --- a/src/mame/layout/sspeedr.lay +++ b/src/mame/layout/sspeedr.lay @@ -6,9 +6,7 @@ license:CC0-1.0 - - - + @@ -202,6 +200,11 @@ license:CC0-1.0 + + + + + @@ -230,6 +233,11 @@ license:CC0-1.0 + + + + + @@ -258,6 +266,11 @@ license:CC0-1.0 + + + + + @@ -286,6 +299,11 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/stocker.lay b/src/mame/layout/stocker.lay index 6768c744c6ebc..7197a49ca42a0 100644 --- a/src/mame/layout/stocker.lay +++ b/src/mame/layout/stocker.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/superchs.lay b/src/mame/layout/superchs.lay index 3ab1d0d1407bc..8351f20da6d56 100644 --- a/src/mame/layout/superchs.lay +++ b/src/mame/layout/superchs.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -69,6 +67,11 @@ license:CC0-1.0 + + + + + @@ -83,6 +86,11 @@ license:CC0-1.0 + + + + + @@ -97,6 +105,11 @@ license:CC0-1.0 + + + + + @@ -111,6 +124,11 @@ license:CC0-1.0 + + + + + @@ -129,6 +147,11 @@ license:CC0-1.0 + + + + + @@ -143,6 +166,11 @@ license:CC0-1.0 + + + + + @@ -157,6 +185,11 @@ license:CC0-1.0 + + + + + @@ -171,6 +204,11 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/topracer.lay b/src/mame/layout/topracer.lay index 02c4a6e6f84e5..2e31b1279b966 100644 --- a/src/mame/layout/topracer.lay +++ b/src/mame/layout/topracer.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/topspeed.lay b/src/mame/layout/topspeed.lay index c8c167da6069f..a89ca1de3e048 100644 --- a/src/mame/layout/topspeed.lay +++ b/src/mame/layout/topspeed.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/turbo.lay b/src/mame/layout/turbo.lay index 4fa7e21a13388..e411b703ee527 100644 --- a/src/mame/layout/turbo.lay +++ b/src/mame/layout/turbo.lay @@ -30,9 +30,7 @@ authors:hap - - - + @@ -372,6 +370,9 @@ authors:hap + + + @@ -385,12 +386,20 @@ authors:hap + + + + + + + + @@ -404,12 +413,20 @@ authors:hap + + + + + + + + @@ -423,12 +440,20 @@ authors:hap + + + + + + + + @@ -442,6 +467,11 @@ authors:hap + + + + + diff --git a/src/mame/layout/turbotag.lay b/src/mame/layout/turbotag.lay index 41e66a9650ef0..25579554fc31d 100644 --- a/src/mame/layout/turbotag.lay +++ b/src/mame/layout/turbotag.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + diff --git a/src/mame/layout/tx1.lay b/src/mame/layout/tx1.lay index 6ed46cf5c2600..3f76015f06e9c 100644 --- a/src/mame/layout/tx1.lay +++ b/src/mame/layout/tx1.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -56,7 +54,7 @@ license:CC0-1.0 - + @@ -74,8 +72,39 @@ license:CC0-1.0 + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -93,8 +122,39 @@ license:CC0-1.0 + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -106,8 +166,33 @@ license:CC0-1.0 + + + + + + + + + + + + + + + + + + + + + + + + - + + @@ -119,5 +204,30 @@ license:CC0-1.0 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/wecleman.lay b/src/mame/layout/wecleman.lay index 61f841a68885f..2500c3bca7238 100644 --- a/src/mame/layout/wecleman.lay +++ b/src/mame/layout/wecleman.lay @@ -4,9 +4,7 @@ license:CC0-1.0 --> - - - + @@ -67,6 +65,11 @@ license:CC0-1.0 + + + + + @@ -79,6 +82,11 @@ license:CC0-1.0 + + + + + @@ -91,6 +99,11 @@ license:CC0-1.0 + + + + + @@ -103,5 +116,10 @@ license:CC0-1.0 + + + + + From 330964ea49f306085fc7ac0b102db25dfe39894b Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 15 Apr 2024 01:06:31 +0900 Subject: [PATCH 097/109] midway/williams.cpp, wmg.cpp: Various cleanups: (#12246) * Use memory views for ROM/palette overlays and simplified banking. * Suppress side effects for reads from the debugger. * Reduced tag lookups. * Improved ROM region naming. --- src/mame/midway/williams.cpp | 788 ++++++++++++++++----------------- src/mame/midway/williams.h | 54 ++- src/mame/midway/williams_m.cpp | 95 ++-- src/mame/midway/williams_v.cpp | 70 ++- src/mame/midway/wmg.cpp | 86 ++-- 5 files changed, 551 insertions(+), 542 deletions(-) diff --git a/src/mame/midway/williams.cpp b/src/mame/midway/williams.cpp index fa0f7ec8e6a35..a95cfb663d60c 100644 --- a/src/mame/midway/williams.cpp +++ b/src/mame/midway/williams.cpp @@ -500,9 +500,6 @@ Reference videos: https://www.youtube.com/watch?v=R5OeC6Wc_yI #include "speaker.h" -#define MASTER_CLOCK (XTAL(12'000'000)) -#define SOUND_CLOCK (XTAL(3'579'545)) - /************************************* @@ -513,7 +510,7 @@ Reference videos: https://www.youtube.com/watch?v=R5OeC6Wc_yI void defender_state::main_map(address_map &map) { - map(0x0000, 0xbfff).ram().share("videoram"); + map(0x0000, 0xbfff).ram().share(m_videoram); map(0xc000, 0xcfff).m(m_bankc000, FUNC(address_map_bank_device::amap8)); map(0xd000, 0xdfff).w(FUNC(defender_state::bank_select_w)); map(0xd000, 0xffff).rom(); @@ -521,7 +518,7 @@ void defender_state::main_map(address_map &map) void defender_state::bankc000_map(address_map &map) { - map(0x0000, 0x000f).mirror(0x03e0).writeonly().share("paletteram"); + map(0x0000, 0x000f).mirror(0x03e0).writeonly().share(m_paletteram); map(0x03ff, 0x03ff).w(FUNC(defender_state::watchdog_reset_w)); map(0x0010, 0x001f).mirror(0x03e0).w(FUNC(defender_state::video_control_w)); map(0x0400, 0x04ff).mirror(0x0300).ram().w(FUNC(defender_state::cmos_w)).share("nvram"); @@ -554,9 +551,10 @@ void mayday_state::main_map(address_map &map) void williams_state::main_map(address_map &map) { - map(0x0000, 0xbfff).ram().share("videoram"); - map(0x0000, 0x8fff).bankr("mainbank"); - map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share("paletteram"); + map(0x0000, 0xbfff).ram().share(m_videoram); + map(0x0000, 0x8fff).view(m_rom_view); + m_rom_view[0](0x0000, 0x8fff).rom().region("maincpu", 0x00000); + map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share(m_paletteram); map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0xc900, 0xc9ff).w(FUNC(williams_state::vram_select_w)); @@ -612,10 +610,11 @@ void spdball_state::main_map(address_map &map) void blaster_state::main_map(address_map &map) { - map(0x0000, 0xbfff).ram().share("videoram"); - map(0x0000, 0x3fff).bankr("mainbank"); - map(0x4000, 0x8fff).bankr("blaster_bankb"); - map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share("paletteram"); + map(0x0000, 0xbfff).ram().share(m_videoram); + map(0x0000, 0x8fff).view(m_rom_view); + m_rom_view[0](0x0000, 0x3fff).bankr(m_mainbank); + m_rom_view[0](0x4000, 0x8fff).rom().region("maincpu", 0x04000); + map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share(m_paletteram); map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0xc900, 0xc93f).w(FUNC(blaster_state::vram_select_w)); @@ -639,10 +638,12 @@ void blaster_state::main_map(address_map &map) void williams2_state::common_map(address_map &map) { - map(0x0000, 0xbfff).ram().share("videoram"); - map(0x0000, 0x7fff).bankr("mainbank"); - map(0x8000, 0x87ff).m(m_bank8000, FUNC(address_map_bank_device::amap8)); - map(0xc000, 0xc7ff).ram().w(FUNC(williams2_state::tileram_w)).share("williams2_tile"); + map(0x0000, 0xbfff).ram().share(m_videoram); + map(0x0000, 0x7fff).view(m_rom_view); + m_rom_view[0](0x0000, 0x7fff).bankr(m_mainbank); + map(0x8000, 0x87ff).view(m_palette_view); + m_palette_view[0](0x8000, 0x87ff).ram().w(FUNC(williams2_state::paletteram_w)).share(m_paletteram); + map(0xc000, 0xc7ff).ram().w(FUNC(williams2_state::tileram_w)).share(m_tileram); map(0xc800, 0xc87f).w(FUNC(williams2_state::bank_select_w)); map(0xc880, 0xc887).mirror(0x0078).w(FUNC(williams2_state::blitter_w)); map(0xc900, 0xc97f).w(FUNC(williams2_state::watchdog_reset_w)); @@ -659,12 +660,6 @@ void williams2_state::common_map(address_map &map) map(0xcc00, 0xcfff).ram().w(FUNC(williams2_state::cmos_w)).share("nvram"); } -void williams2_state::bank8000_map(address_map &map) -{ - map(0x0000, 0x07ff).bankrw("vram8000"); - map(0x0800, 0x0fff).ram().w(FUNC(williams2_state::paletteram_w)).share("paletteram"); -} - // mysticm and inferno: D000-DFFF is RAM void williams_d000_ram_state::d000_map(address_map &map) { @@ -1532,7 +1527,7 @@ static const gfx_layout williams2_layout = static GFXDECODE_START( gfx_williams2 ) - GFXDECODE_ENTRY( "gfx1", 0, williams2_layout, 0, 64 ) + GFXDECODE_ENTRY( "tiles", 0, williams2_layout, 0, 64 ) GFXDECODE_END @@ -1543,6 +1538,9 @@ GFXDECODE_END * *************************************/ +static constexpr XTAL MASTER_CLOCK = (XTAL(12'000'000)); +static constexpr XTAL SOUND_CLOCK = (XTAL(3'579'545)); + void williams_state::williams_base(machine_config &config) { // basic machine hardware @@ -1819,8 +1817,6 @@ void williams2_state::williams2_base(machine_config &config) M6808(config, m_soundcpu, MASTER_CLOCK/3); // yes, this is different from the older games m_soundcpu->set_addrmap(AS_PROGRAM, &williams2_state::sound_map); - ADDRESS_MAP_BANK(config, "bank8000").set_map(&williams2_state::bank8000_map).set_options(ENDIANNESS_BIG, 8, 12, 0x800); - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 5114 + battery // set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen @@ -2419,10 +2415,10 @@ It appears to use the sound ROM from Defender. */ ROM_START( conquest ) - ROM_REGION( 0x19000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "conquest_a.bin", 0x00000, 0x4000, CRC(a384f4a2) SHA1(819df35281216b8be2ba066602fc7d19a860e69e) ) ROM_LOAD( "conquest_b.bin", 0x0e000, 0x1000, CRC(9aab5516) SHA1(a71ce8f24fd7ffda8800d1af8c164085b0e2ec0a) ) ROM_RELOAD( 0x0f000, 0x1000 ) - ROM_LOAD( "conquest_a.bin", 0x10000, 0x4000, CRC(a384f4a2) SHA1(819df35281216b8be2ba066602fc7d19a860e69e) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_1.ic12", 0xf800, 0x0800, CRC(fefd5b48) SHA1(ceb0d18483f0691978c604db94417e6941ad7ff2) ) @@ -2499,19 +2495,19 @@ Wire W1 & W3 with Zero Ohm resistors for 2732 ROMs */ ROM_START( stargate ) // "B" ROMs labeled 3002-13 through 3002-24, identical data - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "stargate_rom_1-a_3002-1.e4", 0x00000, 0x1000, CRC(88824d18) SHA1(f003a5a9319c4eb8991fa2aae3f10c72d6b8e81a) ) + ROM_LOAD( "stargate_rom_2-a_3002-2.c4", 0x01000, 0x1000, CRC(afc614c5) SHA1(087c6da93318e8dc922d3d22e0a2af7b9759701c) ) + ROM_LOAD( "stargate_rom_3-a_3002-3.a4", 0x02000, 0x1000, CRC(15077a9d) SHA1(7badb4318b208f49d7fa65e915d0aa22a1e37915) ) + ROM_LOAD( "stargate_rom_4-a_3002-4.e5", 0x03000, 0x1000, CRC(a8b4bf0f) SHA1(6b4d47c2899fe9f14f9dab5928499f12078c437d) ) + ROM_LOAD( "stargate_rom_5-a_3002-5.c5", 0x04000, 0x1000, CRC(2d306074) SHA1(54f871983699113e31bb756d4ca885c26c2d66b4) ) + ROM_LOAD( "stargate_rom_6-a_3002-6.a5", 0x05000, 0x1000, CRC(53598dde) SHA1(54b02d944caf95283c9b6f0160e75ea8c4ccc97b) ) + ROM_LOAD( "stargate_rom_7-a_3002-7.e6", 0x06000, 0x1000, CRC(23606060) SHA1(a487ffcd4920d1056b87469735f7e1002f6a2e49) ) + ROM_LOAD( "stargate_rom_8-a_3002-8.c6", 0x07000, 0x1000, CRC(4ec490c7) SHA1(8726ebaf048db9608dfe365bf434ed5ca9452db7) ) + ROM_LOAD( "stargate_rom_9-a_3002-9.a6", 0x08000, 0x1000, CRC(88187b64) SHA1(efacc4a6d4b2af9a236c9d520de6d605c79cc5a8) ) ROM_LOAD( "stargate_rom_10-a_3002-10.a7", 0x0d000, 0x1000, CRC(60b07ff7) SHA1(ba833f48ddfc1bd04ddb41b1d1c840d66ee7da30) ) ROM_LOAD( "stargate_rom_11-a_3002-11.c7", 0x0e000, 0x1000, CRC(7d2c5daf) SHA1(6ca39f493eb8b370154ad46ef01976d352c929e1) ) ROM_LOAD( "stargate_rom_12-a_3002-12.e7", 0x0f000, 0x1000, CRC(a0396670) SHA1(c46872550e0ca031453c6513f8f0448ecc9b5572) ) - ROM_LOAD( "stargate_rom_1-a_3002-1.e4", 0x10000, 0x1000, CRC(88824d18) SHA1(f003a5a9319c4eb8991fa2aae3f10c72d6b8e81a) ) - ROM_LOAD( "stargate_rom_2-a_3002-2.c4", 0x11000, 0x1000, CRC(afc614c5) SHA1(087c6da93318e8dc922d3d22e0a2af7b9759701c) ) - ROM_LOAD( "stargate_rom_3-a_3002-3.a4", 0x12000, 0x1000, CRC(15077a9d) SHA1(7badb4318b208f49d7fa65e915d0aa22a1e37915) ) - ROM_LOAD( "stargate_rom_4-a_3002-4.e5", 0x13000, 0x1000, CRC(a8b4bf0f) SHA1(6b4d47c2899fe9f14f9dab5928499f12078c437d) ) - ROM_LOAD( "stargate_rom_5-a_3002-5.c5", 0x14000, 0x1000, CRC(2d306074) SHA1(54f871983699113e31bb756d4ca885c26c2d66b4) ) - ROM_LOAD( "stargate_rom_6-a_3002-6.a5", 0x15000, 0x1000, CRC(53598dde) SHA1(54b02d944caf95283c9b6f0160e75ea8c4ccc97b) ) - ROM_LOAD( "stargate_rom_7-a_3002-7.e6", 0x16000, 0x1000, CRC(23606060) SHA1(a487ffcd4920d1056b87469735f7e1002f6a2e49) ) - ROM_LOAD( "stargate_rom_8-a_3002-8.c6", 0x17000, 0x1000, CRC(4ec490c7) SHA1(8726ebaf048db9608dfe365bf434ed5ca9452db7) ) - ROM_LOAD( "stargate_rom_9-a_3002-9.a6", 0x18000, 0x1000, CRC(88187b64) SHA1(efacc4a6d4b2af9a236c9d520de6d605c79cc5a8) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_2_std_744.ic12", 0xf800, 0x0800, CRC(2fcf6c4d) SHA1(9c4334ac3ff15d94001b22fc367af40f9deb7d57) ) // P/N A-5342-09809 @@ -2628,19 +2624,19 @@ Wired W1 & W3 with Zero Ohm resistors for 2732 ROMs */ ROM_START( robotron ) // Solid Blue labels, "B" type ROMs labeled 3005-13 through 3005-24 - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2084_rom_1b_3005-13.e4", 0x00000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) // == 2084_rom_1b_3005-1.e4 + ROM_LOAD( "2084_rom_2b_3005-14.c4", 0x01000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) // == 2084_rom_2b_3005-2.c4 + ROM_LOAD( "2084_rom_3b_3005-15.a4", 0x02000, 0x1000, CRC(e99a82be) SHA1(06a8c8dd0b4726eb7f0bb0e89c8533931d75fc1c) ) + ROM_LOAD( "2084_rom_4b_3005-16.e5", 0x03000, 0x1000, CRC(afb1c561) SHA1(aaf89c19fd8f4e8750717169eb1af476aef38a5e) ) + ROM_LOAD( "2084_rom_5b_3005-17.c5", 0x04000, 0x1000, CRC(62691e77) SHA1(79b4680ce19bd28882ae823f0e7b293af17cbb91) ) + ROM_LOAD( "2084_rom_6b_3005-18.a5", 0x05000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) + ROM_LOAD( "2084_rom_7b_3005-19.e6", 0x06000, 0x1000, CRC(49ac400c) SHA1(06eae5138254723819a5e93cfd9e9f3285fcddf5) ) // == 2084_rom_7b_3005-7.e6 + ROM_LOAD( "2084_rom_8b_3005-20.c6", 0x07000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) // == 2084_rom_8b_3005-8.c6 + ROM_LOAD( "2084_rom_9b_3005-21.a6", 0x08000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) // == 2084_rom_9b_3005-9.a6 ROM_LOAD( "2084_rom_10b_3005-22.a7", 0x0d000, 0x1000, CRC(13797024) SHA1(d426a50e75dabe936de643c83a548da5e399331c) ) ROM_LOAD( "2084_rom_11b_3005-23.c7", 0x0e000, 0x1000, CRC(7e3c1b87) SHA1(f8c6cbe3688f256f41a121255fc08f575f6a4b4f) ) ROM_LOAD( "2084_rom_12b_3005-24.e7", 0x0f000, 0x1000, CRC(645d543e) SHA1(fad7cea868ebf17347c4bc5193d647bbd8f9517b) ) - ROM_LOAD( "2084_rom_1b_3005-13.e4", 0x10000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) // == 2084_rom_1b_3005-1.e4 - ROM_LOAD( "2084_rom_2b_3005-14.c4", 0x11000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) // == 2084_rom_2b_3005-2.c4 - ROM_LOAD( "2084_rom_3b_3005-15.a4", 0x12000, 0x1000, CRC(e99a82be) SHA1(06a8c8dd0b4726eb7f0bb0e89c8533931d75fc1c) ) - ROM_LOAD( "2084_rom_4b_3005-16.e5", 0x13000, 0x1000, CRC(afb1c561) SHA1(aaf89c19fd8f4e8750717169eb1af476aef38a5e) ) - ROM_LOAD( "2084_rom_5b_3005-17.c5", 0x14000, 0x1000, CRC(62691e77) SHA1(79b4680ce19bd28882ae823f0e7b293af17cbb91) ) - ROM_LOAD( "2084_rom_6b_3005-18.a5", 0x15000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) - ROM_LOAD( "2084_rom_7b_3005-19.e6", 0x16000, 0x1000, CRC(49ac400c) SHA1(06eae5138254723819a5e93cfd9e9f3285fcddf5) ) // == 2084_rom_7b_3005-7.e6 - ROM_LOAD( "2084_rom_8b_3005-20.c6", 0x17000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) // == 2084_rom_8b_3005-8.c6 - ROM_LOAD( "2084_rom_9b_3005-21.a6", 0x18000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) // == 2084_rom_9b_3005-9.a6 ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_3_std_767.ic12", 0xf000, 0x1000, CRC(c56c1d28) SHA1(15afefef11bfc3ab78f61ab046701db78d160ec3) ) // P/N A-5342-09910 @@ -2651,19 +2647,19 @@ ROM_START( robotron ) // Solid Blue labels, "B" type ROMs labeled 3005-13 throug ROM_END ROM_START( robotronyo ) // Yellow label / Red stripe & Black print or Yellow label / Red stripe & Green print "B" type ROMs numbered 3005-13 through 3005-24 - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2084_rom_1b_3005-1.e4", 0x00000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) + ROM_LOAD( "2084_rom_2b_3005-2.c4", 0x01000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) + ROM_LOAD( "2084_rom_3b_3005-3.a4", 0x02000, 0x1000, CRC(67a369bc) SHA1(5a912d485e686de5e3175d3fc0e5daad36f4b836) ) + ROM_LOAD( "2084_rom_4b_3005-4.e5", 0x03000, 0x1000, CRC(b0de677a) SHA1(02013e00513dd74e878a01791cbcca92712e2c80) ) + ROM_LOAD( "2084_rom_5b_3005-5.c5", 0x04000, 0x1000, CRC(24726007) SHA1(8b4ed881f64e3ce73ac1a9ae2c184721c1ab37cc) ) + ROM_LOAD( "2084_rom_6b_3005-6.a5", 0x05000, 0x1000, CRC(028181a6) SHA1(41c4d9ece2ae8a103b7151fc4ff576796303318d) ) + ROM_LOAD( "2084_rom_7b_3005-7.e6", 0x06000, 0x1000, CRC(4dfcceae) SHA1(46fe1b1162d6054eb502852d065fc2e8c694b09d) ) + ROM_LOAD( "2084_rom_8b_3005-8.c6", 0x07000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) + ROM_LOAD( "2084_rom_9b_3005-9.a6", 0x08000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) ROM_LOAD( "2084_rom_10b_3005-10.a7", 0x0d000, 0x1000, CRC(4a9d5f52) SHA1(d5ae801e60ed829e7ef5c54a18aefca54eae827f) ) // originally printed as "A" ROMs, the A is overwitten with "B" ROM_LOAD( "2084_rom_11b_3005-11.c7", 0x0e000, 0x1000, CRC(2afc5e7f) SHA1(f3405be9ad2287f3921e7dbd9c5313c91fa7f8d6) ) ROM_LOAD( "2084_rom_12b_3005-12.e7", 0x0f000, 0x1000, CRC(45da9202) SHA1(81b3b2a72a3c871e8d7b9348056622c90a20d876) ) - ROM_LOAD( "2084_rom_1b_3005-1.e4", 0x10000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) - ROM_LOAD( "2084_rom_2b_3005-2.c4", 0x11000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) - ROM_LOAD( "2084_rom_3b_3005-3.a4", 0x12000, 0x1000, CRC(67a369bc) SHA1(5a912d485e686de5e3175d3fc0e5daad36f4b836) ) - ROM_LOAD( "2084_rom_4b_3005-4.e5", 0x13000, 0x1000, CRC(b0de677a) SHA1(02013e00513dd74e878a01791cbcca92712e2c80) ) - ROM_LOAD( "2084_rom_5b_3005-5.c5", 0x14000, 0x1000, CRC(24726007) SHA1(8b4ed881f64e3ce73ac1a9ae2c184721c1ab37cc) ) - ROM_LOAD( "2084_rom_6b_3005-6.a5", 0x15000, 0x1000, CRC(028181a6) SHA1(41c4d9ece2ae8a103b7151fc4ff576796303318d) ) - ROM_LOAD( "2084_rom_7b_3005-7.e6", 0x16000, 0x1000, CRC(4dfcceae) SHA1(46fe1b1162d6054eb502852d065fc2e8c694b09d) ) - ROM_LOAD( "2084_rom_8b_3005-8.c6", 0x17000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) - ROM_LOAD( "2084_rom_9b_3005-9.a6", 0x18000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_3_std_767.ic12", 0xf000, 0x1000, CRC(c56c1d28) SHA1(15afefef11bfc3ab78f61ab046701db78d160ec3) ) // P/N A-5342-09910 @@ -2674,19 +2670,19 @@ ROM_START( robotronyo ) // Yellow label / Red stripe & Black print or Yellow lab ROM_END ROM_START( robotronun ) - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "roboun11.1b", 0x00000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) + ROM_LOAD( "roboun11.2b", 0x01000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) + ROM_LOAD( "roboun11.3b", 0x02000, 0x1000, CRC(e99a82be) SHA1(06a8c8dd0b4726eb7f0bb0e89c8533931d75fc1c) ) + ROM_LOAD( "roboun11.4b", 0x03000, 0x1000, CRC(afb1c561) SHA1(aaf89c19fd8f4e8750717169eb1af476aef38a5e) ) + ROM_LOAD( "roboun11.5b", 0x04000, 0x1000, CRC(62691e77) SHA1(79b4680ce19bd28882ae823f0e7b293af17cbb91) ) + ROM_LOAD( "roboun11.6b", 0x05000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) + ROM_LOAD( "roboun11.7b", 0x06000, 0x1000, CRC(8981a43b) SHA1(8ecab99093d42cb66e177dfa7cf7e352667930ca) ) // + ROM_LOAD( "roboun11.8b", 0x07000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) + ROM_LOAD( "roboun11.9b", 0x08000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) ROM_LOAD( "roboun11.10b", 0x0d000, 0x1000, CRC(13797024) SHA1(d426a50e75dabe936de643c83a548da5e399331c) ) ROM_LOAD( "roboun11.11b", 0x0e000, 0x1000, CRC(7e3c1b87) SHA1(f8c6cbe3688f256f41a121255fc08f575f6a4b4f) ) ROM_LOAD( "roboun11.12b", 0x0f000, 0x1000, CRC(645d543e) SHA1(fad7cea868ebf17347c4bc5193d647bbd8f9517b) ) - ROM_LOAD( "roboun11.1b", 0x10000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) - ROM_LOAD( "roboun11.2b", 0x11000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) - ROM_LOAD( "roboun11.3b", 0x12000, 0x1000, CRC(e99a82be) SHA1(06a8c8dd0b4726eb7f0bb0e89c8533931d75fc1c) ) - ROM_LOAD( "roboun11.4b", 0x13000, 0x1000, CRC(afb1c561) SHA1(aaf89c19fd8f4e8750717169eb1af476aef38a5e) ) - ROM_LOAD( "roboun11.5b", 0x14000, 0x1000, CRC(62691e77) SHA1(79b4680ce19bd28882ae823f0e7b293af17cbb91) ) - ROM_LOAD( "roboun11.6b", 0x15000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) - ROM_LOAD( "roboun11.7b", 0x16000, 0x1000, CRC(8981a43b) SHA1(8ecab99093d42cb66e177dfa7cf7e352667930ca) ) // - ROM_LOAD( "roboun11.8b", 0x17000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) - ROM_LOAD( "roboun11.9b", 0x18000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_3_std_767.ic12", 0xf000, 0x1000, CRC(c56c1d28) SHA1(15afefef11bfc3ab78f61ab046701db78d160ec3) ) // P/N A-5342-09910 @@ -2697,19 +2693,19 @@ ROM_START( robotronun ) ROM_END ROM_START( robotron87 ) // Patch by Christian Gingras in 1987 fixing 7 bugs, AKA "Shot in the corner" bug fix - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2084_rom_1b_3005-13.e4", 0x00000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) + ROM_LOAD( "2084_rom_2b_3005-14.c4", 0x01000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) + ROM_LOAD( "2084_rom_3b_3005-15.a4", 0x02000, 0x1000, CRC(e99a82be) SHA1(06a8c8dd0b4726eb7f0bb0e89c8533931d75fc1c) ) + ROM_LOAD( "2084_rom_4b_3005-16.e5", 0x03000, 0x1000, CRC(afb1c561) SHA1(aaf89c19fd8f4e8750717169eb1af476aef38a5e) ) + ROM_LOAD( "fixrobo_rom_5b.c5", 0x04000, 0x1000, CRC(827cb5c9) SHA1(1732d16cd88e0662f1cffce1aeda5c8aa8c31338) ) // fixes the enforcer explosion “reset” bug + ROM_LOAD( "2084_rom_6b_3005-18.a5", 0x05000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) + ROM_LOAD( "2084_rom_7b_3005-19.e6", 0x06000, 0x1000, CRC(49ac400c) SHA1(06eae5138254723819a5e93cfd9e9f3285fcddf5) ) + ROM_LOAD( "2084_rom_8b_3005-20.c6", 0x07000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) + ROM_LOAD( "2084_rom_9b_3005-21.a6", 0x08000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) ROM_LOAD( "2084_rom_10b_3005-22.a7", 0x0d000, 0x1000, CRC(13797024) SHA1(d426a50e75dabe936de643c83a548da5e399331c) ) ROM_LOAD( "fixrobo_rom_11b.c7", 0x0e000, 0x1000, CRC(e83a2eda) SHA1(4a62fcd2f91dfb609c3d2c300bd9e6cb60edf52e) ) // ROM_LOAD( "2084_rom_12b_3005-24.e7", 0x0f000, 0x1000, CRC(645d543e) SHA1(fad7cea868ebf17347c4bc5193d647bbd8f9517b) ) - ROM_LOAD( "2084_rom_1b_3005-13.e4", 0x10000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) - ROM_LOAD( "2084_rom_2b_3005-14.c4", 0x11000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) - ROM_LOAD( "2084_rom_3b_3005-15.a4", 0x12000, 0x1000, CRC(e99a82be) SHA1(06a8c8dd0b4726eb7f0bb0e89c8533931d75fc1c) ) - ROM_LOAD( "2084_rom_4b_3005-16.e5", 0x13000, 0x1000, CRC(afb1c561) SHA1(aaf89c19fd8f4e8750717169eb1af476aef38a5e) ) - ROM_LOAD( "fixrobo_rom_5b.c5", 0x14000, 0x1000, CRC(827cb5c9) SHA1(1732d16cd88e0662f1cffce1aeda5c8aa8c31338) ) // fixes the enforcer explosion “reset” bug - ROM_LOAD( "2084_rom_6b_3005-18.a5", 0x15000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) - ROM_LOAD( "2084_rom_7b_3005-19.e6", 0x16000, 0x1000, CRC(49ac400c) SHA1(06eae5138254723819a5e93cfd9e9f3285fcddf5) ) - ROM_LOAD( "2084_rom_8b_3005-20.c6", 0x17000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) - ROM_LOAD( "2084_rom_9b_3005-21.a6", 0x18000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_3_std_767.ic12", 0xf000, 0x1000, CRC(c56c1d28) SHA1(15afefef11bfc3ab78f61ab046701db78d160ec3) ) // P/N A-5342-09910 @@ -2724,19 +2720,19 @@ ROM_START( robotron87 ) // Patch by Christian Gingras in 1987 fixing 7 bugs, AKA ROM_END ROM_START( robotron12 ) - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2084_rom_1b_3005-13.e4", 0x00000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) + ROM_LOAD( "2084_rom_2b_3005-14.c4", 0x01000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) + ROM_LOAD( "wave201.a4", 0x02000, 0x1000, CRC(85eb583e) SHA1(b6c4280415515de6f56b358206dc3bd93a12bfce) ) // wave 201 patch + ROM_LOAD( "2084_rom_4b_3005-16.e5", 0x03000, 0x1000, CRC(afb1c561) SHA1(aaf89c19fd8f4e8750717169eb1af476aef38a5e) ) + ROM_LOAD( "fixrobo_rom_5b.c5", 0x04000, 0x1000, CRC(827cb5c9) SHA1(1732d16cd88e0662f1cffce1aeda5c8aa8c31338) ) // fixes the enforcer explosion “reset” bug + ROM_LOAD( "2084_rom_6b_3005-18.a5", 0x05000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) + ROM_LOAD( "2084_rom_7b_3005-19.e6", 0x06000, 0x1000, CRC(49ac400c) SHA1(06eae5138254723819a5e93cfd9e9f3285fcddf5) ) + ROM_LOAD( "2084_rom_8b_3005-20.c6", 0x07000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) + ROM_LOAD( "2084_rom_9b_3005-21.a6", 0x08000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) ROM_LOAD( "2084_rom_10b_3005-22.a7", 0x0d000, 0x1000, CRC(13797024) SHA1(d426a50e75dabe936de643c83a548da5e399331c) ) ROM_LOAD( "fixrobo_rom_11b.c7", 0x0e000, 0x1000, CRC(e83a2eda) SHA1(4a62fcd2f91dfb609c3d2c300bd9e6cb60edf52e) ) // ROM_LOAD( "2084_rom_12b_3005-24.e7", 0x0f000, 0x1000, CRC(645d543e) SHA1(fad7cea868ebf17347c4bc5193d647bbd8f9517b) ) - ROM_LOAD( "2084_rom_1b_3005-13.e4", 0x10000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) - ROM_LOAD( "2084_rom_2b_3005-14.c4", 0x11000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) - ROM_LOAD( "wave201.a4", 0x12000, 0x1000, CRC(85eb583e) SHA1(b6c4280415515de6f56b358206dc3bd93a12bfce) ) // wave 201 patch - ROM_LOAD( "2084_rom_4b_3005-16.e5", 0x13000, 0x1000, CRC(afb1c561) SHA1(aaf89c19fd8f4e8750717169eb1af476aef38a5e) ) - ROM_LOAD( "fixrobo_rom_5b.c5", 0x14000, 0x1000, CRC(827cb5c9) SHA1(1732d16cd88e0662f1cffce1aeda5c8aa8c31338) ) // fixes the enforcer explosion “reset” bug - ROM_LOAD( "2084_rom_6b_3005-18.a5", 0x15000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) - ROM_LOAD( "2084_rom_7b_3005-19.e6", 0x16000, 0x1000, CRC(49ac400c) SHA1(06eae5138254723819a5e93cfd9e9f3285fcddf5) ) - ROM_LOAD( "2084_rom_8b_3005-20.c6", 0x17000, 0x1000, CRC(3a96e88c) SHA1(7ae38a609ed9a6f62ca003cab719740ed7651b7c) ) - ROM_LOAD( "2084_rom_9b_3005-21.a6", 0x18000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_3_std_767.ic12", 0xf000, 0x1000, CRC(c56c1d28) SHA1(15afefef11bfc3ab78f61ab046701db78d160ec3) ) // P/N A-5342-09910 @@ -2747,19 +2743,19 @@ ROM_START( robotron12 ) ROM_END ROM_START( robotrontd ) // Tie-Die version starts with a "Solid Blue label" set - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2084_rom_1b_3005-13.e4", 0x00000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) // == 2084_rom_1b_3005-1.e4 + ROM_LOAD( "2084_rom_2b_3005-14.c4", 0x01000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) // == 2084_rom_2b_3005-2.c4 + ROM_LOAD( "2084_rom_3b_3005-15.a4", 0x02000, 0x1000, CRC(e99a82be) SHA1(06a8c8dd0b4726eb7f0bb0e89c8533931d75fc1c) ) + ROM_LOAD( "tiedie_rom_4b.e5", 0x03000, 0x1000, CRC(e8238019) SHA1(0ce29f4bf6bdee677c8e80c2d5e66fc556ba349f) ) + ROM_LOAD( "fixrobo_rom_5b.c5", 0x04000, 0x1000, CRC(827cb5c9) SHA1(1732d16cd88e0662f1cffce1aeda5c8aa8c31338) ) // fixes the enforcer explosion “reset” bug + ROM_LOAD( "2084_rom_6b_3005-18.a5", 0x05000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) + ROM_LOAD( "tiedie_rom_7b.e6", 0x06000, 0x1000, CRC(3ecf4620) SHA1(3c670a1f8df35d18451c82f220a02448bf5ef5ac) ) + ROM_LOAD( "tiedie_rom_8b.c6", 0x07000, 0x1000, CRC(752d7a46) SHA1(85dd58d14d527ca75d6c546d6271bf8ee5a82c8c) ) + ROM_LOAD( "2084_rom_9b_3005-21.a6", 0x08000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) // == 2084_rom_9b_3005-9.a6 ROM_LOAD( "tiedie_rom_10b.a7", 0x0d000, 0x1000, CRC(952bea55) SHA1(80f51d8e7ec62518afad7e56a47e0756f83f813c) ) ROM_LOAD( "tiedie_rom_11b.c7", 0x0e000, 0x1000, CRC(4c05fd3c) SHA1(0d727458454826fd8222e4022b755d686ccb065f) ) ROM_LOAD( "2084_rom_12b_3005-24.e7", 0x0f000, 0x1000, CRC(645d543e) SHA1(fad7cea868ebf17347c4bc5193d647bbd8f9517b) ) - ROM_LOAD( "2084_rom_1b_3005-13.e4", 0x10000, 0x1000, CRC(66c7d3ef) SHA1(f6d60e26c209c1df2cc01ac07ad5559daa1b7118) ) // == 2084_rom_1b_3005-1.e4 - ROM_LOAD( "2084_rom_2b_3005-14.c4", 0x11000, 0x1000, CRC(5bc6c614) SHA1(4d6e82bc29f49100f7751ccfc6a9ff35695b84b3) ) // == 2084_rom_2b_3005-2.c4 - ROM_LOAD( "2084_rom_3b_3005-15.a4", 0x12000, 0x1000, CRC(e99a82be) SHA1(06a8c8dd0b4726eb7f0bb0e89c8533931d75fc1c) ) - ROM_LOAD( "tiedie_rom_4b.e5", 0x13000, 0x1000, CRC(e8238019) SHA1(0ce29f4bf6bdee677c8e80c2d5e66fc556ba349f) ) - ROM_LOAD( "fixrobo_rom_5b.c5", 0x14000, 0x1000, CRC(827cb5c9) SHA1(1732d16cd88e0662f1cffce1aeda5c8aa8c31338) ) // fixes the enforcer explosion “reset” bug - ROM_LOAD( "2084_rom_6b_3005-18.a5", 0x15000, 0x1000, CRC(bd2c853d) SHA1(f76ec5432a7939b33a27be1c6855e2dbe6d9fdc8) ) - ROM_LOAD( "tiedie_rom_7b.e6", 0x16000, 0x1000, CRC(3ecf4620) SHA1(3c670a1f8df35d18451c82f220a02448bf5ef5ac) ) - ROM_LOAD( "tiedie_rom_8b.c6", 0x17000, 0x1000, CRC(752d7a46) SHA1(85dd58d14d527ca75d6c546d6271bf8ee5a82c8c) ) - ROM_LOAD( "2084_rom_9b_3005-21.a6", 0x18000, 0x1000, CRC(b124367b) SHA1(fd9d75b866f0ebbb723f84889337e6814496a103) ) // == 2084_rom_9b_3005-9.a6 ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_3_std_767.ic12", 0xf000, 0x1000, CRC(c56c1d28) SHA1(15afefef11bfc3ab78f61ab046701db78d160ec3) ) // P/N A-5342-09910 @@ -2882,19 +2878,19 @@ Wire W2 & W4 with Zero Ohm resistors for 2532 ROMs */ ROM_START( joust ) // Solid green labels - contains the same data as the white label with green stripe 3006-52 through 3006-63 set - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "joust_rom_1b_3006-13.e4", 0x00000, 0x1000, CRC(fe41b2af) SHA1(0443e00ae2eb3e66cf805562ee04309487bb0ba4) ) // == joust_rom_1a_3006-1.e4 + ROM_LOAD( "joust_rom_2b_3006-14.c4", 0x01000, 0x1000, CRC(501c143c) SHA1(5fda266d43cbbf42eeae1a078b5209d9408ab99f) ) // == joust_rom_2a_3006-2.c4 + ROM_LOAD( "joust_rom_3b_3006-15.a4", 0x02000, 0x1000, CRC(43f7161d) SHA1(686da120aa4bd4a41f3d93e8c79ebb343977851a) ) // == joust_rom_3a_3006-3.a4 + ROM_LOAD( "joust_rom_4b_3006-16.e5", 0x03000, 0x1000, CRC(db5571b6) SHA1(cb1c3285344e2cfbe0a81ab9b51758c40da8a23f) ) // == joust_rom_4a_3006-4.e5 + ROM_LOAD( "joust_rom_5b_3006-17.c5", 0x04000, 0x1000, CRC(c686bb6b) SHA1(d9cac4c46820e1a451a145864bca7a35cfab7d37) ) // == joust_rom_5a_3006-5.c5 + ROM_LOAD( "joust_rom_6b_3006-18.a5", 0x05000, 0x1000, CRC(fac5f2cf) SHA1(febaa8cf5c3a0af901cd12d0b7909f6fec3beadd) ) // == joust_rom_6a_3006-6.a5 + ROM_LOAD( "joust_rom_7b_3006-19.e6", 0x06000, 0x1000, CRC(81418240) SHA1(5ad14aa65e71c3856dcdb04c99edda92e406a3e3) ) + ROM_LOAD( "joust_rom_8b_3006-20.c6", 0x07000, 0x1000, CRC(ba5359ba) SHA1(f4ee13d5a95ed3e1050a3927a3a0ccf86ed7752d) ) // == joust_rom_8a_3006-8.c6 + ROM_LOAD( "joust_rom_9b_3006-21.a6", 0x08000, 0x1000, CRC(39643147) SHA1(d95d3b746133eac9dcc9ee05eabecb797023f1a5) ) // == joust_rom_9a_3006-9.a6 ROM_LOAD( "joust_rom_10b_3006-22.a7", 0x0d000, 0x1000, CRC(3f1c4f89) SHA1(90864a8ab944df45287bf0f68ad3a85194077a82) ) ROM_LOAD( "joust_rom_11b_3006-23.c7", 0x0e000, 0x1000, CRC(ea48b359) SHA1(6d38003d56bebeb1f5b4d2287d587342847aa195) ) // == joust_rom_11a_3006-11.c7 ROM_LOAD( "joust_rom_12b_3006-24.e7", 0x0f000, 0x1000, CRC(c710717b) SHA1(7d01764e8251c60b3cab96f7dc6dcc1c624f9d12) ) // == joust_rom_12a_3006-12.e7 - ROM_LOAD( "joust_rom_1b_3006-13.e4", 0x10000, 0x1000, CRC(fe41b2af) SHA1(0443e00ae2eb3e66cf805562ee04309487bb0ba4) ) // == joust_rom_1a_3006-1.e4 - ROM_LOAD( "joust_rom_2b_3006-14.c4", 0x11000, 0x1000, CRC(501c143c) SHA1(5fda266d43cbbf42eeae1a078b5209d9408ab99f) ) // == joust_rom_2a_3006-2.c4 - ROM_LOAD( "joust_rom_3b_3006-15.a4", 0x12000, 0x1000, CRC(43f7161d) SHA1(686da120aa4bd4a41f3d93e8c79ebb343977851a) ) // == joust_rom_3a_3006-3.a4 - ROM_LOAD( "joust_rom_4b_3006-16.e5", 0x13000, 0x1000, CRC(db5571b6) SHA1(cb1c3285344e2cfbe0a81ab9b51758c40da8a23f) ) // == joust_rom_4a_3006-4.e5 - ROM_LOAD( "joust_rom_5b_3006-17.c5", 0x14000, 0x1000, CRC(c686bb6b) SHA1(d9cac4c46820e1a451a145864bca7a35cfab7d37) ) // == joust_rom_5a_3006-5.c5 - ROM_LOAD( "joust_rom_6b_3006-18.a5", 0x15000, 0x1000, CRC(fac5f2cf) SHA1(febaa8cf5c3a0af901cd12d0b7909f6fec3beadd) ) // == joust_rom_6a_3006-6.a5 - ROM_LOAD( "joust_rom_7b_3006-19.e6", 0x16000, 0x1000, CRC(81418240) SHA1(5ad14aa65e71c3856dcdb04c99edda92e406a3e3) ) - ROM_LOAD( "joust_rom_8b_3006-20.c6", 0x17000, 0x1000, CRC(ba5359ba) SHA1(f4ee13d5a95ed3e1050a3927a3a0ccf86ed7752d) ) // == joust_rom_8a_3006-8.c6 - ROM_LOAD( "joust_rom_9b_3006-21.a6", 0x18000, 0x1000, CRC(39643147) SHA1(d95d3b746133eac9dcc9ee05eabecb797023f1a5) ) // == joust_rom_9a_3006-9.a6 ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_4_std_780.ic12", 0xf000, 0x1000, CRC(f1835bdd) SHA1(af7c066d2949d36b87ea8c425ca7d12f82b5c653) ) // P/N A-5343-09973 @@ -2905,19 +2901,19 @@ ROM_START( joust ) // Solid green labels - contains the same data as the white l ROM_END ROM_START( jousty ) // Solid yellow labels - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "joust_rom_1a_3006-1.e4", 0x00000, 0x1000, CRC(fe41b2af) SHA1(0443e00ae2eb3e66cf805562ee04309487bb0ba4) ) + ROM_LOAD( "joust_rom_2a_3006-2.c4", 0x01000, 0x1000, CRC(501c143c) SHA1(5fda266d43cbbf42eeae1a078b5209d9408ab99f) ) + ROM_LOAD( "joust_rom_3a_3006-3.a4", 0x02000, 0x1000, CRC(43f7161d) SHA1(686da120aa4bd4a41f3d93e8c79ebb343977851a) ) + ROM_LOAD( "joust_rom_4a_3006-4.e5", 0x03000, 0x1000, CRC(db5571b6) SHA1(cb1c3285344e2cfbe0a81ab9b51758c40da8a23f) ) + ROM_LOAD( "joust_rom_5a_3006-5.c5", 0x04000, 0x1000, CRC(c686bb6b) SHA1(d9cac4c46820e1a451a145864bca7a35cfab7d37) ) + ROM_LOAD( "joust_rom_6a_3006-6.a5", 0x05000, 0x1000, CRC(fac5f2cf) SHA1(febaa8cf5c3a0af901cd12d0b7909f6fec3beadd) ) + ROM_LOAD( "joust_rom_7a_3006-7.e6", 0x06000, 0x1000, CRC(e6f439c4) SHA1(ff8f1d54f3ac91101ab9f5f115baeca4f2670186) ) + ROM_LOAD( "joust_rom_8a_3006-8.c6", 0x07000, 0x1000, CRC(ba5359ba) SHA1(f4ee13d5a95ed3e1050a3927a3a0ccf86ed7752d) ) + ROM_LOAD( "joust_rom_9a_3006-9.a6", 0x08000, 0x1000, CRC(39643147) SHA1(d95d3b746133eac9dcc9ee05eabecb797023f1a5) ) ROM_LOAD( "joust_rom_10a_3006-10.a7", 0x0d000, 0x1000, CRC(2039014a) SHA1(b9a76ecf01404585f833f76c54aa5a88a0215715) ) ROM_LOAD( "joust_rom_11a_3006-11.c7", 0x0e000, 0x1000, CRC(ea48b359) SHA1(6d38003d56bebeb1f5b4d2287d587342847aa195) ) ROM_LOAD( "joust_rom_12a_3006-12.e7", 0x0f000, 0x1000, CRC(c710717b) SHA1(7d01764e8251c60b3cab96f7dc6dcc1c624f9d12) ) - ROM_LOAD( "joust_rom_1a_3006-1.e4", 0x10000, 0x1000, CRC(fe41b2af) SHA1(0443e00ae2eb3e66cf805562ee04309487bb0ba4) ) - ROM_LOAD( "joust_rom_2a_3006-2.c4", 0x11000, 0x1000, CRC(501c143c) SHA1(5fda266d43cbbf42eeae1a078b5209d9408ab99f) ) - ROM_LOAD( "joust_rom_3a_3006-3.a4", 0x12000, 0x1000, CRC(43f7161d) SHA1(686da120aa4bd4a41f3d93e8c79ebb343977851a) ) - ROM_LOAD( "joust_rom_4a_3006-4.e5", 0x13000, 0x1000, CRC(db5571b6) SHA1(cb1c3285344e2cfbe0a81ab9b51758c40da8a23f) ) - ROM_LOAD( "joust_rom_5a_3006-5.c5", 0x14000, 0x1000, CRC(c686bb6b) SHA1(d9cac4c46820e1a451a145864bca7a35cfab7d37) ) - ROM_LOAD( "joust_rom_6a_3006-6.a5", 0x15000, 0x1000, CRC(fac5f2cf) SHA1(febaa8cf5c3a0af901cd12d0b7909f6fec3beadd) ) - ROM_LOAD( "joust_rom_7a_3006-7.e6", 0x16000, 0x1000, CRC(e6f439c4) SHA1(ff8f1d54f3ac91101ab9f5f115baeca4f2670186) ) - ROM_LOAD( "joust_rom_8a_3006-8.c6", 0x17000, 0x1000, CRC(ba5359ba) SHA1(f4ee13d5a95ed3e1050a3927a3a0ccf86ed7752d) ) - ROM_LOAD( "joust_rom_9a_3006-9.a6", 0x18000, 0x1000, CRC(39643147) SHA1(d95d3b746133eac9dcc9ee05eabecb797023f1a5) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_4_std_780.ic12", 0xf000, 0x1000, CRC(f1835bdd) SHA1(af7c066d2949d36b87ea8c425ca7d12f82b5c653) ) // P/N A-5343-09973 @@ -2928,19 +2924,19 @@ ROM_START( jousty ) // Solid yellow labels ROM_END ROM_START( joustr ) // Solid red labels - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "joust_rom_1a_3006-28.e4", 0x00000, 0x1000, CRC(fe41b2af) SHA1(0443e00ae2eb3e66cf805562ee04309487bb0ba4) ) // == joust_rom_1a_3006-1.e4 + ROM_LOAD( "joust_rom_2a_3006-29.c4", 0x01000, 0x1000, CRC(501c143c) SHA1(5fda266d43cbbf42eeae1a078b5209d9408ab99f) ) // == joust_rom_2a_3006-2.c4 + ROM_LOAD( "joust_rom_3a_3006-30.a4", 0x02000, 0x1000, CRC(43f7161d) SHA1(686da120aa4bd4a41f3d93e8c79ebb343977851a) ) // == joust_rom_3a_3006-3.a4 + ROM_LOAD( "joust_rom_4a_3006-31.e5", 0x03000, 0x1000, CRC(ab347170) SHA1(ad50c83fcfa958f2673cae04bd811095f9ee08c0) ) + ROM_LOAD( "joust_rom_5a_3006-32.c5", 0x04000, 0x1000, CRC(c686bb6b) SHA1(d9cac4c46820e1a451a145864bca7a35cfab7d37) ) // == joust_rom_5a_3006-5.c5 + ROM_LOAD( "joust_rom_6a_3006-33.a5", 0x05000, 0x1000, CRC(3d9a6fac) SHA1(0c81394ae96a2fcfa4c953d38e43f3ef415fe4fc) ) + ROM_LOAD( "joust_rom_7a_3006-34.e6", 0x06000, 0x1000, CRC(0a70b3d1) SHA1(eb78b694aa29f777f3c7e7104e568f865930c0ec) ) + ROM_LOAD( "joust_rom_8a_3006-35.c6", 0x07000, 0x1000, CRC(a7f01504) SHA1(0ca3211d060befc102bda2e97d163de7fb12a6f6) ) + ROM_LOAD( "joust_rom_9a_3006-36.a6", 0x08000, 0x1000, CRC(978687ad) SHA1(25e651af3e3be08d6293aab427a0843e9333a629) ) ROM_LOAD( "joust_rom_10a_3006-37.a7", 0x0d000, 0x1000, CRC(c0c6e52a) SHA1(f14ff16195027f3e199e79e43741f0849c17fd10) ) ROM_LOAD( "joust_rom_11a_3006-38.c7", 0x0e000, 0x1000, CRC(ab11bcf9) SHA1(efb09e92a621d6c4d6cde2f166e8c988c64d81ae) ) ROM_LOAD( "joust_rom_12a_3006-39.e7", 0x0f000, 0x1000, CRC(ea14574b) SHA1(7572d118b2343646054e558f0bd48e4959d84ce7) ) - ROM_LOAD( "joust_rom_1a_3006-28.e4", 0x10000, 0x1000, CRC(fe41b2af) SHA1(0443e00ae2eb3e66cf805562ee04309487bb0ba4) ) // == joust_rom_1a_3006-1.e4 - ROM_LOAD( "joust_rom_2a_3006-29.c4", 0x11000, 0x1000, CRC(501c143c) SHA1(5fda266d43cbbf42eeae1a078b5209d9408ab99f) ) // == joust_rom_2a_3006-2.c4 - ROM_LOAD( "joust_rom_3a_3006-30.a4", 0x12000, 0x1000, CRC(43f7161d) SHA1(686da120aa4bd4a41f3d93e8c79ebb343977851a) ) // == joust_rom_3a_3006-3.a4 - ROM_LOAD( "joust_rom_4a_3006-31.e5", 0x13000, 0x1000, CRC(ab347170) SHA1(ad50c83fcfa958f2673cae04bd811095f9ee08c0) ) - ROM_LOAD( "joust_rom_5a_3006-32.c5", 0x14000, 0x1000, CRC(c686bb6b) SHA1(d9cac4c46820e1a451a145864bca7a35cfab7d37) ) // == joust_rom_5a_3006-5.c5 - ROM_LOAD( "joust_rom_6a_3006-33.a5", 0x15000, 0x1000, CRC(3d9a6fac) SHA1(0c81394ae96a2fcfa4c953d38e43f3ef415fe4fc) ) - ROM_LOAD( "joust_rom_7a_3006-34.e6", 0x16000, 0x1000, CRC(0a70b3d1) SHA1(eb78b694aa29f777f3c7e7104e568f865930c0ec) ) - ROM_LOAD( "joust_rom_8a_3006-35.c6", 0x17000, 0x1000, CRC(a7f01504) SHA1(0ca3211d060befc102bda2e97d163de7fb12a6f6) ) - ROM_LOAD( "joust_rom_9a_3006-36.a6", 0x18000, 0x1000, CRC(978687ad) SHA1(25e651af3e3be08d6293aab427a0843e9333a629) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_4_std_780.ic12", 0xf000, 0x1000, CRC(f1835bdd) SHA1(af7c066d2949d36b87ea8c425ca7d12f82b5c653) ) // P/N A-5343-09973 @@ -3038,19 +3034,19 @@ For the sound ROM: */ ROM_START( bubbles ) - ROM_REGION( 0x19000, "maincpu", 0 ) // Solid red Label "B" ROMs numbers 16-3012-40 through 16-3012-51 + ROM_REGION( 0x10000, "maincpu", 0 ) // Solid red Label "B" ROMs numbers 16-3012-40 through 16-3012-51 + ROM_LOAD( "bubbles_rom_1b_16-3012-40.4e", 0x00000, 0x1000, CRC(8234f55c) SHA1(4d60942320c03ae50b0b17267062a321cf49e240) ) + ROM_LOAD( "bubbles_rom_2b_16-3012-41.4c", 0x01000, 0x1000, CRC(4a188d6a) SHA1(2788c4a21659799e59ab82bc8d1864a3abe3b6d7) ) + ROM_LOAD( "bubbles_rom_3b_16-3012-42.4a", 0x02000, 0x1000, CRC(7728f07f) SHA1(2a2c6dd8c2196dcd5e71b38554a56ee03d2aa454) ) + ROM_LOAD( "bubbles_rom_4b_16-3012-43.5e", 0x03000, 0x1000, CRC(040be7f9) SHA1(de4d212cd2967b2dcd7b2c09dea2c1b06ce4c5bd) ) + ROM_LOAD( "bubbles_rom_5b_16-3012-44.5c", 0x04000, 0x1000, CRC(0b5f29e0) SHA1(ae52f8c69c8b821abb458288c8ee0bc6c28fe535) ) + ROM_LOAD( "bubbles_rom_6b_16-3012-45.5a", 0x05000, 0x1000, CRC(4dd0450d) SHA1(d55aa8fb8f2974ce5ba7155b01bc3e3622f202af) ) + ROM_LOAD( "bubbles_rom_7b_16-3012-46.6e", 0x06000, 0x1000, CRC(e0a26ec0) SHA1(2da6213df6c15735a8bbd6750cfb1a1b6232a6f5) ) + ROM_LOAD( "bubbles_rom_8b_16-3012-47.6c", 0x07000, 0x1000, CRC(4fd23d8d) SHA1(9d71caa30bc3f4151789279d21651e5a4fe4a484) ) + ROM_LOAD( "bubbles_rom_9b_16-3012-48.6a", 0x08000, 0x1000, CRC(b48559fb) SHA1(551a49a12353044dbbf28dba2bd860c2d00c50bd) ) ROM_LOAD( "bubbles_rom_10b_16-3012-49.a7", 0x0d000, 0x1000, CRC(26e7869b) SHA1(db428e79fc325ae3c8cab460267c27cdbc35a3bd) ) ROM_LOAD( "bubbles_rom_11b_16-3012-50.c7", 0x0e000, 0x1000, CRC(5a5b572f) SHA1(f0c3a330abf9c8cfb6007ee372409450d2a15a93) ) ROM_LOAD( "bubbles_rom_12b_16-3012-51.e7", 0x0f000, 0x1000, CRC(ce22d2e2) SHA1(be4b9800c846660ce2b2ddd75ad872dcf174979a) ) - ROM_LOAD( "bubbles_rom_1b_16-3012-40.4e", 0x10000, 0x1000, CRC(8234f55c) SHA1(4d60942320c03ae50b0b17267062a321cf49e240) ) - ROM_LOAD( "bubbles_rom_2b_16-3012-41.4c", 0x11000, 0x1000, CRC(4a188d6a) SHA1(2788c4a21659799e59ab82bc8d1864a3abe3b6d7) ) - ROM_LOAD( "bubbles_rom_3b_16-3012-42.4a", 0x12000, 0x1000, CRC(7728f07f) SHA1(2a2c6dd8c2196dcd5e71b38554a56ee03d2aa454) ) - ROM_LOAD( "bubbles_rom_4b_16-3012-43.5e", 0x13000, 0x1000, CRC(040be7f9) SHA1(de4d212cd2967b2dcd7b2c09dea2c1b06ce4c5bd) ) - ROM_LOAD( "bubbles_rom_5b_16-3012-44.5c", 0x14000, 0x1000, CRC(0b5f29e0) SHA1(ae52f8c69c8b821abb458288c8ee0bc6c28fe535) ) - ROM_LOAD( "bubbles_rom_6b_16-3012-45.5a", 0x15000, 0x1000, CRC(4dd0450d) SHA1(d55aa8fb8f2974ce5ba7155b01bc3e3622f202af) ) - ROM_LOAD( "bubbles_rom_7b_16-3012-46.6e", 0x16000, 0x1000, CRC(e0a26ec0) SHA1(2da6213df6c15735a8bbd6750cfb1a1b6232a6f5) ) - ROM_LOAD( "bubbles_rom_8b_16-3012-47.6c", 0x17000, 0x1000, CRC(4fd23d8d) SHA1(9d71caa30bc3f4151789279d21651e5a4fe4a484) ) - ROM_LOAD( "bubbles_rom_9b_16-3012-48.6a", 0x18000, 0x1000, CRC(b48559fb) SHA1(551a49a12353044dbbf28dba2bd860c2d00c50bd) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_5_std_771.ic12", 0xf000, 0x1000, CRC(689ce2aa) SHA1(b70d2553f731f9a20ddaf9af2f93b7e9c44d4d99) ) @@ -3061,19 +3057,19 @@ ROM_START( bubbles ) ROM_END ROM_START( bubblesr ) - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "bubblesr.1b", 0x00000, 0x1000, CRC(dda4e782) SHA1(ad6825ebc05931942ce1042f18e18e3873083abc) ) + ROM_LOAD( "bubblesr.2b", 0x01000, 0x1000, CRC(3c8fa7f5) SHA1(fd3db6c2abab7000d586ef1a4e425329da292144) ) + ROM_LOAD( "bubblesr.3b", 0x02000, 0x1000, CRC(f869bb9c) SHA1(ce276fc33136a527eefbbf35c2bcf1f0b9858740) ) + ROM_LOAD( "bubblesr.4b", 0x03000, 0x1000, CRC(0c65eaab) SHA1(c622906cbda07421a7024955f3b9e8d173f4b6cb) ) + ROM_LOAD( "bubblesr.5b", 0x04000, 0x1000, CRC(7ece4e13) SHA1(c6ec7145c2d3bf51877c7fb995d9732b09e04cf0) ) + ROM_LOAD( "bubbles.6b", 0x05000, 0x1000, CRC(4dd0450d) SHA1(d55aa8fb8f2974ce5ba7155b01bc3e3622f202af) ) + ROM_LOAD( "bubbles.7b", 0x06000, 0x1000, CRC(e0a26ec0) SHA1(2da6213df6c15735a8bbd6750cfb1a1b6232a6f5) ) // = bub_prot.7b + ROM_LOAD( "bubblesr.8b", 0x07000, 0x1000, CRC(598b9bd6) SHA1(993cc3fac58310d0e617e58e3a0753002b987df1) ) + ROM_LOAD( "bubbles.9b", 0x08000, 0x1000, CRC(b48559fb) SHA1(551a49a12353044dbbf28dba2bd860c2d00c50bd) ) ROM_LOAD( "bubblesr.10b", 0x0d000, 0x1000, CRC(8b396db0) SHA1(88cab59ce7f07dfa15d1485d12ebab96d777ca65) ) ROM_LOAD( "bubblesr.11b", 0x0e000, 0x1000, CRC(096af43e) SHA1(994e60c1e684ae46ea791b274995d21ff5052e56) ) ROM_LOAD( "bubblesr.12b", 0x0f000, 0x1000, CRC(5c1244ef) SHA1(25b0f359c28291894381d73f4ba3a2b991a547f0) ) - ROM_LOAD( "bubblesr.1b", 0x10000, 0x1000, CRC(dda4e782) SHA1(ad6825ebc05931942ce1042f18e18e3873083abc) ) - ROM_LOAD( "bubblesr.2b", 0x11000, 0x1000, CRC(3c8fa7f5) SHA1(fd3db6c2abab7000d586ef1a4e425329da292144) ) - ROM_LOAD( "bubblesr.3b", 0x12000, 0x1000, CRC(f869bb9c) SHA1(ce276fc33136a527eefbbf35c2bcf1f0b9858740) ) - ROM_LOAD( "bubblesr.4b", 0x13000, 0x1000, CRC(0c65eaab) SHA1(c622906cbda07421a7024955f3b9e8d173f4b6cb) ) - ROM_LOAD( "bubblesr.5b", 0x14000, 0x1000, CRC(7ece4e13) SHA1(c6ec7145c2d3bf51877c7fb995d9732b09e04cf0) ) - ROM_LOAD( "bubbles.6b", 0x15000, 0x1000, CRC(4dd0450d) SHA1(d55aa8fb8f2974ce5ba7155b01bc3e3622f202af) ) - ROM_LOAD( "bubbles.7b", 0x16000, 0x1000, CRC(e0a26ec0) SHA1(2da6213df6c15735a8bbd6750cfb1a1b6232a6f5) ) // = bub_prot.7b - ROM_LOAD( "bubblesr.8b", 0x17000, 0x1000, CRC(598b9bd6) SHA1(993cc3fac58310d0e617e58e3a0753002b987df1) ) - ROM_LOAD( "bubbles.9b", 0x18000, 0x1000, CRC(b48559fb) SHA1(551a49a12353044dbbf28dba2bd860c2d00c50bd) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_5_std_771.ic12", 0xf000, 0x1000, CRC(689ce2aa) SHA1(b70d2553f731f9a20ddaf9af2f93b7e9c44d4d99) ) @@ -3084,19 +3080,19 @@ ROM_START( bubblesr ) ROM_END ROM_START( bubblesp ) - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "bub_prot.1b", 0x00000, 0x1000, CRC(6466a746) SHA1(ed67d879d82ef05bcd2b655f761f84bc0cf08897) ) + ROM_LOAD( "bub_prot.2b", 0x01000, 0x1000, CRC(cca04357) SHA1(98f879675c02e7ad5532da30f663714913a059b9) ) + ROM_LOAD( "bub_prot.3b", 0x02000, 0x1000, CRC(7aaff9e5) SHA1(8b377ec5c595a4e062bdc8fb8ca99b52a6bd9298) ) + ROM_LOAD( "bub_prot.4b", 0x03000, 0x1000, CRC(4e264f01) SHA1(a6fd2d0613f78c45b3873e06efa2dd99530ed0c8) ) + ROM_LOAD( "bub_prot.5b", 0x04000, 0x1000, CRC(121b0be6) SHA1(75ed718b9e83c32390ee0fe2c34e0300ecd98a85) ) + ROM_LOAD( "bub_prot.6b", 0x05000, 0x1000, CRC(80e90b25) SHA1(92c83b4333f4f0f65638b1827ace01b02c490339) ) + ROM_LOAD( "bub_prot.7b", 0x06000, 0x1000, CRC(e0a26ec0) SHA1(2da6213df6c15735a8bbd6750cfb1a1b6232a6f5) ) + ROM_LOAD( "bub_prot.8b", 0x07000, 0x1000, CRC(96fb19c8) SHA1(3b1720e5efe2adc1f633216419bdf00c7e7b817d) ) + ROM_LOAD( "bub_prot.9b", 0x08000, 0x1000, CRC(be7e1028) SHA1(430b33c8d83ee6756a3ef9298792b71066c88326) ) ROM_LOAD( "bub_prot.10b", 0x0d000, 0x1000, CRC(89a565df) SHA1(1f02c17222f7303218962fada6c6f867414551cf) ) ROM_LOAD( "bub_prot.11b", 0x0e000, 0x1000, CRC(5a0c36a7) SHA1(2b9dd9006e57ff8214ad4e6b10a4b72e736d472c) ) ROM_LOAD( "bub_prot.12b", 0x0f000, 0x1000, CRC(2bfd3438) SHA1(2427a5614e98a9499e4d19f9d6e25f2b73896bf5) ) - ROM_LOAD( "bub_prot.1b", 0x10000, 0x1000, CRC(6466a746) SHA1(ed67d879d82ef05bcd2b655f761f84bc0cf08897) ) - ROM_LOAD( "bub_prot.2b", 0x11000, 0x1000, CRC(cca04357) SHA1(98f879675c02e7ad5532da30f663714913a059b9) ) - ROM_LOAD( "bub_prot.3b", 0x12000, 0x1000, CRC(7aaff9e5) SHA1(8b377ec5c595a4e062bdc8fb8ca99b52a6bd9298) ) - ROM_LOAD( "bub_prot.4b", 0x13000, 0x1000, CRC(4e264f01) SHA1(a6fd2d0613f78c45b3873e06efa2dd99530ed0c8) ) - ROM_LOAD( "bub_prot.5b", 0x14000, 0x1000, CRC(121b0be6) SHA1(75ed718b9e83c32390ee0fe2c34e0300ecd98a85) ) - ROM_LOAD( "bub_prot.6b", 0x15000, 0x1000, CRC(80e90b25) SHA1(92c83b4333f4f0f65638b1827ace01b02c490339) ) - ROM_LOAD( "bub_prot.7b", 0x16000, 0x1000, CRC(e0a26ec0) SHA1(2da6213df6c15735a8bbd6750cfb1a1b6232a6f5) ) - ROM_LOAD( "bub_prot.8b", 0x17000, 0x1000, CRC(96fb19c8) SHA1(3b1720e5efe2adc1f633216419bdf00c7e7b817d) ) - ROM_LOAD( "bub_prot.9b", 0x18000, 0x1000, CRC(be7e1028) SHA1(430b33c8d83ee6756a3ef9298792b71066c88326) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_5_std_771.ic12", 0xf000, 0x1000, CRC(689ce2aa) SHA1(b70d2553f731f9a20ddaf9af2f93b7e9c44d4d99) ) @@ -3138,19 +3134,19 @@ Uses a standard D-9144 ROM Board Assembly, see Joust or Robotron above */ ROM_START( splat ) // Solid Brown labels - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "splat_rom_1b_16-3011-1.e4", 0x00000, 0x1000, CRC(1cf26e48) SHA1(6ba4de6cc7d1359ed450da7bae1000552373f873) ) + ROM_LOAD( "splat_rom_2b_16-3011-2.c4", 0x01000, 0x1000, CRC(ac0d4276) SHA1(710aba98909d5d63c4b9b08579021f9c026b3111) ) + ROM_LOAD( "splat_rom_3b_16-3011-3.a4", 0x02000, 0x1000, CRC(74873e59) SHA1(727c9da682fd10353f3969ef02e9f1826d8cb77a) ) + ROM_LOAD( "splat_rom_4b_16-3011-4.e5", 0x03000, 0x1000, CRC(70a7064e) SHA1(7e6440585462b68b62d6d571d83635bf17149f1a) ) + ROM_LOAD( "splat_rom_5b_16-3011-5.c5", 0x04000, 0x1000, CRC(c6895221) SHA1(6f88ba8ac72d9301760d6e2512549f70b5373c65) ) + ROM_LOAD( "splat_rom_6b_16-3011-6.a5", 0x05000, 0x1000, CRC(ea4ab7fd) SHA1(288a361691a7f147ff3346627a10531d613ad017) ) + ROM_LOAD( "splat_rom_7b_16-3011-7.e6", 0x06000, 0x1000, CRC(82fd8713) SHA1(c4d42b111a0357700ac2bf700117d75ffb3c5be5) ) + ROM_LOAD( "splat_rom_8b_16-3011-8.c6", 0x07000, 0x1000, CRC(7dded1b4) SHA1(73df546dd60870f63a8c3deffea2b2d13149a48b) ) + ROM_LOAD( "splat_rom_9b_16-3011-9.a6", 0x08000, 0x1000, CRC(71cbfe5a) SHA1(bf22bedeceffdccc340637098070b32e9c13cf68) ) ROM_LOAD( "splat_rom_10b_16-3011-10.a7", 0x0d000, 0x1000, CRC(d1a1f632) SHA1(de4f5ba2b92c47757dfd2ca810bf8f87338223f7) ) ROM_LOAD( "splat_rom_11b_16-3011-11.c7", 0x0e000, 0x1000, CRC(ca8cde95) SHA1(8e12f6d9eaf397646691ec5d02963b32973cb32e) ) ROM_LOAD( "splat_rom_12b_16-3011-12.e7", 0x0f000, 0x1000, CRC(5bee3e60) SHA1(b4ee99fb6c353093faf1e088bab82fec66e785bc) ) - ROM_LOAD( "splat_rom_1b_16-3011-1.e4", 0x10000, 0x1000, CRC(1cf26e48) SHA1(6ba4de6cc7d1359ed450da7bae1000552373f873) ) - ROM_LOAD( "splat_rom_2b_16-3011-2.c4", 0x11000, 0x1000, CRC(ac0d4276) SHA1(710aba98909d5d63c4b9b08579021f9c026b3111) ) - ROM_LOAD( "splat_rom_3b_16-3011-3.a4", 0x12000, 0x1000, CRC(74873e59) SHA1(727c9da682fd10353f3969ef02e9f1826d8cb77a) ) - ROM_LOAD( "splat_rom_4b_16-3011-4.e5", 0x13000, 0x1000, CRC(70a7064e) SHA1(7e6440585462b68b62d6d571d83635bf17149f1a) ) - ROM_LOAD( "splat_rom_5b_16-3011-5.c5", 0x14000, 0x1000, CRC(c6895221) SHA1(6f88ba8ac72d9301760d6e2512549f70b5373c65) ) - ROM_LOAD( "splat_rom_6b_16-3011-6.a5", 0x15000, 0x1000, CRC(ea4ab7fd) SHA1(288a361691a7f147ff3346627a10531d613ad017) ) - ROM_LOAD( "splat_rom_7b_16-3011-7.e6", 0x16000, 0x1000, CRC(82fd8713) SHA1(c4d42b111a0357700ac2bf700117d75ffb3c5be5) ) - ROM_LOAD( "splat_rom_8b_16-3011-8.c6", 0x17000, 0x1000, CRC(7dded1b4) SHA1(73df546dd60870f63a8c3deffea2b2d13149a48b) ) - ROM_LOAD( "splat_rom_9b_16-3011-9.a6", 0x18000, 0x1000, CRC(71cbfe5a) SHA1(bf22bedeceffdccc340637098070b32e9c13cf68) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "video_sound_rom_13_std.ic12", 0xf000, 0x1000, CRC(a878d5f3) SHA1(f3347a354cb54ca228fe0971f0ae3bc778e2aecf) ) // Instruction Manual 16-3011-101 states "ROM 13" P/N A-5342-10127 @@ -3202,18 +3198,18 @@ If you disconnect the speech ROMs from the upright sound board, Video Sound ROM */ ROM_START( sinistar ) // rev. 3 - ROM_REGION( 0x19000, "maincpu", 0 ) // solid RED labels with final production part numbers + ROM_REGION( 0x10000, "maincpu", 0 ) // solid RED labels with final production part numbers + ROM_LOAD( "sinistar_rom_1-b_16-3004-53.1d", 0x00000, 0x1000, CRC(f6f3a22c) SHA1(026d8cab07734fa294a5645edbe65a904bcbc302) ) + ROM_LOAD( "sinistar_rom_2-b_16-3004-54.1c", 0x01000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) + ROM_LOAD( "sinistar_rom_3-b_16-3004-55.1a", 0x02000, 0x1000, CRC(1ce1b3cc) SHA1(5bc03d7249529d827dc60c087e074ab3e4ea7361) ) + ROM_LOAD( "sinistar_rom_4-b_16-3004-56.2d", 0x03000, 0x1000, CRC(6da632ba) SHA1(72c0c3d5a5ca87ca4d95fcedaf834206e4633950) ) + ROM_LOAD( "sinistar_rom_5-b_16-3004-57.2c", 0x04000, 0x1000, CRC(b662e8fc) SHA1(828a89d2ea13d8a362dae708f86bff54cb231887) ) + ROM_LOAD( "sinistar_rom_6-b_16-3004-58.2a", 0x05000, 0x1000, CRC(2306183d) SHA1(703e29e6446856615760a4897c0f5d79cc7bdfb2) ) + ROM_LOAD( "sinistar_rom_7-b_16-3004-59.3d", 0x06000, 0x1000, CRC(e5dd918e) SHA1(bf4e2ada6a59d246218544d822ba5355da925924) ) + ROM_LOAD( "sinistar_rom_8-b_16-3004-60.3c", 0x07000, 0x1000, CRC(4785a787) SHA1(8c7eca656b2c23b0da41a8c7ce51a2735cab85a4) ) + ROM_LOAD( "sinistar_rom_9-b_16-3004-61.3a", 0x08000, 0x1000, CRC(50cb63ad) SHA1(96e28e4fef98fff2649741a266fa590e0313e3b0) ) ROM_LOAD( "sinistar_rom_10-b_16-3004-62.4c", 0x0e000, 0x1000, CRC(3d670417) SHA1(81802622bee8dbea5c0f08019d87d941dcdbe292) ) ROM_LOAD( "sinistar_rom_11-b_16-3004-63.4a", 0x0f000, 0x1000, CRC(3162bc50) SHA1(2f38e572ab9c731e38dfe9bad3cc8222a775c5ea) ) - ROM_LOAD( "sinistar_rom_1-b_16-3004-53.1d", 0x10000, 0x1000, CRC(f6f3a22c) SHA1(026d8cab07734fa294a5645edbe65a904bcbc302) ) - ROM_LOAD( "sinistar_rom_2-b_16-3004-54.1c", 0x11000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) - ROM_LOAD( "sinistar_rom_3-b_16-3004-55.1a", 0x12000, 0x1000, CRC(1ce1b3cc) SHA1(5bc03d7249529d827dc60c087e074ab3e4ea7361) ) - ROM_LOAD( "sinistar_rom_4-b_16-3004-56.2d", 0x13000, 0x1000, CRC(6da632ba) SHA1(72c0c3d5a5ca87ca4d95fcedaf834206e4633950) ) - ROM_LOAD( "sinistar_rom_5-b_16-3004-57.2c", 0x14000, 0x1000, CRC(b662e8fc) SHA1(828a89d2ea13d8a362dae708f86bff54cb231887) ) - ROM_LOAD( "sinistar_rom_6-b_16-3004-58.2a", 0x15000, 0x1000, CRC(2306183d) SHA1(703e29e6446856615760a4897c0f5d79cc7bdfb2) ) - ROM_LOAD( "sinistar_rom_7-b_16-3004-59.3d", 0x16000, 0x1000, CRC(e5dd918e) SHA1(bf4e2ada6a59d246218544d822ba5355da925924) ) - ROM_LOAD( "sinistar_rom_8-b_16-3004-60.3c", 0x17000, 0x1000, CRC(4785a787) SHA1(8c7eca656b2c23b0da41a8c7ce51a2735cab85a4) ) - ROM_LOAD( "sinistar_rom_9-b_16-3004-61.3a", 0x18000, 0x1000, CRC(50cb63ad) SHA1(96e28e4fef98fff2649741a266fa590e0313e3b0) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "3004_speech_ic7_r1_16-3004-52.ic7", 0xb000, 0x1000, CRC(e1019568) SHA1(442f4f3ccd2e1db2136d2ffb121ea442921f87ca) ) @@ -3228,18 +3224,18 @@ ROM_START( sinistar ) // rev. 3 ROM_END ROM_START( sinistarc ) // rev. 3 - ROM_REGION( 0x19000, "maincpu", 0 ) // solid RED labels with final production part numbers + ROM_REGION( 0x10000, "maincpu", 0 ) // solid RED labels with final production part numbers + ROM_LOAD( "sinistar_rom_1-b_16-3004-53.1d", 0x00000, 0x1000, CRC(f6f3a22c) SHA1(026d8cab07734fa294a5645edbe65a904bcbc302) ) + ROM_LOAD( "sinistar_rom_2-b_16-3004-54.1c", 0x01000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) + ROM_LOAD( "sinistar_rom_3-b_16-3004-55.1a", 0x02000, 0x1000, CRC(1ce1b3cc) SHA1(5bc03d7249529d827dc60c087e074ab3e4ea7361) ) + ROM_LOAD( "sinistar_rom_4-b_16-3004-56.2d", 0x03000, 0x1000, CRC(6da632ba) SHA1(72c0c3d5a5ca87ca4d95fcedaf834206e4633950) ) + ROM_LOAD( "sinistar_rom_5-b_16-3004-57.2c", 0x04000, 0x1000, CRC(b662e8fc) SHA1(828a89d2ea13d8a362dae708f86bff54cb231887) ) + ROM_LOAD( "sinistar_rom_6-b_16-3004-58.2a", 0x05000, 0x1000, CRC(2306183d) SHA1(703e29e6446856615760a4897c0f5d79cc7bdfb2) ) + ROM_LOAD( "sinistar_rom_7-b_16-3004-59.3d", 0x06000, 0x1000, CRC(e5dd918e) SHA1(bf4e2ada6a59d246218544d822ba5355da925924) ) + ROM_LOAD( "sinistar_rom_8-b_16-3004-60.3c", 0x07000, 0x1000, CRC(4785a787) SHA1(8c7eca656b2c23b0da41a8c7ce51a2735cab85a4) ) + ROM_LOAD( "sinistar_rom_9-b_16-3004-61.3a", 0x08000, 0x1000, CRC(50cb63ad) SHA1(96e28e4fef98fff2649741a266fa590e0313e3b0) ) ROM_LOAD( "sinistar_rom_10-b_16-3004-62.4c", 0x0e000, 0x1000, CRC(3d670417) SHA1(81802622bee8dbea5c0f08019d87d941dcdbe292) ) ROM_LOAD( "sinistar_rom_11-b_16-3004-63.4a", 0x0f000, 0x1000, CRC(3162bc50) SHA1(2f38e572ab9c731e38dfe9bad3cc8222a775c5ea) ) - ROM_LOAD( "sinistar_rom_1-b_16-3004-53.1d", 0x10000, 0x1000, CRC(f6f3a22c) SHA1(026d8cab07734fa294a5645edbe65a904bcbc302) ) - ROM_LOAD( "sinistar_rom_2-b_16-3004-54.1c", 0x11000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) - ROM_LOAD( "sinistar_rom_3-b_16-3004-55.1a", 0x12000, 0x1000, CRC(1ce1b3cc) SHA1(5bc03d7249529d827dc60c087e074ab3e4ea7361) ) - ROM_LOAD( "sinistar_rom_4-b_16-3004-56.2d", 0x13000, 0x1000, CRC(6da632ba) SHA1(72c0c3d5a5ca87ca4d95fcedaf834206e4633950) ) - ROM_LOAD( "sinistar_rom_5-b_16-3004-57.2c", 0x14000, 0x1000, CRC(b662e8fc) SHA1(828a89d2ea13d8a362dae708f86bff54cb231887) ) - ROM_LOAD( "sinistar_rom_6-b_16-3004-58.2a", 0x15000, 0x1000, CRC(2306183d) SHA1(703e29e6446856615760a4897c0f5d79cc7bdfb2) ) - ROM_LOAD( "sinistar_rom_7-b_16-3004-59.3d", 0x16000, 0x1000, CRC(e5dd918e) SHA1(bf4e2ada6a59d246218544d822ba5355da925924) ) - ROM_LOAD( "sinistar_rom_8-b_16-3004-60.3c", 0x17000, 0x1000, CRC(4785a787) SHA1(8c7eca656b2c23b0da41a8c7ce51a2735cab85a4) ) - ROM_LOAD( "sinistar_rom_9-b_16-3004-61.3a", 0x18000, 0x1000, CRC(50cb63ad) SHA1(96e28e4fef98fff2649741a266fa590e0313e3b0) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "3004_speech_ic7_r1_16-3004-52.ic7", 0xb000, 0x1000, CRC(e1019568) SHA1(442f4f3ccd2e1db2136d2ffb121ea442921f87ca) ) @@ -3257,18 +3253,18 @@ ROM_START( sinistarc ) // rev. 3 ROM_END ROM_START( sinistar2 ) // rev. 2 - ROM_REGION( 0x19000, "maincpu", 0 ) // solid RED labels with final production part numbers + ROM_REGION( 0x10000, "maincpu", 0 ) // solid RED labels with final production part numbers + ROM_LOAD( "sinistar_rom_1-b_16-3004-38.1d", 0x00000, 0x1000, CRC(f6f3a22c) SHA1(026d8cab07734fa294a5645edbe65a904bcbc302) ) // == rev. 3 PN 16-3004-53 + ROM_LOAD( "sinistar_rom_2-b_16-3004-39.1c", 0x01000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) // == rev. 3 PN 16-3004-54 + ROM_LOAD( "sinistar_rom_3-b_16-3004-40.1a", 0x02000, 0x1000, CRC(1ce1b3cc) SHA1(5bc03d7249529d827dc60c087e074ab3e4ea7361) ) // == rev. 3 PN 16-3004-55 + ROM_LOAD( "sinistar_rom_4-b_16-3004-41.2d", 0x03000, 0x1000, CRC(6da632ba) SHA1(72c0c3d5a5ca87ca4d95fcedaf834206e4633950) ) // == rev. 3 PN 16-3004-56 + ROM_LOAD( "sinistar_rom_5-b_16-3004-42.2c", 0x04000, 0x1000, CRC(b662e8fc) SHA1(828a89d2ea13d8a362dae708f86bff54cb231887) ) // == rev. 3 PN 16-3004-57 + ROM_LOAD( "sinistar_rom_6-b_16-3004-43.2a", 0x05000, 0x1000, CRC(2306183d) SHA1(703e29e6446856615760a4897c0f5d79cc7bdfb2) ) // == rev. 3 PN 16-3004-57 + ROM_LOAD( "sinistar_rom_7-b_16-3004-44.3d", 0x06000, 0x1000, CRC(e5dd918e) SHA1(bf4e2ada6a59d246218544d822ba5355da925924) ) // == rev. 3 PN 16-3004-59 + ROM_LOAD( "sinistar_rom_8-b_16-3004-45.3c", 0x07000, 0x1000, CRC(d7ecee45) SHA1(f9552035409bce0a36ed93a677b28f8cd361f8f1) ) // unique to rev. 2 + ROM_LOAD( "sinistar_rom_9-b_16-3004-46.3a", 0x08000, 0x1000, CRC(50cb63ad) SHA1(96e28e4fef98fff2649741a266fa590e0313e3b0) ) // == rev. 3 PN 16-3004-61 ROM_LOAD( "sinistar_rom_10-b_16-3004-47.4c", 0x0e000, 0x1000, CRC(3d670417) SHA1(81802622bee8dbea5c0f08019d87d941dcdbe292) ) // == rev. 3 PN 16-3004-62 ROM_LOAD( "sinistar_rom_11-b_16-3004-48.4a", 0x0f000, 0x1000, CRC(792c8b00) SHA1(1f847ca8a67595927c36d69cead02813c2431c7b) ) // unique to rev. 2 - ROM_LOAD( "sinistar_rom_1-b_16-3004-38.1d", 0x10000, 0x1000, CRC(f6f3a22c) SHA1(026d8cab07734fa294a5645edbe65a904bcbc302) ) // == rev. 3 PN 16-3004-53 - ROM_LOAD( "sinistar_rom_2-b_16-3004-39.1c", 0x11000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) // == rev. 3 PN 16-3004-54 - ROM_LOAD( "sinistar_rom_3-b_16-3004-40.1a", 0x12000, 0x1000, CRC(1ce1b3cc) SHA1(5bc03d7249529d827dc60c087e074ab3e4ea7361) ) // == rev. 3 PN 16-3004-55 - ROM_LOAD( "sinistar_rom_4-b_16-3004-41.2d", 0x13000, 0x1000, CRC(6da632ba) SHA1(72c0c3d5a5ca87ca4d95fcedaf834206e4633950) ) // == rev. 3 PN 16-3004-56 - ROM_LOAD( "sinistar_rom_5-b_16-3004-42.2c", 0x14000, 0x1000, CRC(b662e8fc) SHA1(828a89d2ea13d8a362dae708f86bff54cb231887) ) // == rev. 3 PN 16-3004-57 - ROM_LOAD( "sinistar_rom_6-b_16-3004-43.2a", 0x15000, 0x1000, CRC(2306183d) SHA1(703e29e6446856615760a4897c0f5d79cc7bdfb2) ) // == rev. 3 PN 16-3004-57 - ROM_LOAD( "sinistar_rom_7-b_16-3004-44.3d", 0x16000, 0x1000, CRC(e5dd918e) SHA1(bf4e2ada6a59d246218544d822ba5355da925924) ) // == rev. 3 PN 16-3004-59 - ROM_LOAD( "sinistar_rom_8-b_16-3004-45.3c", 0x17000, 0x1000, CRC(d7ecee45) SHA1(f9552035409bce0a36ed93a677b28f8cd361f8f1) ) // unique to rev. 2 - ROM_LOAD( "sinistar_rom_9-b_16-3004-46.3a", 0x18000, 0x1000, CRC(50cb63ad) SHA1(96e28e4fef98fff2649741a266fa590e0313e3b0) ) // == rev. 3 PN 16-3004-61 ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "3004_speech_ic7_r1_16-3004-52.ic7", 0xb000, 0x1000, CRC(e1019568) SHA1(442f4f3ccd2e1db2136d2ffb121ea442921f87ca) ) @@ -3283,18 +3279,18 @@ ROM_START( sinistar2 ) // rev. 2 ROM_END ROM_START( sinistarc2 ) // rev. 2 - ROM_REGION( 0x19000, "maincpu", 0 ) // solid RED labels with final production part numbers + ROM_REGION( 0x10000, "maincpu", 0 ) // solid RED labels with final production part numbers + ROM_LOAD( "sinistar_rom_1-b_16-3004-38.1d", 0x00000, 0x1000, CRC(f6f3a22c) SHA1(026d8cab07734fa294a5645edbe65a904bcbc302) ) // == rev. 3 PN 16-3004-53 + ROM_LOAD( "sinistar_rom_2-b_16-3004-39.1c", 0x01000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) // == rev. 3 PN 16-3004-54 + ROM_LOAD( "sinistar_rom_3-b_16-3004-40.1a", 0x02000, 0x1000, CRC(1ce1b3cc) SHA1(5bc03d7249529d827dc60c087e074ab3e4ea7361) ) // == rev. 3 PN 16-3004-55 + ROM_LOAD( "sinistar_rom_4-b_16-3004-41.2d", 0x03000, 0x1000, CRC(6da632ba) SHA1(72c0c3d5a5ca87ca4d95fcedaf834206e4633950) ) // == rev. 3 PN 16-3004-56 + ROM_LOAD( "sinistar_rom_5-b_16-3004-42.2c", 0x04000, 0x1000, CRC(b662e8fc) SHA1(828a89d2ea13d8a362dae708f86bff54cb231887) ) // == rev. 3 PN 16-3004-57 + ROM_LOAD( "sinistar_rom_6-b_16-3004-43.2a", 0x05000, 0x1000, CRC(2306183d) SHA1(703e29e6446856615760a4897c0f5d79cc7bdfb2) ) // == rev. 3 PN 16-3004-57 + ROM_LOAD( "sinistar_rom_7-b_16-3004-44.3d", 0x06000, 0x1000, CRC(e5dd918e) SHA1(bf4e2ada6a59d246218544d822ba5355da925924) ) // == rev. 3 PN 16-3004-59 + ROM_LOAD( "sinistar_rom_8-b_16-3004-45.3c", 0x07000, 0x1000, CRC(d7ecee45) SHA1(f9552035409bce0a36ed93a677b28f8cd361f8f1) ) // unique to rev. 2 + ROM_LOAD( "sinistar_rom_9-b_16-3004-46.3a", 0x08000, 0x1000, CRC(50cb63ad) SHA1(96e28e4fef98fff2649741a266fa590e0313e3b0) ) // == rev. 3 PN 16-3004-61 ROM_LOAD( "sinistar_rom_10-b_16-3004-47.4c", 0x0e000, 0x1000, CRC(3d670417) SHA1(81802622bee8dbea5c0f08019d87d941dcdbe292) ) // == rev. 3 PN 16-3004-62 ROM_LOAD( "sinistar_rom_11-b_16-3004-48.4a", 0x0f000, 0x1000, CRC(792c8b00) SHA1(1f847ca8a67595927c36d69cead02813c2431c7b) ) // unique to rev. 2 - ROM_LOAD( "sinistar_rom_1-b_16-3004-38.1d", 0x10000, 0x1000, CRC(f6f3a22c) SHA1(026d8cab07734fa294a5645edbe65a904bcbc302) ) // == rev. 3 PN 16-3004-53 - ROM_LOAD( "sinistar_rom_2-b_16-3004-39.1c", 0x11000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) // == rev. 3 PN 16-3004-54 - ROM_LOAD( "sinistar_rom_3-b_16-3004-40.1a", 0x12000, 0x1000, CRC(1ce1b3cc) SHA1(5bc03d7249529d827dc60c087e074ab3e4ea7361) ) // == rev. 3 PN 16-3004-55 - ROM_LOAD( "sinistar_rom_4-b_16-3004-41.2d", 0x13000, 0x1000, CRC(6da632ba) SHA1(72c0c3d5a5ca87ca4d95fcedaf834206e4633950) ) // == rev. 3 PN 16-3004-56 - ROM_LOAD( "sinistar_rom_5-b_16-3004-42.2c", 0x14000, 0x1000, CRC(b662e8fc) SHA1(828a89d2ea13d8a362dae708f86bff54cb231887) ) // == rev. 3 PN 16-3004-57 - ROM_LOAD( "sinistar_rom_6-b_16-3004-43.2a", 0x15000, 0x1000, CRC(2306183d) SHA1(703e29e6446856615760a4897c0f5d79cc7bdfb2) ) // == rev. 3 PN 16-3004-57 - ROM_LOAD( "sinistar_rom_7-b_16-3004-44.3d", 0x16000, 0x1000, CRC(e5dd918e) SHA1(bf4e2ada6a59d246218544d822ba5355da925924) ) // == rev. 3 PN 16-3004-59 - ROM_LOAD( "sinistar_rom_8-b_16-3004-45.3c", 0x17000, 0x1000, CRC(d7ecee45) SHA1(f9552035409bce0a36ed93a677b28f8cd361f8f1) ) // unique to rev. 2 - ROM_LOAD( "sinistar_rom_9-b_16-3004-46.3a", 0x18000, 0x1000, CRC(50cb63ad) SHA1(96e28e4fef98fff2649741a266fa590e0313e3b0) ) // == rev. 3 PN 16-3004-61 ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "3004_speech_ic7_r1_16-3004-52.ic7", 0xb000, 0x1000, CRC(e1019568) SHA1(442f4f3ccd2e1db2136d2ffb121ea442921f87ca) ) @@ -3312,18 +3308,18 @@ ROM_START( sinistarc2 ) // rev. 2 ROM_END ROM_START( sinistarp ) // solid pink labels - 1982 AMOA prototype - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sinistar_rom_1-b_16-3004-12.1d", 0x00000, 0x1000, CRC(3810d7b8) SHA1(dcd690cbc958a2f97f022765315d77fb7c7d8e8b) ) + ROM_LOAD( "sinistar_rom_2-b_16-3004-13.1c", 0x01000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) // only this one ROM remains the same through to rev. 3 + ROM_LOAD( "sinistar_rom_3-b_16-3004-14.1a", 0x02000, 0x1000, CRC(7c984ca9) SHA1(b32b7d15194051db5d29acf95b049e2eccf6d393) ) + ROM_LOAD( "sinistar_rom_4-b_16-3004-15.2d", 0x03000, 0x1000, CRC(cc6c4f24) SHA1(b4375544e02a19458c6fcc85edb31025c0b8eb71) ) + ROM_LOAD( "sinistar_rom_5-b_16-3004-16.2c", 0x04000, 0x1000, CRC(12285bfe) SHA1(6d433103332ddda2f2af23febc0b15aa93db1f31) ) + ROM_LOAD( "sinistar_rom_6-b_16-3004-17.2a", 0x05000, 0x1000, CRC(7a675f35) SHA1(3a7e9fdb2aef52dc29d33799694737038802b6e0) ) + ROM_LOAD( "sinistar_rom_7-b_16-3004-18.3d", 0x06000, 0x1000, CRC(b0463243) SHA1(95d597856a1942bd176f5f62db0d691f8f2f2932) ) + ROM_LOAD( "sinistar_rom_8-b_16-3004-19.3c", 0x07000, 0x1000, CRC(909040d4) SHA1(5361cc378bdace0799227e901341747dce9bb029) ) + ROM_LOAD( "sinistar_rom_9-b_16-3004-20.3a", 0x08000, 0x1000, CRC(cc949810) SHA1(2d2d1cccd7e43b63e424c34ab5215a412e2b9809) ) ROM_LOAD( "sinistar_rom_10-b_16-3004-21.4c", 0x0e000, 0x1000, CRC(ea87a53f) SHA1(4e4bad5315a8f5740c926ee5681879919a5be37f) ) ROM_LOAD( "sinistar_rom_11-b_16-3004-22.4a", 0x0f000, 0x1000, CRC(88d36e80) SHA1(bb9adaf5b73f9874e52dc2f5fd35e22f8b4fc258) ) - ROM_LOAD( "sinistar_rom_1-b_16-3004-12.1d", 0x10000, 0x1000, CRC(3810d7b8) SHA1(dcd690cbc958a2f97f022765315d77fb7c7d8e8b) ) - ROM_LOAD( "sinistar_rom_2-b_16-3004-13.1c", 0x11000, 0x1000, CRC(cab3185c) SHA1(423d1e3b0c07333ec582529bc4d0b7baf591820a) ) // only this one ROM remains the same through to rev. 3 - ROM_LOAD( "sinistar_rom_3-b_16-3004-14.1a", 0x12000, 0x1000, CRC(7c984ca9) SHA1(b32b7d15194051db5d29acf95b049e2eccf6d393) ) - ROM_LOAD( "sinistar_rom_4-b_16-3004-15.2d", 0x13000, 0x1000, CRC(cc6c4f24) SHA1(b4375544e02a19458c6fcc85edb31025c0b8eb71) ) - ROM_LOAD( "sinistar_rom_5-b_16-3004-16.2c", 0x14000, 0x1000, CRC(12285bfe) SHA1(6d433103332ddda2f2af23febc0b15aa93db1f31) ) - ROM_LOAD( "sinistar_rom_6-b_16-3004-17.2a", 0x15000, 0x1000, CRC(7a675f35) SHA1(3a7e9fdb2aef52dc29d33799694737038802b6e0) ) - ROM_LOAD( "sinistar_rom_7-b_16-3004-18.3d", 0x16000, 0x1000, CRC(b0463243) SHA1(95d597856a1942bd176f5f62db0d691f8f2f2932) ) - ROM_LOAD( "sinistar_rom_8-b_16-3004-19.3c", 0x17000, 0x1000, CRC(909040d4) SHA1(5361cc378bdace0799227e901341747dce9bb029) ) - ROM_LOAD( "sinistar_rom_9-b_16-3004-20.3a", 0x18000, 0x1000, CRC(cc949810) SHA1(2d2d1cccd7e43b63e424c34ab5215a412e2b9809) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "3004_speech_ic7_r1.ic7", 0xb000, 0x1000, CRC(e1019568) SHA1(442f4f3ccd2e1db2136d2ffb121ea442921f87ca) ) // same data as later sets, but no official part number assigned yet @@ -3339,19 +3335,19 @@ ROM_END ROM_START( playball ) - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "playball.01", 0x00000, 0x1000, CRC(7ba8fd71) SHA1(9b77996238c67aead8c2cfc7f964f8cf9c6182eb) ) + ROM_LOAD( "playball.02", 0x01000, 0x1000, CRC(2387c3d4) SHA1(19d9da6af317595d0f3336e886154e0b8467cb3e) ) + ROM_LOAD( "playball.03", 0x02000, 0x1000, CRC(d34cc5fd) SHA1(d1f6d321c1a6a04a06813c77a3e079836a05956c) ) + ROM_LOAD( "playball.04", 0x03000, 0x1000, CRC(f68c3a8e) SHA1(f9cc7250254b9adceff883d3f6ee01c475d859ec) ) + ROM_LOAD( "playball.05", 0x04000, 0x1000, CRC(a3f20810) SHA1(678d2a5a06263cc5f74f4cb92287cf4d7a8b934f) ) + ROM_LOAD( "playball.06", 0x05000, 0x1000, CRC(f213e48e) SHA1(05b54f5121a887bc24fbe30f322277ae94474c14) ) + ROM_LOAD( "playball.07", 0x06000, 0x1000, CRC(9b5574e9) SHA1(1dddd33cd3f13694d7ba6a73e5090594c6677d5b) ) + ROM_LOAD( "playball.08", 0x07000, 0x1000, CRC(b2d2074a) SHA1(2defb2ffaca782606f792020f9c96d41abd77518) ) + ROM_LOAD( "playball.09", 0x08000, 0x1000, CRC(c4566d0f) SHA1(7848ea87d2d1693ade9129846024fbedc4145cbb) ) ROM_LOAD( "playball.10", 0x0d000, 0x1000, CRC(18787b52) SHA1(621754c1eab68de12763616b7bf01948cdce0221) ) ROM_LOAD( "playball.11", 0x0e000, 0x1000, CRC(1dd5c8f2) SHA1(17d0380ea05d9ddd17576691d0e5179ae7a71200) ) ROM_LOAD( "playball.12", 0x0f000, 0x1000, CRC(a700597b) SHA1(5ba07409ae9315b9ee65530f61155c394bfc69ad) ) - ROM_LOAD( "playball.01", 0x10000, 0x1000, CRC(7ba8fd71) SHA1(9b77996238c67aead8c2cfc7f964f8cf9c6182eb) ) - ROM_LOAD( "playball.02", 0x11000, 0x1000, CRC(2387c3d4) SHA1(19d9da6af317595d0f3336e886154e0b8467cb3e) ) - ROM_LOAD( "playball.03", 0x12000, 0x1000, CRC(d34cc5fd) SHA1(d1f6d321c1a6a04a06813c77a3e079836a05956c) ) - ROM_LOAD( "playball.04", 0x13000, 0x1000, CRC(f68c3a8e) SHA1(f9cc7250254b9adceff883d3f6ee01c475d859ec) ) - ROM_LOAD( "playball.05", 0x14000, 0x1000, CRC(a3f20810) SHA1(678d2a5a06263cc5f74f4cb92287cf4d7a8b934f) ) - ROM_LOAD( "playball.06", 0x15000, 0x1000, CRC(f213e48e) SHA1(05b54f5121a887bc24fbe30f322277ae94474c14) ) - ROM_LOAD( "playball.07", 0x16000, 0x1000, CRC(9b5574e9) SHA1(1dddd33cd3f13694d7ba6a73e5090594c6677d5b) ) - ROM_LOAD( "playball.08", 0x17000, 0x1000, CRC(b2d2074a) SHA1(2defb2ffaca782606f792020f9c96d41abd77518) ) - ROM_LOAD( "playball.09", 0x18000, 0x1000, CRC(c4566d0f) SHA1(7848ea87d2d1693ade9129846024fbedc4145cbb) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "speech.ic4", 0xb000, 0x1000, CRC(7e4fc798) SHA1(4636ab25238503370063f51f86f37d0e49c0d3b6) ) @@ -3363,26 +3359,26 @@ ROM_END ROM_START( blaster ) // 20 Level version - Each ROM label had an additional "PROTO5" or "PROTO6" sticker attached (verified on multiple PCBs) - ROM_REGION( 0x54000, "maincpu", 0 ) + ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_LOAD( "proto6_blaster_3021_rom_11.ic25", 0x04000, 0x2000, CRC(6371e62f) SHA1(dc4173d2ee88757a6ac0838acaee325eadc2c4fb) ) // labeled: BLASTER (3021) ROM 11 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 + ROM_LOAD( "proto6_blaster_3021_rom_12.ic26", 0x06000, 0x2000, CRC(9804faac) SHA1(e61218fe190ad268af48d611d140d8f4cd38e4c7) ) // labeled: BLASTER (3021) ROM 12 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 + ROM_LOAD( "proto6_blaster_3021_rom_17.ic41", 0x08000, 0x1000, CRC(bf96182f) SHA1(e25a02508eecf79ea1ae5d45278a60becc6c7dcc) ) // labeled: BLASTER (3021) ROM 17 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 + ROM_LOAD( "proto6_blaster_3021_rom_16.ic39", 0x0d000, 0x1000, CRC(54a40b21) SHA1(663c7b539e6f1f065a4ecae7bb0477c71951223f) ) // labeled: BLASTER (3021) ROM 16 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 ROM_LOAD( "proto6_blaster_3021_rom_13.ic27", 0x0e000, 0x2000, CRC(f4dae4c8) SHA1(211dcbe085a30419d649afe10ca7c4017d909bd7) ) // labeled: BLASTER (3021) ROM 13 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 - ROM_LOAD( "proto6_blaster_3021_rom_11.ic25", 0x10000, 0x2000, CRC(6371e62f) SHA1(dc4173d2ee88757a6ac0838acaee325eadc2c4fb) ) // labeled: BLASTER (3021) ROM 11 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 - ROM_LOAD( "proto6_blaster_3021_rom_12.ic26", 0x12000, 0x2000, CRC(9804faac) SHA1(e61218fe190ad268af48d611d140d8f4cd38e4c7) ) // labeled: BLASTER (3021) ROM 12 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 - ROM_LOAD( "proto6_blaster_3021_rom_17.ic41", 0x14000, 0x1000, CRC(bf96182f) SHA1(e25a02508eecf79ea1ae5d45278a60becc6c7dcc) ) // labeled: BLASTER (3021) ROM 17 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 - - ROM_LOAD( "proto5_blaster_3021_rom_15.ic38", 0x18000, 0x4000, CRC(1ad146a4) SHA1(5ab3d9618023b59bc329a9eeef986901867a639b) ) // labeled: BLASTER (3021) ROM 15 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 - ROM_LOAD( "proto5_blaster_3021_rom_8.ic20", 0x1c000, 0x4000, CRC(f110bbb0) SHA1(314dea232a3706509399348c7415f933c64cea1b) ) // labeled: BLASTER (3021) ROM 8 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 - ROM_LOAD( "proto5_blaster_3021_rom_9.ic22", 0x20000, 0x4000, CRC(5c5b0f8a) SHA1(224f89c85b2b1ca511d006180b8d994fccbdfb6b) ) // labeled: BLASTER (3021) ROM 9 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 - ROM_LOAD( "proto5_blaster_3021_rom_10.ic24", 0x24000, 0x4000, CRC(d47eb67f) SHA1(5dcde8be1a7b1927b90ffab3219dc47c5b2f20e4) ) // labeled: BLASTER (3021) ROM 10 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 - ROM_LOAD( "proto5_blaster_3021_rom_6.ic13", 0x28000, 0x4000, CRC(47fc007e) SHA1(3a80b9b7ae460e9732f7c1cdd465a5b06ded970f) ) // labeled: BLASTER (3021) ROM 6 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 - ROM_LOAD( "proto5_blaster_3021_rom_5.ic11", 0x2c000, 0x4000, CRC(15c1b94d) SHA1(5d97628541eb8933870c3ffd3646b7aaf8af6af5) ) // labeled: BLASTER (3021) ROM 5 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 - ROM_LOAD( "proto5_blaster_3021_rom_14.ic35", 0x30000, 0x4000, CRC(aea6b846) SHA1(04cb4b5eb000471a0cec377a5236ac8c83529528) ) // labeled: BLASTER (3021) ROM 14 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 - ROM_LOAD( "proto6_blaster_3021_rom_7.ic15", 0x34000, 0x4000, CRC(7a101181) SHA1(5f1581911ea7fe3e63ce1b9c50b1d3bf081dbf81) ) // labeled: BLASTER (3021) ROM 7 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 - ROM_LOAD( "proto5_blaster_3021_rom_1.ic1", 0x38000, 0x4000, CRC(8d0ea9e7) SHA1(34f8e2e99748bed29285f7e4929bb920960ab03e) ) // labeled: BLASTER (3021) ROM 1 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 - ROM_LOAD( "proto5_blaster_3021_rom_2.ic3", 0x3c000, 0x4000, CRC(03c4012c) SHA1(53f0adc91e5f1ac58b08b3a6d2de8de5a40bebab) ) // labeled: BLASTER (3021) ROM 2 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 - ROM_LOAD( "proto6_blaster_3021_rom_4.ic7", 0x40000, 0x4000, CRC(fc9d39fb) SHA1(126d43a64471bbf4b40aeda8913d50e82d254f9c) ) // labeled: BLASTER (3021) ROM 4 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 - ROM_LOAD( "proto6_blaster_3021_rom_3.ic6", 0x44000, 0x4000, CRC(253690fb) SHA1(06cb2ef95bb06b3618392e298aa690e1f75bc977) ) // labeled: BLASTER (3021) ROM 3 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 + ROM_LOAD( "proto5_blaster_3021_rom_15.ic38", 0x10000, 0x4000, CRC(1ad146a4) SHA1(5ab3d9618023b59bc329a9eeef986901867a639b) ) // labeled: BLASTER (3021) ROM 15 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 + ROM_LOAD( "proto5_blaster_3021_rom_8.ic20", 0x14000, 0x4000, CRC(f110bbb0) SHA1(314dea232a3706509399348c7415f933c64cea1b) ) // labeled: BLASTER (3021) ROM 8 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 + ROM_LOAD( "proto5_blaster_3021_rom_9.ic22", 0x18000, 0x4000, CRC(5c5b0f8a) SHA1(224f89c85b2b1ca511d006180b8d994fccbdfb6b) ) // labeled: BLASTER (3021) ROM 9 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 + ROM_LOAD( "proto5_blaster_3021_rom_10.ic24", 0x1c000, 0x4000, CRC(d47eb67f) SHA1(5dcde8be1a7b1927b90ffab3219dc47c5b2f20e4) ) // labeled: BLASTER (3021) ROM 10 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 + ROM_LOAD( "proto5_blaster_3021_rom_6.ic13", 0x20000, 0x4000, CRC(47fc007e) SHA1(3a80b9b7ae460e9732f7c1cdd465a5b06ded970f) ) // labeled: BLASTER (3021) ROM 6 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 + ROM_LOAD( "proto5_blaster_3021_rom_5.ic11", 0x24000, 0x4000, CRC(15c1b94d) SHA1(5d97628541eb8933870c3ffd3646b7aaf8af6af5) ) // labeled: BLASTER (3021) ROM 5 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 + ROM_LOAD( "proto5_blaster_3021_rom_14.ic35", 0x28000, 0x4000, CRC(aea6b846) SHA1(04cb4b5eb000471a0cec377a5236ac8c83529528) ) // labeled: BLASTER (3021) ROM 14 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 + ROM_LOAD( "proto6_blaster_3021_rom_7.ic15", 0x2c000, 0x4000, CRC(7a101181) SHA1(5f1581911ea7fe3e63ce1b9c50b1d3bf081dbf81) ) // labeled: BLASTER (3021) ROM 7 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 + ROM_LOAD( "proto5_blaster_3021_rom_1.ic1", 0x30000, 0x4000, CRC(8d0ea9e7) SHA1(34f8e2e99748bed29285f7e4929bb920960ab03e) ) // labeled: BLASTER (3021) ROM 1 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 + ROM_LOAD( "proto5_blaster_3021_rom_2.ic3", 0x34000, 0x4000, CRC(03c4012c) SHA1(53f0adc91e5f1ac58b08b3a6d2de8de5a40bebab) ) // labeled: BLASTER (3021) ROM 2 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 + ROM_LOAD( "proto6_blaster_3021_rom_4.ic7", 0x38000, 0x4000, CRC(fc9d39fb) SHA1(126d43a64471bbf4b40aeda8913d50e82d254f9c) ) // labeled: BLASTER (3021) ROM 4 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 + ROM_LOAD( "proto6_blaster_3021_rom_3.ic6", 0x3c000, 0x4000, CRC(253690fb) SHA1(06cb2ef95bb06b3618392e298aa690e1f75bc977) ) // labeled: BLASTER (3021) ROM 3 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO6 ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "proto5_blaster_3021_rom_18.sb13", 0xf000, 0x1000, CRC(c33a3145) SHA1(6ffe2da7b70c0b576fbc1790a33eecdbb9ee3d02) ) // labeled: BLASTER (3021) ROM 18 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 @@ -3397,26 +3393,26 @@ ROM_START( blaster ) // 20 Level version - Each ROM label had an additional "PRO ROM_END ROM_START( blastero ) // 30 Level version - ROM_REGION( 0x54000, "maincpu", 0 ) + ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_LOAD( "proto5_blaster_3021_rom_11.ic25", 0x04000, 0x2000, CRC(bc2d7eda) SHA1(831e9ecb75b143f9770eab1939136092a29e64f7) ) // assumed to be PROTO5 revision + ROM_LOAD( "proto5_blaster_3021_rom_12.ic26", 0x06000, 0x2000, CRC(8a215017) SHA1(ee9233134907c03f7a1221d9daa84fe047c2db94) ) // assumed to be PROTO5 revision + ROM_LOAD( "proto5_blaster_3021_rom_17.ic41", 0x08000, 0x1000, CRC(b308f0e5) SHA1(262e25be40dff66e65a0fe34c9d013a750b90876) ) // assumed to be PROTO5 revision + ROM_LOAD( "proto5_blaster_3021_rom_16.ic39", 0x0d000, 0x1000, CRC(2db032d2) SHA1(287769361639695b1c1ceae0fe6899d83b4575d5) ) // assumed to be PROTO5 revision ROM_LOAD( "proto5_blaster_3021_rom_13.ic27", 0x0e000, 0x2000, CRC(c99213c7) SHA1(d1c1549c053de3d862d8ef3ebca02811ed289464) ) // assumed to be PROTO5 revision - ROM_LOAD( "proto5_blaster_3021_rom_11.ic25", 0x10000, 0x2000, CRC(bc2d7eda) SHA1(831e9ecb75b143f9770eab1939136092a29e64f7) ) // assumed to be PROTO5 revision - ROM_LOAD( "proto5_blaster_3021_rom_12.ic26", 0x12000, 0x2000, CRC(8a215017) SHA1(ee9233134907c03f7a1221d9daa84fe047c2db94) ) // assumed to be PROTO5 revision - ROM_LOAD( "proto5_blaster_3021_rom_17.ic41", 0x14000, 0x1000, CRC(b308f0e5) SHA1(262e25be40dff66e65a0fe34c9d013a750b90876) ) // assumed to be PROTO5 revision - - ROM_LOAD( "proto5_blaster_3021_rom_15.ic38", 0x18000, 0x4000, CRC(1ad146a4) SHA1(5ab3d9618023b59bc329a9eeef986901867a639b) ) - ROM_LOAD( "proto5_blaster_3021_rom_8.ic20", 0x1c000, 0x4000, CRC(f110bbb0) SHA1(314dea232a3706509399348c7415f933c64cea1b) ) - ROM_LOAD( "proto5_blaster_3021_rom_9.ic22", 0x20000, 0x4000, CRC(5c5b0f8a) SHA1(224f89c85b2b1ca511d006180b8d994fccbdfb6b) ) - ROM_LOAD( "proto5_blaster_3021_rom_10.ic24", 0x24000, 0x4000, CRC(d47eb67f) SHA1(5dcde8be1a7b1927b90ffab3219dc47c5b2f20e4) ) - ROM_LOAD( "proto5_blaster_3021_rom_6.ic13", 0x28000, 0x4000, CRC(47fc007e) SHA1(3a80b9b7ae460e9732f7c1cdd465a5b06ded970f) ) - ROM_LOAD( "proto5_blaster_3021_rom_5.ic11", 0x2c000, 0x4000, CRC(15c1b94d) SHA1(5d97628541eb8933870c3ffd3646b7aaf8af6af5) ) - ROM_LOAD( "proto5_blaster_3021_rom_14.ic35", 0x30000, 0x4000, CRC(aea6b846) SHA1(04cb4b5eb000471a0cec377a5236ac8c83529528) ) - ROM_LOAD( "proto5_blaster_3021_rom_7.ic15", 0x34000, 0x4000, CRC(a1c4db77) SHA1(7a878d44b6ca7444ecbb6c8f75e5e91de149daf3) ) // assumed to be PROTO5 revision - ROM_LOAD( "proto5_blaster_3021_rom_1.ic1", 0x38000, 0x4000, CRC(8d0ea9e7) SHA1(34f8e2e99748bed29285f7e4929bb920960ab03e) ) - ROM_LOAD( "proto5_blaster_3021_rom_2.ic3", 0x3c000, 0x4000, CRC(03c4012c) SHA1(53f0adc91e5f1ac58b08b3a6d2de8de5a40bebab) ) - ROM_LOAD( "proto5_blaster_3021_rom_4.ic7", 0x40000, 0x4000, CRC(39d2a32c) SHA1(33707877e841ef86a11b47ffabddce7f3d2a7030) ) // assumed to be PROTO5 revision - ROM_LOAD( "proto5_blaster_3021_rom_3.ic6", 0x44000, 0x4000, CRC(054c9f1c) SHA1(c21e3493f1ae506ab9fd28ed9ecc67d3305e9d7a) ) // assumed to be PROTO5 revision + ROM_LOAD( "proto5_blaster_3021_rom_15.ic38", 0x10000, 0x4000, CRC(1ad146a4) SHA1(5ab3d9618023b59bc329a9eeef986901867a639b) ) + ROM_LOAD( "proto5_blaster_3021_rom_8.ic20", 0x14000, 0x4000, CRC(f110bbb0) SHA1(314dea232a3706509399348c7415f933c64cea1b) ) + ROM_LOAD( "proto5_blaster_3021_rom_9.ic22", 0x18000, 0x4000, CRC(5c5b0f8a) SHA1(224f89c85b2b1ca511d006180b8d994fccbdfb6b) ) + ROM_LOAD( "proto5_blaster_3021_rom_10.ic24", 0x1c000, 0x4000, CRC(d47eb67f) SHA1(5dcde8be1a7b1927b90ffab3219dc47c5b2f20e4) ) + ROM_LOAD( "proto5_blaster_3021_rom_6.ic13", 0x20000, 0x4000, CRC(47fc007e) SHA1(3a80b9b7ae460e9732f7c1cdd465a5b06ded970f) ) + ROM_LOAD( "proto5_blaster_3021_rom_5.ic11", 0x24000, 0x4000, CRC(15c1b94d) SHA1(5d97628541eb8933870c3ffd3646b7aaf8af6af5) ) + ROM_LOAD( "proto5_blaster_3021_rom_14.ic35", 0x28000, 0x4000, CRC(aea6b846) SHA1(04cb4b5eb000471a0cec377a5236ac8c83529528) ) + ROM_LOAD( "proto5_blaster_3021_rom_7.ic15", 0x2c000, 0x4000, CRC(a1c4db77) SHA1(7a878d44b6ca7444ecbb6c8f75e5e91de149daf3) ) // assumed to be PROTO5 revision + ROM_LOAD( "proto5_blaster_3021_rom_1.ic1", 0x30000, 0x4000, CRC(8d0ea9e7) SHA1(34f8e2e99748bed29285f7e4929bb920960ab03e) ) + ROM_LOAD( "proto5_blaster_3021_rom_2.ic3", 0x34000, 0x4000, CRC(03c4012c) SHA1(53f0adc91e5f1ac58b08b3a6d2de8de5a40bebab) ) + ROM_LOAD( "proto5_blaster_3021_rom_4.ic7", 0x38000, 0x4000, CRC(39d2a32c) SHA1(33707877e841ef86a11b47ffabddce7f3d2a7030) ) // assumed to be PROTO5 revision + ROM_LOAD( "proto5_blaster_3021_rom_3.ic6", 0x3c000, 0x4000, CRC(054c9f1c) SHA1(c21e3493f1ae506ab9fd28ed9ecc67d3305e9d7a) ) // assumed to be PROTO5 revision ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "proto5_blaster_3021_rom_18.sb13", 0xf000, 0x1000, CRC(c33a3145) SHA1(6ffe2da7b70c0b576fbc1790a33eecdbb9ee3d02) ) // labeled: BLASTER (3021) ROM 18 (c) 1983 WILLIAMS ELECTRONICS, INC. PROTO5 @@ -3431,26 +3427,26 @@ ROM_START( blastero ) // 30 Level version ROM_END ROM_START( blasterkit ) // 20 Level version with single sound board & mono sound - ROM_REGION( 0x54000, "maincpu", 0 ) + ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_LOAD( "blastkit_rom_11.ic25", 0x04000, 0x2000, CRC(b7df4914) SHA1(81f7a89dfde06c160f2c8974eec701f2298ec434) ) // unique to this set + ROM_LOAD( "blastkit_rom_12.ic26", 0x06000, 0x2000, CRC(8b1e26ab) SHA1(7d30800a9302f5a83792499d8df536693d01f75d) ) // unique to this set + ROM_LOAD( "blastkit_rom_17.ic41", 0x08000, 0x1000, CRC(577d1e9a) SHA1(0064124a65490e0473dfb0081ec28b7ee43a04b5) ) // unique to this set + ROM_LOAD( "blastkit_rom_16.ic39", 0x0d000, 0x1000, CRC(414b2abf) SHA1(2bde972d225d6e93e44751f542cee584d57f7983) ) // unique to this set ROM_LOAD( "blastkit_rom_13.ic27", 0x0e000, 0x2000, CRC(9c64db76) SHA1(c14508cb2f964af93631779db3adaa960fcc7559) ) // unique to this set - ROM_LOAD( "blastkit_rom_11.ic25", 0x10000, 0x2000, CRC(b7df4914) SHA1(81f7a89dfde06c160f2c8974eec701f2298ec434) ) // unique to this set - ROM_LOAD( "blastkit_rom_12.ic26", 0x12000, 0x2000, CRC(8b1e26ab) SHA1(7d30800a9302f5a83792499d8df536693d01f75d) ) // unique to this set - ROM_LOAD( "blastkit_rom_17.ic41", 0x14000, 0x1000, CRC(577d1e9a) SHA1(0064124a65490e0473dfb0081ec28b7ee43a04b5) ) // unique to this set - - ROM_LOAD( "blastkit_rom_15.ic38", 0x18000, 0x4000, CRC(1ad146a4) SHA1(5ab3d9618023b59bc329a9eeef986901867a639b) ) - ROM_LOAD( "blastkit_rom_8.ic20", 0x1c000, 0x4000, CRC(f110bbb0) SHA1(314dea232a3706509399348c7415f933c64cea1b) ) - ROM_LOAD( "blastkit_rom_9.ic22", 0x20000, 0x4000, CRC(5c5b0f8a) SHA1(224f89c85b2b1ca511d006180b8d994fccbdfb6b) ) - ROM_LOAD( "blastkit_rom_10.ic24", 0x24000, 0x4000, CRC(d47eb67f) SHA1(5dcde8be1a7b1927b90ffab3219dc47c5b2f20e4) ) - ROM_LOAD( "blastkit_rom_6.ic13", 0x28000, 0x4000, CRC(47fc007e) SHA1(3a80b9b7ae460e9732f7c1cdd465a5b06ded970f) ) - ROM_LOAD( "blastkit_rom_5.ic11", 0x2c000, 0x4000, CRC(15c1b94d) SHA1(5d97628541eb8933870c3ffd3646b7aaf8af6af5) ) - ROM_LOAD( "blastkit_rom_14.ic35", 0x30000, 0x4000, CRC(aea6b846) SHA1(04cb4b5eb000471a0cec377a5236ac8c83529528) ) - ROM_LOAD( "blastkit_rom_7.ic15", 0x34000, 0x4000, CRC(6fcc2153) SHA1(00e7b6846c15400315d94e2c7d1c99b1a737c285) ) // unique to this set - ROM_LOAD( "blastkit_rom_1.ic1", 0x38000, 0x4000, CRC(8d0ea9e7) SHA1(34f8e2e99748bed29285f7e4929bb920960ab03e) ) - ROM_LOAD( "blastkit_rom_2.ic3", 0x3c000, 0x4000, CRC(03c4012c) SHA1(53f0adc91e5f1ac58b08b3a6d2de8de5a40bebab) ) - ROM_LOAD( "blastkit_rom_4.ic7", 0x40000, 0x4000, CRC(f80e9ff5) SHA1(e232d96b6e07c7b4240fa4dd2cb9be4745a1be4b) ) // unique to this set - ROM_LOAD( "blastkit_rom_3.ic6", 0x44000, 0x4000, CRC(20e851f9) SHA1(efc288ef0333812a6282f22aade8e43e9a827533) ) // unique to this set + ROM_LOAD( "blastkit_rom_15.ic38", 0x10000, 0x4000, CRC(1ad146a4) SHA1(5ab3d9618023b59bc329a9eeef986901867a639b) ) + ROM_LOAD( "blastkit_rom_8.ic20", 0x14000, 0x4000, CRC(f110bbb0) SHA1(314dea232a3706509399348c7415f933c64cea1b) ) + ROM_LOAD( "blastkit_rom_9.ic22", 0x18000, 0x4000, CRC(5c5b0f8a) SHA1(224f89c85b2b1ca511d006180b8d994fccbdfb6b) ) + ROM_LOAD( "blastkit_rom_10.ic24", 0x1c000, 0x4000, CRC(d47eb67f) SHA1(5dcde8be1a7b1927b90ffab3219dc47c5b2f20e4) ) + ROM_LOAD( "blastkit_rom_6.ic13", 0x20000, 0x4000, CRC(47fc007e) SHA1(3a80b9b7ae460e9732f7c1cdd465a5b06ded970f) ) + ROM_LOAD( "blastkit_rom_5.ic11", 0x24000, 0x4000, CRC(15c1b94d) SHA1(5d97628541eb8933870c3ffd3646b7aaf8af6af5) ) + ROM_LOAD( "blastkit_rom_14.ic35", 0x28000, 0x4000, CRC(aea6b846) SHA1(04cb4b5eb000471a0cec377a5236ac8c83529528) ) + ROM_LOAD( "blastkit_rom_7.ic15", 0x2c000, 0x4000, CRC(6fcc2153) SHA1(00e7b6846c15400315d94e2c7d1c99b1a737c285) ) // unique to this set + ROM_LOAD( "blastkit_rom_1.ic1", 0x30000, 0x4000, CRC(8d0ea9e7) SHA1(34f8e2e99748bed29285f7e4929bb920960ab03e) ) + ROM_LOAD( "blastkit_rom_2.ic3", 0x34000, 0x4000, CRC(03c4012c) SHA1(53f0adc91e5f1ac58b08b3a6d2de8de5a40bebab) ) + ROM_LOAD( "blastkit_rom_4.ic7", 0x38000, 0x4000, CRC(f80e9ff5) SHA1(e232d96b6e07c7b4240fa4dd2cb9be4745a1be4b) ) // unique to this set + ROM_LOAD( "blastkit_rom_3.ic6", 0x3c000, 0x4000, CRC(20e851f9) SHA1(efc288ef0333812a6282f22aade8e43e9a827533) ) // unique to this set ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "blastkit_rom_18", 0xf000, 0x1000, CRC(c33a3145) SHA1(6ffe2da7b70c0b576fbc1790a33eecdbb9ee3d02) ) @@ -3463,19 +3459,19 @@ ROM_END ROM_START( spdball ) - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "speedbal.01", 0x00000, 0x1000, CRC(7f4801bb) SHA1(8f22396170571189b1d088d73331d6a713c76f41) ) + ROM_LOAD( "speedbal.02", 0x01000, 0x1000, CRC(5cd5e489) SHA1(83c1bce945ecbaa4a59e0023198e574d9069680c) ) + ROM_LOAD( "speedbal.03", 0x02000, 0x1000, CRC(280e11a4) SHA1(4ef321e1744955a9a54c1e4b1f88c01c01e7b7c8) ) + ROM_LOAD( "speedbal.04", 0x03000, 0x1000, CRC(3469cbbf) SHA1(70b46cf686438441484ffeca0fa1398c15c8811e) ) + ROM_LOAD( "speedbal.05", 0x04000, 0x1000, CRC(87373c89) SHA1(a3cd72f4b517d5d727059a7d911b79ced27e9f93) ) + ROM_LOAD( "speedbal.06", 0x05000, 0x1000, CRC(48779a0d) SHA1(9cdfc12d1021b5d66acd38ab61f385219be39f4f) ) + ROM_LOAD( "speedbal.07", 0x06000, 0x1000, CRC(2e5d8db6) SHA1(7a13d60267ce12a6a4b20322c2ed1f39762bc663) ) + ROM_LOAD( "speedbal.08", 0x07000, 0x1000, CRC(c173cedf) SHA1(603c4c7cdc712d54a86b59470651d00b369293d8) ) + ROM_LOAD( "speedbal.09", 0x08000, 0x1000, CRC(415f424b) SHA1(f7e59385a67319ba152488762af1b42fc62ab264) ) ROM_LOAD( "speedbal.10", 0x0d000, 0x1000, CRC(4a3add93) SHA1(6939dd6cb6751a0406f364223029eff99040f9e2) ) ROM_LOAD( "speedbal.11", 0x0e000, 0x1000, CRC(1fbcfaa5) SHA1(fccdebbab172b141bbaec6f520b378d21c72f67a) ) ROM_LOAD( "speedbal.12", 0x0f000, 0x1000, CRC(f3458f41) SHA1(366fb880b4dc68849d6ea7a9dab55efa9c566123) ) - ROM_LOAD( "speedbal.01", 0x10000, 0x1000, CRC(7f4801bb) SHA1(8f22396170571189b1d088d73331d6a713c76f41) ) - ROM_LOAD( "speedbal.02", 0x11000, 0x1000, CRC(5cd5e489) SHA1(83c1bce945ecbaa4a59e0023198e574d9069680c) ) - ROM_LOAD( "speedbal.03", 0x12000, 0x1000, CRC(280e11a4) SHA1(4ef321e1744955a9a54c1e4b1f88c01c01e7b7c8) ) - ROM_LOAD( "speedbal.04", 0x13000, 0x1000, CRC(3469cbbf) SHA1(70b46cf686438441484ffeca0fa1398c15c8811e) ) - ROM_LOAD( "speedbal.05", 0x14000, 0x1000, CRC(87373c89) SHA1(a3cd72f4b517d5d727059a7d911b79ced27e9f93) ) - ROM_LOAD( "speedbal.06", 0x15000, 0x1000, CRC(48779a0d) SHA1(9cdfc12d1021b5d66acd38ab61f385219be39f4f) ) - ROM_LOAD( "speedbal.07", 0x16000, 0x1000, CRC(2e5d8db6) SHA1(7a13d60267ce12a6a4b20322c2ed1f39762bc663) ) - ROM_LOAD( "speedbal.08", 0x17000, 0x1000, CRC(c173cedf) SHA1(603c4c7cdc712d54a86b59470651d00b369293d8) ) - ROM_LOAD( "speedbal.09", 0x18000, 0x1000, CRC(415f424b) SHA1(f7e59385a67319ba152488762af1b42fc62ab264) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "speedbal.snd", 0xf000, 0x1000, CRC(78de20e2) SHA1(ece6e04b1d57167faf7aaee0829e7c31eb560437) ) @@ -3486,38 +3482,38 @@ ROM_END ROM_START( alienar ) - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "aarom01", 0x00000, 0x1000, CRC(bb0c21be) SHA1(dbf122870adaa49cd99e2c1e9fa4b78fb74ef2c1) ) + ROM_LOAD( "aarom02", 0x01000, 0x1000, CRC(165acd37) SHA1(12466c94bcf5a98f154a639ecc2e95d5193cbab2) ) + ROM_LOAD( "aarom03", 0x02000, 0x1000, CRC(e5d51d92) SHA1(598c928499e977a30906319c97ffa1ef2b9395d1) ) + ROM_LOAD( "aarom04", 0x03000, 0x1000, CRC(24f6feb8) SHA1(c1b7d764785b4edfe80a90ffdc52a67c8dbbfea5) ) + ROM_LOAD( "aarom05", 0x04000, 0x1000, CRC(5b1ac59b) SHA1(9b312eb419e994a006fda2ae61c58c31f048bace) ) + ROM_LOAD( "aarom06", 0x05000, 0x1000, CRC(da7195a2) SHA1(ef2c2750c504176fd6a11e8463278d97cac9a5c5) ) + ROM_LOAD( "aarom07", 0x06000, 0x1000, CRC(f9812be4) SHA1(5f116345f09cd79790612672aa48ede63fc91f56) ) + ROM_LOAD( "aarom08", 0x07000, 0x1000, CRC(cd7f3a87) SHA1(59577059308931139ecc036d06953660a148d91c) ) + ROM_LOAD( "aarom09", 0x08000, 0x1000, CRC(e6ce77b4) SHA1(bd4354100067654d0ad2e590591582dbdfb845b6) ) ROM_LOAD( "aarom10", 0x0d000, 0x1000, CRC(6feb0314) SHA1(5cf30f097bc695cbd388cb408e78394926362a7b) ) ROM_LOAD( "aarom11", 0x0e000, 0x1000, CRC(ae3a270e) SHA1(867fff32062bc876390e8ca6bd7cedae47cd92c9) ) ROM_LOAD( "aarom12", 0x0f000, 0x1000, CRC(6be9f09e) SHA1(98821c9b94301c5fd6e7f5d9e4bc9c1bdbab53ec) ) - ROM_LOAD( "aarom01", 0x10000, 0x1000, CRC(bb0c21be) SHA1(dbf122870adaa49cd99e2c1e9fa4b78fb74ef2c1) ) - ROM_LOAD( "aarom02", 0x11000, 0x1000, CRC(165acd37) SHA1(12466c94bcf5a98f154a639ecc2e95d5193cbab2) ) - ROM_LOAD( "aarom03", 0x12000, 0x1000, CRC(e5d51d92) SHA1(598c928499e977a30906319c97ffa1ef2b9395d1) ) - ROM_LOAD( "aarom04", 0x13000, 0x1000, CRC(24f6feb8) SHA1(c1b7d764785b4edfe80a90ffdc52a67c8dbbfea5) ) - ROM_LOAD( "aarom05", 0x14000, 0x1000, CRC(5b1ac59b) SHA1(9b312eb419e994a006fda2ae61c58c31f048bace) ) - ROM_LOAD( "aarom06", 0x15000, 0x1000, CRC(da7195a2) SHA1(ef2c2750c504176fd6a11e8463278d97cac9a5c5) ) - ROM_LOAD( "aarom07", 0x16000, 0x1000, CRC(f9812be4) SHA1(5f116345f09cd79790612672aa48ede63fc91f56) ) - ROM_LOAD( "aarom08", 0x17000, 0x1000, CRC(cd7f3a87) SHA1(59577059308931139ecc036d06953660a148d91c) ) - ROM_LOAD( "aarom09", 0x18000, 0x1000, CRC(e6ce77b4) SHA1(bd4354100067654d0ad2e590591582dbdfb845b6) ) ROM_REGION( 0x10000, "soundcpu", ROMREGION_ERASE00 ) ROM_END ROM_START( alienaru ) - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "aarom01", 0x00000, 0x1000, CRC(bb0c21be) SHA1(dbf122870adaa49cd99e2c1e9fa4b78fb74ef2c1) ) + ROM_LOAD( "aarom02", 0x01000, 0x1000, CRC(165acd37) SHA1(12466c94bcf5a98f154a639ecc2e95d5193cbab2) ) + ROM_LOAD( "aarom03", 0x02000, 0x1000, CRC(e5d51d92) SHA1(598c928499e977a30906319c97ffa1ef2b9395d1) ) + ROM_LOAD( "aarom04", 0x03000, 0x1000, CRC(24f6feb8) SHA1(c1b7d764785b4edfe80a90ffdc52a67c8dbbfea5) ) + ROM_LOAD( "aarom05", 0x04000, 0x1000, CRC(5b1ac59b) SHA1(9b312eb419e994a006fda2ae61c58c31f048bace) ) + ROM_LOAD( "aarom06", 0x05000, 0x1000, CRC(da7195a2) SHA1(ef2c2750c504176fd6a11e8463278d97cac9a5c5) ) + ROM_LOAD( "aarom07", 0x06000, 0x1000, CRC(f9812be4) SHA1(5f116345f09cd79790612672aa48ede63fc91f56) ) + ROM_LOAD( "aarom08", 0x07000, 0x1000, CRC(cd7f3a87) SHA1(59577059308931139ecc036d06953660a148d91c) ) + ROM_LOAD( "aarom09", 0x08000, 0x1000, CRC(e6ce77b4) SHA1(bd4354100067654d0ad2e590591582dbdfb845b6) ) ROM_LOAD( "aarom10", 0x0d000, 0x1000, CRC(6feb0314) SHA1(5cf30f097bc695cbd388cb408e78394926362a7b) ) ROM_LOAD( "aarom11", 0x0e000, 0x1000, CRC(ae3a270e) SHA1(867fff32062bc876390e8ca6bd7cedae47cd92c9) ) ROM_LOAD( "aarom12", 0x0f000, 0x1000, CRC(6be9f09e) SHA1(98821c9b94301c5fd6e7f5d9e4bc9c1bdbab53ec) ) - ROM_LOAD( "aarom01", 0x10000, 0x1000, CRC(bb0c21be) SHA1(dbf122870adaa49cd99e2c1e9fa4b78fb74ef2c1) ) - ROM_LOAD( "aarom02", 0x11000, 0x1000, CRC(165acd37) SHA1(12466c94bcf5a98f154a639ecc2e95d5193cbab2) ) - ROM_LOAD( "aarom03", 0x12000, 0x1000, CRC(e5d51d92) SHA1(598c928499e977a30906319c97ffa1ef2b9395d1) ) - ROM_LOAD( "aarom04", 0x13000, 0x1000, CRC(24f6feb8) SHA1(c1b7d764785b4edfe80a90ffdc52a67c8dbbfea5) ) - ROM_LOAD( "aarom05", 0x14000, 0x1000, CRC(5b1ac59b) SHA1(9b312eb419e994a006fda2ae61c58c31f048bace) ) - ROM_LOAD( "aarom06", 0x15000, 0x1000, CRC(da7195a2) SHA1(ef2c2750c504176fd6a11e8463278d97cac9a5c5) ) - ROM_LOAD( "aarom07", 0x16000, 0x1000, CRC(f9812be4) SHA1(5f116345f09cd79790612672aa48ede63fc91f56) ) - ROM_LOAD( "aarom08", 0x17000, 0x1000, CRC(cd7f3a87) SHA1(59577059308931139ecc036d06953660a148d91c) ) - ROM_LOAD( "aarom09", 0x18000, 0x1000, CRC(e6ce77b4) SHA1(bd4354100067654d0ad2e590591582dbdfb845b6) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "sg.snd", 0xf800, 0x0800, CRC(2fcf6c4d) SHA1(9c4334ac3ff15d94001b22fc367af40f9deb7d57) ) @@ -3529,19 +3525,19 @@ ROM_END ROM_START( lottofun ) - ROM_REGION( 0x19000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "vl4e.dat", 0x00000, 0x1000, CRC(5e9af236) SHA1(6f26c9be6da6f1195a4569f003a010d3f2e0c24d) ) + ROM_LOAD( "vl4c.dat", 0x01000, 0x1000, CRC(4b134ae2) SHA1(86756e1d8de113571857818a98d347789c003339) ) + ROM_LOAD( "vl4a.dat", 0x02000, 0x1000, CRC(b2f1f95a) SHA1(89166cdf4aff5e5a8cc4ea6ba589ce095de82f57) ) + ROM_LOAD( "vl5e.dat", 0x03000, 0x1000, CRC(c8681c55) SHA1(ac63e53a958f63bd0a05f36303c1aa777aee799d) ) + ROM_LOAD( "vl5c.dat", 0x04000, 0x1000, CRC(eb9351e0) SHA1(c66477ca0b3ed95708eb478fb992833beda1a4f8) ) + ROM_LOAD( "vl5a.dat", 0x05000, 0x1000, CRC(534f2fa1) SHA1(c034aa037ef6bc7cd2ed85da7531fd8efb7083e4) ) + ROM_LOAD( "vl6e.dat", 0x06000, 0x1000, CRC(befac592) SHA1(548cb1f0bc178eeada144c443545f7545c90b6a6) ) + ROM_LOAD( "vl6c.dat", 0x07000, 0x1000, CRC(a73d7f13) SHA1(833ff14c33635b61e1bd45b2878a4f6c9e18bf82) ) + ROM_LOAD( "vl6a.dat", 0x08000, 0x1000, CRC(5730a43d) SHA1(8acadf105dc373bf2b3087ccc1667b872452c913) ) ROM_LOAD( "vl7a.dat", 0x0d000, 0x1000, CRC(fb2aec2c) SHA1(73dc6a6dfe9ba51e3612b6d912bd7af1d5782296) ) ROM_LOAD( "vl7c.dat", 0x0e000, 0x1000, CRC(9a496519) SHA1(ae98dadcb63a33c796a3e3083d4b5bc957873cbc) ) ROM_LOAD( "vl7e.dat", 0x0f000, 0x1000, CRC(032cab4b) SHA1(87bdd0fd58b12e39efaadcf6e82744886a9292e9) ) - ROM_LOAD( "vl4e.dat", 0x10000, 0x1000, CRC(5e9af236) SHA1(6f26c9be6da6f1195a4569f003a010d3f2e0c24d) ) - ROM_LOAD( "vl4c.dat", 0x11000, 0x1000, CRC(4b134ae2) SHA1(86756e1d8de113571857818a98d347789c003339) ) - ROM_LOAD( "vl4a.dat", 0x12000, 0x1000, CRC(b2f1f95a) SHA1(89166cdf4aff5e5a8cc4ea6ba589ce095de82f57) ) - ROM_LOAD( "vl5e.dat", 0x13000, 0x1000, CRC(c8681c55) SHA1(ac63e53a958f63bd0a05f36303c1aa777aee799d) ) - ROM_LOAD( "vl5c.dat", 0x14000, 0x1000, CRC(eb9351e0) SHA1(c66477ca0b3ed95708eb478fb992833beda1a4f8) ) - ROM_LOAD( "vl5a.dat", 0x15000, 0x1000, CRC(534f2fa1) SHA1(c034aa037ef6bc7cd2ed85da7531fd8efb7083e4) ) - ROM_LOAD( "vl6e.dat", 0x16000, 0x1000, CRC(befac592) SHA1(548cb1f0bc178eeada144c443545f7545c90b6a6) ) - ROM_LOAD( "vl6c.dat", 0x17000, 0x1000, CRC(a73d7f13) SHA1(833ff14c33635b61e1bd45b2878a4f6c9e18bf82) ) - ROM_LOAD( "vl6a.dat", 0x18000, 0x1000, CRC(5730a43d) SHA1(8acadf105dc373bf2b3087ccc1667b872452c913) ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "vl2532.snd", 0xf000, 0x1000, CRC(214b8a04) SHA1(45f06b44a605cca6b293b20cfea4763b469254b8) ) @@ -3549,7 +3545,7 @@ ROM_END ROM_START( mysticm ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x30000, "maincpu", 0 ) ROM_LOAD( "mm02_2.a09", 0x0e000, 0x1000, CRC(3a776ea8) SHA1(1fef5f5cef5e10606c97ac9c365f000a88d51314) ) // IC9 ROM_LOAD( "mm03_2.a10", 0x0f000, 0x1000, CRC(6e247c75) SHA1(4daf5206d29b887cd1a78528fac4b0cd8ec7f39b) ) // IC10 @@ -3558,25 +3554,25 @@ ROM_START( mysticm ) ROM_LOAD( "mm07_1.a14", 0x14000, 0x2000, CRC(ea2a2a68) SHA1(71855c874cd5032f47fafc67e2d1667f956cd9b5) ) // IC14 ROM_LOAD( "mm05_1.a12", 0x16000, 0x2000, CRC(b514eef3) SHA1(0f9309768c416dd98e9c02121cc750993a2923ea) ) // IC12 - ROM_LOAD( "mm18_1.a26", 0x20000, 0x2000, CRC(9b391a81) SHA1(b3f34e5d468fe4a4de2d4e771e2fa08de6596f26) ) // IC26 - ROM_LOAD( "mm16_1.a24", 0x22000, 0x2000, CRC(399e175d) SHA1(e17301e4159e5a6d83c3ca62c93eb70f34b948df) ) // IC24 - ROM_LOAD( "mm14_1.a22", 0x24000, 0x2000, CRC(191153b1) SHA1(fcd8aa6ad6506ba51a01f777f6a3b94e9c051b1c) ) // IC22 + ROM_LOAD( "mm18_1.a26", 0x18000, 0x2000, CRC(9b391a81) SHA1(b3f34e5d468fe4a4de2d4e771e2fa08de6596f26) ) // IC26 + ROM_LOAD( "mm16_1.a24", 0x1a000, 0x2000, CRC(399e175d) SHA1(e17301e4159e5a6d83c3ca62c93eb70f34b948df) ) // IC24 + ROM_LOAD( "mm14_1.a22", 0x1c000, 0x2000, CRC(191153b1) SHA1(fcd8aa6ad6506ba51a01f777f6a3b94e9c051b1c) ) // IC22 - ROM_LOAD( "mm10_1.a17", 0x30000, 0x2000, CRC(d6a37509) SHA1(4b1f52954ca208ccc040c017873777fbf7fbd1f2) ) // IC17 - ROM_LOAD( "mm08_1.a15", 0x32000, 0x2000, CRC(6f1a64f2) SHA1(4183b658b257d7fe35e1d7271f76d3358df5a7a2) ) // IC15 - ROM_LOAD( "mm06_1.a13", 0x34000, 0x2000, CRC(2e6795d4) SHA1(8b074f6a7a4b5a9705de498684180815581faea2) ) // IC13 - ROM_LOAD( "mm04_1.a11", 0x36000, 0x2000, CRC(c222fb64) SHA1(b4c51d2b1664ef3267df1dee9e4888acf847c286) ) // IC11 + ROM_LOAD( "mm10_1.a17", 0x20000, 0x2000, CRC(d6a37509) SHA1(4b1f52954ca208ccc040c017873777fbf7fbd1f2) ) // IC17 + ROM_LOAD( "mm08_1.a15", 0x22000, 0x2000, CRC(6f1a64f2) SHA1(4183b658b257d7fe35e1d7271f76d3358df5a7a2) ) // IC15 + ROM_LOAD( "mm06_1.a13", 0x24000, 0x2000, CRC(2e6795d4) SHA1(8b074f6a7a4b5a9705de498684180815581faea2) ) // IC13 + ROM_LOAD( "mm04_1.a11", 0x26000, 0x2000, CRC(c222fb64) SHA1(b4c51d2b1664ef3267df1dee9e4888acf847c286) ) // IC11 - ROM_LOAD( "mm17_1.a25", 0x40000, 0x2000, CRC(d36f0a96) SHA1(9830955ca7e46b5b0dba98b4d2ea325bbbebe3c7) ) // IC25 - ROM_LOAD( "mm15_1.a23", 0x42000, 0x2000, CRC(cd5d99da) SHA1(41a37903503c14fb9c801c51afa2f97c83b79f8b) ) // IC23 - ROM_LOAD( "mm13_1.a21", 0x44000, 0x2000, CRC(ef4b79db) SHA1(346057cb8c4593df44fb36771553e60610fe1a0c) ) // IC21 - ROM_LOAD( "mm12_1.a19", 0x46000, 0x2000, CRC(a1f04bf0) SHA1(389bdb7c9e395af9275abfb20c3ab51bc12dc4db) ) // IC19 + ROM_LOAD( "mm17_1.a25", 0x28000, 0x2000, CRC(d36f0a96) SHA1(9830955ca7e46b5b0dba98b4d2ea325bbbebe3c7) ) // IC25 + ROM_LOAD( "mm15_1.a23", 0x2a000, 0x2000, CRC(cd5d99da) SHA1(41a37903503c14fb9c801c51afa2f97c83b79f8b) ) // IC23 + ROM_LOAD( "mm13_1.a21", 0x2c000, 0x2000, CRC(ef4b79db) SHA1(346057cb8c4593df44fb36771553e60610fe1a0c) ) // IC21 + ROM_LOAD( "mm12_1.a19", 0x2e000, 0x2000, CRC(a1f04bf0) SHA1(389bdb7c9e395af9275abfb20c3ab51bc12dc4db) ) // IC19 // sound CPU ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "mm01_1.a08", 0x0e000, 0x2000, CRC(65339512) SHA1(144625d2905c953383bcc90cd2435d332394883f) ) // IC8 - ROM_REGION( 0x6000, "gfx1", 0 ) + ROM_REGION( 0x6000, "tiles", 0 ) ROM_LOAD( "mm20_1.b57", 0x00000, 0x2000, CRC(5c0f4f46) SHA1(7dedbbeda2f34a2eac9fb14277874d9d66f468c7) ) // IC57 ROM_LOAD( "mm21_1.b58", 0x02000, 0x2000, CRC(cb90b3c5) SHA1(f28cca2c3ff23d6c9e2952a1b08ab2875655ec70) ) // IC58 ROM_LOAD( "mm19_1.b41", 0x04000, 0x2000, CRC(e274df86) SHA1(9876a487c5efa350ced31acbc39df22c8d414677) ) // IC41 @@ -3588,7 +3584,7 @@ ROM_START( mysticm ) ROM_END ROM_START( mysticmp ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x30000, "maincpu", 0 ) ROM_LOAD( "cpu_2732_ic9_rom2_proto6.d4", 0x0e000, 0x1000, CRC(3e4f53dd) SHA1(ebe36af7367b7f1037f5d7d55817e5580db6f10f) ) // ic9, different ROM_LOAD( "cpu_2732_ic10_rom3_proto6.f4", 0x0f000, 0x1000, CRC(6a25ee4b) SHA1(0668a0f3d6ddcf413d8b1f4f8f5b9a2dc9c4edc1) ) // ic10, different @@ -3597,25 +3593,25 @@ ROM_START( mysticmp ) ROM_LOAD( "cpu_2764_ic14_rom7_proto5.j6", 0x14000, 0x2000, CRC(ea2a2a68) SHA1(71855c874cd5032f47fafc67e2d1667f956cd9b5) ) // ic14 ROM_LOAD( "cpu_2764_ic12_rom5_proto5.h6", 0x16000, 0x2000, CRC(b514eef3) SHA1(0f9309768c416dd98e9c02121cc750993a2923ea) ) // ic12 - ROM_LOAD( "cpu_2764_ic26_rom18_proto5.j10", 0x20000, 0x2000, CRC(9b391a81) SHA1(b3f34e5d468fe4a4de2d4e771e2fa08de6596f26) ) // ic26 - ROM_LOAD( "cpu_2764_ic24_rom16_proto5.h10", 0x22000, 0x2000, CRC(399e175d) SHA1(e17301e4159e5a6d83c3ca62c93eb70f34b948df) ) // ic24 - ROM_LOAD( "cpu_2764_ic22_rom14_proto5.j9", 0x24000, 0x2000, CRC(191153b1) SHA1(fcd8aa6ad6506ba51a01f777f6a3b94e9c051b1c) ) // ic22 + ROM_LOAD( "cpu_2764_ic26_rom18_proto5.j10", 0x18000, 0x2000, CRC(9b391a81) SHA1(b3f34e5d468fe4a4de2d4e771e2fa08de6596f26) ) // ic26 + ROM_LOAD( "cpu_2764_ic24_rom16_proto5.h10", 0x1a000, 0x2000, CRC(399e175d) SHA1(e17301e4159e5a6d83c3ca62c93eb70f34b948df) ) // ic24 + ROM_LOAD( "cpu_2764_ic22_rom14_proto5.j9", 0x1c000, 0x2000, CRC(191153b1) SHA1(fcd8aa6ad6506ba51a01f777f6a3b94e9c051b1c) ) // ic22 - ROM_LOAD( "cpu_2764_ic17_rom10_proto4.i8", 0x30000, 0x2000, CRC(d6a37509) SHA1(4b1f52954ca208ccc040c017873777fbf7fbd1f2) ) // ic17 - ROM_LOAD( "cpu_2764_ic15_rom8_proto4.g8", 0x32000, 0x2000, CRC(6f1a64f2) SHA1(4183b658b257d7fe35e1d7271f76d3358df5a7a2) ) // ic15 - ROM_LOAD( "cpu_2764_ic13_rom6_proto4.i6", 0x34000, 0x2000, CRC(2e6795d4) SHA1(8b074f6a7a4b5a9705de498684180815581faea2) ) // ic13 - ROM_LOAD( "cpu_2764_ic11_rom4_proto4.g6", 0x36000, 0x2000, CRC(c222fb64) SHA1(b4c51d2b1664ef3267df1dee9e4888acf847c286) ) // ic11 + ROM_LOAD( "cpu_2764_ic17_rom10_proto4.i8", 0x20000, 0x2000, CRC(d6a37509) SHA1(4b1f52954ca208ccc040c017873777fbf7fbd1f2) ) // ic17 + ROM_LOAD( "cpu_2764_ic15_rom8_proto4.g8", 0x22000, 0x2000, CRC(6f1a64f2) SHA1(4183b658b257d7fe35e1d7271f76d3358df5a7a2) ) // ic15 + ROM_LOAD( "cpu_2764_ic13_rom6_proto4.i6", 0x24000, 0x2000, CRC(2e6795d4) SHA1(8b074f6a7a4b5a9705de498684180815581faea2) ) // ic13 + ROM_LOAD( "cpu_2764_ic11_rom4_proto4.g6", 0x26000, 0x2000, CRC(c222fb64) SHA1(b4c51d2b1664ef3267df1dee9e4888acf847c286) ) // ic11 - ROM_LOAD( "cpu_2764_ic25_rom17_proto6.i10", 0x40000, 0x2000, CRC(7acc9995) SHA1(a996cbd65cf7efd1cdf9b5750b5c743c5edda4dd) ) // ic25, different - ROM_LOAD( "cpu_2764_ic23_rom15_proto6.g10", 0x42000, 0x2000, CRC(c32d1ce5) SHA1(0df3eafbb558699382eb729a3059e99305e2e8c8) ) // ic23, different - ROM_LOAD( "cpu_2764_ic21_rom13_proto6.i9", 0x44000, 0x2000, CRC(e387a785) SHA1(de98d503f4d2c947c701ff96628114b34da45f93) ) // ic21, different - ROM_LOAD( "cpu_2764_ic19_rom12_proto6.g9", 0x46000, 0x2000, CRC(a1f04bf0) SHA1(389bdb7c9e395af9275abfb20c3ab51bc12dc4db) ) // ic19 + ROM_LOAD( "cpu_2764_ic25_rom17_proto6.i10", 0x28000, 0x2000, CRC(7acc9995) SHA1(a996cbd65cf7efd1cdf9b5750b5c743c5edda4dd) ) // ic25, different + ROM_LOAD( "cpu_2764_ic23_rom15_proto6.g10", 0x2a000, 0x2000, CRC(c32d1ce5) SHA1(0df3eafbb558699382eb729a3059e99305e2e8c8) ) // ic23, different + ROM_LOAD( "cpu_2764_ic21_rom13_proto6.i9", 0x2c000, 0x2000, CRC(e387a785) SHA1(de98d503f4d2c947c701ff96628114b34da45f93) ) // ic21, different + ROM_LOAD( "cpu_2764_ic19_rom12_proto6.g9", 0x2e000, 0x2000, CRC(a1f04bf0) SHA1(389bdb7c9e395af9275abfb20c3ab51bc12dc4db) ) // ic19 // sound CPU ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "cpu_2764_ic8_rom1_proto4.f0", 0x0e000, 0x2000, CRC(65339512) SHA1(144625d2905c953383bcc90cd2435d332394883f) ) // ic8 - ROM_REGION( 0x6000, "gfx1", 0 ) + ROM_REGION( 0x6000, "tiles", 0 ) ROM_LOAD( "ram_2764_ic57_rom20_rev1.f9", 0x00000, 0x2000, CRC(5c0f4f46) SHA1(7dedbbeda2f34a2eac9fb14277874d9d66f468c7) ) // ic57 ROM_LOAD( "ram_2764_ic58_rom21_rev1.f10", 0x02000, 0x2000, CRC(cb90b3c5) SHA1(f28cca2c3ff23d6c9e2952a1b08ab2875655ec70) ) // ic58 ROM_LOAD( "ram_2764_ic41_rom19_rev1.d10", 0x04000, 0x2000, CRC(e274df86) SHA1(9876a487c5efa350ced31acbc39df22c8d414677) ) // ic41 @@ -3623,7 +3619,7 @@ ROM_END ROM_START( tshoot ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x30000, "maincpu", 0 ) ROM_LOAD( "rom18.ic55", 0x0d000, 0x1000, CRC(effc33f1) SHA1(cd1b16b4a4a46ce9d550d10b465b8cf1ab3c5273) ) // IC55 ROM_LOAD( "rom2.ic9", 0x0e000, 0x1000, CRC(fd982687) SHA1(70be1ea57ea0a1e75b1bd988492a9c0244e8b91f) ) // IC9 ROM_LOAD( "rom3.ic10", 0x0f000, 0x1000, CRC(9617054d) SHA1(8795b97a6391aa3804f68dc2d2b33866dc17f34c) ) // IC10 @@ -3633,24 +3629,24 @@ ROM_START( tshoot ) ROM_LOAD( "rom7.ic14", 0x14000, 0x2000, CRC(f25505e6) SHA1(d075ff89b6379ad7a47d9723ed1c21468b9d1dae) ) // IC14 ROM_LOAD( "rom5.ic12", 0x16000, 0x2000, CRC(94a7c0ed) SHA1(11f46e1ca7d79b4244ea0f60e0fba44186f1ebde) ) // IC12 - ROM_LOAD( "rom17.ic26", 0x20000, 0x2000, CRC(b02d1ccd) SHA1(b08b6d9affb6f3e50a11fd9397fe4255927de3b6) ) // IC26 - ROM_LOAD( "rom15.ic24", 0x22000, 0x2000, CRC(11709935) SHA1(ae25bbadbbcab9f3cba2bb4bb92d5217705b38e3) ) // IC24 + ROM_LOAD( "rom17.ic26", 0x18000, 0x2000, CRC(b02d1ccd) SHA1(b08b6d9affb6f3e50a11fd9397fe4255927de3b6) ) // IC26 + ROM_LOAD( "rom15.ic24", 0x1a000, 0x2000, CRC(11709935) SHA1(ae25bbadbbcab9f3cba2bb4bb92d5217705b38e3) ) // IC24 - ROM_LOAD( "rom10.ic17", 0x30000, 0x2000, CRC(0f32bad8) SHA1(7a2f559697d252ceec3a2f55fe51bc755e4bb65a) ) // IC17 - ROM_LOAD( "rom8.ic15", 0x32000, 0x2000, CRC(e9b6cbf7) SHA1(6cd6b1e1c5e8e253e779afff8ad1ff90d6116fc9) ) // IC15 - ROM_LOAD( "rom6.ic13", 0x34000, 0x2000, CRC(a49f617f) SHA1(759d25e33a09204664880329b86724805a1fe0e8) ) // IC13 - ROM_LOAD( "rom4.ic11", 0x36000, 0x2000, CRC(b026dc00) SHA1(8a068997aa19e152d64db47528893046d338389c) ) // IC11 + ROM_LOAD( "rom10.ic17", 0x20000, 0x2000, CRC(0f32bad8) SHA1(7a2f559697d252ceec3a2f55fe51bc755e4bb65a) ) // IC17 + ROM_LOAD( "rom8.ic15", 0x22000, 0x2000, CRC(e9b6cbf7) SHA1(6cd6b1e1c5e8e253e779afff8ad1ff90d6116fc9) ) // IC15 + ROM_LOAD( "rom6.ic13", 0x24000, 0x2000, CRC(a49f617f) SHA1(759d25e33a09204664880329b86724805a1fe0e8) ) // IC13 + ROM_LOAD( "rom4.ic11", 0x26000, 0x2000, CRC(b026dc00) SHA1(8a068997aa19e152d64db47528893046d338389c) ) // IC11 - ROM_LOAD( "rom16.ic25", 0x40000, 0x2000, CRC(69ce38f8) SHA1(a2cd678e71bfa5e6a3594d8699660c7fa8b52001) ) // IC25 - ROM_LOAD( "rom14.ic23", 0x42000, 0x2000, CRC(769a4ae5) SHA1(1cdfae2d889848d69f68f990714d027cfbca1853) ) // IC23 - ROM_LOAD( "rom13.ic21", 0x44000, 0x2000, CRC(ec016c9b) SHA1(f2e40abd14b8b4944b792dd453ebe92eb64355ae) ) // IC21 - ROM_LOAD( "rom12.ic19", 0x46000, 0x2000, CRC(98ae7afa) SHA1(6a904408419f576352bd2f895727fd17c0541ff8) ) // IC19 + ROM_LOAD( "rom16.ic25", 0x28000, 0x2000, CRC(69ce38f8) SHA1(a2cd678e71bfa5e6a3594d8699660c7fa8b52001) ) // IC25 + ROM_LOAD( "rom14.ic23", 0x2a000, 0x2000, CRC(769a4ae5) SHA1(1cdfae2d889848d69f68f990714d027cfbca1853) ) // IC23 + ROM_LOAD( "rom13.ic21", 0x2c000, 0x2000, CRC(ec016c9b) SHA1(f2e40abd14b8b4944b792dd453ebe92eb64355ae) ) // IC21 + ROM_LOAD( "rom12.ic19", 0x2e000, 0x2000, CRC(98ae7afa) SHA1(6a904408419f576352bd2f895727fd17c0541ff8) ) // IC19 // sound CPU ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "rom1.ic8", 0xe000, 0x2000, CRC(011a94a7) SHA1(9f54a742a87ba56b9517e33e556f57dce6eb2eab) ) // IC8 - ROM_REGION( 0x6000, "gfx1", 0 ) + ROM_REGION( 0x6000, "tiles", 0 ) ROM_LOAD( "rom20.ic57", 0x00000, 0x2000, CRC(c6e1d253) SHA1(c408a29f75ba2958e229996f903400b3d95e3bd3) ) // IC57 ROM_LOAD( "rom21.ic58", 0x02000, 0x2000, CRC(9874e90f) SHA1(85282823cc862341adf9642d2d5d05972da6dff0) ) // IC58 ROM_LOAD( "rom19.ic41", 0x04000, 0x2000, CRC(b9ce4d2a) SHA1(af5332f340d3c3ae02e77923d6e8f0dd92547728) ) // IC41 @@ -3663,7 +3659,7 @@ ROM_END ROM_START( inferno ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x30000, "maincpu", 0 ) ROM_LOAD( "ic9.inf", 0x0e000, 0x1000, CRC(1a013185) SHA1(9079c082ec043714f9d8ea92bc81d0b93d2ce715) ) // IC9 ROM_LOAD( "ic10.inf", 0x0f000, 0x1000, CRC(dbf64a36) SHA1(54326bc527797f0a3a55764073eb40030aec1aae) ) // IC10 @@ -3672,21 +3668,21 @@ ROM_START( inferno ) ROM_LOAD( "ic14.inf", 0x14000, 0x2000, CRC(a70508a7) SHA1(930bb9af3b6ba9fdf3e7c32f6b5ffae9acd6cee3) ) // IC14 ROM_LOAD( "ic12.inf", 0x16000, 0x2000, CRC(7ffb87f9) SHA1(469f5ae39ad8531c4c11e9d10ab57686e7f54aef) ) // IC12 - ROM_LOAD( "ic17.inf", 0x30000, 0x2000, CRC(b4684139) SHA1(c1d6ecd3dc8191250ef70e6972dad234c0d8f739) ) // IC17 - ROM_LOAD( "ic15.inf", 0x32000, 0x2000, CRC(128a6ad6) SHA1(357438e50663d6cb96dabfa5110c17836584e15f) ) // IC15 - ROM_LOAD( "ic13.inf", 0x34000, 0x2000, CRC(83a9e4d6) SHA1(4937e4d1c516da837213e40a1da862578c8dd272) ) // IC13 - ROM_LOAD( "ic11.inf", 0x36000, 0x2000, CRC(c2e9c909) SHA1(21f0b9bf6ef3a9466ea9afde1c7efde9ed04ce5b) ) // IC11 + ROM_LOAD( "ic17.inf", 0x20000, 0x2000, CRC(b4684139) SHA1(c1d6ecd3dc8191250ef70e6972dad234c0d8f739) ) // IC17 + ROM_LOAD( "ic15.inf", 0x22000, 0x2000, CRC(128a6ad6) SHA1(357438e50663d6cb96dabfa5110c17836584e15f) ) // IC15 + ROM_LOAD( "ic13.inf", 0x24000, 0x2000, CRC(83a9e4d6) SHA1(4937e4d1c516da837213e40a1da862578c8dd272) ) // IC13 + ROM_LOAD( "ic11.inf", 0x26000, 0x2000, CRC(c2e9c909) SHA1(21f0b9bf6ef3a9466ea9afde1c7efde9ed04ce5b) ) // IC11 - ROM_LOAD( "ic25.inf", 0x40000, 0x2000, CRC(103a5951) SHA1(57c8caa1e9d5e245052822d08add9343fd622e04) ) // IC25 - ROM_LOAD( "ic23.inf", 0x42000, 0x2000, CRC(c04749a0) SHA1(b203e8d1df556e10b4ecad4733448f889c63e261) ) // IC23 - ROM_LOAD( "ic21.inf", 0x44000, 0x2000, CRC(c405f853) SHA1(6bd74d065a6043849e083c2822925b82c6fedb00) ) // IC21 - ROM_LOAD( "ic19.inf", 0x46000, 0x2000, CRC(ade7645a) SHA1(bfaab1840e3171df895a2333a30b9dac214b3351) ) // IC19 + ROM_LOAD( "ic25.inf", 0x28000, 0x2000, CRC(103a5951) SHA1(57c8caa1e9d5e245052822d08add9343fd622e04) ) // IC25 + ROM_LOAD( "ic23.inf", 0x2a000, 0x2000, CRC(c04749a0) SHA1(b203e8d1df556e10b4ecad4733448f889c63e261) ) // IC23 + ROM_LOAD( "ic21.inf", 0x2c000, 0x2000, CRC(c405f853) SHA1(6bd74d065a6043849e083c2822925b82c6fedb00) ) // IC21 + ROM_LOAD( "ic19.inf", 0x2e000, 0x2000, CRC(ade7645a) SHA1(bfaab1840e3171df895a2333a30b9dac214b3351) ) // IC19 // sound CPU ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "ic8.inf", 0x0e000, 0x2000, CRC(4e3123b8) SHA1(f453feed3ae3b6430db49eb4325f62eecfee9f5e) ) // IC8 - ROM_REGION( 0x6000, "gfx1", 0 ) + ROM_REGION( 0x6000, "tiles", 0 ) ROM_LOAD( "ic57.inf", 0x00000, 0x2000, CRC(65a4ef79) SHA1(270c58901e83665bc388cd9cb92022c55e8eae50) ) // IC57 ROM_LOAD( "ic58.inf", 0x02000, 0x2000, CRC(4bb1c2a0) SHA1(9e8d214b8d1dbe4c2369e4047e165c9e692098a5) ) // IC58 ROM_LOAD( "ic41.inf", 0x04000, 0x2000, CRC(f3f7238f) SHA1(3810f1afd318ec37271c099c989b142b85d8da51) ) // IC41 @@ -3699,7 +3695,7 @@ ROM_END ROM_START( joust2 ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x30000, "maincpu", 0 ) ROM_LOAD( "cpu_2732_ic55_rom2_rev1.4c", 0x0d000, 0x1000, CRC(08b0d5bd) SHA1(b58da478aef36ae20fcfee48151d5d556e16b7b9) ) ROM_LOAD( "cpu_2732_ic9_rom3_rev2.4d", 0x0e000, 0x1000, CRC(951175ce) SHA1(ac70df125bb438f9fccc082276df4a76ff693e16) ) ROM_LOAD( "cpu_2732_ic10_rom4_rev2.4f", 0x0f000, 0x1000, CRC(ba6e0f6c) SHA1(431cbf38e919011d030f41008e1ad45e7e0ec38b) ) @@ -3709,23 +3705,23 @@ ROM_START( joust2 ) ROM_LOAD( "cpu_2732_ic14_rom7_rev2.6j", 0x14000, 0x2000, CRC(f3bce576) SHA1(30ee1b212879b3b55b47c9064f123fb77c8f3089) ) ROM_LOAD( "cpu_2732_ic12_rom5_rev2.6h", 0x16000, 0x2000, CRC(5f8b4919) SHA1(1215a314c07ef4f244e862743035626cac1d9538) ) - ROM_LOAD( "cpu_2732_ic26_rom19_rev1.10j", 0x20000, 0x2000, CRC(4ef5e805) SHA1(98b93388ab4a4fa6eeceee3386fa46f5a307b8cb) ) - ROM_LOAD( "cpu_2732_ic24_rom17_rev1.10h", 0x22000, 0x2000, CRC(4861f063) SHA1(6db00cce230bf4bdfdfbfe59e0dc2d916b84d0dc) ) - ROM_LOAD( "cpu_2732_ic22_rom15_rev1.9j", 0x24000, 0x2000, CRC(421aafa8) SHA1(06187ba8fef3e89eb399d7040015212bd5f86853) ) - ROM_LOAD( "cpu_2732_ic20_rom13_rev1.9h", 0x26000, 0x2000, CRC(3432ff55) SHA1(aec0f83b92369de8a830ec298ac490a51bc29f26) ) + ROM_LOAD( "cpu_2732_ic26_rom19_rev1.10j", 0x18000, 0x2000, CRC(4ef5e805) SHA1(98b93388ab4a4fa6eeceee3386fa46f5a307b8cb) ) + ROM_LOAD( "cpu_2732_ic24_rom17_rev1.10h", 0x1a000, 0x2000, CRC(4861f063) SHA1(6db00cce230bf4bdfdfbfe59e0dc2d916b84d0dc) ) + ROM_LOAD( "cpu_2732_ic22_rom15_rev1.9j", 0x1c000, 0x2000, CRC(421aafa8) SHA1(06187ba8fef3e89eb399d7040015212bd5f86853) ) + ROM_LOAD( "cpu_2732_ic20_rom13_rev1.9h", 0x1e000, 0x2000, CRC(3432ff55) SHA1(aec0f83b92369de8a830ec298ac490a51bc29f26) ) - ROM_LOAD( "cpu_2732_ic17_rom10_rev1.8i", 0x30000, 0x2000, CRC(3e01b597) SHA1(17d09482636d6cda2f3266152396f0461121e748) ) - ROM_LOAD( "cpu_2732_ic15_rom8_rev1.8g", 0x32000, 0x2000, CRC(ff26fb29) SHA1(5ad498db71c384c1928ec965ba3cad48af428f19) ) - ROM_LOAD( "cpu_2732_ic13_rom6_rev2.6i", 0x34000, 0x2000, CRC(5f107db5) SHA1(c413a2e58853ccda602515b9668a6a620294ba49) ) + ROM_LOAD( "cpu_2732_ic17_rom10_rev1.8i", 0x20000, 0x2000, CRC(3e01b597) SHA1(17d09482636d6cda2f3266152396f0461121e748) ) + ROM_LOAD( "cpu_2732_ic15_rom8_rev1.8g", 0x22000, 0x2000, CRC(ff26fb29) SHA1(5ad498db71c384c1928ec965ba3cad48af428f19) ) + ROM_LOAD( "cpu_2732_ic13_rom6_rev2.6i", 0x24000, 0x2000, CRC(5f107db5) SHA1(c413a2e58853ccda602515b9668a6a620294ba49) ) - ROM_LOAD( "cpu_2732_ic25_rom18_rev1.10i", 0x40000, 0x2000, CRC(47580af5) SHA1(d2728f32f02b549c7e9691c668f0097e327a1d2d) ) - ROM_LOAD( "cpu_2732_ic23_rom16_rev1.10g", 0x42000, 0x2000, CRC(869b5942) SHA1(a3f4bab4c0db71589e9be2bbf1f94052ef2f56da) ) - ROM_LOAD( "cpu_2732_ic21_rom14_rev1.9i", 0x44000, 0x2000, CRC(0bbd867c) SHA1(f2db9fc57b6afb762715617345e8c3dcb89b6cc2) ) - ROM_LOAD( "cpu_2732_ic19_rom12_rev1.9g", 0x46000, 0x2000, CRC(b9221ed1) SHA1(428ea8f3e2fa58d875f581f5de6e0d05ed855a45) ) + ROM_LOAD( "cpu_2732_ic25_rom18_rev1.10i", 0x28000, 0x2000, CRC(47580af5) SHA1(d2728f32f02b549c7e9691c668f0097e327a1d2d) ) + ROM_LOAD( "cpu_2732_ic23_rom16_rev1.10g", 0x2a000, 0x2000, CRC(869b5942) SHA1(a3f4bab4c0db71589e9be2bbf1f94052ef2f56da) ) + ROM_LOAD( "cpu_2732_ic21_rom14_rev1.9i", 0x2c000, 0x2000, CRC(0bbd867c) SHA1(f2db9fc57b6afb762715617345e8c3dcb89b6cc2) ) + ROM_LOAD( "cpu_2732_ic19_rom12_rev1.9g", 0x2e000, 0x2000, CRC(b9221ed1) SHA1(428ea8f3e2fa58d875f581f5de6e0d05ed855a45) ) // sound CPU ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "cpu_2764_ic8_rom1_rev1.0f", 0x0E000, 0x2000, CRC(84517c3c) SHA1(de0b6473953783c091ddcc7aaa89fc1ec3b9d378) ) + ROM_LOAD( "cpu_2764_ic8_rom1_rev1.0f", 0x0e000, 0x2000, CRC(84517c3c) SHA1(de0b6473953783c091ddcc7aaa89fc1ec3b9d378) ) // sound board ROM_REGION( 0x80000, "bg:cpu", 0 ) @@ -3742,7 +3738,7 @@ ROM_START( joust2 ) ROM_RELOAD( 0x50000, 0x8000 ) ROM_RELOAD( 0x58000, 0x8000 ) - ROM_REGION( 0xc000, "gfx1", 0 ) + ROM_REGION( 0xc000, "tiles", 0 ) ROM_LOAD( "vid_27128_ic57_rom20_rev1.8f", 0x00000, 0x4000, CRC(572c6b01) SHA1(651df3223c1dc42543f57a7204ae492eb15a4999) ) ROM_LOAD( "vid_27128_ic58_rom21_rev1.9f", 0x04000, 0x4000, CRC(aa94bf05) SHA1(3412dd181e2c12dc2dd1caabfe7e737005b0ccd7) ) ROM_LOAD( "vid_27128_ic41_rom22_rev1.9d", 0x08000, 0x4000, CRC(c41e3daa) SHA1(fafe76bebd6eaf2cd124c1030e3a58eb5a6cddc6) ) @@ -3755,7 +3751,7 @@ ROM_END ROM_START( joust2r1 ) - ROM_REGION( 0x50000, "maincpu", 0 ) + ROM_REGION( 0x30000, "maincpu", 0 ) ROM_LOAD( "cpu_2732_ic55_rom2_rev1.4c", 0x0d000, 0x1000, CRC(08b0d5bd) SHA1(b58da478aef36ae20fcfee48151d5d556e16b7b9) ) ROM_LOAD( "cpu_2732_ic9_rom3_rev1.4d", 0x0e000, 0x1000, CRC(6f319644) SHA1(1a9bc121b830277c42bac816ec26758c915b49dd) ) ROM_LOAD( "cpu_2732_ic10_rom4_rev1.4f", 0x0f000, 0x1000, CRC(027b9f0c) SHA1(8c4631fc42ed0b87b2bb0326c48b92d73cdd2f42) ) @@ -3765,23 +3761,23 @@ ROM_START( joust2r1 ) ROM_LOAD( "cpu_2732_ic14_rom7_rev1.6j", 0x14000, 0x2000, CRC(fb9455ca) SHA1(8963832f2ab6f5b2f31611e768cab636672f398c) ) ROM_LOAD( "cpu_2732_ic12_rom5_rev1.6h", 0x16000, 0x2000, CRC(31248a0d) SHA1(a27a252b353f99748aacfeb29c8bbbd8b3a833f2) ) - ROM_LOAD( "cpu_2732_ic26_rom19_rev1.10j", 0x20000, 0x2000, CRC(4ef5e805) SHA1(98b93388ab4a4fa6eeceee3386fa46f5a307b8cb) ) - ROM_LOAD( "cpu_2732_ic24_rom17_rev1.10h", 0x22000, 0x2000, CRC(4861f063) SHA1(6db00cce230bf4bdfdfbfe59e0dc2d916b84d0dc) ) - ROM_LOAD( "cpu_2732_ic22_rom15_rev1.9j", 0x24000, 0x2000, CRC(421aafa8) SHA1(06187ba8fef3e89eb399d7040015212bd5f86853) ) - ROM_LOAD( "cpu_2732_ic20_rom13_rev1.9h", 0x26000, 0x2000, CRC(3432ff55) SHA1(aec0f83b92369de8a830ec298ac490a51bc29f26) ) + ROM_LOAD( "cpu_2732_ic26_rom19_rev1.10j", 0x18000, 0x2000, CRC(4ef5e805) SHA1(98b93388ab4a4fa6eeceee3386fa46f5a307b8cb) ) + ROM_LOAD( "cpu_2732_ic24_rom17_rev1.10h", 0x1a000, 0x2000, CRC(4861f063) SHA1(6db00cce230bf4bdfdfbfe59e0dc2d916b84d0dc) ) + ROM_LOAD( "cpu_2732_ic22_rom15_rev1.9j", 0x1c000, 0x2000, CRC(421aafa8) SHA1(06187ba8fef3e89eb399d7040015212bd5f86853) ) + ROM_LOAD( "cpu_2732_ic20_rom13_rev1.9h", 0x1e000, 0x2000, CRC(3432ff55) SHA1(aec0f83b92369de8a830ec298ac490a51bc29f26) ) - ROM_LOAD( "cpu_2732_ic17_rom10_rev1.8i", 0x30000, 0x2000, CRC(3e01b597) SHA1(17d09482636d6cda2f3266152396f0461121e748) ) - ROM_LOAD( "cpu_2732_ic15_rom8_rev1.8g", 0x32000, 0x2000, CRC(ff26fb29) SHA1(5ad498db71c384c1928ec965ba3cad48af428f19) ) - ROM_LOAD( "cpu_2732_ic13_rom6_rev1.6i", 0x34000, 0x2000, CRC(6a8c87d7) SHA1(ba66cd8f23a249470c612890829d40d070bbd1e9) ) + ROM_LOAD( "cpu_2732_ic17_rom10_rev1.8i", 0x20000, 0x2000, CRC(3e01b597) SHA1(17d09482636d6cda2f3266152396f0461121e748) ) + ROM_LOAD( "cpu_2732_ic15_rom8_rev1.8g", 0x22000, 0x2000, CRC(ff26fb29) SHA1(5ad498db71c384c1928ec965ba3cad48af428f19) ) + ROM_LOAD( "cpu_2732_ic13_rom6_rev1.6i", 0x24000, 0x2000, CRC(6a8c87d7) SHA1(ba66cd8f23a249470c612890829d40d070bbd1e9) ) - ROM_LOAD( "cpu_2732_ic25_rom18_rev1.10i", 0x40000, 0x2000, CRC(47580af5) SHA1(d2728f32f02b549c7e9691c668f0097e327a1d2d) ) - ROM_LOAD( "cpu_2732_ic23_rom16_rev1.10g", 0x42000, 0x2000, CRC(869b5942) SHA1(a3f4bab4c0db71589e9be2bbf1f94052ef2f56da) ) - ROM_LOAD( "cpu_2732_ic21_rom14_rev1.9i", 0x44000, 0x2000, CRC(0bbd867c) SHA1(f2db9fc57b6afb762715617345e8c3dcb89b6cc2) ) - ROM_LOAD( "cpu_2732_ic19_rom12_rev1.9g", 0x46000, 0x2000, CRC(b9221ed1) SHA1(428ea8f3e2fa58d875f581f5de6e0d05ed855a45) ) + ROM_LOAD( "cpu_2732_ic25_rom18_rev1.10i", 0x28000, 0x2000, CRC(47580af5) SHA1(d2728f32f02b549c7e9691c668f0097e327a1d2d) ) + ROM_LOAD( "cpu_2732_ic23_rom16_rev1.10g", 0x2a000, 0x2000, CRC(869b5942) SHA1(a3f4bab4c0db71589e9be2bbf1f94052ef2f56da) ) + ROM_LOAD( "cpu_2732_ic21_rom14_rev1.9i", 0x2c000, 0x2000, CRC(0bbd867c) SHA1(f2db9fc57b6afb762715617345e8c3dcb89b6cc2) ) + ROM_LOAD( "cpu_2732_ic19_rom12_rev1.9g", 0x2e000, 0x2000, CRC(b9221ed1) SHA1(428ea8f3e2fa58d875f581f5de6e0d05ed855a45) ) // sound CPU ROM_REGION( 0x10000, "soundcpu", 0 ) - ROM_LOAD( "cpu_2764_ic8_rom1_rev1.0f", 0x0E000, 0x2000, CRC(84517c3c) SHA1(de0b6473953783c091ddcc7aaa89fc1ec3b9d378) ) + ROM_LOAD( "cpu_2764_ic8_rom1_rev1.0f", 0x0e000, 0x2000, CRC(84517c3c) SHA1(de0b6473953783c091ddcc7aaa89fc1ec3b9d378) ) // sound board ROM_REGION( 0x80000, "bg:cpu", 0 ) @@ -3798,7 +3794,7 @@ ROM_START( joust2r1 ) ROM_RELOAD( 0x50000, 0x8000 ) ROM_RELOAD( 0x58000, 0x8000 ) - ROM_REGION( 0xc000, "gfx1", 0 ) + ROM_REGION( 0xc000, "tiles", 0 ) ROM_LOAD( "vid_27128_ic57_rom20_rev1.8f", 0x00000, 0x4000, CRC(572c6b01) SHA1(651df3223c1dc42543f57a7204ae492eb15a4999) ) ROM_LOAD( "vid_27128_ic58_rom21_rev1.9f", 0x04000, 0x4000, CRC(aa94bf05) SHA1(3412dd181e2c12dc2dd1caabfe7e737005b0ccd7) ) ROM_LOAD( "vid_27128_ic41_rom22_rev1.9d", 0x08000, 0x4000, CRC(c41e3daa) SHA1(fafe76bebd6eaf2cd124c1030e3a58eb5a6cddc6) ) @@ -3819,7 +3815,7 @@ ROM_END void defender_state::init_defndjeu() { - uint8_t *rom = memregion("maincpu")->base(); + uint8_t *const rom = memregion("maincpu")->base(); // apply simple decryption by swapping bits 0 and 7 for (int i = 0xd000; i < 0x19000; i++) @@ -3862,7 +3858,7 @@ GAME( 1980, attackf, defender, defender, defender, defender_state, e GAME( 1981, galwars2, defender, defender_6802snd, defender, defender_state, empty_init, ROT0, "bootleg (Sonic)", "Galaxy Wars II (bootleg of Defender)", MACHINE_SUPPORTS_SAVE ) // Sega Sonic - Sega S.A., only displays Sonic on title screen GAME( 1980, mayday, 0, defender, mayday, mayday_state, empty_init, ROT0, "Hoei", "Mayday (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // \ original by Hoei, which one of these 3 sets is bootleg/licensed/original is unknown -GAME( 1980, maydaya, mayday, defender, mayday, mayday_state, empty_init, ROT0, "Hoei", "Mayday (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // > these games have an unemulated protection chip of some sort which is hacked around in /machine/williams.cpp "protection_r" function +GAME( 1980, maydaya, mayday, defender, mayday, mayday_state, empty_init, ROT0, "Hoei", "Mayday (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // > these games have an unemulated protection chip of some sort which is hacked around in /midway/williams_m.cpp "protection_r" function GAME( 1980, maydayb, mayday, defender, mayday, mayday_state, empty_init, ROT0, "Hoei", "Mayday (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // / GAME( 1980, batlzone, mayday, defender, mayday, mayday_state, empty_init, ROT0, "bootleg (Video Game)", "Battle Zone (bootleg of Mayday)", MACHINE_SUPPORTS_SAVE ) // the bootleg may or may not use the same protection chip, or some hack around it. diff --git a/src/mame/midway/williams.h b/src/mame/midway/williams.h index d8eaf0eaa4dbe..a62e3a6afa110 100644 --- a/src/mame/midway/williams.h +++ b/src/mame/midway/williams.h @@ -33,16 +33,19 @@ class williams_state : public driver_device public: williams_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_nvram(*this, "nvram"), - m_videoram(*this, "videoram"), - m_mainbank(*this, "mainbank"), m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), m_watchdog(*this, "watchdog"), m_screen(*this, "screen"), m_palette(*this, "palette"), m_paletteram(*this, "paletteram"), - m_pia(*this, "pia_%u", 0U) + m_pia(*this, "pia_%u", 0U), + m_nvram(*this, "nvram"), + m_videoram(*this, "videoram"), + m_mainbank(*this, "mainbank"), + m_rom_view(*this, "rom_view"), + m_49way_x(*this, "49WAYX"), + m_49way_y(*this, "49WAYY") { } void williams_base(machine_config &config); @@ -63,7 +66,7 @@ class williams_state : public driver_device void palette_init(palette_device &palette) const; protected: - virtual void machine_start() override; + virtual void machine_reset() override; virtual void video_start() override; // blitter type @@ -87,9 +90,23 @@ class williams_state : public driver_device WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256 = 0x01 }; + required_device m_maincpu; + required_device m_soundcpu; + required_device m_watchdog; + required_device m_screen; + optional_device m_palette; + optional_shared_ptr m_paletteram; + optional_device_array m_pia; + required_shared_ptr m_nvram; required_shared_ptr m_videoram; optional_memory_bank m_mainbank; + + memory_view m_rom_view; + + optional_ioport m_49way_x; + optional_ioport m_49way_y; + uint8_t m_blitter_config; uint16_t m_blitter_clip_address; uint8_t m_blitter_window_enable; @@ -100,6 +117,7 @@ class williams_state : public driver_device uint8_t m_blitter_remap_index; const uint8_t *m_blitter_remap; std::unique_ptr m_blitter_remap_lookup; + virtual void vram_select_w(u8 data); virtual void cmos_w(offs_t offset, u8 data); void blitter_w(address_space &space, offs_t offset, u8 data); @@ -112,14 +130,6 @@ class williams_state : public driver_device inline void blit_pixel(address_space &space, int dstaddr, int srcdata, int controlbyte); int blitter_core(address_space &space, int sstart, int dstart, int w, int h, int data); - required_device m_maincpu; - required_device m_soundcpu; - required_device m_watchdog; - required_device m_screen; - optional_device m_palette; - optional_shared_ptr m_paletteram; - optional_device_array m_pia; - virtual void main_map(address_map &map); virtual void sound_map(address_map &map); void sound2_map(address_map &map); // for Blaster and Sinistar cockpit @@ -274,7 +284,6 @@ class blaster_state : public williams_state public: blaster_state(const machine_config &mconfig, device_type type, const char *tag) : williams_state(mconfig, type, tag), - m_bankb(*this, "blaster_bankb"), m_muxa(*this, "mux_a"), m_muxb(*this, "mux_b") { } @@ -282,18 +291,17 @@ class blaster_state : public williams_state void blastkit(machine_config &config); void blaster(machine_config &config); -private: +protected: virtual void machine_start() override; + virtual void machine_reset() override; virtual void video_start() override; - optional_memory_bank m_bankb; +private: required_device m_muxa; optional_device m_muxb; rgb_t m_color0; uint8_t m_video_control; - uint8_t m_vram_bank; - uint8_t m_rom_bank; virtual void vram_select_w(u8 data) override; void bank_select_w(u8 data); @@ -304,8 +312,6 @@ class blaster_state : public williams_state virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; - inline void update_blaster_banking(); - virtual void main_map(address_map &map) override; }; @@ -315,9 +321,9 @@ class williams2_state : public williams_state public: williams2_state(const machine_config &mconfig, device_type type, const char *tag) : williams_state(mconfig, type, tag), - m_bank8000(*this, "bank8000"), m_gfxdecode(*this, "gfxdecode"), - m_tileram(*this, "williams2_tile"), + m_tileram(*this, "tileram"), + m_palette_view(*this, "palette_view"), m_gain( { 0.25f, 0.25f, 0.25f }), m_offset({ 0.00f, 0.00f, 0.00f }) { } @@ -338,10 +344,11 @@ class williams2_state : public williams_state virtual void machine_reset() override; virtual void video_start() override; - required_device m_bank8000; required_device m_gfxdecode; required_shared_ptr m_tileram; + memory_view m_palette_view; + tilemap_t *m_bg_tilemap = nullptr; uint16_t m_tilemap_xscroll = 0; uint8_t m_fg_color = 0; @@ -371,7 +378,6 @@ class williams2_state : public williams_state virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; - void bank8000_map(address_map &map); void common_map(address_map &map); virtual void sound_map(address_map &map) override; diff --git a/src/mame/midway/williams_m.cpp b/src/mame/midway/williams_m.cpp index 6582a50425050..1428be448aad7 100644 --- a/src/mame/midway/williams_m.cpp +++ b/src/mame/midway/williams_m.cpp @@ -18,7 +18,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::va11_callback) { - int scanline = param; + int const scanline = param; // must not fire at line 256 if (scanline == 256) @@ -31,7 +31,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::va11_callback) TIMER_DEVICE_CALLBACK_MEMBER(williams_state::count240_callback) { - int scanline = param; + int const scanline = param; // the COUNT240 signal comes into CA1, and is set to the logical AND of VA10-VA13 m_pia[1]->ca1_w(scanline >= 240 ? 1 : 0); @@ -44,11 +44,9 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::count240_callback) * *************************************/ -void williams_state::machine_start() +void williams_state::machine_reset() { - /* configure the memory bank */ - m_mainbank->configure_entry(1, memregion("maincpu")->base() + 0x10000); - m_mainbank->configure_entry(0, m_videoram); + m_rom_view.disable(); } @@ -60,7 +58,7 @@ void williams_state::machine_start() TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::va11_callback) { - int scanline = param; + int const scanline = param; if (scanline == 256) return; @@ -72,7 +70,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::va11_callback) TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::endscreen_callback) { - int scanline = param; + int const scanline = param; // the /ENDSCREEN signal comes into CA1 m_pia[0]->ca1_w(scanline >= 254 ? 0 : 1); @@ -88,15 +86,17 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::endscreen_callback) void williams2_state::machine_start() { + williams_state::machine_start(); + /* configure memory banks */ - m_mainbank->configure_entries(1, 4, memregion("maincpu")->base() + 0x10000, 0x10000); - m_mainbank->configure_entry(0, m_videoram); - membank("vram8000")->set_base(&m_videoram[0x8000]); + m_mainbank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x8000); } void williams2_state::machine_reset() { + williams_state::machine_reset(); + /* make sure our banking is reset */ bank_select_w(0); } @@ -112,10 +112,13 @@ void williams2_state::machine_reset() void williams_state::vram_select_w(u8 data) { /* VRAM/ROM banking from bit 0 */ - m_mainbank->set_entry(data & 0x01); + if (BIT(data, 0)) + m_rom_view.select(0); + else + m_rom_view.disable(); /* cocktail flip from bit 1 */ - m_cocktail = data & 0x02; + m_cocktail = BIT(data, 1); } @@ -126,21 +129,23 @@ void williams2_state::bank_select_w(u8 data) { /* page 0 is video ram */ case 0: - m_mainbank->set_entry(0); - m_bank8000->set_bank(0); + m_rom_view.disable(); + m_palette_view.disable(); break; /* pages 1 and 2 are ROM */ case 1: case 2: - m_mainbank->set_entry(1 + ((data & 6) >> 1)); - m_bank8000->set_bank(0); + m_mainbank->set_entry((data & 6) >> 1); + m_rom_view.select(0); + m_palette_view.disable(); break; /* page 3 accesses palette RAM; the remaining areas are as if page 1 ROM was selected */ case 3: - m_mainbank->set_entry(1 + ((data & 4) >> 1)); - m_bank8000->set_bank(1); + m_mainbank->set_entry((data & 4) >> 1); + m_rom_view.select(0); + m_palette_view.select(0); break; } } @@ -210,7 +215,7 @@ void williams2_state::snd_cmd_w(u8 data) u8 williams_state::port_0_49way_r() { static const uint8_t translate49[7] = { 0x0, 0x4, 0x6, 0x7, 0xb, 0x9, 0x8 }; - return (translate49[ioport("49WAYX")->read() >> 4] << 4) | translate49[ioport("49WAYY")->read() >> 4]; + return (translate49[m_49way_x->read() >> 4] << 4) | translate49[m_49way_y->read() >> 4]; } @@ -308,13 +313,15 @@ void williams2_state::segments_w(u8 data) void defender_state::machine_reset() { + williams_state::machine_reset(); + bank_select_w(0); } void defender_state::video_control_w(u8 data) { - m_cocktail = data & 0x01; + m_cocktail = BIT(data, 0); } @@ -355,7 +362,7 @@ void sinistar_state::vram_select_w(u8 data) williams_state::vram_select_w(data); /* window enable from bit 2 (clips to 0x7400) */ - m_blitter_window_enable = data & 0x04; + m_blitter_window_enable = BIT(data, 2); } @@ -385,54 +392,46 @@ void sinistar_state::cockpit_snd_cmd_w(u8 data) void blaster_state::machine_start() { - /* banking is different for blaster */ - m_mainbank->configure_entries(1, 16, memregion("maincpu")->base() + 0x18000, 0x4000); - m_mainbank->configure_entry(0, m_videoram); - - m_bankb->configure_entries(1, 16, memregion("maincpu")->base() + 0x10000, 0x0000); - m_bankb->configure_entry(0, &m_videoram[0x4000]); - - /* register for save states */ - save_item(NAME(m_vram_bank)); - save_item(NAME(m_rom_bank)); + williams_state::machine_start(); - m_vram_bank = 0; - m_rom_bank = 0; + /* banking is different for blaster */ + m_mainbank->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000); } - -inline void blaster_state::update_blaster_banking() +void blaster_state::machine_reset() { - m_mainbank->set_entry(m_vram_bank * (m_rom_bank + 1)); - m_bankb->set_entry(m_vram_bank * (m_rom_bank + 1)); + williams_state::machine_reset(); + + m_mainbank->set_entry(0); } void blaster_state::vram_select_w(u8 data) { /* VRAM/ROM banking from bit 0 */ - m_vram_bank = data & 0x01; - update_blaster_banking(); + if (BIT(data, 0)) + m_rom_view.select(0); + else + m_rom_view.disable(); /* cocktail flip from bit 1 */ - m_cocktail = data & 0x02; + m_cocktail = BIT(data, 1); /* window enable from bit 2 (clips to 0x9700) */ - m_blitter_window_enable = data & 0x04; + m_blitter_window_enable = BIT(data, 2); } void blaster_state::bank_select_w(u8 data) { - m_rom_bank = data & 0x0f; - update_blaster_banking(); + m_mainbank->set_entry(data & 0x0f); } TIMER_CALLBACK_MEMBER(blaster_state::deferred_snd_cmd_w) { - uint8_t l_data = param | 0x80; - uint8_t r_data = (param >> 1 & 0x40) | (param & 0x3f) | 0x80; + uint8_t const l_data = param | 0x80; + uint8_t const r_data = (param >> 1 & 0x40) | (param & 0x3f) | 0x80; m_pia[2]->portb_w(l_data); m_pia[2]->cb1_w((l_data == 0xff) ? 0 : 1); m_pia[3]->portb_w(r_data); m_pia[3]->cb1_w((r_data == 0xff) ? 0 : 1); @@ -454,7 +453,7 @@ void blaster_state::blaster_snd_cmd_w(u8 data) void williams2_state::video_control_w(u8 data) { - m_cocktail = data & 0x01; + m_cocktail = BIT(data, 0); } @@ -468,6 +467,7 @@ void williams2_state::video_control_w(u8 data) void tshoot_state::machine_start() { williams2_state::machine_start(); + m_grenade_lamp.resolve(); m_gun_lamp.resolve(); m_p1_gun_recoil.resolve(); @@ -505,6 +505,7 @@ void tshoot_state::lamp_w(u8 data) void joust2_state::machine_start() { williams2_state::machine_start(); + save_item(NAME(m_current_sound_data)); } diff --git a/src/mame/midway/williams_v.cpp b/src/mame/midway/williams_v.cpp index e60c0994c4658..1ecefa71c7071 100644 --- a/src/mame/midway/williams_v.cpp +++ b/src/mame/midway/williams_v.cpp @@ -225,7 +225,7 @@ uint32_t williams_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm /* loop over columns */ for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { - int const pix = source[(x/2) * 256]; + uint8_t const pix = source[(x/2) * 256]; dest[x+0] = pens[pix >> 4]; dest[x+1] = pens[pix & 0x0f]; } @@ -236,8 +236,8 @@ uint32_t williams_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm uint32_t blaster_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - uint8_t *palette_0 = &m_videoram[0xbb00]; - uint8_t *scanline_control = &m_videoram[0xbc00]; + uint8_t const *const palette_0 = &m_videoram[0xbb00]; + uint8_t const *const scanline_control = &m_videoram[0xbc00]; rgb_t pens[16]; /* precompute the palette */ @@ -251,7 +251,7 @@ uint32_t blaster_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma /* loop over rows */ for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { - int erase_behind = m_video_control & scanline_control[y] & 2; + int const erase_behind = m_video_control & scanline_control[y] & 2; uint8_t *const source = &m_videoram[y]; uint32_t *const dest = &bitmap.pix(y); @@ -262,7 +262,7 @@ uint32_t blaster_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma /* loop over columns */ for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { - int const pix = source[(x/2) * 256]; + uint8_t const pix = source[(x/2) * 256]; /* clear behind us if requested */ if (erase_behind) @@ -297,7 +297,7 @@ uint32_t williams2_state::screen_update(screen_device &screen, bitmap_rgb32 &bit /* loop over columns */ for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { - int const pix = source[(x/2) * 256]; + uint8_t const pix = source[(x/2) * 256]; if (pix & 0xf0) dest[x+0] = pens[pix >> 4]; @@ -331,7 +331,7 @@ uint32_t mysticm_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma /* loop over columns */ for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { - int const pix = source[(x/2) * 256]; + uint8_t const pix = source[(x/2) * 256]; if (pix & 0xf0) dest[x+0] = pens[pix >> 4]; @@ -463,14 +463,12 @@ rgb_t williams2_state::calc_col(uint16_t lo, uint16_t hi) void williams2_state::paletteram_w(offs_t offset, u8 data) { - uint16_t entry_lo, entry_hi; - /* set the new value */ m_paletteram[offset] = data; /* pull the associated low/high bytes */ - entry_lo = m_paletteram[offset & ~1]; - entry_hi = m_paletteram[offset | 1]; + uint16_t entry_lo = m_paletteram[offset & ~1]; + uint16_t entry_hi = m_paletteram[offset | 1]; m_bg_tilemap->mark_all_dirty(); @@ -480,7 +478,7 @@ void williams2_state::paletteram_w(offs_t offset, u8 data) void williams2_state::rebuild_palette() { - for (offs_t i=0; i<2048; i++) + for (offs_t i = 0; i < 2048; i++) paletteram_w(i, m_paletteram[i]); } @@ -522,12 +520,12 @@ u8 williams2_state::video_counter_r() TILE_GET_INFO_MEMBER(williams2_state::get_tile_info) { - int mask = m_gfxdecode->gfx(0)->elements() - 1; - int data = m_tileram[tile_index]; - int y = (tile_index >> 1) & 7; + int const mask = m_gfxdecode->gfx(0)->elements() - 1; + int const data = m_tileram[tile_index]; + int const y = (tile_index >> 1) & 7; /* On tshoot and inferno, IC79 is a 74LS157 selector jumpered to be enabled */ - int color = y; + int const color = y; tileinfo.set(0, data & mask, color, (data & ~mask) ? TILE_FLIPX : 0); } @@ -535,10 +533,10 @@ TILE_GET_INFO_MEMBER(williams2_state::get_tile_info) int mysticm_state::color_decode(uint8_t base_col, int sig_J1, int y) { - int v = y << 6; - int sig_W11 = (v >> 11) & 1; - int sig_W12 = (v >> 12) & 1; - int sig_W13 = (v >> 13) & 1; + int const v = y << 6; + int const sig_W11 = (v >> 11) & 1; + int const sig_W12 = (v >> 12) & 1; + int const sig_W13 = (v >> 13) & 1; // There are four "jumpers" in the schematics. // J3 and J4 allow to turn off background tilemaps completely. @@ -556,9 +554,9 @@ int mysticm_state::color_decode(uint8_t base_col, int sig_J1, int y) // FIXME: Investigate further. /* IC79 is a 74LS85 comparator that controls the low bit */ - int a = 1 | ((base_col & 1) << 2) | ((base_col & 1) << 3); - int b = (sig_W12 << 0) | (sig_W13 << 1) | (0 << 2) | (sig_J1 << 3); - int color = (a > b) || ((a == b) && !sig_W11); + int const a = 1 | ((base_col & 1) << 2) | ((base_col & 1) << 3); + int const b = (sig_W12 << 0) | (sig_W13 << 1) | (0 << 2) | (sig_J1 << 3); + int const color = (a > b) || ((a == b) && !sig_W11); // mysticm schematics show Page1 and Page2 crossed, i.e. // Page1 -> B2 (IC80) and Page2 -> B1 (IC80) @@ -571,10 +569,10 @@ int mysticm_state::color_decode(uint8_t base_col, int sig_J1, int y) TILE_GET_INFO_MEMBER(mysticm_state::get_tile_info) { - int color = color_decode(m_bg_color, 0, (tile_index << 4) & 0xff); + int const color = color_decode(m_bg_color, 0, (tile_index << 4) & 0xff); - int mask = m_gfxdecode->gfx(0)->elements() - 1; - int data = m_tileram[tile_index]; + int const mask = m_gfxdecode->gfx(0)->elements() - 1; + int const data = m_tileram[tile_index]; //m_bg_tilemap->set_palette_offset((color & 0x3e) << 4); //tileinfo.set(0, data & mask, color & 1, (data & ~mask) ? TILE_FLIPX : 0); @@ -588,11 +586,11 @@ TILE_GET_INFO_MEMBER(mysticm_state::get_tile_info) TILE_GET_INFO_MEMBER(joust2_state::get_tile_info) { - int mask = m_gfxdecode->gfx(0)->elements() - 1; - int data = m_tileram[tile_index]; + int const mask = m_gfxdecode->gfx(0)->elements() - 1; + int const data = m_tileram[tile_index]; /* IC79 is a 74LS157 selector jumpered to be disabled */ - int color = 0; + int const color = 0; tileinfo.set(0, data & mask, color, (data & ~mask) ? TILE_FLIPX : 0); } @@ -713,7 +711,7 @@ void williams_state::blitter_w(address_space &space, offs_t offset, u8 data) if (h == 0) h = 1; /* do the actual blit */ - int accesses = blitter_core(space, sstart, dstart, w, h, data); + int const accesses = blitter_core(space, sstart, dstart, w, h, data); /* based on the number of memory accesses needed to do the blit, compute how long the blit will take */ int estimated_clocks_at_4MHz = 4; @@ -741,7 +739,7 @@ void williams_state::blitter_w(address_space &space, offs_t offset, u8 data) void williams2_state::blit_window_enable_w(u8 data) { - m_blitter_window_enable = data & 0x01; + m_blitter_window_enable = BIT(data, 0); } @@ -757,7 +755,7 @@ inline void williams_state::blit_pixel(address_space &space, int dstaddr, int sr /* always read from video RAM regardless of the bank setting */ int curpix = (dstaddr < 0xc000) ? m_videoram[dstaddr] : space.read_byte(dstaddr); // current pixel values at dest - int solid = m_blitterram[1]; + int const solid = m_blitterram[1]; unsigned char keepmask = 0xff; // what part of original dst byte should be kept, based on NO_EVEN and NO_ODD flags // even pixel (D7-D4) @@ -803,10 +801,10 @@ int williams_state::blitter_core(address_space &space, int sstart, int dstart, i int accesses = 0; /* compute how much to advance in the x and y loops */ - int sxadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256) ? 0x100 : 1; - int syadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256) ? 1 : w; - int dxadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256) ? 0x100 : 1; - int dyadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256) ? 1 : w; + int const sxadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256) ? 0x100 : 1; + int const syadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256) ? 1 : w; + int const dxadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256) ? 0x100 : 1; + int const dyadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256) ? 1 : w; int pixdata = 0; diff --git a/src/mame/midway/wmg.cpp b/src/mame/midway/wmg.cpp index cdfc9c0b6493f..e2803245dfc53 100644 --- a/src/mame/midway/wmg.cpp +++ b/src/mame/midway/wmg.cpp @@ -80,8 +80,6 @@ of save-state is also needed. namespace { -#define MASTER_CLOCK (XTAL(12'000'000)) -#define SOUND_CLOCK (XTAL(3'579'545)) class wmg_state : public defender_state { @@ -98,7 +96,20 @@ class wmg_state : public defender_state template DECLARE_CUSTOM_INPUT_MEMBER(wmg_mux_r); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + private: + required_shared_ptr m_p_ram; + required_ioport_array<17> m_keyboard; + required_memory_bank m_codebank; + required_memory_bank m_soundbank; + + uint8_t m_wmg_c400 = 0U; + uint8_t m_wmg_d000 = 0U; + uint8_t m_port_select = 0U; + u8 wmg_nvram_r(offs_t offset); void wmg_nvram_w(offs_t offset, u8 data); u8 wmg_pia_0_r(offs_t offset); @@ -113,17 +124,6 @@ class wmg_state : public defender_state void wmg_cpu2(address_map &map); void wmg_banked_map(address_map &map); - virtual void machine_start() override; - virtual void machine_reset() override; - - uint8_t m_wmg_c400 = 0U; - uint8_t m_wmg_d000 = 0U; - uint8_t m_wmg_port_select = 0U; - uint8_t m_wmg_vram_bank = 0U; - required_shared_ptr m_p_ram; - required_ioport_array<17> m_keyboard; - required_memory_bank m_codebank; - required_memory_bank m_soundbank; }; @@ -135,10 +135,11 @@ class wmg_state : public defender_state *************************************/ void wmg_state::wmg_cpu1(address_map &map) { - map(0x0000, 0xbfff).ram().share("videoram"); - map(0x0000, 0x8fff).bankr("mainbank"); + map(0x0000, 0xbfff).ram().share(m_videoram); + map(0x0000, 0x8fff).view(m_rom_view); + m_rom_view[0](0x0000, 0x8fff).bankr(m_mainbank); map(0xc000, 0xcfff).m(m_bankc000, FUNC(address_map_bank_device::amap8)); - map(0xd000, 0xffff).bankr("codebank"); + map(0xd000, 0xffff).bankr(m_codebank); map(0xd000, 0xd000).w(FUNC(wmg_state::wmg_d000_w)); } @@ -147,12 +148,12 @@ void wmg_state::wmg_cpu2(address_map &map) map(0x0000, 0x007f).ram(); /* internal RAM */ map(0x0080, 0x00ff).ram(); /* MC6810 RAM */ map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); - map(0xf000, 0xffff).bankr("soundbank"); + map(0xf000, 0xffff).bankr(m_soundbank); } void wmg_state::wmg_banked_map(address_map &map) { - map(0x0000, 0x000f).mirror(0x03e0).writeonly().share("paletteram"); + map(0x0000, 0x000f).mirror(0x03e0).writeonly().share(m_paletteram); map(0x0010, 0x001f).mirror(0x03e0).w(FUNC(wmg_state::video_control_w)); map(0x0400, 0x0400).w(FUNC(wmg_state::wmg_c400_w)); map(0x0401, 0x0401).w(FUNC(wmg_state::wmg_sound_reset_w)); @@ -363,7 +364,7 @@ void wmg_state::wmg_c400_w(u8 data) { m_wmg_c400 = data; wmg_d000_w(0); // select i/o - m_mainbank->set_entry(m_wmg_vram_bank ? (1+m_wmg_c400) : 0); // Gfx etc + m_mainbank->set_entry(data); // Gfx etc m_codebank->set_entry(data); // Code m_soundbank->set_entry(data); // Sound m_soundcpu->reset(); @@ -379,8 +380,10 @@ void wmg_state::wmg_sound_reset_w(u8 data) void wmg_state::wmg_vram_select_w(u8 data) { /* VRAM/ROM banking from bit 0 */ - m_wmg_vram_bank = BIT(data, 0); - m_mainbank->set_entry(m_wmg_vram_bank ? (1+m_wmg_c400) : 0); + if (BIT(data, 0)) + m_rom_view.select(0); + else + m_rom_view.disable(); /* cocktail flip from bit 1 */ m_cocktail = BIT(data, 1); @@ -431,23 +434,21 @@ void wmg_state::machine_start() { uint8_t *cpu = memregion("maincpu")->base(); uint8_t *snd = memregion("soundcpu")->base(); - m_mainbank->configure_entry(0, m_videoram); - m_mainbank->configure_entries(1, 8, &cpu[0x00000], 0x10000); // Gfx etc + m_mainbank->configure_entries(0, 8, &cpu[0x00000], 0x10000); // Gfx etc m_codebank->configure_entries(0, 8, &cpu[0x0d000], 0x10000); // Code m_soundbank->configure_entries(0, 8, &snd[0x00000], 0x1000); // Sound save_item(NAME(m_wmg_c400)); save_item(NAME(m_wmg_d000)); - save_item(NAME(m_wmg_port_select)); - save_item(NAME(m_wmg_vram_bank)); + save_item(NAME(m_port_select)); } void wmg_state::machine_reset() { - m_wmg_c400=0xff; - m_wmg_d000=0xff; - m_wmg_port_select=0; - m_wmg_vram_bank=0; + m_wmg_c400 = 0xff; + m_wmg_d000 = 0xff; + m_port_select = 0; + m_rom_view.disable(); wmg_c400_w(0); m_maincpu->reset(); } @@ -460,7 +461,7 @@ void wmg_state::machine_reset() void wmg_state::wmg_port_select_w(int state) { - m_wmg_port_select = state | (m_wmg_c400 << 1); + m_port_select = state | (m_wmg_c400 << 1); } template @@ -468,13 +469,13 @@ CUSTOM_INPUT_MEMBER(wmg_state::wmg_mux_r) { if (N == 0) { - uint8_t ports[17] = { 0,0,2,2,5,4,7,7,9,9,11,11,14,13,9,9 }; - return m_keyboard[ports[m_wmg_port_select]]->read(); + uint8_t const ports[17] = { 0,0,2,2,5,4,7,7,9,9,11,11,14,13,9,9 }; + return m_keyboard[ports[m_port_select]]->read(); } else { - uint8_t ports[17] = { 1,1,3,3,6,6,8,8,10,10,12,12,16,15,10,10 }; - return m_keyboard[ports[m_wmg_port_select]]->read(); + uint8_t const ports[17] = { 1,1,3,3,6,6,8,8,10,10,12,12,16,15,10,10 }; + return m_keyboard[ports[m_port_select]]->read(); } } @@ -484,12 +485,15 @@ u8 wmg_state::wmg_pia_0_r(offs_t offset) Since there is no code in rom to handle this, it must be a hardware feature which probably just resets the cpu. */ - uint8_t data = m_pia[0]->read(offset); + uint8_t const data = m_pia[0]->read(offset); - if ((m_wmg_c400) && (offset == 0) && ((data & 0x30) == 0x30)) // P1 and P2 pressed + if (!machine().side_effects_disabled()) { - wmg_c400_w(0); - m_maincpu->reset(); + if ((m_wmg_c400) && (offset == 0) && ((data & 0x30) == 0x30)) // P1 and P2 pressed + { + wmg_c400_w(0); + m_maincpu->reset(); + } } return data; @@ -500,8 +504,12 @@ u8 wmg_state::wmg_pia_0_r(offs_t offset) * Machine Driver * *************************************/ + void wmg_state::wmg(machine_config &config) { + constexpr XTAL MASTER_CLOCK = 12_MHz_XTAL; + constexpr XTAL SOUND_CLOCK = 3.579545_MHz_XTAL; + /* basic machine hardware */ MC6809E(config, m_maincpu, MASTER_CLOCK/3/4); m_maincpu->set_addrmap(AS_PROGRAM, &wmg_state::wmg_cpu1); @@ -511,7 +519,7 @@ void wmg_state::wmg(machine_config &config) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - ADDRESS_MAP_BANK(config, "bankc000").set_map(&wmg_state::wmg_banked_map).set_options(ENDIANNESS_BIG, 8, 16, 0x1000); + ADDRESS_MAP_BANK(config, m_bankc000).set_map(&wmg_state::wmg_banked_map).set_options(ENDIANNESS_BIG, 8, 16, 0x1000); // set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen TIMER(config, "scan_timer").configure_scanline(FUNC(wmg_state::va11_callback), "screen", 0, 32); From cbfcf175b6563afdcb33576f52cfbb9c586ebd71 Mon Sep 17 00:00:00 2001 From: 987123879113 <63495610+987123879113@users.noreply.github.com> Date: Mon, 15 Apr 2024 01:08:15 +0900 Subject: [PATCH 098/109] konami/konamigv.cpp: Removed inputs that are not present from Tokimeki Memorial Oshiete Your Heart games. (#12245) These inputs are not physically present and are not displayed in test mode. --- src/mame/konami/konamigv.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/mame/konami/konamigv.cpp b/src/mame/konami/konamigv.cpp index b18b931c2ee67..0935ce6c7734f 100644 --- a/src/mame/konami/konamigv.cpp +++ b/src/mame/konami/konamigv.cpp @@ -1139,9 +1139,16 @@ void tokimeki_state::tokimeki_device_check_w(int state) static INPUT_PORTS_START( tmosh ) PORT_INCLUDE( konamigv ) + PORT_MODIFY("P1") + PORT_BIT( 0xffffc3e0, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_MODIFY("P2") + PORT_BIT( 0xfffffbff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000400, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(tokimeki_state, tokimeki_device_check_r) + PORT_MODIFY("P3_P4") + PORT_BIT( 0xffffffff, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_MODIFY("EEPROMOUT") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(tokimeki_state, tokimeki_device_check_w) From 79f74ce15feb3a9ca7d640488117535eeb108fdb Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 14 Apr 2024 18:17:54 +0200 Subject: [PATCH 099/109] videoopt: force left-align for view list --- src/frontend/mame/ui/videoopt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/mame/ui/videoopt.cpp b/src/frontend/mame/ui/videoopt.cpp index ae5098b9064ad..bae8fbcda80e5 100644 --- a/src/frontend/mame/ui/videoopt.cpp +++ b/src/frontend/mame/ui/videoopt.cpp @@ -121,7 +121,7 @@ void menu_video_options::populate() if (!m_snapshot || !machine().video().snap_native()) { for (char const *name = m_target.view_name(ref = 0); name; name = m_target.view_name(++ref)) - item_append(name, 0, reinterpret_cast(ITEM_VIEW_FIRST + ref)); + item_append(name, " ", 0, reinterpret_cast(ITEM_VIEW_FIRST + ref)); item_append(menu_item_type::SEPARATOR); } From f5cb973276c624a27a4d3a984ae1e5fcb32a1698 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 15 Apr 2024 01:33:54 +0900 Subject: [PATCH 100/109] midway/midyunit.cpp: Various cleanups (#12248) * Moved Terminator 2 and Mortal Kombat "YAWDIM" bootleg to derived classes. * Simplified Mortal Kombat "YAWDIM" bootleg machine configuration. * Suppress side effects for debugger reads. * Improved ROM region naming. * Use logmacro.h for configurable logging. * Use C++ line comments. --- src/mame/midway/midyunit.cpp | 639 +++++++++++++++++---------------- src/mame/midway/midyunit.h | 160 +++++---- src/mame/midway/midyunit_m.cpp | 195 +++++----- src/mame/midway/midyunit_v.cpp | 156 ++++---- 4 files changed, 608 insertions(+), 542 deletions(-) diff --git a/src/mame/midway/midyunit.cpp b/src/mame/midway/midyunit.cpp index 73de0544b010e..5622720e336f7 100644 --- a/src/mame/midway/midyunit.cpp +++ b/src/mame/midway/midyunit.cpp @@ -84,7 +84,7 @@ PCB Layout Other U* - 27C020 EPROMs -Sound PCB (see /audio/s11c_bg.cpp) +Sound PCB (see /shared/williamssound.cpp) --------- 5766-12702-00 REV. B @@ -125,15 +125,6 @@ Sound PCB (see /audio/s11c_bg.cpp) #include "speaker.h" -/* master clocks vary based on game */ -#define SLOW_MASTER_CLOCK XTAL(40'000'000) /* "slow" == smashtv, trog, hiimpact */ -#define FAST_MASTER_CLOCK XTAL(48'000'000) /* "fast" == narc, mk, totcarn, strkforc */ -#define FASTER_MASTER_CLOCK XTAL(50'000'000) /* "faster" == term2 */ - -/* pixel clocks are 48MHz (narc) or 24MHz (all others) regardless */ -#define MEDRES_PIXEL_CLOCK (XTAL(48'000'000) / 6) -#define STDRES_PIXEL_CLOCK (XTAL(24'000'000) / 6) - /************************************* @@ -142,27 +133,21 @@ Sound PCB (see /audio/s11c_bg.cpp) * *************************************/ -void midyunit_state::yawdim_oki_bank_w(uint8_t data) +void mkyawdim_state::yawdim_oki_bank_w(uint8_t data) { if (data & 4) m_oki->set_rom_bank(data & 3); } -void midyunit_state::yawdim2_oki_bank_w(uint8_t data) +void mkyawdim_state::yawdim2_oki_bank_w(uint8_t data) { - int bnk = (data >> 1 & 4) + (data & 3); + int const bnk = (data >> 1 & 4) + (data & 3); m_oki->set_rom_bank(bnk); if (!(data & 4)) m_oki->reset(); } -uint8_t midyunit_state::yawdim2_soundlatch_r() -{ - m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); - return m_soundlatch->read(); -} - /************************************* @@ -199,7 +184,7 @@ int midyunit_state::adpcm_irq_state_r() void midyunit_state::main_map(address_map &map) { map(0x00000000, 0x001fffff).rw(FUNC(midyunit_state::midyunit_vram_r), FUNC(midyunit_state::midyunit_vram_w)); - map(0x01000000, 0x010fffff).ram().share("mainram"); + map(0x01000000, 0x010fffff).ram().share(m_mainram); map(0x01400000, 0x0140ffff).rw(FUNC(midyunit_state::midyunit_cmos_r), FUNC(midyunit_state::midyunit_cmos_w)); map(0x01800000, 0x0181ffff).ram().w(FUNC(midyunit_state::midyunit_paletteram_w)).share("paletteram"); map(0x01a00000, 0x01a0009f).mirror(0x00080000).rw(FUNC(midyunit_state::midyunit_dma_r), FUNC(midyunit_state::midyunit_dma_w)); @@ -208,19 +193,37 @@ void midyunit_state::main_map(address_map &map) map(0x01e00000, 0x01e0001f).w(FUNC(midyunit_state::midyunit_sound_w)); map(0x01f00000, 0x01f0001f).w(FUNC(midyunit_state::midyunit_control_w)); map(0x02000000, 0x05ffffff).r(FUNC(midyunit_state::midyunit_gfxrom_r)); - map(0xff800000, 0xffffffff).rom().region("user1", 0); + map(0xff800000, 0xffffffff).rom().region("maindata", 0); +} + +void mkyawdim_state::yawdim_main_map(address_map &map) +{ + midyunit_state::main_map(map); + map(0x01e00000, 0x01e0000f).w(FUNC(mkyawdim_state::yawdim_sound_w)); +} + +void mkyawdim_state::yawdim2_main_map(address_map &map) +{ + midyunit_state::main_map(map); + map(0x01e00000, 0x01e0000f).w(FUNC(mkyawdim_state::yawdim2_sound_w)); } -void midyunit_state::yawdim_sound_map(address_map &map) +void mkyawdim_state::yawdim_sound_map(address_map &map) { map(0x0000, 0x7fff).rom(); map(0x8000, 0x87ff).ram(); - map(0x9000, 0x97ff).w(FUNC(midyunit_state::yawdim_oki_bank_w)); + map(0x9000, 0x97ff).w(FUNC(mkyawdim_state::yawdim_oki_bank_w)); map(0x9800, 0x9fff).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0xa000, 0xa7ff).r(m_soundlatch, FUNC(generic_latch_8_device::read)); } +void mkyawdim_state::yawdim2_sound_map(address_map &map) +{ + yawdim_sound_map(map); + map(0x9000, 0x97ff).w(FUNC(mkyawdim_state::yawdim2_oki_bank_w)); +} + /************************************* @@ -252,15 +255,15 @@ static INPUT_PORTS_START( narc ) PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN3 ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) /* Slam Switch */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) // Slam Switch PORT_SERVICE_NO_TOGGLE( 0x0010, IP_ACTIVE_LOW ) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNUSED ) /* Video Freeze */ + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNUSED ) // Video Freeze PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Vault Switch") PORT_CODE(KEYCODE_9) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(midyunit_state, narc_talkback_strobe_r) - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNUSED ) /* memory protect interlock */ + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNUSED ) // memory protect interlock PORT_BIT( 0x3000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0xc000, IP_ACTIVE_LOW, IPT_UNUSED ) /* @@ -308,12 +311,12 @@ static INPUT_PORTS_START( trog ) PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) /* Slam Switch */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) // Slam Switch PORT_SERVICE( 0x0010, IP_ACTIVE_LOW ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BILL1 ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED ) /* video freeze */ + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED ) // video freeze PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START3 ) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_START4 ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(3) @@ -435,7 +438,7 @@ static INPUT_PORTS_START( hiimpact ) PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) PORT_PLAYER(1) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) /* Slam Switch */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) // Slam Switch PORT_SERVICE( 0x0010, IP_ACTIVE_LOW ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(2) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE1 ) @@ -463,21 +466,21 @@ static INPUT_PORTS_START( hiimpact ) PORT_DIPUNUSED_DIPLOC ( 0x0002, 0x0002, "DS1:7" ) PORT_DIPUNUSED_DIPLOC ( 0x0004, 0x0004, "DS1:6" ) PORT_DIPNAME( 0x0078, 0x0078, DEF_STR( Coinage )) PORT_DIPLOCATION("DS1:5,4,3,2") - PORT_DIPSETTING( 0x0078, DEF_STR( 1C_1C )) PORT_CONDITION("DSW", 0xc000, EQUALS, 0xc000) /* Generic coinage (no denomination); 2 identical chutes */ + PORT_DIPSETTING( 0x0078, DEF_STR( 1C_1C )) PORT_CONDITION("DSW", 0xc000, EQUALS, 0xc000) // Generic coinage (no denomination); 2 identical chutes PORT_DIPSETTING( 0x0058, DEF_STR( 2C_1C )) PORT_CONDITION("DSW", 0xc000, EQUALS, 0xc000) PORT_DIPSETTING( 0x0068, "2 Coins/1 Credit 4/3" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0xc000) PORT_DIPSETTING( 0x0048, "2 Coins/1 Credit 4/4" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0xc000) - PORT_DIPSETTING( 0x0070, "ECA" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0xc000) /* 25 cents; 4 chutes - dollar/quarter/dime/nickel */ - PORT_DIPSETTING( 0x0078, "1DM/1 Credit 6/5" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x4000) /* German coinage; these 4 have 2 chutes (1DM/5DM) */ + PORT_DIPSETTING( 0x0070, "ECA" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0xc000) // 25 cents; 4 chutes - dollar/quarter/dime/nickel + PORT_DIPSETTING( 0x0078, "1DM/1 Credit 6/5" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x4000) // German coinage; these 4 have 2 chutes (1DM/5DM) PORT_DIPSETTING( 0x0058, "1DM/1 Credit 7/5" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x4000) PORT_DIPSETTING( 0x0068, "1DM/1 Credit 8/5" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x4000) PORT_DIPSETTING( 0x0048, "1DM/1 Credit" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x4000) - PORT_DIPSETTING( 0x0070, "ECA" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x4000) /* 1/1DM 6/5DM; 3 chutes (5DM/2DM/1DM) */ - PORT_DIPSETTING( 0x0078, "5F/2 Credits 10/5" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x8000) /* French coinage; 2 chutes (5F/10F) */ + PORT_DIPSETTING( 0x0070, "ECA" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x4000) // 1/1DM 6/5DM; 3 chutes (5DM/2DM/1DM) + PORT_DIPSETTING( 0x0078, "5F/2 Credits 10/5" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x8000) // French coinage; 2 chutes (5F/10F) PORT_DIPSETTING( 0x0058, "5F/2 Credits" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x8000) PORT_DIPSETTING( 0x0068, "5F/1 Credit 10/3" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x8000) PORT_DIPSETTING( 0x0048, "5F/1 Credit" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x8000) - PORT_DIPSETTING( 0x0070, "ECA" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x8000) /* 1/3F 2/5F 5/10F; 3 chutes (1F/5F/10F) */ + PORT_DIPSETTING( 0x0070, "ECA" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x8000) // 1/3F 2/5F 5/10F; 3 chutes (1F/5F/10F) PORT_DIPSETTING( 0x0040, DEF_STR( Free_Play )) PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Players )) PORT_DIPLOCATION("DS1:1") PORT_DIPSETTING( 0x0080, "4" ) @@ -540,12 +543,12 @@ static INPUT_PORTS_START( smashtv ) PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) /* Slam Switch */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) // Slam Switch PORT_SERVICE_NO_TOGGLE( 0x0010, IP_ACTIVE_LOW ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BILL1 ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED ) /* video freeze */ + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED ) // video freeze PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0xf800, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -646,7 +649,7 @@ static INPUT_PORTS_START( strkforc ) PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("P1 Start / Transform") - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) /* Slam Switch */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) // Slam Switch PORT_SERVICE( 0x0010, IP_ACTIVE_LOW ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("P2 Start / Transform") PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE1 ) @@ -744,7 +747,7 @@ static INPUT_PORTS_START( mkla4 ) PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) /* Slam Switch */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) // Slam Switch PORT_SERVICE( 0x0010, IP_ACTIVE_LOW ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE1 ) @@ -855,12 +858,12 @@ static INPUT_PORTS_START( term2 ) PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) /* Slam Switch */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) // Slam Switch PORT_SERVICE( 0x0010, IP_ACTIVE_LOW ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_COIN3 ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED ) /* video freeze */ + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED ) // video freeze PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -959,12 +962,12 @@ static INPUT_PORTS_START( totcarn ) PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("P1 Start / Bomb") - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) /* Slam Switch */ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_TILT ) // Slam Switch PORT_SERVICE( 0x0010, IP_ACTIVE_LOW ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("P2 Start / Bomb") PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BILL1 ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED ) /* video freeze */ + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED ) // video freeze PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_BIT( 0x3c00, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(midyunit_state, adpcm_irq_state_r) @@ -1050,9 +1053,17 @@ INPUT_PORTS_END * *************************************/ +// master clocks vary based on game +static constexpr XTAL SLOW_MASTER_CLOCK = XTAL(40'000'000); // "slow" == smashtv, trog, hiimpact +static constexpr XTAL FAST_MASTER_CLOCK = XTAL(48'000'000); // "fast" == narc, mk, totcarn, strkforc +static constexpr XTAL FASTER_MASTER_CLOCK = XTAL(50'000'000); // "faster" == term2 + +// pixel clocks are 48MHz (narc) or 24MHz (all others) regardless +static constexpr XTAL MEDRES_PIXEL_CLOCK = (XTAL(48'000'000) / 6); + void midyunit_state::zunit(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware TMS34010(config, m_maincpu, FAST_MASTER_CLOCK); m_maincpu->set_addrmap(AS_PROGRAM, &midyunit_state::main_map); m_maincpu->set_halt_on_reset(false); @@ -1065,7 +1076,7 @@ void midyunit_state::zunit(machine_config &config) MCFG_MACHINE_RESET_OVERRIDE(midyunit_state,midyunit) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - /* video hardware */ + // video hardware PALETTE(config, m_palette).set_entries(8192); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -1077,7 +1088,7 @@ void midyunit_state::zunit(machine_config &config) MCFG_VIDEO_START_OVERRIDE(midyunit_state,midzunit) - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); WILLIAMS_NARC_SOUND(config, m_narc_sound); @@ -1093,9 +1104,11 @@ void midyunit_state::zunit(machine_config &config) * *************************************/ +static constexpr XTAL STDRES_PIXEL_CLOCK = (XTAL(24'000'000) / 6); + void midyunit_state::yunit_core(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware TMS34010(config, m_maincpu, SLOW_MASTER_CLOCK); m_maincpu->set_addrmap(AS_PROGRAM, &midyunit_state::main_map); m_maincpu->set_halt_on_reset(false); @@ -1108,7 +1121,7 @@ void midyunit_state::yunit_core(machine_config &config) MCFG_MACHINE_RESET_OVERRIDE(midyunit_state,midyunit) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - /* video hardware */ + // video hardware PALETTE(config, m_palette).set_entries(256); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -1119,7 +1132,7 @@ void midyunit_state::yunit_core(machine_config &config) screen.set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_ind16)); screen.set_palette(m_palette); - /* sound hardware */ + // sound hardware SPEAKER(config, "speaker").front_center(); } @@ -1128,10 +1141,10 @@ void midyunit_state::yunit_cvsd_4bit_slow(machine_config &config) { yunit_core(config); - /* basic machine hardware */ + // basic machine hardware WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0); - /* video hardware */ + // video hardware m_palette->set_entries(256); MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_4bit) } @@ -1141,12 +1154,12 @@ void midyunit_state::yunit_cvsd_4bit_fast(machine_config &config) { yunit_core(config); - /* basic machine hardware */ + // basic machine hardware m_maincpu->set_clock(FAST_MASTER_CLOCK); WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0); - /* video hardware */ + // video hardware m_palette->set_entries(256); MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_4bit) } @@ -1156,10 +1169,10 @@ void midyunit_state::yunit_cvsd_6bit_slow(machine_config &config) { yunit_core(config); - /* basic machine hardware */ + // basic machine hardware WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0); - /* video hardware */ + // video hardware m_palette->set_entries(4096); MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_6bit) } @@ -1169,12 +1182,12 @@ void midyunit_state::yunit_adpcm_6bit_fast(machine_config &config) { yunit_core(config); - /* basic machine hardware */ + // basic machine hardware m_maincpu->set_clock(FAST_MASTER_CLOCK); WILLIAMS_ADPCM_SOUND(config, m_adpcm_sound).add_route(ALL_OUTPUTS, "speaker", 1.0); - /* video hardware */ + // video hardware m_palette->set_entries(4096); MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_6bit) } @@ -1184,49 +1197,59 @@ void midyunit_state::yunit_adpcm_6bit_faster(machine_config &config) { yunit_core(config); - /* basic machine hardware */ + // basic machine hardware m_maincpu->set_clock(FASTER_MASTER_CLOCK); WILLIAMS_ADPCM_SOUND(config, m_adpcm_sound).add_route(ALL_OUTPUTS, "speaker", 1.0); - /* video hardware */ + // video hardware m_palette->set_entries(4096); MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_6bit) } -void midyunit_state::term2(machine_config &config) +void term2_state::term2(machine_config &config) { yunit_adpcm_6bit_faster(config); - ADC0844(config, m_term2_adc); // U2 on Coil Lamp Driver Board (A-14915) - m_term2_adc->ch1_callback().set_ioport("STICK0_X"); - m_term2_adc->ch2_callback().set_ioport("STICK0_Y"); - m_term2_adc->ch3_callback().set_ioport("STICK1_X"); - m_term2_adc->ch4_callback().set_ioport("STICK1_Y"); + ADC0844(config, m_adc); // U2 on Coil Lamp Driver Board (A-14915) + m_adc->ch1_callback().set_ioport("STICK0_X"); + m_adc->ch2_callback().set_ioport("STICK0_Y"); + m_adc->ch3_callback().set_ioport("STICK1_X"); + m_adc->ch4_callback().set_ioport("STICK1_Y"); } -void midyunit_state::mkyawdim(machine_config &config) +void mkyawdim_state::mkyawdim(machine_config &config) { yunit_core(config); - /* basic machine hardware */ + // basic machine hardware + m_maincpu->set_addrmap(AS_PROGRAM, &mkyawdim_state::yawdim_main_map); Z80(config, m_audiocpu, XTAL(8'000'000) / 2); - m_audiocpu->set_addrmap(AS_PROGRAM, &midyunit_state::yawdim_sound_map); + m_audiocpu->set_addrmap(AS_PROGRAM, &mkyawdim_state::yawdim_sound_map); - /* video hardware */ + // video hardware m_palette->set_entries(4096); - MCFG_VIDEO_START_OVERRIDE(midyunit_state,mkyawdim) - - /* sound hardware */ + // sound hardware GENERIC_LATCH_8(config, m_soundlatch); OKIM6295(config, m_oki, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "speaker", 1.0); } +void mkyawdim_state::mkyawdim2(machine_config &config) +{ + mkyawdim(config); + + // basic machine hardware + m_maincpu->set_addrmap(AS_PROGRAM, &mkyawdim_state::yawdim2_main_map); + m_audiocpu->set_addrmap(AS_PROGRAM, &mkyawdim_state::yawdim2_sound_map); + + m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); +} + /************************************* @@ -1237,13 +1260,13 @@ void midyunit_state::mkyawdim(machine_config &config) ROM_START( narc ) - ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) // sound CPU ROM_LOAD( "rev2_narc_sound_rom_u4.u4", 0x50000, 0x10000, CRC(450a591a) SHA1(bbda8061262738e5866f2707f69483a0a51d2910) ) ROM_RELOAD( 0x60000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u5.u5", 0x70000, 0x10000, CRC(e551e5e3) SHA1(c8b4f53dbd4c534abb77d4dc07c4d12653b79894) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) /* slave sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) // slave sound CPU ROM_LOAD( "rev2_narc_sound_rom_u35.u35", 0x10000, 0x10000, CRC(81295892) SHA1(159664e5ee03c88d6e940e70e87e2150dc5b8b25) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u36.u36", 0x30000, 0x10000, CRC(16cdbb13) SHA1(2dfd961a5d909c1804f4fda34de33ee2664c4bc6) ) @@ -1253,14 +1276,14 @@ ROM_START( narc ) ROM_LOAD( "rev2_narc_sound_rom_u38.u38", 0x70000, 0x10000, CRC(09b03b80) SHA1(a45782d29a426fac38299b56af0815e844e35ae4) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "rev7_narc_game_rom_u42.u42", 0x80000, 0x20000, CRC(d1111b76) SHA1(9700261aaba6a1ac0415362874817499f90b142a) ) ROM_LOAD16_BYTE( "rev7_narc_game_rom_u24.u24", 0x80001, 0x20000, CRC(aa0d3082) SHA1(7da59098319c49842406e7daf06aceae80fbd0ed) ) ROM_LOAD16_BYTE( "rev7_narc_game_rom_u41.u41", 0xc0000, 0x20000, CRC(3903191f) SHA1(1ad89cb03956f6625d9403e98951383fc9219478) ) ROM_LOAD16_BYTE( "rev7_narc_game_rom_u23.u23", 0xc0001, 0x20000, CRC(7a316582) SHA1(f640966c79bab70b536f2f92d4f46475a021b5b1) ) // U59, U60, U77 & U78 sockets not populated - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "rev2_narc_image_rom_u94.u94", 0x000000, 0x10000, CRC(ca3194e4) SHA1(d6aa6a09e4353a1dddd502abf85acf48e6e94cef) ) ROM_LOAD( "rev2_narc_image_rom_u93.u93", 0x010000, 0x10000, CRC(0ed7f7f5) SHA1(913d0dc81531adc6a7e6ffabfe681150aa4638a3) ) ROM_LOAD( "rev2_narc_image_rom_u92.u92", 0x020000, 0x10000, CRC(40d2fc66) SHA1(95b8d90e6abe336ad05dc3746d02b38823d2b8cd) ) @@ -1339,13 +1362,13 @@ ROM_END ROM_START( narc6 ) - ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) // sound CPU ROM_LOAD( "rev2_narc_sound_rom_u4.u4", 0x50000, 0x10000, CRC(450a591a) SHA1(bbda8061262738e5866f2707f69483a0a51d2910) ) ROM_RELOAD( 0x60000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u5.u5", 0x70000, 0x10000, CRC(e551e5e3) SHA1(c8b4f53dbd4c534abb77d4dc07c4d12653b79894) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) /* slave sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) // slave sound CPU ROM_LOAD( "rev2_narc_sound_rom_u35.u35", 0x10000, 0x10000, CRC(81295892) SHA1(159664e5ee03c88d6e940e70e87e2150dc5b8b25) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u36.u36", 0x30000, 0x10000, CRC(16cdbb13) SHA1(2dfd961a5d909c1804f4fda34de33ee2664c4bc6) ) @@ -1355,7 +1378,7 @@ ROM_START( narc6 ) ROM_LOAD( "rev2_narc_sound_rom_u38.u38", 0x70000, 0x10000, CRC(09b03b80) SHA1(a45782d29a426fac38299b56af0815e844e35ae4) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "rev6_narc_game_rom_u78.u78", 0x00000, 0x10000, CRC(2c9e799b) SHA1(28847e5aea08f4d4b12321cd2bfc13280ee8ec4f) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD16_BYTE( "rev6_narc_game_rom_u60.u60", 0x00001, 0x10000, CRC(5f6b0429) SHA1(1bda1a7644f2c7939800d64c3e73d589296032d9) ) @@ -1373,7 +1396,7 @@ ROM_START( narc6 ) ROM_LOAD16_BYTE( "rev6_narc_game_rom_u23.u23", 0xc0001, 0x10000, CRC(ed0d149d) SHA1(02b376cc7584fd26f537ad8122f73211bf0e66b8) ) ROM_RELOAD( 0xe0001, 0x10000 ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "rev2_narc_image_rom_u94.u94", 0x000000, 0x10000, CRC(ca3194e4) SHA1(d6aa6a09e4353a1dddd502abf85acf48e6e94cef) ) ROM_LOAD( "rev2_narc_image_rom_u93.u93", 0x010000, 0x10000, CRC(0ed7f7f5) SHA1(913d0dc81531adc6a7e6ffabfe681150aa4638a3) ) ROM_LOAD( "rev2_narc_image_rom_u92.u92", 0x020000, 0x10000, CRC(40d2fc66) SHA1(95b8d90e6abe336ad05dc3746d02b38823d2b8cd) ) @@ -1452,13 +1475,13 @@ ROM_END ROM_START( narc4 ) - ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) // sound CPU ROM_LOAD( "rev2_narc_sound_rom_u4.u4", 0x50000, 0x10000, CRC(450a591a) SHA1(bbda8061262738e5866f2707f69483a0a51d2910) ) ROM_RELOAD( 0x60000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u5.u5", 0x70000, 0x10000, CRC(e551e5e3) SHA1(c8b4f53dbd4c534abb77d4dc07c4d12653b79894) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) /* slave sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) // slave sound CPU ROM_LOAD( "rev2_narc_sound_rom_u35.u35", 0x10000, 0x10000, CRC(81295892) SHA1(159664e5ee03c88d6e940e70e87e2150dc5b8b25) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u36.u36", 0x30000, 0x10000, CRC(16cdbb13) SHA1(2dfd961a5d909c1804f4fda34de33ee2664c4bc6) ) @@ -1468,7 +1491,7 @@ ROM_START( narc4 ) ROM_LOAD( "rev2_narc_sound_rom_u38.u38", 0x70000, 0x10000, CRC(09b03b80) SHA1(a45782d29a426fac38299b56af0815e844e35ae4) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "rev4_narc_game_rom_u78.u78", 0x00000, 0x10000, CRC(99bbd587) SHA1(716c446d1aceacbc608883dde499ef6de23847f2) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD16_BYTE( "rev4_narc_game_rom_u60.u60", 0x00001, 0x10000, CRC(beec5f1a) SHA1(aaf900820a1722c19607642ffc2acdedab5cc0da) ) @@ -1486,7 +1509,7 @@ ROM_START( narc4 ) ROM_LOAD16_BYTE( "rev4_narc_game_rom_u23.u23", 0xc0001, 0x10000, CRC(425a3f8f) SHA1(d884cb40816ae9f0c1b7b536a88d6fa36488a004) ) ROM_RELOAD( 0xe0001, 0x10000 ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "rev2_narc_image_rom_u94.u94", 0x000000, 0x10000, CRC(ca3194e4) SHA1(d6aa6a09e4353a1dddd502abf85acf48e6e94cef) ) ROM_LOAD( "rev2_narc_image_rom_u93.u93", 0x010000, 0x10000, CRC(0ed7f7f5) SHA1(913d0dc81531adc6a7e6ffabfe681150aa4638a3) ) ROM_LOAD( "rev2_narc_image_rom_u92.u92", 0x020000, 0x10000, CRC(40d2fc66) SHA1(95b8d90e6abe336ad05dc3746d02b38823d2b8cd) ) @@ -1565,13 +1588,13 @@ ROM_END ROM_START( narc3 ) - ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) // sound CPU ROM_LOAD( "rev2_narc_sound_rom_u4.u4", 0x50000, 0x10000, CRC(450a591a) SHA1(bbda8061262738e5866f2707f69483a0a51d2910) ) ROM_RELOAD( 0x60000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u5.u5", 0x70000, 0x10000, CRC(e551e5e3) SHA1(c8b4f53dbd4c534abb77d4dc07c4d12653b79894) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) /* slave sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) // slave sound CPU ROM_LOAD( "rev2_narc_sound_rom_u35.u35", 0x10000, 0x10000, CRC(81295892) SHA1(159664e5ee03c88d6e940e70e87e2150dc5b8b25) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u36.u36", 0x30000, 0x10000, CRC(16cdbb13) SHA1(2dfd961a5d909c1804f4fda34de33ee2664c4bc6) ) @@ -1581,7 +1604,7 @@ ROM_START( narc3 ) ROM_LOAD( "rev2_narc_sound_rom_u38.u38", 0x70000, 0x10000, CRC(09b03b80) SHA1(a45782d29a426fac38299b56af0815e844e35ae4) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "rev3_narc_game_rom_u78.u78", 0x00000, 0x10000, CRC(388581b0) SHA1(9d3c718c7bee8f3db9b87ae08ec3bcc1bf65084b) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD16_BYTE( "rev3_narc_game_rom_u60.u60", 0x00001, 0x10000, CRC(f273bc04) SHA1(d4a75c1d6fa706f582ac8131387042a3c9abd08e) ) @@ -1599,7 +1622,7 @@ ROM_START( narc3 ) ROM_LOAD16_BYTE( "rev3_narc_game_rom_u23.u23", 0xc0001, 0x10000, CRC(98cdd178) SHA1(dd46a957462f2a9dc6de89379fe3e21664873a3c) ) ROM_RELOAD( 0xe0001, 0x10000 ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "rev2_narc_image_rom_u94.u94", 0x000000, 0x10000, CRC(ca3194e4) SHA1(d6aa6a09e4353a1dddd502abf85acf48e6e94cef) ) ROM_LOAD( "rev2_narc_image_rom_u93.u93", 0x010000, 0x10000, CRC(0ed7f7f5) SHA1(913d0dc81531adc6a7e6ffabfe681150aa4638a3) ) ROM_LOAD( "rev2_narc_image_rom_u92.u92", 0x020000, 0x10000, CRC(40d2fc66) SHA1(95b8d90e6abe336ad05dc3746d02b38823d2b8cd) ) @@ -1678,13 +1701,13 @@ ROM_END ROM_START( narc2 ) - ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) // sound CPU ROM_LOAD( "rev2_narc_sound_rom_u4.u4", 0x50000, 0x10000, CRC(450a591a) SHA1(bbda8061262738e5866f2707f69483a0a51d2910) ) ROM_RELOAD( 0x60000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u5.u5", 0x70000, 0x10000, CRC(e551e5e3) SHA1(c8b4f53dbd4c534abb77d4dc07c4d12653b79894) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) /* slave sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) // slave sound CPU ROM_LOAD( "rev2_narc_sound_rom_u35.u35", 0x10000, 0x10000, CRC(81295892) SHA1(159664e5ee03c88d6e940e70e87e2150dc5b8b25) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "rev2_narc_sound_rom_u36.u36", 0x30000, 0x10000, CRC(16cdbb13) SHA1(2dfd961a5d909c1804f4fda34de33ee2664c4bc6) ) @@ -1694,7 +1717,7 @@ ROM_START( narc2 ) ROM_LOAD( "rev2_narc_sound_rom_u38.u38", 0x70000, 0x10000, CRC(09b03b80) SHA1(a45782d29a426fac38299b56af0815e844e35ae4) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "rev2_narc_game_rom_u78.u78", 0x00000, 0x10000, CRC(150c2dc4) SHA1(c7e3f90f5fed08f2a6951779166cbc6d2dbcd380) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD16_BYTE( "rev2_narc_game_rom_u60.u60", 0x00001, 0x10000, CRC(9720ddea) SHA1(27f0182799f14c1c7c8dc48f7cf4160768b24662) ) @@ -1712,7 +1735,7 @@ ROM_START( narc2 ) ROM_LOAD16_BYTE( "rev2_narc_game_rom_u23.u23", 0xc0001, 0x10000, CRC(a9eb4825) SHA1(9c0b98451f1a240a3cb7ed4c1aab6c7c4abd27e6) ) ROM_RELOAD( 0xe0001, 0x10000 ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "rev2_narc_image_rom_u94.u94", 0x000000, 0x10000, CRC(ca3194e4) SHA1(d6aa6a09e4353a1dddd502abf85acf48e6e94cef) ) ROM_LOAD( "rev2_narc_image_rom_u93.u93", 0x010000, 0x10000, CRC(0ed7f7f5) SHA1(913d0dc81531adc6a7e6ffabfe681150aa4638a3) ) ROM_LOAD( "rev2_narc_image_rom_u92.u92", 0x020000, 0x10000, CRC(40d2fc66) SHA1(95b8d90e6abe336ad05dc3746d02b38823d2b8cd) ) @@ -1791,13 +1814,13 @@ ROM_END ROM_START( narc1 ) - ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu0", 0 ) // sound CPU ROM_LOAD( "rev1_narc_sound_rom_u4.u4", 0x50000, 0x10000, CRC(345b5b0b) SHA1(98918785b2c096ceec14a42199f1ad24149ef936) ) ROM_RELOAD( 0x60000, 0x10000 ) ROM_LOAD( "rev1_narc_sound_rom_u5.u5", 0x70000, 0x10000, CRC(bfa112b7) SHA1(2156b52b6ad838e3c9ba33d27da4f753f8a26bef) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) /* slave sound CPU */ + ROM_REGION( 0x90000, "narcsnd:cpu1", 0 ) // slave sound CPU ROM_LOAD( "rev1_narc_sound_rom_u35.u35", 0x10000, 0x10000, CRC(c932e69f) SHA1(dca1113c63f997b5a779d6e3ca6c555cb266b8ab) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "rev1_narc_sound_rom_u36.u36", 0x30000, 0x10000, CRC(974ad9f4) SHA1(5646099214d4e29ed529b66a5dedbaeca0ad375e) ) @@ -1807,14 +1830,14 @@ ROM_START( narc1 ) ROM_LOAD( "rev1_narc_sound_rom_u38.u38", 0x70000, 0x10000, CRC(c535d11c) SHA1(b7e670669713bbf860c2025b9830bfc4d941651c) ) ROM_RELOAD( 0x80000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "rev1_narc_game_rom_u42.u42", 0x80000, 0x20000, CRC(145e1346) SHA1(3b6c4d07b9fc5b7ab875d6c9e4d6f1eefaa25412) ) ROM_LOAD16_BYTE( "rev1_narc_game_rom_u24.u24", 0x80001, 0x20000, CRC(6ac3ba9a) SHA1(3dbe44b6d4638510952fc10dd7b29fe7c6b677cd) ) ROM_LOAD16_BYTE( "rev1_narc_game_rom_u41.u41", 0xc0000, 0x20000, CRC(68723c97) SHA1(0d6315f0ec3c70a3f0347a1fd79594309c4a2628) ) ROM_LOAD16_BYTE( "rev1_narc_game_rom_u23.u23", 0xc0001, 0x20000, CRC(78ecc8e5) SHA1(51529f53e783fd2ad691aa4f77f0fa5afbf54d9d) ) // U59, U60, U77 & U78 sockets not populated - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "rev1_narc_image_rom_u94.u94", 0x000000, 0x10000, CRC(1b4cec52) SHA1(9f3e72034f96cfbf48d33be8bb5ca073bad30a97) ) ROM_LOAD( "rev1_narc_image_rom_u93.u93", 0x010000, 0x10000, CRC(6e69f198) SHA1(fdc98bdd90c48058364646783bdaedd98d2a9034) ) ROM_LOAD( "rev1_narc_image_rom_u92.u92", 0x020000, 0x10000, CRC(4a0cb243) SHA1(6abbd582bfb1f85b771bf82d2d9734e9b411c92d) ) @@ -1889,7 +1912,7 @@ ROM_END ROM_START( trog ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD( "trog_ii_u-4_sl_1.u4", 0x10000, 0x10000, CRC(759d0bf4) SHA1(c4c3fa51c43cf7fd241ac1f33d7d220aa9f9edb3) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "trog_ii_u-19_sl_1.u19", 0x30000, 0x10000, CRC(960c333d) SHA1(da8ce8dfffffe7a2d60b3f75cc5aa88e5e2be659) ) @@ -1897,11 +1920,11 @@ ROM_START( trog ) ROM_LOAD( "trog_ii_u-20_sl_1.u20", 0x50000, 0x10000, CRC(67f1658a) SHA1(c85dc920ff4b292afa9f6681f31918a200799cc9) ) ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "trog_ii_u-105_la-5.u105", 0xc0000, 0x20000, CRC(d62cc51a) SHA1(a63ed5b0e08dd89a1392e04cd88c9d83d75810c6) ) ROM_LOAD16_BYTE( "trog_ii_u-89_la-5.u89", 0xc0001, 0x20000, CRC(edde0bc8) SHA1(95389b75c438c0f0cad668a35570fcb4f7790a02) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "trog_ii_u-111_la-1.u111", 0x000000, 0x20000, CRC(9ded08c1) SHA1(bbf069f218e3f3d67e45fa2229a471451b3a8f96) ) ROM_LOAD( "trog_ii_u-112_la-1.u112", 0x020000, 0x20000, CRC(42293843) SHA1(cae77eeddd784573beccb79e54573da0e4ccdd8a) ) ROM_LOAD( "trog_ii_u-113_la-1.u113", 0x040000, 0x20000, CRC(77f50cbb) SHA1(5f2df3aedd90871ac02bca07c66387f6cda0dfdf) ) @@ -1919,7 +1942,7 @@ ROM_END ROM_START( trog4 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD( "trog_ii_u-4_sl_1.u4", 0x10000, 0x10000, CRC(759d0bf4) SHA1(c4c3fa51c43cf7fd241ac1f33d7d220aa9f9edb3) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "trog_ii_u-19_sl_1.u19", 0x30000, 0x10000, CRC(960c333d) SHA1(da8ce8dfffffe7a2d60b3f75cc5aa88e5e2be659) ) @@ -1927,11 +1950,11 @@ ROM_START( trog4 ) ROM_LOAD( "trog_ii_u-20_sl_1.u20", 0x50000, 0x10000, CRC(67f1658a) SHA1(c85dc920ff4b292afa9f6681f31918a200799cc9) ) ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "trog_ii_u-105_la-4.u105", 0xc0000, 0x20000, CRC(e6095189) SHA1(a2caaf64e371050b37c63d9608ba5d289cf3cd91) ) ROM_LOAD16_BYTE( "trog_ii_u-89_la-4.u89", 0xc0001, 0x20000, CRC(fdd7cc65) SHA1(bfc4339953c122bca968f9cfa3a82df3584a3727) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "trog_ii_u-111_la-1.u111", 0x000000, 0x20000, CRC(9ded08c1) SHA1(bbf069f218e3f3d67e45fa2229a471451b3a8f96) ) ROM_LOAD( "trog_ii_u-112_la-1.u112", 0x020000, 0x20000, CRC(42293843) SHA1(cae77eeddd784573beccb79e54573da0e4ccdd8a) ) ROM_LOAD( "trog_ii_u-113_la-1.u113", 0x040000, 0x20000, CRC(77f50cbb) SHA1(5f2df3aedd90871ac02bca07c66387f6cda0dfdf) ) @@ -1949,7 +1972,7 @@ ROM_END ROM_START( trog3 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD( "trog_ii_u-4_sl_1.u4", 0x10000, 0x10000, CRC(759d0bf4) SHA1(c4c3fa51c43cf7fd241ac1f33d7d220aa9f9edb3) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "trog_ii_u-19_sl_1.u19", 0x30000, 0x10000, CRC(960c333d) SHA1(da8ce8dfffffe7a2d60b3f75cc5aa88e5e2be659) ) @@ -1957,11 +1980,11 @@ ROM_START( trog3 ) ROM_LOAD( "trog_ii_u-20_sl_1.u20", 0x50000, 0x10000, CRC(67f1658a) SHA1(c85dc920ff4b292afa9f6681f31918a200799cc9) ) ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "trog_ii_u-105_la-3.u105", 0xc0000, 0x20000, CRC(d09cea97) SHA1(0c1384be2af8abbaf1c5c7f86f31ec605c18e798) ) // sldh - rev LA3 2/14/91 ROM_LOAD16_BYTE( "trog_ii_u-89_la-3.u89", 0xc0001, 0x20000, CRC(a61e3572) SHA1(5366f4c9592dc9e23ffe867a16cbf51d1811a622) ) // sldh - rev LA3 2/14/91 - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "trog_ii_u-111_la-1.u111", 0x000000, 0x20000, CRC(9ded08c1) SHA1(bbf069f218e3f3d67e45fa2229a471451b3a8f96) ) ROM_LOAD( "trog_ii_u-112_la-1.u112", 0x020000, 0x20000, CRC(42293843) SHA1(cae77eeddd784573beccb79e54573da0e4ccdd8a) ) ROM_LOAD( "trog_ii_u-113_la-1.u113", 0x040000, 0x20000, CRC(77f50cbb) SHA1(5f2df3aedd90871ac02bca07c66387f6cda0dfdf) ) @@ -1979,7 +2002,7 @@ ROM_END ROM_START( trog3a ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD( "trog_ii_u-4_sl_1.u4", 0x10000, 0x10000, CRC(759d0bf4) SHA1(c4c3fa51c43cf7fd241ac1f33d7d220aa9f9edb3) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "trog_ii_u-19_sl_1.u19", 0x30000, 0x10000, CRC(960c333d) SHA1(da8ce8dfffffe7a2d60b3f75cc5aa88e5e2be659) ) @@ -1987,11 +2010,11 @@ ROM_START( trog3a ) ROM_LOAD( "trog_ii_u-20_sl_1.u20", 0x50000, 0x10000, CRC(67f1658a) SHA1(c85dc920ff4b292afa9f6681f31918a200799cc9) ) ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "trog_ii_u-105_la-3.u105", 0xc0000, 0x20000, CRC(9b3841dd) SHA1(7af3b30857531de324afc44fc7577cefaea5aebb) ) // sldh - rev LA3 2/10/91 ROM_LOAD16_BYTE( "trog_ii_u-89_la-3.u89", 0xc0001, 0x20000, CRC(9c0e6542) SHA1(a80ce0f1135cd48dcbf6f98e3f385ddcdba35af7) ) // sldh - rev LA3 2/10/91 - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "trog_ii_u-111_la-1.u111", 0x000000, 0x20000, CRC(9ded08c1) SHA1(bbf069f218e3f3d67e45fa2229a471451b3a8f96) ) ROM_LOAD( "trog_ii_u-112_la-1.u112", 0x020000, 0x20000, CRC(42293843) SHA1(cae77eeddd784573beccb79e54573da0e4ccdd8a) ) ROM_LOAD( "trog_ii_u-113_la-1.u113", 0x040000, 0x20000, CRC(77f50cbb) SHA1(5f2df3aedd90871ac02bca07c66387f6cda0dfdf) ) // changes for LA1 @@ -2009,7 +2032,7 @@ ROM_END ROM_START( trogpa6 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD( "trog_ii_u-4_sl_1.u4", 0x10000, 0x10000, CRC(759d0bf4) SHA1(c4c3fa51c43cf7fd241ac1f33d7d220aa9f9edb3) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "trog_ii_u-19_sl_1.u19", 0x30000, 0x10000, CRC(960c333d) SHA1(da8ce8dfffffe7a2d60b3f75cc5aa88e5e2be659) ) @@ -2017,11 +2040,11 @@ ROM_START( trogpa6 ) ROM_LOAD( "trog_ii_u-20_sl_1.u20", 0x50000, 0x10000, CRC(67f1658a) SHA1(c85dc920ff4b292afa9f6681f31918a200799cc9) ) ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "trog_ii_u-105_rev.6.u105", 0xc0000, 0x20000, CRC(71ad1903) SHA1(e7ff1344a7bdc3b90f09ce8251ebcd25012be602) ) ROM_LOAD16_BYTE( "trog_ii_u-89_rev.6.u89", 0xc0001, 0x20000, CRC(04473da8) SHA1(47d9e918fba93b4af1e3cacbac9df843e6a10091) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "trog_ii_u-111_la-1.u111", 0x000000, 0x20000, CRC(9ded08c1) SHA1(bbf069f218e3f3d67e45fa2229a471451b3a8f96) ) ROM_LOAD( "trog_ii_u-112_la-1.u112", 0x020000, 0x20000, CRC(42293843) SHA1(cae77eeddd784573beccb79e54573da0e4ccdd8a) ) ROM_LOAD( "trog_ii_u-113_rev.5.u113",0x040000, 0x20000, CRC(ae50e5ea) SHA1(915b76f76e7ccbf2c4c28829cea15feaafea498b) ) @@ -2039,7 +2062,7 @@ ROM_END ROM_START( trogpa5 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD( "trog_ii_u-4_sl_1.u4", 0x10000, 0x10000, CRC(759d0bf4) SHA1(c4c3fa51c43cf7fd241ac1f33d7d220aa9f9edb3) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "trog_ii_u-19_sl_1.u19", 0x30000, 0x10000, CRC(960c333d) SHA1(da8ce8dfffffe7a2d60b3f75cc5aa88e5e2be659) ) @@ -2047,11 +2070,11 @@ ROM_START( trogpa5 ) ROM_LOAD( "trog_ii_u-20_sl_1.u20", 0x50000, 0x10000, CRC(67f1658a) SHA1(c85dc920ff4b292afa9f6681f31918a200799cc9) ) ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "trog_ii_u-105_rev.5.u105", 0xc0000, 0x20000, CRC(da645900) SHA1(202a3c89b5fbda676a1c875b6e4c19853ab75983) ) ROM_LOAD16_BYTE( "trog_ii_u-89_rev.5.u89", 0xc0001, 0x20000, CRC(d42d0f71) SHA1(8fc8af1544ff6fb7258ce9d810e566c3751c871c) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "trog_ii_u-111_la-1.u111", 0x000000, 0x20000, CRC(9ded08c1) SHA1(bbf069f218e3f3d67e45fa2229a471451b3a8f96) ) ROM_LOAD( "trog_ii_u-112_la-1.u112", 0x020000, 0x20000, CRC(42293843) SHA1(cae77eeddd784573beccb79e54573da0e4ccdd8a) ) ROM_LOAD( "trog_ii_u-113_rev.5.u113",0x040000, 0x20000, CRC(ae50e5ea) SHA1(915b76f76e7ccbf2c4c28829cea15feaafea498b) ) // changes with PAC5 @@ -2069,7 +2092,7 @@ ROM_END ROM_START( trogpa4 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD( "trog_ii_u-4_sl_1.u4", 0x10000, 0x10000, CRC(759d0bf4) SHA1(c4c3fa51c43cf7fd241ac1f33d7d220aa9f9edb3) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD( "trog_ii_u-19_sl_1.u19", 0x30000, 0x10000, CRC(960c333d) SHA1(da8ce8dfffffe7a2d60b3f75cc5aa88e5e2be659) ) @@ -2077,11 +2100,11 @@ ROM_START( trogpa4 ) ROM_LOAD( "trog_ii_u-20_sl_1.u20", 0x50000, 0x10000, CRC(67f1658a) SHA1(c85dc920ff4b292afa9f6681f31918a200799cc9) ) ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "u105-pa4", 0xc0000, 0x20000, CRC(526a3f5b) SHA1(8ad8cb15ada527f989f774a4fb81a171697c6dad) ) ROM_LOAD16_BYTE( "u89-pa4", 0xc0001, 0x20000, CRC(38d68685) SHA1(42b73a64641301bf2991929cf365b8f45fc1b5d8) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "trog_ii_u-111_la-1.u111", 0x000000, 0x20000, CRC(9ded08c1) SHA1(bbf069f218e3f3d67e45fa2229a471451b3a8f96) ) ROM_LOAD( "trog_ii_u-112_la-1.u112", 0x020000, 0x20000, CRC(42293843) SHA1(cae77eeddd784573beccb79e54573da0e4ccdd8a) ) ROM_LOAD( "trogu113.pa4", 0x040000, 0x20000, CRC(2980a56f) SHA1(1e6ab16be6071d6568149e9ba56e146e3431b5f2) ) // unique to rev 4.00 @@ -2109,11 +2132,11 @@ ROM_START( mazebl ) // Trog bootleg. 2-PCB set, upper one has a RC 0112 sticker ROM_COPY( "cvsd:cpu", 0x50000, 0x60000, 0x10000 ) ROM_COPY( "cvsd:cpu", 0x70000, 0x80000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) // 34010 code + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "2", 0xc0000, 0x20000, CRC(e6095189) SHA1(a2caaf64e371050b37c63d9608ba5d289cf3cd91) ) // == trog_ii_u-105_la-4.u105 ROM_LOAD16_BYTE( "3", 0xc0001, 0x20000, CRC(fdd7cc65) SHA1(bfc4339953c122bca968f9cfa3a82df3584a3727) ) // == trog_ii_u-89_la-4.u89 - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "4", 0x000000, 0x80000, CRC(dd7cd402) SHA1(78419fddd98bc37d5382f22d2ce2615948f80d5f) ) ROM_LOAD( "6", 0x080000, 0x40000, CRC(9c001d17) SHA1(c0770fa3968355e06e7c99bff56edbf834c43196) ) ROM_LOAD( "5", 0x200000, 0x80000, CRC(e036e21a) SHA1(584d06e82f1df571851a22fcb57248d03e49c233) ) @@ -2122,7 +2145,7 @@ ROM_END ROM_START( smashtv ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl2_smash_tv_sound_rom_u4.u4", 0x10000, 0x10000, CRC(29d3f6c8) SHA1(8a90cdff54f59ddb7dba521504d880515a59df08) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD ( "sl2_smash_tv_sound_rom_u19.u19", 0x30000, 0x10000, CRC(ac5a402a) SHA1(c476018062126dc3936caa2c328de490737165ec) ) // == SL1 SMASH T.V. SOUND ROM U19 @@ -2130,11 +2153,11 @@ ROM_START( smashtv ) ROM_LOAD ( "sl2_smash_tv_sound_rom_u20.u20", 0x50000, 0x10000, CRC(875c66d9) SHA1(51cdad62ec57e69bba6fcf14e59841ec628dec11) ) // == SL1 SMASH T.V. SOUND ROM U20 ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la8_smash_tv_game_rom_u105.u105", 0xc0000, 0x20000, CRC(48cd793f) SHA1(7d0d9edccf0610f57e40934ab33e32315369656d) ) ROM_LOAD16_BYTE( "la8_smash_tv_game_rom_u89.u89", 0xc0001, 0x20000, CRC(8e7fe463) SHA1(629332be706cda26f8b170b8e2877355230119ee) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_smash_tv_game_rom_u111.u111", 0x000000, 0x20000, CRC(72f0ba84) SHA1(2e925b3cdd3c8e14046b3948d82f0f3cde3c22c5) ) ROM_LOAD ( "la1_smash_tv_game_rom_u112.u112", 0x020000, 0x20000, CRC(436f0283) SHA1(ec33a8942c0fc326db885e08dad9346ec5a63360) ) ROM_LOAD ( "la1_smash_tv_game_rom_u113.u113", 0x040000, 0x20000, CRC(4a4b8110) SHA1(9f1881d1d2682764ab85aebd685d97eb8b4afe46) ) @@ -2150,7 +2173,7 @@ ROM_END ROM_START( smashtv6 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl2_smash_tv_sound_rom_u4.u4", 0x10000, 0x10000, CRC(29d3f6c8) SHA1(8a90cdff54f59ddb7dba521504d880515a59df08) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD ( "sl2_smash_tv_sound_rom_u19.u19", 0x30000, 0x10000, CRC(ac5a402a) SHA1(c476018062126dc3936caa2c328de490737165ec) ) // == SL1 SMASH T.V. SOUND ROM U19 @@ -2158,11 +2181,11 @@ ROM_START( smashtv6 ) ROM_LOAD ( "sl2_smash_tv_sound_rom_u20.u20", 0x50000, 0x10000, CRC(875c66d9) SHA1(51cdad62ec57e69bba6fcf14e59841ec628dec11) ) // == SL1 SMASH T.V. SOUND ROM U20 ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la6_smash_tv_game_rom_u105.u105", 0xc0000, 0x20000, CRC(f1666017) SHA1(2283e71ad55a7cd3bc97bd6b20aebb90ad618bf8) ) ROM_LOAD16_BYTE( "la6_smash_tv_game_rom_u89.u89", 0xc0001, 0x20000, CRC(908aca5d) SHA1(c97f05ecb8d96306fecef40330331e279d29f78d) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_smash_tv_game_rom_u111.u111", 0x000000, 0x20000, CRC(72f0ba84) SHA1(2e925b3cdd3c8e14046b3948d82f0f3cde3c22c5) ) ROM_LOAD ( "la1_smash_tv_game_rom_u112.u112", 0x020000, 0x20000, CRC(436f0283) SHA1(ec33a8942c0fc326db885e08dad9346ec5a63360) ) ROM_LOAD ( "la1_smash_tv_game_rom_u113.u113", 0x040000, 0x20000, CRC(4a4b8110) SHA1(9f1881d1d2682764ab85aebd685d97eb8b4afe46) ) @@ -2178,7 +2201,7 @@ ROM_END ROM_START( smashtv5 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl2_smash_tv_sound_rom_u4.u4", 0x10000, 0x10000, CRC(29d3f6c8) SHA1(8a90cdff54f59ddb7dba521504d880515a59df08) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD ( "sl2_smash_tv_sound_rom_u19.u19", 0x30000, 0x10000, CRC(ac5a402a) SHA1(c476018062126dc3936caa2c328de490737165ec) ) // == SL1 SMASH T.V. SOUND ROM U19 @@ -2186,11 +2209,11 @@ ROM_START( smashtv5 ) ROM_LOAD ( "sl2_smash_tv_sound_rom_u20.u20", 0x50000, 0x10000, CRC(875c66d9) SHA1(51cdad62ec57e69bba6fcf14e59841ec628dec11) ) // == SL1 SMASH T.V. SOUND ROM U20 ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la5_smash_tv_game_rom_u105.u105", 0xc0000, 0x20000, CRC(81f564b9) SHA1(5bddcda054be6766b40af88ae2519b3a87c33667) ) ROM_LOAD16_BYTE( "la5_smash_tv_game_rom_u89.u89", 0xc0001, 0x20000, CRC(e5017d25) SHA1(27e544efa7f5cbe6ed3fc3211b12694c15a316c7) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_smash_tv_game_rom_u111.u111", 0x000000, 0x20000, CRC(72f0ba84) SHA1(2e925b3cdd3c8e14046b3948d82f0f3cde3c22c5) ) ROM_LOAD ( "la1_smash_tv_game_rom_u112.u112", 0x020000, 0x20000, CRC(436f0283) SHA1(ec33a8942c0fc326db885e08dad9346ec5a63360) ) ROM_LOAD ( "la1_smash_tv_game_rom_u113.u113", 0x040000, 0x20000, CRC(4a4b8110) SHA1(9f1881d1d2682764ab85aebd685d97eb8b4afe46) ) @@ -2206,7 +2229,7 @@ ROM_END ROM_START( smashtv4 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl2_smash_tv_sound_rom_u4.u4", 0x10000, 0x10000, CRC(29d3f6c8) SHA1(8a90cdff54f59ddb7dba521504d880515a59df08) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD ( "sl2_smash_tv_sound_rom_u19.u19", 0x30000, 0x10000, CRC(ac5a402a) SHA1(c476018062126dc3936caa2c328de490737165ec) ) // == SL1 SMASH T.V. SOUND ROM U19 @@ -2214,11 +2237,11 @@ ROM_START( smashtv4 ) ROM_LOAD ( "sl2_smash_tv_sound_rom_u20.u20", 0x50000, 0x10000, CRC(875c66d9) SHA1(51cdad62ec57e69bba6fcf14e59841ec628dec11) ) // == SL1 SMASH T.V. SOUND ROM U20 ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la4_smash_tv_game_rom_u105.u105", 0xc0000, 0x20000, CRC(a50ccb71) SHA1(414dfe355e314f6460ce07edbdd5e4b801451cf8) ) ROM_LOAD16_BYTE( "la4_smash_tv_game_rom_u89.u89", 0xc0001, 0x20000, CRC(ef0b0279) SHA1(baad5a2a8d51d007e365f378f3214bbd2ea9699c) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_smash_tv_game_rom_u111.u111", 0x000000, 0x20000, CRC(72f0ba84) SHA1(2e925b3cdd3c8e14046b3948d82f0f3cde3c22c5) ) ROM_LOAD ( "la1_smash_tv_game_rom_u112.u112", 0x020000, 0x20000, CRC(436f0283) SHA1(ec33a8942c0fc326db885e08dad9346ec5a63360) ) ROM_LOAD ( "la1_smash_tv_game_rom_u113.u113", 0x040000, 0x20000, CRC(4a4b8110) SHA1(9f1881d1d2682764ab85aebd685d97eb8b4afe46) ) @@ -2234,7 +2257,7 @@ ROM_END ROM_START( smashtv3 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_smash_tv_sound_rom_u4.u4", 0x10000, 0x10000, CRC(a3370987) SHA1(e03c9980a243200a8c0f1ad546868c77991a6f53) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD ( "sl1_smash_tv_sound_rom_u19.u19", 0x30000, 0x10000, CRC(ac5a402a) SHA1(c476018062126dc3936caa2c328de490737165ec) ) @@ -2242,11 +2265,11 @@ ROM_START( smashtv3 ) ROM_LOAD ( "sl1_smash_tv_sound_rom_u20.u20", 0x50000, 0x10000, CRC(875c66d9) SHA1(51cdad62ec57e69bba6fcf14e59841ec628dec11) ) ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la3_smash_tv_game_rom_u105.u105", 0xc0000, 0x20000, CRC(33b626c3) SHA1(8f0582f6fe08dc7de920aeac578ed570ca4e717f) ) ROM_LOAD16_BYTE( "la3_smash_tv_game_rom_u89.u89", 0xc0001, 0x20000, CRC(5f6fbc25) SHA1(d623f5e64ff4e70e24d770ac3ac0d32ff3928ce0) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_smash_tv_game_rom_u111.u111", 0x000000, 0x20000, CRC(72f0ba84) SHA1(2e925b3cdd3c8e14046b3948d82f0f3cde3c22c5) ) ROM_LOAD ( "la1_smash_tv_game_rom_u112.u112", 0x020000, 0x20000, CRC(436f0283) SHA1(ec33a8942c0fc326db885e08dad9346ec5a63360) ) ROM_LOAD ( "la1_smash_tv_game_rom_u113.u113", 0x040000, 0x20000, CRC(4a4b8110) SHA1(9f1881d1d2682764ab85aebd685d97eb8b4afe46) ) @@ -2262,16 +2285,16 @@ ROM_END ROM_START( hiimpact ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_high_impact_sound_u4.u4", 0x10000, 0x20000, CRC(28effd6a) SHA1(4a839f15e1b453a22fdef7b1801b8cc5cfdf3c29) ) ROM_LOAD ( "sl1_high_impact_sound_u19.u19", 0x30000, 0x20000, CRC(0ea22c89) SHA1(6d4579f6b10cac685be01348451b3537a0626034) ) ROM_LOAD ( "sl1_high_impact_sound_u20.u20", 0x50000, 0x20000, CRC(4e747ab5) SHA1(82040f40aac7dae577376a742eadaaa9644500c1) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la5_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(104c30e7) SHA1(62b48b9c20730ffbaa1810650ff55aba14b6880d) ) ROM_LOAD16_BYTE( "la5_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(07aa0010) SHA1(7dfd34028afeea4444e70c40fa30c6576ff22f7d) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_high_impact_game_rom_u111.u111", 0x000000, 0x20000, CRC(49560560) SHA1(03d51e6019afa9a396c91a484969be4922fa4c99) ) ROM_LOAD ( "la1_high_impact_game_rom_u112.u112", 0x020000, 0x20000, CRC(4dd879dc) SHA1(ac4f02fcb933df38f1ebf51b109092b77563b684) ) ROM_LOAD ( "la1_high_impact_game_rom_u113.u113", 0x040000, 0x20000, CRC(b67aeb70) SHA1(dd1512329c46da4254712712b6f847544f4487bd) ) @@ -2288,25 +2311,25 @@ ROM_START( hiimpact ) ROM_LOAD ( "la1_high_impact_game_rom_u109.u109", 0x460000, 0x20000, CRC(3689fbbc) SHA1(d95c0a2e3abf977ba7a899e419c22d004020c560) ) ROM_REGION( 0x1100, "plds", 0 ) - ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) // PAL is read protected ROM_LOAD( "pls153a.u40", 0x0400, 0x00eb, CRC(69e5143f) SHA1(1a1e7b3233f7d5a1c161564710e8e984a9b0a16c) ) - ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) // PAL is read protected ROM_END ROM_START( hiimpact4 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_high_impact_sound_u4.u4", 0x10000, 0x20000, CRC(28effd6a) SHA1(4a839f15e1b453a22fdef7b1801b8cc5cfdf3c29) ) ROM_LOAD ( "sl1_high_impact_sound_u19.u19", 0x30000, 0x20000, CRC(0ea22c89) SHA1(6d4579f6b10cac685be01348451b3537a0626034) ) ROM_LOAD ( "sl1_high_impact_sound_u20.u20", 0x50000, 0x20000, CRC(4e747ab5) SHA1(82040f40aac7dae577376a742eadaaa9644500c1) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la4_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(5f67f823) SHA1(4171b6949682d1b2180e39d44c4e0033c4c07149) ) ROM_LOAD16_BYTE( "la4_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(404d260b) SHA1(46bb44b3f1895d3424dba7664f198bce7dee911d) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_high_impact_game_rom_u111.u111", 0x000000, 0x20000, CRC(49560560) SHA1(03d51e6019afa9a396c91a484969be4922fa4c99) ) ROM_LOAD ( "la1_high_impact_game_rom_u112.u112", 0x020000, 0x20000, CRC(4dd879dc) SHA1(ac4f02fcb933df38f1ebf51b109092b77563b684) ) ROM_LOAD ( "la1_high_impact_game_rom_u113.u113", 0x040000, 0x20000, CRC(b67aeb70) SHA1(dd1512329c46da4254712712b6f847544f4487bd) ) @@ -2323,25 +2346,25 @@ ROM_START( hiimpact4 ) ROM_LOAD ( "la1_high_impact_game_rom_u109.u109", 0x460000, 0x20000, CRC(3689fbbc) SHA1(d95c0a2e3abf977ba7a899e419c22d004020c560) ) ROM_REGION( 0x1100, "plds", 0 ) - ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) // PAL is read protected ROM_LOAD( "pls153a.u40", 0x0400, 0x00eb, CRC(69e5143f) SHA1(1a1e7b3233f7d5a1c161564710e8e984a9b0a16c) ) - ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) // PAL is read protected ROM_END ROM_START( hiimpact3 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_high_impact_sound_u4.u4", 0x10000, 0x20000, CRC(28effd6a) SHA1(4a839f15e1b453a22fdef7b1801b8cc5cfdf3c29) ) ROM_LOAD ( "sl1_high_impact_sound_u19.u19", 0x30000, 0x20000, CRC(0ea22c89) SHA1(6d4579f6b10cac685be01348451b3537a0626034) ) ROM_LOAD ( "sl1_high_impact_sound_u20.u20", 0x50000, 0x20000, CRC(4e747ab5) SHA1(82040f40aac7dae577376a742eadaaa9644500c1) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la3_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(b9190c4a) SHA1(adcf1023d62f67fbde7a7a7aeeda068d7711f7cf) ) ROM_LOAD16_BYTE( "la3_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(1cbc72a5) SHA1(ba0b4b54453fcd1888d40690848e0ee4150bb8e1) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_high_impact_game_rom_u111.u111", 0x000000, 0x20000, CRC(49560560) SHA1(03d51e6019afa9a396c91a484969be4922fa4c99) ) ROM_LOAD ( "la1_high_impact_game_rom_u112.u112", 0x020000, 0x20000, CRC(4dd879dc) SHA1(ac4f02fcb933df38f1ebf51b109092b77563b684) ) ROM_LOAD ( "la1_high_impact_game_rom_u113.u113", 0x040000, 0x20000, CRC(b67aeb70) SHA1(dd1512329c46da4254712712b6f847544f4487bd) ) @@ -2358,25 +2381,25 @@ ROM_START( hiimpact3 ) ROM_LOAD ( "la1_high_impact_game_rom_u109.u109", 0x460000, 0x20000, CRC(3689fbbc) SHA1(d95c0a2e3abf977ba7a899e419c22d004020c560) ) ROM_REGION( 0x1100, "plds", 0 ) - ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) // PAL is read protected ROM_LOAD( "pls153a.u40", 0x0400, 0x00eb, CRC(69e5143f) SHA1(1a1e7b3233f7d5a1c161564710e8e984a9b0a16c) ) - ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) // PAL is read protected ROM_END ROM_START( hiimpact2 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_high_impact_sound_u4.u4", 0x10000, 0x20000, CRC(28effd6a) SHA1(4a839f15e1b453a22fdef7b1801b8cc5cfdf3c29) ) ROM_LOAD ( "sl1_high_impact_sound_u19.u19", 0x30000, 0x20000, CRC(0ea22c89) SHA1(6d4579f6b10cac685be01348451b3537a0626034) ) ROM_LOAD ( "sl1_high_impact_sound_u20.u20", 0x50000, 0x20000, CRC(4e747ab5) SHA1(82040f40aac7dae577376a742eadaaa9644500c1) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la2_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(25d83ba1) SHA1(4422a34b2957aabb3f0a26ca129e290dfc062933) ) ROM_LOAD16_BYTE( "la2_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(811f1253) SHA1(125a6cca26d37fae343b78046774f54ee6e8d996) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_high_impact_game_rom_u111.u111", 0x000000, 0x20000, CRC(49560560) SHA1(03d51e6019afa9a396c91a484969be4922fa4c99) ) ROM_LOAD ( "la1_high_impact_game_rom_u112.u112", 0x020000, 0x20000, CRC(4dd879dc) SHA1(ac4f02fcb933df38f1ebf51b109092b77563b684) ) ROM_LOAD ( "la1_high_impact_game_rom_u113.u113", 0x040000, 0x20000, CRC(b67aeb70) SHA1(dd1512329c46da4254712712b6f847544f4487bd) ) @@ -2393,25 +2416,25 @@ ROM_START( hiimpact2 ) ROM_LOAD ( "la1_high_impact_game_rom_u109.u109", 0x460000, 0x20000, CRC(3689fbbc) SHA1(d95c0a2e3abf977ba7a899e419c22d004020c560) ) ROM_REGION( 0x1100, "plds", 0 ) - ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) // PAL is read protected ROM_LOAD( "pls153a.u40", 0x0400, 0x00eb, CRC(69e5143f) SHA1(1a1e7b3233f7d5a1c161564710e8e984a9b0a16c) ) - ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) // PAL is read protected ROM_END ROM_START( hiimpact1 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_high_impact_sound_u4.u4", 0x10000, 0x20000, CRC(28effd6a) SHA1(4a839f15e1b453a22fdef7b1801b8cc5cfdf3c29) ) ROM_LOAD ( "sl1_high_impact_sound_u19.u19", 0x30000, 0x20000, CRC(0ea22c89) SHA1(6d4579f6b10cac685be01348451b3537a0626034) ) ROM_LOAD ( "sl1_high_impact_sound_u20.u20", 0x50000, 0x20000, CRC(4e747ab5) SHA1(82040f40aac7dae577376a742eadaaa9644500c1) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la1_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(e86228ba) SHA1(0af263e51cb65115038ee5bf508515674e05913e) ) ROM_LOAD16_BYTE( "la1_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(f23e972e) SHA1(e5ae5eaf5f97ec271b92072fd674e8cd93b36778) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_high_impact_game_rom_u111.u111", 0x000000, 0x20000, CRC(49560560) SHA1(03d51e6019afa9a396c91a484969be4922fa4c99) ) // All ROMs had a "LA1" sticker over a "PA1" label ROM_LOAD ( "la1_high_impact_game_rom_u112.u112", 0x020000, 0x20000, CRC(4dd879dc) SHA1(ac4f02fcb933df38f1ebf51b109092b77563b684) ) ROM_LOAD ( "la1_high_impact_game_rom_u113.u113", 0x040000, 0x20000, CRC(b67aeb70) SHA1(dd1512329c46da4254712712b6f847544f4487bd) ) @@ -2428,25 +2451,25 @@ ROM_START( hiimpact1 ) ROM_LOAD ( "la1_high_impact_game_rom_u109.u109", 0x460000, 0x20000, CRC(3689fbbc) SHA1(d95c0a2e3abf977ba7a899e419c22d004020c560) ) ROM_REGION( 0x1100, "plds", 0 ) - ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) // PAL is read protected ROM_LOAD( "pls153a.u40", 0x0400, 0x00eb, CRC(69e5143f) SHA1(1a1e7b3233f7d5a1c161564710e8e984a9b0a16c) ) - ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) // PAL is read protected ROM_END ROM_START( hiimpactp ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_high_impact_sound_u4.u4", 0x10000, 0x20000, CRC(28effd6a) SHA1(4a839f15e1b453a22fdef7b1801b8cc5cfdf3c29) ) ROM_LOAD ( "sl1_high_impact_sound_u19.u19", 0x30000, 0x20000, CRC(0ea22c89) SHA1(6d4579f6b10cac685be01348451b3537a0626034) ) ROM_LOAD ( "sl1_high_impact_sound_u20.u20", 0x50000, 0x20000, CRC(4e747ab5) SHA1(82040f40aac7dae577376a742eadaaa9644500c1) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "pa1_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(79ef9a35) SHA1(200d50b108401e889b6200c53c203ee5041d1423) ) ROM_LOAD16_BYTE( "pa1_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(2bd3de30) SHA1(ee3615c1cc5b948731eb258887641f059b942b25) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_high_impact_game_rom_u111.u111", 0x000000, 0x20000, CRC(49560560) SHA1(03d51e6019afa9a396c91a484969be4922fa4c99) ) // All ROMs were labeled "PA 1" which Williams later designated "LA 1" ROM_LOAD ( "la1_high_impact_game_rom_u112.u112", 0x020000, 0x20000, CRC(4dd879dc) SHA1(ac4f02fcb933df38f1ebf51b109092b77563b684) ) // without changing any of the contents when they release ver LA 1 ROM_LOAD ( "la1_high_impact_game_rom_u113.u113", 0x040000, 0x20000, CRC(b67aeb70) SHA1(dd1512329c46da4254712712b6f847544f4487bd) ) @@ -2463,25 +2486,25 @@ ROM_START( hiimpactp ) ROM_LOAD ( "la1_high_impact_game_rom_u109.u109", 0x460000, 0x20000, CRC(3689fbbc) SHA1(d95c0a2e3abf977ba7a899e419c22d004020c560) ) ROM_REGION( 0x1100, "plds", 0 ) - ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u8", 0x0000, 0x032f, NO_DUMP ) // PAL is read protected ROM_LOAD( "pls153a.u40", 0x0400, 0x00eb, CRC(69e5143f) SHA1(1a1e7b3233f7d5a1c161564710e8e984a9b0a16c) ) - ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "ep610.u51", 0x0500, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u52", 0x0900, 0x032f, NO_DUMP ) // PAL is read protected + ROM_LOAD( "ep610.u65", 0x0d00, 0x032f, NO_DUMP ) // PAL is read protected ROM_END ROM_START( shimpact ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_super_high_impact_u4_sound_rom.u4", 0x10000, 0x20000, CRC(1e5a012c) SHA1(4077fc266799a01738b7f88e867535f1fbacd557) ) ROM_LOAD ( "sl1_super_high_impact_u19_sound_rom.u19", 0x30000, 0x20000, CRC(10f9684e) SHA1(1fdc5364f87fb65f4f2a438841e0fe847f765aaf) ) ROM_LOAD ( "sl1_super_high_impact_u20_sound_rom.u20", 0x50000, 0x20000, CRC(1b4a71c1) SHA1(74b7b4ae76ebe65f1f46b2117970bfefefbb5344) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la1_super_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(f2cf8de3) SHA1(97428d05208c18a9fcf8f2e3c6ed2bf6441350c3) ) ROM_LOAD16_BYTE( "la1_super_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(f97d9b01) SHA1(d5f39d6a5db23f5efd123cf9da0d09c84893b9c4) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_super_high_impact_game_rom_u111.u111", 0x000000, 0x40000, CRC(80ae2a86) SHA1(1ff76e3064c7636f6877e426f4a88c094d1a6325) ) ROM_LOAD ( "la1_super_high_impact_game_rom_u112.u112", 0x040000, 0x40000, CRC(3ffc27e9) SHA1(ec337629c17daaa2445fb344e08243de7f09536e) ) ROM_LOAD ( "la1_super_high_impact_game_rom_u113.u113", 0x080000, 0x40000, CRC(01549d00) SHA1(40604e949cef056f90031850bdb91782135e7ec2) ) @@ -2500,16 +2523,16 @@ ROM_END ROM_START( shimpactp6 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_super_high_impact_u4_sound_rom.u4", 0x10000, 0x20000, CRC(1e5a012c) SHA1(4077fc266799a01738b7f88e867535f1fbacd557) ) ROM_LOAD ( "sl1_super_high_impact_u19_sound_rom.u19", 0x30000, 0x20000, CRC(10f9684e) SHA1(1fdc5364f87fb65f4f2a438841e0fe847f765aaf) ) ROM_LOAD ( "sl1_super_high_impact_u20_sound_rom.u20", 0x50000, 0x20000, CRC(1b4a71c1) SHA1(74b7b4ae76ebe65f1f46b2117970bfefefbb5344) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "proto6_super_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(33e1978d) SHA1(a88af5551d6b4777e0c5f5e3844b2f1d61bbb35d) ) // also known to be labeled "PRO6" or "PA6" ROM_LOAD16_BYTE( "proto6_super_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(6c070978) SHA1(ca6657c48810d78496c51eb750f45a3e08132ce3) ) // also known to be labeled "PRO6" or "PA6" - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_super_high_impact_game_rom_u111.u111", 0x000000, 0x40000, CRC(80ae2a86) SHA1(1ff76e3064c7636f6877e426f4a88c094d1a6325) ) // also known to be labeled PA1 ROM_LOAD ( "la1_super_high_impact_game_rom_u112.u112", 0x040000, 0x40000, CRC(3ffc27e9) SHA1(ec337629c17daaa2445fb344e08243de7f09536e) ) ROM_LOAD ( "la1_super_high_impact_game_rom_u113.u113", 0x080000, 0x40000, CRC(01549d00) SHA1(40604e949cef056f90031850bdb91782135e7ec2) ) @@ -2528,16 +2551,16 @@ ROM_END ROM_START( shimpactp5 ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_super_high_impact_u4_sound_rom.u4", 0x10000, 0x20000, CRC(1e5a012c) SHA1(4077fc266799a01738b7f88e867535f1fbacd557) ) ROM_LOAD ( "sl1_super_high_impact_u19_sound_rom.u19", 0x30000, 0x20000, CRC(10f9684e) SHA1(1fdc5364f87fb65f4f2a438841e0fe847f765aaf) ) ROM_LOAD ( "sl1_super_high_impact_u20_sound_rom.u20", 0x50000, 0x20000, CRC(1b4a71c1) SHA1(74b7b4ae76ebe65f1f46b2117970bfefefbb5344) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "proto5_super_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(4342cd45) SHA1(a8e8609efbd67a957104316a0fd4824802134290) ) // Both program ROMs had a "PROTO5" sticker ROM_LOAD16_BYTE( "proto5_super_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(cda47b73) SHA1(9b51f7d0cd6ffa07a5880e4cc8a855c2f7616c22) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "proto3_super_high_impact_game_rom_u111.u111", 0x000000, 0x40000, CRC(80ae2a86) SHA1(1ff76e3064c7636f6877e426f4a88c094d1a6325) ) // All graphic ROMs had a "PROTO3" sticker ROM_LOAD ( "proto3_super_high_impact_game_rom_u112.u112", 0x040000, 0x40000, CRC(3ffc27e9) SHA1(ec337629c17daaa2445fb344e08243de7f09536e) ) ROM_LOAD ( "proto3_super_high_impact_game_rom_u113.u113", 0x080000, 0x40000, CRC(01549d00) SHA1(40604e949cef056f90031850bdb91782135e7ec2) ) @@ -2555,17 +2578,17 @@ ROM_START( shimpactp5 ) ROM_END -ROM_START( shimpactp4 ) /* You must manualy reset the high score table or game will hang after initial demo screen, it's best to do a "Full Factory Restore" */ - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ +ROM_START( shimpactp4 ) // You must manualy reset the high score table or game will hang after initial demo screen, it's best to do a "Full Factory Restore" + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_super_high_impact_u4_sound_rom.u4", 0x10000, 0x20000, CRC(1e5a012c) SHA1(4077fc266799a01738b7f88e867535f1fbacd557) ) ROM_LOAD ( "sl1_super_high_impact_u19_sound_rom.u19", 0x30000, 0x20000, CRC(10f9684e) SHA1(1fdc5364f87fb65f4f2a438841e0fe847f765aaf) ) ROM_LOAD ( "sl1_super_high_impact_u20_sound_rom.u20", 0x50000, 0x20000, CRC(1b4a71c1) SHA1(74b7b4ae76ebe65f1f46b2117970bfefefbb5344) ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "proto4_super_high_impact_game_rom_u105.u105", 0xc0000, 0x20000, CRC(770b31ce) SHA1(d0bc2ed0f6134afb0dd53236377044a122e7f181) ) // Both program ROMs had a "PROTO4" sticker ROM_LOAD16_BYTE( "proto4_super_high_impact_game_rom_u89.u89", 0xc0001, 0x20000, CRC(96b622a5) SHA1(6d21c69ad1b0990679b616a79ba698772c8d98ff) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "proto3_super_high_impact_game_rom_u111.u111", 0x000000, 0x40000, CRC(80ae2a86) SHA1(1ff76e3064c7636f6877e426f4a88c094d1a6325) ) // All graphic ROMs had a "PROTO3" sticker ROM_LOAD ( "proto3_super_high_impact_game_rom_u112.u112", 0x040000, 0x40000, CRC(3ffc27e9) SHA1(ec337629c17daaa2445fb344e08243de7f09536e) ) ROM_LOAD ( "proto3_super_high_impact_game_rom_u113.u113", 0x080000, 0x40000, CRC(01549d00) SHA1(40604e949cef056f90031850bdb91782135e7ec2) ) @@ -2584,7 +2607,7 @@ ROM_END ROM_START( strkforc ) - ROM_REGION( 0x90000, "cvsd:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x90000, "cvsd:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_strike_force_sound_rom_u4.u4", 0x10000, 0x10000, CRC(8f747312) SHA1(729929c209741e72eb83b407cf95d7709ec1b5ae) ) ROM_RELOAD( 0x20000, 0x10000 ) ROM_LOAD ( "sl1_strike_force_sound_rom_u19.u19", 0x30000, 0x10000, CRC(afb29926) SHA1(ad904c0968a90b8187cc87d6c171fbc021d2f66f) ) @@ -2592,11 +2615,11 @@ ROM_START( strkforc ) ROM_LOAD ( "sl1_strike_force_sound_rom_u20.u20", 0x50000, 0x10000, CRC(1bc9b746) SHA1(a5ad40ce7f228f30c21c5a7bdc2893c2a7fe7f58) ) ROM_RELOAD( 0x60000, 0x10000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la1_strike_force_game_rom_u105.u105", 0xc0000, 0x20000, CRC(7895e0e3) SHA1(fa471af9e673a82713a590f463f87a4c59e3d5d8) ) ROM_LOAD16_BYTE( "la1_strike_force_game_rom_u89.u89", 0xc0001, 0x20000, CRC(26114d9e) SHA1(79906966859f0ae0884b956e7d520e3cff78fab7) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_strike_force_game_rom_u111.u111", 0x000000, 0x20000, CRC(878efc80) SHA1(94448002faff5839beab5466e5a41195869face3) ) ROM_LOAD ( "la1_strike_force_game_rom_u112.u112", 0x020000, 0x20000, CRC(93394399) SHA1(67ad5c27c3c82fa6055032df98c365c56c7f8b1b) ) ROM_LOAD ( "la1_strike_force_game_rom_u113.u113", 0x040000, 0x20000, CRC(9565a79b) SHA1(ebb90132ed8acbbed09bbcdff435cdf60a3ef8ab) ) @@ -2616,20 +2639,20 @@ ROM_END ROM_START( mkla4 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "l4_mortal_kombat_game_rom_u-105.u105", 0x00000, 0x80000, CRC(29af348f) SHA1(9f8a57606647c5ea056d61aa4ab1232538539fd8) ) ROM_LOAD16_BYTE( "l4_mortal_kombat_game_rom_u-89.u89", 0x00001, 0x80000, CRC(1ad76662) SHA1(bee4ab5371f58df799365e73ec0cc02e903f240c) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) )// known to be labeled LA1 or just L1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2648,20 +2671,20 @@ ROM_END ROM_START( mkla3 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "l3_mortal_kombat_game_rom_u-105.u105", 0x00000, 0x80000, CRC(2ce843c5) SHA1(d48efcecd6528414249f3884edc32e0dafa9677f) ) ROM_LOAD16_BYTE( "l3_mortal_kombat_game_rom_u-89.u89", 0x00001, 0x80000, CRC(49a46e10) SHA1(c63c00531b29c01ee864acc141b1713507d25c69) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // also known to be labeled as LA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2680,20 +2703,20 @@ ROM_END ROM_START( mkla2 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "l2_mortal_kombat_game_rom_u-105.u105", 0x00000, 0x80000, CRC(8531d44e) SHA1(652c7946cc725e11815f852af8891511b87de186) ) ROM_LOAD16_BYTE( "l2_mortal_kombat_game_rom_u-89.u89", 0x00001, 0x80000, CRC(b88dc26e) SHA1(bf34a03bdb70b67fd9c0b6d636b038a63827151e) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // also known to be labeled as LA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2712,20 +2735,20 @@ ROM_END ROM_START( mkla1 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "l1_mortal_kombat_game_rom_u-105.u105", 0x00000, 0x80000, CRC(e1f7b4c9) SHA1(dc62e67e03b54460494bd94a50347327c19b72ec) ) ROM_LOAD16_BYTE( "l1_mortal_kombat_game_rom_u-89.u89", 0x00001, 0x80000, CRC(9d38ac75) SHA1(86ff581cd3546f6b1be75e1d0744a8d767b22f5a) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // also known to be labeled as LA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2744,20 +2767,20 @@ ROM_END ROM_START( mkprot9 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "proto9_mortal_kombat_game_rom_u-105.u105", 0x00000, 0x80000, CRC(20772bbd) SHA1(d5b400700b91c7a70bd2441c5254300cf1f743d7) ) // "PROTO9" sticker over label ROM_LOAD16_BYTE( "proto9_mortal_kombat_game_rom_u-89.u89", 0x00001, 0x80000, CRC(3238d45b) SHA1(8a4e827994d0d20feda3785a5f8f0f77b737052b) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // with prototype sets, these where labeled as PA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2776,20 +2799,20 @@ ROM_END ROM_START( mkprot8 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "proto8_mortal_kombat_game_rom_u-105.u105", 0x00000, 0x80000, CRC(2f3c095d) SHA1(f6e9ac0fc0f997f4b323ba48590b042eae079a16) ) // "PROTO8" sticker over label ROM_LOAD16_BYTE( "proto8_mortal_kombat_game_rom_u-89.u89", 0x00001, 0x80000, CRC(edcf217f) SHA1(29e17bd20844a3e666e794c2fc068a011ccff2e8) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // with prototype sets, these where labeled as PA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2807,20 +2830,20 @@ ROM_START( mkprot8 ) ROM_END ROM_START( mkprot4 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "proto4_mortal_kombat_game_rom_u-105.u105", 0x00000, 0x80000, CRC(d7f8d78b) SHA1(736f16d8c0407ee6dc8d3e40df08d1c926147a16) ) // "PROTO4" sticker over label ROM_LOAD16_BYTE( "proto4_mortal_kombat_game_rom_u-89.u89", 0x00001, 0x80000, CRC(a6b5d6d2) SHA1(917dbcff6d601d3fb015c8e26c6f0768290cd64a) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // with prototype sets, these where labeled as PA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2838,21 +2861,21 @@ ROM_START( mkprot4 ) ROM_END ROM_START( mkyturbo ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - /* A 'NIBBLE BOARD' daughtercard holding a GAL16V8A-2SP, 27C040 EPROM and a 9.8304MHz XTAL plugs into the U89 socket */ - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + // A 'NIBBLE BOARD' daughtercard holding a GAL16V8A-2SP, 27C040 EPROM and a 9.8304MHz XTAL plugs into the U89 socket + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "kombo-rom-u105.bin", 0x00000, 0x80000, CRC(80d5618c) SHA1(9bdfddbc70b61c94c1871abac1de153b8b728761) ) ROM_LOAD16_BYTE( "kombo-rom-u89.bin", 0x00001, 0x80000, CRC(450788e3) SHA1(34e4fa9c2ede66799301c3d1755df25edc432539) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // also known to be labeled as LA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2870,21 +2893,21 @@ ROM_START( mkyturbo ) ROM_END ROM_START( mkyturboe ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - /* A 'NIBBLE BOARD' daughtercard holding a GAL16V8A-2SP, 27C040 EPROM and a 9.8304MHz XTAL plugs into the U89 socket */ - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + // A 'NIBBLE BOARD' daughtercard holding a GAL16V8A-2SP, 27C040 EPROM and a 9.8304MHz XTAL plugs into the U89 socket + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "turbo30.u105", 0x00000, 0x80000, CRC(59747c59) SHA1(69e1450a6b2b41b8939ce84903cb35c1906b81e2) ) ROM_LOAD16_BYTE( "turbo30.u89", 0x00001, 0x80000, CRC(84d66a75) SHA1(11ee7ae7fc1c13cafa8312f101878393ae6fd8b7) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // also known to be labeled as LA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2902,20 +2925,20 @@ ROM_START( mkyturboe ) ROM_END ROM_START( mkrep ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "u105", 0x00000, 0x80000, CRC(49a352ed) SHA1(c75f2ca7ff43e65c75cfe1fbd4375a00f54e2676) ) ROM_LOAD16_BYTE( "u89", 0x00001, 0x80000, CRC(5d5113b2) SHA1(3f870b8fd26865f76c88a9b5e8b72b9f891104c4) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // also known to be labeled as LA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2934,20 +2957,20 @@ ROM_END ROM_START( mknifty ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "nifty.105", 0x00000, 0x80000, CRC(c66fd38d) SHA1(92e99f7c46422e47f503057398385168f63814cc) ) ROM_LOAD16_BYTE( "nifty.89", 0x00001, 0x80000, CRC(bbf8738d) SHA1(38acaf7c29e59b5c3ba32d5cb950d0fe8852ff51) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // also known to be labeled as LA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2965,20 +2988,20 @@ ROM_START( mknifty ) ROM_END ROM_START( mknifty666 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "l1_mortal_kombat_u3_sound_rom.u3", 0x10000, 0x40000, CRC(c615844c) SHA1(5732f9053a5f73b0cc3b0166d7dc4430829d5bc7) ) // same data as the "T-Unit" soundboard, but these are labeled L1 vs SL1 - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "l1_mortal_kombat_u12_sound_rom.u12", 0x00000, 0x40000, CRC(258bd7f9) SHA1(463890b23f17350fb9b8a85897b0777c45bc2d54) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "l1_mortal_kombat_u13_sound_rom.u13", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "mortall_kombo_rom_u105-j4.u105.bin", 0x00000, 0x80000, CRC(243d8009) SHA1(e275f93d2d4b3a454303ce106641707a98bae084) ) ROM_LOAD16_BYTE( "kombo-u89.u89", 0x00001, 0x80000, CRC(7b26a6b1) SHA1(378bd54fcc5c801ad8cc10ed94157a1e60572199)) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // also known to be labeled as LA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -2996,10 +3019,10 @@ ROM_START( mknifty666 ) ROM_END ROM_START( mkyawdim ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) // sound CPU ROM_LOAD ( "1.u67", 0x00000, 0x10000, CRC(b58d229e) SHA1(3ed14ef650dfa7f9d460611b19e9233a022cbea6) ) - ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "oki", 0 ) // ADPCM ROM_LOAD( "2.u59", 0x00000, 0x20000, CRC(a72ad81e) SHA1(7be4285b28755bd48acce670f34d6a7f043dda96) ) ROM_CONTINUE( 0x40000, 0x20000 ) ROM_CONTINUE( 0x80000, 0x20000 ) @@ -3009,11 +3032,11 @@ ROM_START( mkyawdim ) ROM_CONTINUE( 0xa0000, 0x20000 ) ROM_CONTINUE( 0xe0000, 0x20000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "4.u25", 0x00000, 0x80000, CRC(b12b3bf2) SHA1(deb7755e8407d9de25124b3fdbc4c834a25d8252) ) ROM_LOAD16_BYTE( "5.u26", 0x00001, 0x80000, CRC(7a37dc5c) SHA1(c4fc6933d8b990c5c56c65282b1f72b90b5d5435) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-111.u111", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) // also known to be labeled as LA1 ROM_LOAD ( "l1_mortal_kombat_game_rom_u-112.u112", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "l1_mortal_kombat_game_rom_u-113.u113", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -3031,12 +3054,12 @@ ROM_START( mkyawdim ) ROM_END ROM_START( mkyawdim2 ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) // sound CPU // Differs from other mkyawdim sets ROM_LOAD ( "yawdim.u167", 0x00000, 0x08000, CRC(16da7efb) SHA1(ac1db81a55aca36136b94977a91a1fc778b7b164) ) // 27c512 ROM_CONTINUE( 0x00000, 0x08000 ) - ROM_REGION( 0x200000, "oki", 0 ) /* ADPCM */ + ROM_REGION( 0x200000, "oki", 0 ) // ADPCM ROM_LOAD( "yawdim.u159", 0x000000, 0x20000, CRC(95b120af) SHA1(41b6fb384e5048926b87959a2c58d96b95698aba) ) // 27c020 Half size of mkyawdim set ROM_CONTINUE( 0x100000, 0x20000 ) ROM_RELOAD( 0x040000, 0x20000 ) @@ -3054,11 +3077,11 @@ ROM_START( mkyawdim2 ) ROM_CONTINUE( 0x1a0000, 0x20000 ) ROM_CONTINUE( 0x1e0000, 0x20000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "4.u25", 0x00000, 0x80000, CRC(b12b3bf2) SHA1(deb7755e8407d9de25124b3fdbc4c834a25d8252) ) // 2x 4Mbit masks ROM_LOAD16_BYTE( "5.u26", 0x00001, 0x80000, CRC(7a37dc5c) SHA1(c4fc6933d8b990c5c56c65282b1f72b90b5d5435) ) - ROM_REGION( 0x800000, "gfx1", 0 ) /* 8mbit dumps */ + ROM_REGION( 0x800000, "gfx", 0 ) // 8mbit dumps ROM_LOAD ( "b-1.bin", 0x000000, 0x100000, CRC(f41e61c6) SHA1(7dad38839d5c9aa0cfa7b2f7199f14e0f2c4494b) ) // 6x 8Mbit masks ROM_LOAD ( "b-2.bin", 0x100000, 0x100000, CRC(8052740b) SHA1(f1b7fd536966d9d0ce690cdec635069c340d678e) ) @@ -3093,10 +3116,10 @@ ROM_END ROM_START( mkyawdim3 ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) // sound CPU ROM_LOAD ( "15.bin", 0x00000, 0x10000, CRC(b58d229e) SHA1(3ed14ef650dfa7f9d460611b19e9233a022cbea6) ) - ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "oki", 0 ) // ADPCM ROM_LOAD( "13.bin", 0x00000, 0x20000, CRC(921c613d) SHA1(be62b87f195b6347112ab13cc14514d4c88a8b86) ) // Half size of mkyawdim2 set and a quarter of mkyawdim ROM_RELOAD( 0x40000, 0x20000 ) ROM_RELOAD( 0x80000, 0x20000 ) @@ -3106,11 +3129,11 @@ ROM_START( mkyawdim3 ) ROM_CONTINUE( 0xa0000, 0x20000 ) ROM_CONTINUE( 0xe0000, 0x20000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "p1.bin", 0x00000, 0x80000, CRC(2337a0f9) SHA1(d25743e5bb7b4a60f181783d17f217aa0a64536a) ) // differs from other Yawdim sets ROM_LOAD16_BYTE( "p2.bin", 0x00001, 0x80000, CRC(7a37dc5c) SHA1(c4fc6933d8b990c5c56c65282b1f72b90b5d5435) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "12.bin", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) ROM_LOAD ( "8.bin", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD ( "10.bin", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -3171,10 +3194,10 @@ Kombat rev. 2 1c // same as mkyawdim3, but with its own main program roms ROM_START( mkyawdim4 ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) // sound CPU ROM_LOAD( "14.bin", 0x00000, 0x10000, CRC(b58d229e) SHA1(3ed14ef650dfa7f9d460611b19e9233a022cbea6) ) - ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "oki", 0 ) // ADPCM ROM_LOAD( "15.bin", 0x00000, 0x20000, CRC(921c613d) SHA1(be62b87f195b6347112ab13cc14514d4c88a8b86) ) ROM_RELOAD( 0x40000, 0x20000 ) ROM_RELOAD( 0x80000, 0x20000 ) @@ -3184,13 +3207,13 @@ ROM_START( mkyawdim4 ) ROM_CONTINUE( 0xa0000, 0x20000 ) ROM_CONTINUE( 0xe0000, 0x20000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "17.bin", 0x00000, 0x80000, CRC(671b533d) SHA1(20859ceb0635126047216f85a6e35072e14766ad) ) ROM_LOAD16_BYTE( "18.bin", 0x00001, 0x80000, CRC(4e857747) SHA1(b94c7d5e4356ac6890e6bfaf75c76d94408e5bc5) ) // ROM_LOAD16_BYTE( "17.bin", 0x00000, 0x80000, CRC(b12b3bf2) SHA1(deb7755e8407d9de25124b3fdbc4c834a25d8252) ) // other PCB: mkyawdim3 with mkyawdim main program // ROM_LOAD16_BYTE( "18.bin", 0x00001, 0x80000, CRC(7a37dc5c) SHA1(c4fc6933d8b990c5c56c65282b1f72b90b5d5435) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD( "22.bin", 0x000000, 0x80000, CRC(d17096c4) SHA1(01ef390a372c9d94adf138f9543ebb88b89f4c38) ) ROM_LOAD( "21.bin", 0x080000, 0x80000, CRC(993bc2e4) SHA1(7791edbec2b4b8971a3e790346dd7564ecf16d5c) ) ROM_LOAD( "20.bin", 0x100000, 0x80000, CRC(6fb91ede) SHA1(a3735b49f93b08c44fbc97e2b5aad394628fbe90) ) @@ -3218,11 +3241,11 @@ ROM_START( mkla3bl ) // strange bootleg with peculiarly arranged GFX ROMs. ROM_LOAD ( "m1-a002", 0x80000, 0x40000, CRC(7b7ec3b6) SHA1(6eec1b90d4a4855f34a7ebfbf93f3358d5627db4) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) + ROM_REGION16_LE( 0x100000, "maindata", 0 ) ROM_LOAD16_BYTE( "ax422-m1-5", 0x00000, 0x80000, CRC(2ce843c5) SHA1(d48efcecd6528414249f3884edc32e0dafa9677f) ) ROM_LOAD16_BYTE( "ax422-m1-4", 0x00001, 0x80000, CRC(49a46e10) SHA1(c63c00531b29c01ee864acc141b1713507d25c69) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "pw3412-m1-a", 0x000000, 0x200000, CRC(87776f14) SHA1(83533049545b175fa1fc8e021056466f6a37b2a5) ) // even == a-2.bin, odd == b-2.bin ROM_LOAD ( "pw3412-m1-b", 0x200000, 0x200000, CRC(30724e04) SHA1(a5f354b82fd5f73535ba77ed8be473f862528682) ) // even == a-1.bin, odd == b-1.bin ROM_LOAD ( "pw3412-m1-c", 0x400000, 0x200000, CRC(96612f94) SHA1(4cc80962bd04992ce95857650514c6f40f16fdad) ) // 1st half == c-1.bin, 2nd half == c-2.bin @@ -3230,21 +3253,21 @@ ROM_END ROM_START( term2 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_terminator_2_u3_sound_rom.u3", 0x10000, 0x20000, CRC(73c3f5c4) SHA1(978dd974590e77294dbe9a647aebd3d24af6397f) ) ROM_RELOAD ( 0x30000, 0x20000 ) - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "sl1_terminator_2_u12_sound_rom.u12", 0x00000, 0x40000, CRC(e192a40d) SHA1(1f7a0e282c0c8eb66cbe514128bd104433e53b7a) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "sl1_terminator_2_u13_sound_rom.u13", 0x80000, 0x40000, CRC(956fa80b) SHA1(02ab504627f4b25a394fa4192bb134138cbf6a4f) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la4_terminator_2_game_rom_u105.u105", 0x00000, 0x80000, CRC(d4d8d884) SHA1(3209e131b128f12af30b3c6056fd63df497f93eb) ) ROM_LOAD16_BYTE( "la4_terminator_2_game_rom_u89.u89", 0x00001, 0x80000, CRC(25359415) SHA1(ca8b7e1b5a363b78499f92c979a11ace6f1dceab) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_terminator_2_game_rom_u111.u111", 0x000000, 0x80000, CRC(916d0197) SHA1(3b53d3770955b10cc6002e3d3bf0f71429667af0) ) ROM_LOAD ( "la1_terminator_2_game_rom_u112.u112", 0x080000, 0x80000, CRC(39ae1c87) SHA1(a9d332dffc77c1e0dc50549825f5b403cf19c41d) ) ROM_LOAD ( "la1_terminator_2_game_rom_u113.u113", 0x100000, 0x80000, CRC(cb5084e5) SHA1(58cab00d8ebc72792f6c29899013ae6a0d2278b9) ) @@ -3263,21 +3286,21 @@ ROM_END ROM_START( term2la3 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_terminator_2_u3_sound_rom.u3", 0x10000, 0x20000, CRC(73c3f5c4) SHA1(978dd974590e77294dbe9a647aebd3d24af6397f) ) ROM_RELOAD ( 0x30000, 0x20000 ) - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "sl1_terminator_2_u12_sound_rom.u12", 0x00000, 0x40000, CRC(e192a40d) SHA1(1f7a0e282c0c8eb66cbe514128bd104433e53b7a) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "sl1_terminator_2_u13_sound_rom.u13", 0x80000, 0x40000, CRC(956fa80b) SHA1(02ab504627f4b25a394fa4192bb134138cbf6a4f) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la3_terminator_2_game_rom_u105.u105", 0x00000, 0x80000, CRC(34142b28) SHA1(985fd169b3d62c4197fe4c6f11055a6c17872899) ) ROM_LOAD16_BYTE( "la3_terminator_2_game_rom_u89.u89", 0x00001, 0x80000, CRC(5ffea427) SHA1(c6f65bc57b33ae1a123f610c635e0d65663e54da) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_terminator_2_game_rom_u111.u111", 0x000000, 0x80000, CRC(916d0197) SHA1(3b53d3770955b10cc6002e3d3bf0f71429667af0) ) ROM_LOAD ( "la1_terminator_2_game_rom_u112.u112", 0x080000, 0x80000, CRC(39ae1c87) SHA1(a9d332dffc77c1e0dc50549825f5b403cf19c41d) ) ROM_LOAD ( "la1_terminator_2_game_rom_u113.u113", 0x100000, 0x80000, CRC(cb5084e5) SHA1(58cab00d8ebc72792f6c29899013ae6a0d2278b9) ) @@ -3296,21 +3319,21 @@ ROM_END ROM_START( term2la2 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_terminator_2_u3_sound_rom.u3", 0x10000, 0x20000, CRC(73c3f5c4) SHA1(978dd974590e77294dbe9a647aebd3d24af6397f) ) ROM_RELOAD ( 0x30000, 0x20000 ) - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "sl1_terminator_2_u12_sound_rom.u12", 0x00000, 0x40000, CRC(e192a40d) SHA1(1f7a0e282c0c8eb66cbe514128bd104433e53b7a) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "sl1_terminator_2_u13_sound_rom.u13", 0x80000, 0x40000, CRC(956fa80b) SHA1(02ab504627f4b25a394fa4192bb134138cbf6a4f) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la2_terminator_2_game_rom_u105.u105", 0x00000, 0x80000, CRC(7177de98) SHA1(0987be413d6cb5ded7059ad6ebbca49331b046b2) ) ROM_LOAD16_BYTE( "la2_terminator_2_game_rom_u89.u89", 0x00001, 0x80000, CRC(14d7b9f5) SHA1(b8676d21d53fd3c8492d8911e749d74df1c66b1d) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_terminator_2_game_rom_u111.u111", 0x000000, 0x80000, CRC(916d0197) SHA1(3b53d3770955b10cc6002e3d3bf0f71429667af0) ) ROM_LOAD ( "la1_terminator_2_game_rom_u112.u112", 0x080000, 0x80000, CRC(39ae1c87) SHA1(a9d332dffc77c1e0dc50549825f5b403cf19c41d) ) ROM_LOAD ( "la1_terminator_2_game_rom_u113.u113", 0x100000, 0x80000, CRC(cb5084e5) SHA1(58cab00d8ebc72792f6c29899013ae6a0d2278b9) ) @@ -3329,21 +3352,21 @@ ROM_END ROM_START( term2la1 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_terminator_2_u3_sound_rom.u3", 0x10000, 0x20000, CRC(73c3f5c4) SHA1(978dd974590e77294dbe9a647aebd3d24af6397f) ) ROM_RELOAD ( 0x30000, 0x20000 ) - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "sl1_terminator_2_u12_sound_rom.u12", 0x00000, 0x40000, CRC(e192a40d) SHA1(1f7a0e282c0c8eb66cbe514128bd104433e53b7a) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "sl1_terminator_2_u13_sound_rom.u13", 0x80000, 0x40000, CRC(956fa80b) SHA1(02ab504627f4b25a394fa4192bb134138cbf6a4f) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la1_terminator_2_game_rom_u105.u105", 0x00000, 0x80000, CRC(ca52a8b0) SHA1(20b91bdd9fe8e7be6a3c3cb9684769733d66d401) ) ROM_LOAD16_BYTE( "la1_terminator_2_game_rom_u89.u89", 0x00001, 0x80000, CRC(08535210) SHA1(a7986541bc504294bd6523ce691e19e496f8be7c) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_terminator_2_game_rom_u111.u111", 0x000000, 0x80000, CRC(916d0197) SHA1(3b53d3770955b10cc6002e3d3bf0f71429667af0) ) ROM_LOAD ( "la1_terminator_2_game_rom_u112.u112", 0x080000, 0x80000, CRC(39ae1c87) SHA1(a9d332dffc77c1e0dc50549825f5b403cf19c41d) ) ROM_LOAD ( "la1_terminator_2_game_rom_u113.u113", 0x100000, 0x80000, CRC(cb5084e5) SHA1(58cab00d8ebc72792f6c29899013ae6a0d2278b9) ) @@ -3362,21 +3385,21 @@ ROM_END ROM_START( term2pa2 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_terminator_2_u3_sound_rom.u3", 0x10000, 0x20000, CRC(73c3f5c4) SHA1(978dd974590e77294dbe9a647aebd3d24af6397f) ) ROM_RELOAD ( 0x30000, 0x20000 ) - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "sl1_terminator_2_u12_sound_rom.u12", 0x00000, 0x40000, CRC(e192a40d) SHA1(1f7a0e282c0c8eb66cbe514128bd104433e53b7a) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "sl1_terminator_2_u13_sound_rom.u13", 0x80000, 0x40000, CRC(956fa80b) SHA1(02ab504627f4b25a394fa4192bb134138cbf6a4f) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "pa2_terminator_2_game_rom_u105.u105", 0x00000, 0x80000, CRC(e7842129) SHA1(b2b00ac9995ef021e37ab6670c2c219ea09329dc) ) ROM_LOAD16_BYTE( "pa2_terminator_2_game_rom_u89.u89", 0x00001, 0x80000, CRC(41d50e55) SHA1(37bf9fc5625b35a1b88cae291b71c4f761b687ab) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_terminator_2_game_rom_u111.u111", 0x000000, 0x80000, CRC(916d0197) SHA1(3b53d3770955b10cc6002e3d3bf0f71429667af0) ) ROM_LOAD ( "la1_terminator_2_game_rom_u112.u112", 0x080000, 0x80000, CRC(39ae1c87) SHA1(a9d332dffc77c1e0dc50549825f5b403cf19c41d) ) ROM_LOAD ( "la1_terminator_2_game_rom_u113.u113", 0x100000, 0x80000, CRC(cb5084e5) SHA1(58cab00d8ebc72792f6c29899013ae6a0d2278b9) ) @@ -3394,22 +3417,22 @@ ROM_START( term2pa2 ) ROM_END -ROM_START( term2lg1 ) /* All reported German versions use standard English sound roms */ - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ +ROM_START( term2lg1 ) // All reported German versions use standard English sound roms + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_terminator_2_u3_sound_rom.u3", 0x10000, 0x20000, CRC(73c3f5c4) SHA1(978dd974590e77294dbe9a647aebd3d24af6397f) ) ROM_RELOAD ( 0x30000, 0x20000 ) - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "sl1_terminator_2_u12_sound_rom.u12", 0x00000, 0x40000, CRC(e192a40d) SHA1(1f7a0e282c0c8eb66cbe514128bd104433e53b7a) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "sl1_terminator_2_u13_sound_rom.u13", 0x80000, 0x40000, CRC(956fa80b) SHA1(02ab504627f4b25a394fa4192bb134138cbf6a4f) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "lg1_terminator_2_game_rom_u105.u105", 0x00000, 0x80000, CRC(6aad6389) SHA1(912f4e1911e537ed17775dbff6be0ab28ac820a9) ) ROM_LOAD16_BYTE( "lg1_terminator_2_game_rom_u89.u89", 0x00001, 0x80000, CRC(5a052766) SHA1(a746c18476000fb38107482e22c767a13dd580d2) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_terminator_2_game_rom_u111.u111", 0x000000, 0x80000, CRC(916d0197) SHA1(3b53d3770955b10cc6002e3d3bf0f71429667af0) ) ROM_LOAD ( "la1_terminator_2_game_rom_u112.u112", 0x080000, 0x80000, CRC(39ae1c87) SHA1(a9d332dffc77c1e0dc50549825f5b403cf19c41d) ) ROM_LOAD ( "la1_terminator_2_game_rom_u113.u113", 0x100000, 0x80000, CRC(cb5084e5) SHA1(58cab00d8ebc72792f6c29899013ae6a0d2278b9) ) @@ -3428,21 +3451,21 @@ ROM_END ROM_START( totcarn ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_total_carnage_sound_rom_u3.u3", 0x10000, 0x20000, CRC(5bdb4665) SHA1(c6b90b914785b8703790957cc4bb4983a332fba6) ) ROM_RELOAD ( 0x30000, 0x20000 ) - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "sl1_total_carnage_sound_rom_u12.u12", 0x00000, 0x40000, CRC(d0000ac7) SHA1(2d476c7727462623feb2f1a23fb797eaeed5ce30) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "sl1_total_carnage_sound_rom_u13.u13", 0x80000, 0x40000, CRC(e48e6f0c) SHA1(bf7d548b6b1901966f99c815129ea160ef36f024) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "la1_total_carnage_game_rom_u105.u105", 0x80000, 0x40000, CRC(7c651047) SHA1(530c8b4e453778a81479d02913ffe7097903447f) ) ROM_LOAD16_BYTE( "la1_total_carnage_game_rom_u89.u89", 0x80001, 0x40000, CRC(6761daf3) SHA1(8be881ecc5ea1121bb6cee1a34901a4d5e50dbb6) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_total_carnage_game_rom_u111.u111", 0x000000, 0x40000, CRC(13f3f231) SHA1(6df0dca72e170818c260d9931477103a38864a1e) ) // Also known to be labeled as PA1 ROM_LOAD ( "la1_total_carnage_game_rom_u112.u112", 0x040000, 0x40000, CRC(72e45007) SHA1(b6f5dfb844b6ff46a3594d20e85f1f20bdbfb793) ) ROM_LOAD ( "la1_total_carnage_game_rom_u113.u113", 0x080000, 0x40000, CRC(2c8ec753) SHA1(9393179ea19cbec7ac7e4f8e912bb4f86d93e8bd) ) @@ -3461,21 +3484,21 @@ ROM_END ROM_START( totcarnp2 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_total_carnage_sound_rom_u3.u3", 0x10000, 0x20000, CRC(5bdb4665) SHA1(c6b90b914785b8703790957cc4bb4983a332fba6) ) ROM_RELOAD ( 0x30000, 0x20000 ) - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "sl1_total_carnage_sound_rom_u12.u12", 0x00000, 0x40000, CRC(d0000ac7) SHA1(2d476c7727462623feb2f1a23fb797eaeed5ce30) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "sl1_total_carnage_sound_rom_u13.u13", 0x80000, 0x40000, CRC(e48e6f0c) SHA1(bf7d548b6b1901966f99c815129ea160ef36f024) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "proto2_total_carnage_game_rom_u105.u105", 0x80000, 0x40000, CRC(e273d43c) SHA1(9f2040328917f02153edced28f9a4e1fb7d0cee7) ) ROM_LOAD16_BYTE( "proto2_total_carnage_game_rom_u89.u89", 0x80001, 0x40000, CRC(e759078b) SHA1(a7712b51215029422e21ba803dac3afd44c941ac) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_total_carnage_game_rom_u111.u111", 0x000000, 0x40000, CRC(13f3f231) SHA1(6df0dca72e170818c260d9931477103a38864a1e) ) // Also known to be labeled as PA1 ROM_LOAD ( "la1_total_carnage_game_rom_u112.u112", 0x040000, 0x40000, CRC(72e45007) SHA1(b6f5dfb844b6ff46a3594d20e85f1f20bdbfb793) ) ROM_LOAD ( "la1_total_carnage_game_rom_u113.u113", 0x080000, 0x40000, CRC(2c8ec753) SHA1(9393179ea19cbec7ac7e4f8e912bb4f86d93e8bd) ) @@ -3494,21 +3517,21 @@ ROM_END ROM_START( totcarnp1 ) - ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU */ + ROM_REGION( 0x50000, "adpcm:cpu", 0 ) // sound CPU ROM_LOAD ( "sl1_total_carnage_sound_rom_u3.u3", 0x10000, 0x20000, CRC(5bdb4665) SHA1(c6b90b914785b8703790957cc4bb4983a332fba6) ) ROM_RELOAD ( 0x30000, 0x20000 ) - ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM */ + ROM_REGION( 0x100000, "adpcm:oki", 0 ) // ADPCM ROM_LOAD ( "sl1_total_carnage_sound_rom_u12.u12", 0x00000, 0x40000, CRC(d0000ac7) SHA1(2d476c7727462623feb2f1a23fb797eaeed5ce30) ) ROM_RELOAD( 0x40000, 0x40000 ) ROM_LOAD ( "sl1_total_carnage_sound_rom_u13.u13", 0x80000, 0x40000, CRC(e48e6f0c) SHA1(bf7d548b6b1901966f99c815129ea160ef36f024) ) ROM_RELOAD( 0xc0000, 0x40000 ) - ROM_REGION16_LE( 0x100000, "user1", 0 ) /* 34010 code */ + ROM_REGION16_LE( 0x100000, "maindata", 0 ) // 34010 code ROM_LOAD16_BYTE( "proto1_total_carnage_game_rom_u105.u105", 0x80000, 0x40000, CRC(7a782cae) SHA1(806894e23876325fffcad4d707c850fbd91d973a) ) ROM_LOAD16_BYTE( "proto1_total_carnage_game_rom_u89.u89", 0x80001, 0x40000, CRC(1c899a8d) SHA1(953d4def814f036969b9ecf3be16e145c2d2bf9f) ) - ROM_REGION( 0x800000, "gfx1", 0 ) + ROM_REGION( 0x800000, "gfx", 0 ) ROM_LOAD ( "la1_total_carnage_game_rom_u111.u111", 0x000000, 0x40000, CRC(13f3f231) SHA1(6df0dca72e170818c260d9931477103a38864a1e) ) // Also known to be labeled as PA1 ROM_LOAD ( "la1_total_carnage_game_rom_u112.u112", 0x040000, 0x40000, CRC(72e45007) SHA1(b6f5dfb844b6ff46a3594d20e85f1f20bdbfb793) ) ROM_LOAD ( "la1_total_carnage_game_rom_u113.u113", 0x080000, 0x40000, CRC(2c8ec753) SHA1(9393179ea19cbec7ac7e4f8e912bb4f86d93e8bd) ) @@ -3564,16 +3587,16 @@ GAME( 1990, hiimpactp, hiimpact, yunit_cvsd_6bit_slow, hiimpact, midyunit_st GAME( 1991, shimpact, 0, yunit_cvsd_6bit_slow, shimpact, midyunit_state, init_shimpact, ROT0, "Midway", "Super High Impact (rev LA1 09/30/91)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, shimpactp6, shimpact, yunit_cvsd_6bit_slow, shimpact, midyunit_state, init_shimpact, ROT0, "Midway", "Super High Impact (prototype, proto 6.0 09/23/91)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, shimpactp5, shimpact, yunit_cvsd_6bit_slow, shimpact, midyunit_state, init_shimpact, ROT0, "Midway", "Super High Impact (prototype, proto 5.0 09/15/91)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, shimpactp4, shimpact, yunit_cvsd_6bit_slow, shimpact, midyunit_state, init_shimpact, ROT0, "Midway", "Super High Impact (prototype, proto 4.0 09/10/91)", MACHINE_SUPPORTS_SAVE ) /* See notes about factory restore above */ +GAME( 1991, shimpactp4, shimpact, yunit_cvsd_6bit_slow, shimpact, midyunit_state, init_shimpact, ROT0, "Midway", "Super High Impact (prototype, proto 4.0 09/10/91)", MACHINE_SUPPORTS_SAVE ) // See notes about factory restore above GAME( 1991, strkforc, 0, yunit_cvsd_4bit_fast, strkforc, midyunit_state, init_strkforc, ROT0, "Midway", "Strike Force (rev 1 02/25/91)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, term2, 0, term2, term2, midyunit_state, init_term2, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (rev LA4 08/03/92)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, term2la3, term2, term2, term2, midyunit_state, init_term2la3, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (rev LA3 03/27/92)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, term2la2, term2, term2, term2, midyunit_state, init_term2la2, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (rev LA2 12/09/91)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, term2la1, term2, term2, term2, midyunit_state, init_term2la1, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (rev LA1 11/01/91)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, term2pa2, term2, term2, term2, midyunit_state, init_term2la1, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (prototype, rev PA2 10/18/91)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, term2lg1, term2, term2, term2, midyunit_state, init_term2la1, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (German, rev LG1 11/04/91)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, term2, 0, term2, term2, term2_state, init_term2, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (rev LA4 08/03/92)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, term2la3, term2, term2, term2, term2_state, init_term2la3, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (rev LA3 03/27/92)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, term2la2, term2, term2, term2, term2_state, init_term2la2, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (rev LA2 12/09/91)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, term2la1, term2, term2, term2, term2_state, init_term2la1, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (rev LA1 11/01/91)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, term2pa2, term2, term2, term2, term2_state, init_term2la1, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (prototype, rev PA2 10/18/91)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, term2lg1, term2, term2, term2, term2_state, init_term2la1, ORIENTATION_FLIP_X, "Midway", "Terminator 2 - Judgment Day (German, rev LG1 11/04/91)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, mkla4, mk, yunit_adpcm_6bit_fast, mkla4, midyunit_state, init_mkyunit, ROT0, "Midway", "Mortal Kombat (rev 4.0 09/28/92)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, mkla3, mk, yunit_adpcm_6bit_fast, mkla4, midyunit_state, init_mkyunit, ROT0, "Midway", "Mortal Kombat (rev 3.0 08/31/92)", MACHINE_SUPPORTS_SAVE ) @@ -3587,10 +3610,10 @@ GAME( 1992, mkyturboe, mk, yunit_adpcm_6bit_fast, mkla4, midyunit_st GAME( 1992, mknifty, mk, yunit_adpcm_6bit_fast, mkla4, midyunit_state, init_mkyturbo, ROT0, "hack", "Mortal Kombat (Nifty Kombo, hack)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, mknifty666, mk, yunit_adpcm_6bit_fast, mkla4, midyunit_state, init_mkyturbo, ROT0, "hack", "Mortal Kombat (Nifty Kombo 666, hack)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, mkrep, mk, yunit_adpcm_6bit_fast, mkla4, midyunit_state, init_mkyturbo, ROT0, "hack", "Mortal Kombat (Reptile Man hack)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -GAME( 1992, mkyawdim, mk, mkyawdim, mkyawdim, midyunit_state, init_mkyawdim, ROT0, "bootleg (Yawdim)", "Mortal Kombat (Yawdim bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, mkyawdim2, mk, mkyawdim, mkyawdim, midyunit_state, init_mkyawdim2, ROT0, "bootleg (Yawdim)", "Mortal Kombat (Yawdim bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) // some sound effects are missing on real pcb -GAME( 1992, mkyawdim3, mk, mkyawdim, mkyawdim, midyunit_state, init_mkyawdim, ROT0, "bootleg (Yawdim)", "Mortal Kombat (Yawdim bootleg, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND) // are some sound effects missing/wrong? -GAME( 1992, mkyawdim4, mk, mkyawdim, mkyawdim, midyunit_state, init_mkyawdim, ROT0, "bootleg (Yawdim)", "Mortal Kombat (Yawdim bootleg, set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND) // are some sound effects missing/wrong? +GAME( 1992, mkyawdim, mk, mkyawdim, mkyawdim, mkyawdim_state, init_mkyawdim, ROT0, "bootleg (Yawdim)", "Mortal Kombat (Yawdim bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, mkyawdim2, mk, mkyawdim2, mkyawdim, mkyawdim_state, init_mkyawdim, ROT0, "bootleg (Yawdim)", "Mortal Kombat (Yawdim bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) // some sound effects are missing on real pcb +GAME( 1992, mkyawdim3, mk, mkyawdim, mkyawdim, mkyawdim_state, init_mkyawdim, ROT0, "bootleg (Yawdim)", "Mortal Kombat (Yawdim bootleg, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND) // are some sound effects missing/wrong? +GAME( 1992, mkyawdim4, mk, mkyawdim, mkyawdim, mkyawdim_state, init_mkyawdim, ROT0, "bootleg (Yawdim)", "Mortal Kombat (Yawdim bootleg, set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND) // are some sound effects missing/wrong? GAME( 1992, mkla3bl, mk, yunit_adpcm_6bit_fast, mkla4, midyunit_state, init_mkla3bl, ROT0, "bootleg (Victor)", "Mortal Kombat (Victor bootleg of rev 3.0 08/31/92)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, totcarn, 0, yunit_adpcm_6bit_fast, totcarn, midyunit_state, init_totcarn, ROT0, "Midway", "Total Carnage (rev LA1 03/10/92)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/midway/midyunit.h b/src/mame/midway/midyunit.h index e62dcfdfdd4ad..897a85d5be08e 100644 --- a/src/mame/midway/midyunit.h +++ b/src/mame/midway/midyunit.h @@ -27,66 +27,43 @@ class midyunit_state : public driver_device midyunit_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") - , m_audiocpu(*this, "audiocpu") - , m_oki(*this, "oki") , m_palette(*this, "palette") , m_narc_sound(*this, "narcsnd") , m_cvsd_sound(*this, "cvsd") , m_adpcm_sound(*this, "adpcm") - , m_soundlatch(*this, "soundlatch") - , m_term2_adc(*this, "adc") , m_nvram(*this, "nvram") - , m_generic_paletteram_16(*this, "paletteram") + , m_paletteram(*this, "paletteram") , m_gfx_rom(*this, "gfx_rom", 0x800000, ENDIANNESS_BIG) , m_mainram(*this, "mainram") , m_ports(*this, { { "IN0", "IN1", "IN2", "DSW", "UNK0", "UNK1" } }) - , m_left_flash(*this, "Left_Flash_%u", 1U) - , m_right_flash(*this, "Right_Flash_%u", 1U) - , m_left_gun_recoil(*this, "Left_Gun_Recoil") - , m_right_gun_recoil(*this, "Right_Gun_Recoil") - , m_left_gun_green_led(*this, "Left_Gun_Green_Led") - , m_left_gun_red_led(*this, "Left_Gun_Red_Led") - , m_right_gun_green_led(*this, "Right_Gun_Green_Led") - , m_right_gun_red_led(*this, "Right_Gun_Red_Led") { } - void term2(machine_config &config); - void yunit_cvsd_4bit_fast(machine_config &config); void yunit_adpcm_6bit_fast(machine_config &config); - void yunit_cvsd_6bit_slow(machine_config &config); - void yunit_cvsd_4bit_slow(machine_config &config); - void mkyawdim(machine_config &config); + void yunit_adpcm_6bit_faster(machine_config &config); void yunit_core(machine_config &config); + void yunit_cvsd_4bit_fast(machine_config &config); + void yunit_cvsd_4bit_slow(machine_config &config); + void yunit_cvsd_6bit_slow(machine_config &config); void zunit(machine_config &config); - void yunit_adpcm_6bit_faster(machine_config &config); - void init_smashtv(); - void init_strkforc(); - void init_narc(); - void init_term2(); - void init_term2la1(); - void init_term2la3(); - void init_mkyunit(); - void init_trog(); - void init_totcarn(); - void init_mkyawdim(); - void init_mkyawdim2(); - void init_shimpact(); void init_hiimpact(); void init_mkla3bl(); void init_mkyturbo(); - void init_term2la2(); + void init_mkyunit(); + void init_narc(); + void init_shimpact(); + void init_smashtv(); + void init_strkforc(); + void init_totcarn(); + void init_trog(); int narc_talkback_strobe_r(); DECLARE_CUSTOM_INPUT_MEMBER(narc_talkback_data_r); int adpcm_irq_state_r(); protected: - virtual void machine_start() override; - -private: - /* protection data types */ + // protection data types struct protection_data { uint16_t reset_sequence[3]{}; @@ -106,28 +83,16 @@ class midyunit_state : public driver_device }; required_device m_maincpu; - optional_device m_audiocpu; - optional_device m_oki; required_device m_palette; optional_device m_narc_sound; optional_device m_cvsd_sound; optional_device m_adpcm_sound; - optional_device m_soundlatch; - optional_device m_term2_adc; required_device m_nvram; - required_shared_ptr m_generic_paletteram_16; + required_shared_ptr m_paletteram; memory_share_creator m_gfx_rom; required_shared_ptr m_mainram; optional_ioport_array<6> m_ports; - output_finder<4> m_left_flash; - output_finder<4> m_right_flash; - output_finder<> m_left_gun_recoil; - output_finder<> m_right_gun_recoil; - output_finder<> m_left_gun_green_led; - output_finder<> m_left_gun_red_led; - output_finder<> m_right_gun_green_led; - output_finder<> m_right_gun_red_led; std::unique_ptr m_cmos_ram; std::unique_ptr m_hidden_ram; @@ -138,7 +103,6 @@ class midyunit_state : public driver_device const struct protection_data *m_prot_data = nullptr; uint8_t m_cmos_w_enable = 0; uint8_t m_chip_type = 0; - uint16_t *m_t2_hack_mem = nullptr; uint8_t *m_cvsd_protection_base = nullptr; uint8_t m_autoerase_enable = 0; uint32_t m_palette_mask = 0; @@ -150,18 +114,13 @@ class midyunit_state : public driver_device dma_state_t m_dma_state; emu_timer *m_dma_timer = nullptr; emu_timer *m_autoerase_line_timer = nullptr; + void midyunit_cmos_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); uint16_t midyunit_cmos_r(offs_t offset); void midyunit_cmos_enable_w(address_space &space, uint16_t data); uint16_t midyunit_protection_r(); uint16_t midyunit_input_r(offs_t offset); void midyunit_sound_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint16_t term2_input_r(offs_t offset); - void term2_sound_w(offs_t offset, uint16_t data); - void term2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void term2la3_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void term2la2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void term2la1_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); void cvsd_protection_w(offs_t offset, uint8_t data); uint16_t mkturbo_prot_r(); uint16_t midyunit_gfxrom_r(offs_t offset); @@ -171,9 +130,6 @@ class midyunit_state : public driver_device void midyunit_paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); uint16_t midyunit_dma_r(offs_t offset); void midyunit_dma_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void yawdim_oki_bank_w(uint8_t data); - void yawdim2_oki_bank_w(uint8_t data); - uint8_t yawdim2_soundlatch_r(); TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg); TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg); TMS340X0_SCANLINE_IND16_CB_MEMBER(scanline_update); @@ -181,18 +137,100 @@ class midyunit_state : public driver_device DECLARE_VIDEO_START(midzunit); DECLARE_VIDEO_START(midyunit_4bit); DECLARE_VIDEO_START(midyunit_6bit); - DECLARE_VIDEO_START(mkyawdim); DECLARE_VIDEO_START(common); TIMER_CALLBACK_MEMBER(dma_callback); TIMER_CALLBACK_MEMBER(autoerase_line); void main_map(address_map &map); - void yawdim_sound_map(address_map &map); void dma_draw(uint16_t command); void init_generic(int bpp, int sound, int prot_start, int prot_end); void install_hidden_ram(mc6809e_device &cpu, int prot_start, int prot_end); +}; + +class term2_state : public midyunit_state +{ +public: + term2_state(const machine_config &mconfig, device_type type, const char *tag) + : midyunit_state(mconfig, type, tag) + , m_adc(*this, "adc") + , m_left_flash(*this, "Left_Flash_%u", 1U) + , m_right_flash(*this, "Right_Flash_%u", 1U) + , m_left_gun_recoil(*this, "Left_Gun_Recoil") + , m_right_gun_recoil(*this, "Right_Gun_Recoil") + , m_left_gun_green_led(*this, "Left_Gun_Green_Led") + , m_left_gun_red_led(*this, "Left_Gun_Red_Led") + , m_right_gun_green_led(*this, "Right_Gun_Green_Led") + , m_right_gun_red_led(*this, "Right_Gun_Red_Led") + { + } + + void term2(machine_config &config); + + void init_term2(); + void init_term2la1(); + void init_term2la2(); + void init_term2la3(); + +protected: + virtual void machine_start() override; + +private: + required_device m_adc; + + output_finder<4> m_left_flash; + output_finder<4> m_right_flash; + output_finder<> m_left_gun_recoil; + output_finder<> m_right_gun_recoil; + output_finder<> m_left_gun_green_led; + output_finder<> m_left_gun_red_led; + output_finder<> m_right_gun_green_led; + output_finder<> m_right_gun_red_led; + + uint16_t *m_t2_hack_mem = nullptr; + + uint16_t term2_input_r(offs_t offset); + void term2_sound_w(offs_t offset, uint16_t data); + void term2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void term2la3_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void term2la2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void term2la1_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); void term2_init_common(write16s_delegate hack_w); }; +class mkyawdim_state : public midyunit_state +{ +public: + mkyawdim_state(const machine_config &mconfig, device_type type, const char *tag) + : midyunit_state(mconfig, type, tag) + , m_audiocpu(*this, "audiocpu") + , m_soundlatch(*this, "soundlatch") + , m_oki(*this, "oki") + { + } + + void mkyawdim(machine_config &config); + void mkyawdim2(machine_config &config); + + void init_mkyawdim(); + +protected: + virtual void video_start() override; + +private: + required_device m_audiocpu; + optional_device m_soundlatch; + required_device m_oki; + + void yawdim_oki_bank_w(uint8_t data); + void yawdim2_oki_bank_w(uint8_t data); + void yawdim_sound_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void yawdim2_sound_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + void yawdim_main_map(address_map &map); + void yawdim2_main_map(address_map &map); + void yawdim_sound_map(address_map &map); + void yawdim2_sound_map(address_map &map); +}; + #endif // MAME_MIDWAY_MIDYUNIT_H diff --git a/src/mame/midway/midyunit_m.cpp b/src/mame/midway/midyunit_m.cpp index 685fc8f21f994..298dd881378fc 100644 --- a/src/mame/midway/midyunit_m.cpp +++ b/src/mame/midway/midyunit_m.cpp @@ -11,18 +11,31 @@ #include "cpu/m6809/m6809.h" #include "midyunit.h" +#define LOG_CMOS (1U << 1) +#define LOG_PROT (1U << 1) -/* constant definitions */ -#define SOUND_NARC 1 -#define SOUND_CVSD_SMALL 2 -#define SOUND_CVSD 3 -#define SOUND_ADPCM 4 -#define SOUND_YAWDIM 5 -#define SOUND_YAWDIM2 6 +#define LOG_ALL (LOG_CMOS | LOG_PROT) +#define VERBOSE (0) +#include "logmacro.h" -void midyunit_state::machine_start() +#define LOGCMOS(...) LOGMASKED(LOG_CMOS, __VA_ARGS__) +#define LOGPROT(...) LOGMASKED(LOG_PROT, __VA_ARGS__) + +// constant definitions +enum +{ + SOUND_NARC = 1, + SOUND_CVSD_SMALL, + SOUND_CVSD, + SOUND_ADPCM, + SOUND_YAWDIM +}; + +void term2_state::machine_start() { + midyunit_state::machine_start(); + m_left_flash.resolve(); m_right_flash.resolve(); m_left_gun_recoil.resolve(); @@ -41,7 +54,7 @@ void midyunit_state::machine_start() void midyunit_state::midyunit_cmos_w(offs_t offset, uint16_t data, uint16_t mem_mask) { - logerror("%08x:CMOS Write @ %05X\n", m_maincpu->pc(), offset); + LOGCMOS("%08x:CMOS Write @ %05X\n", m_maincpu->pc(), offset); COMBINE_DATA(&m_cmos_ram[offset + m_cmos_page]); } @@ -63,46 +76,46 @@ void midyunit_state::midyunit_cmos_enable_w(address_space &space, uint16_t data) { m_cmos_w_enable = (~data >> 9) & 1; - logerror("%08x:Protection write = %04X\n", m_maincpu->pc(), data); + LOGPROT("%08x:Protection write = %04X\n", m_maincpu->pc(), data); - /* only go down this path if we have a data structure */ + // only go down this path if we have a data structure if (m_prot_data) { - /* mask off the data */ + // mask off the data data &= 0x0f00; - /* update the FIFO */ + // update the FIFO m_prot_sequence[0] = m_prot_sequence[1]; m_prot_sequence[1] = m_prot_sequence[2]; m_prot_sequence[2] = data; - /* special case: sequence entry 1234 means Strike Force, which is different */ + // special case: sequence entry 1234 means Strike Force, which is different if (m_prot_data->reset_sequence[0] == 0x1234) { if (data == 0x500) { m_prot_result = space.read_word(0x10a4390) << 4; - logerror(" desired result = %04X\n", m_prot_result); + LOGPROT(" desired result = %04X\n", m_prot_result); } } - /* all other games use the same pattern */ + // all other games use the same pattern else { - /* look for a reset */ + // look for a reset if (m_prot_sequence[0] == m_prot_data->reset_sequence[0] && m_prot_sequence[1] == m_prot_data->reset_sequence[1] && m_prot_sequence[2] == m_prot_data->reset_sequence[2]) { - logerror("Protection reset\n"); + LOGPROT("Protection reset\n"); m_prot_index = 0; } - /* look for a clock */ + // look for a clock if ((m_prot_sequence[1] & 0x0800) != 0 && (m_prot_sequence[2] & 0x0800) == 0) { m_prot_result = m_prot_data->data_sequence[m_prot_index++]; - logerror("Protection clock (new data = %04X)\n", m_prot_result); + LOGPROT("Protection clock (new data = %04X)\n", m_prot_result); } } } @@ -111,8 +124,9 @@ void midyunit_state::midyunit_cmos_enable_w(address_space &space, uint16_t data) uint16_t midyunit_state::midyunit_protection_r() { - /* return the most recently clocked value */ - logerror("%08X:Protection read = %04X\n", m_maincpu->pc(), m_prot_result); + // return the most recently clocked value + if (!machine().side_effects_disabled()) + LOGPROT("%08X:Protection read = %04X\n", m_maincpu->pc(), m_prot_result); return m_prot_result; } @@ -137,17 +151,17 @@ uint16_t midyunit_state::midyunit_input_r(offs_t offset) * *************************************/ -uint16_t midyunit_state::term2_input_r(offs_t offset) +uint16_t term2_state::term2_input_r(offs_t offset) { if (offset != 2) return m_ports[offset]->read(); - return m_term2_adc->read() | 0xff00; + return m_adc->read() | 0xff00; } -void midyunit_state::term2_sound_w(offs_t offset, uint16_t data) +void term2_state::term2_sound_w(offs_t offset, uint16_t data) { - /* Flash Lamp Output Data */ + // Flash Lamp Output Data if ( ((data & 0x800) != 0x800) && ((data & 0x400) == 0x400 ) ) { for (int i = 0; i < 4; i++) @@ -156,7 +170,7 @@ void midyunit_state::term2_sound_w(offs_t offset, uint16_t data) m_right_flash[i] = BIT(data, i + 4); } - /* Gun Output Data */ + // Gun Output Data if ( ((data & 0x800) == 0x800) && ((data & 0x400) != 0x400 ) ) { m_left_gun_recoil = BIT(data, 0); @@ -168,7 +182,7 @@ void midyunit_state::term2_sound_w(offs_t offset, uint16_t data) } if (offset == 0) - m_term2_adc->write(((data >> 12) & 3) | 4); + m_adc->write(((data >> 12) & 3) | 4); m_adpcm_sound->reset_write((~data & 0x100) >> 1); m_adpcm_sound->write(data); @@ -182,7 +196,7 @@ void midyunit_state::term2_sound_w(offs_t offset, uint16_t data) * *************************************/ -void midyunit_state::term2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void term2_state::term2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask) { if (offset == 1 && m_maincpu->pc() == 0xffce6520) { @@ -192,7 +206,7 @@ void midyunit_state::term2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mas COMBINE_DATA(&m_t2_hack_mem[offset]); } -void midyunit_state::term2la3_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void term2_state::term2la3_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask) { if (offset == 0 && m_maincpu->pc() == 0xffce5230) { @@ -202,7 +216,7 @@ void midyunit_state::term2la3_hack_w(offs_t offset, uint16_t data, uint16_t mem_ COMBINE_DATA(&m_t2_hack_mem[offset]); } -void midyunit_state::term2la2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void term2_state::term2la2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask) { if (offset == 0 && m_maincpu->pc() == 0xffce4b80) { @@ -212,7 +226,7 @@ void midyunit_state::term2la2_hack_w(offs_t offset, uint16_t data, uint16_t mem_ COMBINE_DATA(&m_t2_hack_mem[offset]); } -void midyunit_state::term2la1_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void term2_state::term2la1_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask) { if (offset == 0 && m_maincpu->pc() == 0xffce33f0) { @@ -232,10 +246,10 @@ void midyunit_state::term2la1_hack_w(offs_t offset, uint16_t data, uint16_t mem_ void midyunit_state::cvsd_protection_w(offs_t offset, uint8_t data) { - /* because the entire CVSD ROM is banked, we have to make sure that writes */ - /* go to the proper location (i.e., bank 0); currently bank 0 always lives */ - /* in the 0x10000-0x17fff space, so we just need to add 0x8000 to get the */ - /* proper offset */ + // because the entire CVSD ROM is banked, we have to make sure that writes + // go to the proper location (i.e., bank 0); currently bank 0 always lives + // in the 0x10000-0x17fff space, so we just need to add 0x8000 to get the + // proper offset m_cvsd_protection_base[offset] = data; } @@ -249,16 +263,15 @@ void midyunit_state::install_hidden_ram(mc6809e_device &cpu, int prot_start, int void midyunit_state::init_generic(int bpp, int sound, int prot_start, int prot_end) { - offs_t gfx_chunk = m_gfx_rom.bytes() / 4; + offs_t const gfx_chunk = m_gfx_rom.bytes() / 4; uint8_t d1, d2, d3, d4, d5, d6; - int i; - /* load graphics ROMs */ - uint8_t *base = memregion("gfx1")->base(); + // load graphics ROMs + uint8_t const *const base = memregion("gfx")->base(); switch (bpp) { case 4: - for (i = 0; i < m_gfx_rom.bytes(); i += 2) + for (int i = 0; i < m_gfx_rom.bytes(); i += 2) { d1 = ((base[0 * gfx_chunk + (i + 0) / 4]) >> (2 * ((i + 0) % 4))) & 3; d2 = ((base[1 * gfx_chunk + (i + 0) / 4]) >> (2 * ((i + 0) % 4))) & 3; @@ -271,7 +284,7 @@ void midyunit_state::init_generic(int bpp, int sound, int prot_start, int prot_e break; case 6: - for (i = 0; i < m_gfx_rom.bytes(); i += 2) + for (int i = 0; i < m_gfx_rom.bytes(); i += 2) { d1 = ((base[0 * gfx_chunk + (i + 0) / 4]) >> (2 * ((i + 0) % 4))) & 3; d2 = ((base[1 * gfx_chunk + (i + 0) / 4]) >> (2 * ((i + 0) % 4))) & 3; @@ -286,7 +299,7 @@ void midyunit_state::init_generic(int bpp, int sound, int prot_start, int prot_e break; case 8: - for (i = 0; i < m_gfx_rom.bytes(); i += 4) + for (int i = 0; i < m_gfx_rom.bytes(); i += 4) { m_gfx_rom[i + 0] = base[0 * gfx_chunk + i / 4]; m_gfx_rom[i + 1] = base[1 * gfx_chunk + i / 4]; @@ -296,7 +309,7 @@ void midyunit_state::init_generic(int bpp, int sound, int prot_start, int prot_e break; } - /* load sound ROMs and set up sound handlers */ + // load sound ROMs and set up sound handlers m_chip_type = sound; switch (sound) { @@ -318,7 +331,6 @@ void midyunit_state::init_generic(int bpp, int sound, int prot_start, int prot_e break; case SOUND_YAWDIM: - case SOUND_YAWDIM2: break; } } @@ -336,7 +348,7 @@ void midyunit_state::init_generic(int bpp, int sound, int prot_start, int prot_e void midyunit_state::init_narc() { - /* common init */ + // common init init_generic(8, SOUND_NARC, 0xcdff, 0xce29); } @@ -355,7 +367,7 @@ void midyunit_state::init_narc() void midyunit_state::init_trog() { - /* protection */ + // protection static const struct protection_data trog_protection_data = { { 0x0f00, 0x0f00, 0x0f00 }, @@ -366,7 +378,7 @@ void midyunit_state::init_trog() }; m_prot_data = &trog_protection_data; - /* common init */ + // common init init_generic(4, SOUND_CVSD_SMALL, 0x9eaf, 0x9ed9); } @@ -375,7 +387,7 @@ void midyunit_state::init_trog() void midyunit_state::init_smashtv() { - /* common init */ + // common init init_generic(6, SOUND_CVSD_SMALL, 0x9cf6, 0x9d21); m_prot_data = nullptr; @@ -386,7 +398,7 @@ void midyunit_state::init_smashtv() void midyunit_state::init_hiimpact() { - /* protection */ + // protection static const struct protection_data hiimpact_protection_data = { { 0x0b00, 0x0b00, 0x0b00 }, @@ -395,7 +407,7 @@ void midyunit_state::init_hiimpact() }; m_prot_data = &hiimpact_protection_data; - /* common init */ + // common init init_generic(6, SOUND_CVSD, 0x9b79, 0x9ba3); } @@ -404,7 +416,7 @@ void midyunit_state::init_hiimpact() void midyunit_state::init_shimpact() { - /* protection */ + // protection static const struct protection_data shimpact_protection_data = { { 0x0f00, 0x0e00, 0x0d00 }, @@ -413,7 +425,7 @@ void midyunit_state::init_shimpact() }; m_prot_data = &shimpact_protection_data; - /* common init */ + // common init init_generic(6, SOUND_CVSD, 0x9c06, 0x9c15); } @@ -422,14 +434,14 @@ void midyunit_state::init_shimpact() void midyunit_state::init_strkforc() { - /* protection */ + // protection static const struct protection_data strkforc_protection_data = { { 0x1234 } }; m_prot_data = &strkforc_protection_data; - /* common init */ + // common init init_generic(4, SOUND_CVSD_SMALL, 0x9f7d, 0x9fa7); } @@ -448,7 +460,7 @@ void midyunit_state::init_strkforc() void midyunit_state::init_mkyunit() { - /* protection */ + // protection static const struct protection_data mk_protection_data = { { 0x0d00, 0x0c00, 0x0900 }, @@ -458,23 +470,16 @@ void midyunit_state::init_mkyunit() }; m_prot_data = &mk_protection_data; - /* common init */ + // common init init_generic(6, SOUND_ADPCM, 0xfb9c, 0xfbc6); } -void midyunit_state::init_mkyawdim() +void mkyawdim_state::init_mkyawdim() { - /* common init */ + // common init init_generic(6, SOUND_YAWDIM, 0, 0); } -void midyunit_state::init_mkyawdim2() -{ - m_audiocpu->space(AS_PROGRAM).install_write_handler(0x9000, 0x97ff, write8smo_delegate(*this, FUNC(midyunit_state::yawdim2_oki_bank_w))); - m_audiocpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xa7ff, read8smo_delegate(*this, FUNC(midyunit_state::yawdim2_soundlatch_r))); - init_mkyawdim(); -} - /************************************* * @@ -491,7 +496,7 @@ uint16_t midyunit_state::mkturbo_prot_r() void midyunit_state::init_mkyturbo() { - /* protection */ + // protection m_maincpu->space(AS_PROGRAM).install_read_handler(0xfffff400, 0xfffff40f, read16smo_delegate(*this, FUNC(midyunit_state::mkturbo_prot_r))); init_mkyunit(); @@ -500,7 +505,7 @@ void midyunit_state::init_mkyturbo() void midyunit_state::init_mkla3bl() { // rearrange GFX so the driver can deal with them - uint8_t *gfxrom = memregion("gfx1")->base(); + uint8_t *gfxrom = memregion("gfx")->base(); std::vector buffer(0x400000); memcpy(&buffer[0], gfxrom, 0x400000); @@ -523,7 +528,7 @@ void midyunit_state::init_mkla3bl() /********************** Terminator 2 **********************/ -void midyunit_state::term2_init_common(write16s_delegate hack_w) +void term2_state::term2_init_common(write16s_delegate hack_w) { // protection static constexpr struct protection_data term2_protection_data = @@ -536,9 +541,9 @@ void midyunit_state::term2_init_common(write16s_delegate hack_w) // common init init_generic(6, SOUND_ADPCM, 0xfa8d, 0xfa9c); - // special inputs */ - m_maincpu->space(AS_PROGRAM).install_read_handler(0x01c00000, 0x01c0005f, read16sm_delegate(*this, FUNC(midyunit_state::term2_input_r))); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x01e00000, 0x01e0001f, write16sm_delegate(*this, FUNC(midyunit_state::term2_sound_w))); + // special inputs + m_maincpu->space(AS_PROGRAM).install_read_handler(0x01c00000, 0x01c0005f, read16sm_delegate(*this, FUNC(term2_state::term2_input_r))); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x01e00000, 0x01e0001f, write16sm_delegate(*this, FUNC(term2_state::term2_sound_w))); // HACK: this prevents the freeze on the movies // until we figure what's causing it, this is better than nothing @@ -546,10 +551,10 @@ void midyunit_state::term2_init_common(write16s_delegate hack_w) m_t2_hack_mem = m_mainram + (0xaa0e0>>4); } -void midyunit_state::init_term2() { term2_init_common(write16s_delegate(*this, FUNC(midyunit_state::term2_hack_w))); } -void midyunit_state::init_term2la3() { term2_init_common(write16s_delegate(*this, FUNC(midyunit_state::term2la3_hack_w))); } -void midyunit_state::init_term2la2() { term2_init_common(write16s_delegate(*this, FUNC(midyunit_state::term2la2_hack_w))); } -void midyunit_state::init_term2la1() { term2_init_common(write16s_delegate(*this, FUNC(midyunit_state::term2la1_hack_w))); } +void term2_state::init_term2() { term2_init_common(write16s_delegate(*this, FUNC(term2_state::term2_hack_w))); } +void term2_state::init_term2la3() { term2_init_common(write16s_delegate(*this, FUNC(term2_state::term2la3_hack_w))); } +void term2_state::init_term2la2() { term2_init_common(write16s_delegate(*this, FUNC(term2_state::term2la2_hack_w))); } +void term2_state::init_term2la1() { term2_init_common(write16s_delegate(*this, FUNC(term2_state::term2la1_hack_w))); } @@ -557,7 +562,7 @@ void midyunit_state::init_term2la1() { term2_init_common(write16s_delegate(*this void midyunit_state::init_totcarn() { - /* protection */ + // protection static const struct protection_data totcarn_protection_data = { { 0x0f00, 0x0f00, 0x0f00 }, @@ -566,7 +571,7 @@ void midyunit_state::init_totcarn() }; m_prot_data = &totcarn_protection_data; - /* common init */ + // common init init_generic(6, SOUND_ADPCM, 0xfc04, 0xfc2e); } @@ -580,7 +585,7 @@ void midyunit_state::init_totcarn() MACHINE_RESET_MEMBER(midyunit_state,midyunit) { - /* reset sound */ + // reset sound switch (m_chip_type) { case SOUND_NARC: @@ -600,7 +605,6 @@ MACHINE_RESET_MEMBER(midyunit_state,midyunit) break; case SOUND_YAWDIM: - case SOUND_YAWDIM2: break; } } @@ -615,14 +619,14 @@ MACHINE_RESET_MEMBER(midyunit_state,midyunit) void midyunit_state::midyunit_sound_w(offs_t offset, uint16_t data, uint16_t mem_mask) { - /* check for out-of-bounds accesses */ + // check for out-of-bounds accesses if (offset) { logerror("%08X:Unexpected write to sound (hi) = %04X\n", m_maincpu->pc(), data); return; } - /* call through based on the sound type */ + // call through based on the sound type if (ACCESSING_BITS_0_7 && ACCESSING_BITS_8_15) switch (m_chip_type) { @@ -640,15 +644,24 @@ void midyunit_state::midyunit_sound_w(offs_t offset, uint16_t data, uint16_t mem m_adpcm_sound->reset_write((~data & 0x100) >> 8); m_adpcm_sound->write(data); break; + } +} - case SOUND_YAWDIM: - m_soundlatch->write(data); - m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); - break; +void mkyawdim_state::yawdim_sound_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + // call through based on the sound type + if (ACCESSING_BITS_0_7 && ACCESSING_BITS_8_15) + { + m_soundlatch->write(data); + m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); + } +} - case SOUND_YAWDIM2: - m_soundlatch->write(data); - m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); - break; - } +void mkyawdim_state::yawdim2_sound_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + // call through based on the sound type + if (ACCESSING_BITS_0_7 && ACCESSING_BITS_8_15) + { + m_soundlatch->write(data); + } } diff --git a/src/mame/midway/midyunit_v.cpp b/src/mame/midway/midyunit_v.cpp index 6bcd2d0739a4e..b31237b35142c 100644 --- a/src/mame/midway/midyunit_v.cpp +++ b/src/mame/midway/midyunit_v.cpp @@ -12,11 +12,11 @@ #include "screen.h" -/* compile-time options */ -#define LOG_DMA 0 /* DMAs are logged if the 'L' key is pressed */ +// compile-time options +#define LOG_DMA 0 // DMAs are logged if the 'L' key is pressed -/* constants for the DMA chip */ +// constants for the DMA chip enum { DMA_COMMAND = 0, @@ -41,7 +41,7 @@ enum VIDEO_START_MEMBER(midyunit_state,common) { - /* allocate memory */ + // allocate memory m_cmos_ram = std::make_unique((0x2000 * 4)/2); m_local_videoram = make_unique_clear(0x80000/2); m_pen_map = std::make_unique(65536); @@ -51,16 +51,16 @@ VIDEO_START_MEMBER(midyunit_state,common) m_dma_timer = timer_alloc(FUNC(midyunit_state::dma_callback), this); m_autoerase_line_timer = timer_alloc(FUNC(midyunit_state::autoerase_line), this); - /* reset all the globals */ + // reset all the globals m_cmos_page = 0; m_autoerase_enable = 0; m_yawdim_dma = 0; - /* reset DMA state */ + // reset DMA state memset(m_dma_register, 0, sizeof(m_dma_register)); m_dma_state = dma_state_t(); - /* register for state saving */ + // register for state saving save_item(NAME(m_autoerase_enable)); save_pointer(NAME(m_local_videoram), 0x80000/2); save_pointer(NAME(m_cmos_ram), (0x2000 * 4)/2); @@ -71,12 +71,10 @@ VIDEO_START_MEMBER(midyunit_state,common) VIDEO_START_MEMBER(midyunit_state,midyunit_4bit) { - int i; - VIDEO_START_CALL_MEMBER(common); - /* init for 4-bit */ - for (i = 0; i < 65536; i++) + // init for 4-bit + for (int i = 0; i < 65536; i++) m_pen_map[i] = ((i & 0xf000) >> 8) | (i & 0x000f); m_palette_mask = 0x00ff; } @@ -84,18 +82,16 @@ VIDEO_START_MEMBER(midyunit_state,midyunit_4bit) VIDEO_START_MEMBER(midyunit_state,midyunit_6bit) { - int i; - VIDEO_START_CALL_MEMBER(common); - /* init for 6-bit */ - for (i = 0; i < 65536; i++) + // init for 6-bit + for (int i = 0; i < 65536; i++) m_pen_map[i] = ((i & 0xc000) >> 8) | (i & 0x0f3f); m_palette_mask = 0x0fff; } -VIDEO_START_MEMBER(midyunit_state,mkyawdim) +void mkyawdim_state::video_start() { VIDEO_START_CALL_MEMBER(midyunit_6bit); m_yawdim_dma = 1; @@ -104,12 +100,10 @@ VIDEO_START_MEMBER(midyunit_state,mkyawdim) VIDEO_START_MEMBER(midyunit_state,midzunit) { - int i; - VIDEO_START_CALL_MEMBER(common); - /* init for 8-bit */ - for (i = 0; i < 65536; i++) + // init for 8-bit + for (int i = 0; i < 65536; i++) m_pen_map[i] = i & 0x1fff; m_palette_mask = 0x1fff; } @@ -234,13 +228,13 @@ void midyunit_state::midyunit_control_w(offs_t offset, uint16_t data, uint16_t m if (ACCESSING_BITS_0_7) { - /* CMOS page is bits 6-7 */ + // CMOS page is bits 6-7 m_cmos_page = ((data >> 6) & 3) * 0x1000; - /* video bank select is bit 5 */ + // video bank select is bit 5 m_videobank_select = (data >> 5) & 1; - /* handle autoerase disable (bit 4) */ + // handle autoerase disable (bit 4) m_autoerase_enable = ((data & 0x10) == 0); } } @@ -257,8 +251,8 @@ void midyunit_state::midyunit_paletteram_w(offs_t offset, uint16_t data, uint16_ { int newword; - COMBINE_DATA(&m_generic_paletteram_16[offset]); - newword = m_generic_paletteram_16[offset]; + COMBINE_DATA(&m_paletteram[offset]); + newword = m_paletteram[offset]; m_palette->set_pen_color(offset & m_palette_mask, pal5bit(newword >> 10), pal5bit(newword >> 5), pal5bit(newword >> 0)); } @@ -272,100 +266,98 @@ void midyunit_state::midyunit_paletteram_w(offs_t offset, uint16_t data, uint16_ void midyunit_state::dma_draw(uint16_t command) { - int dx = (command & 0x10) ? -1 : 1; - int height = m_dma_state.height; - int width = m_dma_state.width; - uint8_t *base = m_gfx_rom; + int const dx = (command & 0x10) ? -1 : 1; + int const height = m_dma_state.height; + int const width = m_dma_state.width; + uint8_t const *const base = m_gfx_rom; uint32_t offset = m_dma_state.offset >> 3; - uint16_t pal = m_dma_state.palette; - uint16_t color = pal | m_dma_state.color; - int x, y; + uint16_t const pal = m_dma_state.palette; + uint16_t const color = pal | m_dma_state.color; - /* we only need the low 4 bits of the command */ + // we only need the low 4 bits of the command command &= 0x0f; - /* loop over the height */ - for (y = 0; y < height; y++) + // loop over the height + for (int y = 0; y < height; y++) { int tx = m_dma_state.xpos; int ty = m_dma_state.ypos; uint32_t o = offset; - uint16_t *dest; - /* determine Y position */ + // determine Y position ty = (ty + y) & 0x1ff; offset += m_dma_state.rowbytes; - /* determine destination pointer */ - dest = &m_local_videoram[ty * 512]; + // determine destination pointer + uint16_t *dest = &m_local_videoram[ty * 512]; - /* check for overruns if they are relevant */ + // check for overruns if they are relevant if (o >= 0x06000000 && command < 0x0c) continue; - /* switch off the zero/non-zero options */ + // switch off the zero/non-zero options switch (command) { - case 0x00: /* draw nothing */ + case 0x00: // draw nothing break; - case 0x01: /* draw only 0 pixels */ - for (x = 0; x < width; x++, tx += dx) + case 0x01: // draw only 0 pixels + for (int x = 0; x < width; x++, tx += dx) if (base[o++] == 0) dest[tx] = pal; break; - case 0x02: /* draw only non-0 pixels */ - for (x = 0; x < width; x++, tx += dx) + case 0x02: // draw only non-0 pixels + for (int x = 0; x < width; x++, tx += dx) { - int pixel = base[o++]; + uint8_t const pixel = base[o++]; if (pixel != 0) dest[tx] = pal | pixel; } break; - case 0x03: /* draw all pixels */ - for (x = 0; x < width; x++, tx += dx) + case 0x03: // draw all pixels + for (int x = 0; x < width; x++, tx += dx) dest[tx] = pal | base[o++]; break; - case 0x04: /* color only 0 pixels */ - case 0x05: /* color only 0 pixels */ - for (x = 0; x < width; x++, tx += dx) + case 0x04: // color only 0 pixels + case 0x05: // color only 0 pixels + for (int x = 0; x < width; x++, tx += dx) if (base[o++] == 0) dest[tx] = color; break; - case 0x06: /* color only 0 pixels, copy the rest */ - case 0x07: /* color only 0 pixels, copy the rest */ - for (x = 0; x < width; x++, tx += dx) + case 0x06: // color only 0 pixels, copy the rest + case 0x07: // color only 0 pixels, copy the rest + for (int x = 0; x < width; x++, tx += dx) { - int pixel = base[o++]; + uint8_t const pixel = base[o++]; dest[tx] = (pixel == 0) ? color : (pal | pixel); } break; - case 0x08: /* color only non-0 pixels */ - case 0x0a: /* color only non-0 pixels */ - for (x = 0; x < width; x++, tx += dx) + case 0x08: // color only non-0 pixels + case 0x0a: // color only non-0 pixels + for (int x = 0; x < width; x++, tx += dx) if (base[o++] != 0) dest[tx] = color; break; - case 0x09: /* color only non-0 pixels, copy the rest */ - case 0x0b: /* color only non-0 pixels, copy the rest */ - for (x = 0; x < width; x++, tx += dx) + case 0x09: // color only non-0 pixels, copy the rest + case 0x0b: // color only non-0 pixels, copy the rest + for (int x = 0; x < width; x++, tx += dx) { - int pixel = base[o++]; + uint8_t const pixel = base[o++]; dest[tx] = (pixel != 0) ? color : (pal | pixel); } break; - case 0x0c: /* color all pixels */ - case 0x0d: /* color all pixels */ - case 0x0e: /* color all pixels */ - case 0x0f: /* color all pixels */ - for (x = 0; x < width; x++, tx += dx) + case 0x0c: // color all pixels + case 0x0d: // color all pixels + case 0x0e: // color all pixels + case 0x0f: // color all pixels + for (int x = 0; x < width; x++, tx += dx) dest[tx] = color; break; } @@ -382,7 +374,7 @@ void midyunit_state::dma_draw(uint16_t command) TIMER_CALLBACK_MEMBER(midyunit_state::dma_callback) { - m_dma_register[DMA_COMMAND] &= ~0x8000; /* tell the cpu we're done */ + m_dma_register[DMA_COMMAND] &= ~0x8000; // tell the cpu we're done m_maincpu->set_input_line(0, ASSERT_LINE); } @@ -434,14 +426,14 @@ uint16_t midyunit_state::midyunit_dma_r(offs_t offset) void midyunit_state::midyunit_dma_w(offs_t offset, uint16_t data, uint16_t mem_mask) { - /* blend with the current register contents */ + // blend with the current register contents COMBINE_DATA(&m_dma_register[offset]); - /* only writes to DMA_COMMAND actually cause actions */ + // only writes to DMA_COMMAND actually cause actions if (offset != DMA_COMMAND) return; - /* high bit triggers action */ + // high bit triggers action int const command = m_dma_register[DMA_COMMAND]; m_maincpu->set_input_line(0, CLEAR_LINE); if (!(command & 0x8000)) @@ -465,7 +457,7 @@ void midyunit_state::midyunit_dma_w(offs_t offset, uint16_t data, uint16_t mem_m auto profile = g_profiler.start(PROFILER_USER1); - /* fill in the basic data */ + // fill in the basic data m_dma_state.rowbytes = (int16_t)m_dma_register[DMA_ROWBYTES]; m_dma_state.xpos = (int16_t)m_dma_register[DMA_XSTART]; m_dma_state.ypos = (int16_t)m_dma_register[DMA_YSTART]; @@ -474,7 +466,7 @@ void midyunit_state::midyunit_dma_w(offs_t offset, uint16_t data, uint16_t mem_m m_dma_state.palette = m_dma_register[DMA_PALETTE] << 8; m_dma_state.color = m_dma_register[DMA_COLOR] & 0xff; - /* determine the offset and adjust the rowbytes */ + // determine the offset and adjust the rowbytes uint32_t gfxoffset = m_dma_register[DMA_OFFSETLO] | (m_dma_register[DMA_OFFSETHI] << 16); if (command & 0x10) { @@ -490,7 +482,7 @@ void midyunit_state::midyunit_dma_w(offs_t offset, uint16_t data, uint16_t mem_m else m_dma_state.rowbytes = (m_dma_state.rowbytes + m_dma_state.width + 3) & ~3; - /* apply Y clipping */ + // apply Y clipping if (m_dma_state.ypos < 0) { m_dma_state.height -= -m_dma_state.ypos; @@ -500,7 +492,7 @@ void midyunit_state::midyunit_dma_w(offs_t offset, uint16_t data, uint16_t mem_m if (m_dma_state.ypos + m_dma_state.height > 512) m_dma_state.height = 512 - m_dma_state.ypos; - /* apply X clipping */ + // apply X clipping if (!(command & 0x10)) { if (m_dma_state.xpos < 0) @@ -524,7 +516,7 @@ void midyunit_state::midyunit_dma_w(offs_t offset, uint16_t data, uint16_t mem_m m_dma_state.width = m_dma_state.xpos; } - /* determine the location and draw */ + // determine the location and draw if (gfxoffset < 0x02000000) gfxoffset += 0x02000000; { @@ -532,7 +524,7 @@ void midyunit_state::midyunit_dma_w(offs_t offset, uint16_t data, uint16_t mem_m dma_draw(command); } - /* signal we're done */ + // signal we're done m_dma_timer->adjust(attotime::from_nsec(41 * m_dma_state.width * m_dma_state.height)); } @@ -559,15 +551,15 @@ TMS340X0_SCANLINE_IND16_CB_MEMBER(midyunit_state::scanline_update) uint16_t *const dest = &bitmap.pix(scanline); int coladdr = params->coladdr << 1; - /* adjust the display address to account for ignored bits */ + // adjust the display address to account for ignored bits for (int x = params->heblnk; x < params->hsblnk; x++) dest[x] = m_pen_map[src[coladdr++ & 0x1ff]]; - /* handle autoerase on the previous line */ + // handle autoerase on the previous line autoerase_line(params->rowaddr - 1); - /* if this is the last update of the screen, set a timer to clear out the final line */ - /* (since we update one behind) */ + // if this is the last update of the screen, set a timer to clear out the final line + // (since we update one behind) if (scanline == screen.visible_area().max_y) m_autoerase_line_timer->adjust(screen.time_until_pos(scanline + 1), params->rowaddr); } From 34f958cbd23406e404f1f96e160a093fbb0539cc Mon Sep 17 00:00:00 2001 From: tim lindner Date: Sun, 14 Apr 2024 09:42:17 -0700 Subject: [PATCH 101/109] trs/coco.cpp: Fix light gun offset (#12242) --- src/mame/trs/coco.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/trs/coco.cpp b/src/mame/trs/coco.cpp index 316af7eb0ecac..519109c4a2cf9 100644 --- a/src/mame/trs/coco.cpp +++ b/src/mame/trs/coco.cpp @@ -863,7 +863,7 @@ void coco_state::diecom_lightgun_clock() /* while in full state 15, prepare to check next video frame for a hit */ if (m_dclg_state == 15) { - int dclg_vpos = m_diecom_lightgun.input(sel2() ? 1 : 0, 1) - 12; + int dclg_vpos = m_diecom_lightgun.input(sel2() ? 1 : 0, 1) + 12; m_dclg_timer = m_diecom_lightgun.input(sel2() ? 1 : 0, 0); int horizontal_pixel = ((m_dclg_timer - 105.) / (420. - 110.0)) * (639.0 - 0.0) + 0.0; attotime dclg_time = m_screen->time_until_pos(dclg_vpos, horizontal_pixel); From 65b5718e0c0c9d37d83864e169dd67734f6ee7ee Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Mon, 15 Apr 2024 03:51:12 +1000 Subject: [PATCH 102/109] midway/williams.cpp, midway/wmg.cpp: Fixed crash in Defender, further cleanup. * midway/williams.cpp: Fixed Defender crash on initialised view. * midway/williams.cpp, midway/wmg.cpp: Eliminated address_map_bank_device. * midway/williams.cpp: Got rid of unnecessary williams2_state derived classes. * midway/wmg.cpp: Removed dependency on defender_state. --- src/mame/midway/williams.cpp | 44 ++++++++++---------- src/mame/midway/williams.h | 76 ++++++++++++---------------------- src/mame/midway/williams_m.cpp | 5 ++- src/mame/midway/wmg.cpp | 69 +++++++++++++++--------------- 4 files changed, 87 insertions(+), 107 deletions(-) diff --git a/src/mame/midway/williams.cpp b/src/mame/midway/williams.cpp index a95cfb663d60c..1ee2a9aad9175 100644 --- a/src/mame/midway/williams.cpp +++ b/src/mame/midway/williams.cpp @@ -511,24 +511,27 @@ Reference videos: https://www.youtube.com/watch?v=R5OeC6Wc_yI void defender_state::main_map(address_map &map) { map(0x0000, 0xbfff).ram().share(m_videoram); - map(0xc000, 0xcfff).m(m_bankc000, FUNC(address_map_bank_device::amap8)); + map(0xc000, 0xcfff).view(m_rom_view); + m_rom_view[0](0xc000, 0xc00f).mirror(0x03e0).writeonly().share(m_paletteram); + m_rom_view[0](0xc3ff, 0xc3ff).w(FUNC(defender_state::watchdog_reset_w)); + m_rom_view[0](0xc010, 0xc01f).mirror(0x03e0).w(FUNC(defender_state::video_control_w)); + m_rom_view[0](0xc400, 0xc4ff).mirror(0x0300).ram().w(FUNC(defender_state::cmos_w)).share("nvram"); + m_rom_view[0](0xc800, 0xcbff).r(FUNC(defender_state::video_counter_r)); + m_rom_view[0](0xcc00, 0xcc03).mirror(0x03e0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + m_rom_view[0](0xcc04, 0xcc07).mirror(0x03e0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + m_rom_view[1](0xc000, 0xcfff).rom().region("maincpu", 0x10000); + m_rom_view[2](0xc000, 0xcfff).rom().region("maincpu", 0x11000); + m_rom_view[3](0xc000, 0xcfff).rom().region("maincpu", 0x12000); + m_rom_view[4](0xc000, 0xcfff).rom().region("maincpu", 0x13000); + m_rom_view[5](0xc000, 0xcfff).rom().region("maincpu", 0x14000); + m_rom_view[6](0xc000, 0xcfff).rom().region("maincpu", 0x15000); + m_rom_view[7](0xc000, 0xcfff).rom().region("maincpu", 0x16000); + m_rom_view[8](0xc000, 0xcfff).rom().region("maincpu", 0x17000); + m_rom_view[9](0xc000, 0xcfff).rom().region("maincpu", 0x18000); map(0xd000, 0xdfff).w(FUNC(defender_state::bank_select_w)); map(0xd000, 0xffff).rom(); } -void defender_state::bankc000_map(address_map &map) -{ - map(0x0000, 0x000f).mirror(0x03e0).writeonly().share(m_paletteram); - map(0x03ff, 0x03ff).w(FUNC(defender_state::watchdog_reset_w)); - map(0x0010, 0x001f).mirror(0x03e0).w(FUNC(defender_state::video_control_w)); - map(0x0400, 0x04ff).mirror(0x0300).ram().w(FUNC(defender_state::cmos_w)).share("nvram"); - map(0x0800, 0x0bff).r(FUNC(defender_state::video_counter_r)); - map(0x0c00, 0x0c03).mirror(0x03e0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); - map(0x0c04, 0x0c07).mirror(0x03e0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); - map(0x1000, 0x9fff).rom().region("maincpu", 0x10000); - map(0xa000, 0xffff).noprw(); -} - /************************************* * * Mayday memory handlers @@ -661,7 +664,7 @@ void williams2_state::common_map(address_map &map) } // mysticm and inferno: D000-DFFF is RAM -void williams_d000_ram_state::d000_map(address_map &map) +void williams2_state::d000_ram_map(address_map &map) { common_map(map); map(0xd000, 0xdfff).ram(); @@ -669,7 +672,7 @@ void williams_d000_ram_state::d000_map(address_map &map) } // tshoot and joust2: D000-DFFF is ROM -void williams_d000_rom_state::d000_map(address_map &map) +void williams2_state::d000_rom_map(address_map &map) { common_map(map); map(0xd000, 0xffff).rom(); @@ -1619,7 +1622,6 @@ void defender_state::defender(machine_config &config) { williams_b0(config); - ADDRESS_MAP_BANK(config, m_bankc000).set_map(&defender_state::bankc000_map).set_options(ENDIANNESS_BIG, 8, 16, 0x1000); m_screen->set_visarea(12, 304-1, 7, 247-1); } @@ -1870,7 +1872,7 @@ void williams2_state::williams2_base(machine_config &config) void inferno_state::inferno(machine_config &config) { williams2_base(config); - m_maincpu->set_addrmap(AS_PROGRAM, &inferno_state::d000_map); + m_maincpu->set_addrmap(AS_PROGRAM, &inferno_state::d000_ram_map); // pia m_pia[0]->readpa_handler().set("mux", FUNC(ls157_x2_device::output_r)); @@ -1886,7 +1888,7 @@ void inferno_state::inferno(machine_config &config) void mysticm_state::mysticm(machine_config &config) { williams2_base(config); - m_maincpu->set_addrmap(AS_PROGRAM, &mysticm_state::d000_map); + m_maincpu->set_addrmap(AS_PROGRAM, &mysticm_state::d000_ram_map); m_screen->set_raw(MASTER_CLOCK*2/3, 512, 8, 284, 256, 8, 248); m_screen->set_screen_update(FUNC(mysticm_state::screen_update)); @@ -1904,7 +1906,7 @@ void tshoot_state::tshoot(machine_config &config) williams2_base(config); // basic machine hardware - m_maincpu->set_addrmap(AS_PROGRAM, &tshoot_state::d000_map); + m_maincpu->set_addrmap(AS_PROGRAM, &tshoot_state::d000_rom_map); // pia m_pia[0]->readpa_handler().set("mux", FUNC(ls157_x2_device::output_r)); @@ -1928,7 +1930,7 @@ void joust2_state::joust2(machine_config &config) williams2_base(config); // basic machine hardware - m_maincpu->set_addrmap(AS_PROGRAM, &joust2_state::d000_map); + m_maincpu->set_addrmap(AS_PROGRAM, &joust2_state::d000_rom_map); S11_OBG(config, m_bg).add_route(ALL_OUTPUTS, "speaker", 2.0); // D-11298-3035 'pinbot style' older BG sound board // Jumpers for the board: W1=? W2=open W3=present W4=open W5=open W6=open W7=present diff --git a/src/mame/midway/williams.h b/src/mame/midway/williams.h index a62e3a6afa110..53585307537d1 100644 --- a/src/mame/midway/williams.h +++ b/src/mame/midway/williams.h @@ -17,7 +17,6 @@ #include "cpu/m6809/m6809.h" #include "machine/6821pia.h" #include "machine/74157.h" -#include "machine/bankdev.h" #include "machine/ticket.h" #include "machine/timer.h" #include "machine/watchdog.h" @@ -42,7 +41,6 @@ class williams_state : public driver_device m_pia(*this, "pia_%u", 0U), m_nvram(*this, "nvram"), m_videoram(*this, "videoram"), - m_mainbank(*this, "mainbank"), m_rom_view(*this, "rom_view"), m_49way_x(*this, "49WAYX"), m_49way_y(*this, "49WAYY") @@ -100,7 +98,6 @@ class williams_state : public driver_device required_shared_ptr m_nvram; required_shared_ptr m_videoram; - optional_memory_bank m_mainbank; memory_view m_rom_view; @@ -140,8 +137,7 @@ class defender_state : public williams_state { public: defender_state(const machine_config &mconfig, device_type type, const char *tag) : - williams_state(mconfig, type, tag), - m_bankc000(*this, "bankc000") + williams_state(mconfig, type, tag) { } void defender(machine_config &config); @@ -155,13 +151,9 @@ class defender_state : public williams_state void video_control_w(u8 data); - required_device m_bankc000; - private: - virtual void machine_start() override { } virtual void machine_reset() override; - void bankc000_map(address_map &map); virtual void sound_map(address_map &map) override; virtual void sound_map_6802(address_map &map); @@ -285,7 +277,8 @@ class blaster_state : public williams_state blaster_state(const machine_config &mconfig, device_type type, const char *tag) : williams_state(mconfig, type, tag), m_muxa(*this, "mux_a"), - m_muxb(*this, "mux_b") + m_muxb(*this, "mux_b"), + m_mainbank(*this, "mainbank") { } void blastkit(machine_config &config); @@ -299,6 +292,7 @@ class blaster_state : public williams_state private: required_device m_muxa; optional_device m_muxb; + required_memory_bank m_mainbank; rgb_t m_color0; uint8_t m_video_control; @@ -319,10 +313,21 @@ class blaster_state : public williams_state class williams2_state : public williams_state { public: + INPUT_CHANGED_MEMBER(rgb_gain) + { + if (param < 3) + m_gain[param] = float(newval) / 100.0f; + else + m_offset[param - 3] = (float(newval) / 100.0f) - 1.0f; + rebuild_palette(); + } + +protected: williams2_state(const machine_config &mconfig, device_type type, const char *tag) : williams_state(mconfig, type, tag), m_gfxdecode(*this, "gfxdecode"), m_tileram(*this, "tileram"), + m_mainbank(*this, "mainbank"), m_palette_view(*this, "palette_view"), m_gain( { 0.25f, 0.25f, 0.25f }), m_offset({ 0.00f, 0.00f, 0.00f }) @@ -330,22 +335,13 @@ class williams2_state : public williams_state void williams2_base(machine_config &config); - INPUT_CHANGED_MEMBER(rgb_gain) - { - if (param < 3) - m_gain[param] = float(newval) / 100.0f; - else - m_offset[param - 3] = (float(newval) / 100.0f) - 1.0f; - rebuild_palette(); - } - -protected: virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; required_device m_gfxdecode; required_shared_ptr m_tileram; + required_memory_bank m_mainbank; memory_view m_palette_view; @@ -379,39 +375,19 @@ class williams2_state : public williams_state virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; void common_map(address_map &map); + void d000_rom_map(address_map &map); + void d000_ram_map(address_map &map); virtual void sound_map(address_map &map) override; void video_control_w(u8 data); }; -class williams_d000_rom_state : public williams2_state -{ -public: - williams_d000_rom_state(const machine_config &mconfig, device_type type, const char *tag) : - williams2_state(mconfig, type, tag) - { } - -protected: - void d000_map(address_map &map); -}; - -class williams_d000_ram_state : public williams2_state -{ -public: - williams_d000_ram_state(const machine_config &mconfig, device_type type, const char *tag) : - williams2_state(mconfig, type, tag) - { } - -protected: - void d000_map(address_map &map); -}; - // Inferno -class inferno_state : public williams_d000_ram_state +class inferno_state : public williams2_state { public: inferno_state(const machine_config &mconfig, device_type type, const char *tag) : - williams_d000_ram_state(mconfig, type, tag), + williams2_state(mconfig, type, tag), m_mux(*this, "mux") { } @@ -422,11 +398,11 @@ class inferno_state : public williams_d000_ram_state }; // Mystic Marathon -class mysticm_state : public williams_d000_ram_state +class mysticm_state : public williams2_state { public: mysticm_state(const machine_config &mconfig, device_type type, const char *tag) : - williams_d000_ram_state(mconfig, type, tag) + williams2_state(mconfig, type, tag) { // overwrite defaults for mysticm m_gain = { 0.8f, 0.73f, 0.81f }; @@ -448,11 +424,11 @@ class mysticm_state : public williams_d000_ram_state }; // Turkey Shoot -class tshoot_state : public williams_d000_rom_state +class tshoot_state : public williams2_state { public: tshoot_state(const machine_config &mconfig, device_type type, const char *tag) : - williams_d000_rom_state(mconfig, type, tag), + williams2_state(mconfig, type, tag), m_mux(*this, "mux"), m_gun(*this, {"GUNX", "GUNY"}), m_grenade_lamp(*this, "Grenade_lamp"), @@ -480,11 +456,11 @@ class tshoot_state : public williams_d000_rom_state }; // Joust 2 -class joust2_state : public williams_d000_rom_state +class joust2_state : public williams2_state { public: joust2_state(const machine_config &mconfig, device_type type, const char *tag) : - williams_d000_rom_state(mconfig, type, tag), + williams2_state(mconfig, type, tag), m_mux(*this, "mux"), m_bg(*this, "bg") { } diff --git a/src/mame/midway/williams_m.cpp b/src/mame/midway/williams_m.cpp index 1428be448aad7..6e5bb62dbc6a6 100644 --- a/src/mame/midway/williams_m.cpp +++ b/src/mame/midway/williams_m.cpp @@ -327,7 +327,10 @@ void defender_state::video_control_w(u8 data) void defender_state::bank_select_w(u8 data) { - m_bankc000->set_bank(data & 0x0f); + if ((data & 0x0f) < 10) + m_rom_view.select(data & 0x0f); + else + m_rom_view.disable(); } diff --git a/src/mame/midway/wmg.cpp b/src/mame/midway/wmg.cpp index e2803245dfc53..a5f35e9823d7b 100644 --- a/src/mame/midway/wmg.cpp +++ b/src/mame/midway/wmg.cpp @@ -81,15 +81,17 @@ of save-state is also needed. namespace { -class wmg_state : public defender_state +class wmg_state : public williams_state { public: wmg_state(const machine_config &mconfig, device_type type, const char *tag) - : defender_state(mconfig, type, tag) - , m_p_ram(*this, "nvram") + : williams_state(mconfig, type, tag) + , m_p_ram(*this, "nvram", 0x2000, ENDIANNESS_BIG) , m_keyboard(*this, "X%d", 0U) + , m_mainbank(*this, "mainbank") , m_codebank(*this, "codebank") , m_soundbank(*this, "soundbank") + , m_io_view(*this, "io_view") { } void wmg(machine_config &config); @@ -101,10 +103,12 @@ class wmg_state : public defender_state virtual void machine_reset() override; private: - required_shared_ptr m_p_ram; + memory_share_creator m_p_ram; required_ioport_array<17> m_keyboard; + required_memory_bank m_mainbank; required_memory_bank m_codebank; required_memory_bank m_soundbank; + memory_view m_io_view; uint8_t m_wmg_c400 = 0U; uint8_t m_wmg_d000 = 0U; @@ -123,7 +127,6 @@ class wmg_state : public defender_state void wmg_cpu1(address_map &map); void wmg_cpu2(address_map &map); void wmg_banked_map(address_map &map); - }; @@ -138,7 +141,22 @@ void wmg_state::wmg_cpu1(address_map &map) map(0x0000, 0xbfff).ram().share(m_videoram); map(0x0000, 0x8fff).view(m_rom_view); m_rom_view[0](0x0000, 0x8fff).bankr(m_mainbank); - map(0xc000, 0xcfff).m(m_bankc000, FUNC(address_map_bank_device::amap8)); + map(0xc000, 0xcfff).view(m_io_view); + m_io_view[0](0xc000, 0xc00f).mirror(0x03e0).writeonly().share(m_paletteram); + m_io_view[0](0xc010, 0xc01f).mirror(0x03e0).lw8(NAME([this] (u8 data) { m_cocktail = BIT(data, 0); })); // TODO: should this really be here? m_cocktail is set in wmg_vram_select_w + m_io_view[0](0xc400, 0xc400).w(FUNC(wmg_state::wmg_c400_w)); + m_io_view[0](0xc401, 0xc401).w(FUNC(wmg_state::wmg_sound_reset_w)); + m_io_view[0](0xc804, 0xc807).r(FUNC(wmg_state::wmg_pia_0_r)).w(m_pia[0], FUNC(pia6821_device::write)); + m_io_view[0](0xc80c, 0xc80f).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + m_io_view[0](0xc900, 0xc9ff).nopr().w(FUNC(wmg_state::wmg_vram_select_w)); + m_io_view[0](0xca00, 0xca07).w(FUNC(wmg_state::wmg_blitter_w)); + m_io_view[0](0xcb00, 0xcbff).r(FUNC(wmg_state::video_counter_r)); + m_io_view[0](0xcbff, 0xcbff).w(FUNC(wmg_state::watchdog_reset_w)); + m_io_view[0](0xcc00, 0xcfff).rw(FUNC(wmg_state::wmg_nvram_r), FUNC(wmg_state::wmg_nvram_w)); + m_io_view[1](0xc000, 0xcfff).rom().region("maincpu", 0x58000); // Defender ROMs + m_io_view[2](0xc000, 0xcfff).rom().region("maincpu", 0x59000); + m_io_view[3](0xc000, 0xcfff).rom().region("maincpu", 0x5a000); + m_io_view[4](0xc000, 0xcfff).rom().region("maincpu", 0x5b000); map(0xd000, 0xffff).bankr(m_codebank); map(0xd000, 0xd000).w(FUNC(wmg_state::wmg_d000_w)); } @@ -151,24 +169,6 @@ void wmg_state::wmg_cpu2(address_map &map) map(0xf000, 0xffff).bankr(m_soundbank); } -void wmg_state::wmg_banked_map(address_map &map) -{ - map(0x0000, 0x000f).mirror(0x03e0).writeonly().share(m_paletteram); - map(0x0010, 0x001f).mirror(0x03e0).w(FUNC(wmg_state::video_control_w)); - map(0x0400, 0x0400).w(FUNC(wmg_state::wmg_c400_w)); - map(0x0401, 0x0401).w(FUNC(wmg_state::wmg_sound_reset_w)); - map(0x0804, 0x0807).r(FUNC(wmg_state::wmg_pia_0_r)).w(m_pia[0], FUNC(pia6821_device::write)); - map(0x080c, 0x080f).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); - map(0x0900, 0x09ff).nopr().w(FUNC(wmg_state::wmg_vram_select_w)); - map(0x0a00, 0x0a07).w(FUNC(wmg_state::wmg_blitter_w)); - map(0x0b00, 0x0bff).r(FUNC(wmg_state::video_counter_r)); - map(0x0bff, 0x0bff).w(FUNC(wmg_state::watchdog_reset_w)); - map(0x0c00, 0x0fff).rw(FUNC(wmg_state::wmg_nvram_r), FUNC(wmg_state::wmg_nvram_w)); - map(0x1000, 0x4fff).rom().region("maincpu", 0x58000); // Defender roms - // This one is actually banked in CPU 1, but its not something Mame can handle very well. Placed here instead. - map(0xd000, 0xefff).ram().share("nvram"); -} - /*************************************************************** * * Inputs, banked. One set for each game. @@ -407,23 +407,21 @@ void wmg_state::wmg_d000_w(u8 data) case 1: case 2: case 3: - m_bankc000->set_bank(data); + m_io_view.select(data); break; case 7: - m_bankc000->set_bank(4); + m_io_view.select(4); break; default: - printf("Unknown bank %X selected\n",data); + logerror("Unknown bank %X selected\n",data); } } - else - // everything else - choose i/o space - if (data == 0) + else if (data == 0) { - /* install the i/o devices into c000-cfff */ - m_bankc000->set_bank(0); + // everything else - choose i/o space + m_io_view.select(0); } m_wmg_d000 = data; @@ -432,6 +430,8 @@ void wmg_state::wmg_d000_w(u8 data) void wmg_state::machine_start() { + williams_state::machine_start(); + uint8_t *cpu = memregion("maincpu")->base(); uint8_t *snd = memregion("soundcpu")->base(); m_mainbank->configure_entries(0, 8, &cpu[0x00000], 0x10000); // Gfx etc @@ -445,10 +445,11 @@ void wmg_state::machine_start() void wmg_state::machine_reset() { + williams_state::machine_reset(); + m_wmg_c400 = 0xff; m_wmg_d000 = 0xff; m_port_select = 0; - m_rom_view.disable(); wmg_c400_w(0); m_maincpu->reset(); } @@ -519,8 +520,6 @@ void wmg_state::wmg(machine_config &config) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - ADDRESS_MAP_BANK(config, m_bankc000).set_map(&wmg_state::wmg_banked_map).set_options(ENDIANNESS_BIG, 8, 16, 0x1000); - // set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen TIMER(config, "scan_timer").configure_scanline(FUNC(wmg_state::va11_callback), "screen", 0, 32); From e5839a29efbc070e8ea03cee5d80469a749f1e30 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Mon, 15 Apr 2024 02:26:18 +0200 Subject: [PATCH 103/109] funworld/4roses.cpp improvements: * Hooked both PIAs 6821 for I/O. * Tied basic input lines. * Added/fixed documentation and notes. * Some cleanups. --- src/mame/funworld/4roses.cpp | 109 +++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 50 deletions(-) diff --git a/src/mame/funworld/4roses.cpp b/src/mame/funworld/4roses.cpp index bf31dec34450e..9c9f0493c1152 100644 --- a/src/mame/funworld/4roses.cpp +++ b/src/mame/funworld/4roses.cpp @@ -29,6 +29,7 @@ 1x M27C512 (4.10). PLDs: 1x PALCE22V10H (read protected) + 2x MACH210-15JC-18JI EEPLDs Clock: 1x 16MHz Crystal. @@ -43,10 +44,15 @@ GENERAL NOTES: - The game is based on Funworld/Tab/CMC games, but the hardware is completely different. - It has more complex improvements (encryption, MCU, banks, etc...) + It has more complex improvements (encryption, MCU, banks, etc...) + - The program ROM is encrypted. + - The color palettes are stored in a normal ROM. + - The code initializes a couple of inexistent PIAs 6821 that handle the I/O, so surely + these are emulated/simulated. However, set Rugby has both physical PIAs in the PCB. + *********************************************************************************** @@ -54,7 +60,23 @@ Memory Map ---------- - $0000 - $7FFF Still unknown... + $0000 - $07FF NVRAM + + $0800 - $0803 PIA 6821 #0 (rugby, simulated in 4roses) + $0A00 - $0A03 PIA 6821 #1 (rugby, simulated in 4roses) + + $0C00 - $0C00 AY-8910 data R + $0C01 - $0C01 AY-8910 data & address W + + $0E00 - $0E00 CRTC 6845 address + $0E01 - $0E01 CRTC 6845 register + + $4000 - $4FFF Video RAM (4roses). + $5000 - $5FFF Color/attr RAM (4roses). + + $6000 - $6FFF Video RAM (rugby). + $7000 - $7FFF Color/attr RAM (rugby). + $8000 - $FFFF ROM Space. @@ -160,13 +182,11 @@ *** TO DO *** - - Decrypt the program ROMs. - - Fix memory map. - Fix GFX decode. - Fix color decode routines. - Proper inputs. - MCU simulation. - - Dump/decap the MCU. + - Decap/dump the MCUs. ***********************************************************************************/ @@ -176,6 +196,7 @@ #include "funworld.h" #include "cpu/m6502/m65c02.h" +#include "machine/6821pia.h" #include "machine/nvram.h" #include "sound/ay8910.h" #include "video/mc6845.h" @@ -228,6 +249,7 @@ class rugby_state : public _4roses_state void rugby_opcodes_map(address_map &map); }; + /********************** * Read/Write Handlers * **********************/ @@ -241,6 +263,8 @@ class rugby_state : public _4roses_state void _4roses_state::_4roses_map(address_map &map) { map(0x0000, 0x07ff).ram(); // .share("nvram"); + map(0x0800, 0x0803).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // non existent in the hardware, but initialized and operated. + map(0x0a00, 0x0a03).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // non existent in the hardware, but initialized and operated. map(0x0c00, 0x0c00).r("ay8910", FUNC(ay8910_device::data_r)); map(0x0c00, 0x0c01).w("ay8910", FUNC(ay8910_device::address_data_w)); map(0x0e00, 0x0e00).w("crtc", FUNC(mc6845_device::address_w)); @@ -290,9 +314,12 @@ void _4roses_state::_4roses_opcodes_map(address_map &map) map(0x8000, 0xffff).rom().region("maincpu", 0x8000); } + void rugby_state::rugby_map(address_map &map) { map(0x0000, 0x07ff).ram(); // .share("nvram"); + map(0x0800, 0x0803).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x0a00, 0x0a03).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0x0c00, 0x0c00).r("ay8910", FUNC(ay8910_device::data_r)); map(0x0c00, 0x0c01).w("ay8910", FUNC(ay8910_device::address_data_w)); map(0x0e00, 0x0e00).w("crtc", FUNC(mc6845_device::address_w)); @@ -394,32 +421,6 @@ static INPUT_PORTS_START( 4roses ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("SW2") /* this bank is x4 DIP switches */ - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -429,14 +430,14 @@ INPUT_PORTS_END static const gfx_layout charlayout = { -/* WRONG... Must be changed */ +// WRONG... Must be changed 4, 8, -// 0x1000, - RGN_FRAC(1,2), + 0x1000, +// RGN_FRAC(1,2), 4, -// { 0, 4, 0x8000*8, 0x8000*8+4 }, - { RGN_FRAC(0,2), RGN_FRAC(0,2) + 4, RGN_FRAC(1,2), RGN_FRAC(1,2) + 4 }, + { 0, 4, 0x8000*8, 0x8000*8+4 }, +// { RGN_FRAC(0,2), RGN_FRAC(0,2) + 4, RGN_FRAC(1,2), RGN_FRAC(1,2) + 4 }, { 3, 2, 1, 0 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, 8*4*2 @@ -458,36 +459,44 @@ GFXDECODE_END void _4roses_state::_4roses(machine_config &config) { - /* basic machine hardware */ - M65C02(config, m_maincpu, MASTER_CLOCK/8); /* 2MHz, guess */ + // basic machine hardware + M65C02(config, m_maincpu, MASTER_CLOCK/8); // 2MHz, guess m_maincpu->set_addrmap(AS_PROGRAM, &_4roses_state::_4roses_map); m_maincpu->set_addrmap(AS_OPCODES, &_4roses_state::_4roses_opcodes_map); // NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - /* video hardware */ + pia6821_device &pia0(PIA6821(config, "pia0")); + pia0.readpa_handler().set_ioport("IN0"); + pia0.readpb_handler().set_ioport("IN1"); + + pia6821_device &pia1(PIA6821(config, "pia1")); + pia1.readpa_handler().set_ioport("IN2"); + pia1.readpb_handler().set_ioport("SW1"); + + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size((124+1)*4, (30+1)*8); /* guess. taken from funworld games */ - screen.set_visarea(0*4, 96*4-1, 0*8, 29*8-1); /* guess. taken from funworld games */ + screen.set_size((124+1)*4, (30+1)*8); // guess. taken from funworld games + screen.set_visarea(0*4, 96*4-1, 0*8, 29*8-1); // guess. taken from funworld games screen.set_screen_update(FUNC(_4roses_state::screen_update_funworld)); GFXDECODE(config, m_gfxdecode, "palette", gfx_4roses); PALETTE(config, "palette", FUNC(_4roses_state::funworld_palette), 0x1000); - mc6845_device &crtc(MC6845(config, "crtc", MASTER_CLOCK/8)); /* 2MHz, guess */ + mc6845_device &crtc(MC6845(config, "crtc", MASTER_CLOCK/8)); // 2MHz, guess crtc.set_screen("screen"); crtc.set_show_border_area(false); crtc.set_char_width(4); //crtc.out_vsync_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); - AY8910(config, "ay8910", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 2.5); /* 2MHz, guess */ + AY8910(config, "ay8910", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 2.5); // 2MHz, guess } void rugby_state::rugby(machine_config &config) @@ -504,10 +513,10 @@ void rugby_state::rugby(machine_config &config) *************************/ ROM_START( 4roses ) - ROM_REGION( 0x10000, "maincpu", 0 ) /* encrypted program ROM...*/ + ROM_REGION( 0x10000, "maincpu", 0 ) // encrypted program ROM... ROM_LOAD( "4.10.u32", 0x00000, 0x10000, CRC(e94440e9) SHA1(b2f81ba79f1f40ed35e45fd80c17eb8529ccdb4c) ) - ROM_REGION( 0x0400, "mcu", 0 ) /* protected... no dump available */ + ROM_REGION( 0x0400, "mcu", 0 ) // protected... no dump available ROM_LOAD( "ep87c750ebpn_no_dump.u41", 0x0000, 0x0400, NO_DUMP ) ROM_REGION( 0x80000, "gfx1", 0 ) @@ -522,10 +531,10 @@ ROM_START( 4roses ) ROM_END ROM_START( 4rosesa ) - ROM_REGION( 0x10000, "maincpu", 0 ) /* encrypted program ROM...*/ + ROM_REGION( 0x10000, "maincpu", 0 ) // encrypted program ROM... ROM_LOAD( "4.u15", 0x00000, 0x10000, CRC(66bb5b67) SHA1(438371c3918f0a285cb19caa650739df9fb24800) ) - ROM_REGION( 0x0400, "mcu", 0 ) /* protected... no dump available */ + ROM_REGION( 0x0400, "mcu", 0 ) // protected... no dump available ROM_LOAD( "ep87c750ebpn_no_dump.u41", 0x0000, 0x0400, NO_DUMP ) ROM_REGION( 0x80000, "gfx1", 0 ) @@ -549,10 +558,10 @@ no cpu... cpu seem a 44 plcc chip with name scratched off... pcb is almost the same as "Four Roses" */ ROM_START( rugby ) - ROM_REGION( 0x10000, "maincpu", 0 ) /* encrypted program ROM...*/ + ROM_REGION( 0x10000, "maincpu", 0 ) // encrypted program ROM... ROM_LOAD( "rugby1.u15", 0x00000, 0x10000, CRC(6ac45fa7) SHA1(dba936d236d57172e56143a9858e5052009e4346) ) - ROM_REGION( 0x0400, "mcu", 0 ) /* protected... no dump available */ + ROM_REGION( 0x0400, "mcu", 0 ) // protected... no dump available ROM_LOAD( "ep87c750ebpn_no_dump.u41", 0x0000, 0x0400, NO_DUMP ) ROM_REGION( 0x80000, "gfx1", 0 ) From 682a32c6458ab47a558dd15f7cf00669254b8351 Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 14 Apr 2024 22:26:03 -0400 Subject: [PATCH 104/109] cpu/h8500: Remove "intram" space to simplify memory interface for future emulation * jv880: Improve memory map --- src/devices/cpu/h8500/h8500.cpp | 14 ++------------ src/devices/cpu/h8500/h8500.h | 4 +--- src/devices/cpu/h8500/h8520.cpp | 1 + src/devices/cpu/h8500/h8532.cpp | 1 + src/devices/cpu/h8500/h8534.cpp | 2 ++ src/mame/roland/roland_jv80.cpp | 10 +++++++--- 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/devices/cpu/h8500/h8500.cpp b/src/devices/cpu/h8500/h8500.cpp index b022749197c34..8160da62fe2bc 100644 --- a/src/devices/cpu/h8500/h8500.cpp +++ b/src/devices/cpu/h8500/h8500.cpp @@ -15,8 +15,8 @@ h8500_device::h8500_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int addrbits, int buswidth, int ramsize, int defmode, address_map_constructor map) : cpu_device(mconfig, type, tag, owner, clock) , m_program_config("program", ENDIANNESS_BIG, buswidth, addrbits, 0, map) - , m_ram_config("intram", ENDIANNESS_BIG, 16, ramsize, 0, address_map_constructor(FUNC(h8500_device::ram_map), this)) , m_mode_control(defmode) + , m_ram_size((1 << ramsize) - 1) , m_pc(0) , m_ppc(0) , m_sr(0) @@ -43,19 +43,11 @@ std::unique_ptr h8500_device::create_disassembler() device_memory_interface::space_config_vector h8500_device::memory_space_config() const { - return m_ram_config.addr_width() == 0 ? space_config_vector { + return space_config_vector { std::make_pair(AS_PROGRAM, &m_program_config) - } : space_config_vector { - std::make_pair(AS_PROGRAM, &m_program_config), - std::make_pair(AS_DATA, &m_ram_config) }; } -void h8500_device::ram_map(address_map &map) -{ - map(0, (1 << m_ram_config.addr_width()) - 1).ram(); -} - void h8500_device::debug_set_pc(offs_t pc) noexcept { m_pc = m_ppc = pc & 0xffff; @@ -66,8 +58,6 @@ void h8500_device::debug_set_pc(offs_t pc) noexcept void h8500_device::device_start() { m_program = &space(AS_PROGRAM); - if (has_space(AS_DATA)) - space(AS_DATA).cache(m_ram_cache); set_icountptr(m_icount); diff --git a/src/devices/cpu/h8500/h8500.h b/src/devices/cpu/h8500/h8500.h index 3755ab7a4aba7..6c5fb06a5972c 100644 --- a/src/devices/cpu/h8500/h8500.h +++ b/src/devices/cpu/h8500/h8500.h @@ -46,17 +46,15 @@ class h8500_device : public cpu_device virtual bool h8_maximum_mode() const noexcept { return m_mode_control == 3 || m_mode_control == 4; } // all except H8/570 private: - void ram_map(address_map &map); void debug_set_pc(offs_t pc) noexcept; // address spaces address_space_config m_program_config; - address_space_config m_ram_config; address_space *m_program; - memory_access<11, 1, 0, ENDIANNESS_BIG>::cache m_ram_cache; // misc. configuration u8 m_mode_control; + [[maybe_unused]] u16 m_ram_size; // internal registers u16 m_pc; diff --git a/src/devices/cpu/h8500/h8520.cpp b/src/devices/cpu/h8500/h8520.cpp index 459a979da9862..753608467f09e 100644 --- a/src/devices/cpu/h8500/h8520.cpp +++ b/src/devices/cpu/h8500/h8520.cpp @@ -31,6 +31,7 @@ void h8520_device::internal_map(address_map &map) { if (mode_control() == 2 || mode_control() == 4 || mode_control() == 7) map(0x0000, 0x3fff).rom().region(DEVICE_SELF, 0); + map(0xfd80, 0xff7f).ram(); // TODO: may be disabled by writing 0 to RAME bit in RAMCR #if 0 map(0xff80, 0xff80).w(FUNC(h8520_device::p1ddr_w)); map(0xff81, 0xff81).w(FUNC(h8520_device::p2ddr_w)); diff --git a/src/devices/cpu/h8500/h8532.cpp b/src/devices/cpu/h8500/h8532.cpp index 20c9869c4eeef..0f4dbd18e05b7 100644 --- a/src/devices/cpu/h8500/h8532.cpp +++ b/src/devices/cpu/h8500/h8532.cpp @@ -31,6 +31,7 @@ void h8532_device::internal_map(address_map &map) { if (mode_control() == 2 || mode_control() == 4 || mode_control() == 7) map(0x0000, 0x7fff).rom().region(DEVICE_SELF, 0); + map(0xfb80, 0xff7f).ram(); // TODO: may be disabled by writing 0 to RAME bit in RAMCR #if 0 map(0xff80, 0xff80).w(FUNC(h8532_device::p1ddr_w)); map(0xff81, 0xff81).w(FUNC(h8532_device::p2ddr_w)); diff --git a/src/devices/cpu/h8500/h8534.cpp b/src/devices/cpu/h8500/h8534.cpp index 06c9b0dc24f16..6d32e58df860f 100644 --- a/src/devices/cpu/h8500/h8534.cpp +++ b/src/devices/cpu/h8500/h8534.cpp @@ -53,6 +53,7 @@ void h8534_device::internal_map(address_map &map) { if (mode_control() == 2 || mode_control() == 4 || mode_control() == 7) map(0x0000, 0x7fff).rom().region(DEVICE_SELF, 0); + map(0xf680, 0xfe7f).ram(); // TODO: may be disabled by writing 0 to RAME bit in RAMCR register_field_map(map); } @@ -62,6 +63,7 @@ void h8536_device::internal_map(address_map &map) map(0x0000, 0xee7f).rom().region(DEVICE_SELF, 0); else if (mode_control() == 4 || mode_control() == 7) map(0x0000, 0xf67f).rom().region(DEVICE_SELF, 0); + map(0xf680, 0xfe7f).ram(); // TODO: may be disabled by writing 0 to RAME bit in RAMCR register_field_map(map); } diff --git a/src/mame/roland/roland_jv80.cpp b/src/mame/roland/roland_jv80.cpp index 3934601e340be..bf6088d31027c 100644 --- a/src/mame/roland/roland_jv80.cpp +++ b/src/mame/roland/roland_jv80.cpp @@ -8,7 +8,7 @@ #include "emu.h" #include "cpu/h8500/h8532.h" -//#include "machine/nvram.h" +#include "machine/nvram.h" namespace { @@ -33,7 +33,11 @@ class roland_jv80_state : public driver_device void roland_jv80_state::mem_map(address_map &map) { - map(0x08000, 0x3ffff).rom().region("progrom", 0x8000); + map(0x08000, 0x09fff).ram(); + map(0x10000, 0x3ffff).rom().region("progrom", 0x10000); + map(0x40000, 0x4ffff).rom().region("progrom", 0); + map(0xa0000, 0xa7fff).ram(); + map(0xe0000, 0xe7fff).ram().share("nvram"); } static INPUT_PORTS_START(jv880) @@ -44,7 +48,7 @@ void roland_jv80_state::jv880(machine_config &config) HD6435328(config, m_maincpu, 20_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &roland_jv80_state::mem_map); - //NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // LC36256AML-10 (IC18) + CR2032 battery + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // LC36256AML-10 (IC18) + CR2032 battery //TC6116(config, "pcm", 23.2_MHz_XTAL); } From 5758065e8b60e771feebc58ab53a04ae65eb4bc0 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 15 Apr 2024 13:14:13 +0200 Subject: [PATCH 105/109] videoopt: use subtext string to indicate current view --- src/frontend/mame/ui/videoopt.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/frontend/mame/ui/videoopt.cpp b/src/frontend/mame/ui/videoopt.cpp index bae8fbcda80e5..0701c850816e2 100644 --- a/src/frontend/mame/ui/videoopt.cpp +++ b/src/frontend/mame/ui/videoopt.cpp @@ -11,6 +11,7 @@ #include "emu.h" #include "ui/videoopt.h" +#include "rendfont.h" #include "rendlay.h" #include "rendutil.h" @@ -121,7 +122,7 @@ void menu_video_options::populate() if (!m_snapshot || !machine().video().snap_native()) { for (char const *name = m_target.view_name(ref = 0); name; name = m_target.view_name(++ref)) - item_append(name, " ", 0, reinterpret_cast(ITEM_VIEW_FIRST + ref)); + item_append(name, ref == m_target.view() ? convert_command_glyph("_> ") : " ", 0, reinterpret_cast(ITEM_VIEW_FIRST + ref)); item_append(menu_item_type::SEPARATOR); } From bbfee2d929179532dce13eda93bf39866f5880d2 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 15 Apr 2024 13:29:30 +0200 Subject: [PATCH 106/109] videoopt: update prev commit, better with empty 'radiobuttons'? --- src/frontend/mame/ui/videoopt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/mame/ui/videoopt.cpp b/src/frontend/mame/ui/videoopt.cpp index 0701c850816e2..84ae6b6867d55 100644 --- a/src/frontend/mame/ui/videoopt.cpp +++ b/src/frontend/mame/ui/videoopt.cpp @@ -122,7 +122,7 @@ void menu_video_options::populate() if (!m_snapshot || !machine().video().snap_native()) { for (char const *name = m_target.view_name(ref = 0); name; name = m_target.view_name(++ref)) - item_append(name, ref == m_target.view() ? convert_command_glyph("_> ") : " ", 0, reinterpret_cast(ITEM_VIEW_FIRST + ref)); + item_append(name, convert_command_glyph(ref == m_target.view() ? "_>" : "_<"), 0, reinterpret_cast(ITEM_VIEW_FIRST + ref)); item_append(menu_item_type::SEPARATOR); } From c4f79f1d70c405f0c41cfadc510e358576b8c4fb Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Mon, 15 Apr 2024 17:43:19 +0200 Subject: [PATCH 107/109] Move coleco homebrew titles to their own softlist and fix a few issues. Add missing megacart feature to mariobrs and zombnear so that they actually run when started from the softlist. Software list items promoted to working (coleco_homebrew.xml) ------------------------------------------------------------- Booming Boy Buck Rogers Super Game Caos Begins Caverns of Titan Kung-Fu Master --- hash/coleco.xml | 409 --------------------- hash/coleco_homebrew.xml | 425 ++++++++++++++++++++++ src/devices/bus/svi3x8/expander/sv603.cpp | 1 + src/mame/coleco/adam.cpp | 1 + src/mame/coleco/coleco.cpp | 2 + 5 files changed, 429 insertions(+), 409 deletions(-) create mode 100644 hash/coleco_homebrew.xml diff --git a/hash/coleco.xml b/hash/coleco.xml index 87dc64fb5639b..fcca8b4739894 100644 --- a/hash/coleco.xml +++ b/hash/coleco.xml @@ -3393,413 +3393,4 @@ license:CC0-1.0 - - - - 31-in-1 - 201? - <unknown> - - - - - - - - - - 63-in-1 - 201? - <unknown> - - - - - - - - - - - - - A.E. - Anti-Environment Encounter - 2011 - CollectorVision Games - - - - - - - - - Arno Dash - 2021 - Under4Mhz - - - - - - - - - Bank Panic - 2011 - Team Pixelboy - - - - - - - - - The Black Onyx - 2013 - Team Pixelboy - - - - - - - - - Booming Boy - 2019 - Team Pixelboy - - - - - - - - - - Boxxle - 2015 - Team Pixelboy - - - - - - - - - Buck Rogers Super Game - 2013 - Team Pixelboy - - - - - - - - - - Burn Rubber - 2012 - CollectorVision Games - - - - - - - - - C-So! - 2018 - Team Pixelboy - - - - - - - - - Caos Begins - 2016 - Team Pixelboy - - - - - - - - - - Caterpillar S.O.S. - 2011 - CollectorVision Games - - - - - - - - - - Caverns of Titan - 2017 - Team Pixelboy - - - - - - - - - - Champion Pro Wrestling - 2020 - Team Pixelboy - - - - - - - - - Diamond Dash II - 2021 - Under4Mhz - - - - - - - - - Flapee Byrd - 2014 - CollectorVision Games - - - - - - - - - Klondike Solitaire (v1.0) - 2021 - Under4Mhz - - - - - - - - - Kobashi - 2010 - CollectorVision Games - - - - - - - - - Kung-Fu Master - 2016 - CollectorVision Games - - - - - - - - - - Mahjong Solitaire (v1.0) - 2021 - Under4Mhz - - - - - - - - - Mario Bros. - 2009 - CollectorVision Games - - - - - - - - - Minesweeper (v1.0) - 2021 - Under4Mhz - - - - - - - - - Mr Chin - 2008 - CollectorVision Games - - - - - - - - - Pegged (v1.0) - 2021 - Under4Mhz - - - - - - - - - Pillars - 2021 - Under4Mhz - - - - - - - - - Pitman - 2021 - Under4Mhz - - - - - - - - - Pooyan - 2009 - CollectorVision Games - - - - - - - - - Pyramid Warp + Battle Ship Clapton II - 2009 - CollectorVision Games - - - - - - - - - Snake - 2021 - Under4Mhz - - - - - - - - - Spunky's Super Car! - 2014 - CollectorVision Games - - - - - - - - - Vexed - 2021 - Under4Mhz - - - - - - - - - Winky Trap - 2007 - CollectorVision Games - - - - - - - - - Zippy Race - 2009 - CollectorVision Games - - - - - - - - - Zombie Calavera Prologue - 2021 - CollectorVision Games - - - - - - - - - Zombie Near - 2012 - CollectorVision Games - - - - - - - diff --git a/hash/coleco_homebrew.xml b/hash/coleco_homebrew.xml new file mode 100644 index 0000000000000..9b6b44151d00b --- /dev/null +++ b/hash/coleco_homebrew.xml @@ -0,0 +1,425 @@ + + + + + + + + + 31 Games in 1 Cartridge v1.1 + 2013 + Buzz & ZX-81 + + + + + + + + + + 63 Games in 1 Cartridge v1.0 + 2013 + Buzz & ZX-81 + + + + + + + + + + + A.E. - Anti-Environment Encounter + 2011 + CollectorVision Games + + + + + + + + + Arno Dash + 2021 + Under4Mhz + + + + + + + + + Bank Panic + 2011 + Team Pixelboy + + + + + + + + + + The Black Onyx + 2013 + Team Pixelboy + + + + + + + + + Booming Boy + 2019 + Team Pixelboy + + + + + + + + + + + Boxxle + 2015 + Team Pixelboy + + + + + + + + + Buck Rogers Super Game + 2013 + Team Pixelboy + + + + + + + + + + + Burn Rubber + 2012 + CollectorVision Games + + + + + + + + + C-So! + 2018 + Team Pixelboy + + + + + + + + + Caos Begins + 2016 + Team Pixelboy + + + + + + + + + + Caterpillar S.O.S. + 2011 + CollectorVision Games + + + + + + + + + + Caverns of Titan + 2017 + Team Pixelboy + + + + + + + + + + Diamond Dash II + 2021 + Under4Mhz + + + + + + + + + Flapee Byrd + 2014 + CollectorVision Games + + + + + + + + + Klondike Solitaire v1.0 + 2021 + Under4Mhz + + + + + + + + + Kobashi + 2010 + CollectorVision Games + + + + + + + + + Kung-Fu Master + 2016 + CollectorVision Games + + + + + + + + + + + Mahjong Solitaire v1.0 + 2021 + Under4Mhz + + + + + + + + + Mario Bros. + 2009 + CollectorVision Games + + + + + + + + + + Minesweeper v1.0 + 2021 + Under4Mhz + + + + + + + + + Mr Chin + 2008 + CollectorVision Games + + + + + + + + + Pegged v1.0 + 2021 + Under4Mhz + + + + + + + + + Pillars + 2021 + Under4Mhz + + + + + + + + + Pitman + 2021 + Under4Mhz + + + + + + + + + Pooyan + 2009 + CollectorVision Games + + + + + + + + + Champion Pro Wrestling + 2020 + Team Pixelboy + + + + + + + + + Pyramid Warp + Battle Ship Clapton II + 2009 + CollectorVision Games + + + + + + + + + Snake + 2021 + Under4Mhz + + + + + + + + + Spunky's Super Car! + 2014 + CollectorVision Games + + + + + + + + + Vexed + 2021 + Under4Mhz + + + + + + + + + Winky Trap + 2007 + CollectorVision Games + + + + + + + + + Zippy Race + 2009 + CollectorVision Games + + + + + + + + + Zombie Calavera Prologue + 2021 + CollectorVision Games + + + + + + + + + Zombie Near + 2012 + CollectorVision Games + + + + + + + + + diff --git a/src/devices/bus/svi3x8/expander/sv603.cpp b/src/devices/bus/svi3x8/expander/sv603.cpp index fb488f902ea8b..e8d3dd81b3b48 100644 --- a/src/devices/bus/svi3x8/expander/sv603.cpp +++ b/src/devices/bus/svi3x8/expander/sv603.cpp @@ -50,6 +50,7 @@ void sv603_device::device_add_mconfig(machine_config &config) // cartridge slot COLECOVISION_CARTRIDGE_SLOT(config, m_cart, colecovision_cartridges, nullptr); SOFTWARE_LIST(config, "cart_list").set_original("coleco"); + SOFTWARE_LIST(config, "homebrew_list").set_original("coleco_homebrew"); } diff --git a/src/mame/coleco/adam.cpp b/src/mame/coleco/adam.cpp index 650bf12948bb4..bf06c612cc8e2 100644 --- a/src/mame/coleco/adam.cpp +++ b/src/mame/coleco/adam.cpp @@ -1079,6 +1079,7 @@ void adam_state::adam(machine_config &config) // software lists SOFTWARE_LIST(config, "colec_cart_list").set_original("coleco"); + SOFTWARE_LIST(config, "colec_hb_list").set_original("coleco_homebrew"); SOFTWARE_LIST(config, "adam_cart_list").set_original("adam_cart"); SOFTWARE_LIST(config, "cass_list").set_original("adam_cass"); SOFTWARE_LIST(config, "flop_list").set_original("adam_flop"); diff --git a/src/mame/coleco/coleco.cpp b/src/mame/coleco/coleco.cpp index 46d749bbddf64..74f4fd732ef6d 100644 --- a/src/mame/coleco/coleco.cpp +++ b/src/mame/coleco/coleco.cpp @@ -595,6 +595,7 @@ void coleco_state::coleco(machine_config &config) /* software lists */ SOFTWARE_LIST(config, "cart_list").set_original("coleco"); + SOFTWARE_LIST(config, "homebrew_list").set_original("coleco_homebrew"); TIMER(config, "paddle_timer").configure_periodic(FUNC(coleco_state::paddle_update_callback), attotime::from_msec(20)); @@ -643,6 +644,7 @@ void bit90_state::bit90(machine_config &config) /* software lists */ SOFTWARE_LIST(config, "cart_list").set_original("coleco"); + SOFTWARE_LIST(config, "homebrew_list").set_original("coleco_homebrew"); /* internal ram */ RAM(config, m_ram).set_default_size("32K").set_extra_options("1K,16K"); From 7542e0aaf278d1ca8b34be0bb16540444cef5a68 Mon Sep 17 00:00:00 2001 From: Firehawke <34792592+Firehawke@users.noreply.github.com> Date: Mon, 15 Apr 2024 10:22:07 -0700 Subject: [PATCH 108/109] docs: Updated RTD to 2.0.0 and removed dependency on jQuery. (#12253) --- docs/source/_templates/versions.html | 13 +- docs/themes/sphinx_rtd_theme/__init__.py | 54 +++-- docs/themes/sphinx_rtd_theme/breadcrumbs.html | 6 +- docs/themes/sphinx_rtd_theme/footer.html | 2 +- docs/themes/sphinx_rtd_theme/layout.html | 58 +++-- .../locale/da/LC_MESSAGES/sphinx.mo | Bin 0 -> 2514 bytes .../locale/da/LC_MESSAGES/sphinx.po | 206 ++++++++++++++++++ .../locale/de/LC_MESSAGES/sphinx.mo | Bin 0 -> 2087 bytes .../locale/de/LC_MESSAGES/sphinx.po | 12 +- .../locale/en/LC_MESSAGES/sphinx.mo | Bin 0 -> 457 bytes .../locale/en/LC_MESSAGES/sphinx.po | 14 +- .../locale/es/LC_MESSAGES/sphinx.mo | Bin 0 -> 2567 bytes .../locale/es/LC_MESSAGES/sphinx.po | 38 ++-- .../locale/et/LC_MESSAGES/sphinx.mo | Bin 0 -> 2380 bytes .../locale/et/LC_MESSAGES/sphinx.po | 22 +- .../locale/fa_IR/LC_MESSAGES/sphinx.mo | Bin 0 -> 2693 bytes .../locale/fa_IR/LC_MESSAGES/sphinx.po | 11 +- .../locale/fr/LC_MESSAGES/sphinx.mo | Bin 0 -> 2522 bytes .../locale/fr/LC_MESSAGES/sphinx.po | 39 ++-- .../locale/hr/LC_MESSAGES/sphinx.mo | Bin 0 -> 575 bytes .../locale/hr/LC_MESSAGES/sphinx.po | 23 ++ .../locale/hu/LC_MESSAGES/sphinx.mo | Bin 0 -> 501 bytes .../locale/hu/LC_MESSAGES/sphinx.po | 23 ++ .../locale/it/LC_MESSAGES/sphinx.mo | Bin 0 -> 2703 bytes .../locale/it/LC_MESSAGES/sphinx.po | 53 +++-- .../locale/lt/LC_MESSAGES/sphinx.mo | Bin 0 -> 2750 bytes .../locale/lt/LC_MESSAGES/sphinx.po | 45 ++-- .../locale/nl/LC_MESSAGES/sphinx.mo | Bin 0 -> 2549 bytes .../locale/nl/LC_MESSAGES/sphinx.po | 56 ++++- .../locale/pl/LC_MESSAGES/sphinx.mo | Bin 0 -> 2339 bytes .../locale/pl/LC_MESSAGES/sphinx.po | 10 +- .../locale/pt/LC_MESSAGES/sphinx.mo | Bin 0 -> 2354 bytes .../locale/pt/LC_MESSAGES/sphinx.po | 161 ++++++++++++++ .../locale/pt_BR/LC_MESSAGES/sphinx.mo | Bin 0 -> 2780 bytes .../locale/pt_BR/LC_MESSAGES/sphinx.po | 51 +++-- .../locale/ru/LC_MESSAGES/sphinx.mo | Bin 0 -> 3449 bytes .../locale/ru/LC_MESSAGES/sphinx.po | 56 ++++- .../themes/sphinx_rtd_theme/locale/sphinx.pot | 18 +- .../locale/sv/LC_MESSAGES/sphinx.mo | Bin 0 -> 2132 bytes .../locale/sv/LC_MESSAGES/sphinx.po | 17 +- .../locale/tr/LC_MESSAGES/sphinx.mo | Bin 0 -> 2117 bytes .../locale/tr/LC_MESSAGES/sphinx.po | 17 +- .../locale/zh_CN/LC_MESSAGES/sphinx.mo | Bin 0 -> 2511 bytes .../locale/zh_CN/LC_MESSAGES/sphinx.po | 84 ++++--- .../locale/zh_TW/LC_MESSAGES/sphinx.mo | Bin 0 -> 506 bytes .../locale/zh_TW/LC_MESSAGES/sphinx.po | 23 ++ docs/themes/sphinx_rtd_theme/search.html | 4 +- docs/themes/sphinx_rtd_theme/searchbox.html | 2 +- .../static/css/badge_only.css | 2 +- .../sphinx_rtd_theme/static/css/theme.css | 4 +- docs/themes/sphinx_rtd_theme/versions.html | 62 +++--- 51 files changed, 877 insertions(+), 309 deletions(-) create mode 100644 docs/themes/sphinx_rtd_theme/locale/da/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/da/LC_MESSAGES/sphinx.po create mode 100644 docs/themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/fa_IR/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/hr/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/hr/LC_MESSAGES/sphinx.po create mode 100644 docs/themes/sphinx_rtd_theme/locale/hu/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/hu/LC_MESSAGES/sphinx.po create mode 100644 docs/themes/sphinx_rtd_theme/locale/it/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/lt/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/pl/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/pt/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/pt/LC_MESSAGES/sphinx.po create mode 100644 docs/themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/zh_TW/LC_MESSAGES/sphinx.mo create mode 100644 docs/themes/sphinx_rtd_theme/locale/zh_TW/LC_MESSAGES/sphinx.po diff --git a/docs/source/_templates/versions.html b/docs/source/_templates/versions.html index 3e5e6a020afab..e4d2ae4731ac8 100644 --- a/docs/source/_templates/versions.html +++ b/docs/source/_templates/versions.html @@ -1,14 +1,7 @@ {% if mamedev_site %}
- - Downloads - - -
-
-
PDF
-
EPUB
-
-
+ + Download documentation as PDF or EPUB +
{% endif %} diff --git a/docs/themes/sphinx_rtd_theme/__init__.py b/docs/themes/sphinx_rtd_theme/__init__.py index 37c3b10d0fcfe..2ce88a259e919 100644 --- a/docs/themes/sphinx_rtd_theme/__init__.py +++ b/docs/themes/sphinx_rtd_theme/__init__.py @@ -12,7 +12,7 @@ from sphinx.util.logging import getLogger -__version__ = '1.0.0rc1' +__version__ = '2.0.0' __version_full__ = __version__ logger = getLogger(__name__) @@ -31,33 +31,47 @@ def config_initiated(app, config): _('The canonical_url option is deprecated, use the html_baseurl option from Sphinx instead.') ) + +def extend_html_context(app, pagename, templatename, context, doctree): + # Add ``sphinx_version_info`` tuple for use in Jinja templates + context['sphinx_version_info'] = sphinx_version + + # See http://www.sphinx-doc.org/en/stable/theming.html#distribute-your-theme-as-a-python-package def setup(app): if python_version[0] < 3: - logger.warning("Python 2 is deprecated with sphinx_rtd_theme, update to Python 3") - app.require_sphinx('1.6') - if sphinx_version <= (2, 0, 0): - logger.warning("Sphinx 1.x is deprecated with sphinx_rtd_theme, update to Sphinx 2.x or greater") - if not app.config.html_experimental_html5_writer: - logger.warning("'html4_writer' is deprecated with sphinx_rtd_theme") - else: - if app.config.html4_writer: - logger.warning("'html4_writer' is deprecated with sphinx_rtd_theme") + logger.error("Python 2 is not supported with sphinx_rtd_theme, update to Python 3.") + + app.require_sphinx('5.0') + if app.config.html4_writer: + logger.error("'html4_writer' is not supported with sphinx_rtd_theme.") + + # Since Sphinx 6, jquery isn't bundled anymore and we need to ensure that + # the sphinxcontrib-jquery extension is enabled. + # See: https://dev.readthedocs.io/en/latest/design/sphinx-jquery.html + if sphinx_version >= (6, 0, 0): + # Documentation of Sphinx guarantees that an extension is added and + # enabled at most once. + # See: https://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.setup_extension + app.setup_extension("sphinxcontrib.jquery") + # However, we need to call the extension's callback since setup_extension doesn't do it + # See: https://github.com/sphinx-contrib/jquery/issues/23 + from sphinxcontrib.jquery import add_js_files as jquery_add_js_files + jquery_add_js_files(app, app.config) # Register the theme that can be referenced without adding a theme path app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__))) - if sphinx_version >= (1, 8, 0): - # Add Sphinx message catalog for newer versions of Sphinx - # See http://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_message_catalog - rtd_locale_path = path.join(path.abspath(path.dirname(__file__)), 'locale') - app.add_message_catalog('sphinx', rtd_locale_path) - app.connect('config-inited', config_initiated) + # Add Sphinx message catalog for newer versions of Sphinx + # See http://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_message_catalog + rtd_locale_path = path.join(path.abspath(path.dirname(__file__)), 'locale') + app.add_message_catalog('sphinx', rtd_locale_path) + app.connect('config-inited', config_initiated) # sphinx emits the permalink icon for headers, so choose one more in keeping with our theme - if sphinx_version >= (3, 5, 0): - app.config.html_permalinks_icon = "\uf0c1" - else: - app.config.html_add_permalinks = "\uf0c1" + app.config.html_permalinks_icon = "\uf0c1" + + # Extend the default context when rendering the templates. + app.connect("html-page-context", extend_html_context) return {'parallel_read_safe': True, 'parallel_write_safe': True} diff --git a/docs/themes/sphinx_rtd_theme/breadcrumbs.html b/docs/themes/sphinx_rtd_theme/breadcrumbs.html index 005b2ecd6eebe..bd45b6d7c2f84 100644 --- a/docs/themes/sphinx_rtd_theme/breadcrumbs.html +++ b/docs/themes/sphinx_rtd_theme/breadcrumbs.html @@ -22,11 +22,11 @@
    {%- block breadcrumbs %} -
  • »
  • +
  • {%- for doc in parents %} -
  • {{ doc.title }} »
  • + {%- endfor %} -
  • {{ title }}
  • + {%- endblock %} {%- block breadcrumbs_aside %}
  • diff --git a/docs/themes/sphinx_rtd_theme/footer.html b/docs/themes/sphinx_rtd_theme/footer.html index 1a395c9c8e0a9..7b831c1f9997c 100644 --- a/docs/themes/sphinx_rtd_theme/footer.html +++ b/docs/themes/sphinx_rtd_theme/footer.html @@ -51,7 +51,7 @@ {%- set readthedocs_web = 'Read the Docs' %} {#- Translators: the variable "sphinx_web" is a link to the Sphinx project documentation with the text "Sphinx" #} {%- trans sphinx_web=sphinx_web, readthedocs_web=readthedocs_web %}Built with {{ sphinx_web }} using a{% endtrans %} - {#- Translators: "theme" refers to a theme for Sphinx, which alters the appearance of the generated documenation #} + {#- Translators: "theme" refers to a theme for Sphinx, which alters the appearance of the generated documentation #} {% trans %}theme{% endtrans %} {#- Translators: this is always used as "provided by Read the Docs", and should not imply Read the Docs is an author of the generated documentation. #} {% trans %}provided by {{ readthedocs_web }}{% endtrans %}. diff --git a/docs/themes/sphinx_rtd_theme/layout.html b/docs/themes/sphinx_rtd_theme/layout.html index 1d70119760219..c8a307628db2a 100644 --- a/docs/themes/sphinx_rtd_theme/layout.html +++ b/docs/themes/sphinx_rtd_theme/layout.html @@ -10,11 +10,11 @@ {%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' -%} {# Build sphinx_version_info tuple from sphinx_version string in pure Jinja #} -{%- set (_ver_major, _ver_minor, _ver_bugfix) = sphinx_version.split('.') | map('int') -%} -{%- set sphinx_version_info = (_ver_major, _ver_minor, _ver_bugfix) -%} +{%- set (_ver_major, _ver_minor) = (sphinx_version.split('.') | list)[:2] | map('int') -%} +{%- set sphinx_version_info = (_ver_major, _ver_minor, -1) -%} - += (7, 2) %} data-content_root="{{ content_root }}"{% endif %}> {{- metatags }} @@ -28,26 +28,27 @@ {%- endif %} - {%- for css in css_files %} - {%- if css|attr("rel") %} - + {%- for css_file in css_files %} + {%- if css_file|attr("filename") %} + {{ css_tag(css_file) }} {%- else %} - + {%- endif %} {%- endfor %} - {%- for cssfile in extra_css_files %} - + {# "extra_css_files" is a theme option and it's always a string #} + {%- for css_file in extra_css_files %} + {%- endfor -%} - {#- FAVICON #} - {%- if favicon %} - {%- if sphinx_version_info < (4, 0) -%} - - {%- else %} - - {%- endif %} - {%- endif -%} + {#- FAVICON + favicon_url is the only context var necessary since Sphinx 4. + In Sphinx<4, we use favicon but need to prepend path info. + #} + {%- set _favicon_url = favicon_url | default(pathto('_static/' + (favicon or ""), 1)) %} + {%- if favicon_url or favicon %} + + {%- endif %} {#- CANONICAL URL (deprecated) #} {%- if theme_canonical_url and not pageurl %} @@ -133,22 +134,15 @@